NTC BASIC Cross-Compiler

Hallo zusammen, lange nicht gesehen.

Ich habe ein großes Update für NTC BASIC. Was ist NTC BASIC?

  • Es ist ein Z80-Cross-Compiler, der im Browser läuft
  • Die Syntax basiert auf VB5 / VB6
  • Unterstützt bis zu 4 MB RAM
  • Nach meinen Tests ist er schneller als SCCZ80 und Small C, aber noch nicht schneller als SDCC (wird er wahrscheinlich auch nicht, aber wir sind ja erst beim ersten Release und blicken noch nicht auf 27 Jahre Entwicklung zurück)
  • Kompilierter Code sollte auf dem CPC laufen (ausgelegt auf 64 KB, 128 KB und mehr); Unterstützung für Paging und Overlays (Multiload-Spiele von Kassette möglich).
  • CP/M-Unterstützung sollte SymbOS-kompatibel sein (hoffe ich) und MSX-kompatibel (hoffe ich).

Was ist NTC? Native Threaded Code. Er kann im Turbomodus (Interrupts deaktiviert) oder im Normalmodus (Interrupts aktiviert) laufen. In beiden Modi sind NMIs problematisch – aber der CPC nutzt sie ohnehin selten.

Was fehlt noch und sollte bald kommen?

  • Bessere Dateiunterstützung für AMSDOS? Hierbei brauche ich Hilfe.
  • Wie kommt man auf sinnvolle Art an Verzeichnisinformationen?
  • Fließkommazahlen (Floats)?
  • Kompilierte Sprites und irgendeine Art von Grafikbibliothek

Ich würde mich über euer Feedback freuen – mein Ziel ist es, daraus das nützlichste BASIC für 8-Bit-Rechner zu machen. Schade, dass es nicht self-hosted ist, aber wer weiß. Vielleicht läuft es eines Tages über den CPC-PI Link – quasi semi-self-hosted.

Wo bekommt man es?

Tutorial hier:

Demo-DSK-Images hier:

Julian

8 „Gefällt mir“

Wie sind wir hierhergekommen?

Vor etwa 20 Jahren hatte ich einen VB5- / VB6-Compiler (vbcc) teilweise in VB5 entwickelt, damit er sich selbst nach Assembler oder eine andere Hochsprache cross-compilieren konnte. Das funktionierte gut, aber damals war ich nicht mit allen Aufrufkonventionen für den Z80 zufrieden und das Projekt stoppte bei etwa 50 % der Codegenerierung. Abgesehen davon war es ein gut funktionierender VB5- / VB6-Parser (mit ein paar fehlenden Teilen).

Vor rund 10 Jahren hatte ich den Echtzeit-JavaScript-zu-Z80-POC (jscc) erstellt, der zeigte, dass man eine Teilmenge von JavaScript eintippen kann und der Z80-Code direkt während des Tippens erscheint – komplett generiert im Fenster auf der rechten Seite.

Ebenfalls vor etwa 10 Jahren hatte ich Teile von Primal (ein plattformübergreifendes Z80-Betriebssystem) erstellt – das hoffe ich eines Tages fertigzustellen – sowie Teile von MCP (Multitasking-Erweiterungen für Locomotive BASIC).

Vor ein paar Jahren habe ich das NTC-Konzept bewiesen, indem ich Code (tinybasic) generiert habe, der in der Regel lesbarer und schneller war, als die meisten Assembler-Programmierer schreiben konnten – „die meisten“ bedeutet hier nicht Experten; die meisten Experten schlagen diesen Compiler mit links.

Vor 2 Tagen habe ich das alles zusammen mit meinem KI-Freund zusammengebracht und das Bestehende ordentlich in Form geprügelt. VB5 nach JS konvertiert – die Fähigkeit entfernt, sich selbst zu kompilieren, die Fähigkeit entfernt, in verschiedene Zielsprachen zu kompilieren – Fokus auf Z80 gelegt, und hier ist das Ergebnis. Teile von vbcc, jscc, primal und mcp zusammengefügt, und das ist es, was ich bisher habe.

Hier ist skizziert, was ich geplant habe oder an Ideen mitbringe – es entwickelt sich ziemlich schnell. Wenn mir jemand Code für die schnellste Z80-Gleitkomma-Bibliothek, die schnellsten kompilierten Sprites, das einfachste gute Networking (M4? und Ethernet) sowie Dateisystem-Infos geben kann – dann kann ich Bibliotheken für NTC erstellen, die es für CPC-Programmierer, die BASIC schreiben wollen, wirklich komfortabel machen.

1 „Gefällt mir“

Das hat Spaß gemacht zu lesen​:slightly_smiling_face:

1 „Gefällt mir“

Jede Menge und gewaltiger Aufwand reingesteckt (beeindruckend) und scheint eine schöne und vollständige Implementierung eines modernen BASIC-Dialekts zu sein. Sogar Inline-Assembler scheint einfach machbar zu sein. Werde es mal ausprobieren. Ist wahlfreier Zugriff (Random Access) auf einem AMSDOS-Dateisystem wirklich möglich, oder habe ich da was falsch verstanden?

Probier es bitte mal aus. Es generiert Code für mehrere Targets – Random Access (Direktzugriff) ist derzeit nur für CP/M verfügbar. Für AMSDOS etc. ist es zwar möglich, aber ich weiß nicht, wie man das anstellt – zumindest nicht auf eine Art und Weise, die mit Floppy-Treibern, X-MASS, M4, Albireo etc. kompatibel ist.

Targets sind aktuell:

cpc – greift direkt auf die Hardware zu (bang the hardware), derzeit kein Nachladen nach dem Programmstart
cpcmin – greift direkt auf die Hardware zu, lässt die Firmware für den Dateisystemzugriff aber intakt
cpcfw – nutzt vollständig die Firmware
cp/m – funktioniert mit CPC CP/M 2.2, CP/M Plus, sollte auch auf SymbOS CP/M (werde ich später testen) & MSX laufen
cpcfwrom, cpcminrom, cpcrom – du kannst damit bauen und bis zu 8 KB Programmspeicher gewinnen, indem alle unterstützenden Schlüsselwörter im ROM liegen; bietet außerdem noch mehr Platz zum Erweitern

Ja, das sind maximal 3 ROMs, aber es bietet Entwicklern jede Menge Möglichkeiten. Man kann jetzt echte 4 MB große Programme in einem modernen BASIC ohne Turbo (wenn man möchte) und mit Schlüsselwörtern im ROM haben – was etwas langsamer ist, als wenn sie nicht im ROM liegen, da eine Umleitung dorthin nötig ist.

Bei allen Modellen kann der Benutzer wählen, NICHT mit Turbo-Optionen zu bauen – Turbo bedeutet übrigens nicht nur deaktivierte Interrupts, sondern eigentlich das Direct-Threaded-Code-Modell, bei dem der SP als PC genutzt wird, was in manchen Situationen für einen ordentlichen Leistungsschub sorgt – und es hängt von deiner Logik ab. Du kannst im laufenden Betrieb zwischen Turbo- und Nicht-Turbo-Modus umschalten, wenn du baust, ohne Turbo abzuschalten. Im ROM kostet das etwa 10T pro Aufruf.

Wie macht es das? Wenn Turbo aktiviert ist, baut der Compiler die Schlüsselwörter doppelt (sie liegen zweimal in den ROMs): Einen Standardmodus und einen Turbomodus. Während der Ausführung kann ein Thread wählen, welcher Modus ausgeführt werden soll, da der native Threaded-Modus immer die Turboversion aufruft, aber derselbe Thread, der nicht-nativ ausgeführt werden kann, den Nicht-Turbomodus ausführen muss. Das wurde aus Gründen der Kompatibilität gemacht und für Fälle, in denen man tatsächlich Interrupts aktiviert haben möchte. Der Turbomodus ist also quasi Interrupts aus + mehr Leistung.

Einige Timings findest du in der Readme.

1 „Gefällt mir“

Weitere Features hinzugefügt – ab sofort kannst du in verschiedenen Varianten („Flavours“) programmieren… VB5/VB6 ist der Standard, aber jetzt gehen auch JavaScript und Locomotive BASIC.

Es kann gut sein, dass die Locomotive-BASIC-Variante noch vollständiger wird, sobald weitere Bibliotheken hinzukommen. Aber fürs Erste erleichtert sie schon mal all jenen die Arbeit, die nicht gerne in modernem BASIC oder JS programmieren.

Hinweis: Du kannst die Syntax von Locomotive BASIC, JS und VB5 innerhalb eines einzigen Programms kombinieren – jeweils eine Variante pro Datei.

Benutzerhandbuch:

ntc/docs/userguide.md at master · PrimalNinja/ntc · GitHub (scrolle ein Stück nach unten, um zu den Flavours zu gelangen)

JS-Variante:

Locomotive-Variante:

Ich arbeite gerade daran, die ROMs umzustrukturieren, wenn du die ROM-Targets nutzen möchtest (noch nicht, um dein Programm im ROM abzulegen, sondern um Speicher zu sparen, indem die Runtime im ROM liegt).

1 „Gefällt mir“

Jede Menge neue Updates, ich hoffe, euch gefällt meine City3D-Demo. Hinweis: Die FPS-Zahl ist ein Bug, in der Version auf GitHub ist das behoben. Es war außerdem schwer, mit dem Handy wackelfrei zu filmen.

Music Witch Bias:

4 „Gefällt mir“

Gefällt mir wirklich gut, die Demo. Lässt sie sich auch steuern?

Sky Ranger kommt auf den CPC! Sehr beeindruckende Vektorgrafik.

Danke! Ich dachte, es ginge schneller, auf das Entfernen verdeckter Linien (Hidden Line Removal) zu verzichten. Inzwischen kommen mir Zweifel und ich werde eine Version mit Verdeckte-Linien-Entfernung ausprobieren — wenn ich 90 % der Gebäude nicht zeichnen muss, die man sowieso nicht sieht, sollte es schneller sein.

CyborgOS wurde dort jetzt als neues Projekt angelegt – es befindet sich noch in einem sehr frühen Stadium, erst wenige Stunden alt – damit kannst du mehrere CP/M-artige Programme mit jeweils vollen 61 KB, die in NTC BASIC geschrieben sind, gleichzeitig und voll präemptiv ausführen. Ich gehe davon aus, dass es noch schneller wird, aber es hat bewiesen, dass ich mehrere Programme in verschiedenen 64-KB-Bänken laufen lassen kann.

Die Anleitung findest du hier; du BRAUCHST mindestens 128 KB, um ein einzelnes 61-KB-Programm auszuführen. Mit 4 MB im aktuellen Build erhält man 5 Programme mit viel Platz für Daten, Klassen und Treiber – aber daran wird bereits gearbeitet. Es werden bald mehr als 5 Programme und eine höhere Reaktionsschnelligkeit folgen.

1 „Gefällt mir“