Wie erkenne ich anhand gültiger BASIC-Befehle ob ich ein Programm auf einem CP/M-System mit MBASIC starte, oder via GWBASIC auf dem PC ?

  • Ich möchte gerne weiterhin BASIC-Programme sowohl auf CP/M-80 Systemen wie auf IBM PCs unter DOS lauffähig halten, d.h. der Quellcode soll sowohl unter MBASIC / BASIC-80 als auch unter GWBASIC / BASICA laufen. Das schränkt natürlich die Wahl der BASIC-Anweisungen etwas ein, aber PEEK oder POKE bspw. geht mit GWBASIC (DOS) als auch mit MBASIC (CP/M).

    Gibt es etwas, was auf CP/M immer gleichartig ist und man abfragen kann, auf dem PC wäre dass dann idealerweise anders besetzt.

    Dazu habe ich mal ein kleines Programm geschrieben, um mir die ersten 100 Bytes des Speichers anzuzeigen:

    Unter DOS sieht das Ergebnis natürlich anders aus, aber meine Frage wäre, welcher Speicherinhalt wäre "typisch" für CP/M möglichst immer gleich (zur Unterscheidung gegenüber GWBASIC unter DOS) ? Gibt es einen Zeiger auf den Anfang der TPA bspw. ? Das kleine BASIC-Programm zum Anzeigen ist im MEM256.ZIP Archiv.


    Edit: Ok, mal ins CP/M Alteration Guide geschaut und tatsächlich was zur "Page Zero" (siehe Bildanhang) gefunden. Damit wäre wahrscheinlich schon meine Frage fast komplett beantwortet...

  • Problem gelöst. Ich frage einfach die unter CP/M existierenden zwei JMP-Befehle in der Zero-Page ab, da steht auf Position 0 und 5 immer ein $C3.

    Die (unterschiedlichen) Bildschirmausgaben mal wieder als Bilder angehängt, das etwas ergänzte Programm ebenfalls.

  • Frag den Experten ChatGPT ... :)


    "Schreibe mir ein MBASIC Programm, das herausfindet ob es unter dem Betriebssystem CP/M läuft!"


    Hier ist ein Beispielprogramm in MBASIC, das überprüft, ob es unter dem Betriebssystem CP/M läuft:

    Code
    10 REM Check if running under CP/M
    20 IF PEEK(0) = 195 AND PEEK(1) = 31 THEN PRINT "Running under CP/M" ELSE PRINT "Not running under CP/M"

    Das Programm verwendet die PEEK-Funktion, um den Inhalt der Speicherzellen 0 und 1 auszulesen. Unter CP/M befindet sich an dieser Stelle die Maschinenanweisung JP 31h, die anzeigt, dass das Programm unter CP/M ausgeführt wird.

    Das Programm verwendet eine IF-Anweisung, um zu überprüfen, ob die Speicherzellen 0 und 1 den erwarteten Wert haben, und gibt entsprechend aus, ob das Programm unter CP/M ausgeführt wird oder nicht.


    Es wird der PSP auf die JMP Anweisung überprüft. Das klingt schon besser (C3 = 195 = JP) Die Zieladresse wird je nach CP/M System variieren.

    Also die Lösung die Du schon selbst gefunden hast.


    Der PSP starte ja mit

    00–02CodeExit program (jumps to the BIOS, and is also used to find BIOS entry points).[1]
  • Ja, durch die Abfrage des Werts von PEEK(0) und PEEK(5) ist ja eine gewisse Sicherheit schon vorhanden, da es zwei Speicheradressen sind, bei nur einer wäre die Wahrscheinlichkeit 0,4%, dass mal ein zufällig vorhandener Wert das Ergebnis verfälschen könnte, meiner Meinung nach schon zuviel - aber es sind wie gesagt 2 Adressen, da ist man auf der sicheren Seite. Die Sprungadresse selbst (also das nach dem JMP Befehl) variiert ja pro CP/M System und die kann ich dazu nicht wirklich nehmen.

    Finde das ganz nett, wenn man die automatisierte Unterscheidungsmöglichkeit hat, da man im "CP/M-Fall" dann nach dem Terminal fragen kann, im "DOS-Fall" hingegen das einfach nicht macht.

    "The biggest communication problem is we do not listen to understand. We listen to reply." - Stephen Covey


    Webseite und Blog ist immer noch - seit fast 20 Jahren - online.