HispaMSX

Re: [hispamsx] Nuevas dudas de ensamblador

2005-03-20 20:56:59
Y después de la manita que te ha echado WYZ, aquí viene otra más:

Para generar números aleatorios, la forma basta de hacerlo es con el registro R (registro de refresco de memoria del Z80), que se autoincrementa automáticamente. Eso sí, el problema es que no es muy aleatorio y que sólo varían los 7 bits más bajos (el bit alto se mantiene siempre igual, sea 1 o 0, según lo pongas tu).

Entonces, te recomiendo que uses una tabla y ya está, todo solucionado:

INIT_RANDOM:
; Esta la tienes que ejecutar al principio de tu programa, sólo una vez
xor a
ld r,a
ret

RANDOM:
; Rutina que devuelve un número de 8 bits pseudoaleatorio en el acumulador (A)
ld a,r
ld c,a
ld b,0
ld hl,RND_TABLE
add hl,bc
ld a,[hl]
ret

RND_TABLE:
db ......

En la tabla tienes que poner 128 valores aleatorios. Mira por ejemplo el código fuente del MINESWEEPER que va con el asMSX, porque utiliza una rutina muy parecida y una tabla de números aleatorios generada en un lenguaje de alto nivel. El asMSX en el que estoy trabajando ya soporta la generación de números aleatorios, pero queda algo de tiempo para que sea publicado, claro.

Espero que con esto puedas avanzar un poco más, Juanma.

Un saludo y ánimo!

Edu Robsy


Nas:

-detección en screen 1 del carácter que está pisando un sprite.

Puede que esta te sirva.

IN: [B]=X [00-FF]
    [C]=Y [00-BF]
OUT:[HL]=DIRECCION VRAM

VPEEKXY:        LD      HL,$1800        ;SI NO SE HA VARIADO
                LD      D,0


                LD      A,C             ;HL=HL+(Y\8)*32
                AND     11111000B
                LD      E,A
                ADD     HL,DE
                ADD     HL,DE
                ADD     HL,DE
                ADD     HL,DE

                LD      A,B             ;HL=HL+(X\8)
                SRL     A
                SRL     A
                SRL     A
                LD      E,A
                ADD     HL,DE
                LD      A,L             ;A=VPEEK(HL)
                OUT     [$99],A
                LD      A,H
                OUT     [$99],A
                IN      A,[$98]
                RET


utiliza varios puntos del sprite segun la forma que tenga ( por ejemplo las cuatro esquinas) y compruebas que caracteres "pisa". No esta probado, pero creo que funciona. Ademas seguro que eres capaz de mejorarla. Animo!

WYZ

PS: El ensamblador es como la quimica. Utilizas siempre un numero determinado de elementos simples con los que organizandolos segun unas reglas puedes construirlo todo.

Darth Fistro <idrisbenali(_en_)yahoo(_punto_)es> wrote:


Hola a todos :)

Antes de empezar, desearía desde aquí acusar públicamente a ciertos
elementos de este foro (ellos bien saben quiénes son). Este grupúsculo
es el culpable de que esté a estas horas aún pegado peleándome con
cierta rutina, y de que haya perdido mi vida social. Era un feliz
programador de basic hasta que estos bellacos facinerosos empezaron
con las recomendaciones "pásate al ensamblador", "el ensamblador es
vida"... y yo como un imbécil piqué y probé, y ahora estoy enganchado.
.. me paso todo el día, hasta en el supermercado, pensando una nueva
rutina, si puedo hacer tal o cual cosa y si el nemónico que tengo en
mente realmente existe... gracias a todos ellos, nunca pensé que esto
enganchase tanto :)

-detección en screen 1 del carácter que está pisando un sprite. Este
lo considero fundamental para mis aspiraciones




---------------------------------



[Se han eliminado los trozos de este mensaje que no contenían texto]



*HispaMSX. La mailing-list de MSX en castellano*
Para cualquier duda: hispamsx-owner(_en_)yahoogroups(_punto_)com
Web de lista: http://www.hispamsx.org
Enlaces a Yahoo! Grupos


    hispamsx-unsubscribe(_en_)yahoogroups(_punto_)com

    http://es.docs.yahoo.com/info/utos.html







<Anterior en la conversación] Conversación actual [Siguiente en la conversación>