POKE och PEEK

Övervaka en CBM 3016 med ett Commodore BASIC- program som använder PEEK och POKE i en FOR-loop i rad 100 .

POKE ( engelska att peta = fastnat, Rota) är en instruktion av den BASIC programmeringsspråket som används för att överföra ett värde anges som ett tal ( en oktett eller bitgrupp för 8-bitarsarkitekturer ) till den specificerade minnesadressen i adressrymden för den processorn (CPU) spara. Dess motsvarighet är PEEK- tolkfunktionen ( engelska att kika = titta, kika, slå upp), som används för att läsa från en adress; avläst värde överförs till BASIC-programmet som returvärde .

Säcken instruktion kan användas, till exempel för att manipulera innehållet i en minnescell i den datorns huvudminne . Dessutom vara med POKE och PEEK hårdvarustyrregister av perifera anordningar hos datorn för BASIC-programmet tillgängligt om datorsystemet med minnesmappade I / O- verk.

PEEK- och POKE-kommandona introducerades av Bill Gates och Paul Allen 1975 på Altair BASIC- programmeringsspråket .

fungera

POKE-kommandot anropar en rutin för BASIC- tolk , som utför skrivåtkomst med de två parametrarna för adress och värde . Peek-funktionen utvärderar dess parameter som en adress, läser åtkomst till denna adress och överför resultatet som ett returvärde till BASIC-programmet.

formatera
POKE Adresse, Wert
Wert = PEEK(Adresse)

Adressens maximala värde beror på bredden på adressbussen . Det maximala värdet beror på databussens bredd . För 8-bitars arkitekturer är typiska värden 0 till 65535 för en 16-bitars adress och 0 till 255 för ett 8-bitars värde. Om det underliggande datorsystemet har luckor i sin allokering av minnet och inga adresseringsfel - undantagshantering implementeras, gör en POKE-instruktion till en ledig adress ingenting, medan motsvarande PEEK-funktion ger ett odefinierat returvärde.

använda sig av

I en tid präglad av hemdatorer , var kommandot POKE används ofta, eftersom det är det enda sättet för grundläggande program på många system att använda vissa grafik eller ljudfunktioner på datorn, som stöds av hårdvara som används, men inte av im BASIC-tolkens inbyggda kommandon stöds. BASIC-programmet får tillgång till hårdvarukontrollregistret och styr hårdvaran direkt; en uppgift som enligt samtida terminologi skulle falla för en enhetsdrivrutin .

exempel
POKE 53265, PEEK(53265) OR 32
Ställ in genom att läsa med hjälp av PEEK, modifiera med ELLER 32 och skriva tillbaka med POKE- bit 5 (den med värdet 25  = 32) i register 17 på periferimodulen VIC II ( videodisplaystyrenheten ) i en Commodore 64 ; där har VIC II (genom minneskartad I / O ) basadressen D000 16  = 53248, därför är registret 17 vid adressen 53248 + 17 = 53265. Inställningsbiten 5 i detta register gör att bitmappsgrafikläget aktiveras. Kombinationen med OR har effekten att alla lästa bitar skrivs tillbaka oförändrade - förutom bit 5, som ställs in oavsett status. Analogt till detta, bit 5 med POKE 53265, NOT(PEEK(53265)) NOR 32eller POKE 53265, PEEK(53265) AND NOT(32)raderat tillstånd oberoende och med POKE 53265, NOT(PEEK(53265)) XNOR 32eller POKE 53265, PEEK(53265) XAND NOT(32)tillståndsberoende omkopplare ( växla vara).

Med POKE-instruktioner kan specifika data för operativsystemet ändras på ett riktat sätt för att uppnå de effekter som användaren önskar - till exempel ändra nyckelupprepningen . Ett annat exempel från denna kategori för PEEK-funktionen är att bara känna igen att du trycker på Skift-tangenten (utan en annan knapp) när operativsystemet inte erbjuder något annat sätt.

exempel
POKE 650, 128
Aktivera nyckelupprepning för alla nycklar i en Commodore 64. Vid adress 650 (en normal huvudminnesadress i operativsystemets hanteringsdata) letar tangentbordsfrågan i operativsystemet upp hur nyckelupprepningen ska fungera. Värdet 128 gör att alla tangenter upprepas; Alternativ är ingen tangent upprepas och endast markör- och raderingsknappar och mellanslag upprepas.
exempel
IF PEEK(653) AND 1 THEN …
Fråga om skiftindikatorbiten (bit 0 (med värdet 2 0  = 1) för byten vid adress 653) för operativsystemets tangentbordsfråga i en Commodore 64. Delen efter THEN exekveras bara när shift-tangenten för närvarande trycks in .

En annan applikation är ett BASIC-program som använder en underrutin skapad på maskinspråk för sin uppgift . I stället för att ladda denna subrutin (ibland bara några byte) som en separat binär fil från masslagringsenhet (i hemdator eran ofta enkel kassettbandspelare eller datauppsättningar ) i minnet är bilden av subrutinen lagras som en sekvens av tal i BASIC-programmet. Under initialiseringsfasen skriver BASIC-programmet denna minnesbild i en slinga med hjälp av POKE-instruktioner till önskade målminnesadresser så att subrutinen sedan kan anropas dit. Det är också känt att lappa (modifiera) maskinspråksprogram med riktade POKE-instruktioner efter laddning från masslagringsenheten och innan programmet startas - i synnerhet för fusk av dataspel. I den relevanta scenen är till exempel fusk kända som spelarens karaktär är osårlig eller åtminstone betydligt mer "liv" finns tillgängligt. Kombinationen av värde och adress är individuell för varje program eller spel (bestäms till exempel med användning av omvändteknikmetoder ) och kallas ibland en POKE i sig (t.ex. "POKE-lista" i betydelsen att lista fusk ).

För att som programmerare ska veta vilka kombinationer av adresser och värden som uppfyller ett önskat syfte, är det bra att studera dokumentation (bruksanvisning och datablad) och annan litteratur (inklusive artiklar i facktidskrifter) om kringkomponenterna, system etc.

Användningen av POKE-instruktioner minskar ofta läsbarheten och förståelsen av programtexten. Samtidigt är det anledningen till att sådana program knappast är bärbara mellan olika datormodeller och deras olika chipsets - POKE-kommandon kan ofta inte överföras mellan olika modeller eller serier av samma tillverkare. Exemplen ovan för tangentbordskontroll för Commodore 64 kan överföras till Commodore VC 20 , eftersom operativsystemen är mycket lika i detta avseende. Videodisplaystyrenheterna på båda datorerna skiljer sig inte bara i sin position i minnesallokeringsplanen utan också i sin interna struktur - här: det finns inget bitmappsgrafikläge på VC 20 - så att exemplet för att aktivera bitmappsgrafikläget på VC 20 har inte korrespondens.

Eftersom administrativa data för operativsystemet också kan skrivas över med POKE-kommandot, resulterar slarvig användning ofta inte i ett korrekt felmeddelande utan i en datorkrasch  - med potential för förstörelse av programmet eller data i minnet. Oönskade optiska eller akustiska effekter kan också uppstå om fel uppstår i programmeringen av hårdvarukontrollregistret. I bästa fall händer ingenting. Den Felsökning kraftigt kompliceras av effekterna som nämns.

Dagens mening

Användningen av POKE är föråldrad i dagens system och använder nuvarande BASIC-varianter. Dagens CPU: er använder endast MMU för adressering , som abstrakterar den logiska adressen från den fysiska och förhindrar direkt minnesmanipulation genom speciella skyddsmekanismer ( minnesskydd ). Dessutom, med få undantag, har moderna operativsystem inte längre en statisk minnesallokeringsplan där visst innehåll alltid kan hittas på samma adresser. Hårdvaruresurser nås då inte via fasta adresser utan via enhetsdrivrutiner som i sin tur läser och skriver till minnesområden som tillhandahålls för detta ändamål.

webb-länkar

POKE i C64-Wiki (med applikationsexempel)

Individuella bevis

  1. POKE. I: Microsoft QuickBasic 4.5 Advisor. Microsoft, 1990, öppnades 27 februari 2014 .
  2. TITTA. I: Microsoft QuickBasic 4.5 Advisor. Microsoft, 1990, öppnades 27 februari 2014 .
  3. N.Montfort, P.Baudoin, J.Bell, I.Bogot, J.Douglass och andra. 10PRINT CHR $ (205,5 + RND (1)); : GOTO 10 Cambridge, MIT Press (2013) ISBN 978-0-262-01846-3 s. 171 ( Online. (PDF 50 MB) Åtkomst 26 februari 2014 (engelska). )
  4. POKE. I: C64 Wiki. Hämtad 14 april 2015 .
  5. Commodore 64 minneskarta. Hämtad 16 april 2015 .