Snippets en Z80

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
Avatar de Usuario
syx
Master of The Forum
Master of The Forum
Mensajes: 1353
Registrado: Mié 02 Sep , 2009 9:55 am

Snippets en Z80

Mensajepor syx » Lun 07 Sep , 2009 1:50 pm

Me parece interesante crear un post donde se puedan ir colgando pequeños trozos de código en Z80 que cualquiera pueda cortar y pegar para usar en sus proyectos, es por curarnos en salud antes de que el alzheimer haga estragos entre nosotros :P

Para no complicarlo mucho, lo mejor es limitarlo a un máximo de un snippet por post.

Un, dos, tres... responda otra vez:

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

Esperar al refresco de pantalla

Mensajepor syx » Lun 07 Sep , 2009 1:52 pm

Código: Seleccionar todo

;*******************************************************************************
; WAIT_VBL: Esperamos al comienzo del refresco de pantalla
; Corrompe: A, BC
;*******************************************************************************
WAIT_VBL MACRO
LOCAL wait_vbl
LD B,#F5 ; PPI_B
wait_vbl
IN A,(C)
RRA
JR NC,wait_vbl
ENDM
La única cosa rara sería el uso de la directiva "LOCAL" de pasmo, que sirve para crear etiquetas locales, en este caso al macro.

Uso:

Código: Seleccionar todo

WAIT_VBL
Última edición por syx el Lun 07 Sep , 2009 2:03 pm, editado 1 vez en total.

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

Espera al refresco usando solo el Acumulador

Mensajepor syx » Lun 07 Sep , 2009 1:59 pm

Código: Seleccionar todo

;*******************************************************************************
; WAIT_VBL: Esperamos al comienzo del refresco de pantalla
; Corrompe: A
;*******************************************************************************
WAIT_VBL MACRO
LOCAL wait_vbl
wait_vbl
LD A,#F5 ; PPI_B
IN A,(#00)
RRA
JR NC,wait_vbl
ENDM
Uso:

Código: Seleccionar todo

WAIT_VBL
Última edición por syx el Lun 07 Sep , 2009 2:03 pm, editado 1 vez en total.

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

Escribe un valor en un registro del CRTC

Mensajepor syx » Lun 07 Sep , 2009 2:02 pm

Código: Seleccionar todo

;*******************************************************************************
; WRITE_CRTC: Escribe un valor en un registro del CRTC
; Corrompe: BC
;*******************************************************************************
WRITE_CRTC MACRO registro,valor
LD BC,#BC00 + registro
OUT (C),C
LD BC,#BD00 + valor
OUT (C),C
ENDM
Uso:

Código: Seleccionar todo

WRITE_CRTC REGISTRO_CRTC,VALOR

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

Selecciona un registro del PSG por el puerto A del PPI

Mensajepor syx » Lun 07 Sep , 2009 2:10 pm

Código: Seleccionar todo

;*******************************************************************************
; SEND_PSG_REG: Envia el número de un registro del PSG por el Puerto A del PPI
;*******************************************************************************
SEND_PSG_REG MACRO REGISTRO
LD BC,#F400 + REGISTRO
OUT (C),C
ENDM
Uso:

Código: Seleccionar todo

SEND_PSG REGISTRO_PSG

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

Selecciona un registro del PSG

Mensajepor syx » Lun 07 Sep , 2009 2:12 pm

Código: Seleccionar todo

;*******************************************************************************
; SELECT_PSG: Selecciona un registro del PSG
;*******************************************************************************
SELECT_PSG MACRO
LD BC,#F600 + %11000000
OUT (C),C
ENDM
Uso:

Código: Seleccionar todo

SELECT_PSG

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

Desactivamos el PSG

Mensajepor syx » Lun 07 Sep , 2009 2:15 pm

Código: Seleccionar todo

;*******************************************************************************
; INACTIVE_PSG: Desactivamos el PSG
;*******************************************************************************
INACTIVE_PSG MACRO
LD BC,#F600 + %00000000
OUT (C),C
ENDM
Uso:

Código: Seleccionar todo

INACTIVE_PSG
NOTA: En los CPC+ es necesario activar el modo inactivo del PSG entre cambios de funciones del PSG.

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

Establecemos el modo de funcionamiento del PPI

Mensajepor syx » Lun 07 Sep , 2009 2:18 pm

Código: Seleccionar todo

;*******************************************************************************
;SET_PPI_CONTROL: Establece el modo de funcionamiento y el sentido de los puertos del PPI
;*******************************************************************************
SET_PPI_CONTROL MACRO VALOR
LD BC,#F700 + VALOR
OUT (C),C
ENDM
Uso:

Código: Seleccionar todo

SET_PPI_CONTROL VALOR

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

Inicializamos el PSG para poder escanear el teclado

Mensajepor syx » Lun 07 Sep , 2009 2:21 pm

Código: Seleccionar todo

;*******************************************************************************
; INIT_PSG_FOR_SCANKEYS: Inicializamos el PSG para escanear el teclado
;*******************************************************************************
INIT_PSG_FOR_SCANKEYS MACRO
SEND_PSG_REG 14 ; Enviamos el número del registro del PSG
SELECT_PSG ; Seleccionar registro del PSG
INACTIVE_PSG ; Desactivar el PSG (CPC+)
SET_PPI_CONTROL %10010010 ; Establecer el PPI Port A de entrada
ENDM
Uso:

Código: Seleccionar todo

INIT_PSG_FOR_SCANKEYS
Última edición por syx el Lun 07 Sep , 2009 2:42 pm, editado 1 vez en total.

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

Restauramos el PSG después de escanear el teclado

Mensajepor syx » Lun 07 Sep , 2009 2:38 pm

Código: Seleccionar todo

;*******************************************************************************
; RESTORE_PSG_FROM_SCANKEYS: Restauramos el PSG después de escanear el teclado
;*******************************************************************************
RESTORE_PSG_FROM_SCANKEYS MACRO
SET_PPI_CONTROL %10000010 ; Establecer el PPI Port A a salida
INACTIVE_PSG ; PSG Inactivo (CPC+)
ENDM
Uso:

Código: Seleccionar todo

RESTORE_PSG_FROM_SCANKEYS

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

Lee un byte de un registro del PSG

Mensajepor syx » Lun 07 Sep , 2009 2:40 pm

Código: Seleccionar todo

;*******************************************************************************
; READ_PSG_RA: Leemos un byte de un registro del PSG en el Acumulador
;*******************************************************************************
READ_PSG_RA MACRO
LD B,#F4 ;PPI_A
IN A,(C)
ENDM
Uso:

Código: Seleccionar todo

READ_PSG_RA

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

Ponemos el estado del joystick 0 en el Acumulador

Mensajepor syx » Lun 07 Sep , 2009 2:54 pm

Código: Seleccionar todo

;******************************************************************************
; Realizamos una lectura del Joystick 0 y devolvemos el resultado en el acumulador
; Entradas: Ninguna
; Salidas: A --> Estado del joystick (%0 0 Fire_1 Fire_2 Right Left Down Up)
; Se destruyen: A y BC
;******************************************************************************
lee_joystick_0
INIT_PSG_FOR_SCANKEYS ; Inicializamos el PSG para comprobar el teclado (Destruye BC)
LD BC,#F500 + %01001001 ; Línea de la matriz del teclado a comprobar (la 9)
; LD BC,#F500 + %01000110 ; Para leer el joystick 1 (la 6)
OUT (C),C ; Leer registro del PSG
READ_PSG_RA ; Leemos la línea de la matriz del teclado desde el PPI Port A
CPL ; Ponemos a 1 los bits del los botones del joystick pulsados
AND %00111111 ; Enmascaramos solo los bits que nos interesan
RESTORE_PSG_OF_SCANKEYS ; Dejamos el PSG en su estado normal (Destruye BC)
RET
Uso:

Código: Seleccionar todo

espera_joy0
WAIT_VBL
CALL lee_joystick_0
AND A ; ¿Se tocó el joystick 0?
JR Z,espera_joy0
Última edición por syx el Lun 07 Sep , 2009 4:26 pm, editado 2 veces en total.

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

Escribe un byte a un registro del PSG seleccionado

Mensajepor syx » Lun 07 Sep , 2009 2:58 pm

Código: Seleccionar todo

;*******************************************************************************
; WRITE_PSG: Escribe un byte a un registro del PSG
;*******************************************************************************
WRITE_PSG MACRO
LD BC,PPI_C|%10000000
OUT (C),C
ENDM
Uso:

Código: Seleccionar todo

WRITE_PSG

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

Inicializamos el PSG

Mensajepor syx » Lun 07 Sep , 2009 3:00 pm

Código: Seleccionar todo

;*******************************************************************************
; INIT_PSG: Inicializamos el PSG
;*******************************************************************************
INIT_PSG MACRO
; Estado del CPC por defecto es:
; Puerto A de I/O del PSG establecido a Entrada
; Generadores de Ruido y Tono desconectados
; R7 ---> In Port B | In Port A | Noise C | Noise B| Noise A | Tone C | Tone B | Tone A (lógica inversa)
SEND_PSG_REG 7 ; Enviamos el número del registro del PSG sobre el que vamos a trabajar
SELECT_PSG ; Seleccionamos un registro del PSG
INACTIVE_PSG ; PSG Inactivo (CPC+)
SEND_PSG_DATA %00111111 ; Escribimos los datos para el registro del PSG
WRITE_PSG ; Función de escribir un valor en el registro del PSG
INACTIVE_PSG ; PSG Inactivo (CPC+)
ENDM
Uso:

Código: Seleccionar todo

INIT_PSG

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

Copia 12 bytes haciendo uso de la pila

Mensajepor syx » Lun 07 Sep , 2009 3:07 pm

Código: Seleccionar todo

;*******************************************************************************
; COPY_12: Copia 12 bytes haciendo uso de la pila
; Corrompe: AF, BC, DE, AF', BC', DE'
;*******************************************************************************
COPY_12 MACRO
LD SP,HL ; HL ==> ORIGEN

LD BC,12
ADD HL,BC ; NEXT_CHUNCK

POP AF
POP DE
POP BC
EX AF,AF'
POP AF
EXX
POP DE
POP BC

LD SP,HL ; HL ==> DESTINO
PUSH BC
PUSH DE
PUSH AF

OR A ; Limpia Carry
LD BC,12
SBC HL,BC ; NEXT_CHUNCK

EXX
PUSH BC
PUSH DE
EX AF,AF'
PUSH AF
ENDM
Uso:

Código: Seleccionar todo

DI
LD (sm_old_sp12 + 1),SP
LD HL,DIRECCION_ORIGEN
EXX
LD HL,DIRECCION_DESTINO
EXX
COPY_12
sm_old_sp12
LD SP,#0000
EI
Última edición por syx el Lun 07 Sep , 2009 3:15 pm, editado 1 vez en total.


¿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