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: 6582
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: 1300
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
Megaforero
Megaforero
Mensajes: 301
Registrado: Sab 25 Feb , 2006 5:45 pm

Re: Snippets Z80: borrado de pantalla

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

Enrique escribió: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

Urusergi escribió: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
Megaforero
Megaforero
Mensajes: 301
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
Master of The Forum
Master of The Forum
Mensajes: 1967
Registrado: Lun 10 Oct , 2005 8:01 pm
Ubicación: Sevilla, años 80.

Re: Snippets Z80: borrado de pantalla

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

syx escribió: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 y 25, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, Everdrive SNES, manual +3, manual CPC664.

Urusergi
Megaforero
Megaforero
Mensajes: 301
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.


Volver a “Ensamblador”

¿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 El portal del CPC Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) El sitio del Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic