/ / POKE i ZX Spectrum - zxspectrum

POKE i ZX Spectrum - zxspectrum

Jeg spiller med en gammel ZX Spectrum 48k og jeg lurer på hvor nøyaktig det er mulig å gå inn POKE-koder.

Du laster et spill med et bånd - så bryter du ut av programtypen i POKE-setningene og begynner å kjøre programmet igjen?

Jeg har gjort mye med å søke på dette, men har ikke vært i stand til å finne nøyaktig hvordan dette er gjort, slik at noen potensielle kunder på dette ville bli verdsatt.

svar:

2 for svar № 1

De fleste Spectrum-programmer bruker en to-trinns prosess for å starte et spill:

  1. Last inn og kjør et lite BASIC program
  2. Det lille BASIC-programmet laster deretter mye lengre maskinkode og hopper deretter til maskinens kodeinngangspunkt (f.eks. RANDOMIZE USR 28455).

Hvis du klarer å stoppe mellom disse trinnene, kan du POKE rundt (for å øke antall liv, ...) og deretter starte maskinens kode med RANDOMIZE USR 28455, forutsatt at du på en eller annen måte fant ut den riktige adressen.

Når et maskinprogram er i gang, er det vanligvis ingen måte å stoppe det og komme tilbake til BASIC tolken. Med mindre maskinprogrammet gir noen eksplisitt (eller utilsiktet) måte å gjøre det på.


2 for svar № 2

Først av alt, meningen med PEEK og 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

De fleste programmer lastet et lite BASIC program som heter loader. Det var noe som helst:

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

Betydningen bør være enkel: Last inn en skjermpresentasjon (linje 20) for å holde brukeren underholdt mens samlerprogrammet (selve spillet) laster (linje 30), og til slutt starte spillet (linje 40).

Om linje 40, usr 40000 er uttrykket som gjør kunsten, ringer forsamlingen på posisjon 40000. Instruksjonen Randomize bare initialiserer det tilfeldige frøet som brukes av rnd, trodde det faktisk aldri kommer tilbake.

Så, de første forsøkene ville være:

  1. Trykk på "break" (mer eller mindre lik Ctrl + C), skriv inn list, og legg pokes i linje 35, dvs. når programmet er lastet, men det har ikke blitt utført ennå.

  2. I stedet for å skrive load "" For å starte spillet, skriv inn merge "" (dette ble brukt til å kombinere grunnprogrammet i minnet med det i tape). Prosessen stopper før du utfører lasteren. Dette er nyttig når lasteren inkluderte en poke instruksjon som deaktivert BREAK.

Problemet med disse metodene var det førstforsøkene på å skjule lasterinnrene var naive (som for eksempel en instruksjon for PAPER 0: INK 0 eller noe lignende på linje 10, noe som gjør alt midlertidig usynlig), men snart ville de bli mye mer komplekse, opp til punktet til faktisk være et assembler program inkludert i REM bruksanvisning.

Det neste trinnet var å analysere overskriftene tilmonteringskode lastet etter grunnlasteren, konkluderer dumpadressen og lengden på koden, og lag din egen laster der du kan inkludere poke instruksjoner du ønsket. Mange magasiner distribuerte denne typen lastere, som var ment å lastes før den opprinnelige (lasteren så etter bestemte blokker, omgå den originale grunnleggende lasteren).

Så da utviklere besluttet å inkluderemontering blokker i tape uten hodene, samt beskytte lasteren. Eller inkludere en laster som bare laster inn et monteringsprogram som erstatter lasteren i ROM, bruker forskjellige hastigheter uten informasjon om header etc. Eller inkluder en laster som laster en headless blokk, inkludert presentasjonsskjermen og koden for spillet.

Og så spesiell maskinvare som Multiface-en dukket opp. Leser Multiface-1 manual Du kan se hvordan man bruker multiface s programvare(inkludert i den eksterne maskinvareens ROM) ved å trykke på en rød knapp (som provoserte en NMI (ikke maskert avbrudd), ble det vist en meny som lar deg lagre minnet på det tidspunktet (og den lagrede koden vil være fri for beskyttelse , og dermed åpne banen for å lage din egen laster med pokes), eller til og med undersøke (PEEK) nåværende verdier ved bestemte adresser i minnet og skriv inn POKEs direkte (som du kan finne begynnelsen på disse rutinene, for eksempel som reduserer livet ditt i en).

POKEs instruksjoner var vanligvis av den typen (dette er en forenkling): POKE addr, 0 eller POKE addr, 201. Nummeret adr var begynnelsen på en rutine som reduserte antall tilgjengelige liv, eller oppdaget sammenstøt med en fiende.

Koden 0 er instruksjonen for monterings NOP (ingen operasjon). Under en NOP, gjør CPU ingenting.

Koden 201 eller C9 er samlingen RET (retur) instruksjon, som betyr å returnere for en subrutine. I BASIC vil du ringe en subrutine med GOSUB og gå tilbake fra slutten med RETURN. I asssembly er det samme paret CALL / RET.

Hvis du hadde en 201, så ville det effektivt bety at en subrutine (si å trekke en til dine liv) som:

9950 let lives = lives - 1
9960 return

ble forvandlet til:

9950 return
9960 return

Hvis du hadde en 0-verdi, ble den samme rutinen omformet til:

9950
9960 return

1 for svar № 3

Som jeg husker for lenge siden .... Når et Spectrum-spill laster, laster det i utgangspunktet i et lite lasterprogram, og kjører det, båndet fortsetter og hoveddelen av programmet lastes inn. Den siste kommandoen i lasterprogrammet utsteder deretter en poke-kommando som kaller alt lastet og starter spillet. Så, som jeg husker, må du sette pause på båndet når lasterprogrammet har lastet inn, og stopp koden fra automatisk å utgi det siste pokeet, og fortsetter deretter. Så når massen har lastet, utsteder du ditt poke fra kommandolinjen, og deretter den opprinnelige poke for å starte spillet. Lasterprogrammet lastes etter det første settet med røde og blå linjer, fulgt med de veldig korte gule og blå linjene på skjermen (som jeg husker det skriver navnet på programmet som er funnet på dette punktet). Stopp båndet, trykk på Bryt, deretter Liste for å se koden. Lykke til og stort spørsmål!


1 for svar № 4

POKE-kodene skrives ut i ZX Spectrum-tidsskrifterVanligvis forventes det at du har en plugin-maskinvareenhet (for eksempel Multiface). Når spillet er lastet, kan du trykke på Multiface-knappen for å stoppe spillet, legge inn POKE-ene, og deretter tilbake til spillet.

Uten en spesiell enhet, må du leke medLoader-programmene, som beskrevet av de andre svarene. Du må laste inn det første smålasteprogrammet og deretter BREAK inn i koden. Hvis du er heldig, vil koden gjøre noe enkelt med lasting i resten av spillet og deretter utføre det aktuelle maskinkodespillet ved hjelp av RANDOMIZE USR-anropet. I dette tilfellet kan du endre loader BASIC-programmet for å gjøre POKES etter spillet har lastet inn, men før spillet er startet.

Men mange spill gjør dette vanskelig fordi deinkludere tilpasset loader kode. Dette er ofte skrevet i maskinkode innebygd i det lille BASIC-programmet i REM-setninger. Maskinkoden vil laste spillet og utføre det, og fordi de aldri returnerer kontrollen til BASIC-koden, er det ikke mulig å legge inn POKE-ene. Hvis du er dedikert nok, kan du prøve å endre maskinens kode for å returnere kontrollen tilbake til BASIC, slik at du kan veksle bort, eller ellers utføre POKE'ene via maskinkodeanrop. Dette er ganske vanskelig, fordi hvis jeg husker med rette, brukte redaktøren å kryptere linjer som inneholder ikke-skrivbare tegn i REM-setningene. Det var programvareverktøy som RoyBot som kan hjelpe deg med å endre kode i minnet.

Noen spillutviklere gjorde virkelig galne ting for å forhindre spillet hacking, for eksempel implementering av loader kode som faktisk overskrev sin egen kode mens den ble henrettet


Beslektede spørsmål


Kommentarer (0)

Legg til en kommentar