Solitario-1K para ZX-81

Foro dedicado a la programación en todo tipo de sistemas clásicos.
Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: Solitario-1K para ZX-81

Mensajepor antoniovillena » 17 Jul 2014, 07:44

¿No hay ningún programa en ZX81 que te permita hacer listados en BASIC para transformarlos en .P? En spectrum sí que lo hay, zmakebas. Lo he pasado a spectrum de tal forma que sea más legible y fácil de mantener.

solitario.zip
(74.58 KiB) Descargado 321 veces


-- Actualizado 17 Jul 2014, 06:58 --

Por cierto, no habia caído pero juntando líneas se pueden optimizar muchos bytes. El binario de ZX Spectrum ahora ocupa 398 bytes. No subo el zip porque podeís hacer un copy/paste desde aquí.

Código: Seleccionar todo

    1 LET T=VAL "2":\
      LET N=VAL "9":\
      LET T$="\
   OOO   \
   OOO   \
   OOO   \
OOOOOOOOO\
OOOO.OOOO\
OOOOOOOOO\
   OOO   \
   OOO   \
   OOO   ":\
      LET X=VAL "43"
    3 PRINT AT NOT PI, NOT PI;"\{20}\{1} 123456789\{20}\{0}":\
      FOR I=NOT PI TO N-SGN T:\
        PRINT INVERSE SGN PI;\
              CHR$ (I+CODE "1");\
              INVERSE NOT PI;\
              T$(I*N+SGN T TO I*N+N):\
      NEXT I:\
      IF NOT X THEN STOP
    4 INPUT A$:\
      IF LEN A$<>T+T THEN GOTO N
    5 LET I=(VAL A$(SGN T)-SGN T)*N+VAL A$(T):\
      LET J=(VAL A$(INT PI)-SGN T)*N+VAL A$(T+T):\
      IF   T$(I)      <>"O"\
        OR T$((I+J)/T)<>"O"\
        OR T$(J)      <>"."\
        OR (  ABS(I-J)<>T  \
          AND ABS(I-J)<>N*T) THEN GOTO N
    6 LET T$((I+J)/T)=".":\
      LET T$(I)=".":\
      LET T$(J)="O":\
      LET X=X-SGN T
    9 GOTO PI


-- Actualizado 17 Jul 2014, 10:03 --

Versión hiperoptimizada de 322 bytes

solitario.tap.zip
(422 Bytes) Descargado 351 veces


Código: Seleccionar todo

    1 LET D=VAL "2":\
      LET N=VAL "9":\
      LET X=CODE "V":\
      LET A$="   OOO   ":\
      LET T$="OOOOOOOOOOOOO":\
      LET T$=A$+A$+A$+T$+"."+T$+A$+A$+A$
    2 CLS: PRINT " 123456789":\
      FOR I=SGN PI TO N:\
        PRINT CHR$ (I+CODE "0");\
              T$(I*N-N+SGN PI TO I*N):\
      NEXT I:\
      INPUT A$:\
      IF SQR LEN A$=D THEN:\
          LET I=N*VAL A$(SGN PI)-N+VAL A$(D):\
          LET J=N*VAL A$(INT PI)-N+VAL A$(D+D):\
          LET K= (I+J)/D:\
          IF T$(I)+T$(K)+T$(J)="OO."\
               AND (  ABS(I-J)=D  \
                   OR ABS(I-K)=N) THEN LET T$(K)=".":\
                                       LET T$(I)=".":\
                                       LET T$(J)="O":\
                                       LET X=X-D
    0 GOTO D+NOT X


-- Actualizado 17 Jul 2014, 17:29 --

17 bytes menos, con un cambio muy tonto, en total se quedan en 305 bytes. No subo el archivo, tan sólo hay que pasarle el zmakebas poniendo un 3 en la línea que pone 0 y cambiar el número de línea en el binario. Tengo pendiente modificar zmakebas para que admita estas guarreridas. Ya lo tengo modificado para otras como mostrar un número en ascii distinto del binario, de tal forma que un número de 5 cifras ocupa 7 bytes (con VAL"num" ocupaba 8).

Código: Seleccionar todo

    0 LET X=CODE "V":\
      LET A$="   OOO   ":\
      LET N=LEN A$:\
      LET D=INT LN N:\
      LET T$="OOOOOOOOOOOOO":\
      LET T$=A$+A$+A$+T$+"."+T$+A$+A$+A$
    1 FOR I=SGN PI TO N:\
        PRINT AT NOT PI, I; I;\
              AT I, NOT PI; I; T$(I*N-N+SGN PI TO I*N):\
      NEXT I:\
      INPUT A$:\
      IF SQR LEN A$=D THEN\
          LET I=N*VAL A$(SGN PI)-N+VAL A$(D):\
          LET J=N*VAL A$(INT PI)-N+VAL A$(D+D):\
          LET K= (I+J)/D:\
          IF T$(I)+T$(K)+T$(J)="OO." THEN\
              IF   ABS(I-J)=D\
                OR ABS(I-K)=N THEN LET T$(K)=".":\
                                   LET T$(I)=".":\
                                   LET T$(J)="O":\
                                   LET X=X-D
    0 GOTO EXP NOT X


-- Actualizado 17 Jul 2014, 17:33 --

Hecho. http://sourceforge.net/p/emuscriptoria/ ... ZMakeBas.c

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: Solitario-1K para ZX-81

Mensajepor antoniovillena » 19 Jul 2014, 14:26

Al final me he hecho mi propia "herramienta compiladora" para pasar de .BAS a .P, ya que el anterior método (SAVE en EightOne para crear un .WAV de 8 bits, Audacity para convertirlo a 16 bits y zx81putil para pasar de .WAV a .P) era muy lento. Lo que he hecho ha sido integrarla en el ZMakeBas, de tal forma que con la misma herramienta puedo "compilar" para Spectrum y ZX81. El link al código fuente de ZMakeBas está en el mensaje anterior, en el zip incluyo ejecutable y los .bas correspondientes al programa optimizado del solitario:

  • La versión ZX Spectrum ocupa 296 bytes. Detecta el final del juego sin mostrar la última jugada, aunque esto se puede arreglar con una penalización de 3 bytes poniendo "GOTO D" después del "LET X= X+D".
  • Para ZX81 hay dos versiones. El problema es que imprimir enteros directamente es muy lento en un ZX81, por lo que he escrito una versión lenta y pequeña (solitario81.bas) de 368 bytes, y otra rápida (solfast81.bas) de 376 bytes.

La gran diferencia de tamaño (368 vs 296) se debe a que ZX81 no admite separar sentencias con los dos puntos, por lo que meter un número de línea nuevo tiene una penalización de 4 bytes por cada línea.
Adjuntos
solitario.zip
(39.54 KiB) Descargado 358 veces

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 840
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: Solitario-1K para ZX-81

Mensajepor Namek » 19 Jul 2014, 15:08

OLE, OLE y OLE!!! Optimización a muerte y encima caracteristica nueva para el ZMakeBas... =D>

Avatar de Usuario
Hark0
Amiga 1200
Amiga 1200
Mensajes: 1695
Registrado: 11 Jul 2012, 23:44
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: (Otro)
Primera consola: (Otro)
Ubicación: Cornellà de Llobregat - Barcelona
Contactar:

Re: Solitario-1K para ZX-81

Mensajepor Hark0 » 20 Jul 2014, 12:14

Ostras! Vaya tela de recortes os habeis currado! =D>

Eso si, lees el listado y a simple vista no se entiende un pimiento... :mrgreen:
http://www.zxuno.com
ZX-Uno · Clon de ordenador ZX Spectrum basado en FPGA.

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: Solitario-1K para ZX-81

Mensajepor dancresp » 21 Jul 2014, 23:36

antoniovillena escribió:Al final me he hecho mi propia "herramienta compiladora" para pasar de .BAS a .P, ya que el anterior método (SAVE en EightOne para crear un .WAV de 8 bits, Audacity para convertirlo a 16 bits y zx81putil para pasar de .WAV a .P) era muy lento.

Pues ya puestos, que tal pasar los programas de una cinta de ZX-81 a ficheros ".p".

mcleod ya hizo alguna cosa pero sigo siendo incapaz de preservar mis cintas, salvo en ir pasando los programas de cintas viejas a cintas nuevas...

Respecto a los programas que has pasado, los dos me dan un error de falta de memoria en la línea 5.
¿Los has probado en una máquina con 1K? Igual es cosa mía...

Y efectivamente, el poder meter varías instrucciones en una misma línea te permite ahorrar memoria.
Piensa que cualquier línea en BASIC ocupa un mínimo de 5 bytes: 2 bytes del número de línea, más 2 bytes de la longitud y 1 byte de final de línea. A esto hay que sumarle los comandos que contenga...
Buscando la IP de la W.O.P.R.

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: Solitario-1K para ZX-81

Mensajepor antoniovillena » 22 Jul 2014, 02:59

dancresp escribió:Pues ya puestos, que tal pasar los programas de una cinta de ZX-81 a ficheros ".p".


No es necesario. Un archivo .p es básicamente un volcado desde la posición $4009 hasta el final de la pantalla. Puedes pasar tus cintas a ficheros ".p" haciendo lo siguiente:
  • Con Audacity y conectando la salida de cinta al micrófono (o a la entrada de línea si es un sobremesa) te creas un archivo WAV.
  • Retocas el WAV para que tenga un volumen correcto.
  • Cargas el WAV en el EightyOne
  • Una vez cargado examinas la memoria para ver dónde acaba la pantalla. Aunque este paso lo puedes dejar para luego, recortando con un editor hexadecimal.
  • Exportas la memoria desde $4009 hasta el final de la pantalla (o hasta el final de la memoria si dejas el recorte para luego).
  • Listo, el archivo exportado (opcionalmente recortado) lo puedes renombrar a .p que es un archivo válido.

dancresp escribió:mcleod ya hizo alguna cosa pero sigo siendo incapaz de preservar mis cintas, salvo en ir pasando los programas de cintas viejas a cintas nuevas...


En teoría se puede pasar de WAV a P con las herramientas de McLeod, pero no sé hasta qué punto acepta cintas reales.

dancresp escribió:Respecto a los programas que has pasado, los dos me dan un error de falta de memoria en la línea 5.
¿Los has probado en una máquina con 1K? Igual es cosa mía...


Cierto, lo acabo de comprobar. Es que tenía el EightyOne configurado a 16K de RAM, el problema es que en las primeras líneas se chupaba toda la RAM, funcionaba con un mínimo de 2K. Ya lo he arreglado, con una penalización de 5 bytes ya funciona en máquinas con 1K de memoria.

dancresp escribió:Y efectivamente, el poder meter varías instrucciones en una misma línea te permite ahorrar memoria.
Piensa que cualquier línea en BASIC ocupa un mínimo de 5 bytes: 2 bytes del número de línea, más 2 bytes de la longitud y 1 byte de final de línea. A esto hay que sumarle los comandos que contenga...


Por eso la versión spectrum es bastante más pequeña.
Adjuntos
solitario1k.zip
(1.79 KiB) Descargado 368 veces

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: Solitario-1K para ZX-81

Mensajepor dancresp » 22 Jul 2014, 13:54

antoniovillena escribió:[*]Con Audacity y conectando la salida de cinta al micrófono (o a la entrada de línea si es un sobremesa) te creas un archivo WAV.
[*]Retocas el WAV para que tenga un volumen correcto.
[*]Cargas el WAV en el EightyOne
[*]Una vez cargado examinas la memoria para ver dónde acaba la pantalla. Aunque este paso lo puedes dejar para luego, recortando con un editor hexadecimal.
[*]Exportas la memoria desde $4009 hasta el final de la pantalla (o hasta el final de la memoria si dejas el recorte para luego).
[*]Listo, el archivo exportado (opcionalmente recortado) lo puedes renombrar a .p que es un archivo válido.[/list]

Lo volveré a probar, pero en su día lo hice y el sonido con el que lo grababa el Audacity era casi inaudible.

Lo he probado con un par de los tres ZX-81 que tengo y siempre pasa lo mismo, en cambio con el resto de ordenadores me funciona perfectamente. Si os fijáis casi siempre subo el fichero en formato WAV.
Buscando la IP de la W.O.P.R.

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: Solitario-1K para ZX-81

Mensajepor antoniovillena » 22 Jul 2014, 14:54

Tienes algunos de esos wavs? Puedes subir uno? Es para echarle un vistazo a la señal y decirte si es recuperable o no.

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: Solitario-1K para ZX-81

Mensajepor dancresp » 22 Jul 2014, 23:05

antoniovillena escribió:Tienes algunos de esos wavs? Puedes subir uno? Es para echarle un vistazo a la señal y decirte si es recuperable o no.

Pues ahora mismo no, pero intento crearte uno mañana y te lo paso.
A ver que consigues...
Buscando la IP de la W.O.P.R.

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 54 veces
Contactar:

Re: Solitario-1K para ZX-81

Mensajepor mcleod_ideafix » 23 Jul 2014, 00:09

antoniovillena escribió:En teoría se puede pasar de WAV a P con las herramientas de McLeod, pero no sé hasta qué punto acepta cintas reales.

La utilidad la escribí precisamente pensando en pasar cintas reales. De hecho la necesidad de preservar una cinta de ZX81 fue lo que me llevó a escribir la utilidad. Incluso hice un video mostrando junto con Sound Forge cómo usar la utilidad en modo "verbose" para ir reparando los daños del WAV en los puntos temporales en donde la utilidad detecta un error que no puede recuperar (y necesita asistencia humana para discernir si lo que hay es un uno, un cero, o ruido). Lo que pasa es que el video aún no lo he editado y publicado :P
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista


Volver a “Programación”

¿Quién está conectado?

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