PDA

Просмотр полной версии : поиск нужного адреса для вызова randomize usr



JeRrS
19.04.2014, 11:31
буй

SAM style
19.04.2014, 11:55
как вообще по факту можно узнать какой нужен адрес для вызова/запуска игры для randomize usr? в Spectaculator'e есть debugger который показывает что в памяти записано, через него можно узнать?Отдебажить загрузчик игры. Нужен дебагер с дизассемблером и знание ассемблера. Найдёшь переход в основной цикл - это и будет адресом запуска игры.

char
19.04.2014, 12:02
вначале нужно сообщать - что имеется на входе в проблему, примеры ;)

goodboy
19.04.2014, 12:04
JeRrS, приведи конкретный пример (выложи свой кодовый файл) - наугад советовать трудно

demetrius2003
19.04.2014, 12:05
Я так понял, есть только кодовый блок? Это может стать очень интересным и весьма нетривиальным занятием, которое растянется на месяцы. Пример - обнаружил я у себя блок кода длинной 16 Кб, который я сделал в 1999 году. Состоял он из какого-то монитора, кучи полезных подпрограмм и, собственно, управляющей оболочки. Причём это всё было сращено в один массив байтов. Сейчас в 2014 году я напрочь позабыл адрес входной точки и адрес загрузки. При попытке грузить блок кода с круглых адресов, типа 35000, 45000 и т. д. с последующим запуском с этого же адреса всё виснет. Я то помню, что адрес запуска был глубоко в коде, только где? Дизассемблирование помогает слабо, т. к. надо знать верный адрес, с которого и должен располагаться код, иначе даже crossreference на строки и константы найти невозможно.
P.S.: А вот если у Вас есть Бейсик-загрузчик, то задача упрощается на несколько порядков.

Titus
19.04.2014, 12:05
А просто посмотреть в коде бейсика адрес перехода нет?

Не совсем понятен вопрос.

goodboy
19.04.2014, 12:12
Вот я и хочу понять как допустим через встроенный дебаггер спектакулятора это вынюхать но у другой игры
блин, выложи игру в которой тебе непонятен стартовый адрес.
самый простой способ поставить в отладчике BreakPoint на почти весь диапазон памяти.

goodboy
19.04.2014, 12:29
я предположительно щас расставил где что должно быть и хочу выяснить какой должен быть rand usr
адрес блока неправильный, надо грузить с 24064
(и это какой-то BoulderDash)

Titus
19.04.2014, 12:41
clear 24063
load "" code 24064
randomize usr 31927

goodboy
19.04.2014, 12:48
Titus опередил.
я уже понял что это ремикс BD3.
а правильный адрес загрузки определил по настройкам для IM2

Titus
19.04.2014, 12:52
Titus, ну вот теперь объясните почему старт именно с 24063 и как рассчитали что rand usr 31927? :)

24064 начало, а не старт. 24063 - это стек бейсика.
Эту цифру подсказал Гудбой.

А уж старт вычислить проще простого - ищешь установку вектора прерывания, и смотришь, кто вызывает эту подпрограмму. Потом смотришь, кто ее, и так находишь корневую программу.

Можно еще искать по установке стека (LD SP,xxxx).

char
19.04.2014, 13:01
поиск: i,a

#8117 явная процедура прерывания, по ней узнаем правильное начало загрузки: 24064

дизасмим, проверяем - все ок, адреса процедур/переходов совпали...

LL80F6 LD HL,#FD00
LD DE,#FD01
LD BC,#0100
LD (HL),#FE
LDIR
LD DE,#FEFE
LD HL,LL8117
LD BC,#0041
LDIR
DI
LD A,#FD
LD I,A
IM 2
EI
RET
;
LL8117 PUSH AF


двигаемся по процедурам на уровни выше:


поиск: LL80F6


LL7BFC CALL LL6FC1
LD (IY+#46),#50
...
CALL LL7BC8
CALL LL80F6
RET
;
LL7CA7 LD SP,LLD86D


поиск: LL7BFC

CALL LL7BC8
CALL LL80F6
RET
;
LL7CA7 LD SP,LLD86D
LD IY,#5B80
CALL LL7BFC
LL7CB1 CALL LL7B99
JP LL7CB1
;
DI
CALL LL7A8F
LD A,#01
LD (#5BB9),A
JP LL7CA7
;
LL7CC3 CALL LL78A7


поиск: LL7CA7 - оно там же

что за? LL7A8F

LL7A8F LD HL,#5B00
LD DE,#5B01
LD BC,#0200
LD (HL),#00
LDIR
RET

очистка экрана, ок, возможный старт:

#7cb7 / 31927
DI
CALL LL7A8F
LD A,#01
LD (#5BB9),A
JP LL7CA7



;)

Vadim
20.04.2014, 09:49
Я знаком с авторами тех трех Boulder Dash ей. А авторском виде оно есть у меня.

Vadim
20.04.2014, 12:39
т.е у вас есть скажем так оригинальные ленточные образы этих трех частей? было бы интересно взглянуть
Есть оригиналы, но не ленточные, а TR-DOSные, сделанные авторами. А так, да, делали они ещё на ленте, дисковод позднее был подключен.