Vous êtes sur la page 1sur 5

FIBONACCI

cpu "z80.tbl"
hof "int8"
;fibonacci
;en la posicion 1000h estara cero y en la 1001h estara uno
;en la posicion 1050h el numero de terminos que se desea generar
ld ix,1000h;la serie se empieza a generar a partir de la direccion 1000h
ld a,(1050h); aqui esta el numero de terminos en la serie a generar
ld c,a; lo ponemos en un contador
dec c; decrementamos en dos por los primero dos
dec c; datos que nos dan para generar la serie
jr z,eti1 ; se comprueba que el numero sea mayor que dos, si es dos
termina
eti2: push ix ; se guarda el valor del indice el la pila, empieza ciclo eti2
inc ix; se incrementa el indice de la la serie
ld a,(ix+0); obtenemos el contenido para sumar
pop hl; extraemos de la pila la direccion del indice antes puesto
add a,(hl); sumamos el anterior con el original
ld (ix+1),a; cargamos a la siguiente direccion
dec c; decrementamos el contador
jr nz,eti2 ;mientras "c" diferente de cero haz ciclo eti2
eti1: halt; termina
--------------------------------------------------------------------------------------------------------------PALINDROMO
cpu "z80.tbl"
hof "int8"
;SOMETEMOS 53 4f 4d 45 54 45 4d 4f 53
;Se pone la palabra a comprobar si es palindromo
;a partir de la posicion de memoria 1000h
; en la posicion 1020h se sabra si la palabra es o no palindromo
; si hay ff en la posicion 1020h de memoria la palabra no es palindromo
; si hay 01 en la posicion 1020h de memoria la palabra es palindromo
ld ix,1000h; cargarmos la direccion de inicio de la palabra
push ix; guardamos en la pila
pop iy; sacamos en iy para posicionar en la ultima letra (al final de la
palabra)
ld d,0; un contador para saber cuantas conparaciones hacer
ld a,(1030h); cargamos en el tamao de la palabra a comprobar
ld c,a; lo necesitaremos dos veces
eti1: dec c ;empieza ciclo eti1, restamos uno a el tamao
jr z,eti2 ; preguntamos si es cero

inc iy ; incrementamos en indice para llegar al final


jr eti1 ;termina eti1
eti2: sub 2 ;empieza eti2, quitamos dos a el tamao, asi dividimos entre
dos
;a el tamao para el numero de comparaciones
jp m,compara; si el tamao es impar, sigue comparando
jr z,termina; si el numero es par, termina y la palabra no es palindromo
inc d; suma uno a el numero de comparaciones
jr eti2; termina ciclo eti2
compara: ld a,(iy+0); carga la ultima letra de la palabra, empieza ciclo
compara
cp (ix+0); compara con la primera letra
jr nz,termina; si son diferentes termina y la palabra no es palindromo
; son iguales continua
inc ix; incrementa el indice del empiezo de la palabra
dec iy; decrementa el indice del final de la palabra
dec d; decrementa el numero de comparaciones totales
jr z,confirma; si el numero de comparaciones totales es cero confirma
que es palindromo
jr compara ; no es cero el numero de comparaciones totales, regresa a
comparar, termina ciclo compara
termina: ld a,-1 ; si la palabra no es palindromo, carga un -1 (ff) en el
acumulador
eti3: ld (1020h),a; carga lo que tiene el acumulador en la posicion
1020h y asi se vera si es o no palindromo
halt; termina el programa
confirma: ld a,1; la palabra es palindromo carga un 1 al acumulador
jr eti3; ve a eti 3
--------------------------------------------------------------------------------------------------------------BUSCAR
cpu "z80.tbl"
hof "int8"
;hola 48 4f 4c 41
;se introduce en la memoria en la posicion 1000h la cadena a buscar
"hola" (en codigo ascii hexadecimal)
;se escribe en la memoria a partir de la posicion 100ah cadenas
completas o incompletas
;se ejecuta el programa y el la posicion 1100h se encontrara en numero
de cadenas encontradas
;y en la pila (sp) quedaran las direcciones de inicio de cada una de esas
cadena

ld iy,100ah; la direccion desde donde va a buscar


ld c,100; tamao de la memoria a partir de donde va a buscar
ld d,0; contador de cadenas, cuantas encontro
eti2: ld h,4 ;tamao de cadena a buscar (empieza ciclo eti2)
ld ix,1000h; direccion de la cadena
eti3: ld a,(ix+0); carga para comparar la cadena (empieza ciclo eti3)
cp (iy+0);la compara
jp z,eti1; si son iguales ve a eti1
eti6: inc iy; mueve el indice de buscador de la cadena
dec c; decrementa el tamao de la memoria
jp nz,eti2; si hay memoria (c!=0) regresa a eti2 (termina ciclo eti2)
ld a,d; carga el numero de cadenas encontradas
ld (1100h),a; ponlo en la direccion 1100h
halt; termina
eti1: dec c ;decrementa el tamao de la memoria
inc ix ;mueve el indice de la cadena principal
inc iy ;mueve el indice de busqueda
dec h ;decrementa el tamao de la cadena por que uno ya coincidio
jr nz,eti3; si no es cero regresa a hacer comparaciones (termina ciclo
eti3)
inc d; si el tamao de la cadena es cero entonces se encontro una
cadena, incrementamos el contador de cadenas
ld h,4; vuelve a argar el tamao de la cadena
eti4: dec ix ;empieza ciclo eti4, posiciona el indice de la cadena en el
principio para buscar nuevamente
dec iy; posiciona en donde empieza la cadena a el indice del buscador
dec h; decrementa el tamao
jp nz,eti4; hasta que el tamao sea cero,termina ciclo eti4
push iy; pone la direccion del inicio de la cadena el la pila
ld h,4;vuleve a cargar el tamao
eti5: inc iy; ciclo para devolver el valor del indice de busqueda
dec h; decrementa el tamao
jp nz,eti5; mientras tamao diferente de cero (termina ciclo para
devolver el valor del indice de busqueda)
jr eti6; regresa a comprobar la memoria para buscar mas cadenas
--------------------------------------------------------------------------------------------------------------COPIA
cpu "z80.tbl"
hof "int8"
;hola 48 4f 4c 41
;adios 41 44 49 4f 53

;se escribe la cadena "hola" en la posicion de memoria 1000h


;se escribe la cadena "adios" en la posicion de memoria 1025h
;primero comprobamos si hay espacio en la memoria para copiar la
cadena
;si al termino del programa hay un ff en la posicion 1023h asumir que
no hay espacio en la memoria por lo tanto la copia no se realizo
ld iy,1025h; cargarmos el indice destino
ld hl,1000h;cargamos en indice del origen de la copia
ld d,100; define el tamao de la memoria para comprobar si se realizara
la copia de la cadena
ld c,4; lo ponemos en 4 que son las letras a copiar
eti2: ld a,(iy+0); buscamos en la memoria destino (comienza ciclo eti2)
cp 0; si es cero quiere decir que hay espacio disponible
jr z,eti1; si la primera posicion esta vacia, comprueba mas
inc iy; cambiar el indice de copia
dec d; decrementa el tamao de la memoria total
jp nz,eti2; si hay memoria regresa a eti2 (termina ciclo eti2)
ld a,-1; no hay memoria para copiar, pon en a un -1
ld (1023h),a ; pon ff en 1023h, ESO INDICA QUE LA COPIA NO SE
REALIZO
eti7: halt ;termina
eti1: inc iy ;empieza ciclo eti1, cambia el indice de copia
dec d ;decrementa memoria total
dec c ;decrementa el tamao de la cadena a copiar
jp nz,eti2; si c es diferente de cero regresa a eti2 (termina ciclo eti2), si
c es cero significa que hay espacio en la memoria para hace la copia
push iy; pon en la pila la direccion del indice destino
pop ix; saca en indice de copia (recorrimiento)
eti4: ld a,(ix+0); comprueba si el indice es cero (por si las dudas :P),
(comienza ciclo eti4), carga con el indice destino
cp 0; compara con cero el indice destino
jp nz,eti3; si es cero continua, si no continua hasta eti3
dec ix;decrementa el indice destino
inc c;incrementa el tamao de la copia
jr eti4;temina ciclo eti4
eti3: dec iy ;comienza ciclo eti3, decrementa el destimo para hacer ya
la compa
ld (iy+0),a; hace la copia para evitar perdida de datos
dec ix; decrementa destino
dec c;decrementa el tamao de la copia
jr z,eti5 ; si el tamao de la copia es cero ve a eti5, si no continua
jr eti4; termina ciclo eti4
eti5: ld c,4; carga el tamao de la cadena a copiar
eti6: dec iy; decrementa el indice destino para copiar, recupera el valor
original
dec c;decrementa el tamao de la cadena a copiar

jp nz,eti6; si no es cero ve a eti6, es cero continua


ld bc,4; carga a bc con el tamao de la cadena a copiar
push iy; pon la direccion destino en la pila(SP)
pop de; recupera la direccion destino en registros de
ldir; carga incrementa y repite hasta que bc igual a cero
jr eti7; ve a eti7 y termina

Vous aimerez peut-être aussi