давай сначала определимся, что значит 'сжать'?
Вид для печати
Товарищи кодеры, помогите разобраться! Решил я значит подредактировать карты обоих левелов в REX, чтобы можно было свободно гулять по комнатам. Но прежде чем начать, хотелось бы понять, как сделать возможным возврат в нулевую комнату? Ведь в игре 0 - это запрет перехода.
char справился с этой проблемой. Он дал какой-то код, но как мне применить этот код к кодовым блокам рекса? Как этим кодом пропатчить те блоки, которые мне нужно? (хочу править русифицированую версию)
Вот несколько цитат с темы про правку карты рекса:
либо запрет на вход меняй на любой другой неюзаный, либо нулевой экран перенумеруй....
rasmer, как поменять запрет на вход с #00 на #FF?
Как перенумеровать нулевой экран? Я нифига не понимаю ))
Просто я подумал, что раз char выложил патч, то этот патч можно как-то применить, а если его нельзя приментить, тогда нафига его выкладывать. Вот я и хочу понять, как применять этот патч или какой-либо другой.
ну раз тебе char выложил, то и попроси его применить...
ты здесь спросил как сделать возможным возврат, я тебе объяснил... а как и где менять - это сам ковыряй код игры... почитай капульцевича "как написать игру на асме" и инфоркомовский справочник по машкодам, я думаю через полгода-год найдёшь ответ в них... :)
А что там про взлом игр?
Оптимистичненько так...
На самом деле стоит почитать Капульцевича - появится представление об ассемблере. Но это займет не год и не пол года, за месяц даже с разбором примеров (благо они уже есть в сорцах) можно управиться.
хорошо, набросал патчилку на бейсике, проверяй:
можно патчить что-угодно, в операторах data указывая стартовый адрес, пробел, и дальше - последовательность байт для poke (1 байт = 2 символа в шестнадцатеричном)
Код:10 goto 30
20 rem h= HexToDec(h$)
21 let h=0:let p=1:for L=len h$ to 1 step -1:let k=code h$(L)-48
23 if k>10 then let k=k-7:if k>15 then let k=k-32:if k<0 or k>15 then print "error!":stop
25 let h=k*p+h:let p=p*16:next L: return
30 read a$:if len a$>0 then print inverse 1;" #";a$:let h$=a$(to 4):gosub 20: let adr=h:let a$=a$(6 to):for i=1 to len a$/2:let h$=a$(i*2-1 to i*2):gosub 20:poke adr+i-1,h:print adr+i-1;" ";h:next i:goto 30
1000 data "d0a4 f8"
1010 data "d0b5 f8"
1020 data "d13c f8"
1030 data "d19f fa"
1040 data "B133 ff01ffff"
1050 data "B139 ff0F0200"
1060 data "B13F 0103ffff"
...
1999 data ""
пора открывать тендер "Поможем Новосибу!":)
Спасибо! Код бейсика у тебя на высшем уровне :v2_thumb:
Когда я задавал вопрос, про то как ты изменил запрет на вход, то я неправильно выразился. Я затупил и поэтому не разглядел, что измена запрета входа с 00 на ff это: poke 53412,248/ 53429,248/ 53564,248/ 53663,250. Именно про это я и спрашивал. Я не имел ввиду как ты вышел на эти адреса, понятно, что для этого надо как минимум, фигурально выражаясь, "полгода читать капульцевича" )))
Так бывает, что человек спрашивает одно, а ему отвечают другое, ибо никто не допускает даже мысли, что человек, задавая вопрос, элементарно затупил, или упустил что-то из виду.
P.S. Эту замечательную универсальную патчилку на бейсике я еще не проверял на рексе, но есть опасения, что для бейсика не хватит места, ибо распакованный кодовый блок рекса занимает довольно много места в памяти, бейсик-патчилка тоже не маленькая. Может статься, что в случае с рексом проще поменять значения в дебаггере эмулятора. Посмотрим.
---------- Post added at 19:04 ---------- Previous post was at 18:57 ----------
И по горячим следам у меня еще один вопрос. Как юзать патчилку на бейсике - это понятно. Загружаем патчилку, загружаем блок, запускаем патчилку, она патчит. А как юзать патчилку на асме, которую ты выкладывал? Я правильно понял, что нужно открыть редактор ассемблера, вбить туда код (а скопипастить как-нибудь можно?), потом это всё надо скомпилровать в машинный код, а дальше уже юзать этот код как бейсик-патчилку? Или я что-то напутал?
на асме примерно так:
Код:org #4000 ;16384
;
PATCH
ld hl,P_DATA
patchlp
ld e,(hl)
inc hl
ld d,(hl)
inc hl
ld a,e
or d
ret z ;de=#0000=exit
ld c,(hl)
inc hl
ld b,#00
ldir
jr patchlp
;
P_DATA
dw #d0a4
db 1,#f8
dw #d0b5
db 1,#f8
dw #d13c
db 1,#f8
dw #d19f
db 1,#fa
dw #B133
db 4,#ff,#01,#ff,#ff
dw #B139
db 4,#ff,#0F,#02,#00
dw #B13F
db 4,#01,#03,#ff,#ff
dw #B145
db 4,#0f,#04,#ff,#02
;...
dw #0000 ;finish
;
P_LEN equ $-PATCH ; for save "mypatch" code 16384,P_LEN
Переделку обоих левелов рекса я закончил. Впринципе уже можно написать загрузчик на бейсике с покесами и всё.. Но хочется еще что-нибудь замутить )) Посему два вопроса:
1. Как сравнить два крупных файла (которые одновременно в память спекка не помещаются) на предмет выявления отличий? На предмет выявления адресов отличающихся ячеек. (Адреса нужны именно в спековском формате, поэтому WinHex не пойдет)
На ум приходит только такой адский способ: юзаем бейсик128: загружаем файл1, сохраняем его на кремниевый диск (SAVE!). Загружаем файл2, тоже сохраняем его. Считываем 1-ую ячейку из находящегося в памяти файл2, запоминаем значение. Загружаем из памяти файл1, считываем его первую ячейку, сравниваем значения. И т.д.
2. Можно ли сделать так, чтобы в финале рекс1, после показа кода, не начиналась заново игра, а управление возращалось бы бейсику? (Вроде после загрузки кодового блока для бейсика еще остается место, сужу по русифицированной версии, в строку редактирования не вернутся, идет сброс, а вот сама программа выполняется.)
И тот же вопрос относительно демо-рекса, чтобы по окончании демо бы управление возвращалось бы в бейсик. В аттаче снапшоты, 1-ый рекс и демо, почти финал. В 1-ом только прыгнуть, в демо рекс сваливается в яму, возраждается, идет надпись про то кто писал музыку и потом всё заново.
[QUOTE=ZX_NOVOSIB;755711]Переделку обоих левелов рекса я закончил. Впринципе уже можно написать загрузчик на бейсике с покесами и всё.. Но хочется еще что-нибудь замутить )) Посему два вопроса:
1. Как сравнить два крупных файла (которые одновременно в память спекка не помещаются) на предмет выявления отличий? На предмет выявления адресов отличающихся ячеек.
http://s020.radikal.ru/i700/1411/2e/e94e9b21a8a5.png
Не?:D
Total Commander - руль!
А чтобы адреса были в "спековском" формате - можно "приклеить" (тем-же Тоталом) в начало каждого файла по куску произвольных данных (имитация ПЗУ).
Тогда при сравнении адреса будут соответствовать реальным.
Спасибо! Правда я уже сам допёр. Сравнивать можно и винхексом )) И предварительно можно приклеить в начало 16357-байтный кусок! Сравнение нужно было вот для чего:
Я по наивности думал, что бейсик загрузчик сможет вносить покесы в сжатый хрустом блок, ибо в таком случае для бейсик загрузчика-трейнера остается много места. Однако сравнение двух архивов хруста показало, что они чересчур сильно отличаются. Хотя в исходном файле изменен всего 1 байт, но хруст пакует их абсолютно по разному :)
Придется писать короткий загрузчик, и то, есть подозрение, что нифига не получится. Ибо в руссифицированно-дикофицированном варианте с вирта для каждой части свой загрузчик-трейнер, видимо для бейсик загрузчика не хватило места. Надо поэкспериментировать..
А насчет возврата управления бейсику, это реально? Вроде бы код 201 должен возвращать в бейсик, только куда его вставить? :v2_conf2:
чтобы вернуться в бейсик надо посмотреть - а не похерены ли бейсиковские переменные, и на всякий случай при запуске сохранить все регистры, а перед выходом - восстановить...
короче это чересчур трудоемко? Значит от идеи "загрузка после демо первой части" и "второй по окончании первой" видимо придется отказаться.
А вот что делать с проблемой конфликта бейсик-загрузчик-трейнера и кодового блока.. Если в бейсик-загрузчике будет слишком много операторов (а их будет много, ибо нужен трейнер), то бейсик будет конфликтовать с распакованным блоком, а блок должен быть распакован, чтобы в него можно было покесы вставлять (из трейнера)..
..может можно как-то 128-ую память заюзать?
что сложного - то? сначала всё запушил, потом запопил всё :) если переменные бейсика трутся, то сохранил лдиром, потом также наместо перекинул тем же лдиром.
про call #3d13 слышал?
rasmer, про call #3d13 я не слышал ) Я вообще ничего не слышал, ибо пока не читал Капульцевича )
Подскажите, как вычислить верхнюю границу бейсик программы? Т.е. допустим кодовый блок начинается с адреса ххх, как узнать, наезжает бейсик на этот адрес или еще нет? В книге "ZX Spectrum Диалекты бейсика" пишут:
Пробовал в спектакуляторе, пишет какую-то ерунду со знаком минуса :(Цитата:
Например, нас может заинтересовать длина написанной бей-
сик-программы. Выберем из системных переменных PROG
(23635/36) и VARS (23627/28) адреса начала бейсик-программы
и начала области бейсик-переменных и вычтем одно из другого:
print (реек 23635+256*реек 23636)-(реек 23627+256*реек 23628)
Поменял местами, стало писать какие-то двух-трехзначные числа, в зависимости от того сколько строк/операторов. Вроде это работает! Когда добавляешь строки или операторы, то число увеличивается. Удаляешь - уменьшается. Когда цифры обрамляешь в VAL "", тоже уменьшается. Число, которое выдает эта прога, это длина в байтах? Если да, то к какому адресу её нужно прибавлять, чтобы вычислить верхнюю границу бейсик-проги?Это не совсем удобно. В моем случае адрес начала кода известен и его не изменить. А делать CLEAR xxx-1 после каждой введенной строки, слишком муторно, лучше способ из книги как-то допонять/допилить.Цитата:
А вообще, поставь CLEAR xxx-1 и с адреса xxx можешь ложить код. Если бейсику не хватит отрезанного пространства - он ругнётся.
Ну вы блин даёте )) Раз уж на то пошло, то прилипите эти посты в конец этой темы.
---------- Post added at 20:28 ---------- Previous post was at 20:20 ----------
Если это невозможно, то перенесите хотя бы в другой раздел, в "Для начинающих", или в "Программирование".
В теории это всё так. Щас специально сделал низкий RAMTOR и пробовал повбивать строки. Да, новую строку в конец программы бейсик в какой-то момент не дает вбить, пишет ошибку. Но можно вставить строку в начало, можно вставить оператор в существующую строку и тогда всё зависает к чертям собачим )) Стрелки по строкам передвигаются, больше никакие кнопки не работают. Так что в теории это всё так, но на практике не всё так идеально. Будем считать, что метод тыка - единственный надежный метод.
http://speccy.info/ASCLZPAC - этот? А где его скачать?Цитата:
начинающему ещё можно заюзать пакер от Сендецкого, он позволяет после распаковки изменить три ячейки на выбор.
полистай тему, я выкладывал.
http://zx-pk.ru/showthread.php?t=22153
а лучше учись Exomizer'y.
нашёл, скачал.. Но не осилил ) Это явно не хрум/хруст, там всё понятно и наглядно. Видимо автор делал исключительно для себя, и ему всё было понятно, ведь он автор.
Пишу тут загрузчик на бейсике. В общем 5 картинок сжал упаковщиком экранов, потом загрузил их последовательно в память, друг над дружкой, потом весь этот блок сохранил. Потом это блок сжал хрустом. Начал всё это тестировать из под бейсика, и выяснилось, что такая конструкция не хочет работать в 128-ом режиме. Работает либо через usr 0, либо в 48-ом. Пробовал и разные экранные паковщики и разные адреса, всякие возможные комбинации - нифига не помогает, при чем всё крашится каждый раз по разному и в спекуляторе и в унриале. Неужели придется делать 48 ONLY? Или от хруста отказаться? Без него всё вроде работает.
В аттаче пример. Грузится архив, он распаковывается и автостартует с адреса первой картинки (в данном случае 46000) В 48 всё работает, в 128 - каждый раз разный глюк.
Про CLEAR я в курсе )) В данном случае CLEAR 32412 не помогает. И CLEAR 45999 тоже. Поэтому их и нет в примере.
goodboy, распаковщик хруста в буфере? Из-за этого вся байда? А какой адрес лучше подойдет? 16384 с черными атрибутами сойдет?
Кстати, а распаковщики картинок в буфер принтера не лезут?
Ну в моем случае ужалось с 18347 до 13587, т.е. процентов на 25, неплохо )
Я перепробовал кучу паковщиков картинок, чтобы при распаковывании картинка быстро выводилась на экран и чтобы размер при этом был поменьше. Остановился на MAXSOFT SCREEN PACKER v1.6, там в настройках нужно выбрать депакер FAST.LIN. Может что-то и получше есть, незнаю, но обычно либо картинка сильно ужимается, но потом долго рисуется, либо рисуется быстро, но ужимается очень мало. MSP с режимом FAST.LIN - золотая середина.
---------- Post added at 04:00 ---------- Previous post was at 03:58 ----------
цветные квадратики сверху экрана это красивей? Или это типа шутка была? :)
Кстати иногда CLEAR не нужен, а иногда даже вреден. Ибо он обнуляет переменные. Можно сократить бейсик программу если вместо цифр использовать переменные, а переменные эти задавать не из программы, а "из командной строки", это позволит еще выиграть свободного места. Но эти заданные переменные обнуляются операторами RUN и CLEAR. Впрочем всё это актуально исключительно для бейсика :)
Короче без кодового загрузчика, включающего basic48, в буфер принтера нельзя ложить депакер? Почему? Ведь к бейсику возврата не будет. Я думал если возврат в бейсик не планируется, то пофиг, что что-то там у бейсика попортится. Я ошибался?
---------- Post added at 03:57 ---------- Previous post was at 03:55 ----------
это можно сделать из под бейсика?