+536.57
Рейтинг
1489.62
Сила

Обзор архитектуры бортового компьютера КК Аполлон

Решил копнуть в историческую историю и рассмотреть архитектуру и систему команд бортового компьютера космического корабля Аполлон.
Последний пока компьютер который летал на Луну вместе с людьми. Сокращённо он называется AGC (Apollo Guidance Computer).
Было два поколения его — Block I и Block II. Второе было существенной доработкой первого и именно оно летало на Луну, поэтому рассматривать буду только его.

Читать дальше →

Famicom/NES/Денди: битва за Status Bar

На Famicom/NES/Денди было одно сильно аукнувшееся гейм–девелоперам упрощение/удешевление — вместо четырёх экранных областей объёмом 4Кб выстроенных квадратом между которыми был возможен бесшовный скроллинг (с прокруткой) в консоли оставили только 2Кб VRAM и, таким образом, было только две экранных области с бесшовным скроллингом.
Т.е. виртуальный задний фон мог бы иметь такую раскладку:

(глубже теорию вопроса можно изучить в статье про графическую архитектуру Famicom/NES)
Но в итоге оставались только две эффективных области из этих четырёх. Причём коммутацией линий картриджа их можно было выстроить как вертикально так и горизонтально (оставшиеся области «зеркалились»). Таким образом чисто вертикальные или чисто горизонтальные скроллеры реализовывались легко из коробки, но с произвольным скроллингом возникал целый ряд проблем которые решали кто как.

Читать дальше →

Принципы кодирования инструкций Intel x86(-64) или "ехал префикс через префикс"

Введение

С давних пор меня интересовало то как процессоры Intel x86 кодируют свои инструкции.
Будучи в детстве владельцем клона ZX Spectrum я уже тогда сталкивался с таблицами кодов инструкций его процессора Z80, как например тут: clrhome.org/table/
В таком виде очень хорошо просматривается принцип кодирования этих инструкций — наглядно видно как они упорядочены и по каким битам раскиданы.
Но вот для x86 таких таблиц как то не удавалось найти, а то как эти коды пояснялись в руководствах от самого Intel было несистематизировано и поэтому не воспринималось.
Однако пару месяцев назад я наконец то наткнулся на табличный вид однобайтовых инструкций от i8086 до i386, поразглядывал его и проникся тем что тут и как кодируется.
Более того — в процессе этого обзорного ознакомления я проникся еще тем как эволюционировала система команд x86 с поколениями процессоров и решил вкратце эти вехи законспектировать тут. Это ни в коем случае не полное справочное руководство, но скорее обзорное знакомство вместе с историческим экскурсом которое возможно поможет кому то быстро понять основные принципы кодирования инструкций x86 перед более углубленным изучением по таблицам.

Читать дальше →

Мой виртуальный 16-битный "компьютер мечты" - SimpX

Исходники: github.com/aa-dav/SimpX
Онлайн-версия: aa-dav.github.io/ (первая загрузка будет долгой, но потом закешируется)
В веб-версии рекомендую сразу нажать меню View->Set 400% чтобы выправить соотношение сторон.
Выбираем в левом списке редактора файлы test0x.asm и нажимаем меню Emulator->Compile and run чтобы увидеть результат.
Если активирована не английская раскладка клавиатуры — ввод с кнопок может не работать (это важно для последних тестов).
Так же еще замечу, что в веб-версии в коде могут некорректно отображаться табуляции — это некритично и вызвано разным отношениям к пикселям в среде Qt в stand-alone и wasm вариантах. В stand-alone всё визуально корректно.
Описание процессора — Simpleton (4) и его ассемблера уже было.

Читать дальше →

Виртуальный процессор Simpleton 4

В позапрошлом уже году я писал тут про выдуманную под впечатлением от Gigatron TTL архитектуру процессора Simpleton 3.
Однако в итоге я пришёл к выводу, что Simpleton 3 как архитектура сложнее того чем оно заслуживает быть.
В ходе обсуждения на другом ресурсе родилась архитектура Simpleton 4 которая, имхо, проще, ёмче и всячески приятственнее для программирования.
Исходники эмулятора и ассемблера можно посмотреть тут: github.com/aa-dav/SimpX (там же можно увидеть описание ISA на английском языке)

Прежде всего — эта ISA точно является субоптимальной по плотности команд.
Главная цель здесь — это сделать формат инструкций как можно более простым и ортогональным сохраняя программирование достаточно гибким и далёким от эзотеричности.
Плотность кода точно можно повысить получив в итоге что-то типа MSP-430, но это не цель и не вариант. :)
Как и в предыдущем поколении всё — и ячейки памяти и регистры 16-битные для простоты.
В отличие от Simpleton 3.x который каждую команду рассматривал как команду Си вида if (cond) Y ?= X, где? — это код операции Simpleton 4 смотрит на вещи еще более просто.
Он рассматривает все инструкции как одну и ту же операцию: R = Y * X, где опять таки * — это код операции. Т.е. безусловная трёхоперандная система.

Читать дальше →

LD/PUSH в стиле Apple IIgs

Совсем недавно на хабре появилась переводная статья про ускорение графики на машине с ЦП Motorola 6809 за счёт использования трюка с двумя стеками этого процессора.
Возможно это совпадение, но оригинальную статью совсем недавно упоминали на nesdev.com, но при этом рядом упоминалась другая статья (англ.) про на мой взгляд еще более изощрённое ускорение графики на машине Apple IIgs.
Перескажу её как можно более вкратце…

Читать дальше →

Микроконтроллер Nintendo "Game and Watch" или как ускорить инкремент

В первых наладонных электронных играх Nintendo — Game & Watch (которые в СССР клонировали в виде «Волк ловит яйца» и т.п.) в качестве процессора использовались 4–битные микроконтроллеры Sharp серии SM–5xx

Например в популярных версиях про Микки–Мауса, морячка Попайя или Donkey Kong–а трудился чип SM–510.
Счётчик команд в этом чипе был сегментированным и в пределах сегмента адрес команды был 6–битным (значения от 0 до 63).
Традиционно счётчик команд при переходе к следующей инкрементируется, т.е. увеличивается на единицу и многие сочли бы это одним из самых простых арифметических действий для такой задачи, однако создатели Sharp SM–510 посчитали инкремент 6–битного счётчика слишком долгой операцией и упростили её.

Читать дальше →

Виртуальная машина Koei

Недавно я обнаружил забавный фактик на форумах nesdev (англ.): forums.nesdev.com/viewtopic.php?f=2&t=15931
Есть такая японская игростроительная фирма — Koei.
Основана она была в 1978 году и разумеется в начале истории выпускала кучу игр для 8-биток.
И в этом смысле фирма была всеядной — одни и те же игры выпускала и на NES и на MSX и на Amiga и на DOS и PC-98 и каких то уже мало мне известных FM-7, Sharp X1, Sharp X68000 и WonderSwan.
В общем плодовитость и по числу игр и по платформам где они выходили даже в ранние 8/16-битные годы была существенной.

Так вот — некто AWJ с форумов nesdev обнаружил, что все игры этой компании на NES кроме Mahjong Taikai используют один и тот же байткод некой виртуальной машины которая по своему внутреннему устройству как будто бы создана для того чтобы интерпретировать код на Си.
Читать дальше →

Калькулятор ZX Spectrum

Наткнулся на описание того как работает библиотека калькулятора в ZX Spectrum (как и многие книжки той эпохи она просто кишит опечатками и ошибками). Текста там много, так что тут вкратце опишу как оно всё работало, ибо это действительно забавно.

Читать дальше →

Программирование для Famicom/NES/Денди в Nesicide+ca65: маппер MMC3 - HBlank+скроллинг (10) КОНЕЦ

Это будет последний урок в этой серии описывающий на практике последнюю технику которую нужно знать, чтобы написать крутую игру на Famicom/NES/Денди…
Ну хорошо, если призадуматься, то нюансов в программировании на денди есть еще порядком. Как организовать «бесконечный» скроллинг прокручивая две экранных области друг за другом и обновляя вновь появляющиеся с краёв тайлы в VRAM по ходу движения… Как организовать тайлы в метатайлы 2x2, а то и 4x4 для более краткого описания карт и удобного обновления видеопамяти (ведь атрибуты палитр назначаются сразу блоку тайлов 2x2 в экранной области, а один байт атрибутов покрывает 4x4 тайла)… Как воспроизводить оцифрованные DCPM звуки с помощью FamiTone2…
Впрочем, имхо, материалов и примеров изложенных в этих статьях хватит чтобы сообразить как это всё делается самостоятельно. Да и должно же быть какое то пространство и для собственного творчества. Здесь же я поставлю точку в этом цикле и, возможно, займусь какой-нибудь уже полноценной игрой исходники которой выложу, но это будет другая история.

Читать дальше →