BASIC-Hovercards

Aaaalso, im Anschluss an die Firmware Hovercards und nach dem Vorschlag von @Devlin habe ich mich mal drangesetzt und ähnliche Hovercards für BASIC-Schlüsselwörter umgesetzt!

Da sie der natürlichen Sprache sehr ähnlich sind, musste ich sie allerdings auf Code-Blöcke beschränken:

10 MODE 1: BORDER 0: CLS
20 INK 0, 0: INK 1, 26: INK 2, 6
30 ENV 1, 5, 1, 5: SOUND 1, 239, 50, 12, 1
40 ORIGIN 320, 200: DEG
50 FOR a = 0 TO 345 STEP 15
60   CALL &BD19: REM Sync to vertical flyback
70   DRAWR 100 * COS(a), 80 * SIN(a), 1
80   MOVER -100 * COS(a), -80 * SIN(a)
90 NEXT a
100 LOCATE 1, 24: PRINT "Press any key to reset palette...";
110 CALL &BB18: REM Wait for keypress
120 CALL &BC02: REM Reset inks to defaults

Tadaaa!

Damit das funktioniert, musste ich aber auch sicherstellen, dass es wirklich nur in BASIC-Code-Blöcken greift. Und obwohl ich versucht habe, das Forum-System so einzustellen, dass es BASIC in vorformatiertem Text automatisch erkennt, klappt das nicht immer (darum sollte ich mich irgendwann nochmal kümmern). Achtet also darauf, dass ihr auch wirklich BASIC auswählt, wenn ihr ein BASIC-Programm eingebt:

Und das war’s auch schon.

Feedback ist wie immer herzlich willkommen!

PS: Das Ganze war viel einfacher umzusetzen, als ich ursprünglich gedacht hatte, da die Vorarbeit am FW-Parser und den BASIC-Code-Blöcken ja schon erledigt war. Die größte Hürde war eigentlich, die BASIC-Befehle aus dem Wiki selbst zu scrapen – verdammter Bot-Schutz :joy:

PS2: Verwendete Quellen für die BASIC-Übersicht:

  1. Locomotive BASIC Reference Manual: Genutzt für die exakte Befehlssyntax, Parameterklammern und Versionsunterschiede (BASIC 1.0 vs 1.1).
  2. AMSDOS Firmware & Reference Manual (Soft 158): Genutzt für die 13 nativen Resident System Extension (|) Disc-Befehle, Umschalten der Laufwerke und Syntaxparameter.
  3. CPCWiki Locomotive BASIC Category: Dokumentation und ROM-Token-Tabellen zur Überprüfung von Spezialfällen (wie COPYCHR$ und WINDOW SWAP) sowie Hardware-Register-Interaktionen.

…alles in Gemini gefüttert, das dann das benötigte JSON für den Parser ausgespuckt hat.

Absolut genial!

Ich frage mich allerdings gerade… ist es irgendwie möglich, die Parameter von den Funktionen in BASIC auflisten zu lassen, wenn man mit der Maus darüberfährt?

ENV ist ein gutes Beispiel für einen Befehl mit mehreren Parametern.

Ja, das ist machbar. Nicht nur ENV, sondern auch ENT und SOUND. Gibt es noch andere Befehle, die mehrere Subparameter akzeptieren?

Ich habe vor, eine aufgeschlüsselte Parameter-Übersicht zu den Hovercards für diese und alle weiteren, die wir brauchen, hinzuzufügen.

Ok, ich glaube, ich habe es hinbekommen. Ich habe die folgenden Befehle erweitert:

  1. AFTER: Verzögerung, Timer-Index (0–3) und Ziel-Zeilennummer.
  2. BORDER: Primärfarbe und alternative Blinkfarbe.
  3. ENT: Hüllkurven-Nummer (1–15), Tonhöhen-Schrittanzahl, Tonhöhen-Delta-Schrittgröße und Pausendauer.
  4. ENV: Hüllkurven-Nummer (1–15), Lautstärke-Schrittanzahl, Lautstärke-Delta-Schrittgröße, Pausendauer und Hardware-PSG-Form/-Periode.
  5. EVERY: Wiederholungsintervall, Timer-Index (0–3) und Ziel-Zeilennummer.
  6. INK: Logische Stiftnummer, physikalische Farbe 1 und Blinkfarbe 2.
  7. KEY DEF: Tasten-Nummer (0–79), Wiederholungs-Umschalter und Zeichencodes für ungedrückt/gedrückt/Control.
  8. ORIGIN: Koordinaten-Offsets (x, y) und Viewport-Clipping-Grenzen (links, rechts, unten, oben).
  9. SOUND: Kanal-Bitmaske, Tonhöhen-Periode, Dauer/Rendezvous, Lautstärke, Lautstärke-Hüllkurve, Ton-Hüllkurve und Rausch-Periode.
  10. SPEED INK: Blinkdauer Phase 1 und Phase 2.
  11. SPEED KEY: Startverzögerung und Wiederholgeschwindigkeit.
  12. SYMBOL: Ziel-Zeichencode (240–255) und die 8 Zeilen-Bitmap-Bytes.
  13. WINDOW: Stream-Nummer (#0–#7) und rechteckige Fensterkoordinaten (links, rechts, oben, unten).

Außerdem habe ich die Parser-Funktion, die die Hovercards erzeugt, eingeschränkt, damit sie diese nicht mehr nach REM-Anweisungen erstellt, da diese natürliche Sprache enthalten können. Testen wir es mal:

10 MODE 1: BORDER 0, 1: SPEED INK 15, 15
20 INK 0, 0: INK 1, 26: INK 2, 6: INK 3, 15
30 REM Beachte, dass MODE, BORDER und SOUND in diesem Kommentar nicht verlinkt werden
40 SPEED KEY 30, 2: WINDOW #1, 2, 38, 2, 8: CLS #1
50 SYMBOL 240, 24, 60, 126, 255, 255, 126, 60, 24
60 ENV 1, 5, 1, 5: ENT 1, 10, -5, 2
70 SOUND 1, 239, 40, 12, 1, 1
80 ORIGIN 320, 200: DEG
90 EVERY 150, 1 GOSUB 200
100 PRINT #1, "Benutzerdefiniertes Zeichen: "; CHR$(240)
110 FOR a = 0 TO 360 STEP 45
120   DRAWR 60 * COS(a), 40 * SIN(a), 2
130 NEXT a
140 CALL &BB18: REM KEY- und WAIT-Prüfungen werden hier ignoriert
150 END
200 PRINT #1, "*TICK* ";: RETURN

Wie sieht’s aus, @ervin ? :slight_smile:

Das ist echt abgefahrenes Zeug. Ich werde beim nächsten Mal vielleicht das CPC-Wiki nutzen, um meinen Code zu schreiben, weil das schneller geht, als im Handbuch nachzuschlagen.

Danke dir, Mann, das weiß ich sehr zu schätzen. Mir gefällt das Ergebnis selbst auch super, besser als erwartet. Ich hatte aber auch jede Menge Hilfe von Gemini, was alles sauber organisiert hat – sonst hätte das Zusammenstellen ewig gedauert …

Soll ich auf dieser Basis vielleicht einen BASIC-Editor irgendwo im Forum oder im Wiki einbauen? Vielleicht könnte ich ihn sogar als Standalone-Anwendung bauen – es gibt ja fertige Code-Editoren, die ich nutzen könnte, anstatt das Rad neu zu erfinden, und die grundlegende Struktur steht ja schon! Das könnte dann sogar Autovervollständigung unterstützen, den Export in eine .dsk-Datei UND das Ausführen im eingebetteten RVMPlayer?!

Vielleicht könnte der Ersteller davon helfen?

Das wäre sicher mega cool, aber fühl dich bloß nicht dazu verpflichtet. Du hast tolle Arbeit geleistet, um alles wieder online zu bringen, und all die neuen Funktionen sind jetzt schon eine riesige Verbesserung. Du hast dir bald echt wieder eine Pause verdient!

Pass auf, dass dich dein Anti-Bot-Schutz nicht eines Tages von deinem eigenen Server aussperrt und die KI dir sagt: „:robot: :smiling_face_with_sunglasses: Hasta la vista, baby“. :sweat_smile:

Ja, ich will nicht lügen, das war echt ein unangenehmer Moment​:joy: