Hovercards BÁSICAS

¡Buuuueno! Siguiendo con las Hovercards del firmware y tras la sugerencia de @Devlin, ¡me he puesto manos a la obra y he implementado hovercards similares para las palabras clave de BASIC!

Debido a su similitud con el lenguaje natural, he tenido que limitarlas solo a los bloques de código:

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

¡Ta-chán!

Sin embargo, para que esto funcionara, también tuve que asegurarme de que solo actúe en los bloques de código BASIC. Y aunque he intentado que el sistema del foro identifique automáticamente el código BASIC en texto preformateado, esto no siempre funciona (tendré que arreglarlo en algún momento). Así que asegúrate de elegir BASIC al introducir un programa en este lenguaje:

Y eso es todo.

¡Cualquier comentario es más que bienvenido!

PD: Esto ha sido mucho más fácil de hacer de lo que pensaba en un principio, ya que el trabajo con el analizador del firmware y los bloques de código BASIC ya estaba hecho. Dicho esto, el mayor obstáculo fue extraer los comandos de BASIC de la propia wiki, debido a la protección antibots :joy:

PD2: Fuentes utilizadas para elaborar el resumen de BASIC:

  1. Locomotive BASIC Reference Manual: (Utilizado para la sintaxis exacta de las sentencias, corchetes de parámetros y diferencias entre versiones (BASIC 1.0 vs. 1.1).
  2. AMSDOS Firmware & Reference Manual (Soft 158): Utilizado para los 13 comandos nativos de disco de extensión del sistema residente (|), cambio de unidad y parámetros de sintaxis.
  3. CPCWiki Locomotive BASIC Category: documentación y tablas de tokens de ROM utilizadas para verificar comandos en casos límite (como COPYCHR$ y WINDOW SWAP) e interacciones de registros de hardware.

…todo se metió en Gemini, que generó el JSON necesario para el analizador.

¡Absolutamente genial!

Una duda… ¿sería posible listar de alguna forma los parámetros de las funciones de BASIC al pasar el cursor sobre ellas?

ENV es un buen ejemplo de un comando con varios parámetros.

Sí, eso es factible. No solo ENV, sino también ENT y SOUND. ¿Hay algún otro comando que acepte múltiples subparámetros?

Tengo pensado añadir un desglose detallado de parámetros a las tarjetas flotantes (hovercards) para esos y cualquier otro que necesitemos.

Vale, creo que ya lo he conseguido. He ampliado los siguientes comandos:

  1. AFTER: Retardo, índice de temporizador (0–3) y número de línea de destino.
  2. BORDER: Color primario y color alternativo de parpadeo.
  3. ENT: Número de envolvente (1–15), recuento de pasos de tono, tamaño de paso de variación de tono y duración de la pausa.
  4. ENV: Número de envolvente (1–15), recuento de pasos de volumen, tamaño de paso de variación de volumen, duración de la pausa y forma/período del PSG por hardware.
  5. EVERY: Intervalo de repetición, índice de temporizador (0–3) y número de línea de destino.
  6. INK: Número de pluma lógica, color físico 1 y color 2 de parpadeo.
  7. KEY DEF: Número de tecla (0–79), conmutador de repetición y códigos de caracteres sin mayúscula/con mayúscula/de control.
  8. ORIGIN: Desplazamiento de coordenadas (x, y) y límites de recorte de la ventana gráfica (izquierda, derecha, abajo, arriba).
  9. SOUND: Máscara de bits de canal, período de tono, duración/rendezvous, volumen, envolvente de volumen, envolvente de tono y período de ruido.
  10. SPEED INK: Duración del parpadeo fase 1 y fase 2.
  11. SPEED KEY: Retardo inicial y velocidad de repetición.
  12. SYMBOL: Código del carácter de destino (240–255) y los 8 bytes del mapa de bits de fila.
  13. WINDOW: Número de flujo (#0–#7) y coordenadas de la ventana rectangular (izquierda, derecha, arriba, abajo).

Además, he limitado la función del analizador sintáctico que genera las tarjetas flotantes para evitar que las cree después de las sentencias REM, ya que estas pueden contener lenguaje natural. Vamos a probarlo:

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 Notice that MODE, BORDER, and SOUND inside this comment stay unlinked
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, "Custom character: "; 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 and WAIT checks ignored here
150 END
200 PRINT #1, "*TICK* ";: RETURN

¿Qué te parece, @ervin? :slight_smile:

Esto es algo realmente genial. Puede que la próxima vez tenga que usar la CPC wiki para escribir mi código, ya que será más rápido que mirar en el manual.

Gracias, amigo, te lo agradezco mucho. A mí también me gustó cómo quedó, mejor de lo que esperaba. La verdad es que me ayudó bastante Gemini, que organizó todo de forma muy ordenada; si no, me habría llevado una eternidad compilarlo…

¿Debería crear un editor de BASIC basándome en esto en algún lugar del foro o de la wiki? Tal vez incluso podría hacerlo como una aplicación independiente; hay editores de código ya listos que podría aprovechar en lugar de reinventar la rueda, ¡y la estructura básica ya está hecha! Incluso podría admitir autocompletado y tal vez exportar a un archivo dsk ¡Y ADEMÁS ejecutarlo en el RVMPlayer integrado!

¿Quizás el creador de esto podría ayudar?

Seguro que estaría genial, pero no te sientas obligado. Has hecho un trabajo estupendo volviendo a poner todo en línea y toda esta nueva funcionalidad ya es una mejora enorme. ¡Probablemente te merezcas otro descanso muy pronto!

Ten cuidado de que tu protección antibot no te deje fuera de tu propio servidor algún día, con la IA diciéndote «:robot: :smiling_face_with_sunglasses: Hasta la vista, baby». :sweat_smile:

No te voy a mentir, fue un momento bastante incómodo​:joy: