Snippets Z80: borrado de pantalla

Programando el Amstrad en Ensamblador.
Reglas del Foro
Debido a que hay varios temas pidiendo ayuda para programar en ensamblador máquinas distintas al Amstrad CPC, con micro distinto al Z80 y que incluso dependen del sistema operativo, nos vemos en la necesidad de poner por escrito que estos posts son bienvenidos pero que no es el lugar adecuado ya que por estos lares nos dedicamos más al ensamblador del Z80, un microprocesador de 8 bits que tuvo su gran auge en ordenadores y consolas de los años 80.

De todas formas, esto no quita que alguien que sepa del asunto pueda postear alguna respuesta pero es más fácil encontrar foros dedicados a programar en ensamblador en Windows o MS-DOS que ayudarán más que nosotros:
http://www.lawebdelprogramador.com/news ... nsamblador
Enrique
Lechoncillo
Lechoncillo
Mensajes: 16
Registrado: Mar 08 Dic , 2009 6:02 pm

Snippets Z80: borrado de pantalla

Mensajepor Enrique » Lun 18 Ene , 2010 6:16 pm

He realizado varias versiones de código para borrar la pantalla. Digamos que ha sido como ejercicio "interno", obligándome a hacerlo de una forma distinta cada vez para explorar las posibilidades del Z80.

Antes que nada he de decir que no las he desarrollado con un CPC sino con un simulador en el PC, de ahí que finalicen con HALT. Para portarlas al CPC está claro que hay que sustituir los HALT por RET.

Algunas de ellas las he probado en un CPC real cargándolas a base de POKEs (sí, ya, un poco primitivo) y funcionan bien. Que haya piedad, pues mi sistema siempre ha sido el Commodore 64 y este CPC lo tenía por ahí en el trastero :)

Me gustaría escuchar opiniones sobre mejoras, "yo lo haría de este otro modo", etc...

Ahí van las rutinillas, todas con el mismo objetivo: cargar un cero desde 0C000H a 0FFFFH.

Código: Seleccionar todo

; Versión 1
XOR A
LD HL,0C000H
L1:LD (HL),A
INC L
JP NZ, LOOP
INC H
JP NZ, L1
HALT
En general todas las versiones se pueden mejorar en tiempo desenrollando el bucle interior con código in-line, evitando así los ciclos que penaliza la instrucción de salto. Las repeticiones in-line han de ser potencia de 2 (2, 4, 8, ..) para que la comparación de salto JP NZ funcione !!

Por ejemplo, la versión 1 puede reescribirse así:

Código: Seleccionar todo

; Versión 1 bis
XOR A
LD HL,0C000H
L1:LD (HL),A
INC L
LD (HL),A
INC L
LD (HL),A
INC L
LD (HL),A
INC L
JP NZ, LOOP
INC H
JP NZ, L1
HALT

Código: Seleccionar todo

; Versión 2
XOR A
LD BC,03FFFH
LD DE,0C000H
LD HL,0C000H
LD (DE),A
INC DE
LDIR
HALT

Código: Seleccionar todo

; Versión 3
XOR A
LD DE,01H
LD HL,0C000H
L1:LD (HL),A
ADD HL,DE
JP NC, L1
HALT

Código: Seleccionar todo

; Versión 4
XOR A ; Hace C=0, importante para ADC
LD DE,01H
LD HL,0C000H
L1:LD (HL),A
ADC HL,DE
JP NZ, L1
HALT

Código: Seleccionar todo

; Versión 5
XOR A
LD HL,0C000H
L1:LD (HL),A
INC HL ; INC HL no modifica los flags, me obliga a comparar
CP H
JP NZ, L1
HALT

Código: Seleccionar todo

; Versión 6
XOR A
LD B,A
LD C,0C0H ; C como contador de páginas
LD HL,0C000H
L1:LD (HL),A
INC HL
DJNZ L1
INC C
JP NZ, L1
HALT

Código: Seleccionar todo

; Versión 7
DI ; Interrupciones anuladas mientras manipulo SP
LD (0800H),SP ; Salva SP
XOR A
LD BC,04002H
LD HL,00000H
LD SP,HL ; Nuevo SP
L1:PUSH HL ; 11 T // 16 bit fill
ADD A,C ; Suma 2 bytes pushed
JP NZ, L1
DJNZ L1
LD SP,(0800H) ; Restaura SP
EI
HALT
La versión 7 es potencialmente la más rápida (al menos en mi simulador). Gracias a syx por poner su código, con él me he dado cuenta que sí hay instrucciones para copiar el SP a memoria. Estas cosas me pasan por ser tan "teórico" :)
Última edición por Enrique el Vie 29 Oct , 2010 1:47 pm, editado 4 veces en total.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: Snippets Z80: borrado de pantalla

Mensajepor Artaburu » Lun 18 Ene , 2010 6:29 pm

Menuda cantidad de formas. Yo uso la siguiente (similar a tu versión 2):
XOR A
LD HL,&c000
LD DE,&C001
LD BC,&3fff
LD (HL),A
LDIR
RET

Hacerlo mediante la pila es posible, creo que está en el foro, habrá que buscarla :D
Salu2,
Arta

Avatar de Usuario
syx
Master of The Forum
Master of The Forum
Mensajes: 1353
Registrado: Mié 02 Sep , 2009 9:55 am

Re: Snippets Z80: borrado de pantalla

Mensajepor syx » Lun 18 Ene , 2010 6:45 pm

Usando código automoficable, puedes almacenar el valor del puntero de pila. Por lo que una rutina de limpiado de pantalla usando la pila quedaría tal que así:

Código: Seleccionar todo

DI
LD (sm_old_sp + 1),SP
LD HL,#0000
LD SP,HL
LD BC,#4000 / 2
bucle_pila
PUSH HL
DEC BC
LD A,B
OR C
JR NZ,bucle_pila
sm_old_sp
LD SP,#0000
EI
No olvides desconectar las interrupciones con DI y restaurarlas una vez terminada tu rutina con EI. Aparte para devolver el control al sistema, tendrás que evitar corromper algunos registros, pero vamos como decía el viejo miyagi PUSH Cera, POP Cera :P

Urusergi
Forum Addict
Forum Addict
Mensajes: 380
Registrado: Sab 25 Feb , 2006 5:45 pm

Re: Snippets Z80: borrado de pantalla

Mensajepor Urusergi » Mar 19 Ene , 2010 12:35 am

He realizado varias versiones de código para borrar la pantalla. Digamos que ha sido como ejercicio "interno", obligándome a hacerlo de una forma distinta cada vez para explorar las posibilidades del Z80.

Antes que nada he de decir que no las he desarrollado con un CPC sino con un simulador en el PC, de ahí que finalicen con HALT. Para portarlas al CPC está claro que hay que sustituir los HALT por RET.
Ostras! ¿se puede saber que programilla es ese? me gustaría poder simular mis futuras rutinas...

Un saludo

Enrique
Lechoncillo
Lechoncillo
Mensajes: 16
Registrado: Mar 08 Dic , 2009 6:02 pm

Re: Snippets Z80: borrado de pantalla

Mensajepor Enrique » Mar 19 Ene , 2010 10:38 am

Ostras! ¿se puede saber que programilla es ese? me gustaría poder simular mis futuras rutinas...
Un saludo
Revisando los enlaces en z80.info:
http://z80.info/z80sdt.htm#SDT_IDE

encontré este que me gusta mucho y es el que uso:
http://www.oshonsoft.com/z80.html

Limitaciones de la versión de prueba: te deja arrancarlo 30 veces máximo y cada sesión es de 120minutos máximo. De todos modos el programa es muy barato: 25€ (eran 15€ hasta antes de Navidad, debe ser que ha subido el precio por la "cuesta de Enero" :) ). Lleva ensamblador, desensamblador, breakpoints, permite examinar la memoria, simular puertos, ...

Saludos,
Enrique.

Urusergi
Forum Addict
Forum Addict
Mensajes: 380
Registrado: Sab 25 Feb , 2006 5:45 pm

Re: Snippets Z80: borrado de pantalla

Mensajepor Urusergi » Mar 19 Ene , 2010 11:08 pm

Muchas gracias! le echaré un vistazo

Un saludo

Avatar de Usuario
Mode 2
I am The Forum
I am The Forum
Mensajes: 2068
Registrado: Lun 10 Oct , 2005 8:01 pm
Ubicación: Sevilla, años 80.
Contactar:

Re: Snippets Z80: borrado de pantalla

Mensajepor Mode 2 » Vie 09 Dic , 2011 8:26 pm

Usando código automoficable, puedes almacenar el valor del puntero de pila. Por lo que una rutina de limpiado de pantalla usando la pila quedaría tal que así:

Código: Seleccionar todo

DI
LD (sm_old_sp + 1),SP
LD HL,#0000
LD SP,HL
LD BC,#4000 / 2
bucle_pila
PUSH HL
DEC BC
LD A,B
OR C
JR NZ,bucle_pila
sm_old_sp
LD SP,#0000
EI
No olvides desconectar las interrupciones con DI y restaurarlas una vez terminada tu rutina con EI. Aparte para devolver el control al sistema, tendrás que evitar corromper algunos registros, pero vamos como decía el viejo miyagi PUSH Cera, POP Cera :P
Acabo de hacer una comparación de la rutina anterior con la del firmware (&BB6C) con la instrucción TIME
desde BASIC y mientras que la de Firmware tarda un tiempo en unidades de 62 , la rutina de arriba es 1.

Editar:
¡¡Curioso, ahora me sale 15 en vez de 1!!
BUSCO: VideoPac+, Jaguar Saturn, Micromanía 1, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, manual +3, manual CPC664.

Urusergi
Forum Addict
Forum Addict
Mensajes: 380
Registrado: Sab 25 Feb , 2006 5:45 pm

Re: Snippets Z80: borrado de pantalla

Mensajepor Urusergi » Mar 04 Sep , 2012 10:55 pm

Aprovechando que ando con algunas ideas para la compresión de pantallas voy a poner la solución que empleo para borrarla:

Código: Seleccionar todo

DI
LD HL,0
LD B,L
LD (stack+1),SP
LD SP,HL
rep ds 32,&E5 ;32 x PUSH HL
DJNZ rep
stack LD SP,0
EI
Es una rutina parecida a la de Syx pero parcialmente unrolleada, es muy rápida y no ocupa demasiado...

Por otro lado si usamos el registro DE ganamos 1 byte y hacemos la rutina ejecutable en ROM:

Código: Seleccionar todo

DI
LD HL,0
LD D,H
LD E,L
LD B,L
ADD HL,SP
LD SP,0
rep ds 32,&D5 ;32 x PUSH DE
DJNZ rep
LD SP,HL
EI
Un saludo.


¿Quién está conectado?

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


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic