Ho un importante aggiornamento per NTC BASIC. Cos’è NTC BASIC?
È un cross-compilatore Z80 che gira nel browser
La sua sintassi è basata su VB5 / VB6
Supporta fino a 4 MB di RAM
Nei miei test è più veloce di SCCZ80 e Small C, ma non ancora più veloce di SDCC (probabilmente non lo sarà mai, ma siamo solo alla prima release, non a 27 anni di sviluppo alle spalle)
Il codice compilato dovrebbe girare su CPC (pensato per 64 KB, 128 KB e superiori) con supporto per paginazione e overlay (possibili giochi a caricamento multiplo da cassetta).
Il supporto CP/M dovrebbe essere compatibile con SymbOS (spero) e compatibile con MSX (spero).
Cos’è NTC? Native Threaded Code. Può girare in Turbo Mode (interrupt disabilitati) o in Normal Mode (interrupt abilitati). In entrambe le modalità, gli NMI creano problemi — ma il CPC li usa raramente.
Cosa manca e dovrebbe arrivare a breve?
Miglior supporto per i file per AMSDOS? Su questo ho bisogno di aiuto.
Come ottenere le informazioni sulle directory in modo utile?
Numeri a virgola mobile (Floats)?
Sprite compilati e una libreria grafica di qualche tipo
Mi farebbe molto piacere ricevere il vostro feedback — il mio obiettivo è renderlo il BASIC più utile per computer a 8 bit — un peccato che non sia self-hosted, ma chissà. Magari un giorno potrà girare tramite il CPC-PI Link — una sorta di semi-self-hosted.
Circa 20 anni fa avevo sviluppato un compilatore VB5 / VB6 (vbcc) parzialmente in VB5, in modo che potesse cross-compilare se stesso in assembly o in un altro linguaggio di alto livello. Funzionava bene, ma all’epoca non ero soddisfatto di tutte le convenzioni di chiamata per lo Z80 e il progetto si è fermato a circa il 50% della generazione del codice. A parte questo, era un parser VB5 / VB6 ben funzionante (con alcune parti mancanti).
Circa 10 anni fa ho creato il POC da JavaScript a Z80 in tempo reale (jscc), che dimostrava come fosse possibile digitare un sottoinsieme di JavaScript e vedere il codice Z80 apparire in tempo reale mentre si scriveva — interamente generato nella finestra a destra.
Sempre una decina d’anni fa ho realizzato alcune parti di Primal (un sistema operativo Z80 multipiattaforma) — che spero di finire un giorno —, e parti di MCP (estensioni multitasking per Locomotive BASIC).
Qualche anno fa ho dimostrato la validità del concept di NTC generando codice (tinybasic) che era tipicamente più leggibile e più veloce di quello che la maggior parte dei programmatori assembler riuscirebbe a scrivere — con «maggior parte» non intendo gli esperti, dato che la maggior parte degli esperti batterebbe questo compilatore a mani basse.
2 giorni fa ho messo tutto insieme con l’aiuto del mio amico IA e ho dato una sistemata a tutto ciò che avevo per rimetterlo in sesto. Ho convertito il codice da VB5 a JS — ho rimosso la capacità di auto-compilarsi, ho rimosso la possibilità di compilare verso diversi linguaggi target — concentrandomi sullo Z80, ed ecco il risultato. Ho preso parti di vbcc, jscc, primal, mcp e questo è ciò che ho ottenuto finora.
Qui viene riassunto ciò che ho pianificato o le idee che ho in mente — il progetto si sta evolvendo piuttosto rapidamente. Se qualcuno può fornirmi del codice per la libreria floating point per Z80 più veloce in assoluto, gli sprite compilati più veloci, una gestione di rete semplice ed efficace (M4? ed Ethernet), informazioni sul file system — allora potrò creare delle librerie per NTC che lo rendano davvero pratico per i programmatori CPC che vogliono scrivere in BASIC.
Un impegno davvero enorme e notevole (impressionante), e sembra un’implementazione bella e completa di un dialetto Basic moderno. Persino l’inline assembly sembra facile da usare. Lo proverò sicuramente. L’accesso casuale su un file system Amsdos è davvero possibile o ho letto male?
Fai pure una prova. Genera codice per diversi target: l’accesso casuale (random access) al momento è disponibile solo per CP/M. È fattibile anche per AMSDOS ecc., ma non so come farlo, o almeno non in un modo compatibile con driver floppy, X-MASS, M4, Albireo ecc.
I target attuali sono:
cpc - accesso diretto all’hardware (bang the hardware), attualmente nessun caricamento dopo l’avvio del programma
cpcmin - accesso diretto all’hardware, ma lascia il firmware attivo per l’accesso al file system
cpcfw - usa completamente il firmware
cp/m - funziona con CPC CP/M 2.2, CP/M Plus, dovrebbe funzionare su SymbOS CP/M (proverò più avanti) e MSX
cpcfwrom, cpcminrom, cpcrom - è possibile compilare e recuperare fino a 8 KB di spazio per il programma inserendo tutte le keyword di supporto in ROM, con ancora ulteriore margine di crescita
Sì, il limite è di 3 ROM al massimo, ma offre agli sviluppatori tantissime opzioni. Ora possono avere programmi effettivi da 4 MB in un BASIC moderno senza turbo (se preferiscono) e keyword su ROM — il che è un po’ più lento rispetto a non averle su ROM, dato che richiede un reindirizzamento per raggiungerle.
Per tutti i modelli l’utente può scegliere di NON compilare con le opzioni turbo: a proposito, il turbo non consiste semplicemente nel disabilitare gli interrupt, ma è in realtà il modello direct-threaded code che usa SP come PC, il che garantisce prestazioni notevoli in certe situazioni (dipende dalla logica usata). È possibile passare dalla modalità turbo a quella non-turbo al volo se si compila senza disattivare il turbo. In ROM comporta circa 10T per chiamata.
Come fa a funzionare? Con il turbo attivo, il compilatore genera le keyword due volte (sono presenti due volte nelle ROM): una modalità standard e una modalità turbo. Durante l’esecuzione, un thread può scegliere quale modalità eseguire poiché la modalità threaded nativa chiama sempre la versione turbo, mentre lo stesso thread che può essere eseguito in modo non nativo deve eseguire la modalità non-turbo. È stato fatto per compatibilità e per i casi in cui si ha effettivamente bisogno degli interrupt attivi. Quindi, la modalità turbo equivale a interrupt disattivati + maggiori prestazioni.
Aggiunte nuove funzionalità: ora è possibile programmare in diversi dialetti… VB5/VB6 è quello predefinito, ma ora sono disponibili anche JavaScript e Locomotive BASIC.
È probabile che il dialetto Locomotive BASIC diventi più completo man mano che verranno create nuove librerie, ma per ora semplifica comunque le cose a chi non ama programmare nel BASIC moderno o in JS.
Nota: puoi combinare la sintassi di Locomotive BASIC, JS e VB5 in un unico programma — un dialetto per ciascun file.
Ora sto lavorando alla riorganizzazione delle ROM per quando si desidera utilizzare i target ROM (non ancora per inserire il programma su ROM, ma per risparmiare memoria mantenendo il runtime in ROM).
Tantissimi altri aggiornamenti, spero che la mia demo di City3D vi piaccia. Nota: gli FPS sono un bug, è già risolto nella versione su GitHub. È stato anche difficile filmare tenendo il telefono fermo.
Grazie, pensavo sarebbe stato più veloce non eseguire la rimozione delle linee nascoste; ora ci sto ripensando e proverò una versione con la rimozione delle linee nascoste: se non devo disegnare il 90% dell’edificio che non si vede, dovrebbe essere più veloce.
CyborgOS è stato appena creato come nuovo progetto lì dentro: è ancora alle primissime fasi, ha solo poche ore di vita. Ti consente di eseguire più programmi di tipo CP/M, ciascuno con 61 KB completi scritti in NTC BASIC, contemporaneamente e con un multitasking completamente preemptive. Mi aspetto che diventi più veloce, ma ha dimostrato che posso eseguire più programmi in diversi banchi da 64 KB.
Le istruzioni sono qui; ti SERVONO almeno 128 KB per eseguire un singolo programma da 61 KB. Con 4 MB nella build attuale si possono eseguire 5 programmi con un sacco di dati, oltre a slot per classi e driver, ma ci sto lavorando. Ne arriveranno più di 5 e ci sarà anche una maggiore reattività.
I compilatori BASIC per qualsiasi macchina a 8 bit mi sono sempre piaciuti. Tolgono gran parte del fastidio di dover scrivere tutto in assembly, quindi complimenti per il tuo lavoro.
Lo proverò sicuramente per bene, ma avrei una domanda veloce. Come compilo lo Z80? Devo incollarlo dentro WinApe? Inoltre, gestisce le estensioni RSX? Non gli è piaciuto uno dei miei programmi in cui creo prima 2 comandi RSX (usando le istruzioni DATA per fare il poke del codice macchina) per poi usarli nel programma BASIC principale.
In realtà è basato su browser: scrivi i tuoi programmi direttamente nel browser (caricando ntc.html) ed è tutto qui per generare il tuo sorgente assembly, che viene creato man mano che digiti. Poi prendi quel sorgente e lo compili con l’assembler sjasmplus su Windows o Linux.