Anpassbare Zeitschleife unter CP/M 2.2 mit MBASIC (bzw. BASIC-80) ?

  • Stosse gerade auf das Problem, dass ein Delay unter MBASIC (bzw. BASIC-80) gar nicht als Befehl/Funktion verfügbar ist.

    Mit Turbo-PASCAL 3.0 unter CP/M 2.2 gab es die Funktion delay() aber das hat auch vorausgesetzt, dass Turbo-PASCAL korrekt installiert wurde (mit INSTALL). Bei Turbo-PASCAL wurde ein Wert bei der Einrichtung abgefragt, um die Rechnergeschwindigkeit einstellen zu können.

    So etwas suche ich noch für MBASIC/BASIC-80, also so was wie eine initiales Setup, wo die Geschwindigkeit bestimmt wird, und dann hat man es (bspw. mit Hilfe eines Unterprogramms) später einfacher eine Sekunde zu warten (oder weniger/mehr).

    Gibt es schon was fertig?

    "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.

  • ChatGPT schlägt mir nach einigen Versuchen eine Maschinencode-Subroutine vor, die bei 1 MHz CPU Takt genau 1 Sekunde benötigt.

    Ob das stimmt habe ich noch nicht herausgefunden:


    8080:

    ORG &H100

    LXI B, &H2A3D ; Load counter with 10845

    LXI H, &HFFFF ; Load inner loop counter with 65535

    DCR H ; Subtract 1 from inner loop counter

    JNZ $ ; Repeat inner loop if not zero

    DCR B ; Subtract 1 from outer loop counter

    MOV A,B ; Load outer loop counter into A

    ORA A ; OR with A to check if counter is zero

    JNZ $-9 ; Repeat outer loop if not zero

    RET ; Return


    Z80:

    ORG &H100

    LD BC, &H2A3D ; Load counter with 10845

    LD HL, &HFFFF ; Load inner loop counter with 65535

    DEC HL ; Subtract 1 from inner loop counter

    JR NZ, $ ; Repeat inner loop if not zero

    DEC BC ; Subtract 1 from outer loop counter

    LD A,C ; Load outer loop counter into A

    OR B ; OR with B to check if counter is zero

    JP NZ, $-9 ; Repeat outer loop if not zero

    RET ; Return


    Das wäre eine Lösung, denn damit könnte man, beginnend mit 1 MHz Vorauswahl, die MHz-Zahl vorab abfragen, und dann entsprechend die Warteschleife(n) aufrufen. Könnte das auch ohne Maschinencode empirisch und iterativ auf einer 8080- bzw. Z80-Maschine ermitteln.

    Wäre halt schöner, so etwas würde es schon fertig geben...

    "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.

  • Das schiesst leider komplett am Ziel vorbei, irgendeinen bestimmten Port in einem portabel geschriebenen Programm, was eigentlich auf allen Rechnern mit dem gleichen Betriebssystem laufen soll, abzufragen. Es gibt wohl auch CP/M-Rechner mit einer Echtzeituhr (vorrangig welche, wo CP/M 3.0 zum Einsatz kam), aber das ist was, wo ich nicht voraussetzen kann.

    Wie bereits erwähnt, Turbo PASCAL 3.0 für CP/M 2.2 hat das recht elegant gelöst, läuft aber m.E. nur mit Z80 CPU.


    Wahrscheinlich ist es tatsächlich einfacher, nach dem Start des Programms iterativ in sinnvollen Schritten abzufragen, ob die angezeigte Zeitschleife ungefähr einer Sekunde entspricht. Wenn das der Fall ist, bricht das Programm mit weiteren Frageschritten ab und kann ausgeführt werden.

    Wird aber wohl keiner gut finden, also werde ich versuchen, einfach einen typischen 4 MHz Z80 anzunehmen, hat man dann einen langsameren Rechner, wird es halt auch in größere Pausen münden, hat man einen schnelleren Rechner, wird es halt zu kleine Pausen geben.

    "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.

  • ... eine Abfrage bei jedem Start ist lästig - das Ergebnis sollte besser irgendwo abgespeichert werden.

    ... ein Installationsprogramm à la WSINSTALL, dass solche systemabhängigen Sachen abfragt und dann in die .COM Datei schreibt?

    ... eine Patch-Adresse dokumentieren, an der der Fachbenutzer für sein System eine Konstante z.B. mit DDT einschreiben kann, die dann als Schleifenzähler verwendet wird?

  • Ja, so was wäre cool. Ein zusätzlichliches Installationsprogramm macht aber mehr Arbeit ;)

    Ich schau mal ob ich nicht zusätzlich den Quellcode des Programms unter GPL Lizenz (gibt es noch eine geeignetere Lizenz?) oder so veröffentliche, dann ist das Problem wahrscheinlich immer selbst einfach durch Quellcode-Veränderung behebbar...

    "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.