Nuclear Invaders para JUPITER ACE

Foro dedicado a la programación en todo tipo de sistemas clásicos.
Avatar de Usuario
programandala_net
Dragon 32
Dragon 32
Mensajes: 27
Registrado: 23 Dic 2015, 02:44
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Contactar:

Re: Nuclear Invaders para JUPITER ACE

Mensajepor programandala_net » 16 Feb 2016, 14:52

dancresp escribió:EL LISTADO

Código: Seleccionar todo

0 VARIABLE X   0 VARIABLE H   0 VARIABLE V   0 VARIABLE U   0 VARIABLE L
0 VARIABLE N   0 VARIABLE R   0 VARIABLE P   0 VARIABLE S   0 VARIABLE D

: CLRSCR 2 0 AT 608 SPACES ;

: PAUSA 0 DO 200 0 DO LOOP LOOP ;

: USING AT DUP DUP DUP 1000 < IF 48 EMIT THEN 100 < IF 48 EMIT THEN 10 < IF 48 EMIT THEN . ;

: RND 15403 C@ 31 AND ;

: GRAFICOS 1 3 7 13 15 5 8 4 128 192 224 176 240 160 16 32 1 3 7 13 15 2 10 128 192 224 176 240 64 160 80 8 36 47 59 63 31 8 16 32 72 232 184 248 240 32 16 8 4 15 27 63 63 40 6 32 64 224 176 248 248 40 192 3 31 63 57 63 14 25 12 192 248 252 156 252 112 152 48 3 31 63 57 63 6 13 48 192 248 252 156 252 96 176 12 1 3 3 127 255 255 255 255 0 128 128 252 254 254 254 254 0 7 31 63 109 255 57 16 0 224 248 252 182 255 156 8 4 34 16 8 96 4 18 36 64 136 16 32 12 32 144 72 0 1 1 1 1 1 0 0 66 32 71 15 30 76 135 35 2 100 240 250 217 240 196 18 251 251 251 0 223 223 223 0 0 0 0 0 0 0 255 0 3 28 35 32 33 35 33 32 224 28 226 2 194 226 194 130 37 47 46 38 32 28 3 0 82 122 58 50 2 28 224 0 12039 12255 DO I C! -1 +LOOP ;

: INSTRU CLS 1 8 AT ." NUCLEAR INVADERS" 6 4 AT ." CONTROLS: LEFT  = Z" 7 14 AT ." RIGHT = X" 8 14 AT ." FIRE  = ENTER" 14 6 AT ." *PRESS KEY TO START*" 21 6 AT ." C SCAINET SOFT, 2013" BEGIN INKEY UNTIL 9 PAUSA ;

: PRESENTA CLS ."  SCORE<1>   HI-SCORE   SCORE<2>" S @ 1 3 USING R @ 1 14 USING 5 14 AT ." PLAY" 7 8 AT ." NUCLEAR INVADERS" 10 5 AT ." *SCORE ADVANCE TABLE*" 12 9 AT ." op =? MYSTERY" 14 9 AT ." cd =30 POINTS" 16 9 AT ." gh =20 POINTS" 18 9 AT ." kl=10 POINTS" 22 4 AT ." mnmn" 13 SPACES ." CREDIT 00" BEGIN INKEY UNTIL CLRSCR 21 1 AT ." wwwwwwwwwwwwwwwwwwwwwwwwwwwwww" 22 2 AT ." 3" 11 9 AT ." PLAY PLAYER<1>" 10 0 DO 1 3 AT 4 SPACES 3 PAUSA 1 3 AT ." 0000" 3 PAUSA LOOP 3 L ! 2 N ! 0 S ! ;

: INICIO CLRSCR 15 15 N @ - DUP U ! AT N @ 2 * 2 + DUP 0 DO ." v" LOOP 4 U @ AT 0 DO ." v" LOOP 3 13 DO U @ DUP I SWAP AT ." v" N @ 0 DO ." xy" LOOP ." v" I 1+ SWAP AT ." v" N @ 0 DO ." z{" LOOP ." v" -2 +LOOP 99 103 DUP 107 DUP 3 13 DO I 1 AT DUP EMIT DUP 1+ EMIT I 29 AT DUP EMIT 1+ EMIT -2 +LOOP 3 0 5 0 99 3 0 7 0 103 3 0 9 0 103 3 0 11 0 107 3 0 5 29 99 3 0 7 29 103 3 0 9 29 103 3 0 11 29 107 3 0 13 29 107 9999 10049 DO I C! -1 +LOOP -200 U ! 3 X ! 0 V ! 10000 P ! 30 D ! ;

: MOVER X @ DUP 27 < IF INKEY 120 = IF X @ 1+ X ! THEN THEN 3 > IF INKEY 122 = IF X @ 1- X ! THEN 20 X @ 1- AT ."  mn " ;

: INVASOR P @ C@ O> IF P @ 1+ C@ 0= IF RND D @ 5 < IF 10 ELSE 26 THEN > IF 1 P @ 1+ C! THEN 0 ELSE P @ 10025 < IF 1 ELSE -1 THEN DUP DUP P @ 3 + C@ + P @ 3 + C! P @ 2 + C@ P @ 3 + C@ AT 0> IF SPACE THEN P @ 4 + C@ P @ 3 + C@ 2 MOD 0> IF 2 - THEN DUP EMIT 1+ EMIT 0< IF SPACE THEN P @ 3 + C@ DUP 14 N @ -  = IF DROP 1 ELSE 15 N @ + = IF 1 ELSE 0 THEN THEN THEN ELSE 0 THEN P @ 10045 = IF 10000 ELSE P @ 5 + THEN P ! ;

: UFO U @ DUP 0< IF 1+ U ! ELSE DUP 27 > IF 3 SWAP AT 3 SPACES -200 U ! ELSE 1+ DUP U ! 3 SWAP AT ."  op" THEN THEN ;

: DISPARO V @ 0= IF INKEY 13 = IF X @ H ! 19 V ! THEN ELSE V @ DUP H @ AT SPACE 5 < IF 0 V ! ELSE V @ 2- V ! IMPACTO 0= IF V @ H @ AT 115 EMIT THEN THEN THEN ;

: IMPACTO 9216 V @ 32 * + H @ + C@ 32 = IF 0 ELSE V @ 15 < IF V @ 3 = IF 3 U @ 1+ AT ." tu" 18 12 DO I 15 BEEP LOOP RND 12 / 1+ 50 * DUP 3 U @ 1+ AT . S @ + DUP S ! 1 3 USING 20 PAUSA 3 U @ AT 4 SPACES 200 U ! ELSE D @ 1- D ! V @ 3 - 2 / H @ 15 > IF 5 + THEN V @ DUP 5 = IF DROP 30 ELSE 10 > IF 10 ELSE 20 THEN THEN S @ + DUP S ! 1 3 USING 1- 5 * 10000 + V ! V @ 2 + C@ V @ 3 + C@ DUP 15 < IF 1+ THEN 2 PICK 2 PICK AT ." qr" 10 100 BEEP AT 2 SPACES V @ DUP C@ 1- SWAP C! V @ C@ 0> IF 0 V @ 1+ C! H @ 15 < IF 0 ELSE 29 THEN V @ 3 + C! V @ 2 + C@ V @ 3 + C@ AT H @ 15 < IF SPACE THEN V @ 4 + C@ DUP EMIT 1+ EMIT THEN THEN THEN 0 V ! 1 THEN ;

: VIDAS 100 200 DO I 20 BEEP -5 +LOOP 30 PAUSA L @ 1- DUP DUP 0> IF DUP 22 AT . DUP 2 * 2 + 22 SWAP AT 2 SPACES ELSE 17 11 AT ." GAME  OVER" S @ R @ > IF S @ R ! THEN THEN L ! 0= ;

: FASE D @ 0= IF N @ DUP 5 < IF 1+ THEN N ! 100 PAUSA INICIO THEN ;

: RUN 9 PAUSA GRAFICOS INSTRU BEGIN PRESENTA BEGIN INICIO BEGIN 2 PAUSA MOVER DISPARO UFO FASE INVASOR UNTIL VIDAS UNTIL 200 PAUSA 0 UNTIL ;



Te felicito tanto por el juego en sí, que me parece muy atractivo y logrado (aunque aún no he podido probarlo porque antes tengo que volver a compilar los emuladors xAce o Canace y tengo alguna pega por resolver). como por la explicación tan detallada. Me gustan los juegos con resolución de texto, y el mapa de pantalla de Jupiter ACE es ideal para ello.

He empezado a hacer una versión de tu juego para mi Solo Forth para ZX Spectrum, e iré mostrando el progreso. El caso es que al empezar a adaptar el código me han surgido algunas dudas sobre cómo hiciste el desarrollo:

¿Cómo obtuviste este listado? ¿Es la fuente original y la escribiste en un editor del sistema anfitrión para después hacer que el emulador la «tecleara» en la Jupiter ACE? ¿O escribiste la fuente en la máquina emulada y después extrajiste el listado de alguna manera? Ninguna de las dos opciones me cuadra, porque he encontrado alguna errata que impediría ejecutar la fuente tal cual está. ¿O tal vez tecleaste después la fuente original para poder mostrarla en el foro? Pero si la hubieras tecleado la habrías indentado, supongo. Por todo esto me he quedado con la duda de cómo hiciste el desarrollo.

También me ha sorprendido mucho que escribieras palabras tan largas, de más 600 octetos de fuente, cuando lo habitual y lo más eficaz en Forth (para desarrollar rápidamente, hacer que el código sea legible, fácil de depurar y mantener) es escribir palabras muy cortas (de una o dos líneas y unas pocas palabras) que hagan funciones muy concretas y reutilizables, con nombres claros. De hecho, pienso que el formato de la fuente del juego es la causa de que afirmes que Forth te resulta difícil de probar y depurar: escrito con ese formato, con palabras larguísimas y tantos condicionales anidados, es muy difícil después seguir el código.

Lógicamente, la factorización supone una pérdida de rendimiento en tiempo de ejecución, que en una máquina como Jupiter ACE puede ser apreciable. ¿Escribiste el código de esta manera para ganar velocidad, a pesar de que en alguna parte explicas que tuviste que frenar el juego? ¿O lo escribiste así de forma inconsciente al trasladar los algoritmos de tu versión en BASIC para MSX?
Marcos Cruz (programandala.net)

dancresp
Amiga 1200
Amiga 1200
Mensajes: 1393
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 3 veces
Gracias recibidas: 20 veces

Re: Nuclear Invaders para JUPITER ACE

Mensajepor dancresp » 16 Feb 2016, 18:26

El programa lo redacté enterito en un emulador de Jupiter ACE, aunque ahora mismo no recuerdo si fue el SpudAce o el EightyOne. Creo que fue con el primero.

Y si, lo tecleé en el editor del propio sistema, que es como me gusta hacer mis programas. Nunca utilizo herramientas que faciliten el trabajo. Me gusta "sufrir" las inclemencias del equipo en cuestión. Y salvo muy contados casos, siempre trabajo con el equipo real, dejando la emulación para los sistemas que no tengo.

¿Y como he estructurado el programa? pues como no soy un experto en Forth pero tenía ganas de hacer algo, me limité a dividirlo en pocas palabras que hicieran cosas muy concretas. No tengo ninguna duda que se puede hacer mejor, pero para ser mi primer programa serio... estoy bastante orgulloso. Si programo más, trataré de mejorar, que es lo que intento siempre.

Eso si, funcionar funciona, y sin duda es la versión más rápida de las que he hecho, con bastante diferencia.
Buscando la IP de la W.O.P.R.

Avatar de Usuario
programandala_net
Dragon 32
Dragon 32
Mensajes: 27
Registrado: 23 Dic 2015, 02:44
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Contactar:

Re: Nuclear Invaders para JUPITER ACE

Mensajepor programandala_net » 16 Feb 2016, 19:22

dancresp escribió:El programa lo redacté enterito en un emulador de Jupiter ACE, aunque ahora mismo no recuerdo si fue el SpudAce o el EightyOne. Creo que fue con el primero.

Y si, lo tecleé en el editor del propio sistema, que es como me gusta hacer mis programas. Nunca utilizo herramientas que faciliten el trabajo. Me gusta "sufrir" las inclemencias del equipo en cuestión. Y salvo muy contados casos, siempre trabajo con el equipo real, dejando la emulación para los sistemas que no tengo.


A mí, al contrario, me gusta más trabajar con emuladores y escribir las fuentes con herramientas actuales, como el editor Vim, y crear una cadena de herramientas que me convierta la fuente en un soporte ya listo para ser usado, como un TAP o un DSK a un MGT o lo que haga falta, de forma muy parecida a como se desarrollaría para una plataforma moderna. Aunque a menudo hay cosas que me gusta hacer en la máquina emulada también.

Tiene mucho merito escribir ese código en el editor de Jupiter ACE, a pesar de que es un editor muy bueno para lo que era habitual en los sitemas Forth de la época. Lo que más me hizo dudar de cómo lo habrías escrito era que he encontrado alguna errata. Por ejemplo `0>` (con O de Oviedo) en lugar de `0>` (con cero); o el gráfico que sirve de línea y tiene por datos `0 0 0 0 0 255 0 3` en lugar de `0 0 0 0 0 255 0 0`; y alguna otra similar. Esto me hizo pensar que quizá habías escrito la fuente en la Jupiter ACE, y después la habías tecleado en un editor o la habías imprimido y le habías pasado un OCR. A eso me refería, pues con esas erratas no podía ser la misma fuente usada en ACE Forth, no hubiera funcionado.

dancresp escribió:me limité a dividirlo en pocas palabras que hicieran cosas muy concretas.


Son cosas concretas pero muy amplias, como ocuparse de los impactos, o del movimiento de las naves. Entonces, al hacer pocas palabras muy largas seguiste necesariamente la lógica de los algoritmos originales de BASIC. Esto facilita la traducción desde BASIC y hace el código algo más rápido, porque evitas las llamadas a palabras, pero también lo hace difícil de entender después.

He visto que kmurta, en la versión que hizo después para ZX81, se limitó a adaptar el código específico de Jupiter ACE a ZX81, sin tocar el resto del código. Yo quiero hacer una versión que estéticamente sea igual, salvo por la adición de color y algún pequeño detalle más, pero que el propio código esté factorizado y estructurado de otra forma, con palabras muy pequeñas, para que sea fácil de leer, depurar y modificar. A ver qué tal.

Ya me han surgido algunas dudas durante la conversión, que me gustaría consultarte más adelante.

dancresp escribió:Eso si, funcionar funciona, y sin duda es la versión más rápida de las que he hecho, con bastante diferencia.


Estoy deseando probarlo. A ver consigo compilar de nuevo los emuladores de Jupiter ACE.

Te mandé un mensaje privado sobre la lista de correo de Forth. Échale un vistazo, por favor.
Marcos Cruz (programandala.net)

dancresp
Amiga 1200
Amiga 1200
Mensajes: 1393
Registrado: 23 Dic 2008, 17:53
Sistema Favorito: MSX
primer_sistema: ZX81
Primera consola: Atari 2600
Gracias dadas: 3 veces
Gracias recibidas: 20 veces

Re: Nuclear Invaders para JUPITER ACE

Mensajepor dancresp » 16 Feb 2016, 21:54

programandala_net escribió:Tiene mucho merito escribir ese código en el editor de Jupiter ACE, a pesar de que es un editor muy bueno para lo que era habitual en los sitemas Forth de la época. Lo que más me hizo dudar de cómo lo habrías escrito era que he encontrado alguna errata. Por ejemplo `0>` (con O de Oviedo) en lugar de `0>` (con cero); o el gráfico que sirve de línea y tiene por datos `0 0 0 0 0 255 0 3` en lugar de `0 0 0 0 0 255 0 0`; y alguna otra similar. Esto me hizo pensar que quizá habías escrito la fuente en la Jupiter ACE, y después la habías tecleado en un editor o la habías imprimido y le habías pasado un OCR. A eso me refería, pues con esas erratas no podía ser la misma fuente usada en ACE Forth, no hubiera funcionado.

Sabía que me dejaba de responder alguna cosa... >|

Es posible que hayan, y por lo visto lo hay, errores en el listado, pero es que el proceso es exactamente inverso a como lo haces tú.

Programé el juego en el editor del Jupiter Ace, y cuando di el juego por finalizado me llevé la "grata" sorpresa de que por lo visto... no hay forma de listar el programa !!! ](*,)

De esta forma, tuve la santa paciencia de teclear el listado entero en el Notepad++, y claro, como es un engorro y encima soy humano, se me debe haber colado algún error. Si me dices donde, los cambio en el código del post original ya que no me gusta que esté mal.

Este problema de listar me pasa cuando programo con los Atari 8 bits, y algún otro, y como no tengo forma de pasar el código a PC, pues lo tecleo... y pasa lo que pasa. :tecle:

Pues nada más, espero ansioso tú versión, que soy de los que les gusta acostarse sabiendo algo más.

Un saludo
Buscando la IP de la W.O.P.R.

Avatar de Usuario
carmeloco
MSX Turbo R
MSX Turbo R
Mensajes: 318
Registrado: 02 Ene 2016, 17:19
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum +2
consola_favorita: Nintendo GameBoy
Primera consola: Nintendo GameBoy
Gracias dadas: 1 vez
Gracias recibidas: 13 veces

Re: Nuclear Invaders para JUPITER ACE

Mensajepor carmeloco » 16 Feb 2016, 22:41

Desconozco esas máquinas, pero en spectrum hay una forma de pasar un listado al pc, siempre y cuando, sea un modelo con puerto serie, y es conectando el spectrum al pc por puerto serie, abrir en el pc un terminal serie y en el spectrum se da la orden de imprimir el listado con LLIST.

Como dije, desconozco que se puedan hacer estas cosas en esas máquinas, pero es una idea.

Avatar de Usuario
programandala_net
Dragon 32
Dragon 32
Mensajes: 27
Registrado: 23 Dic 2015, 02:44
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Contactar:

Re: Nuclear Invaders para JUPITER ACE

Mensajepor programandala_net » 18 Feb 2016, 18:54

dancresp escribió:tuve la santa paciencia de teclear el listado entero en el Notepad++, y claro, como es un engorro y encima soy humano, se me debe haber colado algún error. Si me dices donde, los cambio en el código del post original ya que no me gusta que esté mal.


Por lo que he visto en el manual, ACE Forth tiene una variable del sistema que permite redirigir la salida de pantalla a otro dispositivo, pero no sirve de mucho sin una impresora que conectar y sin la rutina controladora correspondiente. De otra manera, bastaría un emulador que permitiera redirigir la salida de impresora a un fichero...

Estas son las erratas que descubrí cuando empecé a adaptar el código:

  • En la palabra `mover` falta un `then`.
  • En la palabra `invasor`, pone `o>` en vez de `0>` (aunque puedes quitar este operador, porque, si no estoy equivocado, el valor de la variable `d` nunca baja de cero).
  • El gráfico de la línea horizontal está definido como `0 0 0 0 0 255 0 3` en lugar de `0 0 0 0 0 255 0 0`.
  • El gráfico del proyectil está definido como `1 1 1 1 1 0 0 66` en lugar de ` 1 1 1 1 1 0 0 0`.
  • En la palabra `inicio` falta un `dup` entre `99` y `103`.

Si encuentro algo más te lo digo.

Por cierto, ¿tecleaste el código sin indentarlo, por algún motivo, o es que se perdió la indentación al pegarlo en el foro? Lo primero que hice al empezar la conversión fue añadir indentación, pues sin ella es imposible entenderlo (y con ella difícil ;) debido a la longitud de las palabras). Para hacerlo fui siguiendo la lógica del código, palabra a palabra. La fuente de la versión de kmurta para ZX81 sí está indentada, pero no la vi a tiempo.
Marcos Cruz (programandala.net)

Avatar de Usuario
programandala_net
Dragon 32
Dragon 32
Mensajes: 27
Registrado: 23 Dic 2015, 02:44
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Contactar:

Re: Nuclear Invaders para JUPITER ACE

Mensajepor programandala_net » 18 Feb 2016, 19:00

carmeloco escribió:Desconozco esas máquinas, pero en spectrum hay una forma de pasar un listado al pc, siempre y cuando, sea un modelo con puerto serie, y es conectando el spectrum al pc por puerto serie, abrir en el pc un terminal serie y en el spectrum se da la orden de imprimir el listado con LLIST.


Llevas razón. Y con emulación también puedes redirigir la salida de impresora de máquina emulada a un fichero del sistema anfitrión. Pero todo depende de que la máquina tenga puerto serie o paralelo, como dices. La Jupiter ACE no tiene. Hubo una interfaz RS232 y Centronics para ella, pero no sé si llegó a comercializarse mínimanente, ni si hay algún emulador que la incluya.
Marcos Cruz (programandala.net)

Avatar de Usuario
programandala_net
Dragon 32
Dragon 32
Mensajes: 27
Registrado: 23 Dic 2015, 02:44
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Contactar:

Re: Nuclear Invaders para JUPITER ACE

Mensajepor programandala_net » 19 Feb 2016, 14:22

He encontrado otro error de retecleado en la fuente:

En la palabra `inicio`, en esta lista de octetos (que son dos elementos de la tabla de datos de invasores):

Código: Seleccionar todo

3 0 11 0 107 3 0 5 29 99


Falta un elemento en medio, los datos del quinto tipo de invasor. Debería decir:

Código: Seleccionar todo

3 0 11 0 107 3 0 13 0 107 3 0 5 29 99
Marcos Cruz (programandala.net)

Avatar de Usuario
programandala_net
Dragon 32
Dragon 32
Mensajes: 27
Registrado: 23 Dic 2015, 02:44
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Contactar:

Re: Nuclear Invaders para JUPITER ACE

Mensajepor programandala_net » 19 Feb 2016, 14:43

programandala_net escribió:
  • En la palabra `inicio` falta un `dup` entre `99` y `103`.


Rectifico. Eso está bien. Son cinco caracteres y el primero no debe estar duplicado. Me despistó el índice del bucle al hacer la conversión.
Marcos Cruz (programandala.net)


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 12 invitados