Collab: Entwicklung eines TSB-Puzznic-Klons

Es gibt 1.089 Antworten in diesem Thema, welches 110.406 mal aufgerufen wurde. Der letzte Beitrag (1. November 2024 um 23:56) ist von Omega.

  • Und dann habe ich noch eine Frage dazu: Kann man diesen Effekt auch wieder rückgängig machen?

    Nehmen wir an, ich möchte ein anderes Programm nachladen, das wieder den vollen Basic-Speicher zur Verfügung haben soll.

    Reicht es dann wenn ich d!poke 55,32768:clr benutze? Oder kracht's dann im System?

  • Vor dem poke habe ich 30717 Bytes frei. Nach dem poke habe ich in Basic/TSB nur noch 28219 Bytes frei.

    Wie kommt das?

    Zieh mal die beiden Zahlen (30270 und 28219) voneinander ab. Was kommt raus? Der Basic-Start (plus 2)! Also richtig.

    Und überhaupt: Mit diesem Poke schränkt man in erster Linie den verfügbaren Basic-Speicher ein. Und nicht den Heap. Oder?

    Der Heap ist Teil des Basic-Speichers (der besteht aus: Programm, Variablenspeicher, Array-Speicher und eben Heap).

    Und dann habe ich noch eine Frage dazu: Kann man diesen Effekt auch wieder rückgängig machen?

    Selbstverständlich. Wegen CLR sind aber alle Variablen dann futsch. Und wenn du das MC-Programm, das im geschützten Bereich lief, jetzt nochmal aufrufst, will ich für nichts garantieren (es überlebt nicht lange...)

    Arndt

    GoDot C64 Image Processing
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Der Heap ist Teil des Basic-Speichers (der besteht aus: Programm, Variablenspeicher, Array-Speicher und eben Heap).

    Es wurde bisher immer davon gesprochen, dass der Heap eingeschränkt wird. Diese Ausdrucksweise finde ich verwirrend und falsch. Ich würde es eher so ausdrücken, dass der Basic-Speicher eingeschränkt wird. Und der Basic-Interpreter nimmt sich dann soviel Heap wie eben noch vom Basic-Speicher-Kuchen da ist.

  • EgonOlsen71: Ich habe nochmal mit dem Micro-Compiler experimentiert. Wenn ich diesen Programmcode kompiliere, dann gibt mir das Programm "hallo" aus.

    Irgendwie habe ich den Eindruck, dass man sich bei dem Compiler auf rein gar nichts verlassen kann. Hast du eine Idee, warum diese simple Logik nicht funktioniert?

    Bitte melde dich an, um diesen Anhang zu sehen.

  • EgonOlsen71: Ich habe nochmal mit dem Micro-Compiler experimentiert. Wenn ich diesen Programmcode kompiliere, dann gibt mir das Programm "hallo" aus.

    Irgendwie habe ich den Eindruck, dass man sich bei dem Compiler auf rein gar nichts verlassen kann. Hast du eine Idee, warum diese simple Logik nicht funktioniert?

    Bitte melde dich an, um diesen Anhang zu sehen.

    Setze mal Klammern

    IF ((C=1) AND (B=32)) THEN ...

    und drehe deinen Computertisch um Mitternacht in einen rechten Winkel zum kommenden Vollmond.

    Vielleicht lässt sich der Compiler dann überreden? :)

  • Klammern sind dem wurscht. Er wertet strikt von links nach rechts aus. Liegt vermutlich irgendwie daran. Ich habe nie ausprobiert, was der mit so einer Konstruktion macht. Im Zweifelsfall gilt immer: Berechnung aufteilen!

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

  • Der funktioniert eigentlich gut. Man muss sich halt auf ihn einlassen. Es gibt noch andere, aber die haben teilweise noch striktere Einschränkungen. Letztendlich sind die alle so ähnlich, dass ich sagen würde, es ist egal.

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

  • Ich würde mich ja gerne drauf einlassen. Aber wenn noch nicht einmal ein einfacher logischer Ausdruck wie "C=1 AND B=32" richtig übersetzt wird. Was soll man da machen? Ich wüsste nicht, wie man das noch weiter aufteilen soll.

    In meinem Beispiel:

    C=1 ist FALSE.

    B=32 ist TRUE.

    FALSE AND TRUE ist, nach meiner Kalkulation, FALSE.

    Es ist zum Verzweifeln.

  • Du verzweifelst aber schnell. Ich gebe dir aber recht, dass der sich hier echt doof verhält. Ich habe mal in den erzeugten Code geschaut und der ist ganz einfach Quatsch. Er ANDed B und 1 (weil das wohl Prio 1 hat) und vergleicht das Ergebnis dann mit C...und das liefert in der Tat true. Das =32 hinter dem B ist ihm gleich komplett egal. Aufteilen ist tatsächlich nicht ganz trivial, weil er sowas wie A=C=1 nicht mag und ein geschachteltes IF funzt auch nicht. Ich überlege mal, wie man ihm das klar machen könnte...hmm....

    Edit: Ich denke, du müsstest das aufteilen in zwei IFs, die aber nicht als Kette formuliert sein dürfen (also nicht IF ... THEN IF ....). Also etwa so:

    Code
    10 c=0:b=32
    20 if c=0 then 40
    30 if b=32 then print "hallo"
    40 end

    Ja, schön ist das nicht. Aber im Durchschnitt sogar schneller als die Variante mit AND, wenn die funktionieren würde.

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

    Einmal editiert, zuletzt von EgonOlsen71 (21. Februar 2024 um 08:29)

  • C kann nur 1 oder Null sein. Richtig?

    Arbeite vei C einfach mit -1.

    Dann kann die Bedingung einfach IF C heissen.

    Das löst aber wohl noch nicht Alles

    YouTube Kanäle über Basic, den C128 und den VDC-Chip
    Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen.
    Commodore 8-Bit Projekte
    auf Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen. zu Commodore 8-bit Hardware
    auf printables.com
  • Klammern mag der nicht? Das wäre das naheliegendste:

    IF ( C=1)AND(B=32)THEN

    C64Studio: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- C64Studio WIP: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen.

  • Ich würde mich ja gerne drauf einlassen.

    Dann würde ich das ganze Programm durch einen Compiler jagen und gut ist.

    Den Ansatz, nur einen Teil davon mit einem Compiler zu erstellen, halte ich für nicht gerade trivial oder einfach mal so machbar. Das Wissen, was du dafür brauchst, kannst du gleich in Assembler stecken. :)

  • Das Wissen, was du dafür brauchst, kannst du gleich in Assembler stecken. :)

    Jeeein...ich habe mit dem Ding früher viel gemacht. Eigentlich geht das schon, man muss nur kleinteiliger denken. Aber eben nicht ganz so, wie bei Assembler. Ich würde schon sagen, dass so ein Teil einem die Arbeit erleichtern kann. Man darf nur nicht zu viel davon erwarten.

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

    Bitte melde dich an, um diesen Link zu sehen.

  • Ich hänge einfach mal den Code an, der sollte sich ziemlich 1:1 auch zu BASIC umsetzen lassen (insbesondere die Methode resolve()).

    Habe ich mal gemacht. Ist sicher nicht optimal, weil ich die Strukturen aus C im Prinzip nur stumpf nach BASIC übertragen habe, aber geht schon...

    Im Anhang ist ein Image mit dem BASIC-Programm und einer kompilierten Version. Die kompilierte Version enthält den Zeichensatz schon, für die in BASIC muss man ihn kurz selber vorher laden. War zu faul, dass da noch zu ergänzen.

    Die BASIC-Fassung sieht ein bisschen "komisch" aus, weil ich die eigentlich für MOSpeed geschrieben habe und dort kann ich Labels statt Zeilennummern verwenden, wenn ich mag. Das hier ist quasi die vom Compiler erstellte, umgewandelte Form in normalem C64-BASIC.

    Diese Fassung ist somit ein Beispiel dafür, wie "schnell" sowas in BASIC ist, wenn man den Array-Ansatz benutzt. Sie ist für unkompiliertes BASIC nicht ideal, weil sie fast nur Integer-Variablen benutzt, aber das macht jetzt auch nicht den Unterscheid zwischen schneckenlahm und superschnell aus.

  • Das Wissen, was du dafür brauchst, kannst du gleich in Assembler stecken. :)

    Jeeein...ich habe mit dem Ding früher viel gemacht. Eigentlich geht das schon, man muss nur kleinteiliger denken. Aber eben nicht ganz so, wie bei Assembler. Ich würde schon sagen, dass so ein Teil einem die Arbeit erleichtern kann. Man darf nur nicht zu viel davon erwarten.

    Das schon, ein kleines Programm als Ganzes damit compilieren lassen, geht damit sicherlich gut!

    Die Schwierigkeit, das Kompilat dann noch "passgenau" ins TSB einzufügen, kommt hier halt noch dazu. Und wenn Omega alles verstanden hat, was er wo wieso und warum platzieren muss, dann traue ich ihm auch zu, dass Ganze selbst zu coden. Ich sehe hier einfach keine "Vereinfachung" für den armen Kerl. ;)

  • TSB ist beim Bildaufbau gefühlt genauso schnell wie die kompilierte Fassung. (Eher schneller :P )

    Arndt

    GoDot C64 Image Processing
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

    Einmal editiert, zuletzt von GoDot (21. Februar 2024 um 11:28)