Блог страдающего Лиса
Lorem ipsum hello dolor sit world amet
10 окт 2024 Чт
Оптимизация? Не... не слышал
Есть у меня один проект одного ядра 8088, который я решил просто доделать, чтобы было. Суть такова. Существует такая инструкция как
Пришла пора значит, переделывать. Сегодня сел с утра и переделал так, что теперь вся эта инструкция выполняется за 4*CX + 3 тактов! Да, это вот такое ускорение аж в 3 раза! Один байт, получается, перекидывает за 2Т.
Если пересчитать количество тактов, то можно понять, что для того, чтобы сдвинуть экран 320 на 200, потребуется (160 x 4 + 3)*200 тактов, что равно 128600, и это в пересчете 25 000 000 / 128600 дает 194 кадров в секунду! Просто поразительное ускорение фактически на 300% только за счет того что я сделал оптимизацию.
Единственный минус в том, что если посередине исполнения этой инструкции возникнет сигнал INTR, то ему придется подождать, пока инструкция закончит работу. Учитывая, что там может быть 65535 итерации, то ждать придется 262140 тактов. Это надо учитывать при разработке программ, которые юзают INTR. Но и еще мне тоже надо доработать контроллер прерываний, чтобы не было такой ситуации, чтобы они были упущены, а то это нехорошо. Контроллер прерываний надо сделать внешний для этого.
А еще сделал чтобы STOSx выполнялся 1Т = 1 байт, с такой скоростью теперь пишется. Для LODSx вообще будет выполняться за 4-5Т всегда, вне зависимости от REP, поскольку имеет смысл читать только последние 1-2 байта из общей выборки.
Таким образом, я переделаю все строковые инструкции.
REP MOVSW
, например. Когда я делал это ядро раньше, то сделал ее такой, чтобы каждый раз она исполнялась за 12Т, и это очень, очень много! Несмотря на то что она исполнялась так медленно, даже этой скорости хватало, чтобы сделать скроллинг экрана со скоростью 65 кадров в секунду. Но разве это дело? Это медленно, и мне этой скорости не хватило.move: xor di, di mov si, 2 mov dx, 200 @@: mov cx, (318/2) rep movsw add di, 2 add si, 2 dec dx jne @b retВыше я привел сакральные коды скроллера, который выполняет перенос всего экрана. Итак, как мы видим, краеугольный камень проблемы в том, что rep movsw выполнялась за 12Т на каждое пройденное машинное слово (2 байта). Я посмотрел в код и удивился, до чего я его не оптимально сделал.
Пришла пора значит, переделывать. Сегодня сел с утра и переделал так, что теперь вся эта инструкция выполняется за 4*CX + 3 тактов! Да, это вот такое ускорение аж в 3 раза! Один байт, получается, перекидывает за 2Т.
Если пересчитать количество тактов, то можно понять, что для того, чтобы сдвинуть экран 320 на 200, потребуется (160 x 4 + 3)*200 тактов, что равно 128600, и это в пересчете 25 000 000 / 128600 дает 194 кадров в секунду! Просто поразительное ускорение фактически на 300% только за счет того что я сделал оптимизацию.
Единственный минус в том, что если посередине исполнения этой инструкции возникнет сигнал INTR, то ему придется подождать, пока инструкция закончит работу. Учитывая, что там может быть 65535 итерации, то ждать придется 262140 тактов. Это надо учитывать при разработке программ, которые юзают INTR. Но и еще мне тоже надо доработать контроллер прерываний, чтобы не было такой ситуации, чтобы они были упущены, а то это нехорошо. Контроллер прерываний надо сделать внешний для этого.
А еще сделал чтобы STOSx выполнялся 1Т = 1 байт, с такой скоростью теперь пишется. Для LODSx вообще будет выполняться за 4-5Т всегда, вне зависимости от REP, поскольку имеет смысл читать только последние 1-2 байта из общей выборки.
Таким образом, я переделаю все строковые инструкции.
08 окт 2024 Вт
Мне надоело переписывать с нуля
§ Предпринимаемость
У меня есть код, который называется процессор 8088, и я его уже миллион раз сделал, так что у меня есть одна простая идея, которая заключается в том, чтобы взять свой код и просто сделать его на Марсоходе-2, и всё. Надо будет доработать код, а не переделать.
Тогда вот что я предприму. Я просто обновлю код 16-битного процессора и сделаю для него простую демосценку, чтобы было. Пока что так. А какую демосценку я сделаю? Конечно же, вращение кубов, куда без них. Я сделаю запись трехмерного куда так, чтобы его мне хватило надолго.
Итак, можно проработать несколько вариантов. Известно что на Марсоходе-2 всего 46 Кб памяти. Если сделать 320 на 200, то можно будет располагать 32КБ памяти для 16 цветов или 16Кб для 4х цветов. Так как я хочу сделать цветное изображение, то 4 цвета тоже сойдет для двойной буферизации. Так что, останется 14 Кб для программной памяти. Интересно. Надо делать.
§ Куб: гиперпуп
Буду делать вращение куба на своем процессоре. Итак, у меня есть 16x2=32K памяти для хранения 4 цветов. Куб будет вращаться вокруг по 3м осям, как это делал старый добрый DirectX куб и рендерится с помощью обычных треугольников без использования буфера глубины. Это хочу сделать для демонстрации возможности ассемблерной программы, конечно же.
Видео область та же, A0000h-AFFFFh, то есть, писаться будет как обычно для видеоразрешения 320 на 200, но количество цветов не 256, а всего лишь 4. Мне просто хочется сделать 3Д хотя бы раз нормально.
У меня есть код, который называется процессор 8088, и я его уже миллион раз сделал, так что у меня есть одна простая идея, которая заключается в том, чтобы взять свой код и просто сделать его на Марсоходе-2, и всё. Надо будет доработать код, а не переделать.
Тогда вот что я предприму. Я просто обновлю код 16-битного процессора и сделаю для него простую демосценку, чтобы было. Пока что так. А какую демосценку я сделаю? Конечно же, вращение кубов, куда без них. Я сделаю запись трехмерного куда так, чтобы его мне хватило надолго.
Итак, можно проработать несколько вариантов. Известно что на Марсоходе-2 всего 46 Кб памяти. Если сделать 320 на 200, то можно будет располагать 32КБ памяти для 16 цветов или 16Кб для 4х цветов. Так как я хочу сделать цветное изображение, то 4 цвета тоже сойдет для двойной буферизации. Так что, останется 14 Кб для программной памяти. Интересно. Надо делать.
§ Куб: гиперпуп
Буду делать вращение куба на своем процессоре. Итак, у меня есть 16x2=32K памяти для хранения 4 цветов. Куб будет вращаться вокруг по 3м осям, как это делал старый добрый DirectX куб и рендерится с помощью обычных треугольников без использования буфера глубины. Это хочу сделать для демонстрации возможности ассемблерной программы, конечно же.
Видео область та же, A0000h-AFFFFh, то есть, писаться будет как обычно для видеоразрешения 320 на 200, но количество цветов не 256, а всего лишь 4. Мне просто хочется сделать 3Д хотя бы раз нормально.
28 июн 2024 Пт
Новый проект
Свой проект я буду делать постепенно и не спеша. Еще мне хочется много чего сделать, например, у меня есть новая ПЛИС, CE4 на 10К элементов, которую я так полностью еще не проверил до конца. Сегодня мне бы хотелось проверить ее работу, запустить VGA поначалу, попробовать подключить PLL, создать простой стартовый шаблон для начала работы.
Еще хочу сделать вывод экрана тоже, в 128 на 128 точек, из памяти. Могу сказать, что буферизация тут будет именно двойная, не иначе. Количество памяти, которое требуется на такое разрешение равно 128 x 128 (16384 пикселей), но так как в 1 байте 2 пикселя, из-за 16-ти цветов, то для одного видеобуфера необходимо всего лишь 8К. Однако, учитывая двухбуферную память, мне все равно потребуется 16К.
Всего в чипе CE4 встроенной памяти на 46К. Вычитая оттуда видеопамять, получаем свободное место 30Кб всего лишь. В этой памяти дополнительно будет храниться область спрайтов, на 256 знаков. Это займет 8x8x256 пикселей, что равно 16К пикселей. И да, 16 цветов, значит будет 8К.
Остается всего лишь 22К памяти для программ и данных. Это мало, на самом деле. Несмотря на это, все равно достаточно для написания простых игр.
Еще хочу сделать вывод экрана тоже, в 128 на 128 точек, из памяти. Могу сказать, что буферизация тут будет именно двойная, не иначе. Количество памяти, которое требуется на такое разрешение равно 128 x 128 (16384 пикселей), но так как в 1 байте 2 пикселя, из-за 16-ти цветов, то для одного видеобуфера необходимо всего лишь 8К. Однако, учитывая двухбуферную память, мне все равно потребуется 16К.
Всего в чипе CE4 встроенной памяти на 46К. Вычитая оттуда видеопамять, получаем свободное место 30Кб всего лишь. В этой памяти дополнительно будет храниться область спрайтов, на 256 знаков. Это займет 8x8x256 пикселей, что равно 16К пикселей. И да, 16 цветов, значит будет 8К.
Остается всего лишь 22К памяти для программ и данных. Это мало, на самом деле. Несмотря на это, все равно достаточно для написания простых игр.
27 июн 2024 Чт
Впечатление от PICO8
Признаться, меня крайне впечатлил проект PICO8, о котором я узнал совсем недавно и сильно заинтересовался им. Мне захотелось создать аналог такого проекта, но с использованием Верилога и ПЛИС. У меня нет задачи полностью повторить проект или сделать его абсолютно совместимым, я хочу сделать именно аналог. Для этой цели потребуется много чего.
Еще одна интересная деталь. Я хотел бы попробовать использовать SDRAM для того, чтобы запускать программы там, поскольку в первую очередь, байткод VFM8 (Virtual Fox Machine 8) будет исполняться непосредственно там.
Теперь остается вопрос, как я буду писать код? Скорее всего, я буду просто записывать его под видео, накладывать нейромузыку Яндекса и просто выкладывать в виде блога разработчика.
- Сначала, необходимо создать среду разработки, SDK
- Для этого мне необходимо реализовать какой-нибудь процессор, чтобы эта среда могла запускаться
- Поэтому я создам вначале процессор LIS собственной разработки
- Параллельно созданию SDK, мне также потребуется VM (виртуальная машина), которая будет исполнять скомпилированный из LUA код. То есть, создам еще один процессор, но выполняющий более высокоуровневые операции.
- Написать программное обеспечение
Еще одна интересная деталь. Я хотел бы попробовать использовать SDRAM для того, чтобы запускать программы там, поскольку в первую очередь, байткод VFM8 (Virtual Fox Machine 8) будет исполняться непосредственно там.
Теперь остается вопрос, как я буду писать код? Скорее всего, я буду просто записывать его под видео, накладывать нейромузыку Яндекса и просто выкладывать в виде блога разработчика.
27 апр 2024 Сб
Снова процессор 8088
Я тут кое-что понял, и понял следующее. Хочу начать разработку снова процессора 8088, слегка усовершенствованного, на верилоге, для того, чтобы поставить его на плис CYCLONE, и запустить на нем программное обеспечение, которое напишу я сам.
- БИОС
- Операционная система, минимальная
- Простые игры
- Демонстрации
- ПЛИС CYCLONE с 25 Мгц генератором
- Клавиатура PS/2 (может быть и мышь)
- Карта SD
- SDRAM
- VGA на 640 x 400
- Аудиовыход
- Джойстик для SEGA
- Поддержка картриджей расширения в качестве шины ISA
28 фев 2023 Вт
Дорабатываю модуль KR580
Модуль этот я начал делать много лет назад и как обычно, тысячу раз делал и делал, и кое-как доделал. В чем замес модуля процессора? Он должен быть довольно простой и не содержать большого количества ненужных инструкции. Нет префиксированных команд. Сегодня я оптимизировал исполнение некоторых инструкции, например
Также пишу код для создания "муляжа" биоса, это для того, чтобы установить эту программу и наслаждаться чистым биосом. Что-то можно делать в нем, настраивать, даже инициализировать диски, которых нет, но самое интересное в том, что ничего этого сохраняться не будет. Просто биос, который ничего не значит. Это сложный код, несмотря ни на что.
Такой вот экран мне пока что удалось нарисовать. Этого немного. Тут надо еще подцепить клавиатуру, пробросить порты, целая масса дел, а мне лень. И ради только того, чтобы этот экран появлялся.
Допустим, если я смогу сделать биос, стану ли я после этого делать какую-нибудь, пусть даже очень простую, операционную систему? Большой вопрос, и пока я не сделаю экран биоса, ни о какой ОС и думать даже не буду.
LD r,r
сделал за 1 такт и также ADD HL,Reg16
тоже за 1 такт. Переработал обработчик прерываний. Там еще есть что оптимизировать и я этим буду постепенно заниматься.Также пишу код для создания "муляжа" биоса, это для того, чтобы установить эту программу и наслаждаться чистым биосом. Что-то можно делать в нем, настраивать, даже инициализировать диски, которых нет, но самое интересное в том, что ничего этого сохраняться не будет. Просто биос, который ничего не значит. Это сложный код, несмотря ни на что.
Такой вот экран мне пока что удалось нарисовать. Этого немного. Тут надо еще подцепить клавиатуру, пробросить порты, целая масса дел, а мне лень. И ради только того, чтобы этот экран появлялся.
Допустим, если я смогу сделать биос, стану ли я после этого делать какую-нибудь, пусть даже очень простую, операционную систему? Большой вопрос, и пока я не сделаю экран биоса, ни о какой ОС и думать даже не буду.
25 фев 2023 Сб
Делал упрощенный z80
Я как-то откопал один свой недоделанный проект по упрощенному z80 и стал его доделывать сегодня с утра, добавил верилятор, поправил код, передал довольно много вообще в самом ядре, чтобы все работало без
Если обратить внимание, то размер экрана будет 640 на 350 точек! Да, именно так, самое низкое разрешение VGA из возможных. Меня это немного не устраивает, ведь тогда шрифты тоже будут размером 8x14 точек, чтобы вместить 25 строк. Обычно я рассчитываю размер экрана на 640 x 400 точек, а тут высота 350. При переходе в настройки BIOS, правда, высота меняется на обычную, 16 точек на символ.
Интересная деталь в том, что якобы графика, где написано Epa Pollution Preventer и сверху Energy Star, все это нарисовано через знакоместа и в текстовом режиме, просто здесь изменен знакогенератор, чтобы рисовались символы из дополнительного набора (128-255), не ASCII. Раньше я голову ломал, как же так, вроде текстовый режим, а наложили графику. Оказывается, никогда из текстового режима эта графика и не уходила. Просто текстовые символы имеют такое начертание.
always @*
, потому что верилятор как-то плоховато понимает это дело. У меня вообще есть идея сделать загрузочный экран (симулятор экрана), для биоса. Сегодня решил посмотреть, какой там экран загружается и оказалось, что не все так как я думал раньше.Если обратить внимание, то размер экрана будет 640 на 350 точек! Да, именно так, самое низкое разрешение VGA из возможных. Меня это немного не устраивает, ведь тогда шрифты тоже будут размером 8x14 точек, чтобы вместить 25 строк. Обычно я рассчитываю размер экрана на 640 x 400 точек, а тут высота 350. При переходе в настройки BIOS, правда, высота меняется на обычную, 16 точек на символ.
Интересная деталь в том, что якобы графика, где написано Epa Pollution Preventer и сверху Energy Star, все это нарисовано через знакоместа и в текстовом режиме, просто здесь изменен знакогенератор, чтобы рисовались символы из дополнительного набора (128-255), не ASCII. Раньше я голову ломал, как же так, вроде текстовый режим, а наложили графику. Оказывается, никогда из текстового режима эта графика и не уходила. Просто текстовые символы имеют такое начертание.
13 фев 2023 Пн
Упорно думаю что можно сделать на Max10
Уже который день меня не отпускает мысль, что же можно сделать для этого чипа, Max10, ну решительно ничего в голову не лезет! Может думаю, процессор мелкий впихать туда, типа 6502 или z80, но вот тоже, даже если его и запихну, что это даст, неясно вообще. Максимум, на что способен этот чип, так это лишь на то, чтобы сделать из него некий калькулятор небольшой, и только. Больше не знаю что можно сделать.
Мне правда, хочется его приспособить. Можно отсылать ему команды, он будет принимать, обрабатывать и выводить обратно. Может, сделать мини-игру? Не трехмерную, конечно, а типа текстового квеста. Такой, мирок небольшой, который рандомно развивается, типа небольшого фентезийного мира.
К примеру, там будет несколько локаций, которые можно исследовать, или они будут генерироваться случайным образом с помощью псевдорандома. И опять, ну не хватит же памяти для этого! 12 Кб лишь на чипе, не хватит памяти для генератора, даже у Элиты на спектруме было 48 килобайт и то еле-еле туда вместилось.
С другой стороны, почему бы не попробовать, даже с ограниченным количеством локации. Что от таких игр нужно? Особо ничего, фармить только со временем, собирать различные грядки, как в майнкрафте, только в текстовом виде. И все это делать с помощью консоли, то есть, открывать консоль через любой терминал, например через Arduino IDE или screen в линуксе, и посылать команды, такие как WALK, VIEW, HOME и так далее, которые будут передаваться по UART, приниматься через прерывание, обрабатываться и выдавать результат назад.
Можно будет записать и прочитать образ памяти 12Кб (это будет 15Кб base64), или использовать UFM, только для этого надо научиться ей пользоваться.
Мне правда, хочется его приспособить. Можно отсылать ему команды, он будет принимать, обрабатывать и выводить обратно. Может, сделать мини-игру? Не трехмерную, конечно, а типа текстового квеста. Такой, мирок небольшой, который рандомно развивается, типа небольшого фентезийного мира.
К примеру, там будет несколько локаций, которые можно исследовать, или они будут генерироваться случайным образом с помощью псевдорандома. И опять, ну не хватит же памяти для этого! 12 Кб лишь на чипе, не хватит памяти для генератора, даже у Элиты на спектруме было 48 килобайт и то еле-еле туда вместилось.
С другой стороны, почему бы не попробовать, даже с ограниченным количеством локации. Что от таких игр нужно? Особо ничего, фармить только со временем, собирать различные грядки, как в майнкрафте, только в текстовом виде. И все это делать с помощью консоли, то есть, открывать консоль через любой терминал, например через Arduino IDE или screen в линуксе, и посылать команды, такие как WALK, VIEW, HOME и так далее, которые будут передаваться по UART, приниматься через прерывание, обрабатываться и выдавать результат назад.
Можно будет записать и прочитать образ памяти 12Кб (это будет 15Кб base64), или использовать UFM, только для этого надо научиться ей пользоваться.
06 фев 2023 Пн
Пишу небольшой биос
Как и обычно, в течении некоторого времени я пишу программы, потом закрываю эти проекты, потом снова открываю и так далее. Сегодня сделал и проверил, чтобы в вериляторе работал мой проект с 86-м процессором (16 битным), и еще чтобы запускался на DE0. Как ни удивительно, но места занимает этот процессор не так много, около 3700 ALM из 18к всего доступных, что лишь только приблизительно 21% от кристалла. Это вообще-то, хорошо.
Контроллер прерываний работает вроде неплохо, я решил, что сделаю по-хорошему клавиатуру, через IRQ#1, с записью принятых данных в кольцевой буфер в оперативной памяти, кстати, которой довольно немало, 288 Кб, это только про кеш, а я потом обязательно сделаю DRAM, чтобы можно было адресовать до 1Мб и даже выводить видео 320x200. Единственное что могу сказать, это мне пока что вряд ли нужно в данный момент.
Этот биос не должен быть очень большим, уметь разбирать данные с клавиатуры, выводить на экран и работать с SD-картой, как минимум. Прямо минимальная функциональность должна быть какая-то, чтобы начать более-менее писать небольшие программы. Как-то еще думал, сделать ли игру на ASCII, но чего-то, мне кажется, плоховато получится, наверняка, так что это вряд ли в данный момент.
Код у меня так разбросан по всем углам, не могу никак один проект в одном месте держать и вообще, создать один проект и чтобы он работал нормально, обязательно по разным проектам одно и тоже понаписано, прямо не знаю, такое у меня дурацкое свойство есть, так делать.
Контроллер прерываний работает вроде неплохо, я решил, что сделаю по-хорошему клавиатуру, через IRQ#1, с записью принятых данных в кольцевой буфер в оперативной памяти, кстати, которой довольно немало, 288 Кб, это только про кеш, а я потом обязательно сделаю DRAM, чтобы можно было адресовать до 1Мб и даже выводить видео 320x200. Единственное что могу сказать, это мне пока что вряд ли нужно в данный момент.
Этот биос не должен быть очень большим, уметь разбирать данные с клавиатуры, выводить на экран и работать с SD-картой, как минимум. Прямо минимальная функциональность должна быть какая-то, чтобы начать более-менее писать небольшие программы. Как-то еще думал, сделать ли игру на ASCII, но чего-то, мне кажется, плоховато получится, наверняка, так что это вряд ли в данный момент.
Код у меня так разбросан по всем углам, не могу никак один проект в одном месте держать и вообще, создать один проект и чтобы он работал нормально, обязательно по разным проектам одно и тоже понаписано, прямо не знаю, такое у меня дурацкое свойство есть, так делать.
05 фев 2023 Вс
Просто переделал свой процессор
Не смог я выдержать и все же, переделал код процессора с утра с 32-х битного в 16-битный, для того, чтобы он влез в Марсоход2. Синтезировал процессор этот на циклоне и вышло около 6.8 тыс элементов. Ниже привел отчет по завершении компиляции. И это лишь только процессор. Пока что вмещается.
Помимо самого процессора, на кристалле должна быть также и вся остальная периферия, это например, контроллер прерываний, клавиатура, как минимум и еще бы хорошо туда поместить карточку SD, без нее сложно будет. Хотя, как я ранее и говорил, я не собирался делать программы большими (если я вообще их буду делать, вот в чем вопрос).
Вот так выглядит запущенная простая программочка:
Помимо самого процессора, на кристалле должна быть также и вся остальная периферия, это например, контроллер прерываний, клавиатура, как минимум и еще бы хорошо туда поместить карточку SD, без нее сложно будет. Хотя, как я ранее и говорил, я не собирался делать программы большими (если я вообще их буду делать, вот в чем вопрос).
Вот так выглядит запущенная простая программочка:
org 0 mov ax, $b800 mov es, ax mov ax, cs mov ds, ax mov si, hello mov di, 0 mov ah, $30 @@: lodsb and al, al je $ stosw jmp @b hello: db "Operational sistemcher. Award Modularo. Contest mecha!",0Эта программа сделана только для теста, она пока что отображается лишь в вериляторе.
<< Ранние записи |
Поздние записи >>