Hallo Besucher, der Thread wurde 5,8k mal aufgerufen und enthält 21 Antworten

letzter Beitrag von -trb- am

Wargames kompilieren

  • Hallo zusammen,


    auf der DoReCo hatte jemand einen Altair8800 Clone und das Spiel Wargames vorgeführt. Ich wusste nicht dass das Spiel ein Basic Spiel ist.

    Im Prinzip ist es auch nicht schlimm aber ich würde es trotzdem gerne fertig kompiliert als direkt ausführbare Datei haben.

    Ich habe nun BasCom zum kompilieren benutzt. BasCom arbeitet die Datei ohne Fehler ab. Anschließend muss man noch L80.com

    benutzen um letztendlich eine COM-Datei zu erhalten. Aber hier bekomme ich ständig ein "Out of memory" als Fehlermeldung zurück.

    Ich habe es auch schon mit einem Emulator via MS-DOS und einem ESP-32 versucht, jedesmal mit dem selben Ergebnis.

    Ist der CP/M Arbeitsspeicher bei jedem Emulator gleich groß?

    Wenn ich MBasic starte wird immer um die 33kB freien Speicher angezeigt (C128/MyZ80/ESP-32).

    Hat jemand noch ein CP/M-System am laufen und kann das auch mal testen?

  • auf der DoReCo hatte jemand einen Altair8800 Clone und das Spiel Wargames vorgeführt.

    habe ich auch da "gesehen" :) (war aber ein IMSAI8080 ,.. nicht der Altair ;) )


    es war aber nicht Basic,.. sondern lief ohne Mbasic direkt unter CP/M (als Diskette)

    war glaub-ich diese Quelle... (die Diskette hänge ich unten dran)


    was du mit Basic meinst, ist sicher das hier: https://github.com/zompiexx/wargames


    soll ich deine "Datei" testen ?

    Deine Wargames.BAS ist aber auch 42kB groß...

  • Hallo Mr. Jones,


    viel zu testen - in Bezug auf das kompilieren - wird es nicht geben, denn das verraet Dir schon

    das ReadMe von Andy Glenn:


    Zitat


    NOTE: The code will run using a BASIC-80 interpreter (on a SYSGEN 64 image/boot disk), but it may not be possible to compile and link the code as it stands because of the 64KB TPA Memory limit of CP/M. To overcome this limitation of CP/M and to enable the code to be compiled and linked, I am considering breaking the code up into a series of smaller programs and using a data file to share variables between them.

    D.h. das BASIC-Programm ist mit den 42KB zu gross zum kompilieren/linken, er haette/will es evtl. aufsplitten, dass es dann die gemeinsamen .TXT (im alten YT-Video .VT) Dateien nutzt.


    CP/M Systeme koennen 60KB oder 64KB TPA-Size haben. Andy schrieb im READ.ME, dass es besser ein 64K TPA-System sein sollte (SYSGEN 64).


    Habe das .BAS eben mal getestet in einem RunCPM mit 64KB internal-TPA

  • Hallo TurboMicha ,


    ich habe die DSK in MYZ80 eingebunden aber leider stürzt der Emulator nach dem laden von Wargames ab.

    Die Datei WARGAMES.COM habe ich auf eine CP/M Disk kopiert und damit den 128er gefüttert aber leider ein

    ähnliches Ergebnis. Er lädt die Datei aber dann erscheint wieder das Prompt.

    Was mache ich falsch?

  • Die Datei WARGAMES.COM habe ich auf eine CP/M Disk kopiert und damit den 128er gefüttert aber leider ein

    ähnliches Ergebnis.

    ich bin auch kein CP/M Experte,.. aber ein C128 wird sicher einen total anderen Speicherbereich haben, als ein IMSAI...
    Kannst du denn im Emulator den Disketteninhalt sehen ?

    "Das Spiel" emuliert selbst ja auch "ein Diskette" auf der Diskette...

    was ist denn dein Ziel ? (nur mal drauf gucken ?)

    ansonsten zeigt ja das Yt Video, was alles "in der Reihenfolge" zu tun ist,.. und auch angezeigt wird...

  • Ich versuche gerade in Aztech-C eine Startroutine zu schreiben um das Spiel -mit z.B. WARGAMES.COM- zu starten.

    Leider schaffe ich es nicht den Befehl "MBASIC WARGAMES.BAS" ausführen zu lassen.


    Die Syntax soll laut Aztech-C CP/M 1.06 manual so aussehen:


    Ich schaffe es aber nicht die WARGAMES.BAS automatisch zu laden.

    Es wird immer nur MBASIC gestartet und das war es dann. Die Argumente werden ignoriert.

    Ich habe auch schon überlegt den Dateinamen samt auszuführende Datei zu übermitteln aber es wird das WARGAMES.BAS ebenfalls immer ignoriert:


    Code
    1. main()
    2. {
    3. execl("mbasic.com WARGAMES.BAS",0);
    4. }

    Kann mir jemand einen Tipp geben wie ich das Ganze bewerkstelligen kann?

    Es muss nicht in C sein aber hier wurde wenigstens ein mögliches Argument erwähnt. In Microsoft Basic wird diese Möglichkeit gar nicht aufgeführt.


    Ich habe es auch schon in Basic mit


    Code
    1. 10 RUN "mbasic WARGAMES.BAS"

    versucht aber auch hier wird nur MBasic gestartet.

  • Kann mbasic das überhaupt? Dir nutzt der ganze verpackte Aufruf nichts, wenn mbasic das auto-Laden eines Programmes nicht kann.

    Laut der Doku von mbasic 80 kann es das, aber hast du das schon mal manuell versucht?


    Der Beschreibung von execl nach müsste das so aussehen.


    execl( "mbasic", "wargames.bas" );

  • Kann mbasic das überhaupt? Dir nutzt der ganze verpackte Aufruf nichts, wenn mbasic das auto-Laden eines Programmes nicht kann.

    Laut der Doku von mbasic 80 kann es das, aber hast du das schon mal manuell versucht?


    Der Beschreibung von execl nach müsste das so aussehen.

    MBasic kann externe Programme laden und ausführen aber leider wird das, was Mbasic laden soll, ignoriert.


    "Manuell" kannst Du das nicht ausprobieren weil Du dann -in Basic- versuchst den Interpreter erneut zu laden.

    execl( "mbasic", "wargames.bas" );

    Das habe ich auch schon getestet aber es wird immer nur MBasic gestartet ohne die Datei WARGAMES.BAS zu berücksichten.

  • So, ich habe es inzwischen geschafft einen Teilerfolg zu erzielen. :emojiSmiley-28:


    Code
    1. main(argv)
    2. char ** argv;
    3. {
    4. char ** _getargs();
    5. argv = _getargs(0, "WARGAMES.BAS");
    6. execv("mbasic",argv,0);
    7. }

    Mit diesem C-Code schaffe ich es zumindest "halbautomatisch" mbasic direkt mit Wargames zu laden.

    Das Problem ist nur dass ich 12 mal eine Taste drücken muss (Anzahl des kompletten Dateinamens (WARGAMES.BAS = 12)) damit es funktioniert.

    Ich weiß, totaler Schwachsinn aber leider tendieren meine C Kenntnisse gegen Null und ich weiß nicht wie ich dieses Programm umschreiben muss damit die Variable "argv" direkt den Dateinamen "WARGAMES.BAS" enthält. :emojiSmiley-30:

    Kann mir jemand mit C-Kenntnisse unter die Arme greifen?

  • Nun klappt es endlich! :thumbsup:


    Man muss dem Befehl eine Art Dummy Wert geben und dann funktioniert es:


    Code
    1. main()
    2. {
    3. execl( "mbasic", "WARGAMES.BAS", "WARGAMES.BAS", 0 );
    4. }

    Naja, bei der ganzen Recherche habe ich aber eine noch schönere Lösung gefunden und letztendlich eine Boot Diskette erstellt bei der CP/M geladen und das Spiel Wargames direkt gestartet wird, also quasi Plug & Play. ;)

  • Achso... hatte ich falsch verstanden..

    ich dacht du hattest es (wegen .d64) für den C64 umgebaut..

    (mein 128er ist gerade nicht "am Start" und C64 Forever kann damit natürlich nichts anfangen..)


    hört sich aber prima an.. danke...

  • Naja, bei der ganzen Recherche habe ich aber eine noch schönere Lösung gefunden und letztendlich eine Boot Diskette erstellt bei der CP/M geladen und das Spiel Wargames direkt gestartet wird, also quasi Plug & Play. ;)

    Sehr schön! :thumbup:


    Im Moment kann ich's nur am Emulator probieren (VICE/X128) und da läuft das Spiel dann nur im 40Z-Modus, während der Bootprozess parallel auf 40Z und 80Z dargestellt wird. Im Spiel fehlen dann offenbar Textteile wegen der 40Z. Wie bekommt man das unter 80Z zum laufen?