Блог страдающего Лиса
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 байта из общей выборки.
Таким образом, я переделаю все строковые инструкции.
09 окт 2024 Ср
Программирование на 86-м для Марсохода2
У меня, как я и говорил ранее, есть большая мечта, это создать программы-демки для собственного 8086 для Марсохода2, который обладает небольшим количеством памяти, а именно всего лишь 46Кб. Для этого я придумал следующую идею. Сделать двойную буферизацию (две экранные страницы) в областях памяти #A0000-#BFFFF. При записи в адрес на самом деле будет писаться 2 младших бита, что дает 4 цвета - черный, синий, зеленый или красный. Цвета можно менять через перепрограммирование DAC через порты 968 и 969.
Итого, для программ и данных остается 14Кб памяти. Первые 256 байт — они зарезервированы под некоторое подобие биоса, то есть там реализованы таймер, клава, сервисные прерывания для видео и клавы, и так далее. Всего лишь 256 байт! Вывод шрифта будет программный, можно использовать как 512 байт для этого, так и 1024 байт, в зависимости от того какая будет задача, имеется только графический режим.
Памяти на чипе мало, так что придется делать очень небольшие программки, но это не страшно. Я не собираюсь делать что-то крутое, мне достаточно будет просто вращать трехмерный куб и на этом успокоить свою душу. Особо целей больше нет никаких...
А может и не надо мне двойной буферизации. И так места в памяти нет, лучше использовать 16 цветов вместо 4. Маловато цветов как-то, маловато. Если юзать 16, то будет 32К тоже, но зато 16 цветов! Может, эмулятор винды получится сделать. А может, и не получится. Кто его знает.
Еще есть одна интересная мысль по поводу игры. Можно сделать небольшую игру про Лиса, который просто бегает по платформам и собирает фрукты, овощи, и ему за это дают монетки в качестве награды. Сюжета делать не буду.
Итого, для программ и данных остается 14Кб памяти. Первые 256 байт — они зарезервированы под некоторое подобие биоса, то есть там реализованы таймер, клава, сервисные прерывания для видео и клавы, и так далее. Всего лишь 256 байт! Вывод шрифта будет программный, можно использовать как 512 байт для этого, так и 1024 байт, в зависимости от того какая будет задача, имеется только графический режим.
Памяти на чипе мало, так что придется делать очень небольшие программки, но это не страшно. Я не собираюсь делать что-то крутое, мне достаточно будет просто вращать трехмерный куб и на этом успокоить свою душу. Особо целей больше нет никаких...
А может и не надо мне двойной буферизации. И так места в памяти нет, лучше использовать 16 цветов вместо 4. Маловато цветов как-то, маловато. Если юзать 16, то будет 32К тоже, но зато 16 цветов! Может, эмулятор винды получится сделать. А может, и не получится. Кто его знает.
Еще есть одна интересная мысль по поводу игры. Можно сделать небольшую игру про Лиса, который просто бегает по платформам и собирает фрукты, овощи, и ему за это дают монетки в качестве награды. Сюжета делать не буду.
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Д хотя бы раз нормально.
07 окт 2024 Пн
Блог чёкнутого Лиса
Есть такая привычка у меня, писать программы снова и снова, снова и снова, снова и снова, и каждый раз они начинаются как обычно:
Хочу его сделать для OMDAZZ EPC4 на 10К элементов, чтобы было. А там как пойдет. В общем и целом, план такой. Есть система регистров [ax, bx, cx, dx, sp, bp, si, di] и этих регистров на самом деле, всего лишь 8. Есть и другие регистры, сегментные [es, cs, ds, ss] и специальные [flags, ip]. Они тоже являются регистрами, но доступ к ним другого характера.
Как и обычно, процессор мне надо сделать именно простой, напоминающий 8088, потому что он простой. На этот раз я хочу попробовать вариант сделать не как раньше делал, через сначала считывание опкода, префиксов, а вот попробовать сделать считывание опкода и выполнение его. Пока не придумал как это будет точно, но посмотрим по ходу дела, как говорится. Посмотрим... Например, можно сделать сохранение регистров на негативном CLK, почему бы и нет, спектрум так вот смог сделать.
110 PRINT "HELLO WORLD! "; 220 GOTO 10И это классно, потому что мне нравится не вылазить с песочницы и делать одно и тоже годами, такова моя судьба. Теперь вот моя идея заключается в том, чтобы писать в блог все что я могу придумать по поводу того, что такое 8088, который является моим любимым процессором и который делаю годами и никак сделать не могу, потому что лень заела. Не знаю как бы его сделать, но начну.
Хочу его сделать для OMDAZZ EPC4 на 10К элементов, чтобы было. А там как пойдет. В общем и целом, план такой. Есть система регистров [ax, bx, cx, dx, sp, bp, si, di] и этих регистров на самом деле, всего лишь 8. Есть и другие регистры, сегментные [es, cs, ds, ss] и специальные [flags, ip]. Они тоже являются регистрами, но доступ к ним другого характера.
Как и обычно, процессор мне надо сделать именно простой, напоминающий 8088, потому что он простой. На этот раз я хочу попробовать вариант сделать не как раньше делал, через сначала считывание опкода, префиксов, а вот попробовать сделать считывание опкода и выполнение его. Пока не придумал как это будет точно, но посмотрим по ходу дела, как говорится. Посмотрим... Например, можно сделать сохранение регистров на негативном CLK, почему бы и нет, спектрум так вот смог сделать.
1// ЛИСНЫЙ ПРОЦЕССОР 8088 2module fox86 3( 4 input clock, // Тактовая частота 25 5 input reset_n, // Сброс процессора 6 input ce, // Разрешение работы процессора 7 output [19:0] address, // Адрес 1Мб 8 input [ 7:0] in, // Входящие 9 output reg [ 7:0] out, // Исходящие 10 output reg we // Разрешение на запись 11); 12endmoduleТак выглядят процессоры, которые создаются лисами. Стандарт. Теперь переходим к разработке системы. Обычно я делаю сначала считывание префиксов, после идет разбор байта modrm, считываются данные операндов из регистров или памяти, потом выполняются и записываются обратно. Это тоже стандартная схема работы. Лучше я пока придумать не смог.
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
15 фев 2024 Чт
Новогодние игрушки, мишки и кормушки
Жизнь такова, что Новый Год наступает всегда внезапно и потому надо готовиться к нему с самых малых лет, пока железо еще горячо и не остыла лава (потому что пол — это лава). Зачем я пишу этот ненавистипсто? Просто потому что так положено, а если положено, то и брать нельзя, ибо положено не моё, а чужое что-то. Думаете, я с ума сошел? Вы совершенно верно думаете! Так и есть, я слетел с катушек и теперь я не тот Лис, а другой, обновленный, с совершенно новым чердаком. Теперь это мега- пупер- супер- Лиииис, безумный, веселый, беззаботный, игрииииивый!
Все что я написал выше, чушь собачья. Просто написал для того, чтобы поддержать образ якобы безумного ученого, у которого постоянно рвутся реактивы, все вспыхивает, горит, пламеника, и так далее. Детям такое нравится. Но я не умею ничего делать такого, чтобы кому-то что-то нравилось. Всё слишком плохо, для этого мира.
Из размышлений о том, что в общем-то, хотел бы сделать:
НЕТ
Все что я написал выше, чушь собачья. Просто написал для того, чтобы поддержать образ якобы безумного ученого, у которого постоянно рвутся реактивы, все вспыхивает, горит, пламеника, и так далее. Детям такое нравится. Но я не умею ничего делать такого, чтобы кому-то что-то нравилось. Всё слишком плохо, для этого мира.
Из размышлений о том, что в общем-то, хотел бы сделать:
- Контроллер SD-карты, написанный на VeriLOG;
- Нейронную сеть в ПЛИС без обучения, просто нейрораспространение информации;
- Тормозной рендеринг треугольников;
19 янв 2024 Пт
Наступающий Новый, 2025 год
Знаете, мне надоело думать о том, что как будто Новый Год 2024 наступил. Его нет, я уже хочу его свайпнуть влево. Вот в чем смысл всех этим приготовлений к Новому Году, если через год опять будет Новый Год? С серьезными щщами громогласно заявляю — сегодня, 19 января, я буду готовиться в Новому, 2025 году!
Время скоротечно, потому что через один год мой пост потеряет всю актуальность и я буду говорить, что 2025 года не существовало никогда, и что надо готовиться к новому, 2026 году и так далее. И так каждый божий год! Сколько можно? Как можно это терпеть?
Самое интересное вот в чем. Я же не успеваю подготовиться к Новому Году вообще никак, то есть, вот например, был новый год или не был? Не был. Я его не праздновал, потому что я не хочу праздновать Новый Год. Мне не нужен никакой год, где все равно будет ровно то же самое, что и было раньше. Не существует для меня этого праздника уже.
Время скоротечно, потому что через один год мой пост потеряет всю актуальность и я буду говорить, что 2025 года не существовало никогда, и что надо готовиться к новому, 2026 году и так далее. И так каждый божий год! Сколько можно? Как можно это терпеть?
Самое интересное вот в чем. Я же не успеваю подготовиться к Новому Году вообще никак, то есть, вот например, был новый год или не был? Не был. Я его не праздновал, потому что я не хочу праздновать Новый Год. Мне не нужен никакой год, где все равно будет ровно то же самое, что и было раньше. Не существует для меня этого праздника уже.
14 дек 2023 Чт
Удивительно, но скоро 2024
Но всего лишь 5000 лет назад никто и слыхом не слыхивал ни про какие новые годы и прочие праздники. Для планеты Земля совершенно неважно, какой год сейчас, с геологической точки зрения, не имеет значения номер года, причем этот номер отсчитывается от какого-то определенного события. Поэтому плевать на новый год, он потерял свою актуальность уже очень, очень давно. Что я сделал из того, что запланировал в прошлом году? Ничего.
<< Ранние записи |
Поздние записи >>