Pull to refresh

Comments 86

Круто, но почему всё игры да игры? Для ZX Spectrum и текстовые/графические редакторы, и электронные таблицы, и т.п. есть.


Потому что игры актуальны и сейчас, хотя бы из ностальгических чувств и для ознакомления.
А софт — устарел и никакой практической ценности не имеет.
В игры можно играть. С софтом нельзя делать ничего.

Формат plain text на всех платформах одинаков, кодировки легко преобразуются. Спектрумовская графика легко переводится в современные форматы, то же и с музыкой.

Так что мы закроем vscode/vim и будем печатать на душераздирающей клавиатуре спекки в редакторе, у которого даже replace — достижение, а слово 're' он может разве что напечатать.


(Фолдинг? Синтакисческая подсветка? ctags? линтеры?)

На 5 инч телевизоре, с текстом сложно работать. Это можно сделать и на PC, на прототипе того же эмулятора. Есть и вторая причина. Игры более капризны к точности эмуляции временных характеристик процессора и его окружения. Ещё более капризны демки, но у меня просто не было под рукой. Можете для себя собрать, паяльник не нужен, только платка из Китая на Али, телевизор и юсб клавиатура. Даже компилировать не нужно, на гихабе есть скомпилированный хекс. И есть версия на stm32f411 с CP/M и экраном на электронной бумаге. Но медленная. Зато работает от солнца.

На пятидюймовом смартфоне в горизонтальном режиме очень удобно с текстом работать, хотя половину экрана занимает клавиатура. На пятидюймовом телевизоре — то же самое, только под текст отведён весь экран.

На пятидюймовом экране смартфона разрешение от 1440х720, у телевизора 720х576, у Синклера 256х192 — работать с текстом конечно можно, но при очень большом желании.
на пятидюймовом смартфоне, вероятно, разрешение не менее 1920*1080,
поэтому там на экране можно разместить довольно много читабельного текста,
а на телевизоре, подключенном к спектруму (не помню — 40*25 у него, или сколько?) сильно много текста не поместится.
На 5-дюймовом смартфоне — не менее 840*480. Сейчас 1440*720 — это 5,5", по крайней мере, в самом частом современном варианте. А FullHD — это уже либо топовые модели, либо большие размеры экрана. Но 5" такое разрешение просто не имеет смысла, поэтому почти и не делают. Поэтому «на пятидюймовом» и «не менее» — это всё-таки от 840*480.

У ZX Spectrum разрешение было 32*24, что легко подсчитать, если вспомнить, что цвета задавались по знакоместам размером 8*8. Разного рода текстовые редакторы с собственными знакогенераторами и «ручным» выводом текста на экран, сокращая ширину символа до 6 точек, добивались 42 знакомест в строке. Кажется, попадались варианты с шириной знакоместа 5 точек, но это было уже что-то на грани читаемости текста, хотя и позволяло увеличить строку до 51 символа.
Помнится, у моего прошлого Nexus 5 разрешение 1920х1080 было на диагонали 4,96 дюйма. А вышел он в 2013 году.
Ну так Nexus же, а это как раз топовая железка, смысл которой именно в том, чтобы быть топовой, а значит, параметры часто задраны выше разумного. Так что это не может быть опровержением моего утверждения. Тем более, что речь шла о «не менее». Вот разрешение меньше, чем 480*840, ну или 480*800 — зависит от наличия аппаратных кнопок, на 5 дюймах не бывает. А больше можно ставить сколько технологии позволяют. Только вот есть ли смысл для обычного использования смартфона в качестве смартфона, а не в качестве ножа для приготовления сашими из понтов?
Лихие 90-е. Как не удивительно, но в осенью 1994 года я через ZX Spectrum 48 с дисководом (киевского производства, Электроника какая-то там) впервые в жизни вышел в telnet. Интернет только зарождался. Использовал программу TERM.T91. Можно было найти различные BBS по всему миру. Там были шлюзы на емаил и разный софт, книги, фоточки. Адресов BBS я не знал и поэтому наугад набирал разные ip адреса. Однажды попал на какой-то узел. Оказалось какое-то учреждение в Индии (Калькута). Я вызвал сисопа. Я с ним пообщался хорошо. Человек скучал на работе))
Нигде не было авторизации. Везде welcome>_
На этих BBS были книги в cp 866 кодировке кажется. Спектрум их не мог отображать. Пришлось на бейсике писать конвертор текста. Отображение экрана занимало секунд 10 при перелистовании страницы. В 1994 году это было круто, учитывая то что знакомые по 20 лет стояли в очереди на подключение стационарного телефона. А тут общайся со всем миром.

ZX Spectrum был первый мой компьютер в жизни. У меня их было много разных потом. Но ничего подобного я не испытывал к другим компам. Это было чудо, amazing! Иногда аж хочется купить Спектрум. Хотя прекрасно понимаю, что прошлого не вернешь. И такого кайфа не получу уже. Как говорят американцы, что лучше быть первым, чем лучшим.

Во как — даже не звонком прямо на модем BBS своего города, что тогда чаще делали, а звонком провайдеру, а оттуда на разные IP? А как PPP на спектруме был реализован?

Не было звонка провайдеру и не было PPP. И провайдеров еще не было тогда. Фидонет была помню и BBS у энтузиастов.
Соединение происходило по ax.25, скорость 1200 бод, контроллер пакетной связи TNC-2, который через RS-232 подключался к ZX Spectrum.

Но в вашем комментарии упомянуты IP-адреса, а не фидошные.

Ax.25 это протокол в беспроводной связи, к фидонету отношения не имеет. Я написал это в общем плане, что имелось из сервисов которые подключались по телефону. Про ррр тогда я даже и не знал. Подключение происходило через радиостанции.
Я заходил на узел. Писал telnet xx.xx.xx.xx и коннектился. На узле операцонка Unix была.

Это была та самая пакетная радиосвязь, о которой тогда так много писали? Та радиостанция, с которой вы связывались, была подключена к чему-то вроде сервера, и там вы получали shell-аккаунт, а сервер, в свою очередь, был соединён с интернетом? И в теории, вместо telnet можно было бы набрать lynx, если бы он на сервере был? А он там мог быть, ибо существует с 1992 года.

Вы правы. Это было Packet Radio.


P.s. у вас классные статьи на Хабре. Залип на них и подписался на вас

Одна проблема есть — где взять телевизор !?
На большом ЛСД / OlLED ТВ тоже работает. Но я бы добавил резисторный делитель ом на 200/100 и конденсатор на 1 нанофарад параллельно, чтобы не спалить вход и убрать часть шумов. Можно купить ЖК ТВ для машины, с аналоговым входом на 4-7 инчей тоже китайский долларов за 10-25.
И я ещё кассетный магнитофон заказал, внукам покажу загрузку компьютера с магнитофона
в тлевизоре на входе наверняка разделительный конденсатор стоит. А делитель да, не помешает
я про параллельный, как ФНЧ а не разделительный.
Неужели у вас кассеты с программами сохранились? Ностальгия — помню как загружал игры с кассет)
Нет конечно не сохранились.На я заказал пустые кассеты и магнитофон. Запишу с .TAP файлов на кассеты.
У эмулятора на STM есть преимущество перед например, расперри или пс, он имеет маленький лаг, не больше одного фрейма (при желании можно сделать еще меньше) и мгновенное включение(можно сделать меньше 200 мсек).
Чтение с реального мага еще не писал(только с tap файлов). Нужно добавить запись состояния какой либо свободной ножки на сигнал с магнитофона (с разделительным конденсатором даже не придется усиливать сигнал с одного до 3.3 вольта)или запустить встроенный ADC(не хотелось бы, он прожорливый)
Авито, например, или локальные барахолки VK.
с телевизором действительно проблема — как ни проходишь мимо помойки, его уже успели разбомбить. Притом бомбят тупо — отдирают отклоняющую систему, а трансформаторы иногда оставляют
Эпично. Ждём запуска Crysis на STM, конечно тоже в 50 Гц.
На видеовходе телевизора по идее согласующий резистор 75 Ом просаживает сигнал, иначе был бы белый экран.
Снимать можно было бы на плату видеозахвата, но не было бы той тёплой телевизионной ламповости.
Нет, телевизоры определяют уровень белого по максимуму сигнала сами, уже давно, а черного по ступеньке после синхроимпульсов. Да и не просадит STMку 40 миллиампер.
Ну китайский автомобильный ЖК телевизор, попавшийся под руку лет 15 назад этого не умел и вполне уходил в насышение. А Ваш телевизор смотрится вполне аутентично, с лёгкой аллюзией на КВН.
Можно, кстати, использовать кинескопный видеодомофон — эмулятор поместится в корпус, а клавиатуру телефона можно скоммутировать на i/o и управлять играми с её помощью.
Если не дать высокий приоритет генератору видео в стм -ке, то изображение будет ещё и подергиваться время от времени, по горизонтали. И можно снежку добавить
ZX Spectrum ЭМУЛЯТОР
за проделанную работу респект… но не греет (во всех смыслах) как спек на рассыпухе…
Да, греет слабенько миллиампер на 20. Зато теплый ламповый телевизор за всех греет. Не проблема сделать с настоящим Z80, но цель была другая, вписаться в минимальный бюджет, для тех кто захочет повторить. И именно по-этому оригинальный Спектрум и стал популярным. А так все равно нужен контроллер клавиатуры, диска и дисплея. А тут все в одном. И это хороший эмулятор. Он более совместим с оригинальным Спектрумом, чем некоторые клоны. А рассыпухой можно присыпать сверху, по вкусу

Что у этого хорошего эмулятора со звуком? На видео в первой же игре (Cauldron II) вместо музыки непонятный набор звуков напоминающий оригинал весьма отдаленно.

Я нашел проблему. У меня звук отложенный на 20 мсек. А на этом чипе очень мало памяти и не хватает места дла длинного буфера (FIFO ) эвентов звука. Cauldron II генерирует их нетипично много около 700 за 20 миллисекунд а буфер только на 128. И буфер затыкается. (Но не падает).
Я подумаю что нужно сделать.
Вот лог эвентов предполеднее число — кол-во изменений состояния спикера за 20 мсек.
t=25 36 90 0
tt=22 36 729 0
tt=20 36 766 0
tt=25 36 90 0
tt=22 36 729 0
tt=20 36 710 0
tt=24 36 90 0
это на секундочку 700*50 = 35 килогерц. Подумаю как приостанавливать испонение до конца интервала в 20 мсек, пока буфер звука не освободится
И да, спасибо, не обратил внимания.

Поправил сейчас закоммичу
		soundEvents(100);
		{
			//z80_interrupt();
			for(int tt = 0;tt<SINCLAIR_FLAGS.T69888;tt+=500)
			{
				z80_run(tt);
				procKeyb();
				 // new lines prevent sound buffer overflow
				if(aSOUND_EVENTS_size()>SOUND_EVENT_ARRAY_SIZE/2)
				{
					proccesSoundEvents_time();
					soundEvents(100);
				}
			}
			z80_run(SINCLAIR_FLAGS.T69888);
		}
		setTapeSpeedImp();
		uint32_t cputime = HAL_GetTick() - tickstart;
		uint32_t sound_events = aSOUND_EVENTS_size();
		proccesSoundEvents_time();
Тут самое забавное то, что все эти клоны на рассыпухе — по большому счёту тоже можно назвать эмуляторами, хотя бы по причине отсутствия ULA.
Это точно. Та практически все на FPGA. А Z80 уже довольно точно «эмулируется» на FPGA, его уже разобрали по гейтам. Не вижу проблем и с CPU эмуляцией. Она детальная по тактам.
1556ХЛ8 в атм — самая что ни на есть ULA
в пентагон, балтик и т.п. — прошитые определенным образом пзу РТ4/РЕ3
Да, но имеют ли они что-нибудь общее с оригинальным Ferranti и его «прошивкой»?
оригинал я ковырял — не могу сказать имеет что то общее или нет

у термина «эмулятор» есть четкое определение — компьютерная ПРОГРАММА, позволяющая эмулировать (имитировать) другую программу или устройство.
В тоже самое время «клон» (в отношении аппаратных средств) означает полную или почти полную идентичность и наличие СОВМЕСТИМОСТИ.
Да уж, советские клоны на рассыпухе — эталон и идентичности, и совместимости.
Тут важны медные соединительные провода, которые эмулятор не поддерживает в принципе.
Проект отличный! Но неплохо было бы код задокументировать, посмотрел исходники ни одного комментария.
Ну почему же ни одного, есть парочка комментариев от ST. Не хотел их мешать со своими… 80 процентов работы — именно документирование, а тут писался proof of concept, надерганный из моих и не моих программ.
Строчки немного плывут почему-то. Нет идей как добиться бОльшей устойчивости?
О Вы уже попробовали?
1.Добавить Low pass filter c с частотой среза в пару тройку мегагерц и делитель до одного вольта с трех вольт.Скорее всего поможет. Хотя бы просто резистор на 100 Ом последовательно и конденсатор 1 нано параллельно. Или катушечку небольшую последовательно.
2.Если ничего не помогает поиграть с уровнями в файле main.cpp
#define MAX_LEVEL 7
#define ZERO_LEVEL 0
#define BASE_LEVEL 3 < 2 до 4
#define SYNC_LEVEL 0 < 0 до 1

файл /BLta.c генерится с помощью rlib/makeTable.c (константы должны быть те же, не успел поправить)
cd rlib
gcc -c makeTable.c -o makeTable
./makeTable >../Src/BLta.c
Но проблема врядли с этим просто сигнал очень шумит на высоких частотах. Старым телевизорам это пофиг, а вот новым нет
Нет, не пробовал — сужу по вашему видео.

Столбцы плывут, если точнее. Это хорошо видно на экранах с вертикальными полосами.
Причин может быть несколько
1 сам телевизор немного плывет. Он и с расберри плывет чуток У меня нет принципиальной схемы да и день искать поплывший конденсатор.
2. Есть небольшое подёргивание тимингов начала строк. Это может быть наложение. DMA звука и видео. С этим особо нечего делать. Большой ЛСД Телевизор их игнорирует (у него нет инерции развертки ) и работает нормально.
3. Может где нибудь ошибся. Но мой скоп не злопамятный (маленький буфер истории ) и посмотреть детально не получается.
Большой ЛСД Телевизор… работает нормально.
Пробовали? Поздние кинескопные даже при ускоренном воспроизведении с видеомагнитофона уходят в синий экран (зараза!), что сильно мешает при работе с видеокассетами.
Пробовал. С делителем, а конденсатор уменьшает звон. Но тут все зависит от управлявшего развёрткой чипа, то есть очень индивидуально для разных фирм, и насколько они следуют стандартам.
На этом чипе без дополнительного железа — вряд-ли. Точнее можно, но на спектрум уже ресурсов точно не хватит. Или нужен очень сильный оверклок. Тут скорее stm32f407 нужен, там есть DAC и он быстрее вдвое (168MHz vs 84MHz). И то сомневаюсь. А вот VGA на 407 делают. STM32H7 точно справится с PAL, но это уже совсем странно будет. На нем скорее PC-AT симулировать можно будет. Ну или просто собрать на FPGA.
Это я про композитный сигнал. А для трех отдельных каналов, я подумаю. У меня на двух, при включении USB каналы разъезжались, даже на одном таймере. И все равно будут нужны дополнительные резисторы.
А композитный сигнал проще, чем к PAL-у подмешать цвет?
Проблема не в проще. Проблема в траффике памяти и частотах. Для клавиатуры USB нужно 48 MHz. PAL сигнал 4.4297125 MHz несущая цвета. А синклеру надо 256+16 пикселей по горизонтали. Все вместе — очень непросто согласовать без избытка скорости счета пикселей.
Нужно еще и соблюсти временные интервалы начала строк.
А на три отдельных канала проблема с их синхронизацией и свободными пинами. Посмотрите вот здесь (это не мое) github.com/abelykh0/stm32f407-z80emu
А если программно на PWM, через DMA ~2кБ видео памяти?
Я Вам ответил. И не надо присылать мне ссылку на тот же самый код, который я Вам послал. Я с ним знаком. Хотите — делайте. Я не знаю как это сделать на Э_Т_О_Й платформе.
А если всё же отказаться от usb, сделав клавиатуру на i/o или манипулятор, драгоценные ресурсы не будут отвлекаться на барский usb.
В большинстве игр для Sinclair поддерживалось управление, например с Kempston Joystick, достаточно всего несколько ног.
Проще отказаться от stm32f401 и взять stm32f407 или stm32h7.
А клавиатуру самому собирать, это другой вид извращений, который безусловно допустим, но не все же сразу. И цена совсем другая и аудитория тоже.
Очень интересно, жаль, что не получилось сделать 16 уровней яркости — без этого картинка не совсем та, что получалась при монохромном подключении ZX spectrum 48 — ведь там получалось до 16 градаций серого. Но если задаться целью сделать максимально дешевый эмулятор ZX spectrum — лучше делать его на базе Allwiner F1C100s — у него есть TV-выход, производительности и памяти достаточно и для эмуляции гораздо более мощных компьютеров, а стоит он от $1, поштучно можно купить от $1,4. Правда, он требует несколько напряжений питания, и готовые платы на его базе стоят дороже платы на stm32f401ccu6. Такой эмулятор может быть полезен для обучения детей из беднейших стран компьютерной грамотности и программированию.
Такой эмулятор может быть полезен для обучения детей из беднейших стран

Наверно. Если подарить им телевизор и USB клавиатуру.
Самый дешевый будет все таки в районе $10. Что то типа stm32f103 +2.8 inch ili9341 с тачем + механический или солнечный генератор + sd card. И тоже с эмуляцией спекки. Для него много программ и компиляторов. Типа этого habr.com/ru/post/412325
Мне нехороший китаец прислал экран без тача, и этот эмулятор у меня так и не завелся.
USB клавиатуру дарить не обязательно — можно подключить мембранную матрицу от клавиатуры, запаянную в пакет с напечатанными символами, непосредственно к F1C100s. USB-клавиатуры стоят от $2.3, подходящие мембранные матрицы производят для них серийно, и, думаю, их стоимость составляет малую долю стоимости клавиатуры, самое дорогое в которой — корпус и кнопки. А телевизор может быть общественным для семьи, так, чтобы дети могли учиться когда взрослые работают — как было у нас с ZX spectrum в 80-х-90-х. Питаться эмулятор может от зарядки мобильника, когда она не используется по прямому назначению. Солнечная панель с аккумулятором, и ЖК-экран, даже меньшего разрешения, чем 200х160 — полезные опции к такому эмулятору. За счёт того, что экран цветной, можно добиться читаемости даже с меньшим разрешением экрана, используя информацию о расположении субпикселей.
Порог входа в спектрум — ниже порога входа линуха. В частности ОС, в миниуме и не нужна.
F1C100s — это ARM9, Linux туда ставить необязательно. Но лучше всё же поставить, и сделать в нём стартовое меню с простым выбором эмулятора ZX spectrum, собственно голого Linux, и других эмуляторов — вплоть до PC-486DX, на котором можно и Windows 95 запустить.
ведь там получалось до 16 градаций

15 -два черных было.А пятнадцать получить можно, если поднять частоту до 96MHz.
На оригинальном спектруме градации чёрного не были видны
Ну так и я о том же. Из 16 цветов два одинаковых черных, все остальные разные — итого -15.
Хотя уровень серого при конверсии в YUV ещё двух оттенков был очень близок 76 и 77 в шкале из 256 градаций.
А можно ли отдельно вывести RGB и синхро, как в добром старом ZX-Specrtum (Брест)?
Можно, запросто. Но неравномерно. Процессор то один. То есть после него нужен буфер типа FIFO, из которого кто-то будет читать и выдавать равномерно на дисплей.
Неравномерно, потому что ядро блокирует доступ DMA к AHB на разное время?
Usb вредничает. Там свой буфер, в железе, а разбираться в деталях -лень. И так у таймера на видео самый высокий приоритет прерываний (0), у всех остальных -ниже и DMA high priority, а все равно немного дергается когда совпадает с пакетом с usb

Самый высокий приоритет не гарантирует равномерность. Допустим сработало прерывание, мк лезет в таблицу векторов, я так понимаю она во флеше, т.е. добавляются такты ожидания, затем то же самое происходит при переходе к самому обработчику, но у мк есть ART и он может все нужные данные закешировать, т.е. тайминги могут отличаться на весьма значительное количество тактов. Далее, если прерывание сработало сразу вслед за предыдущим, то может не потребоваться сохранять на стеке регистры, они там уже есть — это минус 6 тактов. Помимо этого есть атомарные операции, например, невыровненный доступ или bit banding, если DMA пытается читать из памяти, то проц может занять шину сразу на несколько тактов и тоже будет небольшая задержка. В идеале видеобуфер должен быть в другой SRAM к которой проц во время вывода не обращается, а у F401 она только одна. То же самое с портами, опрос единственной кнопки будет временами тормозить вывод данных в порт и т.д… Тут нужен или QSPI, или сразу брать мк с LTDC, типа относительно дешевого H750, на нем можно выделить буфер для 800x600 и еще на спектрум-512 RAM останется.

Да, я знаю. Это слабенький процессор. Но если например его разгрузить, то все становится довольно контролируемым. Проблема в основном в высокой нагрузке шины. Нужно в таймер выдавать новое число в каждые десяток клоков, а это сложно сделать равномерно, на системе с несколькими задачами и загрузкой процессор близкой к 100%
На смену платы STM32F401CCU6 (64/256) пришла обновленная версия за туже цену с чипом STM32F401CEU6 (96/512).
Да, я видел. TNKS. Я сейчас больше spectrum128 занимаюсь под stm32f407 с упскелом картинки в 1.5 раза — в 480х320 дисплей. Сложно.

Не будет оно нормально выглядеть, даже если на ПК делать...

Нормально, даже в движении. Не идеально, но вполне нормально. Если не знать на что смотреть, то незаметно. Скоро видео выложу. Там получается 3х3 пихеля из каждых 2х2. И дисплей дешёвый (3.5 Инч 8 бит интерфейс). По хорошему надо хотя бы 5 дюймов, но там или дорого, или интерфейс по stm32f407 не подходит.

Принцип какой? Если просто удваивать один из пикселей, то получается жуть, а что еще можно сделать при таком количестве цветов?

2х2 пихеля принадлежат одной знакопозиции 8х8 с двумя цветами — один форегроунд другой баскгроунд. Для них строится один дополнительный цвет как их интерполяция в RGB. То есть перед рендеренгом группы из 8х8 в 12х12 у нас есть три цвета. Дальше сами догадаетесь?
Ладно. Каждые 2х2 дают 16 комбинаций. Для каждой из них сделан предрасчет, какой из 3 цветов ( ф, б, или интерполированный) использовать, для каждой позиции в 3х3. И это будет практически корректная линейная интерполяция. И клешинг тут играет на руку

Ясно, если добавляются не спектрумовские цвета, то это нужно видеть, но если брать популярные алгоритмы типа hqx, то там даже при большем увеличении и большем количестве цветов все равно картинка получается мутноватая.

Для угловых точек 2х2 цвета исходные. Для остальных — один из трех (из них два исходных). И 3.5 дюйма достаточно маленький, чтобы изображение выглядело четким.
Если дисплей больше, например 800х480 4 дюйма, то там проще — просто каждый пихел 1х1 в 2х2 без интерполяции.
Sign up to leave a comment.

Articles