Комментарии 81
Я бы с удовольствием почитал разбор навороченных интр типа тех, что делает Digimind, к примеру. Или Rrrola, Red Sector Inc и другие ребята такого уровня. Hellmood/DESiRE, кстати, в своих микро-интрах (32/64 байта) обычно оставляет исходники с подробными комментами, за что ему большой респект. Вот, кстати, полезный ресурс в его соавторстве: sizecoding.org.
p.s. Жоре привет! ;)
Круто. В наше время, полагаю, потребовалось бы писать целый шейдер для подобного эффекта.
Способ реализации напрямую диктуется задачами.
Ну а так… Здесь и написан по сути шейдер.
UPD: а я не говорю про демки, скорее про реализацию подобного эффекта в какой-нибудь игре.
Ну и к слову сказать (хотя это уже несколько другое), группы нередко делают кастомные движки, но в основном для себя. И это уже не критикуется, ибо работа получается полностью авторская.
Довольно много компо не имеют требований по размеру.
Тогда и обсуждение 3D-движков/OGL/DX не в тему.
Но мы же уже давно отклонились от темы в этой ветке обсуждения…
Ну или покажите из мира демосцены, что-то на юните или Unreal
Более чем уверен, что есть какой нибудь набор правил и для «демо на UE»
Я был как раз на обозначенном автором CAFePARTY, и там была лекция про Tooll2 и даже дема на нём же (которая заняла призовые места и вызвала много дискуссий). Да, это не 3D-движок, но не все демы 3D. Кроме того, есть конкурсы типа One Scene Compo, где прямо в правилах написано, что можно использовать Unity, Unreal и пр.: cafeparty.org.ru/2019/compo-rules/#demointro
В шейдере каждый кадр вычисляется цвет каждого пикселя.
А в подобной же интре меняется (вычисляется) координата точки и там определяется цвет. Грубо говоря, рисуется линия по-точечно (а не вычисляется цвет на основе принадлежности координаты линии для всего экрана). И изображение соответственно меняется отдельными точками, а не кадрами (тут даже нет ожидания начала кадра – ретрейса).
Пример интр, работающих по принципу шейдеров – Puls by Rrrola (на основе рей-марчинга) или фракталы (Мандельброт/Жюлиа). Т.е. где идёт проход по всему экрану и вычисляется цвет каждой точки. Правда, без многопоточности :))
В общем-то многие из современных демок и являются небольшими программами, которые инициализируют OpenGL/DirectX, и почти весь их объем — один или несколько сложных шейдеров.
К примеру демка из 2010 «elevated» 4кб
вот тут можно посмотреть на ютубе
www.youtube.com/watch?v=jB0vBmiTr6o
вот тут портированный на ShaderToy шейдер
www.shadertoy.com/view/MdX3Rr
Сам 4кб бинарник можно найти тоже (Windows), только под win10 (и может даже win7) нужно искать пофикшенную версию
А по поводу места (меньше CPU-код или шейдер), то есть 32- и 64-байтовые демки, которые далеко не всегда можно уложить в такой шейдерный код. Да и многие 256-батовые тоже. Тут всё зависит от сложности эффекта, пожалуй ;)
Ах какой сложной задачей казалось нарисовать окружность! Нет, через тригонометрию — элементарно, но нет же тригонометрии у ассемблера! Впрочем, черт с ней с окружностью, точку, точку как нарисовать на экране.
Волшебный режим 10h…
P.S. Вдохновила меня, на самом деле, демка, вращавшая трехмерные фигуры из точек, морфившиеся в процессе. Занимала она порядка 4 килобайт и был это экзешник.
P.S. Вдохновила меня, на самом деле, демка, вращавшая трехмерные фигуры из точек, морфившиеся в процессе. Занимала она порядка 4 килобайт и был это экзешник.
Я тоже помню такую. Интересно, кто нибудь знает где её сейчас найти?
Это может пригодится например для FPGA во время оптимизации алгоритмов на HDL.
Вот для примера алгоритм на Си летающего по диагоналям кирпича и отскакивающего от стенок. Он в виде всего одной формулы (см строки 16 и 17). Очень не оптимальный т.к. например, в Си нет возможности взять и раскопировать бит влево или в право и поэтому использую вычитание из нуля. На верилоге это выглядело бы в разы проще и понятнее.
Этот пример иллюстрирует так работали игровые приставки первого и второго поколения типа понга (которые без проца: транзисторы и/или рассыпная логика).
gist.github.com/Mirn/26174833464eb5403d2cd4c7bf26ccf5#file-opencv_demo3-cpp-L16
Этот пример иллюстрирует так работали игровые приставки первого и второго поколения типа понга (которые без проца: транзисторы и/или рассыпная логика).
Приставки на транзисторах работали иначе. Они вообще, по сути, аналоговыми были, там размеры и положение элементов определялись генераторами с регулируемой частотой, а меняя частоту генераторов, производилось движение. Потенциометры, подключенные к генераторам ракеток, были в качестве джойстиков, разряжающиеся/заряжающиеся конденсаторы двигали мяч в одну-другую сторону.
Взять, к примеру:
www.pouet.net/prod.php?which=53816
www.pouet.net/prod.php?which=66380
www.pouet.net/prod.php?which=62917
www.pouet.net/prod.php?which=76418
И т.д. Всех не перечесть, конечно…
Это — спортивное программирование, оно перпендикулярно промышленным задачам.
Некоторые (а может и многие) прогают графику чисто для души, на работе же занимаются совершенно другими задачами.
Вообще, конечно, сцена под DOS и под Windows очень сильно отличается как минимум наличием функций и библиотек, которые доступны на уровне ОС.
но и ТОГДА в продакшене задачи решались с помощью готовых фреймворков
Например каких?
Clipper, FoxPro для БД, Turbo Vision для интерфейса и BGI для графики?
Никто не мешал написать свою графику и почти гарантированно быстрее BGI, но так ли оно надо, если нужно просто пайчарт вывести? :-)
Меня интересовало, если уж речь шла за графику, было ли что-то высокоуровневое для создание игр тогда.
На PC под DOS все старались написать свой крутой движок. Иногда потом лицензировали его другим.
Кстати, на PC-демосцене в 90-ые некоторые использовали свои самописные движки и фреймворки. Например, у группы Doomsday была своя система со скриптовым языком.
Это если мы говорим про графику. Более распространены были библиотеки для звука — тот же Midas, Cubic, Fmod.
Вот лишь бы что ответить. Приведите пример. Я писал под турбопаскаль 5.5, clipper, foxpro2 — все только руками на языке. Не было ничего.
Немного поностальгирую.
mov al, 13h ;b0 13 int 10h ;cd 10```
Ах, эти b0 13 cd 10…
Помню, как по рукам ходило тайное знание, как вывести из строя windows XP в 7 байт.
Вот все содержимое .com файла, которое намертво и надолго делает компьютер под управлением windows xp неработоспособным до перезагрузки:
b0 13 cd 10 c4 c4 00
Эксплуатирует костыль в виндовом эмуляторе ДОСа. Первые 4 байта переводят программу в графический режим, 2 следующих эквивалентны невозможной инструкции, которая используется для передачи исключений в этом эмуляторе, или чего-то вроде того. Последний 0 — код ошибки, который не обрабатывается в эмуляторе. В результате эмулятор (а он в полноэкранном режиме уже) виснет. При этом все программы и сама винда в фоне отлично работают, но клавиатура и мышь до нее не доходят. Экран намертво черный.
Вот и получается: "а я могу повесить ваш компьютер с 7-ми байт".
а я могу повесить ваш компьютер с 7-ми байтА я могу повесить ваш компьютер с 4 байт )))
ru.wikipedia.org/wiki/F0_0F_C7_C8
p.s. в русской википедии в ссылках при статье «Демосцена» — одна из моих первых проб пера, и именно про демосцену… И что прикольно, рядом статья Олега Чебенеева, он же mindw0rk, рассказы которого я взахлеб почитывал в то время…
Кстати, чтобы использовать FASM (под Линукс например), нужно просто удалить директивы в начале и в конце и добавить org 100h:
-.186
-.model tiny
-.code
-.startup
+ org 100h
; ..... инструкции здесь
-end
Потом:
fasm demo.asm
dosbox demo.com
Где0то в тех же годах видел демку cross.com, рисовавшую такой же эффект, только вместо пентаграммы был крест. Видать, авторы этой демки взяли ту, переделали блок линий (он тут малех посложнее, ещё может код эффекта ужать смогли) и за своё выдали. Или наоборот, хм. Все равно всем респект.
Правда, пару байтов пришлось добавить — два раза команду hlt.
Ведь все равно в конце там есть несколько байтов незаполненных, если я правильно понял, так что в 128 все равно можно остаться.
Полез в архивы. Нашёл ту самую дискетку! :-)
Вот моя версия, анархия:
0000000000: B0 13 CD 10 B7 A0 53 53 │ 1F 07 BD 40 01 33 F6 B1
0000000010: C8 51 8B F9 8B CD 8B C1 │ 2D A0 00 F7 E0 50 8B C7
0000000020: 2D 64 00 F7 E0 5B 03 C3 │ B0 0C 80 FC 20 75 02 88
0000000030: 04 46 E2 E2 59 E2 DA BF │ 9E 7A FE C9 F3 AA BF C6
0000000040: ED B1 5F 51 AA 2B FD AA │ 2B FD 4F E2 F7 59 83 EF
0000000050: 0F AA 03 FD AA 03 FD 4F │ E2 F7 33 C0 49 03 D9 81
0000000060: FB 7A F8 77 0D 38 07 74 │ 09 C6 87 40 01 04 02 D9
0000000070: 89 07 E2 E9 B4 01 CD 16 │ 74 93 B8 03 00 CD 10 C3
Помню тогда собирался послать пачку работ на демо-пати, но то-ли опоздал, то-ли сессия, то-ли что-то пошло не так.
Вот еще пару работ которыми тогда гордился:
множество Мондельброта (ох, как я тогда радовался когда вместо 1 лишнего байта, после двух дней мучений придумал как сэкономить целых три байта, даже подпись влезла в конце файла):
0000000000: B0 13 CD 10 68 00 A0 1F │ BA C8 03 EE 42 32 C9 8A
0000000010: C1 EE 6E 6E E2 F9 BD 9C │ FF B9 C8 00 51 BA 50 FF
0000000020: B9 40 01 51 57 33 DB 33 │ FF 33 C9 52 8B C7 F7 E8
0000000030: 8B F0 8B C3 F7 E8 2B F0 │ C1 FE 06 5A 03 F2 52 8B
0000000040: C6 F7 E8 C1 F8 06 50 8B │ C7 F7 EB C1 F8 05 03 C5
0000000050: 8B D8 8B FE F7 E8 C1 F8 │ 06 5A 03 C2 5A 0A E4 75
0000000060: 06 49 80 F9 E0 75 C4 5F │ 88 0D 47 42 59 E2 B4 45
0000000070: 59 E2 A9 FE CC CD 16 B8 │ 03 00 CD 10 C3 00 41 73
кольца ньютона:
0000000000: B0 13 CD 10 68 00 A0 07 │ B1 C8 BF 80 01 51 83 E9
0000000010: 64 8B E9 B9 40 01 51 81 │ E9 A0 00 BE 70 01 51 E8
0000000020: 3A 00 86 D8 59 E8 34 00 │ 02 C3 24 03 8A D8 C0 E0
0000000030: 02 0A C3 0C 10 88 05 47 │ 59 E2 DB 59 E2 CF B1 04
0000000040: AD 01 44 F6 7D 05 FF 44 │ FE EB 03 FF 4C FE E2 F0
0000000050: 33 FF B5 7D F3 A5 E4 60 │ 48 75 AD C3 AD 2B C8 AD
0000000060: 03 C5 F7 E0 50 8B C1 F7 │ E1 5A 03 C2 C1 E8 0B C3
0000000070: 00 00 32 00 32 00 00 00 │ 09 00 00 00 00 00 F5 FF
3d фонтан:
0000000000: B0 13 CD 10 B7 A0 53 07 │ BE 7E 01 B9 8C 00 C7 04
0000000010: 00 00 AD 89 3C AD AB AB │ 89 0C AD C7 04 60 04 AD
0000000020: E2 EC BE 80 01 B9 8C 00 │ 51 AD C1 F8 03 8B F8 AD
0000000030: AD C1 F8 05 05 64 00 81 │ C7 80 06 B9 40 01 F7 E1
0000000040: 03 F8 AD C0 E8 04 0C 01 │ 24 09 88 05 59 E2 D9 33
0000000050: FF B5 7D A5 89 54 FE E2 │ FA BE 7E 01 B9 18 01 AD
0000000060: C1 F8 04 01 04 7D 05 FF │ 44 FE EB 03 FF 4C FE AD
0000000070: E2 ED B4 01 CD 16 74 AA │ B8 03 00 CD 10 C3 41 73
Довольно годные :)
Поддерживаю просьбу сделать разбор. И ps: давненько не сохранял программы на диск из текста в HEXe, вспрмнил про UUE.
Увы, но статью не смогу. Сейчас нашел исходники — тихий ужас. Я был молод и горяч. Исходники такие же. :-) Проще реверсинжинерить как это делал Loiqig :-) А учитывая что прошло без малого 22 года (исходники середины 97-го), и отсутствие опыта ассемблера приблизительно с тех же времен — у меня уйдет не меньше суток-двух на вспомнить, и еще сутки на статью. Я просто не готов к такому подвигу (слишком много детей/домашних дел для этого).
.286
.MODEL TINY
.CODE
org 100h
Start:
; MOV DX,3C8H
; OUT DX,AL
; INC DX
MOV AL,13h
INT 10h
; XOR CL,CL
;PAL:
; MOV AL,CL
;; AND AL,0111b
; SHL AL,4
; OUT DX,AL
; OUT DX,AL
; OUT DX,AL
; LOOP PAL
PUSH 0A000h
POP ES
REPEAT:
; MOV CX,200
MOV CL,0C8h
; XOR SI,SI
MOV dI,OFFSET ACTIVE
LOOP_Y:
PUSH CX
SUB CX,100
; MOV Y,CX
MOV bp,CX
MOV CX,320
LOOP_X:
PUSH CX
SUB CX,160
mov si,offset x_x1
; MOV X,CX
PUSH CX
CALL CIRCLE
; MOV DS:[dI],AL
xchg bl,al
; MOV CX,X
POP CX
CALL CIRCLE
; and al,00001111b
; or al,00000111b
; add al,15
; add DS:[dI],AL
; add al,DS:[dI]
add al,bl
and al,00000011b
mov bl,al
shl al,2
or al,bl
or al,00010000b
MOV DS:[dI],AL
INC dI
POP CX
LOOP LOOP_X
POP CX
LOOP LOOP_Y
; MOV SI,OFFSET D_X1
MOV Cl,4
MOVE:
; MOV AX,[SI] ;D_X1
lodsw
ADD [SI]-10,AX
; CMP WORD PTR [SI]-4,0
JGE DEC_X1
INC WORD PTR [SI]-2 ;D_X1
JMP SHORT END_D_X1
DEC_X1:
DEC WORD PTR [SI]-2 ;D_X1
END_D_X1:
; ADD SI,4
LOOP MOVE
; MOV SI,OFFSET ACTIVE
XOR DI,DI
; MOV CX,32000
MOV CH,7Dh
REP MOVSW
; MOV AH,01H
; INT 16H
; JZ REPEAT ;UNTIL KEYPRESSED
in al,60h
dec ax
jnz repeat
; MOV AX,03h
; INT 10h
RET
CIRCLE PROC NEAR
; SUB CX,X_X1
; MOV BX,Y_Y1
lodsw
sub cx,ax
lodsw
; mov bx,ax
add AX,bp ;Y
MUL AX
push ax
MOV AX,CX
MUL CX
POP DX
ADD AX,DX
SHR AX,11
RET
CIRCLE ENDP
X_X1 DW (0)
Y_Y1 DW (50)
X_X2 DW (50)
Y_Y2 DW (?)
D_X1 DW (09)
D_Y1 DW (0)
D_X2 DW (0)
D_Y2 DW (-11)
;X DW (?)
;Y DW (?)
ACTIVE DB 64000 DUP (?)
END Start
Ежели кто захочет покопаться, прикладываю архивчик работ:
Вот некоторые превьюшки из архива:
Огоньки. По-моему только ленивый не делал их. К сожалению на современном железе даже в эмуляторе все работает слишком уж быстро. Пришлось дополнительно замедлять внутри virtual box'а. Но даже это не помогает — смотрится хуже чем было на старых ламповых компах. Плюс рандом уже не тот (в качестве рандома используется мусор из памяти — теперь нет того мусора. Возможно то был мусор от qemm386, или еще какой).
Жизнь Конвея, куда ж без неё? :-)
Просто залипательный геометрический мусор.
Братья-близнецы с ротацией палитры.
Дыра — пытался повторить эффект из какой-то 4k-intro.
demozoo.org/parties/804
instead-games.ru/game.php?ID=305
Разбор демки на 128 байт из архива 1997 года