Autor Tema: Empezando con ensamblador  (Leído 52178 veces)

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #45 en: Junio 14, 2012, 10:31:18 »
Gracias Manu y Carlos!!

@ Manu, voy a mirar a ver si simplemente incluyendola en un programa que ya se autorranca me funciona y sino probare con el listado que me adjuntas, tambien vere el comportamiento del bucle en loop a ver si hace falta quitarlo o no ya que el programa donde lo quiero meter ya que el programa lleva interrupciones de raster si no me equivoco.

@ Carlos, interesante, no sabia que la bitmap y sprites tenian que estar en el mismo banco que esta operativo, me cuentas que para cambiar el registro actuo sobre $dd00, es decir, si le quiero decir a la maquina que pongo operativo el banco uno,...hare?

LDA #$01
STA $DD00

 Y por ultimo, como se sabe el valor de los punteros de sprite en el Bank 1,...¿simplemente se divide el valor de memoria por 64 como en el banco 0?

 La verdad es que esto de trabajar en el Banco 0 con las limitaciones de espacio me esta viniendo bien para ser ordenado y aprovechar el espacio bien,..probe a meter los 5 sprites en la posicion 1024 (buffer de cassette) hacia atras, pero no me entran 5 y pisaba peligrosamente la zona de punteros y registros y el programa malfuncionaba.
  Al final los he metido al final de la zona que utilizaba para el inicio de programa, es decir (consultar mapa) desde la 4096 hacia 5 bloques hacia atras hasta la 3776 utilizando como punteros los valores 59,60,61,62 y 63 y me funciona perfecto ya que el listado no llega hasta esa zona...ahora solo me queda meterle la bitmap a partir de la 8192,..os cuento


Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #46 en: Junio 14, 2012, 11:31:19 »
Gracias Manu y Carlos!!

...
@ Carlos, interesante, no sabia que la bitmap y sprites tenian que estar en el mismo banco que esta operativo, me cuentas que para cambiar el registro actuo sobre $dd00, es decir, si le quiero decir a la maquina que pongo operativo el banco uno,...hare?

LDA #$01
STA $DD00

 Y por ultimo, como se sabe el valor de los punteros de sprite en el Bank 1,...¿simplemente se divide el valor de memoria por 64 como en el banco 0?
...

No exactamente, son los dos bits menos significativos de ese registro los que controlan el banco del VIC. Por ejemplo para seleccionar el bank 1:

Código: [Seleccionar]
lda $dd00
and #$fc              ; pongo a 0 los 2 bits menos significativos del registro manteniendo el resto
ora #$02             ; establezco el bank 1
sta $dd00

a lo mejor no queda claro porqué almacenar un 2 para seleccionar el bank 1, la explicación es esta:

Citar
$DD00 = %xxxxxx11 -> bank0
$DD00 = %xxxxxx10 -> bank1
$DD00 = %xxxxxx01 -> bank2
$DD00 = %xxxxxx00 -> bank3

para estas cosas lo mejor es que consultes el mapa de memoria del C64 donde se explica el valor de todos los registros: http://sta.c64.org/cbm64mem.html

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #47 en: Junio 14, 2012, 23:49:39 »
He incluido la rutina de carga de bitmap en un programa,..me la autoarranca (es decir me muestra la bitmap), pero AHI SE QUEDA!!!, no se porque no sigue el curso el programa. una vez que muestra la bitmap ahi se queda parado y no muestra los sprites y menos continua el programa con toda su retaila,..pense que el fallo estaria en el bucle de loop en el programa original,...si elimino la linea:

BUCLE
             JMP BUCLE        ; EN EL LISTADO ORIGINAL ERA LOOP:  JMP LOOP

el programa se me va al garete, no se que ocurre, adjunto principio del listado donde se ve el ingreso de la rutina en ; CARGAR BITMAP hasta ; COLORES DE PANTALLA,..pero no se porque el programa no sigue su curso, a ver si me podeis decir algo y el fallo tiene que estar en esa rutina porque si la quito aunque la bitmap no se muestre, el programa sigue su curso....

Código: [Seleccionar]
; ************************************   
; *          TITLE: CALIGULA         *         
; * CODER/GRAPHICS: INTERNATIONAL    *     
; *           YEAR: 2012             *   
; ************************************     
*=$0801 ; INICIO BASIC
.WORD NEXT,10 ; PUNTERO SIGUIENTE LINEA Y NUM. LINEA 10
.NULL $9E,^START ; SENTENCIA "SYS START" (START=INICIO C.M.)
NEXT .WORD 0 ; FIN DE PROGRAMA BASIC
.INCLUDE HARDWARE.INC ;DIRECTIVA CON ETIQUETAS

; VARIABLES (DEFINIDAS CON ".BYTE" O ".WORD" SEGUN OCUPEN 1 O 2 BYTES)
FRAMES .BYTE 0 ; CONTADOR DE FRAMES DE VIDEO

; CARGA SPRITES
*=$0EC0 ; INICIO SPRITES
.BINARY SPRITES.BIN ; BANCO DE SPRITES

; START
START SEI ; DESHABILITAR INTERRUPCIONES

; ESTO NO SE QUE HACE TODAVIA
LDA $D018 ; TOVIA NO SE QUE HACEN ESTAS CUATRO LINEAS
AND #$F1 ; VIC-II CHIP MEMORY CONTROL REGISTER LO TENGO QUE MIRAR
ORA #$0A ; DE MOMENTO LO INCLUYO
STA $D018 ; VIC-II CHIP MEMORY CONTROL REGISTER

; BORRAR PANTALLA
LDA #$20 ; VALOR DEL ESPACIO EN BLANCO
LDX #$00 ; DESPLAZAMIENTO
CLS STA $0400,X ; METER ESPACIO EN BLANCO EN FRANJA 1
STA $0500,X ; METER ESPACIO EN BLANCO EN FRANJA 2
STA $0600,X ; METER ESPACIO EN BLANCO EN FRANJA 3
STA $0700,X ; METER ESPACIO EN BLANCO EN FRANJA 4
DEX ; DECREMENTAR DESPLAZAMIENTO
BNE CLS ; REPETIR HASTA QUE NO LLEGUE A CERO


; CARGAR BITMAP
LDA $4710
STA $D020
STA $D021
LDX #$00
LOADDCCIMAGE
LDA $3F40,X
STA $0400,X
LDA $4040,X
STA $0500,X
LDA $4140,X
STA $0600,X
LDA $4240,X
STA $0700,X
LDA $4328,X
STA $D800,X
LDA $4428,X
STA $D900,X
LDA $4528,X
STA $DA00,X                                                                             
LDA $4628,X
STA $DB00,X
INX
BNE LOADDCCIMAGE

LDA #$3B
STA $D011
LDA #$18
STA $D016
LDA #$18
STA $D018
 BUCLE
JMP BUCLE
*=$1FFE
.BINARY "BITMAP.PRG"

; COLORES DE PANTALLA
    LDA #$08        ; COLOR NARANJA
STA $0286 ; A LA POSICION 646 COLOR CURSOR
LDA #$00 ; VALOR DEL COLOR NEGRO
STA $D020 ; ASIGNARLO AL BORDE
LDA #$00 ; VALOR DEL NEGRO
STA $D021 ; Y TAMBIEN AL FONDO


; ASIGNAR PUNTEROS SPRITES
LDA #$3B ; BLOQUE MEMORIA 59 BANCO 0 GRAFICO NAVE DERECHA
STA $07F8 ; ASIGNAR A SPRITE #0 PUNTERO 2040
LDA #$3E ; BLOQUE MEMORIA 62 BANCO 0 GRAFICO NAVE ENEMIGA
« última modificación: Junio 15, 2012, 00:09:10 por R. INTERNATIONAL »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #48 en: Junio 14, 2012, 23:53:07 »
El programa continua aqui, lo que pasa es que si lo adjunto todo de golpe "peta"...

Código: [Seleccionar]

; ASIGNAR PUNTEROS SPRITES
LDA #$3B ; BLOQUE MEMORIA 59 BANCO 0 GRAFICO NAVE DERECHA
STA $07F8 ; ASIGNAR A SPRITE #0 PUNTERO 2040
LDA #$3E ; BLOQUE MEMORIA 62 BANCO 0 GRAFICO NAVE ENEMIGA
STA $07F9 ; ASIGNAR A SPRITE 1 PUNTERO 2041
LDA #$3E ; BLOQUE MEMORIA 62 BANCO 0 GRAFICO NAVE ENEMIGA
STA $07FA ; ASIGNAR A SPRITE 2 PUNTERO 2042
LDA #$3E ; BLOQUE MEMORIA 62 BANCO 0 GRAFICO NAVE ENEMIGA
STA $07FB ; ASIGNAR A SPRITE 3 PUNTERO 2043
LDA #$3F ; BLOQUE MEMORIA 63 BANCO 0 GRAFICO DISPARO
STA $07FC ; ASIGNAR A SPRITE 4 PUNTERO 2044

; ASIGNAR COLORES SPRITES
LDA #$06 ; VALOR COLOR AZUL
STA SP0COL ; METERLO EN LA ETIQUETA SPOCOL COLOR SPRITE #0
LDA #$06 ; VALOR COLOR AZUL
STA SP1COL ; METERLO EN LA ETIQUETA SPOCOL COLOR SPRITE #1
LDA #$06 ; VALOR COLOR AZUL
STA SP2COL ; METERLO EN LA ETIQUETA SPOCOL COLOR SPRITE #2
LDA #$06 ; VALOR COLOR AZUL
STA SP3COL ; METERLO EN LA ETIQUETA SPOCOL COLOR SPRITE #3
LDA #$07 ; VALOR COLOR AMARILLO
STA SP4COL ; METERLO EN LA ETIQUETA SPOCOL COLOR SPRITE #4

; ASIGNAR MULTICOLOR 1 Y 2 PARA TODOS LOS SPRITES
LDA #$0B ; VALOR 11 GRIS OSCURO
STA SPMC0 ; AL REGISTRO MULTICOLOR 1
LDA #$01 ; VALOR 1 BLANCO
STA SPMC1 ; AL REGISTRO MULTICOLOR 2

; ASIGNAR POSICION INICIAL SPRITES
LDA #0 ; BIT MAYOR PESO COORDENADA X = 0
STA MSIGX ; AL HIERRO!
LDA #70 ; COORDENADA X = 70
STA SP0X ; AL SPRITE 0
LDA #110 ; COORDENADA Y = 110
STA SP0Y ; AL SPRITE 0
LDA #85 ; COORDENADA X = 85
STA SP4X ; AL SPRITE 4
LDA #110 ; COORDENADA Y = 110
STA SP4Y ; AL SPRITE 4
LDA #255 ; COORDENADA X = 255
STA SP1X ; AL SPRITE 1
LDA #80 ; COORDENADA Y = 80
STA SP1Y ; AL SPRITE 1
LDA #255 ; COORDENADA X = 255
STA SP2X ; AL SPRITE 2
LDA #135 ; COORDENADA Y = 135
STA SP2Y ; AL SPRITE 2
LDA #155 ; COORDENADA X = 155
STA SP3X ; AL SPRITE 3
LDA #190 ; COORDENADA Y = 190
STA SP3Y ; AL SPRITE 3

; ACTIVAR MODO MULTICOLOR SPRITES
LDA #$FF ; A TODOS
STA SPMC ; AL HIERRO

; DESHABILITAR TECLADO
LDA 224
STA CIDDRA

;   - - - - - - - -
; BUCLE PRINCIPAL
;   - - - - - - - -

UPDATE

; HIERRO DE SPRITES
LDA #$0F ; ACTIVO SPRITES 0 1 2 3
STA SPENA ; VALOR A ETIQUETA SPENA ACTIVACION SPRITES

MAINLOOP

; ESPERAR RAYO DE ELECTRONES
LDA RASTER
CMP #$FF
BNE MAINLOOP

; LECTURA DEL JOYSTICK Y MOVIMIENTO SPRITE

Asi todo en esta parte del listado (que todavia sigue mas) no esta el asunto,..sino en la primera del post anterior, en la que no se porque el programa no sigue su curso y tiene que estar en la rutina que he ingresado de carga de bitmap, a ver si me podeis decir algo...

  Gracias.
« última modificación: Junio 14, 2012, 23:56:06 por R. INTERNATIONAL »

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13749
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Empezando con ensamblador
« Respuesta #49 en: Junio 15, 2012, 00:27:05 »
Raúl, quizás esto te sirva para cuando son códigos tan largos: hay unas webs que permite pegar un código y luego pones aqui un enlace, por ejemplo asi: http://pastebin.com/n8cUTX9L

Esta http://pastebin.com o esta http://dpaste.com
« última modificación: Junio 15, 2012, 00:47:54 por josepzin »
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #50 en: Junio 15, 2012, 10:10:10 »
No consigo entender que es lo que ocurre, he creado un nuevo programa aislando el meollo para intentar solucionarlo en un programa mas corto, en el listado vereis que se carga la bitmap y luego mostrada se pretende mostrar un Sprite...
La bitmap la muestra pero nunca llega a mostrar el sprite, alguien me puede ayudar, donde esta el error, porque no me muestra el sprite y se queda atorado al mostrar la bitmap?

Código: [Seleccionar]
*=$0801 ; INICIO BASIC
.WORD NEXT,10 ; PUNTERO SIGUIENTE LINEA Y NUM. LINEA 10
.NULL $9E,^START ; SENTENCIA "SYS START" (START=INICIO C.M.)
NEXT .WORD 0 ; FIN DE PROGRAMA BASIC
.INCLUDE HARDWARE.INC ;DIRECTIVA CON ETIQUETAS

; VARIABLES (DEFINIDAS CON ".BYTE" O ".WORD" SEGUN OCUPEN 1 O 2 BYTES)
FRAMES .BYTE 0 ; CONTADOR DE FRAMES DE VIDEO

; CARGA SPRITES
*=$0EC0 ; INICIO SPRITES
.BINARY SPRITES.BIN ; BANCO DE SPRITES

; START
START SEI ; DESHABILITAR INTERRUPCIONES

; ESTO NO SE QUE HACE TODAVIA
LDA $D018 ; TOVIA NO SE QUE HACEN ESTAS CUATRO LINEAS
AND #$F1 ; VIC-II CHIP MEMORY CONTROL REGISTER LO TENGO QUE MIRAR
ORA #$0A ; DE MOMENTO LO INCLUYO
STA $D018 ; VIC-II CHIP MEMORY CONTROL REGISTER

; CARGAR BITMAP
LDA $4710
STA $D020
STA $D021
LDX #$00
LOADDCCIMAGE
LDA $3F40,X
STA $0400,X
LDA $4040,X
STA $0500,X
LDA $4140,X
STA $0600,X
LDA $4240,X
STA $0700,X
LDA $4328,X
STA $D800,X
LDA $4428,X
STA $D900,X
LDA $4528,X
STA $DA00,X                                                                             
LDA $4628,X
STA $DB00,X
INX
BNE LOADDCCIMAGE

LDA #$3B
STA $D011
LDA #$18
STA $D016
LDA #$18
STA $D018
BUCLE
JMP BUCLE
*=$1FFE
.BINARY "BITMAP.PRG"

PARAMETROS

; ASIGNAR PUNTEROS SPRITES
LDA #$3B ; BLOQUE MEMORIA 59 BANCO 0 GRAFICO NAVE DERECHA
STA $07F8 ; ASIGNAR A SPRITE #0 PUNTERO 2040
; ASIGNAR COLORES SPRITES
LDA #$06 ; VALOR COLOR AZUL
STA SP0COL ; METERLO EN LA ETIQUETA SPOCOL COLOR SPRITE #0
; ASIGNAR MULTICOLOR 1 Y 2 PARA TODOS LOS SPRITES
LDA #$0B ; VALOR 11 GRIS OSCURO
STA SPMC0 ; AL REGISTRO MULTICOLOR 1
LDA #$01 ; VALOR 1 BLANCO
STA SPMC1 ; AL REGISTRO MULTICOLOR 2
; ASIGNAR POSICION INICIAL SPRITES
LDA #0 ; BIT MAYOR PESO COORDENADA X = 0
STA MSIGX ; AL HIERRO!
LDA #70 ; COORDENADA X = 70
STA SP0X ; AL SPRITE 0
; ACTIVAR MODO MULTICOLOR SPRITES
LDA #$FF ; A TODOS
STA SPMC ; AL HIERRO
; DESHABILITAR TECLADO
LDA 224
STA CIDDRA
; MUESTRA SPRITE
LDA #$0F ; ACTIVO SPRITES 0 1 2 3
STA SPENA ; VALOR A ETIQUETA SPENA ACTIVACION SPRITES

MAINLOOP

; ESPERAR RAYO DE ELECTRONES
LDA RASTER
CMP #$FF
BNE MAINLOOP

FIN
JMP FIN

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #51 en: Junio 15, 2012, 10:16:36 »
SOLUCIONADO!!!, no se que leches he tocado pero ya me funciona!!!, voy a hacer el arreglo en el listado grande y os muestro la CHURUFLETA.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #52 en: Junio 15, 2012, 10:28:48 »
Bueno, os muestro mis humildes avances en Ensamblador, en este correo os adjunto un archivo .prg que podeis autoarrancar (Autostar disk/tape image) en el Vice.

Una vez cargado podreis pilotar la nave con el Joystick (con teclado no es posible), vereis que la nave tiene una cierta ondulacion cuando se mueve hacia arriba y abajo, el tema de la colision de sprites esta sin hacer y el tema del disparo es un poco "despelote" una vez que lo pulsas, solo desaparece reseteando el juego.

Poco a poco voy aprendiendo a hacer cositas, ahora quiero manejarme con el tema de la colision de Sprites y dejar bien el tema del disparo,..seguro que os preguntare algunas dudillas que me salgan.

Al final lo que ocurria era que el juego se quedaba pillado en la linea:

LOOP   JMP LOOP

Pero si la quitaba el programa se iba al garete, lo que hice fue crear una Etiqueta llamada PARAMETROS una vez terminada la rutina de carga de Bitmap,..en la famosa linea del bucle cambien esto:

LOOP   JMP PARAMETROS

Y solucionado!!!,..el programa sigue su curso sin verse afectado.

Un saludo.
« última modificación: Junio 15, 2012, 10:38:02 por R. INTERNATIONAL »

Bieno

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 3993
  • PRINT"ADORA A TU COMMODORE"
    • Ver Perfil
    • bieno64
Re:Empezando con ensamblador
« Respuesta #53 en: Junio 15, 2012, 11:03:22 »
Te ha quedado muyyyyyyyyy chulo. Un buen comienzo para un matamarcianos.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #54 en: Junio 15, 2012, 14:36:05 »
Ya tengo preparado un Plan de Batalla que lleva muchas mejoras en la Churufleta,..en especial me interesa la de superar la barrera de los 255 en la Coordenada X,...Alguien me puede dar un poco de luz?:

PROXIMAS MEJORAS:

- CAMBIAR CONFIGURACION DE COLORES EN SPRITES PARA PODER VARIAR COLORES EN NAVES ENEMIGAS
- CREAR UN NUEVO SPRITE DE "FUEGO DE REACTORES"
- AGREGAR EL NUEVO SPRITE Y HACER QUE APAREZCA CUANDO LA NAVE SE MUEVE A LA DERECHA
- MEJORAR LA BITMAP DE FONDO
- SUPERAR LA BARRERA DE LOS 255 EN LA COORDENADA X POR LO MENOS PARA LAS NAVES ENEMIGAS
- DETECTAR COLISION DE SPRITES
- MEJORAR EL TEMA DEL LASER UNA VEZ DISPARADO
- MODIFICAR EN ZIG-ZAG EL MOVIMIENTO DE LAS NAVES ENEMIGAS
- INCLUIR BITMAP DE PRESENTACION Y JUGAR AL PULSAR CUALQUIER TECLA
- INCLUIR MUSICA

AL HIERRO!!!

lobogris

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 453
  • Programador
    • Ver Perfil
    • http://back2theretro.blogspot.com
Re:Empezando con ensamblador
« Respuesta #55 en: Junio 16, 2012, 03:52:38 »
Ya tengo preparado un Plan de Batalla que lleva muchas mejoras en la Churufleta,..en especial me interesa la de superar la barrera de los 255 en la Coordenada X,...Alguien me puede dar un poco de luz?:

para superar esa barrera de los 255, lo que tienes que hacer es guardar las coordenadas x e y en variables (aunque se puede prescindir de variables, te recomiendo asi), siendo la variable que guarda la coordenada X del tamaño de un word (16 bits) y la de la coord. Y, en un simple byte.
A la hora de querer visualizar el sprite, haremos unas pocas comprobaciones sobre la coord. X, nos interesa saber si el bit mas a la izq. de todo de su byte alto está encendido o no, y lo traspasaremos al registro MSB X del VIC para el sprite que pertoque (con ayuda de la máscara que lo representa).

Aunque se puede hacer de varias maneras, aqui te va un ejemplo:

(registros del VIC:)
VIC_SPR_XMSB = $d012
VIC_SPR_X  = $d000
VIC_SPR_Y  = $d001

(variables y constantes:)
VIC_SPR_MASK = 1   ; para el sprite 0 (ya sabes, 1,2,4,8,16,32,64,128, o 2 elevado al num. sprite, siendo los sprites numerados del 0 al 7)
spr_x: .word 0
spr_y: .byte 0
Código: [Seleccionar]
                lda spr_x
                sta VIC_SPR_X           ; metemos el byte bajo de la variable que guarda la coord. X
                                        ; en el registro del VIC del sprite correspondiente
                                        ; en este caso el primero, o sprite "0"
                lda #VIC_SPR_MASK       ; cargamos el acu con el cod. de mascara del sprite
                ldx spr_x+1             ; obtenemos en x el byte alto de la coord. X       
                beq no_aj            ; si el byte alto es = 0 no habrá que ajustar: saltamos...
                ; en caso contrario, valores >255, ajustamos:
                ora VIC_SPR_XMSB      ; aqui al hacer un ORA encedemos el bit del sprite
                                      ; indicado por VIC_SPR_MASK en el reg. VIC_SPR_XMSB
                bne nz                 ; salto incondicional para saltar bloque de ajustes
                                       ; en este caso la condicion siempre se cumplirá
                                       ; es como poner jmp nz, pero es más economico asi
no_aj:          eor #$ff               ; invertimos el valor cuando no habia
                                       ; que ajustar ya que esto nos permite
                                       ; "jugar" con la instruccion que sigue                   
                and VIC_SPR_XMSB    ; pone a 0 o no, según si se ajustó o no
nz:             sta VIC_SPR_XMSB    ; ACTUALIZA el registro del VIC que guarda el XMSB
                lda spr_y           ; ACTUALIZA la coordenada Y tal cual
                sta VIC_SPR_Y       ; de la variable al registro del VIC del sprite 0
Cualquier duda me preguntas. Te va quedando muy chula la churufleta, ánimo Raúl! ;) me alegra saber de ti despues de varios dias, luego te contesto los correos con calma.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #56 en: Junio 16, 2012, 12:17:25 »
Gracias Lobo, la verdad es que con el listado que me has dejado creo que no voy a tener ningun problema, te contare segun lo vaya haciendo, ademas que veo que no voy a tener que cambiar nada de la sintaxis para que me lo compile sin problemas el 64Tass...

Unas ultimas preguntas:
- ¿tendre que hacer una rutina nueva para cada sprites, no?
- ¿en que lugar del listado coloco cada rutina, en los momentos donde se regula el movimiento derecha izquierda de la Nave, Enemigos o Disparo?

Bueno tronco, seguimos hablando por privado y vamos preparando algo para Retrospectiva 2012.

   AL HIERRO REVIVERO!!!
« última modificación: Junio 16, 2012, 13:18:28 por R. INTERNATIONAL »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #57 en: Junio 16, 2012, 13:28:03 »
Manu, en la Pagina 2 de este hilo en relacion al programa que estabas mejorando dijiste esto:

"Por otro lado, también he mejorado el movimiento, ya que antes me limitaba a los primeros 256 píxeles de ancho, y ahora se recorren los 320"

Me interesa tu opinion o listadito en relacion al tema de superar los 255 en la Coordenada X.

  SALUDOS!!!

Manu

  • Commodoremaníaco
  • ****
  • Mensajes: 118
  • SYS 0
    • Ver Perfil
    • Manuel Sagra
Re:Empezando con ensamblador
« Respuesta #58 en: Junio 16, 2012, 13:58:08 »
Yo lo que hago es una comparación, y ajusto los registros correspondientes. Aquí tienes el trozo de código que anima un sprite a partir de una tabla precalculada de senos:

Código: [Seleccionar]
  ; print sprite 1
sprite1:
  inc x1 
  bne calculatey1
  ; if x1 == 0
  lda $d010
  ora #$02
  sta $d010
calculatey1:
  ldx x1
  lda $d010
  and #$02
  cmp #$02
  bne loady1
  ; if x1 > 256 
  ldy #SINETABLE+256,x
  txa
  cmp #$40
  bne prints1
  ; if x1 > 320
  lda $d010
  and #$fd
  sta $d010
  lda #$00
  sta x1
  beq prints1
loady1:
  ldy #SINETABLE,x
prints1:
  stx $d002
  sty $d003
The legend will never die

lobogris

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 453
  • Programador
    • Ver Perfil
    • http://back2theretro.blogspot.com
Re:Empezando con ensamblador
« Respuesta #59 en: Junio 16, 2012, 15:26:56 »
- ¿tendre que hacer una rutina nueva para cada sprites, no?

puedes hacer una rutina nueva para cada sprite, con su variable independiente (xspr1, xspr2, etc) para lo cual es recomendable usar macros.

O crear una tabla de sprites y una rutina general tipo PutSprite y llamarla con parámetros con JSR.
de esta manera recorrerias la tabla de todos los sprites y los irias imprimiendo en pantalla en sus coordenadas.
Por ejemplo seria:
Código: [Seleccionar]
IMPRIME_SPRITES:
; imprime 5 sprites en sus correspondientes coordenadas
XSPR:        .word 0
XSPRITES: .word 50,80,90,100,110
YSPRITES .byte 60,80,100,120,150

            ldx #$00
BUCLE: lda YSPRITES,x
            tay
            lda XSPRITES,x
            sta XSPR
            lda XSPRITES+1,x
            sta XSPR+1
            txa
            pha
            jsr PUTSPRITE  ; entradas: la variable de 16 bits temporal XSPR,  en el reg. y la coord. vert. Y
            pla
            tax
            inx
            cpx #5
            bne BUCLE
            jmp MAIN

Esto sólo imprimiria los sprites en sus coordenadas. En otro punto del programa deberias hacer un bucle similar (o si se tercia dentro de este mismo), donde modificaras las coordenadas para crear los movimientos, claro.

- ¿en que lugar del listado coloco cada rutina, en los momentos donde se regula el movimiento derecha izquierda de la Nave, Enemigos o Disparo?
En todo programa o juego, hay un bucle principal (el motor en si de todo programa) donde se van llamando a todas las rutinas una a una de forma continua. El orden en que hagas las llamadas, es el que dicta la lógica mayormente. Aqui te pongo un pseudocódigo:
(puedes poner las rutinas directamente en lugar de llamarlas con un JSR donde pertoque, aunque por motivos de claridad lo pongo asi)
Código: [Seleccionar]
/* Esqueleto de un videojuego cualquiera */

                     JSR PORTADA
INICIO:
                     JSR MENU                 
                     JSR INICIALIZA_VARIABLES
                     JSR INICIALIZA_VIC
                     JSR INICIALIZA_SID
                     JSR IMPRIME_FONDO
MAIN:            JSR IMPRIME_SPRITES
                     JSR COMPRUEBA_CONTROLES ; y actualiza coordenadas de movimientos del player
                     JSR MUEVE_ENEMIGOS            ; La "IA" de los enemigos, actualiza movimientos según
                                                                     ; ciertas reglas
                     JSR COMPRUEBA_COLISIONES_PLAYER      ; actualiza VIDAS si hubo colision critica 
                     JSR COMPRUEBA_COLISIONES_ENEMIGOS ; actualiza desaparicion enemigos
                     lda VIDAS
                     beq FIN
                     JMP MAIN
FIN:              JSR GAMEOVER   ; llama pantalla de GAME OVER
                     JMP INICIO         ; inicio de todo otra vez

por supuesto faltan otras cosas (comprbobar si pasó de nivel, cargar nuevo mapa de nivel, etc), pero ya vale para un plan general, que te hagas una idea de la "macro" estructura interna de un juego con sus bloques que lo componen relacionados.

Salu2!