Compilador cruzado NTC BASIC

Hola a todos, ¡cuánto tiempo!

Tengo una actualización importante para NTC BASIC. ¿Qué es NTC BASIC?

  • Es un compilador cruzado para Z80 que se ejecuta en el navegador
  • Su sintaxis se basa en VB5 / VB6
  • Soporta hasta 4 MB de RAM
  • En mis pruebas es más rápido que SCCZ80 y Small C, pero todavía no más rápido que SDCC (probablemente no lo sea nunca, pero esta es solo la primera versión, no llevamos 27 años de desarrollo)
  • El código compilado debería ejecutarse en CPC (enfocado a 64 kb, 128 kb o superior), con soporte para paginación y superposiciones (overlays; permite juegos de multicarga desde cinta).
  • El soporte de CP/M debería ser compatible con SymbOS (espero) y con MSX (espero).

¿Qué es NTC? Native Threaded Code (código enhebrado nativo). Puede ejecutarse en Modo Turbo (interrupciones deshabilitadas) o en Modo Normal (interrupciones habilitadas). En ambos modos, las NMI son malas, pero el CPC rara vez las utiliza.

¿Qué falta y debería llegar pronto?

  • ¿Mejor soporte de archivos para AMSDOS? En esto necesito ayuda.
  • ¿Cómo obtener la información del directorio de forma útil?
  • ¿Coma flotante (floats)?
  • Sprites compilados y algún tipo de librería gráfica

Me encantaría conocer su opinión; mi objetivo es convertirlo en el BASIC más útil para ordenadores de 8 bits. Es una lástima que no sea autohospedado (self-hosted), pero quién sabe. Quizás algún día pueda funcionar a través del enlace CPC-PI, de forma semiautohospedada.

¿Dónde pueden conseguirlo?

Tutorial aquí:

Imágenes DSK de demostración aquí:

Julian

8 Me gusta

¿Cómo llegamos hasta aquí?

Hace unos 20 años desarrollé un compilador de VB5 / VB6 (vbcc) parcialmente en VB5 para que pudiera autocompilarse de forma cruzada a ensamblador o a otro lenguaje de alto nivel. Funcionaba bien, pero en aquel momento no me convencían del todo las convenciones de llamada para el Z80 y el proyecto se detuvo cuando llevaba alrededor del 50 % de la generación de código. Aparte de eso, era un buen parser de VB5 / VB6 que funcionaba (aunque le faltaban algunas piezas).

Hace unos 10 años creé la prueba de concepto (POC) en tiempo real de JavaScript a Z80 (jscc), la cual demostraba que podías escribir un subconjunto de JavaScript y ver aparecer el código Z80 a medida que tecleabas, generado por completo en la ventana de la derecha.

Hace más o menos 10 años también creé partes de Primal (un sistema operativo para Z80 multiplataforma, el cual espero terminar algún día) y partes de MCP (añadidos de multitarea para Locomotive BASIC).

Hace unos años demostré el concepto de NTC generando código (tinybasic) que solía ser más legible y rápido de lo que la mayoría de los programadores de ensamblador lograban escribir —por «la mayoría» no me refiero a expertos; la mayoría de los expertos superará a este compilador sin despeinarse—.

Hace 2 días junté todo esto con la ayuda de mi amigo de IA y le di forma a palos a lo que tenía. Convertí el VB5 a JS, eliminé la capacidad de autocompilarse y la de compilar a distintos lenguajes destino, centrándome en el Z80, y aquí está el resultado. Tomando partes de vbcc, jscc, primal y mcp, esto es lo que he conseguido hasta ahora.

Aquí se resume lo que tengo planeado o en mente; está evolucionando bastante rápido. Si alguien puede facilitarme código para la biblioteca de coma flotante más rápida para Z80, los sprites compilados más rápidos, la red más sencilla y funcional (¿M4? y Ethernet) e información sobre sistemas de archivos, podré crear bibliotecas para NTC que resulten realmente prácticas para los programadores de CPC que quieran programar en BASIC.

1 me gusta

¡Fue una lectura muy entretenida!:slightly_smiling_face:

1 me gusta

Muchísimo y enorme esfuerzo realizado (impresionante) y parece ser una implementación fantástica y completa de un dialecto moderno de Basic. Incluso el ensamblador inline parece fácil de usar. Le daré una oportunidad. ¿El acceso aleatorio en un sistema de archivos Amsdos es realmente posible o leí algo mal?

Por favor, pruébalo. Genera código para múltiples plataformas de destino (targets); el acceso aleatorio actualmente solo está disponible para CP/M. Es posible para AMSDOS, etc., pero no sé cómo implementarlo, al menos no de una forma que sea compatible con controladores de disquetera, X-MASS, M4, Albireo, etc.

Los objetivos actualmente son:

cpc: acceso directo al hardware (bang the hardware), actualmente sin cargas adicionales tras cargar el programa
cpcmin: acceso directo al hardware, pero mantiene el firmware en su sitio para el acceso al sistema de archivos
cpcfw: usa completamente el firmware
cp/m: funciona con CPC CP/M 2.2, CP/M Plus, debería funcionar en Symbos CP/M (lo probaré más adelante) y MSX
cpcfwrom, cpcminrom, cpcrom: puedes compilar y ganar hasta 8 KB de espacio para el programa al tener todas las palabras clave de soporte en ROM, y aún queda más espacio para crecer

Sí, son un máximo de 3 ROM, pero ofrece muchas opciones a los desarrolladores. Ahora pueden tener programas reales de 4 MB en un BASIC moderno sin turbo (si quieren) y con las palabras clave en ROM, lo cual es un poco más lento que no tenerlas en ROM, ya que requiere una redirección para llegar allí.

En todos los modelos, el usuario puede optar por NO compilar con opciones de turbo; por cierto, el turbo no consiste simplemente en desactivar las interrupciones, en realidad es el modelo de código directamente enhebrado (direct threaded code) usando el SP como PC, lo que le da un gran rendimiento en algunas situaciones —y depende de tu lógica—, puedes alternar entre los modos turbo y no turbo sobre la marcha si compilas sin desactivar el turbo. En ROM da unos 10T por llamada.

¿Cómo hace esto? Con el turbo activado, el compilador compila las palabras clave dos veces (están en las ROM por duplicado). Un modo estándar y un modo turbo. Durante la ejecución, un hilo puede elegir qué modo ejecutar porque el modo enhebrado nativo siempre llama a la versión turbo, pero el mismo hilo que puede ejecutarse de forma no nativa tiene que ejecutar el modo sin turbo. Esto se hizo por compatibilidad y para cuando realmente quieres tener las interrupciones activadas. Por tanto, el modo turbo es como interrupciones desactivadas + mayor rendimiento.

Puedes ver algunos tiempos en el readme.

1 me gusta

He añadido más funciones: ahora puedes programar en distintos «sabores» (flavours)… siendo VB5/VB6 el predeterminado, pero ahora también JavaScript y Locomotive BASIC.

Es posible que la variante de Locomotive BASIC sea más completa a medida que se creen más librerías, pero por ahora, sigue facilitando el proceso para quienes no les gusta programar en BASIC moderno o JS.

Nota: puedes mezclar la sintaxis de Locomotive BASIC, JS y VB5 en un solo programa (un sabor por archivo).

Guía del usuario:

ntc/docs/userguide.md at master · PrimalNinja/ntc · GitHub (desplázate un poco hacia abajo para llegar a los sabores)

Sabor JS:

Sabor Locomotive:

Ahora estoy trabajando en reorganizar las ROMs para cuando quieras usar los objetivos de ROM (aún no poner tu programa en la ROM, sino ahorrar memoria teniendo el runtime en la ROM).

1 me gusta

Muchas más actualizaciones, espero que les guste mi demo de City3D. Nota: lo de los FPS es un bug, ya está arreglado en la versión de GitHub. También fue difícil grabar con el teléfono quieto.

Música Witch Bias:

4 Me gusta

Me gusta mucho esa demo. ¿Se puede controlar?

¡Sky Ranger llega al CPC! Un trabajo vectorial muy impresionante.

Gracias, pensé que sería más rápido no hacer la eliminación de líneas ocultas; ahora me lo estoy pensando mejor y probaré una versión con eliminación de líneas ocultas. Si no tengo que dibujar el 90 % del edificio que no se ve, debería ser más rápido.

CyborgOS ya está creado como un nuevo proyecto allí; está en fases muy iniciales, tiene apenas unas horas de vida. Te permite ejecutar de forma totalmente apropiativa (preemptive) y al mismo tiempo múltiples programas de tipo CP/M, con 61 KB completos cada uno codificados en NTC BASIC. Espero que se vuelva más rápido, pero demostró que puedo ejecutar varios programas en diferentes bancos de 64 KB.

Las instrucciones están aquí, NECESITAS al menos 128 KB para ejecutar un solo programa de 61 KB. Con 4 MB en la versión actual se obtienen 5 programas con suficiente espacio para datos, clases y controladores, pero eso ya se está solucionando. Se avecinan más de 5 y una mayor capacidad de respuesta.

1 me gusta

Hoy en día, NTC BASIC cuenta con soporte para Spectrum Next como plataforma de destino, además de múltiples juegos de ejemplo para disfrutar y aprender.

La demo está siendo controlada por mí

Hola:

Siempre me gustan los compiladores de BASIC para cualquier máquina de 8 bits. Quitan gran parte del dolor de cabeza de tener que escribir todo en ensamblador, así que bien hecho por el esfuerzo.

Sin duda lo probaré a fondo, pero tengo una pregunta rápida. ¿Cómo compilo el Z80? ¿Tengo que pegarlo en WinApe? Además, ¿soporta extensiones RSX? No le gustó uno de mis programas en el que primero creo 2 comandos RSX (usando sentencias DATA para meter el código máquina con POKE) y luego los uso en el programa BASIC principal.

Gracias