Обо мне
Привет! Меня зовут Лис и это мой блог. Здесь я могу ныть и страдать, писать про код и обо всем.
Декабрь 2024
ПнВтСрЧтПтСбВс
1
2345678
9101112131415
16171819202122
23242526272829
3031
Теги
Блог страдающего Лиса
Lorem ipsum hello dolor sit world amet

23 дек 2024 Пн Как бы хотелось сделать FPGA BASIC

Никто не знает, но я начинал свою жизнь программиста именно с Бейсика. Сначала это был GW-BASIC, потом QBasic 4.5. Всего диалектов бейсика было лишь два в моей жизни, но этот период оставил неизгладимый след, ведь на Бейсике я писал до 19 лет, исключая ассемблер, конечно. На нем я научился писать тоже не так уж поздно, а достаточно рано.
Сейчас мне интересно заниматься разработкой различных процессоров на плисе, но Бейсик так и не уходит из моих мыслей. Часто думаю над темой, вот бы сделать бейсик, который бы выполнялся на ПЛИС, пусть даже с помощью компиляции. В своей жизни я еще ни разу не делал интерпретатор "Бейсик" и это довольно большое упущение, особенно с тем, что мне этот язык программирования нравится, как ностальгическая память и не очень. На нем удобно иногда подсчитать несложные формулы.
На самом деле, даже сейчас я иногда пишу на бейсике.
Теги: Бейсик

20 дек 2024 Пт Три кота на мясо, да еще под корень

Суть в чем. Есть уравнение Гуkа: Fs = -kx, которое гласит, что чем сильнее ты натягиваешь сову на глоб... то есть, чем дальше оттягиваешь резину (хватит тянуть резину, давай уже!), тем больше сила, с которой пытается эта сила оттянуться по полной. Ну, до разумного предела, конечно же.
Итак, вот у нас есть некая сила, которая оттягивает. По уравнению Ньютона, F=ma, как известно, так что уравнение можно переписать так: ma = -kx. Это значит, что a = -kx/m. То есть, мы знаем, с каким ускорением пытается оттянуть обратно пружина.
Что такое ускорение? Это a = \frac{v' - v}{t} , и если взять за отсчет t=1, то в таком случае будет a = v' - v , то есть, v' = v + a .
Находясь на позиции x, и имея уже определенную скорость V, к этой скорости добавляется еще V + a, или V - kx/m, если так. То есть, по этому уравнению, происходит замедление скорости в обратную сторону. Чтобы рассчитать, где в следующую секунду будет маятник, надо лишь добавить x' = x + V. Вот и всё!
x' = x + v
v' = v - \frac{kx}{m}
И получается гармоническое колебание, причем здесь не учтено еще трение воздуха, например, и трение самой пружины, так что колебание получится просто в виде не затухающей синусоиды.

20 дек 2024 Пт Технологии графики 3D: Отбрасывание теней

Вчера я задумался насчет 3Д графики и понял, что если не сделать тени, то в таком случае графика будет слишком неинтересной и пресной. Но как сделать тени? Этот вопрос мучает меня до сих пор в очень огромных масштабах.
В графических программах основным строительным блоком является треугольник, и он должен отбрасывать тень на другие треугольники, если они там есть. Есть множество различных способов высчитывать тень, но я хочу рассмотреть пока что одну из самых для меня доступных для понимания.
Допустим, что есть только 3 объекта на сцене: источник света L, треугольник A (который отбрасывает тень) и второй треугольник B (на который отбрасывается тень). Сама по себе тень образует некий треугольный конус, в который может полностью, частично или вообще не попасть треугольник, на который эта тень отбрасывается.
27wshf-trg.gif
Задача в том, чтобы проверить, попадает ли тень на второй треугольник. Для этого надо провести из точки L через каждую точку треугольника A прямую и проверить, где именно на плоскости треугольника B попадет эта прямая. Если треугольник лежит параллельно этой прямой, то это значит что эта прямая, собственно, нигде треугольник не пересечет.
По итогу получится что-то вроде проекции на плоскость, где лежит треугольник B. Это значит, что от трехмерных координат мы переходим к двухмерным, что дает возможность определить область попадания тени на треугольник B.
u4cu06-shadow1.gif
Вот тут конечно, начинается самое интересное. Как видно, проекция тени A1'A2'A3' пересекла треугольник B в двух местах, раздробив изначально простые треугольнки на большое количество составляющих.
  • Раздробилась сама проекция тени, образовав дочерние теневые треугольники 1,2 и 3
  • А также раздробился исходный треугольник, разделившись на две группы — 4 и 5 (там где легла тень) и 6,7,8 там где тени нет
Как видно, этот способ, который я рассказываю, дробит треугольники на огромное количество других треугольников, что дает огромную нагрузку на вычислительные мощности процессора, который эту вакханалию будет обрабатывать.
Так что я думаю, что этот подход удобен только в качестве учебного пособия, не более того. С другой стороны, этот метод является "запеканием" теней и в каком-то смысле, удобен для того чтобы сгенерировать геометрию изначально до того, как ее отрисовывать, и во время рисования очередного кадра больше не придется обсчитывать тени заново.
Единственное что может обсчитываться, так это интенсивности света, но это уже сделать гораздо проще.
Проблема может возникнуть именно с динамическими тенями, поскольку в этом случае придется считать все заново каждый раз для сцены.
Теги: Графика, 3D

17 дек 2024 Вт Игра ELITE на Бейсике в детстве

В 2000-м году я впервые увидел Спектрум, и не простой, а то ли Пентагон-128 с музыкальным чипом, то ли еще какая его модификация. Спектрум выглядел как обычный компьютер, с дисководом, настольный, прямо почти что копия 386, но только спектрум. У него были колонки, которые проигрывали шикарную музыку, и конечно же, на нем была запущена та самая, Elite.
Увидев эту игру, я конечно же, был удивлен. Для меня это можно сказать, это было еще одно прикосновение к 3D-графике в том пространстве и времени. Естественно я постарался ее повторить, и даже кое-что смог сделать на компьютере, который был там рядом, то был 386 комп, и я напрограммировал там некое подобие разлетающихся звезд так, как я думал, что это работает, то есть они летели с разной скоростью просто из центра экрана. Да, в 12 лет мало чего получилось бы у меня напрограммировать толкового, не имея особенного доступа к компьютеру.
Чуть позже, на другом компьютере и тоже 386, я постарался повторить эту игру как сумел. Получилось что-то очень глючное, но в то же время, я даже смог немного поиграть и полетать в космосе, на графике, основанной даже не на 3Д, потому что в тот момент я не знал о трехмерной проекции. Да, конечно на Бейсике, да еще и на тормозном компе, было убого, но всё же, оно было.
А сейчас я даже не могу сделать того же самого. Ну и дела, я скажу.
Теги: Детство

16 дек 2024 Пн Рисование кубов

Мне кажется, что нарисовать трехмерный куб, это просто классическая задача, которая точно так же как и Hello World, начинается и заканчивается на этом. То есть, это задача-максимум, нарисовать трехмерный куб и на этом завершить программу. Больше от трехмерных программ ничего не надо. Только куб.
Я не умею больше ничего делать, только рисовать кубы, иногда без текстур, иногда с текстурами. Больше чем куб, мне не нарисовать никогда. Да даже его нарисовать сложно. А почему кстати, я не могу нарисовать что-то посложнее куда? Потому что у меня нет инструментов и трехмерного редактора, чтобы можно было какую-то геометрию посложнее куба сделать. А почему у меня нет такого редактора? Вопрос простой — мне лень делать.
Куб — это всё, на что я способен вообще в принципе. Кажется, я совершенно разучился что-либо делать, разленился, и у меня нет абсолютно никаких идей. Всё так надоело, вообще.
Поэтому надо нарисовать куб прямо срочно. Прямо вот сейчас взять и нарисовать какой-нибудь куб. Того требует время.
SCREEN 13

LINE (50, 75)-(150, 175), , B
LINE (50, 75)-(75, 50)
LINE (75, 50)-(175, 50)
LINE (175, 50)-(150, 75)
LINE (175, 50)-(175, 150)
LINE (175, 150)-(150, 175)

LOCATE 4, 8: PRINT "Cube of Your Dream"
Этот куб был начертан за непродолжительное время в 5 минут.
15r9gt3-cube2.gif
Теги: Куб

25 ноя 2024 Пн Невероятный 2000-й год

REM Сначала написать программочку
OPEN "DOS" FOR OUTPUT
PRINT# "1999 г.              NORTON COMMANDER"
PRINT# 0
CLOSE
RUN
NEW
Так заканчивался мой год, 1999 и начинался новый год, новое десятилетие, новое столетие и новое тысячелетие. Это был самый огромный юбилей тех, кто родился однажды ровно 2000 лет назад, 1 января. Для меня этот год стал одним из переломных, когда в моей жизни наступили новые времена, когда я смог написать свою первую, и самую любимую программу. dance3
Это было потрясающее время новых перемен, когда мне исполнилось 12 лет. В возрасте двенадцати лет я переступил в новое тысячелетие, имея на столе из еды ровно ничего, но держа в руках старую карту МТС и рисуя буквы программы, которую я запомнил на всю свою жизнь и которую я обожаю.
Первое, что я стал искать в этом замшелом городке, так это место, где можно было бы посидеть на компе. Оттуда же, откуда я приехал в 1999-м году, примерно к началу лета, я ходил и в небольшой кружок, где колпачил на БК-0010, на УКНЦ иногда, а также посещал компьютерный класс в местном ГПТУ, чем был несказанно рад, потому что я мог реализовывать свои программы и на Корвете, в том числе, на том Бейсике, что поставлялся с ним, и даже иногда прикоснуться к сверхкомпам вроде Pentium I, состоящему в одном экземпляре, и даже — это было пределом мечтании — выйти в интернет с модема!
Так что относительно скоро, а именно на следующий день, одним погожим утром я шел по мосту через реку и смотрел на мир с радостью, несмотря на то, что радоваться было нечему, прямо за рекой зашел в компьютерный клуб, где стояли компы Pentium II и где люди играли в SimCity и Quake 2 с графическим ускорителем...
aldjuz-Sc2000_screen01.png

Изголодавшийся по компам, я испытал откровенный шок, смотря на невероятно плавную, трехмерную графику, с непостижимым образом размытую с помощью неведомых методов. Я привык к тому времени видеть максимум что пикселизированную псевдотрехмерную графику, а тут... а тут на моих глазах творилось волшебство и настоящая магия. Я никогда в жизни не забуду, как меня чуть ли не трясло от восторга, как я мог часами смотреть на то, как играют люди в эти игры. Я с восхищением смотрел на Сим Сити, и думал о том, что это наверное, сон.
Я только абсолютно не помню, что я видел, какую из версии — 2000 или 3000. Одна из них вышла в 1993 году, вторая в 1999. Но это уже неизвестно мне, память стерла точные воспоминания об этом событии. Лишь только помню как стоял и глазел с широко распахнутыми глазами и открытым сердцем, на игру. С тех пор меня неотступно преследует желание создать собственную трехмерную графику. В целом я принципы формирования графики понял, но это все не то...
Но, смотреть на компы, не имея ни гроша денег в кармане... конечно, интересно, но не то что я бы хотел, и потому стал искать место, где я мог бы сидеть за компами, программировать. И такое место было найдено, я пришел очень вовремя, потому что в городе открывал один хороший человек собственный компьютерный клуб, именно в 1999-м году.
Занятия проводились раза 2 в неделю, но для меня эти занятия стали настоящей отдушиной в моей тяжелой жизни на тот момент. Количество и разнообразие компов было велико, там был и мой любимый УКНЦ, и БК0010, и даже заветные 286. Но моя страсть был именно УКНЦ. Он был не просто компом, у него был диск, а это то, чего я так долго ждал в своей жизни! Теперь у меня был, наконец-то, диск! Это конечно, был диск 5-дюймовый, но ведь это был именно диск, а не то, как я раньше делал, вводил программы снова и снова, снова и снова.
Поднатаскавшись программировать на этом компе, одним холодным вечером с воющим ветром из окна и сквозняком, с ледяными полами, я приступил к разработке моей самой крупной программы на тот момент, а именно - Нортону Коммандеру, который я так любил в детстве, который я запомнил с того момента, когда мне исполнилось 5 лет. Я откуда-то чудом раздобыл карту МТС покрытия Москвы и писал программу на задней его стороне. Карта была огромной, и места хватало. У меня был невероятный дефицит бумаги в тот период жизни. Теперь же я коллекционирую тетради.
Программу я писал очень долго, примерно неделю. Я не знаю то, получилась ли она, потому что ни разу в жизни ее не смог ввести в УКНЦ, чтобы проверить это. Однако, у меня получилось ввести первую часть программы... и она не работала. Да, я смог на УКНЦ ввести примерно страницу, но программа содержала ошибки. Вот так вот. Я скажу так, что программировать на бумаге не самая лучшая затея, но у меня не было тогда никакой возможности ввести такой огромный текст программы на учебном компе за приемлемое время.
Теги: Детство

17 ноя 2024 Вс Нарисовать Night City

Мне помню, очень нравилось кодом рисовать ночные города под светом фонарей в дождливую ночь. Надо продолжить эту традицию и нарисовать Night City более цветасто и более детализированно, чем я делал до этого. Все это надо нарисовать в разрешении 320 на 200, 256 цветов. Это важно. Без этого никуда.
Впрочем, мне все равно уже.
Теги: Дневник

16 ноя 2024 Сб Новое веяние графического построения

Наконец-то у меня появилась возможность просто взять и сделать программу, которая бы рисовала кодом, а не это вот все. Теперь я могу просто брать и в своей админке проверять то, что не мог проверять раньше, а именно нарисовать например, вот таким кодом:
cls(); let cat = "CAT on THE KittyCat";
for (let i = 1; i < 100; i++) circle(160,100,i,clr(i));
print(cat,86,11,clr(15));
print(cat,85,10,clr(0));
И при этом получиться такая вот картинка.
mg8ga2-noname.png
Причем совершенно невозбранно. Это классно, ведь теперь есть возможность быстро рисовать и проверять кодом и загружать картинки вот сюда в блог и не только. Раньше мне приходилось очень сложно и много рисовать в Quick Basic, но эти времена ушли и стали наступать новые, более интересные времена.
Еще у меня есть микросхема EPM240 и я отчаянно пытаюсь придумать ей применение. Один из вариантов, сделать для нее подключение к микросхеме памяти и юзать на полную катушку. С другой стороны, надо бы придумать что-то поинтереснее, чем просто создавать одно и то же постоянно. Самым удобным методом было бы конечно, загрузить программу в SRAM и там исполнять ее, но проблема в том, что эта SRAM работает срамно медленно. Ну вот если посудить, то чтобы запросить один байт памяти, требуется отослать 8 бит команду, 16 бит адреса и 8 бит данных (чтение или запись). Медленно, крайне медленно, даже если запускать на 12.5 мгц, то это скорость 390625 байт в секунду. Для сравнения, спектрум читал 875000 байт в секунду, что быстрее в 2.24 раза.
С другой стороны, если отбросить все умозаключения и страдания из-за скорости, то что меня парит? 381кб в секунду это не прямо настолько мало, чтобы совсем ничего не делать. Но проблема еще в том, что графику надо бы где-то отображать... То есть, если еще и читать из этой памяти графику, то скорость работы процессора вообще будет невероятно медленной.
Итак, представим что надо отобразить экран 256 на 192, это значит что придется запрашивать на скорости 12.5 мгц, а значит что эффективных тактов будет 256/400, так как строк по ширине у VGA для разрешение 640 на 400 будет равно 800. Итак, это дает 64% загрузки, остается лишь 4.5 чтения из памяти на один сканлайн.
Хорошо, это слишком медленно и представим что мы следуюший сканлайн вообще выводить не будем. Это дает 400 тактов / 32 = 12.5 чтений или записей на 1 линию. Итого, на две линии будет суммарно около 17 чтений или записи. Всего строк 192, а значит, 3264 байт на кадр. Помимо 192 строк, остаются свободными 65 строк на гашение кадра и прочей лабуды. Это дает 65*12.5 = 812 байт на кадр.
Итого 4076 байт на кадр или 4076x60 = 244560 байт в секунду, 238Кб в секунду. На самом деле, это не так плохо! 40% падения производительности с пропуском сканлайнов.
И получится то, что можно с последовательной SRAM выводить как графическое изображение, так и выполнять код одновременно с выводом, что очень неплохо. Надо теперь подумать, как бы реализовать такую минималистичную систему и процессор для этого дела. Ведь количество LE крайне ограничено. Смогу ли я вообще сделать в таком небольшом объеме хоть что либо? Кто знает.
Теги: Сайт

31 окт 2024 Чт Фрактал Мандельброта для AVR

И вот опять я создаю этот фрактал. На этот раз я снова создал его на AVR процессоре, чтобы проверить качество и правильность работы эмулятора. Все получилось как надо, но скорость рисования фрактала, я бы не сказал, что суперская. Появилась одна идея, создать фрактал с помощью верилога.
Один цикл обработки достаточно небольшой:
x = x*x - y*y + cx
y = 2*x*y + cy
if x*x + y*y >= 4 then break
Как видно, необходимо всего 3 умножения за раз: xx, yy и xy, одно вычитание и три сложения. Это выполняется за 1 такт все. Для того чтобы выполнить умножение, необходимо сначала привести значение к абсолютному значению, а это делается через простую проверку дополненного кода, например a = b[31] ? -b : b. После умножения обязательно надо будет обратно привести в дополненный код из прямого, если результат получился отрицательным. Он получится отрицательным если знаки множителей a[31] ^ b[31] будут разными.
Сложение и вычитание уже можно делать без оглядки на знак, потому что все значения эти работают уже в дополненном коде. Также интересное замечание, что x^2 - y^2 не сможет превысить диапазон допустимых значений -3.999 ... 3.999, так как оба числа получатся положительными. Минимальное число xx=0, максимальное yy=3.999, что дает -3.999. И наоборот. Аналогично с xy. Единственное что только надо учесть так это +cx, +cy, значения которых не должны тоже превысить максимум, так что закладывать надо диапазон от -7.999 до 7.999, с 3 битами на целое число.
Максимальное количество итерации будет равно 320 x 200 x 256, что дает 16'384'000 тактов. Это значит, что в худшем случае будет рисоваться за 16.3/25 ~ 0,6 секунд. Это довольно быстро, кстати говоря.
Скорость рендеринга можно увеличить в разы, если использовать рисование блоков по 1кб например, в 64 потока. Конечно, столько не нужно, можно просто в 4 потока сделать, что даст максимальную скорость 1/0.15=6 fps на самом сложном случае.
Будет интересно.
1x54vqk-clipx.png

30 окт 2024 Ср Навертывание AVR

Вчера я взял свой проект на AVR эмуляторе и оттуда перетащил в новый код, и получилось уже весьма успешно, поскольку с утра у меня получилось нарисовать и в текстовом режиме "Привет мир" и в графическом тоже что-то сделать, причем работает весьма прилично, выдает даже 60 кадров в секунду, и при этом не отстает графика от той, которая будет в реальной ПЛИС. Это радует, потому что в прошлый раз у меня хост-процессор еле справлялся с нагрузкой. Думаю, это из-за того что он уже был довольно старый, 3.2 Ггц по сравнению с 5 Ггц сейчас, да и с опцией оптимизации ускорилось в 2 раза, так что ускорение получилось минимум раза в 3, что по сути дает 30% загрузки ядра, а это хорошо.
Теперь моя задача сначала сделать всю мне необходимую периферию вроде клавиатуры, прерываний, таймера, SD карточки, эмулятора видеоускорителя и так далее. Потом второй задачей будет создать сам видеоускоритель, контроллер SD, и так далее, и внедрить это все в ПЛИС.
Как я и говорил, основная моя задача в том, чтобы сделать процессор, который бы позволял быстро тестировать какие-то определенные модули на верилоге, да и просто рисовать различные демы, конечно же. Также я попробую создать что-то вроде операционной системы, которая будет исполнять байт-код.
Но вообще будущее этой системы пока что неопределенное, на самом деле. Я не знаю что буду делать для нее.
Теги: AVR
<< Ранние записи | Поздние записи >>