PDA

Просмотр полной версии : "ZX-8088" - Даунгрейд компьютера "Ленинград". Часть 3



Mick
30.05.2022, 16:16
Предыдущие части:
Часть 1 - https://zx-pk.ru/threads/32131-quot-zx-8080-quot-daungrejd-kompyutera-quot-leningrad-quot.html
Часть 2 - https://zx-pk.ru/threads/32921-quot-zx-8085-quot-daungrejd-kompyutera-quot-leningrad-quot-chast-2.html

В предыдущих частях описывался процесс "изобретение" Ленинграда на процессорах КР580ВМ80А (часть 1) и КР1821ВМ85А (часть 2). Если в первой части конечный результат в итоге был получен, то во второй части осталось недосказанное, а именно гуляние фазы тактов при старте (кто то стартует с одной фазой тактовых импульсов, а кто то с другой - надо как то унифицировать)
Так вот пришел следующий год и пришла очередь "изобретать" Ленинград с новым процессором. Поскольку была просьба и пожелание следующий Ленинград сделать на UPD70108 (NEC V20), то значит пусть так и будет. Как оказалось NEC V20 по пиново совместим с процессором i8088, то так сказать одно не помешает другому. Ах, да процессор от NEC может эмулировать код i8080. Что же надо будет посмотреть.
Ну а назвал новый исследовательский комп - "ZX-8088", так сказать для звучности с предыдущими, ну и наш есть КР1810ВМ88 для пробы, хотя он и не умеет эмулировать ВМ80.

Пока собираются мысли, ivagor подключайся. :)


Проект схемы без А19 - https://disk.yandex.ru/i/JppSpBoDSvu1Iw
Схема с одним сегментом на ОЗУ и ПЗУA19 - https://disk.yandex.ru/d/OoTICcrkyOMKEQ
Схема с разными сегментами для ОЗУ и ПЗУ по A19 - https://disk.yandex.ru/i/mIra7MgBw6dulg

Проект печатной платы

https://i.ibb.co/LpGvSD2/zx8088-pcb.png (https://ibb.co/LpGvSD2)

ivagor
30.05.2022, 17:29
Вариант с V20 весьма интересен.
Надеюсь, ты все же еще пощупаешь 8080 в ZXM-Amethyst. И возможно там будет клавиатура и какой-нибудь интерфейс с внешним миром.

Mick
30.05.2022, 19:42
Надеюсь, ты все же еще пощупаешь 8080 в ZXM-Amethyst. И возможно там будет клавиатура и какой-нибудь интерфейс с внешним миром.

Если ты смотрел схему Аметиста, то там уже можно что угодно прикрутить, начиная с контроллера SD карты и PS/2 клавы, то что на борде есть, заканичивая внешней шиной NemoBus, куда Спектрумовские контроллеры пихать можно будет. По крайней мере я на это надеюсь.
Так что пощупаем его, как и в последствии и 8085 ( надо все таки установить истину с клоками)

Касательно ZX-8088, то из даташитов и схем я вижу, что в основном используются с ГФ84 (8284 если я не ошибаюсь). Но у нас немного другой подход. Надо вкараячить процессор ВМ88 в схему Ленинграда.

Из функциональной схеме ГФ84 можно увидеть, что частота кварца делится на 3, сигналы RESET и READY стробируются тактовой частотой

https://i.ibb.co/zRY0hcZ/img-Ae-VXOZ.png (https://ibb.co/zRY0hcZ)

https://i.ibb.co/5hV5kTf/84.png (https://ibb.co/5hV5kTf)

По сути у нас есть кварцевый генератор на 14МГц и тактовые на 3,5МГц. Сигналы RESET и READY если нужно можно тоже тактировать тактовой.

ivagor
30.05.2022, 20:19
По сути у нас есть кварцевый генератор на 14МГц и тактовые на 3,5МГц.
Не понял, при чем тут 8284, там же нет деления на 4 (только на 3 и 6)?

Mick
30.05.2022, 20:45
Не понял, при чем тут 8284

Ну 8284 это аналог 1810ВГ84.



там же нет деления на 4 (только на 3 и 6)?

Да, там деление частоты для процессора на 3 (CLK) и еще на 2 (PCLK).

Нам он не нужен, мы же частоту будем брать с нашего генератора, по сути либо RAS/ либо CAS/

LeoN65816
31.05.2022, 07:09
Поскольку была просьба и пожелание следующий Ленинград сделать на UPD70108 (NEC V20), то значит пусть так и будет.
А вот ещё про V33A (https://zx-pk.ru/threads/20977-poisk-1-protsessor-nec-v20.html?p=1086365&viewfull=1#post1086365) посмотри.

Mick
31.05.2022, 07:53
А вот ещё про V33A посмотри.

Может так в части 99 вернемся к этому вопросу :) К тому же у него выведена 16 битная шина, мы пока с 8 битной играемся.
Пока вопрос обозначен и более того гнаться за частотой не в приоритете. Понятно что V20 шустрее чем тот же ВМ88.
Но у нас тактовая частота 3,5МГц и от этого так скажем начинаем отсчет.

LeoN65816
31.05.2022, 08:19
К тому же у него выведена 16 битная шина, мы пока с 8 битной играемся.
Эх, невнимательно ты посты и шиты читаешь... :(
Ты с пристрастием почитай по поводу разрядности шины данных.
Более того, у него УЖЕ раздельные шины адреса и данных!
Да и ещё 16МБ умеет адресовать.
Насколько я понял, он программно совместим с V20, кроме i8080.

ivagor
31.05.2022, 08:41
кроме i8080.
Меня например только это и интересует.

Mick
31.05.2022, 10:03
Эх, невнимательно ты посты и шиты читаешь...

Наверное так оно есть. И если, как ты утверждаешь он программно совместим с V20, то пока смысла ковыряться в нем нет. За частотой в Ленинграде гнаться в этом случае не имеет смысла.

А пока диаграммы UPD70108(V20)

https://i.ibb.co/jRZX2Vd/diagramm-PD70108.png (https://ibb.co/jRZX2Vd)

диаграммы 80с88

https://i.ibb.co/441HX9P/diagramm-1-80c88.png (https://ibb.co/441HX9P)

https://i.ibb.co/sqSbyH9/diagramm-2-80c88.png (https://ibb.co/sqSbyH9)



Понятно, что в нашем случае используем минимальный режим без адресов A16...A19, то есть ограничиваемся 64кб

- - - Добавлено - - -

Продолжаем
Если я правильно понял диаграммы, то минимальный цикл длится 4 такта без ожидание
Сигнал ALE - длится целиком 1 такт
Сигнал WR/ - начинается с 2 такта и заканчивается на половине 4 такта, т.е. длится 2 такта
Сигнал RD/ - начинается с половины 2 такта и заканчивается на половине 4 такта, т.е. длится 2,5 такта

Если взять сигнал RAS/ в качестве тактов, то диаграмма вроде так выглядеть должна. И в результате вполне вписываемся в окно обращения к памяти Ленинграда.

https://i.ibb.co/DVcPY68/zx8088.jpg (https://ibb.co/DVcPY68)

Mick
31.05.2022, 19:29
Набросал предварительную схему, вернее адаптировал схему от ZX-8085, ибо там обвязка процессора практически идентична, за исключением тактовых сигналов.
Тактовую частоту на всякий случай завел через джамперы JP1 и JP2. Тактироваться изначально думаю от RAS/, но также ввел и CAS/. Коммутировать будет через JP2, а через JP1 - частота с задержкой или без.

Кроме того также поправил печатную плату ZX-8085 согласно новым реалиям. Обозвал ее ZX-8088.
Выложил схему в первый пост, смотрим, высказываемся.

PVV
31.05.2022, 20:59
x86 при сбросе стартует с адреса 0xFFFF0, в отличии от 0x0000 у ВМ80/85/Z80.
Значит в этой схеме он будет искать ПЗУ в 0xFFF0, а там ОЗУ...
D30 надо управлять не по /RD, а по DT/R и DEN, иначе как из ПЗУ ЦП читать будет?

HardWareMan
31.05.2022, 21:44
x86 при сбросе стартует с адреса 0xFFFF0, в отличии от 0x0000 у ВМ80/85/Z80.
Значит в этой схеме он будет искать ПЗУ в 0xFFF0, а там ОЗУ...
D30 надо управлять не по /RD, а по DT/R и DEN, иначе как из ПЗУ ЦП читать будет?
Не совсем так. Он стартует с адреса CS:IP = FFFF:0000, но у простого 8086/8088 индексы это параграфы, т.е. действительно 0xFFFF0. И это легаси, кстати, даже в корах, если смотреть на BIOS, там везде стартовый JMP FAR. А после него обычно дата.

ivagor
01.06.2022, 06:03
D30 надо управлять не по /RD, а по DT/R и DEN, иначе как из ПЗУ ЦП читать будет?
Можно пояснить для тех кто в танке, в чем проблема? В даташитах рисуют с DT/R и DEN, но в данной конкретной машине на первый взгляд должен работать и текущий вариант.

Mick
01.06.2022, 07:53
Не совсем так. Он стартует с адреса CS:IP = FFFF:0000, но у простого 8086/8088 индексы это параграфы, т.е. действительно 0xFFFF0. И это легаси, кстати, даже в корах, если смотреть на BIOS, там везде стартовый JMP FAR. А после него обычно дата.

Опа, забыл про долбанные индексные регистры.
И я так понимаю, мы вполне можем ими не пользоваться - у нас 64к сегмент по сути один

- - - Добавлено - - -


D30 надо управлять не по /RD, а по DT/R и DEN, иначе как из ПЗУ ЦП читать будет?

А что при чтении из ПЗУ сигнал RD/ не активен? А как же чтение из портов

- - - Добавлено - - -

Кстати, думаю, что надо при сбросе делать принудительный выбор ПЗУ, чтобы процессор читал первую инструкцию из ПЗУ, а затем уже ПЗУ разблокировать для доступа только из 0000...3FFF адресов.

HardWareMan
01.06.2022, 08:07
Опа, забыл про долбанные индексные регистры.
И я так понимаю, мы вполне можем ими не пользоваться - у нас 64к сегмент по сути один
Модель tiny как раз этим и занимается. CS=DS=ES=SS=0 (это для нас, для MS-DOS - некоторое значение).

PVV
01.06.2022, 09:05
Управление по /RD как то работать будет, но времянки DT/R и DEN гарантируют не работу на встречу выхода ЦП на AD0-7 и буфера.
По даташиту ЦП переводит свои выходы AD0-7 в Z состояние как бы одновременно с опусканием /RD в ноль, но это время не гаранитрируется, а по DEN это гарантируется.
При прерывании, INT ведь задействован, кто будет и какой вектор выставлять, на какой части шины AD0-7 или D0-7 ?
/RD при чтении вектора не формируется, он на INTA будет, а DT/R и DEN будут формироваться, но вектор, соответственно на шине D0-7 должен быть.

upd: нет, нашел, что гарантируется время от перехода шины AD в Z до опускания /RD в ноль - 0нс. Тем не менее по DEN время больше чем 0.

Mick
01.06.2022, 09:47
Модель tiny как раз этим и занимается. CS=DS=ES=SS=0 (это для нас, для MS-DOS - некоторое значение).

Да но после инициализации CS становится FFFF и нам надо как то его переинициализировать в 0000 так?
Тогда как будет выглядеть эта операция, чтобы условно из адреса FFF0, который как бы 0000, выполнить следующую команду в ПЗУ, которая уже будет по нормальным адресам 0000....3FFFF.

Я так полагаю что должна быть первая инструкция в ПЗУ

jmp far 00:04, где 00 запишется в CS, а 04 запишется в IP.
И следующая за ней команда выполнится уже по адресу 0004h?

- - - Добавлено - - -


При прерывании, INT ведь задействован, кто будет и какой вектор выставлять, на какой части шины AD0-7 или D0-7 ?
/RD при чтении вектора не формируется, он на INTA будет, а DT/R и DEN будут формироваться, но вектор, соответственно на шине D0-7 должен быть.

Пока не сильно углубился в познаниях x86, а то у него нет фиксированного адреса прерывания по умолчанию как у ВМ80?
Если нет, то шина данных AD0...AD7 подтянута к 1, то есть при чтении будет значение FFh

ivagor
01.06.2022, 10:31
jmp far 00:04
Лучше 6, если не хочешь перейти внутрь самой первой инструкции.

Mick
01.06.2022, 10:35
Лучше 6, если не хочешь перейти внутрь самой первой инструкции.

А точно :)

jmp far 00:06

EAh 06H 00h 00h 00h

По прерыванию, если считывается FFh, то 255 вектор находится по адресу 03FCh

ivagor
01.06.2022, 10:38
При прерывании, INT ведь задействован, кто будет и какой вектор выставлять, на какой части шины AD0-7 или D0-7 ?
/RD при чтении вектора не формируется, он на INTA будет, а DT/R и DEN будут формироваться, но вектор, соответственно на шине D0-7 должен быть.
Вот тут да, если использовать прерывания, то подтяжка дающая FF на ШД c "той стороны" D30, а D30 в цикле подтверждения прерывания будет закрыт.

Mick
01.06.2022, 10:41
Вот тут да, если использовать прерывания, то подтяжка дающая FF на ШД c "той стороны" D30, а D30 в цикле подтверждения прерывания будет закрыт.

Что то не нашел диаграммы с циклом прерываний, только с подтверждением. Если RD/ не участвует, то тогда да, нужно будет использовать DEN и DTR. Либо подтяжку переносить до буфера

HardWareMan
01.06.2022, 10:46
Да но после инициализации CS становится FFFF и нам надо как то его переинициализировать в 0000 так?
Тогда как будет выглядеть эта операция, чтобы условно из адреса FFF0, который как бы 0000, выполнить следующую команду в ПЗУ, которая уже будет по нормальным адресам 0000....3FFFF.

Я так полагаю что должна быть первая инструкция в ПЗУ

jmp far 00:04, где 00 запишется в CS, а 04 запишется в IP.
И следующая за ней команда выполнится уже по адресу 0004h?
Примерно так и есть. Там даже сейчас испокон веков стоит jmp far.

ivagor
01.06.2022, 10:57
Что то не нашел диаграммы с циклом прерываний, только с подтверждением.
Не уверен, что понял насчет цикла прерываний, нужен как раз цикл подтверждения.

Если RD/ не участвует
/RD - READ: The read strobe indicates that the processor is performing a memory or I/O read cycle
для сравнения
/DEN - DATA ENABLE: Provided as an output enable for the 82C86/82C87 in a minimum system which uses the transceiver. DEN is active LOW during each memory and I/O access, and for INTA cycles.

- - - Добавлено - - -

Можно грязно хакнуть - использовать NMI вместо INTR. Но тогда все равно желательно предусмотреть какой-нибудь механизм запрета/разрешения, например через порт, что потребует дополнительных микросхем. Не очень хорошее решение.

Mick
01.06.2022, 11:36
Можно грязно хакнуть - использовать NMI вместо INTR. Но тогда все равно желательно предусмотреть какой-нибудь механизм запрета/разрешения, например через порт, что потребует дополнительных микросхем. Не очень хорошее решение.

Не, не будем грязно решать, особо нет страха, если подцепим на буфер тот же DEN, если необходимо

Хотя при наличии текущей подтяжки шины данных, можно наверное обойтись без DEN, а вот RD/ на буфере заменить на DTR надо.
Тогда при прерывании будет 255 вектор.

ivagor
01.06.2022, 12:22
Хотя при наличии текущей подтяжки шины данных, можно наверное обойтись без DEN, а вот RD/ на буфере заменить на DTR надо.
Думаю лучше все же /DEN подать на 19 вывод АП6 (в крайнем случае предусмотреть перемычку), чтобы не было проблем, про которые писал PVV.

Mick
01.06.2022, 13:11
Думаю лучше все же /DEN подать на 19 вывод АП6 (в крайнем случае предусмотреть перемычку), чтобы не было проблем, про которые писал PVV.

Хорошо, так и сделаем. С этим вопросом как бы решили.

Теперь со сбросом. На мой взгляд самым простым будет повесить RS триггер. На R вход подадим RESET/, а на вход S - с выхода D10.1 через инвертор смеcь A14 и A15. А выход триггера через элемент И смешаем с сигналом RDROM/ и уже на ПЗУ подадим новый *RDROM/

Таким образом после сброса, триггер установит принудительный выбор ПЗУ, а при обращении к области памяти 0000...3FFF триггер сбросится.
И если учесть, что на шине адреса в момент сброса будет адрес FFF0, то в реальности адрес ПЗУ будет 3FF0.
Тогда туда можно вписать процедуру

jmp far 00:00

И следующая команда должна выполнится с адреса 0000

Опять же если я точно понял суть происходящего.

ivagor
01.06.2022, 15:31
С начальным стартом примерно понятно.
От D46 не планируешь избавится? Или хочешь сократить опрос клавиатуры за счет использования коротких команд обращения к портам?

- - - Добавлено - - -

Сократить опрос не получается, это я поторопился. Разве что можно не трогать DX. Тебе виднее, но мне кажется, что лучше упростить железку.

Mick
01.06.2022, 15:37
Сократить опрос не получается, это я поторопился. Разве что можно не трогать DX. Тебе виднее, но мне кажется, что лучше упростить железку.

Да пусть остается, эта железка и так экспериментальная. :)

Mick
01.06.2022, 20:49
Обновил схему в первом посте. Смотрим высказываемся.

ivagor
01.06.2022, 21:31
На D12.2 идет RDROM/. При выполнении стартовой команды будут активны и CSRAM/ и RROM/, что приведет к соревнованию кто сильнее между D33 и ПЗУшкой.

Mick
02.06.2022, 09:23
На D12.2 идет RDROM/. При выполнении стартовой команды будут активны и CSRAM/ и RROM/, что приведет к соревнованию кто сильнее между D33 и ПЗУшкой.

Да, надо изменить схему. Сигнал от триггера должен быть подан на D12.1

PVV
02.06.2022, 12:06
Ни какие тригеры не нужны. Адрес старта 0xFFFF0, а это значит, что ножки А19-16 в 1. Нужно организовать выбор ПЗУ по ((А14==0 и А15==0) или А19==1).
Ставим ЛЛ1 между D10.1 и D12.1, а на второй вход ЛЛ1 заводим А19.
Еще, READY (R2) нужно притянуть на +5, а не gnd. Также притянуть на +5 RD/, WR/, а то при активном сбросе они в Z состоянии.

грязно хакнуть - использовать NMI вместо INTR
Тригер можно задействовать для управления запретом NMI. В РС так делают, так что не на столько уж это плохое решение.

Mick
02.06.2022, 12:47
Ни какие тригеры не нужны. Адрес старта 0xFFFF0, а это значит, что ножки А19-16 в 1. Нужно организовать выбор ПЗУ по ((А14==0 и А15==0) или А19==1).
Ставим ЛЛ1 между D10.1 и D12.1, а на второй вход ЛЛ1 заводим А19.
Еще, READY (R2) нужно притянуть на +5, а не gnd. Также притянуть на +5 RD/, WR/, а то при активном сбросе они в Z состоянии.

Триггер не нужен, триггер должен уходить. Это хорошо, значит обойдемся тем, что уже есть на плате.

ivagor
02.06.2022, 13:25
Для A19 надо добавить регистр. И если уж использовать А19, то еще проще было бы поделить адресное пространство пополам - A19=0 это RAM, A19=1 - ROM. Но я догадываюсь, что это предложение не найдет поддержки.

- - - Добавлено - - -


Для A19 надо добавить регистр.
Кстати, на мой взгляд логично было бы добавить регистр для A19 вместо D46.

Mick
02.06.2022, 13:35
Для A19 надо добавить регистр. И если уж использовать А19, то еще проще было бы поделить адресное пространство пополам - A19=0 это RAM, A19=1 - ROM. Но я догадываюсь, что это предложение не найдет поддержки.

Думаю что в данном аспекте, обходимся минимум изменений. Если что то вырастит из этого, тогда да, а пока чистый эксперимент.
А зачем регистр на A19?

PVV
02.06.2022, 13:39
Для A19 надо добавить регистр
Для чего? он активем во время действия RD/ или WR/, заходит лишь на один вход TTL(добавляемой ЛЛ1).

И если уж использовать А19, то еще проще было бы поделить адресное пространство пополам - A19=0 это RAM, A19=1 - ROM
А здесь будут проблемы с адаптацией ПО, слишком отличаться будет стиль программирования от х80, хотя, конечно, возможно.

ivagor
02.06.2022, 14:14
Для чего? он активем во время действия RD/ или WR/, заходит лишь на один вход TTL(добавляемой ЛЛ1).
В тех даташитах, которые я читал, про A16-A19/S3-S6 написано так:
ADDRESS/STATUS: During T1, these are the four most significant address lines for memory operations. During I/O operations, these lines are LOW. During memory and I/O operations, status information is available on these lines during T2, T3, TW, and T4.

А здесь будут проблемы с адаптацией ПО, слишком отличаться будет стиль программирования от х80, хотя, конечно, возможно.
Какие проблемы и с адаптацией какого ПО? Правда это вопрос больше к Mickу. Мне кажется, что иметь 64 Кб озу лучше, чем 48.

- - - Добавлено - - -


During T1, these are the four most significant address lines for memory operations. During I/O operations, these lines are LOW. During memory and I/O operations, status information is available on these lines during T2, T3, TW, and T4.
И на временных диаграммах минимального режима так нарисовано. Например интеловский даташит (https://www.limpulsion.fr/upload/docs/80882.PDF), даташит 80с88 renesas (https://www.renesas.com/us/en/products/space-harsh-environment/mil-std-883-products/mil-std-883-microprocessors-and-peripherals/80c88-cmos-8-bit16-bit-microprocessor#document)

Mick
02.06.2022, 14:50
Какие проблемы и с адаптацией какого ПО? Правда это вопрос больше к Mickу. Мне кажется, что иметь 64 Кб озу лучше, чем 48.

Точно стиль программирования тут будет отличаться.
Да и тут не стоит задача именно использовать все 64кб. А так конечно интересная идея использовать A19 как разделение ПЗУ и ОЗУ. Кстати я так подумал, если разделять, то похоже надо будет активно юзать сегменты.


Кстати вопрос про программирование.
Как задать TASM чтобы он компилил с 0 а не со 100h
Просто я в основном раньше com программки писал и там шапка простая

.MODEL TINY
.CODE
.STARTUP

В общем как получить бинарник вместо com файла.

- - - Добавлено - - -


В тех даташитах, которые я читал, про A16-A19/S3-S6 написано так:
ADDRESS/STATUS: During T1, these are the four most significant address lines for memory operations. During I/O operations, these lines are LOW. During memory and I/O operations, status information is available on these lines during T2, T3, TW, and T4.

Похоже да, надо защелку ставить на A19 и по ALE защелкивать. Но это типа уже ТМ7 похоже
То есть как бы назад к первоначальной идеей с триггером не вернуться.

ivagor
02.06.2022, 15:12
Как задать TASM чтобы он компилил с 0 а не со 100h
tasmом (если это не Telemark Assembler) с универа не пользовался (зато недавно пользовался fasmом), но вроде у практически всех асмов x86 адрес компиляции задается по org

Mick
02.06.2022, 15:49
tasmом (если это не Telemark Assembler) с универа не пользовался (зато недавно пользовался fasmом), но вроде у практически всех асмов x86 адрес компиляции задается по org

Вот я собственно тоже уже лет так 15 не открывал его :)

PVV
02.06.2022, 18:47
Для чего? он активем во время действия RD/ или WR/, заходит лишь на один вход TTL(добавляемой ЛЛ1).
В тех даташитах, которые я читал, про A16-A19/S3-S6 написано так:
ADDRESS/STATUS: During T1, these are the four most significant address lines for memory operations. During I/O operations, these lines are LOW. During memory and I/O operations, status information is available on these lines during T2, T3, TW, and T4.
Да, что то я стал забывать, посмотрел, действительно, надо его защелкивать инверсным ALE на тм2. И как раз увидел еще момент - на А18 в моменты активности /RD или /WR присутствует флаг разрешения прерываний. Соответственно можно эту ножку именно по /RD защелкивать на второй половинке тм2, и этим управлять разрешением прерывания от NMI.

Mick
02.06.2022, 18:53
На D12.2 идет RDROM/. При выполнении стартовой команды будут активны и CSRAM/ и RROM/, что приведет к соревнованию кто сильнее между D33 и ПЗУшкой.

Обновил схему в первом посте.
Пока обошелся без A19.

- - - Добавлено - - -


Да, что то я стал забывать, посмотрел, действительно, надо его защелкивать инверсным ALE на тм2. И как раз увидел еще момент - на А18 в моменты активности /RD или /WR присутствует флаг разрешения прерываний. Соответственно можно эту ножку именно по /RD защелкивать на второй половинке тм2, и этим управлять разрешением прерывания от NMI.

Если использовать ТМ2, то ALE надо тогда инвертировать для пущей надежности

ivagor
02.06.2022, 19:17
Mick, извини, но в текущем варианте даже не хочется разбираться, надо упрощать "схему начального пуска". Если выбирать между этим вариантом и предлжением PVV, то я однозначно за его, подумаешь добавить регистр, зато просто и понятно.
Если хочется спасти вариант без A19, то для отключения не стоит зацикливаться только на адресных линиях. Можно отключать например по факту обращения к порту. Т.е. jmp far (сделали CS=0) и потом in или out.

Mick
02.06.2022, 19:40
Mick, извини, но в текущем варианте даже не хочется разбираться, надо упрощать "схему начального пуска". Если выбирать между этим вариантом и предлжением PVV, то я однозначно за его, подумаешь добавить регистр, зато просто и понятно.

Не, ну какой вредный.

Вот вариант с A19 - https://disk.yandex.ru/d/OoTICcrkyOMKEQ

Можно еще один подрисовать, где по A19 рулить выбором ПЗУ или ОЗУ, но тогда сам понимаешь надо будет играться с сегментами и об этом надо будет помнить.

ivagor
02.06.2022, 20:32
Видишь, как здорово, даже ошибиться особо негде (я про схему начального пуска).

Mick
03.06.2022, 19:43
Видишь, как здорово, даже ошибиться особо негде (я про схему начального пуска).

Поправил печатную плату согласно последней схеме с A19

https://i.ibb.co/LpGvSD2/zx8088-pcb.png (https://ibb.co/LpGvSD2)

- - - Добавлено - - -

Тут в качестве оффтопа нашел у себя на работе старую плату от факса и там вон какая плюшка

https://i.ibb.co/6gyJ6dR/IMG-20220603-165002.jpg (https://ibb.co/6gyJ6dR)

UPD70208 - NEC V40 и он тоже умеет эмулировать 8080А, ссылка на даташит - https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwj766H02ZH4AhWKvosKHeJhAckQFnoECBEQAQ&url=https%3A%2F%2Fdatasheetspdf.com%2Fdatasheet%2F UPD70208.html&usg=AOvVaw0i485J8RvqPOHcdHVtO5t7&cshid=1654273844674378

- - - Добавлено - - -

Нашел пример, как типа эмуляция включается V20




; SBCV20 terminal test program
; Assembler: asm86.com/asm86.cmd
;
MEM equ 0000h ;Memory top
ROM equ 8000h ;Rom top
STACK equ 8000h ;Stack top
REGAD equ 00h ;8251 data register
REGAC equ 01h ;8251 control register
RTSHIG equ 17h ;RTS high
RTSLOW equ 37h ;RTS low
;
BUFSIZ equ 128 ;Buffer size(2^n, max128)
FULSIZ equ BUFSIZ*14/16 ;Buffer almost full
;
dseg MEM
org 0000h
;
; Interrupt vector
DEVERR rw 2 ;Devide error
BRKFLG rw 2 ;Break flag
NMIREQ rw 2 ;Non maskable interrupt
BR3INS rw 2 ;BRK3 instruction
BRVINS rw 2 ;BRKV instruction
CHKINS rw 2 ;CHKIND instruction
org 0400h-20
VGETCH rw 2 ;CALLN 251
VKBHIT rw 2 ;CALLN 252
VPUTCH rw 2 ;CALLN 253
VBRKEM rw 2 ;BRKEM 254
INTREQ rw 2 ;External interrupt
;
; Receive buffer
RECBUF rb BUFSIZ
RBFRDP rw 1
RBFWTP rw 1
RBFCNT rb 1
;
cseg MEM
org ROM
;
; 8251 -> buffer by interrupt
;
intsr: push ax ;Save ax
push bx ;Save bx
in al,REGAD ;Get char
mov ah,al ;Save it
;
mov al,RBFCNT ;Get count of chars
cmp al,BUFSIZ ;Buffer full?
jz isext ;If yes, ignore
inc al ;Count up
mov RBFCNT,al ;Update
cmp al,FULSIZ ;Buffer almost full?
jnz isst1 ;If no, skip flow control
mov al,RTSHIG ;RTS control
out REGAC,al ;Out it
;
isst1: mov bx,RBFWTP ;Get write point
mov al,ah ;Restore char
mov [bx],al ;Write char into buffer
;
inc bl ;Next write point
and bl,BUFSIZ-1 ;Wrap
mov RBFWTP,bx ;Update
;
isext: pop bx ;Restore bx
pop ax ;Restore ax
sti ;Enable interrupt
iret
;
; buffer -> al
getch: push bx ;Save bx
;
gcst1: mov al,RBFCNT ;Get count of chars
cmp al,0 ;Buffer enpty?
jz gcst1 ;If yes, wait
cli ;Disable interrupt
;
mov al,RBFCNT ;Critical timing measures
cmp al,FULSIZ ;Need flow control?
jnz gcst2 ;If no, skip flow control
mov ah,al ;Save char
mov al,RTSLOW ;RTS control
out REGAC,al ;Out it
mov al,ah ;Restore char
gcst2: dec al ;Count down
mov RBFCNT,al ;Update
;
mov bx,RBFRDP ;Get read point
mov al,[bx] ;Read char from buffer
;
inc bl ;Next read point
and bl,BUFSIZ-1 ;Wrap
mov RBFRDP,bx ;Update
;
pop bx ;Restore bx
sti ;Enable interrupt
ret
;
; al -> 8251
putch: push ax ;Save char
;
pcst1: in al,REGAC ;Get status
and al,01h ;check TxBUF enpty
jz pcst1 ;wait for empty
;
pop ax ;Restore char
out REGAD,al ;Out it
ret
;
; put string
puts: cld ;set DF for SI increment
ptst1: lodsb ;get data to AL and SI++
cmp al,00h ;check tail
jz ptext ;if tail, return
call putch ;display a charactor
jmp ptst1 ;loop until tail
ptext: ret
;
; message
ckcpu db 13,10,'PROCESSOR: ',0
nec db 'NEC V20(uPD70108)',13,10,0
intel db 'Intel 8088',13,10,0
;
; CALLN wrapping
ngetch: call getch
iret
nkbhit: mov al,RBFCNT ;Get count of chars
iret
nputch: call putch
iret
;
; start
start: mov ax,cs ;set com model
mov ds,ax
mov es,ax
mov ss,ax
mov sp,STACK ;set stack
;
mov VGETCH,offset ngetch
mov VGETCH+2,ax
mov VKBHIT,offset nkbhit
mov VKBHIT+2,ax
mov VPUTCH,offset nputch
mov VPUTCH+2,ax
mov VBRKEM,offset emu80
mov VBRKEM+2,ax
mov INTREQ,offset intsr
mov INTREQ+2,ax
;
; 8251 setup
mov dx,REGAC
mov al,00h ;Default mode or no operation
out dx,al ;Try command
out dx,al ;Try command
out dx,al ;Try command
mov al,40h ;reset
out dx,al ;Delay
mov CX,16 ;Delay
loop $ ;Delay
mov al,4eh ;mode
out dx,al ;Out it
mov al,37h ;command
out dx,al ;Out it
;
; Buffer initialize
xor al,al ;Clear al
mov RBFCNT,al ;Set count of chars
mov ax,offset RECBUF ;Get buffer top
mov RBFRDP,ax ;Set read point
mov RBFWTP,ax ;Set write point
;
sti ;Enable interrupt
;
; display CPU
mov si,offset ckcpu ;set message top
call puts ;display message
;
; Check CPU
mov ax,0101h
db 0d5h,10h ;aad 10h
cmp al,0Bh ;NEC V20 ignores the argument
je isv20
mov si,offset intel
isV20: call puts
;
; Emulation sequence
db 0fh,0ffh ;BRKEM
db offset VBRKEM/4 ;Vector number
;
emu80:
db 21h ;LXI
dw offset hello
string:
db 7Eh ;MOV A,M
db 0FEh,0 ;CPI 0
db 0CAh ;JZ
dw offset loop
db 0EDh,0EDh,0FDh ;CALLN 253(putch)
db 23h ;INX H
db 0C3h ;JMP
dw offset string
loop:
db 0EDh,0EDh,0FBh ;CALLN 251(getch)
db 0EDh,0EDh,0FDh ;CALLN 253(putch)
db 0C3h ;JMP
dw offset string
;
hello: ;HELLO, WORLD,CR,LF,0
db 48h,45h,4Ch,4Ch
db 4Fh,2Ch,20h,57h,4Fh,52h
db 4Ch,44h,0Dh,0Ah,00
;
; reset
org 0fff0h
db 0eah ;jmp
dw start ;offset
dw 0000h ;segment
;
end

ivagor
03.06.2022, 20:15
Я вот этим (https://hackaday.io/project/170924-v20-mbc-a-v20-8088-8080-cpu-homebrew-computer) проектом вдохновляюсь. Основная неприятность в том, что нет эмулятора V20.

PVV
04.06.2022, 09:16
offtop: хотел в личку написать, а она отключена, может отдельную тему сделать по V20-MBC?

Я вот этим (https://hackaday.io/project/170924-v20-mbc-a-v20-8088-8080-cpu-homebrew-computer) проектом вдохновляюсь. Основная неприятность в том, что нет эмулятора V20.
не понятно как выполняется загрузка начального лоадера. Эмулировать можно попробовать в Протеусе. Сейчас режим эмуляции 8080 в x86.dll еще не реализован, но я на него закладывался, как раз хорошая возможность это сделать. Добавить к схеме ПЗУ и UART на 8250/1, а терминал в Протеусе есть.

ivagor
04.06.2022, 10:24
Из этого проекта я взял очень мало - детект V20, переключение в режим 8080, может еще какие-то мелочи. Детально в нем не разбирался, про загрузку не могу ничего сказать.
Эмуляция в протеусе это в принципе хорошо, но мне она не поможет. Мне нужен быстрый эмулятор с хорошим отладчиком. Ограниченное решение я для себя нашел, просто отлаживаем отдельно части 8080 и 8088. В 8088 остается неотлаженным переключение, но можно понадеяться на копипасту из v20-mbc. Для простых вариантов (запустил v20, и он запустил программу 8080) это более-менее, но для сложных (использующих прерывания и вызовы кода 8088 из 8080) так конечно не наотлаживаешь.

ivagor
04.06.2022, 18:08
Все же хочу развернуто написать про вариант с различением ram/rom только по A19.
1. Программная часть
1.1. Если хочется минимизировать работу с сегментами, то ее можно свести к начальному старту. Стартуем, перебрасываем сколько нужно из пзу в озу (можно и с распаковкой) и забываем про сегменты. Или не забываем, тут полная свобода.
1.2. Проще с переопределением векторов прерываний.
1.3. Можно использовать самодифицирующийся код в области ram 0000-3FFF.
2. Аппаратная часть.
2.1. Чуть проще.
2.2. Можно взять пзу до 64 Кб. Не то, чтобы это было нужно, но можно.

Mick
06.06.2022, 08:53
2. Аппаратная часть.
2.1. Чуть проще.
2.2. Можно взять пзу до 64 Кб. Не то, чтобы это было нужно, но можно.

2.1 С одной стороны да, достаточно A19 подать на 1 вывод D12.1, но это ведь только чтение. А ведь про запись забыли.
Придется вводить тот же A19 в сигнал WE/. В этом случае придется сигналы IOM/ и WR/ перенести с D10.4 (ЛЕ1) на D14.4(ЛЛ1). А выход D14.4 подать на один из входов D10.4, а на второй вход подать A19.
Если не поправить сигнал записи, то любая команда записи в сегменте пзу будет проецироваться на запись в сегменте озу.
2.2 Ну пару адресов можно добавить, тут проблем не должно возникнуть

ivagor
06.06.2022, 09:14
Если не поправить сигнал записи, то любая команда записи в сегменте пзу будет проецироваться на запись в сегменте озу.
На мой взгляд это не проблема, разве что сделать как защиту от ошибок в программе.

Mick
06.06.2022, 19:05
Вот нарисовал схему, где разные сегменты ОЗУ и ПЗУ по A19, а также увеличил объем ПЗУ до 64Кб - https://disk.yandex.ru/i/mIra7MgBw6dulg

ivagor
06.06.2022, 20:31
В первых двух сериях ты использовал четверть объема пзушки, почему бы в этот раз не попробовать использовать полностью.
Насчет эмуляции в Emu. Распределение памяти, экран с бордюром, бипер - это получилось. Прерывания как на реале не получатся, по крайней мере я не могу средствами конфига. Проблема в том, что с кадровой частотой приходят прерывания с вектором 0 (не 255, как на реале). Думаю это можно пережить. Клавиатуру скопипастил, эмуляцию не проверял, но ее можно было и в zx8080/5 не проверять. На всякий случай напишу, что не смогу отладить обмен с магнитофоном, но и это в zx8080/5 не было востребовано (хотя для них то можно отладить, там эмуляция проца точная).

ivagor
08.06.2022, 17:07
Агитировал за избавление от D46 - это я зря делал, надо оставить. В режиме 8080 nec v20 можно адресовать только порты 00-FF, тут D46 и пригодится.

Mick
09.06.2022, 08:44
Агитировал за избавление от D46 - это я зря делал, надо оставить. В режиме 8080 nec v20 можно адресовать только порты 00-FF, тут D46 и пригодится.

Вот не зря его не трогал. А ты все отрезать, отрезать. :)
Ладно герберы подготовлю и как будет возможность, закажу. А пока никак не придут платы от Аметиста, застряли у китайцев где то.

ivagor
09.06.2022, 17:03
Конфигурация планируемого реала похоже устаканилась, можно прикинуть конфиг для Emu. Ограничения я уже выше описал (нет прерываний). В пзу (до 64 Кб) прошит микротест базовых возможностей.
1. Поверхностное тестирование озу.
1.1. Заполнение байтом FF, проверка.
1.2. Заполнение байтом 00, проверка.
2. Печатаем на экране ZX8088. Если в пункте 1 была ошибка, то еще BAD RAM.
3. Крутимся в бесконечном цикле. По бордюру зелено-красные полосы и писк из бипера.
Озу для хранения переменных не используется, только для тестирования и вывода на экран.

Mick
13.06.2022, 08:59
Пока образовалась оперативная пауза, связанная с заказом плат, но до конца года надо так сказать эксперимент реализовать в железо. Так вот размышляя, а дальше что, есть из 8 битной шины данных 80188 и его аналог UPD70208 с возможностью эмуляции 8080. Либо совсем безобразничать и начать экспериментировать с другими процессорами типа 6502, 6800 и так далее.
А есть еще путь - расширение в сторону увеличение разрядности шины данных типа 8086. И как будет выглядеть комп в этом случае. Понятно можно сделать две линейки по 32кб, но это надо найти половинки РУ5, а можно условно пойти в сторону условного Ленинград-128, то есть две линейки по 64кб РУ5. Но это как бы только вопрос с памятью, но ведь есть еще видеовыход и другие узлы, которые придется модифицировать.

ivagor
13.06.2022, 09:10
Перечисленные варианты вместе или вместо zx8088?
Интегрированные варианты (8018x, NEC V40/50) мне не особо интересны, но возможно кому-то совсем наоборот.
Мне интересен NEC V30 тем, что возможно это самый эффективный (команд/МГц) неинтегрированный проц с возможностью выполнения команд 8080 (круче разве что "интегрированный" eZ80).
Для zx6800 отлаживать не в чем, в emu 6800 не поддерживается.

Mick
13.06.2022, 14:07
Перечисленные варианты вместе или вместо zx8088?
Скажем так, ни вместе, ни вместо, а дальше. :)

NEC V30 это я так понимаю аналог 8086 только с эмуляцией 8080. То есть расширение в сторону разрядности шины данных, то бишь "Ленинград-128"

- - - Добавлено - - -


Для zx6800 отлаживать не в чем, в emu 6800 не поддерживается.

А если вдруг уговориться b2m какой нибудь комп на 6800 отэмулировать. :)
Поглядел что там еще нестандартного эмулируется - есть инопланетные компы БКшки

ivagor
13.06.2022, 15:07
Насчет 6800 затрудняюсь, а вот на 6809 были популярные компы и приставки.

Mick
13.06.2022, 17:18
Насчет 6800 затрудняюсь, а вот на 6809 были популярные компы и приставки.

На MC6800 был такой комп как Пълдин 601 - https://ru.wikipedia.org/wiki/Пълдин_601

ivagor
22.06.2022, 20:16
Вариант (http://www.nedopc.org/forum/viewtopic.php?f=93&t=18868&start=165#p152081) PVV

Mick
23.06.2022, 09:51
Вариант (http://www.nedopc.org/forum/viewtopic.php?f=93&t=18868&start=165#p152081) PVV

Ну да, прикольно. Так сказать иное направление.
Только еще бы интереснее было бы попробовать в этом случае РК-шку попробовать на NEC V20, чтобы так сказать программы написанные на ВМ80А исполнять.

Mick
02.07.2022, 18:36
Так, опытные платы заказаны, а это значит, что проект по крайней мере оживет в железе :)

troosh
26.07.2022, 20:13
Попытался самописным скриптом сделать замену инструкций z80 в 8088 для ПЗУ 48K Спектрума. Естественно сейчас работать не должно от слова никак, но как заготовка для дальнейшей ручной переделки может сгодится. Оно даже в 16K не помещается, где-то на ¼ жирнее выходит...
Планов развивать скрипт нет, нужно думать об инструментах сравнения поведения оригинального и сконвертированного вариантов, а также как и на чём тестировать.
https://disk.yandex.ru/d/bERCKcINEM5xqg

sergio78
01.08.2022, 20:36
где эти v30 заказывать собираетесь? раньше оно на алике россыпями валялось, так как китайцы сдули кучу деталей со многочисленных присланных им на утилизацию
старинных аналоговых атс, где и эти nec частенько были. но эти россыпи изобилия уже осушились и давно.

Mick
16.08.2022, 20:48
Получил таки я платки.

https://i.ibb.co/YT0wy0q/zx-8088-top.jpg (https://ibb.co/YT0wy0q)

https://i.ibb.co/vB2kj41/zx-8088-bot.jpg (https://ibb.co/vB2kj41)

Теперь дело за малым - собрать все это дело. Надо ревизию деталек провести.