Hallo Besucher, der Thread wurde 58k mal aufgerufen und enthält 397 Antworten

letzter Beitrag von Boulderdash64 am

BASIC 4.5 für den C64 (BASIC 3.5 + EIGENE BEFEHLE)

  • Würde ich nicht machen. Das wird ja in meinem Beispiel ja schon recht elegant gelöst:

    Code
    1. INTERPRETER_SCHLEIFE=$A7AE
    2. ; Kommando kommt mit RTS in die Interpreterschleife zurück
    3. lda #>(INTERPRETER_SCHLEIFE-1)
    4. pha ; High-Byte
    5. ......

    Ja, ich gib zu die Lösung hat Charme. Obwohl sie beim ersten hinsehen nicht zu durchschauen ist und ich ja trotz aller Bytes-Sparerei ein Freund des Gradlinien, Step-by-Step Lösungen bin. Aber ich muß sagen, das find ich sehr charmant. Auch deine Empfehlung den Dispatcher immer mit dem ersten Zeichen nach dem Token zu verlassen macht die Auswertung eventueller Parameter einfacher und das wiederherstellen des CHR-Pointers wird größtenteils nicht mehr notwendig sein.


    Also: dann lasse ich mal "die Finger fliegen" und schreibe den Code um. Wird was dauern, werds aber hier zu Schau stellen.

  • Es ist unerheblich ob 4.x für den C64er gab/gibt. Es geht um die Logik.

    Welche Logik? Erst Basic 2, dann Basic 4, dann Basic 3.5 und dann Basic 7. :whistling:

    Also Leute, ich weiß gar nicht worüber ihr euch den Kopf zerbrecht. Wir reden hier über einen "Namen" eines Stück Softwares. Ich hätte das Ding auch "BASIC 56.1" oder "Roberts BASIC" oder "JOSEF" nennen können und dürfen. Ich arbeite doch nicht bei CBM im Marketing und muß mir Gedanken machen ob die Versionierung sich gut verkauft oder zu vorgänger Versionen passt (wo es ja noch nicht mal einen Vorgänger gibt). Also ich ich diskutiere seit vielen Tagen in diesem Thread mit einigen Usern wie man einen BASIC Extender (also BASIC 4.5) praktisch umsetzt und das auf einem richtig hohem Niveau. Und dann kommt ihr und meckert über eine "4.5"? Da fehlen mir echt die Worte.

  • Es ist unerheblich ob 4.x für den C64er gab/gibt. Es geht um die Logik.

    Welche Logik? Erst Basic 2, dann Basic 4, dann Basic 3.5 und dann Basic 7. :whistling:

    Also Leute, ich weiß gar nicht worüber ihr euch den Kopf zerbrecht. Wir reden hier über einen "Namen" eines Stück Softwares. Ich hätte das Ding auch "BASIC 56.1" oder "Roberts BASIC" oder "JOSEF" nennen können und dürfen. Ich arbeite doch nicht bei CBM im Marketing und muß mir Gedanken machen ob die Versionierung sich gut verkauft oder zu vorgänger Versionen passt (wo es ja noch nicht mal einen Vorgänger gibt). Also ich ich diskutiere seit vielen Tagen in diesem Thread mit einigen Usern wie man einen BASIC Extender (also BASIC 4.5) praktisch umsetzt und das auf einem richtig hohem Niveau. Und dann kommt ihr und meckert über eine "4.5"? Da fehlen mir echt die Worte.

    Das liegt daran, daß BASIC 4.5 sich namentlich einreit in die CBMs BASICs.

    Btw.: Intern war CBM bei BASIC 4.75.

    Roberts BASIC hätte ich nicht 'beanstandet' als Namen.

    Warum ich BASIC 4.5 für falsch halte habe ich bereits gesagt, und dabei bleibe ich.

    Trotzdem ist das eine gute Arbeit den du da ablieferst, hat aber mit deine Erweiterungen den CBM-Pfad verlassen.

  • Trotzdem ist das eine gute Arbeit den du da ablieferst, hat aber mit deine Erweiterungen den CBM-Pfad verlassen.

    Danke :thanx:

  • Also Leute, ich weiß gar nicht worüber ihr euch den Kopf zerbrecht.

    Ja, das ist wirklich nebensächlich. Dennoch, gerade Namen - nicht nur bei Software - können einfach unglücklich ausfallen und/oder falsche Assoziationen wecken.

    Da kann man über Hinweise anderer, die auch andere Sichtweisen haben, eigentlich nur froh sein (also als positiven Impuls sehen). So eine Namenswahl ist ja schließlich auch nichts, was man bis aufs Blut verteidigen müsste. Wie bei allem mit unterschiedlichen Meinungen und Zugängen zu einem Thema, kann man freilich diese auch stehen lassen oder ein Raider-heißt-nun-Twix-Manöver machen. Nur bloß nicht viel drüber herumdiskutieren.... ;)

  • Da kann man über Hinweise anderer, die auch andere Sichtweisen haben, eigentlich nur froh sein (also als positiven Impuls sehen).

    Einerseits... ja.

    Andererseits kann man nach dem Lesen einer gewissen Anzahl von Beiträgen auch einfach mal die Nutzer X, Y und Z gedanklich als Trollaccounts oder Rauschgeneratoren abhaken.

  • User JeeK hat sich die Mühe gemacht und meinen Dispatcher unter die Lupe genommen. Dabei hat er nicht nur "Hausputz" vorgenommen, sondern auch einen Vorschlag statt einen Token-Abfragekette eine Speichertabelle als Einsprungadressen für die Befehl anzuwenden. Diese Methode ist nicht sofort zu durchschauen, aber sehr effizient. Also habe ich den Code um geschrieben.

    An einer Stelle mußte ich die Syntax des Sourcecode formal ändern, weil im C64 Studio wohl kleine Abweichungen zum ACME sind.

    Aus

    lda (_jump_tab-2)+1,y ; Sprungadresse High

    pha

    lda (_jump_tab-2),y ; Sprungadresse Low

    pha

    musste ich

    lda _jump_tab-1,y ; Sprungadresse High

    pha

    lda _jump_tab-2,y ; Sprungadresse Low

    pha

    machen. Was ja kein Problem darstellt.

    Allerdings hat dieser Teil am Anfang der Routine:

    Code
    1. jsr CHRGET ;wir holen ein zeichen
    2. php
    3. cmp #$7f ;und vergleichen es mit unserem master-token
    4. beq _chk ;haben wir es gefunden so machen wir weiter
    5. plp
    6. jmp B45_PTR_EXE_STATM_AFTER_CHRGET
    7. _chk plp
    8. jsr CHRGET ;wir holen noch ein zeichen, da wir ja das master-token gefunden haben
    9. ;brauchen wir nicht mehr pruefen ob wir ein slave-token haben

    Nicht die gewünschte Wirkung gezeigt. Das heißt das alle Token, die KEINE BASIC4.5 Token sind sollen ja vom BASIC 3.5 Parser verarbeitet werden. Der macht aber ein Syntax Error weil mit dem obigen CHRGET nicht mehr das Befehl Token im Pointer steht, sondern das darauf folgende. Das ändert auch nichts daran, das der Prozessor Status gerettet und wieder hergestellt wird.

    Weiter nützt der Sprung B45_PTR_EXE_STATM_AFTER_CHRGET nichts, da ja aktuell nicht mehr ein Befehltoken da ist. Bestenfalls ei Paramter. Wenn also das Token kein 7F als Mastertoken ist, muss der alte CHR Pointer wieder hergestellt werden. Ich habe den Beginn der Routine dahin gehen geändert:

    Gleichzeitig habe ich dann die Empfohlene Weise, alle Befehls Routinen mit einen CHRGOT (statt wie bisher mit CHRGET) zu beginnen, weil die Befehls Token (7F und 01-0C) bereits abgehandelt wurden.

    Das Trickreichste allerding ist der Rücksprung der Befehlsroutinen. Die gingen bisher über einen JMP (Vector nach Basic 3.5 Parser).


    Aber in dem ich mit

    ; Kommando kommt mit RTS in die Interpreterschleife zurück

    lda #>(INTERPRETER_SCHLEIFE-1)

    pha ; High-Byte

    lda #<(INTERPRETER_SCHLEIFE-1)

    pha ; Low-Byte am Stack

    Die Einsprungadresse des Parsers auf den Stack lege würde ein einfaches RTS dann genau dort hin springen. Was es auch tut ;)

    Somit genügt es die Befehlroutinen mit RTS zu verlassen. Genial! Großen Respekt und Dank an JeeK.


    Habe den Dispatcher als Anlage mit dran gehangen.

  • *** Neue BASIC 4.5 Version ***

    Ich freue mich eine neue Version von BASIC 4.5 zur Verfügung zu stellen. Es ist die Version 20.02.28.

    Änderungen sind

    FIND: Überschrieb zum Teil den BASIC Speicher - Fehler beseitigt

    FREE: Wurde entfernt

    MEMORY: Neuer und besserer Ersatz zum FREE.

    Verbesserungen: Der Dispatcher wurde komplett überarbeitet und arbeitet nun deutlich effizienter.


    Großen Dank gilt User JeeK für seine Test und Verbesserungsvorschläge im Sourcecode.

    BUGs bitte in diesem Thead melden.

  • Nicht die gewünschte Wirkung gezeigt. Das heißt das alle Token, die KEINE BASIC4.5 Token sind sollen ja vom BASIC 3.5 Parser verarbeitet werden. Der macht aber ein Syntax Error weil mit dem obigen CHRGET nicht mehr das Befehl Token im Pointer steht, sondern das darauf folgende. Das ändert auch nichts daran, das der Prozessor Status gerettet und wieder hergestellt wird.

    Ja, welchen Eingesprungspunkt verwendest du für B45_PTR_EXE_STATM_AFTER_CHRGET? Die Interpreterroutine von BASIC35 ist leider nicht so einfach, dass man da quer einspringen kann, weil am Anfrang eine Statuserhebung gemacht wird, die später abgefragt wird:

    Code
    1. .C:c3a1 A5 7B LDA $7B
    2. .C:c3a3 C9 03 CMP #$03
    3. .C:c3a5 66 E9 ROR $E9
    4. .C:c3a7 20 73 00 JSR $0073
    5. .C:c3aa 20 C7 C3 JSR $C3C7
    6. ...

    Da kann man leider nicht einfach nach C3AA springen.

    Dort wird nämlich das High-Byte von CHRGET-Zeigers abgefragt, ob er sich <$300, d.h. im Direktmodus läuft. Das wird in Bit 7 von $E9 vermerkt.

    Das müsste man also herausziehen und du in deiner Routine ergänzen (also von C3A1 bis C3A5) bevor du zu C3AA springst.

    Das ist irgendwie nicht schön. Daher ist das mit dem CHRGET-Zeiger retten und wiederherstellen eigentlich auch eleganter. Was mir dabei nicht so gefällt, der Zwischenspeicher irgendwo mitten im Code des Dispatchers liegt. Wenn ich an ROM-fähigen Code denke (und darauf achte ich immer, egal ob ich vorhabe daraus ein ROM zu machen oder nicht), dann würde das so nicht funktionieren. Rein vom Design hätte ich vorgeschlagen entweder

    • irgendwelche für diesen kurzen Zeitraum verwendbare Speicherstellen in Zeropage bzw. < $0400 zu nehmen oder
    • das nur am Stack zu retten oder
    • einen gesonderten Variablenbereich zu definieren, der leicht vom Codeteil (ev. im ROM) abgetrennt werden kann.

    Die Stack-Variante könnte so aussehen:


    Weiter nützt der Sprung B45_PTR_EXE_STATM_AFTER_CHRGET nichts, da ja aktuell nicht mehr ein Befehltoken da ist. Bestenfalls ei Paramter. Wenn also das Token kein 7F als Mastertoken ist, muss der alte CHR Pointer wieder hergestellt werden. Ich habe den Beginn der Routine dahin gehen geändert:

    Siehe auch Frage oben von mir. Der Sprung nach B45_PTR_EXE_STATM_AFTER_CHRGET würde schon was nützen, wenn er denn der richtige ist und die Voraussetzungen (siehe auch oben) geschaffen sind. ;)
    Aber ich gebe zu, ich hab das nicht alles selbst getestet, sondern nur zusammengestellt, wie ich es machen würde (aus meinen Erfahrungen).


    Übrigens: In deiner obigen Variante brauchst man das PHP und PLP dann aber nicht mehr. Einfach weglassen bzw. siehe mein Beispiel des Dispatchers mit der Stack-Rettungsvariante.

  • ja, das die ganze Sache mal auf einem EPROM gebrannt werden könnte und dann Read-Only ist, daran habe ich bisher überhaupt nicht gedacht. Solche Konstellationen habe ich an verschiedenen stellen. Da muß ich wohl noch mal ran. Vielen Dank für den Hinweis.

  • Ich habe den Code nun soweit umgeschrieben, das er auch auf einem EPROM gebrannt lauffähig sein sollte.

    Alle variablen Speicherstellen (nicht die TEXT-Konstanten), die mit irgendwelchen temporären Bits gefüllt werden liegen nun im RAM. Dabei wird der Kassettenpuffer reichlich genutzt. Das heißt die Datasette kann nicht mehr genutzt werden, was wohl kaum noch der Fall ist.

    Weiter habe ich mir überlegt das es unsinn ist für jede Routine exclusiven Speicher für zwischen Infos bereit zu stellen. Deshalb habe ich Speicherstellen als allegemeine Tabelle normiert. Diese Normierten Namen der Speicherstellen können dann im jeweiligen Code mit sprechenden Namen wieder zugewiesen werden.

    Also in etwar so:


    Und genutzt werden kann es so:

    Code
    1. ...
    2. ;--------------|--------|--------------|---------------------------------------
    3. DO_CATALOG
    4. ; Temp. Zuweisung von Variablen Speicher
    5. _CatFN = TEXTBUFFER
    6. _CatDRV = VB01
    7. _cntSPACE = VB02
    8. _MaxLinie = VB03
    9. ...


    Langsam wird BASIC 4.5 erwachsen ;)

  • Wer rastet, der rostet....
    Anbei die neuste BASIC 4.5 Version.

    ;==============================================================================

    ; History

    ;------------------------------------------------------------------------------

    ; 01.03.2020:

    ; Der Dispatcher wurde komplett neu geschrieben und arbeitet deutlich schneller.

    ; Temp. Daten wurde aus dem Programmcode in die erw. Zeropage ausgelagert.

    ;

    ;------------------------------------------------------------------------------

    ; 09.03.2020:

    ; RESTORE springt nicht mehr im MONITOR, sondern löst einen BASIC WARMSTART aus.

    ; RUN/STOP - RESTORE sprint im MONITOR, wenn STOP eingeschaltet ist. Ein STOP OFF löst einen Warmstart aus

    ;

    ; Die Register Anzeige des Monitor wurde um die binäre Ausgabe des Status Registers erweitert:

    ;- PC SR AC XR YR SP NV-BDIZC

    ;- ;c00b b0 c2 00 00 f6 10110000

    ;

    ;------------------------------------------------------------------------------

  • Anbei die neuste BASIC 4.5 Version.

    Vielen Dank für deine Mühen und die stetige Weiterentwicklung an der BASIC 4.5-Erweiterung! :thumbup:


    Ich habe heute mal deine Erweiterung im C64-Modus des Mega65 (C65) ausprobiert und hier einen Beitrag dazu geschrieben:


    BASIC 4.5 for C64 mode


    Es lauft wirklich prima und sogar mit mehr freien Speicher als am C64. :)


    Edit: Der freie Speicher ist gleich dem des C64. Es war (leider) nur irgendein Seiteneffekt nach dem Start (siehe auch hier).

  • Ich habe gestern mal Pegasus Basic V4.0 ausprobiert.


    U.a. fand ich hier den MEM-Befehl recht aussagekräftig, da jeweils auch die belegten Speicherbereiche angezeigt werden:



    Vielleicht wäre es ja eine Idee, dies beim MEMORY-Befehl des BASIC 4.5 noch mit dazu zunehmen?

  • Oja, das finde ich auch :thumbsup: . Da stimme ich Dir zu. Die Ausgabe ist sehr ansprechend. Zack, - wieder ne Herausforderung. Danke für die Info.

  • In der letzten Ausgabe gabs ein BUG mit dem Befehl FILES. Habs beseitigt.


  • Ich habe gestern mal Pegasus Basic V4.0 ausprobiert.


    Vielleicht wäre es ja eine Idee, dies beim MEMORY-Befehl des BASIC 4.5 noch mit dazu zunehmen?

    Hallo Snoopy,

    könnte Dir sowas gefallen?


    Da meine Darstellung nicht im Businessmode ist, sondern klassisch "groß" wirkt es anders.

  • Da meine Darstellung nicht im Businessmode ist, sondern klassisch "groß" wirkt es anders.

    Das ist doch glasklar ein Vorteil - denn dann funktioniert es in beiden Modi.

  • Also mir gefällt deine Darstellung sehr gut! :thumbup:


    Respekt für deine wirklich tolle Arbeit an dieser Erweiterung!