Karoshi MSX Community
05 de Julio de 2021, 07:32:14 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]
  Imprimir  
Autor Tema: Sprites en Ensamblador  (Leído 4023 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Shinzon
Karoshi Lover
***
Mensajes: 116


Email
« : 25 de Junio de 2011, 09:21:07 pm »

Saludos, eso lo primero.

Después de mucho tiempo sin poder hacer nada (pos igual 4 añicos), retomo otra vez mis malas intenciones de programar en ensamblador. Me he leido sopotocientos libros de ensamblador, y las bases las tengo creo que bastante bien metidas en el coco. Pero tiendo a ser más práctico que teórico (aunque también). Necesitaria un par de rutinas y complementos para intentarlo (que si no, me rayo).

Vamos a ver. ¿Una rutina bien explicada que monte un par de sprites en pantalla con sus colorines y forma? No hace falta moverlos de momento (con dos, sabre cuales son los saltos desde un sprite a otro en la tabla de memoria). Tan solo cargarlos en la VRAM y colocarlas en pantalla. Situacion de las coordenadas X e Y del sprite (para poder moverlo posteriormente, cosa que intentaré yo solito). Y diferencias de direcciones de VRAM en cuanto a Sprites según los modos de pantalla, ya que según creo, estos varian.  Y me lío con lo de los atributos, patrones y colores de los Sprites. ¿Alguna explicacion para un lerdote sobre este tema?

¿Porqúe todo esto? Una vez aprendido lo básico, lo mejor es dar caña a la practica. Aplicando rutinas basicas de sprites, movimiento, etc, podré según creo, ensamblar todos los modulos para formar un programa coherente. Pero de hacerlo, sería paso a paso, para así ir implementandolo todo y ver el procedimiento, ya que basicamente (depende del tipo de juegos, claro), siempre viene a ser lo mismo: Rutinas graficas, de sprites...

¿Me he pasado de la rayota?

Saludos cordiales.
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #1 : 26 de Junio de 2011, 12:22:10 pm »

Me temo que lo más fácil será que te leas un libro al respecto, pero te voy a dar dos pistas:

- Patrones de sprites: donde defines su forma (equivalente a la instrucción SPRITE$(n)=... en BASIC), que es el patrón. Puedes definir con las 2KB de VRAM que se reserva a este propósito, 256 sprites de 8x8 píxels o 64 sprites de 16x16.

- Atributos de sprites: donde defines para cada plano de sprite el patrón que debe mostrarse, su posición y su color (equivalente a la instrucción PUT SPRITE n,(x,y),c del BASIC). En total, dispones de 32 planos de sprites, independientemente de su tamaño, por lo que la tabla de atributos ocupa 32 x 4 = 128 bytes.
En línea
Jon_Cortazar
Administrator
Karoshi Forum's God
********
Mensajes: 2777



WWW Email
« Respuesta #2 : 26 de Junio de 2011, 04:24:05 pm »

Ahí te tiro un pedazo de código de ayuda para que trastees con el. De todas formas, es un ejemplo en SCREEN 2,2 y no te dejará todo claro: te recomiendo que, como bien ha dicho pitpan, tras tontear con este código busques después información detallada de los sprites en alguno de los libros técnicos que hay por ahí (para que te explique, por ejemplo, cómo funcionar con otros modos de sprites, o cómo manipular el EC bit que se encuentra en el dato de color para hacer que tus sprites desaparezcan por la izquierda, etc).

En fin, al menos tienes algo para trastear. Lo único que hace es cambiar el modo de pantalla, definir los gráficos de 2 patrones y después mostrarlos en pantalla. Espero que te sirva para arrancar! Wink

Código:

;---------------------------------------------------------------------------
; CONSTANTES
;---------------------------------------------------------------------------
; Posiciones VRAM

        SPRTBL  equ     $3800
        SPRATR  equ     $1b00

;---------------------------------------------------------------------------
; Posiciones RAM

        FORCLR  equ     $f3e9
        CLIKSW  equ     $f3db

;---------------------------------------------------------------------------




;---------------------------------------------------------------------------
; PROGRAMA PRINCIPAL
;---------------------------------------------------------------------------

INICIO:


; **** primero, cambiamos el modo de video y el color ****


; -------- color 15,1,1

        ld      hl,FORCLR
        ld      [hl],15 ; color 15 (foregrond)
        inc     hl
        ld      [hl],1 ; color ,1 (background)
        inc     hl
        ld      [hl],1 ; color ,,1 (border)


; -------- screen 2,0,0

        call    INIGRP ; screen 2 (modo de video 2)

        ld      bc,$0e201
        call    WRTVDP ; screen ,2 (sprites de 16x16)

        xor     a
        ld      [CLIKSW],a ; screen ,,0 (desactivo keyclick)




; **** ahora redefinimos el dibujo de dos sprites de 16x16 ****

ld hl,SPRITES_GRAFICOS ; copiamos los datos desde SPRITES_GRAFICOS
ld de,SPRTBL ; a la zona de VRAM de patrones de sprites
ld bc,32*2 ; y la cantidad será 64 bytes
call LDIRVM ; házlo!


; **** ahora redefinimos los atributos de los dos sprites ****

ld hl,SPRITES_ATRIBUTOS ; copiamos los datos desde SPRITES_ATRIBUTOS
ld de,SPRATR ; a la zona de VRAM de atributos de sprites
ld bc,4*2 ; y la cantidad será 8 bytes
call LDIRVM ; házlo!




LOOP_INFINITO:

jp LOOP_INFINITO




;---------------------------------------------------------------------------
; DATOS
;---------------------------------------------------------------------------


SPRITES_GRAFICOS:

; sprite patrón 0 (dibujo del cuadrado enfadado)

db $3f,$40,$80,$80,$80,$80,$80,$80
db $8c,$82,$80,$80,$80,$80,$40,$3f
db $fc,$02,$01,$01,$01,$01,$01,$01
db $31,$41,$01,$01,$01,$01,$02,$fc

; sprite patrón 1 (dibujo del cuadrado contento)

db $3f,$40,$80,$80,$80,$80,$80,$84
db $84,$84,$80,$80,$80,$80,$40,$3f
db $fc,$02,$01,$01,$01,$01,$01,$21
db $21,$21,$01,$01,$01,$01,$02,$fc


SPRITES_ATRIBUTOS:

; Y(-1), X, PATRON*4, COLOR

db 88-1,104,0*4,15
db 88-1,136,1*4,8

« Última modificación: 26 de Junio de 2011, 04:31:14 pm por Viejo_archivero » En línea

Jon Cortázar Abraido (aka El Viejo Archivero)
RELEVO Videogames
[Dioniso: La cafeína está haciendo su trabajo; yo espero hacer el mío.]
[pitpan: Me sigue pareciendo más productivo jugar al SNAIL MAZE que seguir esta discusión.]
Konamito
Karoshi Excellent Member
******
Mensajes: 1446



WWW Email
« Respuesta #3 : 26 de Junio de 2011, 08:42:02 pm »

Al compilar con asMSX me da error en la línea 42: Undefined identifier:


        call    INIGRP         ; screen 2 (modo de video 2)

¿Dónde está el fallo?
En línea

Shinzon
Karoshi Lover
***
Mensajes: 116


Email
« Respuesta #4 : 26 de Junio de 2011, 09:28:43 pm »

Gracias, amigos. A ver si empiezo con esto (ya empiezo a mirarlo un poco) y al final de la semana lo retomo que andaré algo liado. Ya os comentaré.

En cuanto a tí, KONAMITO, decirte que el fallo, a mi entender, es que no has definido la etiqueta INIGRP al comienzo del programa, justo antes de comenzar el codigo, despues de las lineas ".ROM" y demás. Si no recuerdo mal será algo como:

INIGRP: equ 00072h

O directamente pon al comienzo de la rutina (donde suele aparecer ".ROM") una linea con ".BIOS". De esta forma el asMSX leera las rutinas BIOS standard ya definidas con sus nombres oficiales, y no tendrás que acordarte de sus respectivas direcciones. Aunque, en cierta manera, esto es un error, ya que es mejor acostumbrarse a utilizarlas manualmente (una opinión como otra cualquiera).

Otra cosa que puede ser, es que la tengas definida, pero el nombre que le has dado sea "parecido" pero no igual, al tipo de los errores antiguos del MSX de cambiar ceros por "Oes" y unos por eles (y a veces ies). Vigila la sintaxis de las etiquetas.

Si he metido la pezuña, me dedicaré a la cría del berberecho salvaje.
En línea
Shinzon
Karoshi Lover
***
Mensajes: 116


Email
« Respuesta #5 : 26 de Junio de 2011, 09:35:48 pm »

Tontería la mía. Me acabo de dar cuenta, KONAMITO, que haces referencia a la rutina que me han pasado por aquí (por cierto, muchas gracias, compa). Efectivamente, no está definida la etiqueta INIGRP, y la forma de definirla es como te he dicho menos los ":" dos puntos:

INIGRP equ 00072h  ; ya que en las definiciones no se ponen los dos puntos.

En cuanto a la forma de dar las direcciones de memoria en el asMSX es esa. A la dirección le añades un "0" (cero) por delante y luego una "h" por detrás para darle a entender al ensamblador que es una dirección Hexadecimal. En esto cada ensamblador tiene sus manías. Cámbia esto en todas las direcciones (cuando veas un "$").

Aún no he probado la rutina, la estoy estudiando poco a poco. Cuando me haya empapado, comentaré más cosas. Saludos.
En línea
Jon_Cortazar
Administrator
Karoshi Forum's God
********
Mensajes: 2777



WWW Email
« Respuesta #6 : 27 de Junio de 2011, 04:09:50 am »

Al compilar con asMSX me da error en la línea 42: Undefined identifier:
        call    INIGRP         ; screen 2 (modo de video 2)
¿Dónde está el fallo?

Esasto!, como te dice Shinzon, al no haber puesto las directivas de ensamblado se me pasó incluiros el .bios del asMSX, que lo que hace es "activar" todas las EQU de las rutinas de la BIOS del MSX.

Pon esto al principio del listado para conseguir un .ROM de 8KB, posicionado en la página 1 y con las rutinas de la BIOS definidas Wink

Código:
;---------------------------------------------------------------------------
; CABECERA Y DIRECTIVAS
;---------------------------------------------------------------------------
; Directivas de ensamblado para un ROM
        .bios
        .page   1
        .rom
        .start  INICIO
        db      0,0,0,0,0,0,0,0,0,0,0,0
;---------------------------------------------------------------------------
En línea

Jon Cortázar Abraido (aka El Viejo Archivero)
RELEVO Videogames
[Dioniso: La cafeína está haciendo su trabajo; yo espero hacer el mío.]
[pitpan: Me sigue pareciendo más productivo jugar al SNAIL MAZE que seguir esta discusión.]
Konamito
Karoshi Excellent Member
******
Mensajes: 1446



WWW Email
« Respuesta #7 : 27 de Junio de 2011, 08:44:32 am »

Gracias por la aclaración. Se nota que tengo en ensamblador (lo poco que he podido aprender) muy oxidado...
En línea

Páginas: [1]
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!