Diskussion:POKE und PEEK
Ausdrucksweise
Folgendes Zitat ist dem aktuellen Artikel entnommen:
- "Mittels Peek- und Poke-Befehlen erfolgte hierbei der einrichtende, aufrufende oder schreibende Speicherzugriff während der Laufzeit eines Programms, im Gegensatz zum direkten Aufruf eines vorkompilierten Programms, das schon in maschinennaher Form vorliegt."
Die Ausdrucksweise ist unklar. Gemeint ist vermutlich, dass der Speicherzugriff mittels PEEK und POKE vom Programm selbst zur Laufzeit organisiert wird (zB eigene Datenstruktur) und nicht durch den Interpreter verwaltet wird (zB bei der Belegung von Variablen). Mit der obigen Ausdrucksweise wird aber auch vernachlässigt, dass einige Realisierungen vom Interpreter (mangels BASIC-Befehlen, wie für Peripherie) nicht durchführbar sind, wie die vergleichende Darstellung (während) vermuten lassen würde. Es besteht also keine Wahlfreiheit bei der Verwendung von PEEK und POKE. Sie ist in bestimmten, nicht seltenen Fällen unumgänglich. Das wird auch im Abschnitt vor dem Zitat erläutert. Dem letzten Satz aber fehlt die Prägnanz. Vielleicht kann der letzte Autor des Artikels da nochmal bei. --92.224.196.42 16:58, 10. Aug. 2011 (CEST)
Hinweis auf die Verwendung beim C64
Wäre hier nicht auch ein Hinweis auf die Verwendung von POKEs in Computerspielen der 8-Bit-Ära schön? Ich denke, dass die meisten Personen eben diese Verwendung mit PEEK und POKE verbinden. --92.224.196.42 17:05, 10. Aug. 2011 (CEST)
POKE war nicht nur auf BASIC bezogen!
Das Poke-Kommando war beispielsweise unter CP/M ein normales Kommando, um Programmdaten zu patchen, siehe z.B. "The most useful RCP commands are CP, a built-in file copy command, and POKE, which lets you patch any part of memory, including a currently loaded program."... --nb(NB) > ?! > +/- 19:34, 15. Okt. 2009 (CEST)
- Ich habe Mitte/Ende der 1980er-Jahre exzessiv CP/M (2.2 und 3.0) benutzt und ein Poke-Befehl ist mir dabei nicht untergekommen. Vielleicht verwechselst Du das mit dem Dienstprogramm patch.com.--Rotkaeppchen68 23:25, 25. Mär. 2010 (CET)
Überarbeiten
Sorry, aber der Artikel ist zu sehr aus Sicht eines C64-Praktikers geschrieben und hat keinen einzigen Beleg.
Folgende Details fehlen:
- Anwendungsbeispiele (Sourcecode)
- Vregleich mit Assembler
- Vergleich mit Zeigern in C, mit denen man ja auch jeden Murks in fast jede beliebige Speicherzelle schreiben kann
--Jacek79 (Diskussion) 21:46, 15. Jun. 2012 (CEST)
- Nicht alles was hingt, ist ein Vergleich. Sorry, aber POKE hat mit den Zeigern in C aber auch so etwas von gar nichts zu tun. POKE entspricht einem MOVE-Befehl einer Konstanten direkt an eine diskrete Speicheradresse. Der letze Abschnitt im Artikel ist völlig verunglückt - ich werde das jetzt mal ändern.... Thomas Merbold (Diskussion) 05:12, 10. Aug. 2013 (CEST)
- Dass keine Belege vorhanden sind, sieht jeder. Wenn dieser Baustein gesetzt wird, sollte zumindest klar werden, welche Aussagen angezweifelt werden. Idealerweise mit einer Begründung. --Zinnmann d 02:35, 10. Okt. 2013 (CEST)
- Die POKE und PEEK Befehle sind wohl am ehesten mit STA und LDA in Assembler vergleichbar. Der Vergleich mit Zeigern in C hinkt nur Teilweise. Einige Speicheradressen aud die mit den Befehlen zugegriffen wird sind Zeiger des jewiligen OS oder von Interface-Chips auf Speicherbereiche. --Plaenk (Diskussion) 15:52, 25. Feb. 2014 (CET)
- Ich habe zwar kaum mit C-Zeigern programmiert, doch eine Zeigervariable enthält doch eine Speicheradresse, also eine Referenz auf einen direkt zugreifbaren Bereich im RAM. Der größte Vorteil der Zeiger gegenüber den STA-/LDA- und POKE-/PEEK-Kommandos ist: Man kann mit diesen Variablen rechnen. Zeigerarithmetik nennt man das. Verrechnet sich man bei einem Zeiger, ist unkontrollierbares, schwer reproduzierbares Verhalten des betroffenen Programms die Folge. H.i.K.: Ich würde fast schon einen echten Profi drum bitten, das PEEK-/POKE-Zeugs mit den C-Zeigern zu vergleichen. Das würde einen echt interessieren. :) --Jacek79 (Diskussion) 21:37, 25. Feb. 2014 (CET)
- Einzelne Speicheradressen können selbst wie Zeiger funktionieren, also auf andere Speicheradressen zeigen. $D018 im C64 ist Beispielsweise ein Zeiger auf den zu verwendenden Bildchirmspeicher. Das im Artikel darzustellen würde aber den Rahmen sprengen, da einzelne Systemarchitekturen dazu beschrieben werden müßten. uint_16 *p; p = &adresse; *p = wert; wäre die C-Entsprechung mit Zeiger von POKE adresse,wert. Also die Zuweisung eines Wertes an eine Adresse auf die ein Zeiger zeigt. --Plaenk (Diskussion) 22:57, 25. Feb. 2014 (CET)
- OK, dann sollten wir im Artikel das POKE-Kommando und den von Dir genannten C-Dreizeiler gegenüberstellen und kurz auf die Unterschiede zwischen BASIC-POKE und C-Zeigerarithmetik eingehen (aber möglichst ohne plattformspezifische Details). Nur drei Sätze vielleicht. Denn mit den Zeigern kennen sich viele Programmierer heute noch halbwegs aus, während das POKE-Zeugs weitgehend verdorben und vergessen ist. --Jacek79 (Diskussion) 20:11, 26. Feb. 2014 (CET)
- Das ist auch ehere unschön und irgendwie TF. Natürlich kann man die Funktion von POKE mit C Zeigern darstellen. Die eigentliche Funktion ist aber eher mit "einem MOVE-Befehl einer Konstanten direkt an eine diskrete Speicheradresse" besser Beschrieben. Zwar kann das BASIC Programm mit Adresse beliebige Arithmetische Operationen ausführen, aber die Zeigerarithetik in C meint dann doch etwas anderes. --Plaenk (Diskussion) 20:54, 26. Feb. 2014 (CET)
- OK, dann sollten wir im Artikel das POKE-Kommando und den von Dir genannten C-Dreizeiler gegenüberstellen und kurz auf die Unterschiede zwischen BASIC-POKE und C-Zeigerarithmetik eingehen (aber möglichst ohne plattformspezifische Details). Nur drei Sätze vielleicht. Denn mit den Zeigern kennen sich viele Programmierer heute noch halbwegs aus, während das POKE-Zeugs weitgehend verdorben und vergessen ist. --Jacek79 (Diskussion) 20:11, 26. Feb. 2014 (CET)
- Einzelne Speicheradressen können selbst wie Zeiger funktionieren, also auf andere Speicheradressen zeigen. $D018 im C64 ist Beispielsweise ein Zeiger auf den zu verwendenden Bildchirmspeicher. Das im Artikel darzustellen würde aber den Rahmen sprengen, da einzelne Systemarchitekturen dazu beschrieben werden müßten. uint_16 *p; p = &adresse; *p = wert; wäre die C-Entsprechung mit Zeiger von POKE adresse,wert. Also die Zuweisung eines Wertes an eine Adresse auf die ein Zeiger zeigt. --Plaenk (Diskussion) 22:57, 25. Feb. 2014 (CET)
- Ich habe zwar kaum mit C-Zeigern programmiert, doch eine Zeigervariable enthält doch eine Speicheradresse, also eine Referenz auf einen direkt zugreifbaren Bereich im RAM. Der größte Vorteil der Zeiger gegenüber den STA-/LDA- und POKE-/PEEK-Kommandos ist: Man kann mit diesen Variablen rechnen. Zeigerarithmetik nennt man das. Verrechnet sich man bei einem Zeiger, ist unkontrollierbares, schwer reproduzierbares Verhalten des betroffenen Programms die Folge. H.i.K.: Ich würde fast schon einen echten Profi drum bitten, das PEEK-/POKE-Zeugs mit den C-Zeigern zu vergleichen. Das würde einen echt interessieren. :) --Jacek79 (Diskussion) 21:37, 25. Feb. 2014 (CET)
- Die POKE und PEEK Befehle sind wohl am ehesten mit STA und LDA in Assembler vergleichbar. Der Vergleich mit Zeigern in C hinkt nur Teilweise. Einige Speicheradressen aud die mit den Befehlen zugegriffen wird sind Zeiger des jewiligen OS oder von Interface-Chips auf Speicherbereiche. --Plaenk (Diskussion) 15:52, 25. Feb. 2014 (CET)
Grundrenovierung
Nach meiner Grundrenovierung ist das hier übriggeblieben:
- <ref>Karl Heinz Koch, ''PEEKS & POKES zu Atari 600XL/800XL'', Düsseldorf: Data Becker (1985) ISBN 3-89011-082-7</ref>
Kenne die Quelle nicht, daher kann ich sie nach Umformulierung nicht guten Gewissens angeben.
- In den Zeiten der 8-Bit-Computer mit geringem Speicherplatz und niedriger Prozessorgeschwindigkeit wurden Peripheriegeräte oft direkt vom Betriebssystem unter Verzicht auf eine Treiberarchitektur angesteuert. Spezielle Funktionen konnten teilweise nur mittels Zeichenfolgen genutzt werden. Diese wurden mit POKE-Befehlen eingegeben.<ref>Beispielsweise das Löschen einer [[Datei]] von [[Diskette]], oder die Wahl besonderer [[Schriftart]]en von [[Drucker (Gerät)|Druckern]]. Vgl. ''Alles über den Commodore 64. Programmierhandbuch'', S.329-361</ref>
Die genannten Dinge wurden nicht per POKE, sondern durch Übermitteln eines 1541-DOS-Befehls (Löschen) bzw. der Steuerzeichen-Sequenzen des Druckers (Schriftarten) über PRINT#- oder OPEN-Anweisung getan. Also andere Baustelle. (Zumindest beim im Titel der Quelle genannten C64.)
- "Löschen einer Datei von Diskette" mittels POKE? Würde mich interessieren, wie das gehen soll. Ach, jetzt weiß ich's wieder. Mit einem Hardware-POKE. Dazu nahm man einen Nagel und hämmerte ihn vorsichtig auf das Magnetband... natürlich nur dort, wo man mit einer guten Lupe die Datei zuvor ausfindig gemacht hatte... Möglicherweise (ebenfalls augenzwinkernde Spekulation; bleibt bitte hier in der Diskussion) wollte die Quelle "mit Peripheriegeräten konnte per POKE direkt unter Verzicht auf Gerätetreiber bidirektional kommuniziert werden" sagen, denn das war nicht nur möglich, sondern sogar üblich - insbesondere bei selbstgebauter und an den Parallelport angeschlossenen Peripherie. --Volker Alexander (Diskussion) 03:00, 18. Aug. 2018 (CEST)
- Für andere Programmiersprachen (Compilersprachen), die nativen Code erzeugen, wird POKE grundsätzlich nicht benötigt.
Andere Programmiersprachen – ebenfalls andere Baustelle.
Die Übersetzung von to poke habe ich neu nachgeschlagen und etwas eingeschränkt.
-- Pemu (Diskussion) 20:30, 12. Apr. 2015 (CEST)