Hallo Besucher, der Thread wurde 4,4k mal aufgerufen und enthält 16 Antworten

letzter Beitrag von wizball6502 am

Neues Blackjack für den Commodore 64 in BASIC V2 - Gratis Abtipp-Listing zum Herunterladen (PDF)

  • Liebe Forums-Freunde


    Es ist Weihnachten und somit Zeit für kleine Geschenke. :weihnachten:


    Das folgende PDF enthält mein Blackjack-Spiel (R1) in BASIC als Listing zum Abtippen (mit Checksumme in jeder Zeile, zum bequemen Erkennen von Tippfehlern). Das Spiel machte bereits an der Gamescom 2019 die Runde und war bisher nur in Papierform verfügbar.


    Es ist alles dabei: Verwendung von Sprites, Sound und viele altbekannte Peeks und Pokes. Somit ein guter Einstieg, um wieder mal etwas BASIC V2-Luft zu schnuppern.


    Viel Spaß beim Wieder-Erleben der 80er Jahre, und Wiederfinden von Fokus, Zeit und Ruhe (abgesehen von dem wohligen Klackern der Tastatur).


    Blackjack 2019.pdf


      


    Mehr zu der Vorgeschichte zum Blackjack-Spiel findet ihr in dem Original-Thread: Neues Blackjack für den Commodore 64 in BASIC V2

  • ECM rockt! Da war ich sofort gespannt drauf, wie das final rüberkommt, als ich das in deinem anderen Thread gelesen hatte.

    Den Modus hatte ich gar nicht auf dem Schirm und gleich mal ein bisschen rumprobiert. Ist natürlich mehr Aufwand, da man PETSCII komplett verliert und die benötigten Zeichen erstmal selberbauen muss.

    Zum Spaß hab ich das Blackjack von der Commodore Disk seit Jahrzehnten mal wieder angeschmissen. Auch nett, aber deines ist wesentlich eleganter.

  • Noch einen Hinweis zum Checksummer "F64Summer", der für die Checksummen-Überprüfung meines Listings benötigt wird.


    Das ist ein eigenständiges Programm von @Zirias (vielen Dank nochmals an dieser Stelle), das vor Eingabe des Listings gestartet werden muss. Beschrieben ist der Umgang mit dem F64Summer hier: https://www.c64-wiki.de/wiki/F64Summer


    Dies hier ist die C64-Version vom F64Summer (V1.0):

    Code
    1. 0 fora=820to984:readb:pokea,b:next:sys820:data169,73,141,2,3,169,3,141,3,3,169
    2. 1 data80,141,4,3,169,3,141,5,3,96,169,255,133,21,76,131,164,32,124,165,173,0,2
    3. 2 data240,6,165,21,73,255,208,1,96,133,252,138,72,152,72,165,20,73,255,133,251
    4. 3 data162,0,134,2,189,0,2,133,253,240,44,36,2,48,4,201,32,240,33,201,34,208,6
    5. 4 data169,255,69,2,133,2,160,8,6,253,42,69,251,74,144,6,169,104,69,252,133,252
    6. 5 data102,252,102,251,136,208,235,232,208,205,160,3,170,181,251,41,15,32,207,3
    7. 6 data153,36,4,136,181,251,74,74,74,74,32,207,3,153,36,4,232,136,16,229,169,1
    8. 7 data160,3,153,36,216,136,16,250,104,168,104,170,96,201,10,144,3,233,9,96,105
    9. 8 data48,96

    Kurze Anleitung, wie man vorgeht:

    1. F64Summer abtippen und vor dem Start auf Diskette (bzw. ein .D64 image) speichern - er kann so auch für zukünftige Listings wieder genutzt werden.
    2. F64Summer mit "RUN" starten. Das Maschinenspracheprogramm ist nun aktiv (ab Speicheradresse 820).
    3. Mit "NEW" das F64Summer BASIC-Programm löschen, damit man ein neues BASIC-Programm eingeben kann.
    4. Erste Blackjack-Listing-Zeile abtippen (ab Zeile 10) und mit <RETURN> abschliessen. Oben rechts wird dann vom F64Summer die Checksumme der Zeile angezeigt, die mit der angegebenen Checksumme im Listing übereinstimmen sollte. Falls nicht, die eingegebene Zeile überprüfen und gegebenenfalls korrigieren. Nach erneutem <RETURN> zeigt die Checksumme dann den neuen, hoffentlich korrekten Wert wie im Listing an.
    5. So weiterfahren mit den restlichen Listing-Zeilen.
    6. Wenn alle Zeilen erfolgreich eingegeben wurden, vor dem Start das Blackjack-Programm ebenfalls zuerst speichern.
    7. Dann mit "RUN" ausführen.
  • Cool ... :) Nur mal kurz gefragt, es gibt ja seit kurzem die V2 vom Checksummer, und auf deinen Wunsch hin kann man die auch mit einer Option bauen, die REM am Zeilenende ignoriert. Wieso hast du die eigentlich nicht genommen? Falls es damit noch n Problem gibt, gerne im Thread zum Checksummer posten :)


    Kleiner Nitpick zu deiner Anleitung: zwischen Punkt 6 und 7 fehlt genaugenommen "C64 aus und einschalten bzw resetten" :) Wenn dein Programm selbst nie in den Datasettenpuffer (ab 820) schreibt, passiert nichts ... aber wenn doch gibt es einen "schönen" Crash ;)

  • Wieso hast du die eigentlich nicht genommen?

    Zum Zeitpunkt als ich das Blackjack-Listing druckreif gemacht hatte, gab es die Version 2.0 noch nicht, die Checksummen wurden also noch mit V1.0 erzeugt. Die F64Summer Version 2.0 verspricht zwar abwärtskompatibel zu sein mit Checksummen von V1.0, aber das wollte ich nicht riskieren bzw. möchte ich erst noch überprüfen. Zudem ist der C64-Wiki-Eintrag zum F64Summer noch auf V1.0. Auch werden einige Käufer vom BASIC Weihnachten-Heft 2018 noch den F64Summer V1.0 bei sich gespeichert haben. Deshalb bin ich mit V1.0 auf Nummer Sicher gegangen. Und V1.0 funktionierte ja schon einwandfrei (einige Spezialfälle mal abgesehen).


    Für meine geplante "10Liners Explained"-Serie, wo ich meine Zehnzeiler zum Abtippen anbiete, werde ich aber mit V2 arbeiten, weil ich dort hinter jedem Statement eine REM-Erklärung anfüge, die man dann aber eben nicht abtippen muss, um auf die Checksumme zu kommen.

  • Vielen lieben dank fürs veröffentlichen.

    Habe es mit diversen großzügigen Pausen nun innerhalb von 5 Stunden abgetippt am Maxi.

    Fürs erste Abtipplisting bestimmt ganz ok.

    Hat sogar auf Anhieb funktioniert, aber eine Frage hab ich noch:

    Kann mal einer die Checksumme Der Zeile 1300 bestätigen? Ich bekomme F916 rausgeworfen, aber laut Listing müsste es 42AD werden. Egal wie ich es eintippe, ich komme nicht auf die 42AD.
    Eigentlich auch nicht weiter wichtig, da ich meine Wette ja trotzdem setzen kann.

  • Kann mal einer die Checksumme Der Zeile 1300 bestätigen? Ich bekomme F916 rausgeworfen, aber laut Listing müsste es 42AD werden.

    Gratuliere zum erfolgreichen Eintipp-Marathon. Und das an Heiligabend. :thumbsup:


    42AD ist korrekt. Bei "f1 f3 f5 f7" musst du nicht die F-Tasten drücken sondern den Text genau so eingeben. Ansonsten wäre da "{f1} {f3} {f5} {f7}" (in geschweiften Klammern) gestanden. Das soll im Spiel dann anzeigen, welche Tasten der Spieler drücken soll. Mit <shift> + F-Tasten nimmt man übrigens einen fälschlich getätigten Einsatz wieder zurück.

  • Ein Forumsmitglied hat sich noch dafür interessiert, weshalb ich die Funktion FRE(0) verwendet habe (Zeile 260), weil ja das BASIC nach einer Weile automatisch eine "Garbage Collection" (Speicher-Freigabe von nicht mehr verwendeten Variablen) durchführt.


    Das ist noch eine lustige Geschichte.


    Für diese Funktion hatte ich bis anhin eigentlich auch keine konkrete Verwendung, bis ich beim Testen feststellen musste, dass der temporäre String-Speicherbereich nach einigen hundert Runden spielen meine Sprite-Daten ($3A00-$3B00) und meinen Custom Char-Bereich ($3800-$39FF) "auffrass" bzw. überschrieb. Das sah dann zum Beispiel so aus:



    Dazu die Erklärung: Der Speicherbereich-Pointer (FRETOP) in den Zeropage-Adressen 51/52 zeigt zu Beginn auf $A000 (40960). Der BASIC-Interpreter verbraucht dann den Speicher von oben nach unten für seine temporären Variablen und setzt diesen Pointer jeweils runter. Erst, wenn der Pointer in den Bereich der unteren BASIC-Variablen-Bereiche kommt, führt der BASIC-Interpreter selbst ein FRE(0) durch, räumt auf und setzt den Pointer wieder rauf. Das kann man mit folgendem BASIC-Listing gut nachvollziehen. Man sieht wie die Adresse bei FRETOP runterzählt und dann automatisch wieder zurückgesetzt wird.

    Code
    1. 10 print"{clear}"
    2. 20 print"txttab - start basic prg(43/44):"peek(44)*256+peek(43)
    3. 30 print"vartab - start variables(45/46):"peek(46)*256+peek(45)
    4. 40 print"arytab - start arrays (47/48):"peek(48)*256+peek(47)
    5. 50 print"strend - end indxd vars (49/50):"peek(50)*256+peek(49)
    6. 60 print"fretop - string mem ptr (51/52):"peek(52)*256+peek(51)
    7. 70 print"memsiz - high.basic addr(55/56):"peek(56)*256+peek(55)
    8. 80 a$="":fori=1to50:a$=a$+"*":next
    9. 90 goto10

    Wenn ich nun zwischen meinem BASIC-Programm und der Adresse 40960 meine Sprite- oder Char-Daten abgelegt habe, dann schreibt der BASIC-Interpreter dort also irgendwann einfach hinein. Deshalb habe ich den FRE(0) eingebaut, damit der temporäre Speicher schon früher freigegeben wird und der Interpreter mir somit meine Char- und Sprite-Daten nicht zerstört.


    Einfach als Hinweis, falls bei euch ein BASIC-Programm nach einer Weile spielen plötzlich komische Zeichen anzeigt, oder sogar abstürzt (z.B. wenn ein Maschinenspracheprogramm zwischen BASIC-Programm ab Adresse $0801 und Adresse $A000 abgelegt wurde), dann könnte das an einem fehlenden FRE(0) liegen. Eine Alternative wäre, den MEMSIZ Pointer (55/56) herunterzusetzen und die VIC-Bank (für Screen/Sprites/Chars) hinter den BASIC-Bereich zu legen, aber so ging es auch.


    Hier noch eine ergänzende Erklärung, wie die Speicherverwaltung von BASIC funktioniert:

    https://www.c64-wiki.de/wiki/Speicherbelegung_(BASIC)

  • Einfach als Hinweis, falls bei euch ein BASIC-Programm nach einer Weile spielen plötzlich komische Zeichen anzeigt, oder sogar abstürzt (z.B. wenn ein Maschinenspracheprogramm zwischen BASIC-Programm ab Adresse $0801 und Adresse $A000 abgelegt wurde), dann könnte das an einem fehlenden FRE(0) liegen. Eine Alternative wäre, den MEMSIZ Pointer (55/56) herunterzusetzen und die VIC-Bank (für Screen/Sprites/Chars) hinter den BASIC-Bereich zu legen, aber so ging es auch.

    In der Tat hilfreich. Ich muss gestehen, solche eine Konstruktion war mir immer zu haarig, also mitten im von BASIC verwalteten Bereich Daten abzulegen und dann mit FRE(0) versuchen zu vermeiden, dass der Stringheap nicht damit kollidiert.

    Mir erschien es immer sicherer das BASIC-Ende entsprechend herabzusetzen (55/56) oder das Ende des BASIC-Programms künstlich nach hinten schiebt (sofern man sich damit nicht noch andere Nebenwirkungen einfängt).


    Eine Variante wäre eventuell auch mittels entsprechend großer Arrays den verwendeten Bereich zu reservieren. Da ein Array beim Start immer gelöscht wird, muss man die Daten dort dann aber immer wieder neu ablegen und auch das Array mit der Längenveränderung des Programms oder bei Variablen immer wieder anpassen. Auch irgendwie nicht schön.

  • es gibt ja seit kurzem die V2 vom Checksummer

    nur aus Interesse, wo gibts den den?


    PS:

    Ist das dieser hier?

    F64Summer -- neuer Checksummer zum Abtippen von BASIC Zeilen