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#L0B6ASe 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