|
|
|
Канал X2: The Threat: «X2-ASM - это проcто!» |
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
CheckerTwo : |
А там вроде в листинге перед каждой дизассемблированной командой стоит число - текущий стек. Это не подойдет?
|
Подойдёт конечно. Я ухитрился не обратить внимания Просто пользуюсь в основном asm, а не out. Последний раньше использовал, только для поиска адресов.
Спасибо за доработку и инфу по препроцессору - то, чего очень не хватало.
CheckerTwo : |
Извиняюсь за задержку, в гости ездил.
|
Я тоже давно не заглядывал, ваял транслятор X-C -> X-Asm с C-подобного языка в X-Asm. Сделаю мелкие добаботки и выложу завтра. Десять дней...
|
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
Darth Revan : |
ваял транслятор X-C -> X-Asm с C-подобного языка в X-Asm. Сделаю мелкие добаботки и выложу завтра.
|
O-o! Класс!
Из-за отсутствия свободного времени я даже не пытался начинать такой проект. Только в мечтах...
Darth Revan : |
Спасибо за доработку и инфу по препроцессору - то, чего очень не хватало.
|
Препроцессор мало тестил и могут быть косяки. Потому и инфу не выкладывал.
|
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
2 CheckerTwo. Сложно ли убрать проверку на наличие потомков у класса, чтобы можно было добавлять переменные к классам с наследниками, причём так, чтобы наследники считали, будто этих переменных нет, т.е. чтобы у них адреса не смещались?
Дело в том, что очень нужно добавлять переменные в базовые классы, а полную перекомпиляцию делать не хочется - и адреса все едут, и долго каждый раз компилировать, и смотреть надо, в чём именно проблемы возникают на перекомпилином обже.
Естественно, что если просто добавить переменную в базовый класс, чтобы не смещались адреса у потомков, то первая переменная первого потомка зашарится с нашей новой. Однако есть идея. Вместо того, чтобы добавлять переменную в базовый класс, скажем, TSCRIPT, TSHIP или TSTATION, можно добавить по переменной (скажем, new_var) в каждый неабстрактный их наследник и сделать виртуальные функции GetNewVar и SetNewVar (кстати, как я понял, вызов по call считается всегда динамическим, как в Java?) И было бы всё хорошо и в каждом созданном объекте было бы по одной переменной new_var в листе дерева наследования, если бы у неабстрактных классов не было бы наследников. Но такое встречается. Например, TOBJ_SHIP_KHAAKCLUSTER = class(TSHIP_M3), TFACTORY_SHIP = class(TFACTORY) и др. Но если бы была возможность добавлять пременные в базовый класс без смещения адресов у потомков, я бы добавил, на примере последней пары TFACTORY_SHIP,TFACTORY переменные и виртуальные функции в оба класса. Тогда если объект у нас типа TFACTORY, то всё OK - потомка вообще нет. Если же он типа TFACTORY_SHIP, то переменная в нашем объекте от TFACTORY на самом деле не нужна и к ней не будет обращений (т.к. обращение через функции GetNewVar и SetNewVar будет к переменной класса TFACTORY_SHIP) и может быть спокойно затёрта первой переменной от объекта TFACTORY_SHIP. Т.е. тогда реально была бы опять одна переменная. Для надёжности можно сделать new_var типа .vint, чтобы не возникло, в случае чего, проблем со сборщиком мусора.
|
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
Darth Revan : |
Сложно ли убрать проверку на наличие потомков у класса, чтобы можно было добавлять переменные к классам с наследниками, причём так, чтобы наследники считали, будто этих переменных нет, т.е. чтобы у них адреса не смещались?
|
Убрать-то можно. Просто в INI-файле изменить статус сообщения об ошибке с "E" на "W" или "N". Будет выдаваться либо предупреждение либо Note. При этом генерация OBJ файла разрешена. Но у меня были случаи, когда Х2 падала при загрузке из сейва после таких модификаций . Может, конечно я силно косячный патч писал, но вот так... Это дело обсуждали с Shaddie, и решили, что лучше так не делать...
|
|
|
SD 251 EGP
Рейтинг канала: 2(21) Репутация: 30 Сообщения: 2436
Зарегистрирован: 05.03.2006 |
|
Конечно, сохраненка и правленные обжи вообще совместимы только при удачном стечении обстоятельств. А при новой игре тоже падала?
|
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
Я пишу совместимые. Я вообще пишу для X2 на обжах. Так, что всё можно править на сохранёнке. Но если начнёшь на патче, а продолжишь на чистом - упадёт.
|
|
|
SD 251 EGP
Рейтинг канала: 2(21) Репутация: 30 Сообщения: 2436
Зарегистрирован: 05.03.2006 |
|
Ну а мне удавалось сотворить несовместимые. Всего-то потребовалось сместить вызов DoSaveGame и при загрузке образовались такие чудеса...
|
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
Причина может и быть как раз в смещении адресов. После загрузки на новом обже выполнение после команды началось по старому адресу, а там находится уже не то.
|
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
SD : |
После полной перекомпиляции x2story у меня в игре полностью отпал строковый ввод: ни корабль переименовать ни в скриптовом редакторе строку набрать...
|
Shaddie нашел-таки косяк. Респект.
Проблема была в следующем:
Некоторые объекты содержат инициализированные строковые переменные.
Для этих переменных дизассемблер генерил примерно вот такой код
Код: |
ms_DefaultCharSet : string = 00008A92h ; 35474d;
|
А так как при ассемблировании адреса строк изменяются, это приводило к неработоспособности процедур, использующих инициализированные строки.
Дизассемблер поправил.
В ассемблере изменил синтаксис объявления строковых переменных:
Код: |
.section code, con
;
;.vstr <id> ; неинициализированная переменная
;.vstr <id> = <label> ; указатель на строку в секции STRG
;.vstr <id> = <string> ; строка
; например
.vstr test1 ; просто переменная без инициализации
.vstr test2 = STR_01 ; используется метка на строку
.vstr test3 = "init string" ; используется строка
.section strg, con
STR_01: .ascii "init_string for var test2"
|
Второй вариант - это "общий случай" - такой код генерирует дизассемблер.
В третьем варианте (объявление test3) ассемблер автоматом создаст запись в секции STRG и вставит ссылку на нее в описатель переменной.
Поправил дизассемблер и ассемблер. Ссылка в первом посте.
|
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
Всё, буду всё делать на полностью перекомпилированных обжах.
|
|
|
SD 251 EGP
Рейтинг канала: 2(21) Репутация: 30 Сообщения: 2436
Зарегистрирован: 05.03.2006 |
|
И вот они-то будут точно несовместимы с сохраненками никоим образом.
Shaddie - супер! Мегареспект.
|
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
Да. Придётся разок начать игру заново.
|
|
|
SD 251 EGP
Рейтинг канала: 2(21) Репутация: 30 Сообщения: 2436
Зарегистрирован: 05.03.2006 |
|
2Checker Two: Что-то эта новая версия ассемблера как-то нервно относится к содержимому комментариев. На казалось бы безобидный кусок:
; my function is smaller, so - simply overwrite whole part
он выдает
pass1:(TSHIP.AttackRunOnTarget.asm:17) Err: Invalid number.
EDIT: Виноват, ругается он на самом деле на строчку
но в листинге указывает совсем другой файл (да и номер строки не тот).
|
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
Да, с листингом проблемы с самого начала. Иногда ошибки указывают не на тот файл. Но это мне не мешает. И другим, я думаю, также не сильно. Так что, Чекер, не обращай внимания.
Кстати, раз уж зашла речь о мелких багах, то я заметил ещё мелкий баг, также, вероятно, древний. Если слишком далеко отнести описание функции-метода внутри .classdef и начать её собственно писать (особенно если в разных файлах), то получается глюк. Но это всё ерунда.
|
|
|
AlexYar 1850 EGP
Рейтинг канала: 6(442) Репутация: 328 Сообщения: 31614
Зарегистрирован: 26.10.2003 |
|
Подскажите плз Как сделать inc-файл к ассемблеру (чтобы потом к патчам прикреплять) в котором нужно всего по одному конкретному адресу заменить одно значение на другое?
К примеру, я поковырялся в x3story.out и нашел место, где задается кол-во патронов в ящике боеприпасов. Там 200, а мне надо 1 сделать.
Конечно я его в hex-редакторе уже поменял и в игре юзаю вовсю, но в виду выхода разных патчей и того, что таких фиксов может быть много, а ждать выхода очередного патча некогда, да и программеров чтобы по мелочам не напрягать, чтобы самому всё добавить и чтобы не править каждый раз в хекс-редакторе - проще сделать inc-файл я думаю, он же к любой версии патча для одной версии игры подойдет, так?
|
|
|
SD 251 EGP
Рейтинг канала: 2(21) Репутация: 30 Сообщения: 2436
Зарегистрирован: 05.03.2006 |
|
Как повезет. Патчи (в том числе Игософтовские) могут сместить адрес. Делается примерно так (если менять константу:
Код: |
.SECTION code, abs
$ = 0<где_нужно>h
.word <твоя константа>
|
Главное точно попасть в адрес операнда а не операции - проверяй дизассемблированием после патча.
|
|
|
AlexYar 1850 EGP
Рейтинг канала: 6(442) Репутация: 328 Сообщения: 31614
Зарегистрирован: 26.10.2003 |
|
SD : |
Главное точно попасть в адрес операнда а не операции - проверяй дизассемблированием после патча.
|
Не, мне попадать не нужно. Адрес мне известен точно, значение для того адреса тоже, нужно просто поменять. А патчи я имел в виду не егософта, а пилотов
К примеру в хекс-редакторе я прыгаю на адрес B55C1 и меняю там C8 на 01.
Т.е. в x3story там такая строка:
000B55BE: 0001 00C8 | 1 pushw 200d ; 0C8h
А мне нужно, чтобы там вместо 200d был 1d.
Если я правильно понимаю, то писать нужно так:
Цитата: |
AmmoInBox = 1d
.section code, abs
$ = 000B55BEh
pushw AmmoInBox
|
Ничего не напутал?
И еще попутно вопрос по х3, раз такая темка на два канала...
В х2 была блокировка на загрузку скриптов большей версии скриптдвижка, чем есть сама игра. Ну т.е. если скрипт писан на версии скриптдвижка 28, а в самой игре версия скриптдвижка 21, то скрипт не отображался в списке скриптов, и вообще его для игры как бы не было. Так?
Поменял версию скриптдвижка в х3 (в трех местах, с патча Шадди методу взял, только адреса под х3 поменял) на 35. Вобщем в меню редактора пишется 35, в сохраняемых скриптах пишется 35 и команда engine version возвращает 35. Сделал новый скрипт, сохранил, затем вышел из игры, вернул оригинальный обж, запускаю игру, начинаю новую, захожу в редактор скриптов и в листинге скриптов вижу свой новый скрипт И чего делать? Как правильно версию скриптдвижка поменять?
Для х2 вроде как больше 32 ставить нельзя, на всякий случай пошел другим путём - поставил версию скриптдвижка 1, захожу в игру - всё равно все скрипты видно
|
|
|
Shaddie 556 EGP
Рейтинг канала: 4(60) Репутация: 118 Сообщения: 261 Откуда: Томск Зарегистрирован: 09.09.2004 |
|
AlexYar : |
Как сделать inc-файл к ассемблеру (чтобы потом к патчам прикреплять) в котором нужно всего по одному конкретному адресу заменить одно значение на другое?
|
1. В файл ux3story.asm добавить строчку:
.include "аmmunition.inc"
2. Создать файл ammunition.inc содержащий следующий код:
AmmoInBox = 1d
$ = 000B55C0h
.word AmmoInBox
AlexYar : |
$ = 000B55BEh
pushw AmmoInBox
|
Можно и так.
AlexYar : |
В х2 была блокировка на загрузку скриптов большей...
|
Смотреть код надо.
_________________ Быстро едешь, тихо понесут... |
|
|
Darth Revan 345 EGP
Рейтинг канала: 5(153) Репутация: 42 Сообщения: 349 Откуда: Belarus Prime Зарегистрирован: 01.02.2006 |
|
CheckerTwo, огромный респект, что довёл до ума возможность перекомпилировать обжи. Я разбил патч для X2 на две части, т.е. большая часть ушла в x2story.asm, а меньшая, часто меняющаяся, в ux2story.asm. Так что все плюсы и полной перекомпиляции x2story.asm, и быстрой компиляции ux2story.asm с совместимостью сейвов. Отдельное спасибо за директиву .value, дающую возможность создавать автоматически поддерживающуюся таблицу адресов в начале x2story.asm.
Маленькая просьба - нужно либо вообще убрать Note Name of type is ignored, или сделать возможность отключения строчкой в ini-файле. А то их более восьми тысяч. А ошибки бывают в середине, и искать их в груде мусора очень неудобно.
|
|
|
CheckerTwo 550 EGP
Рейтинг канала: 4(96) Репутация: 103 Сообщения: 412 Откуда: Tomsk Зарегистрирован: 18.08.2004 |
|
Darth Revan : |
Да, с листингом проблемы с самого начала. Иногда ошибки указывают не на тот файл. Но это мне не мешает. И другим, я думаю, также не сильно.
|
Кажись подправил. Спасибо...
Darth Revan : |
Кстати, раз уж зашла речь о мелких багах, то я заметил ещё мелкий баг, также, вероятно, древний. Если слишком далеко отнести описание функции-метода внутри .classdef и начать её собственно писать (особенно если в разных файлах), то получается глюк.
|
Не могу смоделировать ситуацию. Можешь мне намылить пример минимальной длины, который приводит к этой ошибке?
Darth Revan : |
Маленькая просьба - нужно либо вообще убрать Note Name of type is ignored, или сделать возможность отключения строчкой в ini-файле.
|
Вставил модификатор для сообщений IGNORE, в ini-файле строки, помеченные символом "I", не будут вставляться в листинг.
Акромя того, добавил директиву .settime <строка_дата_время>.
Например
.settime "05-10-2006 00:59:59" ; 5 октября 2006 года
Записывает в секцию CTIM obj-файла указанную дату и время. Работает только для Х3, для ХТ/Х2 - не работает.
Немного подправил дизассемблер...
Поправленные версии лежат вот здесь дизассемблер и ассемблер. Ссылка в первом посте.
|
|
|
|
|
|
Канал X2: The Threat: «X2-ASM - это проcто!» |
|