Лисья Нора
Обо мне
Привет! Это просто мой блог.
Итак, сегодня отличное событие.
Сегодня я во все поля доделал процессор RV32I с частичной реализацией умножения (без деления пока). Но не важно. Я запустил то о чем мечтал так долго – видеоразрешение 640 на 400, 16 цветов, 125К памяти, и 256К (пока что) памяти в целом (включая видеопамять). Это неважно. Другое важно: я подключил мышь и нарисовал кодом окошки в стиле Windows 98! Это то, чего я так долго ждал и так долго не мог сделать.
emt2.png
А вот экран отладчика:
emt.png
Накопление знаний происходило в множество этапов. Я изучал протокол PS/2, сделал мышь, подключил, а также наконец, смог просто добраться до самой возможности создать процессор RISCV. Это огромное достижение! Процессор, по правде, довольно простой, он в десяток раз проще в понимании процессора X86 и в то же время под него есть нормальный, между прочим, компилятор GCC.
Мне удалось пересилить себя и принудительно пересесть на 32х битную шину данных и адреса, поскольку в данном процессоре это происходит абсолютно нативным способом. Мне нравится минимализм данного процессора, и вообще, так говоря, я могу запускать его, если сделаю конвейер, и на 75 мгц запросто, и даже на 100 мгц, если сильно захотеть. Пока что максимальная частота и предел – 40 мгц.
Итак, и что мне осталось сделать еще? Да вообще-то, тут дел очень много. Это:
- Создание конвейера
- Защита памяти и MMU
- Подключение SDRAM и кеширование
- Добавление FPU-блока
Это колоссальная работа! Я слабо верю что мне даже близко удастся сделать это. Хотя, мне бы свои предыдущие проекты позакрывать, которые давным-давно еще хотел и не смог.
Сейчас я сосредоточусь на разработке интерфейса, подключении клавиатуры, контроллера SDCARD и возможности работать с FAT32.
Теги: riscv, достижение, процессор
22 мар, 15:04
Вот есть такое понятие – здравый смысл. Оно существует. Но ведь я его активно игнорирую, ибо захотел я снова создать процессор, который бы поддерживал 32-битный режим на уровне дефолтного сегмента, ну то есть, взять и создать так, как будто он сразу запущен как 32 бита.
Мне ужасно не хочется делать какой-то тяжелый конвейерный процессор, не хочется даже делать его шину 32х-битной. Мне просто хочется медленно перекладывать байты с места на место, получая 2-3 млн инструкции в секунду по итогу. Да куда торопиться? Коммерческий процессор что ли, делаю, который надо гнать до 300 мгц на ПЛИС? Нет! Какой конвейер, какие еще оптимизации, хочу просто делать нормально MOV EAX, EBX и наслаждаться результатом такого перекладывания из регистра в регистр.
А то: 32 бита на шину, конвейер, внеочередное исполнение, предсказание переходов, сложные многоуровневые кеши, spectre, meltdown! Это все практики, недоступные моему ограниченному разуму, и потому они будут сильно ограничены. Моя мечта не в том чтобы запустить процессор на скорости 8 Ггц, а в том чтобы просто запустить его вообще.
И что мне там запускать? Конечно же, Windows 98 интерфейс сразу надо сделать – все окошки красиво повторить, нарисовать, создать цифровой арт. Всё, что мне надо, это парочку простых программ вроде калькулятора и календаря, да красивый интерфейс с нескучными обоями, конечно же. Не такие уж и большие запросы, и вот уже делаю этот код с... 2004 года по 2026, такие вот дела, прошло 22 года, а воз и ныне там.
Теги: i386, безумие, процессор
14 мар, 07:36
Существует же NAOTO-64? Да. Надо сделать Slowpoke-64. Что он уметь будет? Всё. Ну, почти...
Мне от того что постоянно надоело изобретать 16-битный процессор, сразу захотелось создать 64-х битный x86, его небольшое подмножество для теста. Но с огромными приколами: регистры будут храниться не в регистрах LE, а в блоках памяти! И это будет жесть. И вообще, весь процессор будет задуман так, чтобы тормозить как можно более основательно, чтобы жизнь мёдом не казалась.
Да, именно 64 битная адресация и 64 битные регистры. Прямо вот сразу с 16 битного процессора на 64 битный переезд. Для чего? Да просто надоело уже колупаться в одной и той же проблеме. Выкину я этот 16-битный адрес вообще, оставлю только 32 или 64 бит. Ну и остальное, как и обычно, 8/16/32/64 регистры.
И еще там будет экран 32 на 30, как у Денди, для полного безумия, еще и черно-белый. Это надо же, да, сделать 64х битный процессор и выводить экран Денди, складывая 2+2 с Хелло Ворлдом.
Что необходимо реализовать из минимума, чтобы заработала простая выдача?
  • Конечно же все АЛУ базовые (ADD, SUB, ADC, SBC, AND, XOR, OR и CMP)
  • Инструкции сдвига на минимуме (но все 8)
  • Инструкции MOV
  • Переходы – условные или безусловные
  • Инкремент-декремент
  • Работа со стеком, вызов и возврат из процедур
Из того что хотел бы сказать: для 1024 битов регистров требуется 2500 LE (из 10240, например). На этом у меня точно всё.
Теги: безумие, процессор
20 фев, 12:01
Могу еще раз снова сказать: понравился мне этот процессор. Он оказался самым простым в изготовлении, по сравнению с теми, которые я рассматривал ранее. Даже 6502 не такой простой, несмотря на нереально ограниченный набор инструкции, у RISC-V их вообще всего лишь около 50. Да, вот столько мало, это факт, с которым трудно не согласиться.
Неспешными шагами и очень постепенно я создаю программную оболочку для собственного эмулятора, который уже написал, но не знаю, отладил ли, поскольку некоторые проблемы всё-таки наблюдаются с эмуляцией, особенно когда я запустил soft-float и там всё попадало, как карточный домик, построенный до небес, так что отладку придётся проводить. Несмотря даже на это, простые программы без особых страданий запускаются и вычисляются корректно: я уже добавил ввод ASCII кодов с клавиатуры, вывод на экран строк, печать в текстовом режиме и рисование в графических 320x200 и 640x400.
Это всё хорошо, но надо бы двигаться дальше и что-то не только выводить на экран монитора, а еще и начать перекладывать вычисления в верилог, делать программу для ПЛИС и я почему-то слегка побаиваюсь. Нет, я смогу сделать, это же не так и сложно. Меня как всегда пугают эти 32 бита, которые надо считывать одновременно из памяти. Однако, я придумал как сделать так чтобы быстро это всё дело работало. Так как в чипах ПЛИС есть блоки BRAM, и они равны в среднем по 1024 байт, а также они двухпортовые, то я просто могу создать "бутерброд" из этих блоков и обращаться к ним одновременно! Да, и тогда можно будет и читать и писать сразу же по 4 байта без задержек благодаря этому сэндвичу из микросхем памяти.
Раз с этим всё хорошо, то переходим к следующему. Да, конечно же, круто, что у меня 308К памяти – только вот, этого явно не хватит для запуска более сложных программ, с большим количеством данных, которые надо хранить в ОЗУ и мне придётся сделать контроллер SDRAM, и помимо него, еще и контроллер памяти для хранения кеша. Как я выяснил, кеш – ведь не настолько сложная, тут достаточно считывать кеш-линии по 64 байта из медленной памяти и туда-сюда эти данные гонять, проверяя Dirty-байты перед этим. Создание кеш-контроллера задача отдельная, как и создание контроллера памяти в целом. Мне бы хотелось однажды его сделать и может быть когда-то сделаю.
И третий вопрос, программное обеспечение. Один из самых насущных вопросом. Допустим еще что кеш и контроллер памяти можно не делать, ограничившись использованием 308К памяти BRAM на первое время, но вот какие-то программы сделать бы стоило, и я о чем подумал: может быть, сделать мини-игры. Да, простые игры, там сокобан, тетрис, змейка, понг, арканоид и так далее. И платформа начнет каким-то образом уже быть полезной и интересной.
Теги: riscv, процессор
13 фев, 07:49
Сегодня я выделил отдел "Тридэ" (Куб) из раздела Математики и остался доволен "просто-рисуемым-кубом-иконки", потому что красиво получилось и наглядно. Сразу видно, что тут рисуют только кубы и достигли в их рисовании абсолютного совершенства.
Одной поздней ночью, лежа, как обычно, без сна ни в одном глазу и просматривая всю свою никчемную жизнь, я наткнулся на странный и непонятный алгоритм. Для того чтобы рисовать трехмерную графику, совсем не нужно держать в "памяти" огромный буфер глубины, да и вообще можно даже без него обойтись. Достаточно строчку за строчкой, пиксель за пикселем вырисовывать треугольники. Без вычислений конечно, не обойтись, ясное дело – если надо нарисовать какую-то просто текстуру, то надо всё равно делить да умножать, тут не деться никуда. Но можно просто полностью обойтись без буфера глубины! Вообще.
Единственной и однозначной проблемой будет только то, что рисовать придётся ровно кадр. А что есть кадр? Это 320 на 200 точек, то есть 64К пикселей и при скорости 25 мгц можно нарисовать 390 таких кадров (25М / 64K ~ 390). Если, допустим, я рассчитываю на 60 FPS, то в самом наихудшем однопоточном режиме я нарисую 6 треугольников на линии по всей длине и будет даже 60 кадров в секунду. Но зачем мне однопоток? Я вполне могу сделать 8 или даже 16 потоков (хотя кто знает), и вот уже магические 48 треугольников на линии появляются почти что ниоткуда, вот в чём штука и соль! И еще даже можно распараллелить на другие части, например, рисовать по 4 за раз. Тоже вариант.
Итак, это перспективное направление, и стоит копать в эту сторону хотя бы для того чтобы убедиться, что всё прошло гладко. Меня ведь даже 30 кадров в секунду полностью устроит. А куб... там максимум 4 треугольника на линию. Нарисовать такой куб вообще никакого труда не составит и даже еще останется. И это только однопоток! Так что, знаете, я всё-таки постараюсь сделать эту штуку, ибо зачем не делать, когда можно попробовать, правильно?
Теги: графика, трехмерное
04 фев, 08:34
Что я могу сказать? Не так страшен был чёрт, с которым я боялся встретиться. Когда встретился, понял – у меня чересчур сильная прокрастинация, откладывал довольно простые вещи на очень дальний срок просто так.
Короче говоря, я просто заставил себя изучать архитектуру процессора, и это мне удалось. А иначе и не могло быть – она настолько простая, что там даже разбираться негде особо. Да, инструкции длинные, по 32 бита каждая, это даже не 16 бит как в AVR и тем более не 1 байт, как в x86. Но там вообще инструкции до невозможности громадные бывают, иногда и 16 байт могут достигать. А тут всего 4 байта в любой ситуации, даже в непонятной, даже если надо сделать просто NOP.
Не долго думая, сразу же создал одноименный раздел на сайте и туда начал записывать все свои наблюдения относительно процессорной архитектуры. Получилось неплохо, но дополнять есть чем ещё. Я лишь сосредоточился на базовой конфигурации RV32I, даже не используя -M расширение с делением и умножением, хотя там тоже пару пустяков. Сложнее будет сделать деление на верилоге, чем разобраться с новыми 8 инструкциями. Да что там... я даже уже разобрался с регистрами CSR по ходу дела.
Процессор весьма перспективный и я рад тому что начал его делать. Следующим моим шагом станет разработка его на Си, запуске программ, а потом портирование на JS, и далее на верилог. Так что делать придется много и долго. Но мне нравится, а это главное.
Теги: riscv, процессор
31 янв, 16:09
Недавно я сидел и думал: ну вот я сделал процессоры 8086, z80, 6502, avr и еще кучу своих – целая огромная гора процессоров, реализованная вдоль и поперёк. А что мне, на самом деле, мешает просто взять себя в руки и реализовать, наконец, процессор RISC-V? Ведь для него есть компилятор GCC! И он даже проще чем ARM.
Думаю, что ответ был простой. Всё дело в том, что у него 32 регистра по 32 бита каждый, а также 32х битные инструкции, работающие в одном адресном пространстве с данными, что тоже вызывало во мне какой-то иррациональный испуг. Да, 32 бита и 32 регистра – 1024 бита, столько логических единиц и нулей.
Вопрос: у меня что, ПЛИС маленькие что ли? Нет! Я не знаю куда девать логические элементы на своих ПЛИС-ах, о какой вообще экономии идет речь? Если о той, которая Марсоход-2, с 10к элементами, то может, их бы и не хватило. А может, и хватило бы даже. Я же даже не пробовал.
Так что всё, пора прокрастинировать уже, собрать свои лапы и начать кодить ими. Этот процессор далеко не такой сложный. Что я постоянно всего боюсь и экономлю каждый логический вентиль? Да это просто вздор! Никогда я не экономил вентили, да и не вижу в этом смысла вообще-то.
Теги: riscv, процессор
27 янв, 11:14
Заметил я одну интересную особенность всех моих постов. В каждом из них я пишу о завершении чего-то, словно готовлюсь к чему-то. Судя по характеру таких записей, мне важно закрыть свои собственные задачи, убрать свои длинные хвосты куда подальше и подготовиться к чему-то другому, возможно. А может и нет, откуда мне знать?
С большим удивлением могу отметить что прошло 19 дней, а это больше чем 2 недели, даже почти 3 недели, а я продолжаю заниматься сайтом почти непрерывно, создавая новые статьи о процессоре 8086, о его написании на верилоге, оформленные в виде глав достаточно сложной, но важной для меня книги.
Зачем я это делаю, мне совершенно ясно. Около 10 лет занимаюсь созданием эмулятора этого процессора и мне хочется закрыть его раз и навсегда, чтобы более не возвращаться и начать делать что-то новое. Для меня написание подробного руководства по созданию процессора 8086 с нуля – это и завершающая, и отправная точка для разработки собственного GPU и возможно, дальнейших, не менее интересных проектов.
В последнее время я очень много пишу, ищу свой творческий путь в том числе, пробую также написать и художественные вещи, но я их уже не показываю никому, потому что пишу и для себя, и на сайте мне нет нужды это показывать. Так что у меня, так сказать, достаточно насыщенная текстами, жизнь. Это любопытно, это что-то новое.
Теги: мысли, разработка, сайт
19 янв, 09:37
Вот и подходит импровизированный отпуск на 12 дней к концу, вот уже отгремели тик-таки на часах в 00:00 ночи 1 января, пробежало мимо Рождество с выпученными глазами, и медленно затухают бенгальские свечи к 11 января, оставляя след в сердцах, искры из глаз и особенное послевкусие салатов на языке.
Я всё это время активно работал над сайтом и новыми материалами. Кое-что переносил со старого сайта, что-то писал новое. Особенно я упёрся сейчас в написание руководства по самостоятельной сборке процессора x86-й архитектуры (или нет), на верилоге. Я всегда опасаюсь говорить о том что я делаю "8088" или какой-то либо из этих процессоров. Это совместимый процессор по ISA (Instruction Set Architechure), но вовсе не по внутреннему содержанию, потому что это чистого рода эмулятор.
Сайт полон всяческими материалами, но в нём нет жизни, поскольку я давно не пишу именно о себе и о своих мыслях. Частично всё так печально из-за новой черно-белой палитры. Это еще хорошо что я пока не придумал сделать вообще чисто 2х-цветный вариант (чистый черный и белый), а то я могу, знаете ли... Но ладно, это еще может будет, а может и не будет.
Что у меня было в жизни? Знаете, ничего особенного. Всё как всегда. За 12 дней я так и не смог сделать то что я хотел всегда – отдохнуть и хорошо расслабиться. Это всё инерция и постоянное желание что-то делать, не останавливаясь ни на одну секунду. Это и хорошо и плохо одновременно, смотря как посмотреть. Расслабиться не получается, но зато я не бездельничаю.
Как и всегда, мои мысли одолевают планы того что мне хочется сделать на сайте. А сделать я хочу вот что:
  • Сначала, завершить руководство по разработке 8088
  • Начать новый цикл рассказов о разработке графического 3D-видеопроцессора
  • Добавить новые разделы, такие как "Истории", где я бы делился своими воспоминаниями или рассказами, не касающимися каких-то технических вещей. Короче, художественная литература
  • Перенести оставшиеся данные из старого сайта
Планов столько, что на год хватит. Так что надо не останавливаться. Да, я конечно, полностью изолировал себя от внешнего мира, в том числе от любого общения с людьми, так что мои дороги начали расходиться с человечеством, но я пока все еще... Лис. Да, в своей лисьей норе. Я уже почти не человек. А может, никогда им и не был.
Теги: планы, процессор, сайт
11 янв, 10:29
§ Проблема
Есть одна тема, которая не дает покоя мне вот уже на протяжении примерно 10 лет: это эмулятор процессора 86-й архитектуры. Как только я его не делал, и на С++, и на JS, и на Verilog. Всё заканчивалось тем, что процессор бросался где-то посередине, никогда логически не заканчиваясь ни на одном варианте. Это не то чтобы неприятно, это очень плохо! Это хуже не бывает! Вопрос риторический: сколько можно уже парить себе мозг, ни разу не доделывая ничего до конца? Ответ, конечно, очевиден – пора уже с этим завязывать и сделать, наконец, этот злополучный процессор.
§ И как?
Для этого я завел специальный отдел на сайте, который назвал "Свой 386". Частично в нем уже есть материал из старых статей, но я переписываю все как всегда, с самого начала, чтобы всё было в одном отделе. Конечно, сразу же возникает резонный вопрос – а доделаю ли я в этот раз? В каком-то роде, я могу сказать что "да", поскольку у меня есть готовый как 8086-й, так даже и 32-битная его вариация без поддержки защищенного режима.
На деле, моя цель в том чтобы сначала рассказать о том, как по шагам разработать код для исполнения инструкции 8086-го процессора, а позже дополнить и перейти к 32-битному варианту, и далее, после этого, и к защищенному режиму процессора. Естественно, уровня ao486 мне достичь даже теоретически не удастся из-за того что там огромное количество рабочей периферии, но не в этом цель. Я хочу завершить процессор и рассказать об этом в своих статьях.
§ Сроки исполнения
Ничего не обещаю. Это может быть и месяц, это может быть и год, а может и вообще никогда. Я слишком хорошо знаю себя, чтобы давать какие-то обещания. Всё будет зависеть от того, какие у меня будут возможности, поскольку сейчас, когда идут новогодние праздники, у меня есть время на то чтобы писать текст, код, рисовать и разрабатывать что-либо. Что будет дальше, мне абсолютно неизвестно.
Надеюсь на лучшее.
Теги: 8086, плис, разработка
06 янв, 17:44