NTC BASIC Cross Compiler

Γεια σε όλους, καιρό έχουμε να τα πούμε.

Έχω μια σημαντική ενημέρωση για το NTC BASIC. Τι είναι το NTC BASIC;

  • Είναι ένας Z80 cross-compiler που τρέχει στον browser
  • Η σύνταξή του βασίζεται στη VB5 / VB6
  • Υποστηρίζει έως και 4MB RAM
  • Στις δοκιμές μου είναι ταχύτερο από το SCCZ80 και το Small C, αλλά όχι ακόμα ταχύτερο από το SDCC (πιθανότατα δεν θα γίνει ποτέ, αλλά βρισκόμαστε μόλις στην πρώτη έκδοση, όχι 27 χρόνια μετά)
  • Ο μεταγλωττισμένος κώδικας θα πρέπει να τρέχει σε CPC (προορίζεται για 64kb, 128kb και μεγαλύτερα) με υποστήριξη για paging και overlays (δυνατότητα για multiload παιχνίδια από κασέτα).
  • Η υποστήριξη CP/M θα πρέπει να είναι φιλική προς το SymbOS (ελπίζω) και προς το MSX (ελπίζω).

Τι είναι το NTC; Native Threaded Code. Μπορεί να τρέξει σε Turbo Mode (με απενεργοποιημένα τα interrupts) ή σε Normal Mode (με ενεργοποιημένα τα interrupts). Και στις δύο λειτουργίες, τα NMI δημιουργούν πρόβλημα — αλλά ο CPC σπάνια τα χρησιμοποιεί.

Τι λείπει και αναμένεται σύντομα;

  • Καλύτερη υποστήριξη αρχείων για το AMSDOS; Εδώ χρειάζομαι βοήθεια.
  • Πώς να παίρνει κανείς πληροφορίες καταλόγου με χρήσιμο τρόπο;
  • Αριθμοί κινητής υποδιαστολής (floats);
  • Compiled Sprites και κάποιου είδους βιβλιοθήκη γραφικών

Θα εκτιμούσα πολύ το feedback σας — στόχος μου είναι να το κάνω την πιο χρήσιμη BASIC για 8-bit υπολογιστές — κρίμα που δεν είναι self-hosted, αλλά ποιος ξέρει. Ίσως κάποια μέρα να μπορεί να τρέξει μέσω του CPC-PI Link — semi-self-hosted.

Πού μπορείτε να το βρείτε;

Οδηγός (tutorial) εδώ:

Demo DSK images εδώ:

Julian

8 «Μου αρέσει»

Πώς φτάσαμε ως εδώ;

Πριν από περίπου 20 χρόνια είχα αναπτύξει έναν compiler για VB5 / VB6 (vbcc) εν μέρει σε VB5, ώστε να μπορεί να κάνει cross-compile στον εαυτό του σε assembly ή σε κάποια άλλη γλώσσα υψηλού επιπέδου. Αυτό δούλευε καλά, αλλά δεν ήμουν ευχαριστημένος με όλες τις συμβάσεις κλήσης (calling conventions) εκείνη την εποχή για τον Z80 και το έργο σταμάτησε περίπου στο 50% της παραγωγής κώδικα. Πέρα από αυτό, ήταν ένας καλός και λειτουργικός parser για VB5 / VB6 (με μερικά κομμάτια να λείπουν).

Πριν από περίπου 10 χρόνια είχα φτιάξει το realtime JavaScript σε Z80 POC (jscc), το οποίο έδειχνε ότι μπορείς να πληκτρολογείς ένα υποσύνολο της JavaScript και να βλέπεις κώδικα Z80 να εμφανίζεται καθώς γράφεις — πλήρως παραγόμενος στο παράθυρο στα δεξιά.

Περίπου πριν από 10 χρόνια είχα δημιουργήσει μέρη του Primal (cross platform Z80-os) — αυτό ελπίζω να το τελειώσω κάποια μέρα —, μέρη του MCP (προσθήκες πολυδιεργασίας για την Locomotive BASIC).

Πριν από μερικά χρόνια απέδειξα το concept του NTC παράγοντας κώδικα (tinybasic) που ήταν συνήθως πιο ευανάγνωστος και πιο γρήγορος απ’ ό,τι μπορούσαν να γράψουν οι περισσότεροι προγραμματιστές σε assembler — το «περισσότεροι» εδώ δεν σημαίνει οι ειδικοί· οι περισσότεροι ειδικοί θα νικούσαν αυτόν τον compiler πανεύκολα.

Πριν από 2 μέρες τα συγκέντρωσα όλα μαζί με τη βοήθεια του AI φίλου μου και έστρωσα για τα καλά ό,τι είχα. Μετέτρεψα τη VB5 σε JS — αφαίρεσα τη δυνατότητα να κάνει compile στον εαυτό του, αφαίρεσα τη δυνατότητα να κάνει compile σε διαφορετικές γλώσσες-στόχους —, εστίασα στον Z80 και ορίστε το αποτέλεσμα. Παίρνοντας κομμάτια από τα vbcc, jscc, primal, mcp, αυτό είναι ό,τι έχω καταφέρει μέχρι στιγμής.

Εδώ περιγράφονται όσα έχω σχεδιάσει ή ιδέες — εξελίσσεται αρκετά γρήγορα. Αν κάποιος μπορεί να μου δώσει κώδικα για την ταχύτερη βιβλιοθήκη κινητής υποδιαστολής (floating point) για Z80, τα ταχύτερα compiled sprites, την απλούστερη καλή δικτύωση (M4; και Ethernet), πληροφορίες για το σύστημα αρχείων — τότε μπορώ να δημιουργήσω βιβλιοθήκες για το NTC που θα το κάνουν πραγματικά βολικό για προγραμματιστές του CPC που θέλουν να γράφουν BASIC.

1 «Μου αρέσει»

Ήταν ένα διασκεδαστικό ανάγνωσμα🙂

1 «Μου αρέσει»

Έχει γίνει πάρα πολλή και τεράστια δουλειά (εντυπωσιακό) και φαίνεται να είναι μια ωραία και ολοκληρωμένη υλοποίηση μιας σύγχρονης διαλέκτου Basic. Ακόμα και η inline assembly φαίνεται να γίνεται εύκολα. Θα το δοκιμάσω. Είναι όντως δυνατή η τυχαία προσπέλαση (random access) σε σύστημα αρχείων Amsdos ή διάβασα κάτι λάθος;

Δοκιμάστε το, παρακαλώ. Παράγει κώδικα για πολλαπλούς στόχους (targets) — η τυχαία προσπέλαση (random access) είναι προς το παρόν διαθέσιμη μόνο για CP/M. Είναι εφικτή για AMSDOS κ.λπ., αλλά δεν ξέρω πώς να το κάνω — τουλάχιστον όχι με τρόπο που να είναι συμβατός με προγράμματα οδήγησης δισκέτας, X-MASS, M4, Albiero κ.λπ.

Οι στόχοι προς το παρόν είναι:

cpc - χτυπάει απευθείας το υλικό (bang the hardware), προς το παρόν δεν υπάρχει φόρτωση μετά τη φόρτωση του προγράμματος
cpcmin - χτυπάει το υλικό, αλλά αφήνει το υλικολογισμικό (firmware) στη θέση του για πρόσβαση στο σύστημα αρχείων
cpcfw - χρησιμοποιεί πλήρως το υλικολογισμικό
cp/m - λειτουργεί με CPC CP/M 2.2, CP/M Plus, θα πρέπει να λειτουργεί και σε Symbos CP/M (θα το δοκιμάσω αργότερα) & MSX
cpcfwrom, cpcminrom, cpcrom - μπορείτε να κάνετε build και να κερδίσετε έως και 8kb χώρο προγράμματος έχοντας όλες τις υποστηρικτικές λέξεις-κλειδιά στη ROM, με ακόμη περισσότερο περιθώριο επέκτασης

Ναι, αυτό είναι το πολύ 3 ROM, αλλά δίνει στους προγραμματιστές πολλές επιλογές. Μπορούν πλέον να έχουν πραγματικά προγράμματα 4mb σε μια σύγχρονη BASIC χωρίς turbo (αν θέλουν) και τις λέξεις-κλειδιά στη ROM — κάτι που είναι λίγο πιο αργό σε σχέση με το να μην είναι στη ROM, καθώς απαιτεί ανακατεύθυνση για να φτάσει εκεί.

Σε όλα τα μοντέλα ο χρήστης μπορεί να επιλέξει να ΜΗΝ κάνει build με επιλογές turbo — το turbo δεν είναι απλώς απενεργοποιημένες διακοπές (interrupts) παρεμπιπτόντως, είναι στην πραγματικότητα το μοντέλο direct threaded code που χρησιμοποιεί τον SP ως PC, κάτι που του δίνει εξαιρετική απόδοση σε ορισμένες περιπτώσεις — και εξαρτάται από τη λογική σας — μπορείτε να αλλάζετε μεταξύ λειτουργιών turbo και μη turbo εν κινήσει (on the fly) αν κάνετε build χωρίς να απενεργοποιήσετε το turbo. Στη ROM δίνει περίπου 10T ανά κλήση.

Πώς το κάνει αυτό; Ο compiler, με ενεργοποιημένο το turbo, κάνει build τις λέξεις-κλειδιά δύο φορές (βρίσκονται στις ROM δύο φορές). Μία τυπική λειτουργία και μία λειτουργία turbo. Κατά την εκτέλεση, ένα thread μπορεί να επιλέξει ποια λειτουργία θα εκτελέσει, επειδή η native threaded λειτουργία καλεί πάντα την έκδοση turbo, αλλά το ίδιο thread που μπορεί να εκτελεστεί μη εγγενώς (non-natively) πρέπει να εκτελέσει τη μη turbo λειτουργία. Αυτό έγινε για λόγους συμβατότητας και για τις περιπτώσεις που θέλετε πραγματικά ενεργοποιημένες τις διακοπές. Επομένως, η λειτουργία turbo είναι ουσιαστικά απενεργοποιημένες διακοπές + περισσότερη απόδοση.

Μπορείτε να δείτε κάποιους χρόνους (timings) στο readme.

1 «Μου αρέσει»

Προστέθηκαν περισσότερες δυνατότητες - τώρα μπορείτε να γράψετε κώδικα σε διάφορες παραλλαγές (flavours)… με την VB5/VB6 να είναι η προεπιλογή, αλλά τώρα και σε JavaScript και Locomotive BASIC.

Είναι πιθανό η παραλλαγή Locomotive BASIC να γίνει πιο ολοκληρωμένη καθώς δημιουργούνται περισσότερες βιβλιοθήκες, αλλά προς το παρόν, διευκολύνει τη διαδικασία για όσους δεν προτιμούν να γράφουν κώδικα σε σύγχρονη BASIC ή JS.

Σημείωση: μπορείτε να συνδυάσετε σύνταξη Locomotive BASIC, JS και VB5 σε ένα ενιαίο πρόγραμμα - μία παραλλαγή ανά αρχείο.

Οδηγός Χρήσης:

ntc/docs/userguide.md at master · PrimalNinja/ntc · GitHub (κάντε λίγο scroll προς τα κάτω για να βρείτε τις παραλλαγές)

JS Flavour:

Locomotive Flavour:

Αυτή τη στιγμή εργάζομαι στην αναδιοργάνωση των ROM για όταν θέλετε να χρησιμοποιήσετε τα ROM targets (όχι ακόμα για να βάλετε το πρόγραμμά σας σε ROM, αλλά για εξοικονόμηση μνήμης έχοντας το runtime σε ROM).

1 «Μου αρέσει»

Πολλές ακόμα ενημερώσεις, ελπίζω να σας αρέσει το City3D demo μου. σημείωση: το θέμα με τα FPS είναι bug, έχει διορθωθεί στην έκδοση στο GitHub. Ήταν επίσης δύσκολο να τραβήξω σταθερό βίντεο με το κινητό μου.

Μουσική Witch Bias:

4 «Μου αρέσει»

Μου αρέσει πολύ αυτό το demo. Μπορεί να είναι ελεγχόμενο;

Το Sky Ranger έρχεται στον CPC! Πολύ εντυπωσιακή δουλειά με διανυσματικά γραφικά.

Ευχαριστώ, νόμιζα ότι θα ήταν πιο γρήγορο να μην κάνω αφαίρεση κρυφών γραμμών (hidden line removal) — τώρα το ξανασκέφτομαι και θα δοκιμάσω μια έκδοση με αφαίρεση κρυφών γραμμών — αν δεν χρειάζεται να σχεδιάζω το 90% του κτιρίου που δεν φαίνεται, θα έπρεπε να είναι πιο γρήγορο.

Το CyborgOS έχει πλέον δημιουργηθεί ως νέο έργο εκεί μέσα — βρίσκεται σε πολύ πρώιμο στάδιο, μόλις λίγων ωρών — και σου επιτρέπει να εκτελείς ταυτόχρονα πολλαπλά προγράμματα τύπου CP/M, με πλήρη μνήμη 61KB το καθένα γραμμένα σε NTC BASIC, με πλήρη προεκτοπιστική πολυδιεργασία (fully pre-emptive). Περιμένω να γίνει πιο γρήγορο, αλλά απέδειξε ότι μπορώ να εκτελώ πολλαπλά προγράμματα σε διαφορετικές τράπεζες μνήμης (banks) των 64kb.

Οι οδηγίες βρίσκονται εδώ, ΧΡΕΙΑΖΕΣΑΙ τουλάχιστον 128kb για να τρέξεις ένα μόνο πρόγραμμα των 61kb. Τα 4mb στην τρέχουσα έκδοση επιτρέπουν 5 προγράμματα με άφθονο χώρο για δεδομένα, κλάσεις και drivers — αλλά αυτό το ζήτημα διευθετείται. Έρχεται υποστήριξη για περισσότερα από 5, καθώς και καλύτερη απόκριση.

1 «Μου αρέσει»

Σήμερα η NTC BASIC υποστηρίζει το Spectrum Next ως πλατφόρμα-στόχο, παρέχοντας πολλαπλά παιχνίδια ως παραδείγματα για να διασκεδάσετε και να μάθετε.

Η παρουσίαση ελέγχεται από εμένα