Snippets en Z80
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
Snippets en Z80
Para no complicarlo mucho, lo mejor es limitarlo a un máximo de un snippet por post.
Un, dos, tres... responda otra vez:
Esperar al refresco de pantalla
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
Uso:
Código: Seleccionar todo
WAIT_VBL
Espera al refresco usando solo el Acumulador
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
Código: Seleccionar todo
WAIT_VBL
Escribe un valor en un registro del CRTC
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
Código: Seleccionar todo
WRITE_CRTC REGISTRO_CRTC,VALOR
Selecciona un registro del PSG por el puerto A del PPI
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
Código: Seleccionar todo
SEND_PSG REGISTRO_PSG
Selecciona un registro del PSG
Código: Seleccionar todo
;*******************************************************************************
; SELECT_PSG: Selecciona un registro del PSG
;*******************************************************************************
SELECT_PSG MACRO
LD BC,#F600 + %11000000
OUT (C),C
ENDM
Código: Seleccionar todo
SELECT_PSG
Desactivamos el PSG
Código: Seleccionar todo
;*******************************************************************************
; INACTIVE_PSG: Desactivamos el PSG
;*******************************************************************************
INACTIVE_PSG MACRO
LD BC,#F600 + %00000000
OUT (C),C
ENDM
Código: Seleccionar todo
INACTIVE_PSG
Establecemos el modo de funcionamiento del PPI
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
Código: Seleccionar todo
SET_PPI_CONTROL VALOR
Inicializamos el PSG para poder escanear el teclado
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
Código: Seleccionar todo
INIT_PSG_FOR_SCANKEYS
Restauramos el PSG después de escanear el teclado
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
Código: Seleccionar todo
RESTORE_PSG_FROM_SCANKEYS
Lee un byte de un registro del PSG
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
Código: Seleccionar todo
READ_PSG_RA
Ponemos el estado del joystick 0 en el Acumulador
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
Código: Seleccionar todo
espera_joy0
WAIT_VBL
CALL lee_joystick_0
AND A ; ¿Se tocó el joystick 0?
JR Z,espera_joy0
Escribe un byte a un registro del PSG seleccionado
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
Código: Seleccionar todo
WRITE_PSG
Inicializamos el PSG
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
Código: Seleccionar todo
INIT_PSG
Copia 12 bytes haciendo uso de la pila
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
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
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro
La Comunidad Española |