Apple Pascal II.2 Systemprogrammierung

  • Hallo,


    ich versuche in Apple Pascal II.1 auf die Memory Map im Speicher zuzugreifen und die "Unit Table" auszugeben. Eigentlich soweit nichts dramatisches.

    Laut der Memory Map von Apple Pascal 1.1 (Quelle: "All about Pascal" aus dem "Apple PugetSound Program Library Exchange" (http://www.callapple.org) Verlag) sollen diese Information im Speicher ab Adresse AA8E-AB29 liegen. Allerdings kommt bei Zugriff auf diese Speicherstellen leider nur "Schrott" auf den Bildschirm. Da es sich um ein abgeschriebenes Programm handelt, vermute ich dass die Memory Map für Apple Pascal II.1 anders aussieht als die für Apple Pascal 1.1. Wer kennt sich mit sowas aus und hat einen Rat?


    Viele Grüße aus Bremen

    Andreas

  • Nach meinem Kenntnisstand: es gibt das Apple Pascal 1.1 (wie auch 1.0, 1.2 und 1.3). Das ist an Apple lizensiert. Und es gibt das p-System übergeordnet in vier Versionen mit einer römischen Ziffer beginnend. II.1 war die Basis für Apple Pascal 1.0.


    Wesentlich: Du kannst dich nicht auf absolute Adressen verlassen.


    Kurzer Blick in den p-Code-Interpreter vom 1.1 (von Willi Kusche disassembliert): schau mal ab $BD9E


    Gruß, Ralf

  • Hallo Ralf,


    sorry - ich war etwas ungenau (bzw. falsch) mit meinen verwendeten Systembezeichnungen:

    Das "Problem(chen)" existiert unter Apple II Pascal 1.2 Based on UCSD Pascal II.1.

    Das abgeschriebene Programm und die dahinterliegende mir zur Verfügung stehende "Memory Map" war wohl für Apple II Pascal 1.1 geschrieben. Hab das eben gerade mit den Original Apple Disketten getestet und (wie erwartet): Auf Apple II Pascal 1.1 läuft das Programm einwandfrei und gibt die UNIT Table richtig aus. Das Problem ist also, dass die Adressen offensichtlich gewandert sind und bei X'AA8E ist keine UNIT Table mehr abgelegt.

    Die Frage ist jetzt: gibt es überhaupt eine Memory Map für Apple II Pascal 1.2 und wo bekommt man die her...


    Viele Grüße

    Andreas

  • Hallo Ralf,


    sehr interessante Quelle! Dank erstmal dafür. Ich habe übrigens die 64k Variante im Einsatz.


    Hab mal kurz das Inhaltsverzeichnis überflogen, aber es sieht wohl so aus, dass die Memory Map (wie es sie unter 1.1 noch gegeben hat), so wohl nicht mehr existiert. Zumindest habe ich bis jetzt keinen Hinweis darauf gefunden. Das scheint sich komplett geändert zu haben. Naja - ist ja eigentlich auch keine große Überraschung. Interessant wäre zum Beispiel auch, wo unter Pascal 1.2 Datum und Uhrzeit für den Filer abgelegt werden...

    Ich würde nämlich gerne beim Startup das aktuelle Datum/Uhrzeit meiner AUGE-Uhr in das Betriebssystem einbringen, sodass die Dateien dann auch gleich mit dem richtigen Zeitstempel versehen werden.


    Viele Grüße

    Andreas

  • Irgendwo im p-Code-Interpreter gibt's eine Funktion, die "TIME" heißt. Die schreibt im Apple Pascal prinzipiell vier Nullen an irgendwelche Stellen. Soviel aus der Erinnerung aus dem 1.1. Bei 1.2 wird's kaum anders sein. TIME ist kein p-Code-Befehl.


    Im "Hyde p-Source 1983" fand ich was, aber das bezieht sich auch auf Pascal 1.1: "$E841-$E85C TIME p-code routine- Two pointers are passed on the 6502 hardware stack. TIME stores zeros into the words pointed at by these pointers."

    D.h. Du solltest TIME finden und beim Start durch AUGE-Uhr-Code patchen. Dann wird bei jedem Aufruf der TIME-Funktion der aktuelle Zeitstempel genommen.


    Kennst Du den Aufbau vom p-Code-Interpreter und vom BIOS?


    Gruß, Ralf

  • Nee - nicht so wirklich. Aber ich hab hier reichlich Literatur dazu. Da müsste ich mich dann reinbeissen ;)

    Ich habe die Wälzer von http://www.callapple.org, also z.B. "Whats where in the Apple II", "All About Pascal" (leider aber nur die 1.1 Version)

    und dazu noch "Profitips und Techniken für Apple-UCSD Pascal" von Tolksdorf. Aber auch der bezieht sich nur auf 1.1 und geht nicht auf p-Code Level bzw. BIOS...

  • Ich glaube, daß Deine Lektüre "etwas" zu oberflächlich ist. Für 1.1 gibt's ziemlich viele Internas bis hin zu den Quelltexten. Für 1.2 und 1.3 gibt's fast nichts, AFAIK. Das muß man sich aus 1.1 ableiten.


    Schaue Dir hiervon ein "paar" Bücher an, man weiß ja nie, wie lange die noch im Netz sind:

    http://pascal.hansotten.com/uc…em/apple-pascal/apple-ii/

    Das Buch von Randall Hyde ("A Guide to the Apple Pascal System") ist ein sehr wichtiges.


    Bei allen Aktionen im Netz bedenke, daß es in USA einen sturen Hüter der (scheinbaren) Rechte am p-System, wenn auch Version IV, gibt.


    Gruß, Ralf

  • Hallo Ralf,


    Danke für die Literatur Liste. Da sind einige sehr interessante Werke dabei. Ich werde mir mal den Randall Hyde genauer anschauen. Vielleicht bringt der die entscheidenden Hinweise. Ich will ja auch nicht am ganzen P-Code System herumfrickeln sondern nur die wichtigen Speicherstellen erfahren, um das Datum der Uhr ins System zu bringen. Kann ja eigentlich nicht so wahnsinnig schwer sein. Aber - in der Tat - man findet sehr viele Hinweise die für Pascal 1.1 gedacht sind, aber so gut wie nichts für 1.2 (bzw. Nachfolger) :(


    Viele Grüße

    Andreas

  • Hast Du die Funktion TIME verfolgt? Deren Adresse steht in irgendeiner bekannten Tabelle. Der Code ist somit austauschbar. Das sollte in Apple Pascal 1.2 nicht anders sein.


    Es wäre sowieso keine gute Idee Daten an einer bestimmten Adresse im Speicher zu überschreiben, denn das ist das p-System, also ein Betriebssystem mit Dynamik, und kein DOS 3.3 für den Apple II oder MS-DOS für einen IBM Home Computer.


    Gruß, Ralf

  • Gruß Torsten

    BFZ MFA, ZX80Core, AX81, ZX81, ZX81NU, Spectrum+, Harlequin, MSX VG8010, Amstrad NC100, Cambridge Z88, C64, C128D, Amiga 500 & 1200, Atari Portfolio, HP200LX, IBM PC5155, TP755c, TP755cx, T20, T41, T61, PS/2 (Model 40SX), PS/2E, Accura 101, Apple //e, Sharp PC1401 & PC1403H, TI59 m. PC-100c, HP48SX & HP48GX


    An die Person, die meine Schuhe versteckt hat, während ich auf der Hüpfburg war: Werd' erwachsen! :motz:


    ::matrix::

  • "Offizielle" Doku geht selten so tief, daß die ursprüngliche Frage beantwortet wird. Das ist so beim p-System :( Wie man zusätzliche Treiber für blockorientierte Geräte einhängt, ist beschrieben. Aber die Datums-/Zeitfunktion wurde nicht als eine solche betrachtet, die man nachträglich ergänzen können soll.


    Im "Apple II Pascal 1.3"-Buch (Deinem 1. Link) finden sich dezente Hinweise, die mir mittlerweile nicht mehr geläufig waren:

    Der p-Code kennt den Befehl 158 oder CSP für Call standard procedure. Dahinter verbirgt sich eine kleine Bibliothek an nützlichen Funktionen, die bereits in die "CPU" eingebaut wurden. Daher ist der Befehl "158 09" (TIM) genau der, den ich oben erwähnte. Die Tabelle für die CSP-Adressen findet sich in den 1.1-Listings. Vermutlich(!) sind sie auch im 1.2- und 1.3-Interpreter noch an derselben Stelle hinter der wichtigsten Tabelle, der mit den p-Code-Befehlen.


    Beschreibungen zum p-System der Version IV.x sind nicht unbedingt hilfreich, weil dort etliche, auch grundlegende, Strukturen geändert wurden.


    Gruß, Ralf

  • Hallo Torsten,


    das Update Manual zu 1.2 habe ich. Hilft aber leider nicht weiter...

    Mein Vorhaben: ich versuche das Datum der AUGE Uhr in das Apple Pascal 1.2 System zu bringen. Für Apple Pascal 1.1 ist das relativ einfach (die Adressen sind bekannt) aber bei 1.2 hat sich das leider komplett geändert. Das ist das Problem. Jetzt bin ich auf der Suche, wo die Datum Informationen in 1.2 gespeichert sind.


    Viele Grüße

    Andreas

  • Wie wäre es denn mal mit einem echten Hackeransatz ... das Datumsformat sollte ja bekannt sein und in den Bücher stehen, der Rechner hat 64kB oder 128kB oder sowas und die sucht man einfach auf das Muster hin durch. Wenn man sich das vereinfachen will kann man auch vorher noch das Datum so setzen, daß man es auch schön wiederfindet.

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • Hmh - interessanter Ansatz ;)

    Andererseits, irgendjemand muss doch schon mal versucht haben, das Datum aus einem Programm heraus zu setzen. Es gibt sehr viele Beispiele und Listings für Apple Pascal 1.1 aber bislang nicht ein einziges für Apple Pascal 1.2. Notfalls mach ich halt ein Downgrade und gehe wieder auf Apple Pascal 1.1 zurück.

  • Gruß Torsten

    BFZ MFA, ZX80Core, AX81, ZX81, ZX81NU, Spectrum+, Harlequin, MSX VG8010, Amstrad NC100, Cambridge Z88, C64, C128D, Amiga 500 & 1200, Atari Portfolio, HP200LX, IBM PC5155, TP755c, TP755cx, T20, T41, T61, PS/2 (Model 40SX), PS/2E, Accura 101, Apple //e, Sharp PC1401 & PC1403H, TI59 m. PC-100c, HP48SX & HP48GX


    An die Person, die meine Schuhe versteckt hat, während ich auf der Hüpfburg war: Werd' erwachsen! :motz:


    ::matrix::

  • Genau durch den Ordner blättere ich gerade.


    Appendix D beschreibt Zugriff auf Karten. Das könnte helfen.

    Genau... deswegen habe ich das hochgeladen... da ist auch das Thema Clock zumindest mit einem Eintrag aufgeführt.

    Gruß Torsten

    BFZ MFA, ZX80Core, AX81, ZX81, ZX81NU, Spectrum+, Harlequin, MSX VG8010, Amstrad NC100, Cambridge Z88, C64, C128D, Amiga 500 & 1200, Atari Portfolio, HP200LX, IBM PC5155, TP755c, TP755cx, T20, T41, T61, PS/2 (Model 40SX), PS/2E, Accura 101, Apple //e, Sharp PC1401 & PC1403H, TI59 m. PC-100c, HP48SX & HP48GX


    An die Person, die meine Schuhe versteckt hat, während ich auf der Hüpfburg war: Werd' erwachsen! :motz:


    ::matrix::

  • da ist auch das Thema Clock zumindest mit einem Eintrag aufgeführt.

    Ich mag aufkommende Euphorie nur ungern dämpfen, aber die AUGE-Uhrenkarte enthält weder die Kennungen des Firmware-Protokolls noch entsprechenden Code. Dieser Code ist einzig auf den Betrieb mit DOS 3.3 und dem Code aus den ROMs ausgerichtet. Der ROM-Code ist nicht verfügbar, während das p-System läuft, da für die Tastatur/Eingabe ganz anderer Code (aus dem p-System-BIOS) verwendet wird.


    Genau aus diesem Grund gibt's die Bibliotheksfunktionen fürs p-System, die zunächst eine eigene Suche und Erkennung der AUGE-Karte durchläuft, um danach mit dem RTC-Chip zu spielen.


    Gruß, Ralf

  • Moin


    bin nach intensiven Internet Recherchen auf einen Teil einer Tutorial Series von Stuart Bell (publiziert im Apple User UK in 1987) gestoßen.

    Danach gibt es die Apple Pascal "Variable Area im Operating System" die durch den Pointer "syscom" adressiert wird. In dieser "Variable Area" findet man dann auch das "Current System Date". Interessanterweise ist diese Datums Variable in der Systems Global Data Area genau 132 Bytes von der Variable syscom entfernt. Dieser "thedateoffset" ist identisch (und auch laut Artikel offensichtlich erfolgreich getestet) für Apple Pascal 1.1, 1.2 und 1.3. Der Pointer syscom ist allerdings variabel für Apple Pascal 1.1, 1.2 und 1.3. Jetzt geht es also darum, herauszufinden, wo sich die Variable syscom befindet und schon hat man damit auch Zugriff auf das Systemdatum. Kann jemand sagen, wie man diese syscom Variable für Apple Pascal 1.2 findet?

  • Diese 132Byte Abstand sind in Pascal in einem Record definiert, siehe Text: syscomrec. Einen Hochsprachenprogrammierer interessiert daher nicht 132Byte, sondern diese Definition. Die steht sicher im Quelltext von System.Command und System.Filer. Die sind nur nicht offiziell frei verfügbar.


    Aus meiner verschwommenen Erinnerung: der Code von Segment #0 ist immer vorhanden. Der ist ein Teil von System.Command. Und in dem stecken auch die Basisdaten/-variablen drin wie die, die Du hier brauchst. Du schreibst jetzt ein ganz normales, kurzes Anwenderprogramm (in Pascal) und das ganz ohne Peek und Poke, die es in Pascal eigentlich gar nicht gibt und die man nicht braucht. Das wird automatisch als Segment #1 geladen und kann auf die Daten der übergeordneten Segmente zugreifen. Die wesentliche Aufgabe, deren Lösung mir nicht mehr einfällt, ist Deinem Programm zum Linken die Datenstrukturen vom Segment #0 mitzugeben.


    Dann sieht Dein Pascal-Programm tendentiell so aus:

    - ein Assemblerteil zum schnellen Ansprechen der AUGE-Uhrenkarte mit drei Funktionen: Tag, Monat, Jahr

    - ein Pascal-Teil ungefähr so:

    syscom.thedate.day := assemblerTag ();

    syscom.thedate.month := assemblerMonat ();

    syscom.thedate.year := assemblerJahr ();


    That's all folks! :)


    BTW thedate ist ein packed record und hat 16bit, AFAIR.


    Gruß, Ralf

  • Ergänzung: im Apple User September 1987, auch im Archive.org, findet sich auf Seite 49 der Code, den Du suchst. Zwar mit Peek und Poke, aber "getsyscom" ist vertreten.


    Gruß, Ralf