crypt of decay - чисто поржать, программерское [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

чисто поржать, программерское [Mar. 14th, 2012|08:09 pm]
Previous Entry Add to Memories Tell A Friend Next Entry
[Tags|]

кусочек кода.

deftvar: pos_x, pos_y, pos_tx, pos_ty, item_id

  psh 42
  psh -1
  bsr game_do_down_brick
  end

entry_bdis:

proc: game_do_down_brick
args: .xarg0, .xarg1
locals: .tid, .tmp
  ;
  set [.xarg0], 666
  set [.xarg1], 999
  ;
  mgf [pos_x], [pos_y], [.tid]
  jeq .earth, [.tid], 4
  ret
  ;
.earth:
  new entry_bdis, [.tid]
  set pos_x, [pos_x], [.tid]
  set [.tmp], [pos_y]
  add [.tmp], 1
  set pos_y, [.tmp], [.tid]
  set pos_tx, 0, [.tid]
  set pos_ty, 0, [.tid]
  set item_id, -1, [.tid]
.quit:
  ret
endp: game_do_down_brick



то, что мы сейчас с вами видели, — так лучше б мы с вами не видели! да, это кусочек кода одного логического платформера, который я надеюсь вскорости релизнуть (перепись досёвой игры). меня больно укусил Эрик Шайи (так, кажется?), и внутри движок представляет из себя VM с невытесняющей многопоточностью: поток на персонажа, по потоку на объект и ты пы.

сишный код содержит читалку форматов, рисовалку, VM и парочку хаков, всё остальное написано на вышепроцитированом ужасе.

система команд VM забавная: каждая команда может иметь от 0 до 3 операндов, и работать со стеком как стековая VM, со стеком при помощи адресации «номер элемента начиная с вершины стека», с локальными переменными потока (по 126 на поток) и с глобальными переменными (126 штук на всех). имена команд by design упиханы в три буквы. ассемблер поддерживает минимальный сахар, но не умеет даже простейшей математики во время компиляции. зато мне VM нравится.

почему я сделал всё именно так? потому что писать на сях простой тупорылый платформер скучно. а вот на этом асме, да ещё и без отладчика (не-не, вообще без отладчика, максимум что можно — получить дамп исполняемого потока инструкций) — уже намного забавней.

а если положить в каталог с игрушкой файл CFTITLE.DAT (опционально пожатый старым компрессором PRO-PACK, если кто помнит такой — ах, дос, ах, файлы с сигнатурой RNC…), игра покажет его заместо обычной заставки. для тех, кто не олдфаг: CF обозначает Cannon Fodder. файл, соответственно, берётся из DOS-версии игры.
Linkmeow!

Comments:
[User Picture]
From:[info]steinkrauz
Date:March 14th, 2012 - 09:27 pm
(Link)
Это та израильская штучка, что ли?

Не врубился, в чём глубокий смысл прибавления через локальную переменную?
set [.tmp], [pos_y]
add [.tmp], 1
set pos_y, [.tmp], [.tid]


И не жирно ли будет по потоку на каждый объект? Сколько их там в среднем танецевать в результате будет?
[User Picture]
From:[info]ketmar
Date:March 14th, 2012 - 09:33 pm
(Link)
>Это та израильская штучка, что ли?
ага. оно уже на 80% работоспособно.

>Не врубился, в чём глубокий смысл прибавления через локальную переменную?
в том, что я постоянно забываю про форму математики (op0, op1, dest). %-)
к тому же это тест ассемблера, тащемта.
кстате, вот эта команда set с тремя операндами — это, на самом деле, изменение локальной переменной в другом потоке: set tvarindex, newvalue, threadid. операнды-то потокам не передаются другими путями, только спавн и жестокий фиксинг локалов.

>И не жирно ли будет по потоку на каждый объект?
да фигле. даже Another World имел до 64-х потоков. а у нас давно не 286-е.

>Сколько их там в среднем танецевать в результате будет?
теоретический максимум — 256 «активных» объектов на уровне (формат уровня диктует), практический — ну, десяток-полтора максимум. плюс периодически рождаются потоки для временной анимации чего-нибудь.
[User Picture]
From:[info]steinkrauz
Date:March 14th, 2012 - 09:54 pm
(Link)
кстате, вот эта команда set с тремя операндами — это, на самом деле, изменение локальной переменной в другом потоке: set tvarindex, newvalue, threadid. операнды-то потокам не передаются другими путями, только спавн и жестокий фиксинг локалов.
Неплохо. Только если через неё баги полезут, отстрелить их будет сложно.

Я бы тут не push, а pull передачу использовал, хотя это, конечно, было бы на порядок корявее.

да фигле. даже Another World имел до 64-х потоков. а у нас давно не 286-е.
Ну это смотря как писать. Я в школе как-то накропал аналог нортоновского скринсейвера, где каждая звёздочка была отдельным объектом и сама управляла своим жизенным циклом. Тормозило жутко.
[User Picture]
From:[info]ketmar
Date:March 14th, 2012 - 10:11 pm
(Link)
>Только если через неё баги полезут, отстрелить их будет сложно.
это часть кайфа. олдскул, все дела.
в принципе, можно и компилятор с чего-то си-подобного под эту VM накропать, но это убивает весь фан.

а баги вряд ли полезут: переменные именованы, id-ы потоков тоже не с потолка. ни разу пока именно тут бага не поймал.

>Я бы тут не push, а pull передачу использовал, хотя это, конечно, было бы на порядок
>корявее.

тут такое дело, что VM вообще не дизайнилась, по сути, а «сама выросла». то есть, я хотел обойтись несколькими десятками команд. отсюда появились свободные биты, в которые я положил количество операндов. а дальше уже само… вот если команда add, а операндов нет? ну логично, что она тогда со стеком должна работать. ну, и понеслось. плюс по пути добавлял то, без чего жить было совсем сложно и неприятно.

в оригинале доступа к другим потокам не было, всё делалось через вызовы внешних функций движка. а потом я подумал: какого фига? если бы я хотел VM, защищённую от дури программера, то я бы и делал всё не так. а уж коли у нас принципиально всё вот такое — зачем программера ограничивать? и добыл из шкафа набор граблей побольше.

>Ну это смотря как писать.
я тут в начале разработки забыл сделать fatal, если поток зациклился (сейчас лимит — миллион инструкций потока на кадр). так вот, у меня там парочка потоков ушла в цикл и выполняла по миллиону ерунды. пока fatal не поставил — не замечал, потому что оно даже одно ядро из моей корыдвадуба сожрать полностью не смогло.

а потоки, по сути, даже до десяти тысяч инструкций на кадр не доходят. а большинство укладывается в несколько сотен (поменять кадр анимации, проверить пару условий, всё сначала). только поток самого профессора чуть больше, да и то ненамного. там же логика простая очень.

я вот думаю попробовать потом на модифицированном движке сделать полноценный платформер, с кучей суетящихся врагов, и посмотреть, что из этого получится.
From:[info]tzirechnoy.livejournal.com
Date:March 15th, 2012 - 11:45 am
(Link)
Кстати, действительно, ужэ не первый раз отмечаю, что писать на асме проще, чем на сях.
[User Picture]
From:[info]ketmar
Date:March 15th, 2012 - 12:16 pm
(Link)
в данном случае таки проще ещё и потому, что халявные сопрограммы. плюс я управляю стеком, и заместо кучи флажков могу его просто тупо вычистить и сделать jmp в нужный по логике обработчик.