Mover Sprite

Página 1/2
| 2

Por jrcp_kun

Paragon (1410)

Imagen del jrcp_kun

12-10-2014, 22:37

Estoy siguiendo el tutorial de iniciación a la programación. Estoy en el capitulo 6 de sprites. el tema es que tengo el sprite . defino 1 nada mas para probar. y lo saco en pantalla asi :
ld hl,tblATRsSPRs ; Tabla de los ATRs de los SPRs en ROM
ld de,SPRATR ; Destino la Sprite Atribute Table
ld bc,(NUM_ATR*4) ; Numero de Bytes
call LDIRVM ; 05Ch - BIOS - Copy block to VRAM, from memory

pero ahora quiero moverlo. al leer los 4 bytes de atributos y,x,nºsprite y color. como hago para que se vaya moviendo?
gráficamente aunque sea sin pulsar teclas por ejemplo de 0-255 en sentido vertical.
que tengo que borrarlo y volverlo a poner en la siguiente coordenada??

decidme como va para seguir avanzando. Gracias

Login sesión o register para postear comentarios

Por Guillian

Prophet (3438)

Imagen del Guillian

13-10-2014, 09:23

Simplemente actualiza los atributos con la nueva posición.
Puedes tenerlos en RAM, cambiar la X y mandarlos a VRAM. Si eso lo haces en un bucle el sprite se irá moviendo.

Por jrcp_kun

Paragon (1410)

Imagen del jrcp_kun

13-10-2014, 15:43

al leer los datos de una ds, que hago esto?

ld a,[spratr]
inc a ; o dec o lo que sea
ld [spratr],a

algo asi y vuelvo a lanzar la rutina de arriba??

Por jrcp_kun

Paragon (1410)

Imagen del jrcp_kun

13-10-2014, 18:23

lo tengo rulando pero me he encontrado con algún problema.

la variable que creo es la tblATRsSPRsRAM
si le pongo esto no me va.
tblATRsSPRsRAM:
.ds 4

ahora si lo pongo en c000 si me va
tblATRsSPRsRAM equ $c000

en vez de ds 4 que tengo que poner??

luego el sprite que numero horizontal o vertical me coge como ultimo.?? cero no, que es uno?? le he puesto que a 15 empieze otra vez o debo poner cp 0??

el retardo le he puesto un HALT , esta bien asi o habría otro diferente mas menos fino o efectivo??

os pongo el listado abreviado

ld hl,SPR1 ; Origen = Bytes de nuestro sprite
ld de,SPRTBL ; Destino = Sprite Pattern Table
ld bc,(NUM_SPR*32) ; Numero de bytes
call LDIRVM ; 05Ch - BIOS - Copy block to VRAM, from memory
ld hl,tblATRsSPRs ; Tabla de los ATRs de los SPRs en RoM
ld de,tblATRsSPRsRAM ; Destino la Sprite Atribute Table en ram
ld bc,(NUM_ATR*4) ; Numero de Bytes
ldir

; Show screen
call ENASCR
@@SHOW:
or a
ld hl,tblATRsSPRsRAM ; Tabla de los ATRs de los SPRs en ROM
ld de,SPRATR ; Destino la Sprite Atribute Table
ld bc,(NUM_ATR*4) ; Numero de Bytes
call LDIRVM ; 05Ch - BIOS - Copy block to VRAM, from memory
halt
ld hl,[tblATRsSPRsRAM]
dec h
cp 15
jr z,RESETX
ld [tblATRsSPRsRAM],hl
jp @@SHOW
RESETX:
ld h,240
ret

gracias

Por Guillian

Prophet (3438)

Imagen del Guillian

13-10-2014, 21:37

jrcp_kun wrote:

lo tengo rulando pero me he encontrado con algún problema.

la variable que creo es la tblATRsSPRsRAM
si le pongo esto no me va.
tblATRsSPRsRAM:
.ds 4

ahora si lo pongo en c000 si me va
tblATRsSPRsRAM equ $c000

en vez de ds 4 que tengo que poner??

Depende del ensamblador que estés usando. Si usas el Sjasm puedes usar MAP para indicar el comienzo de la RAM y luego # para el numero de bytes a reservar.

El problema puede ser que estés intentando cambiar los valores en ROM.
Puedes copiarlos de ROM a RAM, o directamente crearlos en RAM.

Te adjunto un ejemplo:

initcode:
	ld	a,(#f3e0)
	or	2
	ld	(#f3e0),a	; Sprites 16x16
	
	ld	a,5
	call	#5f		; Screen 5
                
	ld	de,#7800
	ld	hl,patROM
	ld	bc,32*2
	call	#5c		; Patrones

	ld	de,#7400
	ld	hl,colROM
	ld	bc,16*2
	call	#5c		; Colores

	ld	hl,atrROM
	ld	de,atrRAM
	ld	bc,4*2
	ldir			; Copiamos atributos a RAM
	
loop:
	ld	de,#7600
	ld	hl,atrRAM
	ld	bc,4*2
	call	#5c		; Atributos
	halt
	
	ld	a,(atrRAM+1)
	inc	a
	and	#3f
	ld	(atrRAM+1),a	; X sprite 1
	ld	(atrRAM+5),a	; X sprite 2
	jp	loop

patROM:

	db $03,$0f,$1f,$1f,$3f,$3f,$3f,$3f
	db $3f,$1f,$1b,$0f,$06,$03,$01,$5e
	db $c0,$f0,$f8,$f8,$fc,$fc,$fc,$fc
	db $fc,$f8,$98,$30,$60,$c0,$80,$00
	db $00,$01,$06,$0c,$0c,$18,$10,$23
	db $31,$13,$04,$00,$01,$00,$a0,$00
	db $00,$80,$60,$10,$10,$08,$10,$e0
	db $f0,$e0,$60,$c0,$80,$00,$00,$00
colROM:

	db $09,$09,$09,$09,$09,$09,$09,$08
	db $08,$08,$08,$08,$08,$08,$08,$01
	db $00,$46,$46,$46,$46,$46,$46,$41
	db $41,$41,$46,$46,$46,$00,$41,$00
atrROM:
	db 255,0,0,0
	db 255,0,4,0

	map #c000
atrRAM:	#8

Por jrcp_kun

Paragon (1410)

Imagen del jrcp_kun

13-10-2014, 21:50

estoy usando el del tutorial el editplus3 con asmsx compilandolo.
no quiero meterlo en c000 sino que me guarde 4 sitios en memoria definidos por el ensamblador para poder manejarlo

me recomiendas otro ensamblador o cual usas tu?? ese del tutorial es fácil pues me crea las .rom del tiron

Por pitpan

Prophet (3138)

Imagen del pitpan

13-10-2014, 23:16

Cuando dices que "no te va" te refieres a que no se mueve el sprite, ¿verdad? Eso se debe a que estás localizando la variable en ROM, por lo que no puedes escribir ningún valor ahí. Utiliza .ORG 0C000h o .PAGE 3 o lo que quieras para saber dónde tiene que ir todo.

Puedes hacer
.page 3
variable: ds 4

Y si luego quieres ponerlo en otro sitio - para hacer algo que no sea una ROM, por ejemplo - basta con que cambies el .PAGE 3 por el ORG correspondiente y listos. Es decir, no hace falta que apuntes cada variable a una dirección a pelo.

asMSX tiene también las instrucciones PHASE y DEPHASE para hacer guarradillas, pero mejor si haces un código limpio, especialmente si estás empezando ahora.

Por jrcp_kun

Paragon (1410)

Imagen del jrcp_kun

13-10-2014, 23:50

si, estoy super verde. yo lo que quiero es que me asigne esas posiciones el en memoria automáticamente . el ds 4 se supone que es define string no?? si tengo 5 sprites seria ds 4*5. pero no decirle yo que lo haga en c000 , si el ensamblador lo quiere hacer en d000 que lo haga el solo

es eso posible??

sino ya lo tengo asignado en c000

pitpan estoy haciendo unas pruebas y me gustaría que le echaras un ojo. te puedo enviar el .asm o .rom y lo ves??

gracias

Por FX

Champion (264)

Imagen del FX

15-10-2014, 15:00

Hola jrcp_kun:
Como te decían por ahi, no puedes poner esas variables directamente, ya que si te das cuenta, en ROM no puedes cambiar entonces el dato que meter ahí.
Por eso hay que mantener un espacio en memoria, por ejemplo en c000h.
Para hacerlo, yo utilizo el EQU, y reservo el espacio "a mano".
Yo ahora utilizo el sjasm, ya que (como bien me dijo en su día Assembler) el asmsx da problema en cuanto tienes ficheros largos. No se sabe porqué pero te obliga a poner NOPs a diestro y siniestro. Pero creo que para empezar esta muy bien.
El DS no para string, sino para reservar posiciones de memoria. Por ejemplo con DS 4 lo que estás haciendo es reservar en esa posición 4 bytes (Si lo pones en C000, pues la siguiente posición de memoria será C004). Si lo haces con EQU no es necesario esto. Simplemente le pones:
Variable1: EQU C000h
Variable2: EQU C004h
o si prefieres:
Variable1: EQU C000h
Variable2: EQU Varible2 + 4
Por lo menos en SJASM, para meter strings en DATAS (creo que en asmsx era distinto) se hace con DB "lo que quieras"
Si quieres que le eche un vistazo también sin problemas. Incluso si quedamos, te voy diciendo alguna cosilla.
Un saludo
FX

Por pitpan

Prophet (3138)

Imagen del pitpan

15-10-2014, 17:55

.page 3

VARIABLE:
ds 4

VARIABLE2:
ds 4

Esto reserva 4 posiciones de memoria (4 bytes) para VARIABLE, y 4 más en una dirección consecutiva para VARIABLE2. Y quedan definidas en 0C000h (página 3). Ten en cuenta que si haces una ROM de 32 KB que se carga en página 1 (4000h - 0BFFFh), todo ese espacio será de solo lectura. No podrás cambiar ni un valor de esas 32 KB - ésa es la gracia de una ROM. Y tendrás que poner necesariamente tus variables en RAM.

Si lo que quieres hacer es un fichero que se cargue en RAM (sea un COM o algo BLOADable desde BASIC, como se carga todo en RAM, no te hace falta indicar dónde quieres ponerlo, ya que será automodificable en cualquier caso.

Pero esto que te digo no tiene que ver con el ensamblador: ROM es siempre ROM y RAM es siempre RAM (salvo en los Turbo-R, que tienen alguna cosilla curiosa en este sentido).

Por jrcp_kun

Paragon (1410)

Imagen del jrcp_kun

15-10-2014, 18:39

gracias
si pitpan lo he estado mirando
pero eso tengo que definirlo según el tutorial en el inicio y pongo page 2 para que el programa empiece en 8000

lo que estoy es APRENDIENDO en super MAYUSCULAS. trabajándome lo de la vram ram bucles scroll etc etc
y como veis estoy a partir de cero. el tutorial mola y es muy chulo pero a partir de ahí es cuando te pones solanas y a darle a la pelota jeje.

FX tenemos que quedar para una cervecita
envíame un mail o algo y te paso mi tfno.

gracias a todos y seguimos que me esta molando empezar a hacer cosas aunque no tenga ni papa

Página 1/2
| 2