Войти
ФлеймФорумЖелезо

8-битный "компьютер мечты" (3 стр)

Страницы: 1 2 3 4 521 Следующая »
#30
8:31, 28 фев. 2019

Проект компьютера на 6809 управляемого Форт
https://github.com/nealcrook/multicomp6809


#31
(Правка: 19:05) 17:10, 4 мар. 2019

Осмeлюсь предложить начать разрабатывать концепцию «Фантазёр»-подобного компьютера…

Суть в следующем…
Архитектурно и программно «компьютер мечты» не заморачивается на проблемах отображения спрайтов и звуковых эффектах. И в зависимости от реализации в эмуляции одна и та же игра может представляться абсолютно по-разному. Получается подобие «рогалика»…

Например, начнём с примитивной реализации через дискретное «железо».

Имеется страница ячеек «погоды» с её параметрами. Оно управляет базовым задним планом.
Ячейками «дождь» через «микшер» в кадр подмешивается шум «генератора дождя». Если скорость дождя сбавить и размер капелек увеличить, получим снежную погоду.
Имеются ячейки «ветрености» и «облачности», управляющие направлением струек дождя или движением облаков.
Ячейками «трава», «деревья», «птицы», «дома», «трафик» и т.п., можно управлять не только динамическим графическим фоном, но и тематическими звуковыми эффектами: Звук дождя проявляется вместе с изображением дождя, а деревья на ветру листвой играют с соответствующим звуком…

Тем самым, в зависимости от возможностей эмулятора (или железа консоли), может рисоваться как простое 2D в стиле NES, так и 3D стиля PSX, а можно и VR сделать.
От самого процессора требуется лишь поддерживать игровую обстановку.

Аппаратно-программно существуют всего 256 ячеек памяти, которые всем управляют:

ADDR .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
+000 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки общего уровня играющего - позиционирование
+010 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 1-го уровня играющего - мастерство
+020 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 2-го уровня играющего - экипировка
+030 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 3-го уровня играющего - достаток
+040 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 4-го уровня играющего - движимое имущество
+050 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 5-го уровня играющего - недвижимое имущество
+060 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 6-го уровня играющего - повелитель
+070 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 7-го уровня играющего - властелин
+080 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 8-го уровня играющего - магистр
+090 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки 9-го уровня играющего - маг
+0A0 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки «Animals»: Птицы, животные, жучки, рыбки…
+0B0 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки «Builds»: Пещеры, хижины, избы, дома, небоскрёбы…
+0C0 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки «Clouds»: Облака, осадки, небо, звёзды, солнце…
+0D0 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки «Disasters»: Ветра, ураганы, наводнения, землетрясения, звездопад…
+0E0 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки «Environment»: Туман, трава, деревья, речки, мосты, шоссе, Ж/Д, люки…
+0F0 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Ячейки «Figures» - ключевые предметы или фигуры…
Как видно, ячеек всего предлагается (мною) 256 и все они тематически сгруппированы по 16 с «A0» по «FF». Их должно быть вполне достаточно для генерации сцены…
А вот первые 160 ячеек имеют специфическое назначение. Здесь «Ячейки i-го уровня» надо воспринимать шире, так как к уровням игры они не относятся.
Так, «ячейки общего уровня» управляют позиционированием игрока в пространстве. Если игра сетевая, то именно эти 16 ячеек доступны всем игрокам, где указывается позиция игрока в пространстве.
Далее идут ячейки «прокачки» игрока и т.д…
Если игрок вступает в схватку, ячейки «мастерства» определяют взаимодействие с противником. А ячейки «экипировки» определяют его самочувствие и восстановление сил после битвы…
Чем глубже «уровень» раскрытия другим игрокам/противникам, тем детальнее информация. Грабители могут украсть «достаток» или лошадь - «движимое имущество»…
Уровень «повелитель» позволяет управлять животными, приручать диких животным или договариваться с деревенскими…
Уровень «властелин» определяет земельные владения вместе с крепостными и рабами или просто означает командующего взводом…
Уровень «магистра» позволяет внушать свою волю как зверям, так и людям…
Уровень «мага» позволяет перемещать предметы, менять карту местности, телепортироваться или управлять погодой и стихией…

Если взять за основу консоли процессор фильма «Терминатор» - 6502, то будет всё ещё легче:
Допустим, GameBoy, NES, Sega, PSX и X-Box могли бы иметь центральный процессор 6502, но графически имели совершенно разное оснащение. Тем самым, если вышла новая игра, то она запустится (её файл) на всех консолях, но графически игроку предоставляли совершенно разные картины…
То есть, в Sega процессор 68000 строит графику и звук, а сама игра прошита в 6502.
Теоретически, под Sega можно разработать единый картридж с прошивкой под 68000/Z80 и с 6502 на борту, к которому должен подключаться ещё картридж с нашей игрой…

P.S.: Так я предлагаю оторваться от архитектуры консолей прошлого века и взглянуть на игровую консоль с другой стороны.

#32
19:02, 4 мар. 2019

Alikberov

Это всё может быть интересно  скучающему специалисту в виде хобби,... но абсолютно чуждо  массам ностальгирующим по 8-бит эпохе

Alikberov
> Так я предлагаю оторваться от архитектуры консолей прошлого века и взглянуть
> на игровую консоль с другой стороны.

Тут речь вообще не про консоли, а про ПК, с выпрямленными (относительно современных аппаратных возможностей) графическими конвеерами, - аппаратный блит, спрайты, скроллинг - это вот всё, хотя бы на уровне документации (реализация десятое дело, заниматься этим всё равно никто не будет0

#33
(Правка: 19:12) 19:08, 4 мар. 2019

0iStalker
> Тут речь вообще не про консоли, а про ПК, с выпрямленными (относительно
> современных аппаратных возможностей) графическими конвеерами, - аппаратный
> блит, спрайты, скроллинг
Тaк я про то и говорю, чтобы даже аппаратный блит выбросить нафиг, а перейти на более высокий уровень абстракции, где процессор занимается 100% игровой ситуацией…

То есть процессор «говорит» графическому контроллеру, что игрок имеет 80% мышечной массы и 50% брутальности лица, а видеоконтроллер сам строит на своё рандомное усмотрение персонаж…

#34
19:39, 4 мар. 2019

0iStalker
> это вот всё, хотя бы на уровне документации (реализация десятое дело,
> заниматься этим всё равно никто не будет0

Почему не будет. Можно сделать виртуальную игровую консоль. Т.е. как бы эмулятор несуществующего компа.

Такие уже существуют и под них народ игрухи пишет. Не помню название.

#35
19:46, 4 мар. 2019

Virtex
> Такие уже существуют и под них народ игрухи пишет.
Pico-8

#36
(Правка: 20:17) 19:16, 6 мар. 2019

=A=L=X=
Кaк-то отклонился от сути темы.
Предлагалось же использовать Z80.
На одном сайте я предлагал кое-какие наброски. Предложу и здесь.
Может понравится…

Мною предлагалась архитектура Микро-ПК на Z80, где адресное пространство делится не совсем обычно.
По сигналу M1 процессора аппаратной частью определяется активный программный сегмент.

Так, по M1 фиксируется бит A15, чтобы узнать, в какой половине адресного пространства исполняется код.
Если активные инструкции исполняются в старшей половине, то нижняя половина считается оперативным блоком.
То есть, для команд по адресам ОЗУ (R) 8000…FFFF нижние (S) 0000…7FFF представляются этим же ОЗУ и прикладная программа имеет все 64Кб ОЗУ и никак не может читать ПЗУ.
А вот если исполняются команды нижней половины (S) 0000…7FFF, то это всегда ПЗУ и читаются данные ПЗУ. Но записываться могут в (S) 0000…7FFF как в ОЗУ.

Тем самым, код ПЗУ имеет 64Кб для записи, 64Кб для чтения ПЗУ+ОЗУ и 32Кб под команды…
А вот код из ОЗУ имеет 32Кб для записи, 64Кб для чтения и 32Кб под команды…

Всегда доступны для записи все 64Кб ОЗУ любой из 256 страниц - 16Мб ОЗУ.
Если программа выполняется из ОЗУ, то записать поверх себя она не может - защита кода.

Это может показаться запутанным только потому, так как я бегло здесь всё объяснил быстро.

Не так давно я где-то на бумагефайле расписывал все плоскости адресного пространства.

#37
19:27, 6 мар. 2019

Alikberov

ALX уже писал выше, по сигналу ~M1 можно однозначно определить, что  процессор выбирает, инструкцию, либо данные, - на этом можно "сыграть", например,  разместить в области 0000 - 3FFF  код операционной системы, а  диапазон 4000 - FFFF задействовать под внешнюю память программ, на картридже, например (или в отдельном ОЗУ)  Писать/читать в область данных, при этом можно в диапазоне 0000 - FFFF. Возможно так уже кто-то и делал, не могу сказать т.к. кроме спектрума на Z80 мне ничего не попадалось.

#38
21:36, 6 мар. 2019

0iStalker
У процессора 8051 тоже есть такой сигнал позволяющий обращатся к 64к-ПЗУ+64к-ОЗУ

#39
(Правка: 1:49) 1:13, 7 мар. 2019

У процессоров i8080/Z80 имеется одна инструкция, которая крайне редко выполняется.
Это «31 xx xx» - «lxi sp,addr» / «ld sp,addr».
Согласитесь, редкий алгоритм содержит более пары подобных инструкций, а вместо неё использовать «F9» - «sphl» / «ld sp,hl»…

Таким образом, по «M1» с кодом 31 можно аппаратно организовать виртуальную инструкцию.
Вместо инструкции перезагрузки указателя стека непосредственным операндом гораздо полезнее было бы иметь x86-аналог «push a16».

Как это достичь…
Вместо кода «31» процессору на шину данных подставляется код «C7» и происходит программное прерывание на адрес «0000».
Сам код «31» формируется в индекс страницы адресации специального ПЗУ с заготовками коротких подпрограмм, которая мультиплексором подключается непосредственно к процессорным шинам.
Так, код «31» преобразуется в адрес «0620», но только сигналы A0…A4 процессора адресуют конкретную ячейку ПЗУ, в которых прошита следующая цепочка инструкций:

      .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
0620: E3 E5 D5 5E 23 56 23 33 33 E3 33 33 E1 D5 3B 3B
0630: 3B 3B D1 C9
Такой «push a16» хоть и медленный из 20 инструкций, но будет экономить байт-код программ…
На время исполнения виртуальной инструкции внешняя логика запрещает все прерывания INT/NMI.

Порядок действия таков:

Конечно, можно подвязать внешний микроконтроллер, который будет следить за инструкциями и производить нужные манипуляции…

#40
9:25, 7 мар. 2019

Tonal
> У процессора 8051 тоже есть такой сигнал позволяющий обращатся к
> 64к-ПЗУ+64к-ОЗУ

Судя по вики MSC-51 вообще является представителем гарвардской архитектуры, просто шины адреса и данных для экономии общие для кода и данных. Так что без такой ножки тут просто никак.
Но вообще что-то такое у них было уже в Intel 8008: https://petsd.net/8008.php

Sync  (output, active high). Indicates that the current machine cycle is the opcode fetch cycle of an instruction execution

А в 8080 так и вообще было не только это, но и все операции со стеком типа PUSH/POP взводили еще и третью ножку, то есть аппаратно можно было реализовать стек в отдельной микросхеме.
Это уже забавно. И, кстати, в Z80 от этой ножки избавились, уж больно экзотичная видимо была даже для бывших выходцев из Intel.

#41
(Правка: 9:33) 9:33, 7 мар. 2019

Alikberov

> Предлагалось же использовать Z80.

Вообще это лично моё предложение просто потому что я считаю этот проц одним из выдающихся 8-биток из реального реала. Но в принципе были и другие, возможно незаслуженно забытые.

> инструкция, которая крайне редко выполняется ... «ld sp,addr»

В экстремальном программировании когда через стек быстро пробрасывают блоки памяти - весьма нужная вещь.
Имхо гораздо продуктивнее обратить внимание, что приличное число однобайтовых инструкций передачи данных между регистрами содержат совершенно ненужные в коде ld b, b; ld c, c и т.п.
Вот их пускать под нож гораздо приятнее, тем более что по эффекту они - ровно nop и успеет их процессор выполнить или нет перед тем как попасть в исключение - неважно.
В принципе идея их перехватывать для каких то особенных фич компутера - весьма забавно... Можно даже просто халтить допустим процессор внешней схемой, фигачить какое то убердействие типа активации DMA и потом возобновлять обычный ход работы. для PUSH const16 по моему это оверкилл, но вот в целом - идея мне очень нравится.

#42
14:27, 7 мар. 2019

=A=L=X=
> Имхо гораздо продуктивнее обратить внимание, что приличное число однобайтовых
> инструкций передачи данных между регистрами содержат совершенно ненужные в коде
> ld b, b; ld c, c и т.п.
Этo шутка?
Давно про это говорю
Но отвечают:

это у вас всё просто инструкции с кодами «40»/«49»/«52»/«5B»/«64»/«6D»/«7F», так как они «холостые» я перехватил префиксами. в кремнии этот "перехват" совсем не так прост и дёшев, как кажется. отсюда и нет желания делать красивые опкоды.
Хотя, есть одна мысль…
Выделить отдельное ПЗУ/ОЗУ ровно 64Кб под виртуальные инструкции (подинструкции). То есть, 256 подинструкций по 256 байт каждая.
Как я и писал выше, в момент «M1+MREQ+RD» считываемый (ещё не считанный процессором) байт инструкции адресует то ПЗУ подинструкций.
Если схема обнаружила «00/nop», то даёт процессору проглотить инструкцию как есть.
А если там код, отличный от «00», то процессору выдаёт «CF» и подключает ПЗУ подинструкций его шине.
В итоге, мы можем перехватывать аппаратно абсолютно любые опкоды. Например:
     .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .A .B .C .D .E .F
0000 00 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Код 00 не перехватывать
0010 xx xx xx xx xx xx xx xx xx xx xx xx xx xx .. ..
0020 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
0100 00 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Код 01 не перехватывать
0110 xx xx xx xx xx xx xx xx xx xx xx xx .. .. .. ..
0120 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
0200 00 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Код 02 не перехватывать
0300 00 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Код 03 не перехватывать
0xxx 00 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ; Коды 04…2F не перехватывать
3000 00 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx ; Код 30 не перехватывать
3010 xx xx xx xx xx xx xx xx xx xx xx xx xx xx .. ..
3020 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
3100 E3 E5 D5 5E 23 56 23 33 33 E3 33 33 E1 D5 3B 3B ; Код 31 перехватить: Это PUSH A16
3110 3B 3B D1 00 .. .. .. .. .. .. .. .. .. .. .. .. ; Здесь 00 сообщит схеме о переходе в нормальный режим,
3120 .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ; а процессору подставит код C9
4000 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ; Код 40 здесь перехватим
4900 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ; Код 49 здесь перехватим
5200 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ; Код 52 здесь перехватим
5B00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ; Код 5B здесь перехватим
6400 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ; Код 64 здесь перехватим
6C00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ; Код 6C здесь перехватим
D300 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ; Код D3 здесь перехватим
DB00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ; Код DB здесь перехватим
F300 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ; Код F3 здесь перехватим
FB00 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ; Код FB здесь перехватим
Инструкции DI/EI/IN/OUT предлагаю так же сделать привилегированными также.
То есть, в режиме пользователя они перехватываются ПЗУ подинструкций, а в режиме OS наличие подинструкций игрорируется.

Думаю, по 256 для каждой подинструкции хватит с головой, где можно и активировать аппаратный DMA или блиттинг - копировать данные всеми четырьмя каналами, но коротко, достигая отрисовку спрайтов по 4 строки аппаратно.

#43
14:41, 7 мар. 2019

Ааа, ~M1 оказывается вырабатывается только когда читается опкод, но если опкод предполагает immediate данное, то к нему он уже не вырабатывается.
Т.е. затея с разделение кода/данных не взлетит без сложного декодера работающего параллельно процессору. А вот декодер ld b, b, напротив, с помощью этого довольно просто должен реализовываться.

#44
(Правка: 16:38) 14:55, 7 мар. 2019

=A=L=X=
> Т.е. затея с разделение кода/данных не взлетит без сложного декодера
> работающего параллельно процессору. А вот декодер ld b, b, напротив, с помощью
> этого довольно просто должен реализовываться.
O чём я говорю.
Выделить теневое ОЗУ под виртуальные инструкции, защищённое как ПЗУ, куда можно заливать любую прошивку расширений/перехвата любых инструкций…

Во время выборки кода инструкции читать соответствующий код из нашего ПЗУ - легче лёгкого. Не нужно городить кучу логики…

Можно схематически упростить, конечно.
Так, адрес A0…A7 пропустить через И-НЕ элементы к ПЗУ. А D0…D7 через регистр-защёлку, стробируемую от M1, к A8…A15 ПЗУ. Тем самым, при чтении оп-кода «31» будет к ПЗУ формироваться адрес «31FF», где будет либо «C7», либо «00»… То есть, достаточно проверить один старший бит для переключения режима.

Например: Потребуется К531АП4 для A0…A7 от CPU к ПЗУ, выводы 1 и 19 которого подключаются к выходу К155ТМ2, тактируемого от M1. И К555ИР22 от D0…D7 процессора к A8…A15 ПЗУ…
На момент проверки, линии A0…A7 через АП4 могут оказаться подтянутыми резисторами к лог. «1» и по оп-коду «31» будет формироваться адрес «31FF»…
Итого, уже 4 микросхемы.
Я бы мог набросать эскиз схемы в рассыпухе. Но смысла же нет, если в эмуляторе будете реализовывать или в FPGA.

Страницы: 1 2 3 4 521 Следующая »
ФлеймФорумЖелезо