/ / POKE i ZX Spectrum - zxspectrum

POKE i ZX Spectrum - zxspectrum

Jeg spiller med et gammelt ZX Spectrum 48k og jeg undrer mig over, hvor præcis det er muligt at komme ind POKE-koder.

Du indlæser et spil med et bånd - så på en eller anden måde brydes ud af programtypen i POKE-udsagnene og begynder at køre programmet igen?

Jeg har lavet en masse søgning på dette, men haven har ikke kunnet finde ud af, hvordan dette er gjort, så det vil blive meget værdsat, at der er nogen ledere på dette.

svar:

2 for svar № 1

De fleste Spectrum-programmer bruger en to-trins proces til at starte et spil:

  1. Indlæs og kør et lille BASIC program
  2. Det lille BASIC-program lægger så meget længere maskinkode og hopper derefter til maskinens kodens indtastningspunkt (f.eks. RANDOMIZE USR 28455).

Hvis du klarer at stoppe mellem disse trin, kan du POKE omkring (for at øge antallet af liv, ...) og derefter starte maskinens kode med RANDOMIZE USR 28455, forudsat at du på en eller anden måde fandt ud af den rigtige adresse.

Når et maskineprogram kører, er der normalt ingen måde at stoppe det og komme tilbage til BASIC tolken. Medmindre maskinprogrammet giver en vis eksplicit (eller utilsigtet) måde at gøre det på.


2 for svar № 2

Først og fremmest betyder 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 indlæste et lille BASIC program kaldet loader. Det var noget som:

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

Betydningen bør være ligetil: Indlæs en skærmpræsentation (linje 20) for at holde brugeren underholdt, mens assemblerprogrammet (selve spillet) laster (linje 30) og endelig starte spillet (linje 40).

Om linje 40, usr 40000 er det udtryk, der gør tricket, kaldende samling i position 40000. Instruktionen Randomize indleder bare det tilfældige frø, der anvendes af rnd, troede det faktisk aldrig kommer tilbage.

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

  1. Tryk på "break" (mere eller mindre ækvivalent med Ctrl + C), indtast list, og sætte pokes i linje 35, dvs. når programmet er blevet indlæst, men det er ikke blevet udført endnu.

  2. I stedet for at skrive load "" For at starte spillet skal du skrive merge "" (dette blev brugt til at kombinere det grundlæggende program i hukommelsen med det i tape). Processen stopper inden du udfører læseren. Dette er nyttigt, når læsseren inkluderede a poke instruktion, der er deaktiveret BREAK.

Problemet med disse metoder var det førstForsøgene om at skjule læsserinnerne var naive (som f.eks. en PAPER 0: INK 0 instruktion eller noget lignende i linje 10, hvilket gør alt midlertidigt usynligt), men snart ville de blive meget mere komplekse, op til det punkt at faktisk være et assembler program inkluderet i REM instruktioner.

Det næste skridt var at analysere overskrifterne påsamlingskode indlæst efter grundlæsseren, konkluderer dumpadressen og længden af ​​koden og opretter din egen loader, hvor du kan medtage poke instruktioner du ønskede. Mange magasiner distribuerede denne slags læssere, som skulle læsses før den oprindelige (læseren kigget efter specifikke blokke, omgå den oprindelige grundlaster).

Så besluttede udviklere at medtagemontering blokke i tape uden hovedene, samt beskyttelse af lasteren. Eller inklusiv en loader, der bare indlæser et samlingsprogram, der erstatter loader i ROM, ved hjælp af forskellige hastigheder, uden headeroplysninger mv. Eller med en loader, der lægger en hovedløs blok, herunder præsentationsskærmen og koden til spillet.

Og så speciel hardware som f.eks Multiface-1 dukkede op. Læser Multiface-1 manual Du kan se, hvordan man anvender multifaces software(inkluderet i den perifere hardware s ROM) ved at trykke på en rød knap (som provokerede en NMI (ikke maskeret afbrydelse), blev der vist en menu, som giver dig mulighed for at gemme hukommelsen på det tidspunkt (og den gemte kode vil være fri for nogen beskyttelse , hvorved banen åbnes for at skabe din egen læsser med pokes), eller endda undersøge (PEEK) aktuelle værdier ved bestemte adresser i hukommelsen og indtast POKEs direkte (som du kunne finde begyndelsen af ​​disse rutiner, for eksempel, der mindsker dine liv i en).

POKEs instruktioner var normalt af den art (det er en forenkling): POKE addr, 0 eller POKE addr, 201. Nummeret addr var begyndelsen på en rutine, der mindsker antallet af tilgængelige leve eller opdager sammenstød med en fjende.

Koden 0 er indretningen NOP (no operation). Under en NOP gør CPU ingenting.

Koden 201 eller C9 er samlingen RET (retur) instruktion, hvilket betyder at vende tilbage til en subrutine. I BASIC vil du ringe til en subrutine med GOSUB og vende tilbage fra sin ende med RETURN. I asssembly er det samme par CALL / RET.

Hvis du havde en 201, så ville det effektivt betyde, at en subrutine (siger at trække en til dine liv) som:

9950 let lives = lives - 1
9960 return

blev omdannet til:

9950 return
9960 return

Hvis du havde en 0-værdi, blev den samme rutine omdannet til:

9950
9960 return

1 for svar № 3

Som jeg husker for længe siden .... Når et Spectrum spil laster, lægger det i første omgang i et lille loader-program, og kører det, båndet fortsætter, og hovedparten af ​​programmet er indlæst. Den sidste kommando i loader-programmet udsender derefter en poke-kommando, der kalder alt ladet og starter spillet. Så som jeg husker, skal du standse båndet, når loaderprogrammet er indlæst, og stop kodekoden fra automatisk udstedelse af det sidste poke og fortsætter derefter. Så når massen er lastet, udsteder du dit prik fra kommandolinjen, og derefter den originale poke for at starte spillet. Loader-programmet lægges efter det første sæt af røde og blå linjer efterfulgt af de meget korte gule og blå linjer på skærmen (som jeg husker det udskriver navnet på det program, der findes på dette tidspunkt). Stop båndet, tryk på Break, og derefter List for at se koden. Held og lykke og stort spørgsmål!


1 for svar № 4

POKE-koderne udskrives i ZX Spectrum-tidsskrifterNormalt forventede du at have en plug-in hardware enhed (fx Multiface). Når spillet er indlæst, kan du trykke på multiface-knappen for at stoppe spillet, indtaste POKE'erne og derefter vende tilbage til spillet.

Uden en særlig enhed skal du lege medLoader-programmerne, som beskrevet af de andre svar. Du skal indlæse det oprindelige mindre loader-program og derefter BREAK ind i koden. Hvis du er heldig, vil koden gøre noget simpelt med indlæsning i resten af ​​spillet og derefter udføre det faktiske maskinkodespil ved hjælp af RANDOMIZE USR-opkaldet. I dette tilfælde kan du ændre loader BASIC-programmet til at gøre POKES efter spillet er lastet, men før spillet er startet.

Men mange spil gør det svært, fordi deinkludere brugerdefineret loader kode. Dette er ofte skrevet i maskinkode indlejret i det lille BASIC-program i REM-sætninger. Maskinkoden vil indlæse spillet og udføre det, og fordi de aldrig vender tilbage til BASIC-koden, er der ingen mulighed for at indtaste POKE'erne. Hvis du er dedikeret nok, kan du prøve at ændre maskinkoden for enten at returnere kontrollen tilbage til BASIC, så du kan POKE væk, eller ellers udføre POKE'erne via maskinkodeopkald. Det er ret hårdt, for hvis jeg husker rigtigt, brugte redaktøren at kryptere linjer indeholdende ikke-skrivbare tegn i REM-sætningerne. Der var softwareværktøjer som RoyBot, der kunne hjælpe dig med at ændre kode i hukommelsen.

Nogle spiludviklere gjorde virkelig vanvittige ting for at forhindre spil hacking, såsom implementering af loader kode, der faktisk overskredet sin egen kode, mens den blev henrettet


Beslægtede spørgsmål


Kommentarer (0)

Tilføj en kommentar