Блог страдающего Лиса
Lorem ipsum hello dolor sit world amet

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 с графическим ускорителем...

Изголодавшийся по компам, я испытал откровенный шок, смотря на невероятно плавную, трехмерную графику, с непостижимым образом размытую с помощью неведомых методов. Я привык к тому времени видеть максимум что пикселизированную псевдотрехмерную графику, а тут... а тут на моих глазах творилось волшебство и настоящая магия. Я никогда в жизни не забуду, как меня чуть ли не трясло от восторга, как я мог часами смотреть на то, как играют люди в эти игры. Я с восхищением смотрел на Сим Сити, и думал о том, что это наверное, сон.
Я только абсолютно не помню, что я видел, какую из версии — 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));
И при этом получиться такая вот картинка.
640x pix
Причем совершенно невозбранно. Это классно, ведь теперь есть возможность быстро рисовать и проверять кодом и загружать картинки вот сюда в блог и не только. Раньше мне приходилось очень сложно и много рисовать в 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 на самом сложном случае.
Будет интересно.

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

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

29 окт 2024 Вт Проект AVR

Очень часто мне хочется сделать какую-нибудь небольшую программу для ПЛИС на Си и сделать этого мне не удается потому, что у меня нет нормально стандартизированного рабочего проекта на AVR. Возьму из закромов этот проект и вдохну новую жизнь. Сейчас я работаю над проблемой растеризации 3Д-треугольника на ПЛИС, и думаю, что AVR мне сможет помочь быстро писать программу под эти цели. У него все-таки есть большие преимущества для быстрого навертывания кода.
Моя основная задача не в написании процессоров сейчас, а именно в создании и использовании модуля ускорения трехмерной графики. На самом деле, это для меня играет большую роль в данный момент, чем процессоры. Я сделаю процессор AVR, встрою, настрою, но основная цель будет как обычно, демки, цифровые арты, трехмерный ускоритель.
Для процессора будет использовано 64Кб ПЗУ + 64Кб ОЗУ = 128К, и 64+64 двойной видеобуфер. Остается 52К свободной памяти, 32К из которых потрачено будет на текстуры и 20К на различные операционные буферы вроде 4К на знакогенератор и 16Кб для видеоускорителя, к примеру. Мой процессор будет ориентирован на графику, трехмерную и не очень.
Процессор будет писать и читать в видеопамять через порты, чтобы не делать ненужные банки памяти. Скорость записи и чтения из портов в моем процессоре равны 1Т всего, но для закраски экрана будет использоваться запись команды CLS в видеоускоритель.
А еще бы неплохо сделать ускоритель FPU. Процессор AVR тратит много инструкции на то, чтобы умножить и поделить числа, а можно сделать иначе, можно через всего лишь 4Т записи и 4Т чтения поделить 32х битное число, наверное. Ну там еще надо конечно 4Т подождать, наверняка, но все равно, за 12Т делить число быстрее чем за 120Т.
Теги: AVR

28 окт 2024 Пн Страдания с 3D

Вчера вечером, как обычно, сидел и страдал, писал код, который растеризировал бы 3Д графику и как можно быстрее чтобы это делалось. Все не так просто, как может показаться, честно говоря. Да, если использовать формулы вычисления треугольника, то все нормально, но для этого требуется пройти по всем 64К точкам, а это немало. Я думал о том, как бы ускорить процесс растеризации пока что ничего не придумал быстрее чем можно было придумать ранее.
В общем, надо сначала сделать софтверный рендеринг на JS и посмотреть, с какой скоростью и эффективностью будет это все работать. Создать необходимые сцены и предварительно оценить количество рисуемых треугольников, их качество. Хоть так бы сделать, уже будет достижение. Я раньше делал просто рисование кубов, но этого явно недостаточно, нужно прорисовать хоть какую-то сцену.
Оценка количества памяти
Я примерно прикинул сколько надо чего для того чтобы рисовать треугольники. Для хранения текущего состояния рисуемого треугольника требуется хранить 4 DWORD стартовых значения, 4 DWORD инкрементирования по X, и 4 DWORD по Y, что в сумме дает 12x4 = 48 байт на один треугольник. Хранить их можно в разных банках памяти, например, по 4 банка памяти выделять, то есть доступ к ним будет довольно быстрый, за 2Т полное чтение.
Допустим, надо хранить 256 треугольников, которые рисуются на экране, что дает 12Кб памяти для этого. И еще надо хранить собственно, исходные треугольники, а это уже 6Кб дополнительно, в целом получается 18Кб. Не то чтобы много, терпимо, смотря только вот какой чип юзать для этого.
Перед рисованием треугольника также требуется рассчитать, с какой позиции начнется, а это будет вероятно, 3 деления, то есть, A*dx + B*dy + C = 0, нужно вычислить dx = -(B*dy + C) / A. Это будет то количество шагов, которые необходимо сделать перед тем, как точка соприкоснется с позицией u=0 или v=0. Однако, здесь есть свои нюансы, поскольку еще есть и другая позиция u + d = D, что будет очень сложно подсчитать.
Расчет
A1*dx + A2*dy + A3*dz = u
B1*dx + B2*dy + B3*dz = v
C1*dx + C2*dy + C3*dz = d
Здесь или: u + v = d, или u = 0, или v = 0.
dx = -(A3*dz + A2*dy) / A1
dx = -(B3*dz + B2*dy) / B1
dx = (dz(C3 - A3 - B3) + dy(C2 - A2 - B2)) / (A1 + B1 - C1)
Требуется рассчитать все 3 точки и проверить ближайшее расстояние до них. Это необходимо для того, чтобы узнать, где начинается рабочая область у каждого треугольника. Сравнивать числа можно через соотношения: A/B <=> C/D, или AD <=> BC, то есть, через умножения. Выбрав минимальное, начинать растеризацию оттуда, это сильно сэкономит циклы обработки.
Теги: 3D

27 окт 2024 Вс Эмулятор 386 на AVR да еще и на ПЛИС

Я мастер извращаться над кодом как только можно. И вот сегодня у меня идейка такая дурная, как обычно, появляется, что якобы можно сделать эмулятор 386, используя AVR процессор. Я только отлично знаю, с какой неописуемо медленной скоростью будет работать эта программа, потому что уже даже пробовал делать раньше подобное и видел ужасную скорость. Например, спектрум работает в 4 раза медленнее, чем должен, а это, как бы, спектрум! Он и так работает тормознуто, а тут еще более тормознуто будет работать.
Мне чисто ведь чего хочется, чисто лишь 386 на плисе сделать хоть в каком бы виде, хоть даже в таком медленном. Без понятия, зачем и почему это мне надо все, но мне просто хочется этот 86-й как-то внедрить. Если делать его на ПЛИС, то процессор все равно сделать на верилоге почти что нереально сложно, я пытался уже сколько раз и ничего нормально толком не получается. Но с другой стороны, я уже делал процессор 8088-й вот только что недавно.
Лучше уж продолжить его делать просто, а не парить себе мозг.
Теги: 386

26 окт 2024 Сб Интерфейс винды на 232 LE

Что-то подумал, как бы выглядело окно винды, если его прикрутить через верилог. И ведь получилось сделать. Правда, без шрифтов и надписей, потому что место занимают в логике.

Там где белый шум, на самом деле, там именно белый шум, случайные пиксели вырисовываются как будто подключен лютый OpenGL. Справа текстура тоже "едет" вправо.
У меня еще мысль есть, все-таки, но сделать трехмерный рендерер, чтобы было. Это не так и плохо, как кажется на первый взгляд. Но и не так легко, как это может оказаться впоследствии.
А вообще сделать бы просто какой-нибудь муляж ОС, было бы интересно... У меня давно такая идея бродит, ходит как призрак, призрак детства ходит по... моей душе. А не то что все подумали.
Теги: MAX2

25 окт 2024 Пт Винтажный блокнот и перо

Необычно, но я очень сильно захотел, чтобы на мое день рождения подарили винтажный блокнот и настоящее перо с чернилами. И теперь оно у меня есть и я этому рад! Думаю, что буду записывать туда значимые события и даты моего прошлого или настоящего на русском и эльфийском языке. Писать чернилами это отдельное приключение, я попробовал, одну букву надо выводить каждый раз макая в чернила, но в этом и шарм, как раз. Причем обложка прямо из настоящей кожи, не искусственное.