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!
Proyecto de memoria y variables del sistema en ZX y TS
- mcleod_ideafix
- 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
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
-
- 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
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.
- mcleod_ideafix
- 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
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
-
- 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
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.
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 9 invitados