/ / POKE в ZX спектър - zxspectrum

POKE в ZX спектър - zxspectrum

Играя със стар ZX Spectrum 48k и се чудя как точно може да влезе POKE кодове.

Зареждате игра с лента - след това по някакъв начин излизате от типа програма в изявленията POKE и започнете да пускате отново програмата?

Направих много търсене по този въпрос, но не успях да намеря точно как се прави това, така че всички опити за това биха били много ценени.

Отговори:

2 за отговор № 1

Повечето програми на Spectrum използват двуетапен процес за стартиране на игра:

  1. Заредете и стартирайте малка програма BASIC
  2. Тази малка програма BASIC след това зарежда много по-дълъг код на машината и след това скача до входната точка на кода на машината (напр. RANDOMIZE USR 28455).

Ако успеете да спрете между тези стъпки, можете POKE (за да увеличите броя на живота, ...) и след това стартирайте кода на машината RANDOMIZE USR 28455, ако приемем, че някак си разбрахте правилния адрес.

След като програмата на машината работи, обикновено няма начин да я спрете и да се върнете към преводача BASIC. Освен ако програмата на машината не предостави някакъв изричен (или непреднамерен) начин за това.


2 за отговор № 2

На първо място, значението на PEEK и POKE:

10 let x = PEEK 40000: REM returns (reads) the value (0-255) in position 40000
20 POKE 40000, 201: REM writes the 201 value in position 40000

Повечето програми зареждат малка BASIC програма, наречена loader. Това беше нещо като:

10 cls
20 print "Loading AWESOME GAME!!!"
20 load "" screen$
30 load "" code 40000
40 randomize usr 40000

Значението трябва да е ясно: Заредете екранна презентация (ред 20), за да запазите потребителя забавен, докато програмата за асемблер (самата игра) се зареди (ред 30) и най-накрая стартирайте играта (ред 40).

За линия 40, usr 40000 е изразът, който прави трика, като се обажда на монтаж на позиция 40000. Инструкцията Randomize просто инициализира случайните семена, използвани от rnd, мислеше, че всъщност няма да се върне.

Така че, първите се опитват да бъдат:

  1. Натиснете "break" (повече или по-малко еквивалентно на Ctrl + C), въведете list, и постави проклятията в линия 35, т.е., след като програмата е била заредена, но все още не е изпълнена.

  2. Вместо да пишете load "" за да стартирате играта, въведете merge "" (това се използва за комбиниране на основната програма в паметта с тази в лентата). Процесът ще спре, преди да се изпълни товарачът. Това е полезно, когато товарачът е включен a poke инструкция, която е забранена BREAK.

Проблемът с тези методи беше в началотоопитите за скриване на входниците на товарача са били наивни (като например инструкция за PAPER 0: INK 0 или нещо подобно на ред 10, което прави всичко временно невидимо), но скоро ще станат много по-сложни до точката до всъщност да бъде асемблерна програма, включена в REM инструкции.

Следващата стъпка беше да се анализират заглавията накода за сглобяване, зареден след основния товарач, да приключи дъмп-адреса и дължината на кода и да създадете свой собствен товарач, в който бихте могли да включите poke инструкциите, които искате. Много списания разпространяваха този тип товарачи, които трябваше да бъдат заредени преди оригиналния (товарачът търсеше конкретни блокове, заобикаляйки първоначалния основен товарач).

Така че тогава разработчиците решиха да включатмонтажни блокове в лентата без заглавната част, както и защита на товарача. Или включване на товарач, който просто зареди монтажна програма, която замества товарача в ROM, използвайки различни скорости, без информация за заглавната част и т.н. Или да включи товарач, който зарежда блок без глава, включващ екран за представяне и код за играта.

И тогава специален хардуер, като например Multiface-1 се появи. Четене на Ръководство за няколко страници можете да видите как се извиква софтуер на мултифункционален(включен в периферната хардуерна ROM) чрез натискане на червен бутон (което предизвиква NMI (не е маскирано прекъсване), е показано меню, което ви позволява да запазите паметта в тази точка (и запаметеният код няма да има никаква защита , като по този начин отваряте пътя да създадете свой собствен товарач с потупвания) или дори да разгледате (PEEK) текущите стойности на конкретни адреси в паметта и въведете POKEдиректно (с които можете да намерите началото на тези рутинни процедури, например, които намаляват живота ви в едно).

Инструкциите на POKE обикновено са такива (това е опростяване): POKE addr, 0 или POKE addr, 201, Броя вр беше началото на рутинно намаляване на броя на наличните животи или разкриване на сблъсъка с врага.

Кодът 0 представлява инструкцията за монтаж NOP (без операция). По време на NOP процесорът не прави нищо.

Кодът 201 или C9 е монтажът RET (връщане), което означава връщане на подпрограма. В BASIC бихте нарекли подпрограма с GOSUB и се върнете от края си RETURN, При монтажа същата двойка е CALL / RET.

Ако сте имали 201, то всъщност би означавало, че една подпрограма (да речем, че изваждаме един от вашия живот) като:

9950 let lives = lives - 1
9960 return

се трансформира в:

9950 return
9960 return

Ако сте имали стойност 0, същата рутина е трансформирана в:

9950
9960 return

1 за отговор № 3

Както си спомням отдавна ... При зареждане на игра на спектър, тя първоначално се зарежда в малка програма за зареждане и се стартира, че касетата продължава и се зарежда основната част от програмата. Последната команда в програмата за товарене след това издава команда, която нарежда всичко, играта. Така че, както си спомням, трябва да поставите лентата на пауза, след като програмата за товарене е заредена, и да спрете кода на кода от автоматично издаване на окончателния щрих, след това продължава. След това веднъж насипно състояние е заредена, вие издавате си размах от командния ред, а след това оригиналната барака, за да стартирате играта. Програмата за товарача ще бъде заредена след първия набор от червени и сини линии, последвани от много къси жълти и сини линии на екрана (тъй като си спомням, че отпечатва името на програмата, намерена в тази точка). Спрете касетата, натиснете Break, след това List, за да видите кода. Най-добър късмет и голям въпрос!


1 за отговор № 4

Кодовете POKE, отпечатани в списания ZX SpectrumОбикновено се очаква да имате приставка с хардуерно устройство (например Multiface). След като заредите играта, можете да натиснете бутона Multiface, за да спрете играта, да влезете в POKE и след това да се върнете обратно в играта.

Без специално устройство, с което трябва да играетепрограмите за зареждане, както е описано в другите отговори. Трябва да заредите първоначалната програма за малкия товарач и след това BREAK в кода. Ако имате късмет, кодът ще направи нещо просто с товарене в останалата част от играта и след това ще изпълни действителната машинно кодова игра, използвайки RANDOMIZE USR повикване. В този случай можете да промените програмата BASIC на товарача, за да направите POKES след играта е заредена, но преди началото на играта.

Въпреки това, много игри правят това трудно, защото тевключете персонализиран код за зареждане. Това често се записва в кода на машината, вграден в малката програма BASIC в изявленията REM. Кодът на машината ще зареди играта и ще я изпълни и тъй като никога не връща контрол върху BASIC кода, няма възможност да влезе в POKE. Ако сте достатъчно посветени, можете да опитате да промените кода на машината така, че да върнете контрола обратно към BASIC, така че да можете да се откажете или да изпълнявате POKE чрез команди за машинен код. Това е доста трудно, защото ако си спомням справедливо, редакторът използваше за катерене на линии, съдържащи неподлежащи на печат знаци в изявленията REM. Имаше софтуерни инструменти като RoyBot, които могат да ви помогнат да промените кода в паметта.

Някои разработчици на игри наистина направиха лудост, за да предотвратят хакването на игри, като например въвеждането на кода на товарача, който всъщност презаписа своя собствен код, докато се изпълнява


Свързани въпроси


Коментари (0)

Добави коментар