Proyecto de memoria y variables del sistema en ZX y TS

Sinclair QL, ZX81, +2, +3, 128K ...
phd
Dragon 32
Dragon 32
Mensajes: 25
Registrado: 19 Ene 2011, 15:03
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo NES/Clónica
Primera consola: Nintendo NES/Clónica
Ubicación: Argentina
Contactar:

Proyecto de memoria y variables del sistema en ZX y TS

Mensajepor phd » 20 Jul 2013, 04:39

Hola,

He estado escribiendo un artículo sobre el uso de la memoria y las variables del sistema en las computadoras ZX Spectrum y TS 2068. En su momento lo había comentado en ZDP V3 (donde incluso me dijeron algunas correcciones que aplqué), pero en ese momento era un proyecto en ejecución y ahora está terminado. Salvo, obviamente, que si alguien encuentra un error o algo no bien aclarado con gusto haré la corrección que se precise.
Lo presento para quien lo encuentre útil para algo, en realidad hacerlo fue un gusto que me dí. En http://www.ssir.com.ar/VariablesZXSpectrum.pdf encontrarán el apunte.
Saludos!

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: Proyecto de memoria y variables del sistema en ZX y TS

Mensajepor mcleod_ideafix » 20 Jul 2013, 05:32

Wow! Creo que es la referencia más completa que he leído sobre el tema. ¡Enhorabuena por el trabajo! Me ha gustado especialmente la explicación sobre RND (conocía la del manual, y los primos de Fermat y todo eso, pero ésta me ha parecido más clara). De hecho acabo de escribir una variación del "programa que se lista a sí mismo". Aquí está :)

Código: Seleccionar todo

  10 LET dc=PEEK 23635+256*PEEK 23636
  20 LET df=PEEK 23627+256*PEEK 23628
  30 LET nl=PEEK dc*256+PEEK (dc+1)
  40 LET dc=dc+2
  50 LET ll=PEEK dc+256*PEEK (dc+1)
  55 LET dc=dc+2
  60 PRINT "    "( TO 4-LEN STR$ nl);nl;
  70 FOR n=dc TO dc+ll-1
  80 LET v=PEEK n
  90 IF v=14 THEN LET n=n+5: GO TO 110
 100 PRINT CHR$ v;
 110 NEXT n
 120 LET dc=n
 130 IF dc<df THEN GO TO 30
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

phd
Dragon 32
Dragon 32
Mensajes: 25
Registrado: 19 Ene 2011, 15:03
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo NES/Clónica
Primera consola: Nintendo NES/Clónica
Ubicación: Argentina
Contactar:

Re: Proyecto de memoria y variables del sistema en ZX y TS

Mensajepor phd » 22 Jul 2013, 20:48

Hola, gracias por el comentario, me alegra mucho saber que gustó el apunte. Te comento que acabo de probar el nuevo programa que se lista a sí mismo, funciona excelentemente y seguramente lo incluiré en la próxima revisión del trabajo.

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: Proyecto de memoria y variables del sistema en ZX y TS

Mensajepor mcleod_ideafix » 22 Jul 2013, 22:20

phd escribió:Hola, gracias por el comentario, me alegra mucho saber que gustó el apunte. Te comento que acabo de probar el nuevo programa que se lista a sí mismo, funciona excelentemente y seguramente lo incluiré en la próxima revisión del trabajo.

Estupendo. En ese caso te pongo una versión un poco más completa.

Código: Seleccionar todo

      10 LET dc=PEEK 23635+256*PEEK 23636
      20 LET df=PEEK 23627+256*PEEK 23628
      25 LET cl=PEEK 23625+256*PEEK 23626
      30 LET nl=PEEK dc*256+PEEK (dc+1)
      40 LET dc=dc+2
      50 LET ll=PEEK dc+256*PEEK (dc+1)
      55 LET dc=dc+2
      60 PRINT "    "( TO 4-LEN STR$ nl);nl;
      65 IF nl=cl THEN PRINT ">";: POKE 23611,205
      70 FOR n=dc TO dc+ll-1
      80 LET v=PEEK n
      90 IF v=14 THEN LET n=n+5: GO TO 110
     100 PRINT CHR$ v;
     110 NEXT n
     120 LET dc=n
     130 IF dc<df THEN GO TO 30


Esta nueva versión, además de listar el programa, indica con el cursor cuál es la línea actual, tal y como hace el comando LIST o el listado automático. Para que quede bien en pantalla se ha tenido que usar la variable FLAGS (23611) para cambiar momentáneamente la forma en la que se imprimen los tokens.

El bit 0 de FLAGS, que es lo que se usa para indicar si un token debe llevar espacio delante al imprimirse o no, tiene una forma curiosa de comportarse. Algo así como esto:

Código: Seleccionar todo

SI se acaba de imprimir un token, o bien lo último que se ha impreso es un espacio
  poner bit a 1
SINO
  poner bit a 0
FINSI


Dado que los tokens que nos importan en este caso ya terminan en espacio, el SI...FINSI anterior se puede reescribir como:

Código: Seleccionar todo

SI lo último que se ha impreso es un espacio
  poner bit a 1
SINO
  poner bit a 0
FINSI


Aparentemente, los caracteres de control (ENTER, etc) no afectan a esto. Es decir, da igual que detrás del espacio hubiera un retorno de carro o no.

Voy a mirar en el desensamble de la ROM a ver si esto es realmente así o no...

-- Actualizado 22 Jul 2013, 22:41 --

Pues sí. En este enlace:
http://www.wearmouth.demon.co.uk/zx82.htm#L0B6A

Se puede comprobar que cuando se imprime un carácter ASCII que no es de control se hace primero esta comprobación:

Código: Seleccionar todo

;; PO-CHAR-2
L0B6A:  EX      DE,HL           ; transfer destination address to DE
        LD      HL,$5C3B        ; point to FLAGS
        RES     0,(HL)          ; allow for leading space
        CP      $20             ; is it a space ?
        JR      NZ,L0B76        ; to PO-CHAR-3 if not

        SET     0,(HL)          ; signal no leading space to FLAGS

Se baja el bit 0 en principio, para indicar que el siguiente token que se imprima debe hacerse con un espacio en blanco por delante, pero justo a continuación se comprueba si el carácter a imprimir es un espacio, y si lo es, se vuelve a alzar ese bit 0.

Cuando se imprimen tokens se comprueba ese bit, y si está bajado, se imprime el espacio:
http://www.wearmouth.demon.co.uk/zx82.htm#L0C14
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

BlackHole
Amiga 1200
Amiga 1200
Mensajes: 1489
Registrado: 07 Nov 2009, 11:38
Sistema Favorito: C64
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: Nintendo SNES
Ubicación: Madrid
Gracias dadas: 14 veces
Gracias recibidas: 244 veces

Re: Proyecto de memoria y variables del sistema en ZX y TS

Mensajepor BlackHole » 22 Jul 2013, 22:58

phd: El pasado día 7 de Julio hice una búsqueda con Google pues necesitaba saber el comportamiento de diversas variables (ERR SP, CHARS y UDG) que no recordaba bien del todo, y me salió un resultado con tu documento en PDF. Me fue muy útil y quería aprovechar ahora a felicitarte por el trabajo. Aprovecho para actualizar y sobreescribirlo.


Volver a “Sinclair/Spectrum”

¿Quién está conectado?

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