Commodore manía

Commodore 64 => Desarrollo => Ensamblador => Mensaje iniciado por: Manu en Mayo 23, 2012, 18:01:16

Título: Empezando con ensamblador
Publicado por: Manu en Mayo 23, 2012, 18:01:16
Estoy empezando a hacer un emulador de varios sistemas en Java (incluído el C64), y como no conocía las tripas estoy empezando a meterle mano, al menos con emuladores :P

Uno de mis primeros programas es esta chorrada, que seguro que le hace gracia a más de uno:

Código: [Seleccionar]
    processor   6502
    org    $1000

           lda #$20
clrloop:   sta $0400,x
           sta $0500,x
           sta $0600,x
           sta $0700,x
           dex
           bne clrloop 

start:
           ldy #$2
mainloop:
           sty $d020
           sty $d021
           lda $d012
           cmp #$60
           bne mainloop
           
           ldy #$7
rastloop:
           sty $d020
           sty $d021
           lda $d012
           cmp #$d0
           bne rastloop
           
           jmp start

¿Qué pensáis que sale en pantalla al hacer un sys 4096? xDDDD
Título: Re:Empezando con ensamblador
Publicado por: josepzin en Mayo 23, 2012, 21:29:09
Tengo que poner en marcha un ensamblador para probar cosas como esta!

* Pon el PRG :P
Título: Re:Empezando con ensamblador
Publicado por: Manu en Mayo 23, 2012, 22:26:21
Aquí tienes el PRG  8)

Programita (http://dl.dropbox.com/u/37131/c64/raster.prg)
Título: Re:Empezando con ensamblador
Publicado por: josepzin en Mayo 23, 2012, 23:11:36
Aquí tienes el PRG  8)

Programita (http://dl.dropbox.com/u/37131/c64/raster.prg)

¿Estas seguro que eso hace algo?? :D yo no veo nada...

Por cierto, cuenta un poco que herramientas estas usando, etc...
Título: Re:Empezando con ensamblador
Publicado por: Manu en Mayo 23, 2012, 23:22:58
Tienes que cargarlo (yo lo hago en el vice con "x64 raster.prg"), y luego hacer un sys 4096 en basic :)

Para hacerlo de momento no he hecho nada fuera de lo común, salvo documentarme de los registros del VIC II, usar un editor de texto, y ensamblarlo con el Dasm (http://dasm-dillon.sourceforge.net/)  8)

Ten en cuenta que el raster se hace de forma muy burda, sin interrupciones ni nada :P
Título: Re:Empezando con ensamblador
Publicado por: Zonacas en Mayo 24, 2012, 08:37:50
España!!! España!!!

Esta Eurocopa es nuestra con este programita :D
Título: Re:Empezando con ensamblador
Publicado por: Manu en Mayo 24, 2012, 08:45:02
¡Ese es el espíritu! xDDD

A ver si luego publico una nueva versión algo más optimizada :)
Título: Re:Empezando con ensamblador
Publicado por: Laddh en Mayo 24, 2012, 09:53:35
Version facil para Josepzin  ;)

Código: [Seleccionar]

; 10 SYS (4096)

*=$800

        BYTE        $00, $0E, $08, $0A, $00, $9E, $20, $28, $34, $30, $39, $36, $29, $00, $00, $00

          *=$1000     
          LDA #$20       
CLRLOOP
          STA $0400,X   
          STA $0500,X   
          STA $0600,X   
          STA $0700,X   
          DEX
          BNE CLRLOOP   
START
          LDY #$2       
MAINLOOP
          STY $D020     
          STY $D021     
          LDA $D012     
          CMP #$60       
          BNE MAINLOOP   
          LDY #$7       
RASTLOOP
          STY $D020     
          STY $D021     
          LDA $D012     
          CMP #$D0       
          BNE RASTLOOP   
          JMP START     
Título: Re:Empezando con ensamblador
Publicado por: Carlos en Mayo 24, 2012, 10:45:57
Genial que la gente se vaya animando con la programación del C64.. no pierdo la esperanza de que algún día podamos hacer una colaboración made in foreros :)

PD: Por cierto, alguien sabe que es de Lobogris?? hace tiempo que no se deja ver.
Título: Re:Empezando con ensamblador
Publicado por: josepzin en Mayo 24, 2012, 11:07:00
PD: Por cierto, alguien sabe que es de Lobogris?? hace tiempo que no se deja ver.
Hasta donde sé, Lobogris esta liado con cosas personales...
Título: Re:Empezando con ensamblador
Publicado por: josepzin en Mayo 24, 2012, 12:03:42
Version facil para Josepzin  ;)

Esta tarde lo pruebo!
Título: Re:Empezando con ensamblador
Publicado por: Manu en Mayo 24, 2012, 14:49:25
Ahora lo mismo, con interrupciones raster y música de Snap xDDD

Código: [Seleccionar]
    processor   6502
   
    org $810

           lda #$00
           tax
           tay
           jsr $1000 ; init music
           
           jsr $e544 ; clear screen
           
           sei ; disable interrupts and clear pending irqs
           lda #$7f
           sta $dc0d
           sta $dd0d
           lda #$01
           sta $d01a
           
           lda #$1b ; text mode
           ldx #$08
           ldy #$14
           sta $d011
           stx $d016
           sty $d014
           
           lda #<irq1
           ldx #>irq1
           sta $0314
           stx $0315
           
           ldy #$60 ; first raster interrupt
           sty $d012
           
           lda $dc0d ; clear interrupts and VIC ACK
           lda $dd0d
           asl $d019
           cli
           
loop:
           jmp loop ; loop forever

irq1:
           lda #$7 ; yellow
           sta $d020
           sta $d021
           
           jsr $1003 ; update music
           
           lda #<irq2 ; set the next interrupt vector at raster line RASTER2
           ldx #>irq2
           sta $0314
           stx $0315
           
           ldy #$d0
           sty $d012
           
           asl $d019 ; VIC ACK
           
           jmp $ea81
           
irq2:
           lda #$2 ; red
           sta $d020
           sta $d021
           
           lda #<irq1 ; set the next interrupt vector at raster line RASTER1
           ldx #>irq1
           sta $0314
           stx $0315
           
           ldy #$60
           sty $d012
           
           asl $d019; VIC ACK
           
           jmp $ea81
           
    org $1000-$7e
    INCBIN "snap.sid"

PRG (http://dl.dropbox.com/u/37131/c64/spain.prg) (Luego hacer SYS2064)

¿Alguien sabe porqué se produce ese flickering en los bordes a pesar de que lo primero que haga en la interrupción sea cambiar el color?  :'(
Título: Re:Empezando con ensamblador
Publicado por: Manu en Mayo 24, 2012, 17:58:12
Bueno, y ya lo último de hoy...

Sorpresita (http://dl.dropbox.com/u/37131/c64/pac.zip)

Ejecutar el prg y luego hacer un SYS2064

La verdad esto esto es más fácil de lo que pensaba...
Título: Re:Empezando con ensamblador
Publicado por: Bieno en Mayo 24, 2012, 18:14:08
Genial !!!!!!!!!!! El PAC de Commodore mania. A este paso antes de las 12 nos haces una demo  :)
Título: Re:Empezando con ensamblador
Publicado por: josepzin en Mayo 24, 2012, 18:38:03
Mo-la! un poco mas y ya tenemos "el PRG oficial" de Commodore Manía!!
Título: Re:Empezando con ensamblador
Publicado por: Carlos en Mayo 25, 2012, 09:22:12
Bueno, y ya lo último de hoy...

Sorpresita (http://dl.dropbox.com/u/37131/c64/pac.zip)

Ejecutar el prg y luego hacer un SYS2064

La verdad esto esto es más fácil de lo que pensaba...

Muy bien :) ya tenías experiencia en la programación de C64 u otros sistemas??
Título: Re:Empezando con ensamblador
Publicado por: Manu en Mayo 25, 2012, 10:14:06
Muy bien :) ya tenías experiencia en la programación de C64 u otros sistemas??

No he tocado un C64 en la vida (ni ningún ordenador basado en 6502), pero empecé a investigar cómo funcionaba internamente hace unas semanas, primero la CPU, y ahora el resto de componentes.

Eso sí, el ensamblador de Z80 sí me es más familiar, y en la carrera también he tocado el de arquitecturas x86, ya que soy "teleco técnico" ;)

En cualquier caso, la arquitectura del C64 me parece muy interesante. Estoy aprendiendo algunas cosillas más, y para la semana que viene a ver si me da tiempo a hacer alguna cosita más avanzada con rasters y efectos :)
Título: Re:Empezando con ensamblador
Publicado por: Carlos en Mayo 25, 2012, 10:36:46
Eso si que es ir rápido.. a mi me costo meses entender bien toda la parte gráfica y de rasters. Como nos despistemos en un par de semanitas nos preparas el Call of Duty para C64 :D
Título: Re:Empezando con ensamblador
Publicado por: Manu en Mayo 25, 2012, 10:49:18
Bueno, puede que tenga facilidad para ciertas cosas, pero no creo que domine el SID nunca, y seguramente me costará emularlo un huevo. Creo que es, con diferencia, la parte más compleja del ordenador. Menos mal que al menos reproducir una melodía "ripeada" es insultantemente fácil ^_^
Título: Re:Empezando con ensamblador
Publicado por: Zonacas en Mayo 26, 2012, 15:16:30
Joe que envidia como controláis el ensamblador :)

Estaría bien un cursillo como el que empezo lobogris :)

Título: Re:Empezando con ensamblador
Publicado por: Manu en Mayo 26, 2012, 15:55:43
Mira, este tutorial me ha venido bien para empezar y conocer algunas cosas básicas:

http://digitalerr0r.wordpress.com/category/commodore-64/ (http://digitalerr0r.wordpress.com/category/commodore-64/)
Título: Re:Empezando con ensamblador
Publicado por: Zonacas en Mayo 26, 2012, 18:47:20
Gracias!!
Título: Re:Empezando con ensamblador
Publicado por: Manu en Mayo 28, 2012, 16:21:20
Bueno, nueva "chorradilla" de la semana :)

Animacion (http://dl.dropbox.com/u/37131/c64/animacion28052012.zip) (PRG y fuentes)

Esta vez he ripeado los sprites del Pacmania de Grandslam (http://www.lemon64.com/?mainurl=http%3A//www.lemon64.com/games/details.php%3FID%3D1877) con el Spritepad, porque quería hacer una animación con Pac y los fantasmitas. Haciendo esto, he visto que con poquitos frames de animación, si cambiamos cada barrido de pantalla, la animación va extremadamente rápido. Para esto, he puesto un pequeño "delay" para hacer un cambio cada cinco barridos.

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. El siguiente paso será quitar los bordes laterales 8)

(https://lh4.googleusercontent.com/-BZuP8jxTJ3c/T8OIG2atPLI/AAAAAAAAIFQ/uShIWXEW3pM/s800/sprites.png)

La musiquilla la he sacado de HSVC (http://www.hvsc.c64.org/), y la ha hecho un tal Ádám Dávidovics. Esta vez, en vez de cargar el SID a lo bruto, he quitado la cabecera de 126 bytes con la utilidad dd de Linux.

También os habréis dado cuenta de que ya no es necesario hacer un SYS en BASIC al cargar el PRG. He visto cómo almacena el intérprete de BASIC los listados, y he metido a pelo 10 SYS 2061. Luego el autocargador de VICE hace el resto ;)

Lo siguiente que quiero hacer es poner el logo de Commodore Mania arriba, hacer un scroller abajo con letras de colorines y un fondo animado detrás de los sprites.

La verdad es que esto de programar para el C64 engancha ;D
Título: Re:Empezando con ensamblador
Publicado por: josepzin en Mayo 28, 2012, 18:00:21
Joder... que rápido vas!! :D
Título: Re:Empezando con ensamblador
Publicado por: josepzin en Junio 02, 2012, 11:11:18
Manu, a tu experimiento con el Pacman, si le agregas el logotipo (bueno, lo que tenemos ahora) de CManía podríamos hacer una pequña intro promocional de la web/foro, para publicar en CSDb!

Si quieres puedo intentar hacer las letras de CommodoreManía en gráficos de C64
Título: Re:Empezando con ensamblador
Publicado por: Manu en Junio 02, 2012, 21:52:02
Ahora estaba experimentando con tiles, y había hecho esto:

PRG (http://dl.dropbox.com/u/37131/c64/intro20120602.prg)

Todavía me queda bastante por aprender de gráficos para hacer algo decente :P
Título: Re:Empezando con ensamblador
Publicado por: josepzin en Junio 03, 2012, 09:10:28
¿Cuando dices "tiles" te refieres a "chars"?

Tu sigue asi, que a eso le agregamos un texto que explique quienes somos y ya lo podemos usar para hacernos conocer!

¿Que letra usaste para el texto de COMMODORE MANIA?
Título: Re:Empezando con ensamblador
Publicado por: Manu en Junio 03, 2012, 20:13:26
Cuando digo tiles me refiero a grupos de chars. Esas letras son de 2x2 si no recuerdo mal, y vienen en el charpad :D
Título: Re:Empezando con ensamblador
Publicado por: Zonacas en Junio 03, 2012, 22:02:09
Mira, este tutorial me ha venido bien para empezar y conocer algunas cosas básicas:

http://digitalerr0r.wordpress.com/category/commodore-64/ (http://digitalerr0r.wordpress.com/category/commodore-64/)

He empezado el tutorial 
http://digitalerr0r.wordpress.com/2011/03/19/commodore-64-programming-a-quick-start-guide-to-c-64-assembly-programming-on-windows/ (http://digitalerr0r.wordpress.com/2011/03/19/commodore-64-programming-a-quick-start-guide-to-c-64-assembly-programming-on-windows/)

pero cuando trato de compilar el archivo asm con el dasm 

dasm test.asm –otest.prg

me dice...

test.asm (1): error: Unknown Mnemonic '6502'.
test.asm (4): error: Unknown Mnemonic 'inc'.
test.asm (5): error: Unknown Mnemonic 'jmp'.

por que? :(
Título: Re:Empezando con ensamblador
Publicado por: Manu en Junio 04, 2012, 08:15:36
Es importante que respetes la tabulación con el dasm (con espacios preferiblemente).

Por ejemplo, es:

Código: [Seleccionar]
  processor 6502
  org $810

no:

Código: [Seleccionar]
processor 6502
org $810
Título: Re:Empezando con ensamblador
Publicado por: josepzin en Junio 04, 2012, 08:32:06
¿El dasm hace lo mismo que Python con la tabulacion??
Título: Re:Empezando con ensamblador
Publicado por: Manu en Junio 04, 2012, 10:22:13
Algo similar sí, aunque no es tan exigente :)
Título: Re:Empezando con ensamblador
Publicado por: Zonacas en Junio 06, 2012, 13:49:40
He copiado el texto tal cual esta en el tutorial...

    processor   6502
    org    $1000

loop:    inc $d021
             jmp loop

y ahora compila perfecto, no da error

pero cuando pongo sys 4096 en el emulador...

no hace nada :o
Título: Re:Empezando con ensamblador
Publicado por: Manu en Junio 07, 2012, 09:09:11
¿Y has cargado el emulador con x64 PROGRAMA.prg? Es raro, a mí me salen las rayitas :P
Título: Re:Empezando con ensamblador
Publicado por: Zonacas en Junio 07, 2012, 10:34:54
vale, después de hacer muchas pruebas ya lo he conseguido :D

ponía esto copiado del tutorial, ahí tiene como varios espacios..

Código: [Seleccionar]
     processor   6502
    org    $1000

loop:    inc $d021
             jmp loop

Compilaba.. pero no funcionaba el SYS 4096

pero poniendo sólo un espacio para en las instrucciones , para el loop no, si que funciona

Código: [Seleccionar]
processor 6502
 org $1000
loop: inc $d021
 jmp loop

Gracias, Si, era un tema de tabulación.
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 12, 2012, 21:32:10
Buenas, esta semana que estoy de vacaciones estoy dandole Al Hierro un poco, la verdad es que este Mini Curso que habeis enlazado esta muy bien, es sencillo y directo, en este sentido me ha interesado muchisimo el tema de cargar una Bitmap (Capitulo 7),.aqui os dejo el enlace especifico...

http://digitalerr0r.wordpress.com/2011/04/30/commodore-64-programming-7-creating-and-rendering-bitmaps/ (http://digitalerr0r.wordpress.com/2011/04/30/commodore-64-programming-7-creating-and-rendering-bitmaps/)

Incluso he aparcado el Gang-Ed y estoy utilizando el Editor Grafico que recomienda y ya he creado una Bitmap que quiero cargar,...es importante recordar que yo utilizo el 64TASS como Compilador Cruzado...

No se que leches pasa que no soy capaz de arrancar una bitmap, de hecho al compilar el Listado con el 64Tass me alude a "Palabras que no entiende", imagino que seran comandos que no son compatibles con el 64 Tass como por ejemplo el inicio del alojamiento de graficos que si en el curso lo hace como:

ORG    $1FFE   ; para el inicio de bitmap
ORG    $1000   ;inicio de programa

en el 64 Tass esto se haria así:

*=$1FFE
*=$1000

  Pero cambiando esto en el listado me lo compila pero me da luego error en el programa en el emulador...en el listado del curso la carga del archivo de bitmap la llama con:

INCBIN “DCC.PRG”

 A mi esta orden el 64Tass no me la entiende, cambio la que yo utilizo en dicho compilador que es .binary con el nombre de la bitmap que he creado yo con el editor que recomienda quedando de esta forma, pero aun compilado me da error en el programa en el emulador

.BINARY   BITMAP.PRG

Aqui el listado original (que viene en el capitulo 7 que enlazo al principio) y que no consigo compilar con el 64 tass, a ver si alguien me pued decir que tengo que cambiar o me pasa algun listado sencillo de carga de Bitmap que me valga para el 64tass,.

 PROCESSOR 6502
      ORG $1000
              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
 LOOP:   JMP LOOP
      ORG $1FFE
 INCBIN "DCC.PRG"

  Hoy llevo todo el dia a puñetazos con esto, cualquier ayuda la agradezco, Muchas Gracias!!! en este correo adjunto la bitmap que quiero cargar y que he creado con el editor que recomienda en el curso.
              

Título: Re:Empezando con ensamblador
Publicado por: Carlos en Junio 13, 2012, 07:38:40
Puedes pegar el error que te da? no tengo instalado el 64TASS para poder probar el listado.

De todas formas el error podría estar a la hora de incluir el bitmap, deberías hacer algo así:

Código: [Seleccionar]
*=$1FFE
.binary "bitmap.prg",2

para ignorar los dos primeros bytes de cabecera.

Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 13, 2012, 08:57:41
Si yo compilo el listado tal y como lo ponen en el curso, (que es el listado que adjunte en el post anterior), el 64Tass me da cuatro errores

Assembling file:   original.asm
original.asm:1: General syntax "PROCESSOR 6502"
original.asm:17592186044418: General syntax "ORG $1000"
original.asm:17592186044451: Double defined org "ORG $1FFE"
original.asm:17592186044452: General syntax "INCBIN "BITMAP.PRG""

Que son las instrucciones a las que aludia enteriormente,...modifico el listado para que el 64Tass me lo entiendo, es decir hago esto:

- Lo de PROCESSOR 6502 lo borro
- Cambio ORG $1000 por *=$1000
- Cambio ORG $1FFE por *=$1FFE
- Cambio INCBIN "BITMAP.PRG" por .BINARY "BITMAP.PRG" o por .BINARY "BITMAP.PRG",2

 Hecho esto el 64Tass entonces si me lo compila con exito, pero cuando arranco en el emulador si bien no me da ya error como antes, se me queda que no hace nada, aun tecleando RUN, LIST o lo que sea

  Aqui dejo una foto en la que se ve el NotePad con el Listado y las modificaciones, tambien se ve el Simbolo del Sistema con el Programa recien compilado y luego se ve en el emulador funcionando, pero no hace nada (pulsando sobre la foto con boton izquierdo se amplia un poco)..

(http://a6.sphotos.ak.fbcdn.net/hphotos-ak-ash3/577496_245034645612879_683109598_n.jpg)
  SALUDOS.
Título: Re:Empezando con ensamblador
Publicado por: Laddh en Junio 13, 2012, 09:37:39
Has probado a arrancarlo con SYS 4096 desde el emulador?
Título: Re:Empezando con ensamblador
Publicado por: Carlos en Junio 13, 2012, 11:03:05
Has probado a arrancarlo con SYS 4096 desde el emulador?

Como dice Laddh, estas colocando el código del programa en la dirección $1000 por lo que para ejecutarlo desde BASIC deberías poner SYS 4096 (que es $1000 en decimal).
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 13, 2012, 13:42:18
SOLUCIONADO!!!,lo habia hecho bien..simplemente era eso, el programa no se autoarrancaba!!, tecleando SYS 4096, el programa arranca!!,...solo me queda una ultima pregunta,..¿que agrego al programa para que se arranque solo al cargarlo y no tenga que teclear el sys 4096...

Os copio pego la cabecera de otro programa que tengo que arranca solo, quizas agregandole alguna linea de él, consigo que la bitmap se vea automatica sin llamarla con SYS!!!

   *=$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
   *=$2000         ; INICIO GRAFICOS
;    CARGA GRAFICOS
   .BINARY   SPRITES.BIN   ; BANCO DE SPRITES
   .BINARY   CHARS.RAW   ; BANCO DE CARACTERES

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

;    START
   START   SEI      ; DESHABILITAR INTERRUPCIONES

  Me contais y muchas gracias, a ver si hoy puedo ingresar la rutina de carga de bitmap en otro programa y puedo enseñaros ya algo de mis humildes avances en ensamblador...

  Una ultima cosa Carlos en relacion a la resta de los dos primeros bytes, si te fijas la posicion de carga de graficos esta en $2000 y desde el programa original se la llama en

ORG $1FFE (*=$1FFE en el 64Tass)

Esto es asi porque esos dos bytes ya van restados...

$2000-$02=$1FFE   no me hizo falta teclearlo así:    .BINARY "BITMAP.PRG",2

Bueno, lo dicho, a ver si os puedo mostrar algo hoy y a ver si sabe alguien que incluyo en el listado para que arranque automatico sin necesidad de teclear el SYS, tambien me estoy dando cuenta de una ultima cosa,..cuando meta esa rutina de carga de bitmap en otro programa tendre que eliminar la linea

LOOP:   JMP LOOP

  Para que una vez mostrada el programa no se me quede "colgado" y continue su curso animando sprites y todo el tinglado que contenga.

  AL HIERRO!!!
Título: Re:Empezando con ensamblador
Publicado por: josepzin en Junio 13, 2012, 14:43:40
¡Que ganas de ponerme a hacer algo de todo esto!!

Me alegro verte de nuevo por aquí, Raúl.

Un consejo, si al código lo marcas como "código" se ve mucho mejor (es el ícono #)
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 13, 2012, 15:59:40
Ya que estoy aquí os dejo otra pregunta con permiso de la moderacion,..resulta que al insertar la rutina de carga de bitmap en un programa me he dado cuenta que la bitmap se comienza a hubicar en la posicion $2000 (8192) que es la misma donde yo ponia los Sprites (que solo son 4)
Lo que quiere decir que tengo que mover los sprites,..el programa por otro lado se inicia en la posicion $801 (2049, que creo que esta bien),..el caso es que no se donde poner los Sprites ahora, tendria dos opciones:
- comerme cuatro bloques del bufer de cassette (lo que son 4 sprites) desde la posicion $400 (1024) hacia atras,..utilizando como punteros de sprites los bloques: 16,15,14,13
- llevarlos al Banco 1, pero no se como direccionar los punteros en este banco o si necesita alguna rutina adicional
- o buscarles algun sitio en el Banco 0 donde entre todo, el programa, la bitmap y los sprites

  Bueno me contais, adjunto foto orientativa...

(http://a3.sphotos.ak.fbcdn.net/hphotos-ak-snc7/599816_245334598916217_1999856334_n.jpg)

AL HIERRO!!!
Título: Re:Empezando con ensamblador
Publicado por: Manu en Junio 14, 2012, 08:51:55
A ver, varias cosas :)

Para que se auto arranque, tienes que hacer algo así (te pongo la sintaxis dasm):

Código: [Seleccionar]
  .org $800
   
; make a SYS call in BASIC to start the intro (10 SYS2061)
  .byte $0
  .word $080b ; pointer to the next instruction
  .word $0a ; 10
  .byte $9e ; SYS
  .byte $34 ; 4
  .byte $30 ; 0
  .byte $39 ; 9
  .byte $36 ; 6
  .byte 0
  .byte 0,0 ; end ($080b)

Esto hace que se añada un listado de basic que luego se autoejecuta en emuladores como Vice al cargar el PRG.

Los sprites o los colocas después de la imagen (y luego los referencias los punteros adecuados), o en otro banco (pero es más movida). Tendrás que tocar el registro en $d018 adecuadamente.

En cuanto al jmp loop, si lo haces todo por interrupciones de raster no hay que quitarlo.
Título: Re:Empezando con ensamblador
Publicado por: Carlos en Junio 14, 2012, 09:23:57
A ver, el tema de la ubicación de los sprites....

El chip gráfico (VIC-II) del C64 solo es capaz de 'ver' 16k de la memoria total de 64k que tiene la máquina, lo bueno es que le puedes decir que 16k quieres que vea. Cada uno de estos bloques de 16k se denomina banco y logicamente hay 4 diferentes (16k x 4 = 64k). Si no me equivoco el banco por defecto es el 0 (los primeros 16k de la máquina).

Citar
bank0: $0000-$3fff   (defecto)
bank1: $4000-$7fff
bank2: $8000-$bfff
bank3: $c000-$ffff

Todo lo que vayas a mostrar por pantalla sea un bitmap, chars o sprites tiene que estar en el mismo banco, no puedes tener el bitmap en un banco y los sprites en otro por ejemplo. El banco que vayas a usar es una de las decisiones de diseño de tu programa, lo normal es usar el bank 1 o el 3 para no interferir con el juego de caracteres de la ROM.

Sí puedes tener bitmap, sprites o caracteres en el rango de memoria de otro banco pero sólo a modo de almacenamiento, en el momento en que desees mostrarlos por pantalla los tienes que llevar al banco que tengas como activo.

Para que no se te solape el bitmap con los sprites pues haz lo que comenta Manu, pon los sprites antes o después del bitmap (pero sin salirte del banco recuerda).

Para cambiar de banco es muy sencillo, sólo tienes que jugar con el registro $dd00 que es el que lo controla.

Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL 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

(http://a3.sphotos.ak.fbcdn.net/hphotos-ak-snc7/599816_245334598916217_1999856334_n.jpg)
Título: Re:Empezando con ensamblador
Publicado por: Carlos 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 (http://sta.c64.org/cbm64mem.html)
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL 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
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL 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.
Título: Re:Empezando con ensamblador
Publicado por: josepzin 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 (http://pastebin.com/n8cUTX9L)

Esta http://pastebin.com (http://pastebin.com) o esta http://dpaste.com (http://dpaste.com)
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL 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
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL 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.
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL 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.
Título: Re:Empezando con ensamblador
Publicado por: Bieno en Junio 15, 2012, 11:03:22
Te ha quedado muyyyyyyyyy chulo. Un buen comienzo para un matamarcianos.
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL 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!!!
Título: Re:Empezando con ensamblador
Publicado por: lobogris 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.
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL 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!!!
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL 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!!!
Título: Re:Empezando con ensamblador
Publicado por: Manu 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
Título: Re:Empezando con ensamblador
Publicado por: lobogris 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!
Título: Re:Empezando con ensamblador
Publicado por: lobogris en Junio 16, 2012, 15:38:10
Ah! otro consejo, intenta encontrar posiciones de la pág. 0 (direcciones desde 0-255, pero excluye 0 y 1) para las variables que intervengan en la impresión de sprites que te conté. Asi todo quedará más compacto y irá más rápido. Ten en cuenta que si tu juego no va a emplear el basic tienes una gran selección de bytes libres de esa página!! y son como tener registros adicionales del 6510

La velocidad de ejecución y lo que ocupan en memoria toda instrucción con direccionamiento de pag 0 es más rápida y ocupa bastante menos espacio que con los demás direccionamientos.
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 18, 2012, 23:44:56
ERES UNA MAQUINA!!!,..esta semana vuelvo al curro de vacas y estare mas ocupado, en el proximo Claustro le dare mas caña y volvere con mas preguntas y avances, que no esta mal hablar por aqui estos temas, ya que quedan guardados y a la gente que comience le puede venir bien como consulta...Hablamos.

  AL HIERRO!!
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 20, 2012, 11:34:09
Buenasl, hoy que libro me he levantado a puñetazos otra vez con esto,...esta vez lo que quiero es mostrar una pantalla de presentacion en la Churufleta antes de pasar al juego, he hecho la siguiente prueba y funciona:

- Muestro la pantalla como hacia y una vez mostrada introduzco este pequeño listado que dejo Nathan hace tiempo en otro hilo con el cual el ordenador se queda esperando a que el jugador pulse espacio y luego continua su curso

   ESPACIO   
   LDA $DC01
   CMP #$EF
   BNE ESPACIO

   Para luego mostrar un sprite,...hasta aqui todo va bien, primero me muestra la bitmap y luego tras pulsar espacio me muestra un sprite.

   El problema viene cuando lo que quiero hacer es que me muestre una bitmap y al pulsar espacio me muestre OTRA BITMAP, pero no se porque leches cuando hago esto el programa no se queda esperando que se pulse espacio, sino que ignora la rutinilla y carga la siguiente DEL TIRON!!!

   Las bitmaps las cargo en la misma posicion las dos, primero una y luego otra, pero como os cuento no se queda esperando que pulse espacio,...si en vez de dos bitmpas lo hago primero una bitmap y luego un sprite si funciona, pero si lo hago con dos bitmaps ignora la rutina de espera.
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 20, 2012, 11:57:03
Aqui comienza el programa y carga la primera bitmap (en ; LOAD BITMAP) , pero en ;ESPACIO no se queda esperando que el jugador pulse la tecla espacio:

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

FRAMES .BYTE 0 ; VIDEO FRAMES COUNTER

; LOAD SPRITES
*=$0EC0 ; 3776 POSITION
.BINARY SPRITES.BIN

; START
START SEI ; OFF INTERRUPTS

; UNKONW
LDA $D018
AND #$F1
ORA #$0A
STA $D018

; CLEAR SCREEN
LDA #$20
LDX #$00
CLS STA $0400,X
STA $0500,X
STA $0600,X
STA $0700,X
DEX
BNE CLS

; LOAD 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 PARAMETROS
*=$1FFE ; 8190 POSITION
.BINARY "PRESENTACION.PRG"

PARAMETROS

; SCREEN COLOR
    LDA #$08        ; ORANGE
STA $0286 ; 646 CURSOR POSITION
LDA #$00 ; BLACK
STA $D020 ; SCREEN BORDER
LDA #$00 ; BLACK
STA $D021 ; SCREEN

ESPACIO
LDA $DC01
CMP #$EF
BNE ESPACIO

  Sino que tira como un cohete y carga la segunda (En ; BITMAP 2), sin embargo con la segunda si se queda esperando a que se pulse espacio en ;ESPA aqui lo veis:

Código: [Seleccionar]
; BITMAP 2
LDA $4710
STA $D020
STA $D021
LDX #$00
LOADIMAGE
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 LOADIMAGE

LDA #$3B
STA $D011
LDA #$18
STA $D016
LDA #$18
STA $D018
 CONTINUA
JMP CONT
*=$1FFE ; 8190 POSITION
.BINARY "BITMAP.PRG"

CONT

ESPA
LDA $DC01
CMP #$EF
BNE ESPA

y una vez que es pulsado espacio el programa continua su curso y es mostrado el sprite:

Código: [Seleccionar]
; SCREEN COLOR
    LDA #$08        ; ORANGE
STA $0286 ; 646 CURSOR POSITION
LDA #$00 ; BLACK
STA $D020 ; SCREEN BORDER
LDA #$00 ; BLACK
STA $D021 ; SCREEN



; SPRITE POINTERS
LDA #$3B ; BLOCK 59 RIGHT
STA $07F8 ; SPRITE 0 POINTER 2040
; SPRITE COLOR
LDA #$01 ; WHITE
STA SP0COL ; SPRITE 0 NAVE
; SPRITE MULTICOLOR 1 Y 2
LDA #$0B ; 11 DARK GRAY
STA SPMC0 ; MCOLOR 1
LDA #$06 ; BLUE
STA SPMC1 ; MCOLOR 2

; ASIGNAR POSICION INICIAL SPRITES
LDA #0
STA MSIGX
LDA #70
STA SP0X ; X SPRITE 0
LDA #110
STA SP0Y ; Y SPRITE 0

; ON MULTICOLOR SPRITES
LDA #$FF
STA SPMC

; OFF KEYS
LDA 224
STA CIDDRA

;   ***************
; *  MAINLOOP   *
;   ***************

UPDATE

; ON SPRITES
LDA #$0F ; ON 0 1 2 3
STA SPENA ; SPRITE ENABLE

MAINLOOP

; WAIT ELECTRONS´ACE
LDA RASTER
CMP #$FF
BNE MAINLOOP

FIN
JMP FIN

 Ya os digo que el problema viene al cargar dos bitmaps y marcar la condicion de pulsar espacio para mostrar la segunda y luego el sprite, cosa que no hace, sin embargo con una sola bitmap si lo hace, de hecho entre el intervalo de mostrar la segunda bitmap y el sprite si funcion, pero en el intervalo de la primera y segunda bitmap no se queda esperando.
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 20, 2012, 12:08:22
O si alguien me lo puede explicar adjuntando alguna rutinita que tengo se lo agradezco, la historia es esta por orden de actuacion

1º - Mostrar una Bimap (presentacion)
2º - Solicitar al jugador que pulse espacio o cualquier tecla (dependiendo de la rutina)
3º - El programa sigue su curso
3º - Mostrar otra Bitmap (bitmap) que cargo en la misma posicion donde estaba la anterior y comienza el juego.
Título: Re:Empezando con ensamblador
Publicado por: lobogris en Junio 20, 2012, 18:57:33
Creo, asi de pronto, que es que el buffer de teclado contiene varias pulsaciones de la tecla espacio (recuerda que en CM todo va rapidisimo). Deberias vaciar el buffer o poner a cero la variable que registra tecla pulsada (no me he fijado en tu código todavia exactamente). Pero esa podria ser la causa, y esta mi pista ;)

Para borrar el buffer de teclas, sólo tenemos que poner a 0 la posición de memoria $c6.

Haz una prueba simple, en lugar de esperar una pulsación de tecla, pon un buen retardo entre bitmap y bitmap... o usa CHARIN del SO, para esperar una tecla, en lugar de la rutina de Nathan...

te paso mi rutina que usé en RN, para pasar entre bitmaps:

Antes una anotación al respecto: en el inicio de la demo configuro todas las teclas como no autorepetibles, asi:
Código: [Seleccionar]
lda #$7f
sta $28a // las teclas no repiten

De esta manera al pulsar un espacio no se llena el buffer de espacios con una pequeña pulsación, y sólo entra 1 pulsación por toque de tecla.

En la rutina, se comprueba si se pulsa espacio o el disparo del joy en port 2. Se desconecta el teclado para que no interfiera en la lectura del joystick ya que ambos teclado y joystick estan integrados en el mismo CIA.

Código: [Seleccionar]
.const GETIN       = $ffe4    // GET IN para entrada de char en a

.macro desconecta_teclado() {
lda #$f4
sta $dc02
}

.macro conecta_teclado() {
lda #$ff
sta $dc02
}
espera_pulsador:
!:
:conecta_teclado()

lda $dc00
cmp #$6f // disparador joy port 2?
beq !end+
jsr GETIN
cmp #$20 // tecla espacio?
beq !end+
cmp #$0d
beq !end+
cmp #$d2 // Shift + R Restart demo
bne !-
jmp back2menu

!end: lda #$00
sta $c6 // ignora buffer de teclado
:desconecta_teclado()
                rts
Título: Re:Empezando con ensamblador
Publicado por: lobogris en Junio 20, 2012, 19:50:08
Leyendote más detenidamente no estoy seguro que lo que dije en el post anterior sea la causa. Aunque puede servirte, eso seguro.

Y es que a simple vista, veo un fallo muy gordo.  Incluyes los datos de los bitmap ambos, en $1fffe...

Independientemente de si esta es la causa de que "no espere espacio", no puedes poner los datos de los dos bitmaps ubicados en el mismo sitio, el segundo pisará al primero. ¡Esa puede ser la causa que no veas el primero!... Lo raro es que el compilador no te haya dado un warning o un error informándote que usas porciones de memoria iguales...

Mira a ver esto.

Edito: Simplemente pon la otra bitmap justo debajo de la primera (nunca en la MISMA posición), o carga las bitmaps de disco, antes y despues de pulsar espacio, para que siempre se carguen en $1ffe. Si haces esto, hazte una rutina que cargue el bitmap pasandole los parametros de nombre de fichero y que lo muestre tras cargarlo en memoria, para evitar bytes adicionales engordando el programa.

Mirate en codebase wiki como se carga un fichero de disco:
http://codebase64.org/doku.php?id=base:loading_a_file (http://codebase64.org/doku.php?id=base:loading_a_file)
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 21, 2012, 18:56:29
interesante todo lo que dices dos puntos:

 - Curioso lo de que una pulsacion lleve varios impulsos, me acuerdo que eso me pasaba en basic y de ahi que sustutuyera algunos get por input porque se pulsaban solos al pasar de una pagina a otra.
   No se hasta que punto las varias pulsaciones que almacena sea el problema, ya que yo no toco el teclado para nada, simplemente arranco con autostar en el vice, asi todo es curioso que si paso de una bitmap a mostrar un sprite el ordenador si se queda esperando que se pulse una tecla,...pero si lo hago de que muestre una bitmap y luego otra, el programa ignora la espera de pulsacion de espacio y tira como un cohete (cosa que no entiendo)
 
- alomejor influye el tema de cargar las dos bitmaps en el mismo sitio, pero utilizo la misma posicion porque una vez mostrada la pantalla de presentacion y no la vuelvo a utilizar y uso ese espacio para mostrar otra, asi todo sigo sin entender porque no para en la rutina de espera de pulsacion de espacio, no tenia porque influir la carga de la segunda, ya que dicha rutina esta antes de que comience la rutina de carga de la segunda..

  Voy a probar algunas cosas de las que me has dicho y te cuento.

 No termino de entender porque no se puede utilizar un mismo espacio para cargar y mostrar dos bitmaps en diferente momento en el tiempo, me cuentas.

   Saludos!!!
Título: Re:Empezando con ensamblador
Publicado por: lobogris en Junio 21, 2012, 19:16:50
No se puede utilizar un mismo espacio para cargar y mostrar dos bitmaps dentro del código, por que el compilador al crear el PRG pone las cosas en su sitio. Y un sitio solo es UN sitio :D

Ten en cuenta que un compilador interpreta cada linea del codigo y la va poniendo por orden en el fichero PRG que luego se cargara del tiron en la memoria en ese orden secuencial.

Si no le dices nada ira poniendo cada linea compilada a partir de la cuenta que lleve del Puntero contador de programa (PC). Con una directiva del ensamblador puedes decirle al compilador que en ese punto olvide la cuenta del PC que lleva (internamente) y decirle una nueva, lo que hará será poner ceros (o un byte predefinido) a partir del PC actual hasta el que tu le has dado y esa será su nueva cuenta de PC.
Es secuencial. Si le dices que ponga el PC en una dirección que ya habia compilado cosas, las pisará, o dará una advertencia/error de solapamiento de bloques, según que compilador uses...

Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 21, 2012, 19:18:22
Adjunto la foto del mapa de memoria de la churufleta actualizado:

(http://a3.sphotos.ak.fbcdn.net/hphotos-ak-prn1/532689_249675418482135_912856237_n.jpg)

no puedes poner los datos de los dos bitmaps ubicados en el mismo sitio, el segundo pisará al primero. ¡Esa puede ser la causa que no veas el primero!...

  Lo curioso es que entre ambas esta la rutina de espera de pulsacion de espacio la cual ignora (no lo entiendo)

Simplemente pon la otra bitmap justo debajo de la primera (nunca en la MISMA posición),

  Comnooorrr?,..donde es "debajo", porque fijate que ya me voy quedando con el sitio justo, de hecho metere la musica en el bufer de cassette, y en esa zona amplia donde cargo la bitmap $1FFE imagino que solo me entra una.

   Como siempre Gracias...Que pesado soy con mis preguntitas!!!

Aviso: Hemos contestado los dos a la vez,..que rapidez!!!
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 21, 2012, 19:22:19
va a ser lo que dices en el ultimo correo, al ser compilado se guardan solo los datos de la ultima bitmap en dicha posicion y se solapa,..es verdad!!!,..tiene logica, luego estudiare tus correos atentamente,..voy a la ducha y a cenar que acabo de llegar de currar!!
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 21, 2012, 19:24:51
otra peguntita...una de las dos bitmaps podria ser almacenada en el Banco 1 para ser llamada y utilizada sin problemas cuando quieres en el Banco 0?

Hoy en el curro he estado todo el dia dandole vueltas a esto (cada vez me mola mas) y tambien a Retrospectiva.

  HABLAMOS!!!
Título: Re:Empezando con ensamblador
Publicado por: lobogris en Junio 21, 2012, 19:26:17
Si vas a poner más cosas, como música y tal te quedarás sin espacio.

Es que incrustar 2 bitmaps, son 16K, algo excesivo, sin compresión almenos... Te recomiendo que los bitmaps los pongas en el disco y desde ahi los cargues.

Por supuesto, deja el "segmento" donde se ubicarán los bitmaps al cargarse, en tu listado fuente reservando los bytes que ocupe un bitmap (lo que ocupa el fichero, exceptuando la cabecera de 2 bytes de dirección)
yo en kickass lo hago asi:
Código: [Seleccionar]
// espacio para carga de bitmaps
BITMAP_BUFFER:

.fill 10000, 0


Tambien te recomiendo que uses etiquetas/constantes intensivamente en tus rutinas. Por que si tienes que cambiar algo no tienes que modificar una constante que aparece en 20 sitios, no tienes que modificar 20 lineas solo 1, la de la definición de la constante.

Por ejemplo cuando visualizas el bitmap, en lugar de usar $1ffe usa una constante como BITMAPSTART (que tenga asignado ese valor). Incluso como todas las posiciones están relacionadas con el comienzo del bitmap, luego puedes usar expresiones matemáticas como por ejemplo, BITMAPSTART+256 y cosas asi... Es un consejo que te doy, y creéme que es muy útil ;)
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 21, 2012, 19:32:41
CONCLUSION: como tu dices es imposible meter dos bitmaps en ese espacio, osea QUE PASO de momento del tema de dos bitmaps en la churufleta, total, todavia tengo cosas para mejorar, voy a probar otras, quiero hacer lo de superar la barrera de los 255 y ponerle musica.

- 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 MUSICA

   AL HIERRO!!!
Título: Re:Empezando con ensamblador
Publicado por: lobogris en Junio 21, 2012, 19:38:45
otra peguntita...una de las dos bitmaps podria ser almacenada en el Banco 1 para ser llamada y utilizada sin problemas cuando quieres en el Banco 0?
Tu puedes poner los bitmaps donde quieras (y que tengas sitio) en la memoria, lo de cambiar de banco es a la hora de visualizarlos. Si tienes el bitmap almacenado en el banco 1 para verlo, tienes que configurar el vic para que "vea" en el banco 1 y si está en el 0, pues lo mismo pero en ese banco. Ahora bien, la screen ram y la color ram deben estar bien configuradas en el VIC tambien para "apuntar" al sitio correcto.
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 21, 2012, 19:44:34
Es que ahora que lo pienso, mi programa funcionaba PERFECTO!!!,...que ocurria?

  Que al compilar dos bitmaps en la misma posicion, solo se quedaron los datos de la ultima (la segunda), es decir me mostraba los mismos graficos en las dos, el programa funcionaba bien solo que me estaba mostrando dos bitmaps iguales y por eso no notaba el cambio.

  Algo mas que he aprendido.
Título: Re:Empezando con ensamblador
Publicado por: lobogris en Junio 21, 2012, 19:45:21
eso es :D
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 27, 2012, 10:20:14
Una nueva preguntita, esta vez sencilla:

  Muestro una Bitmap de Presentacion, al ser pulsado Espacio el programa sigue su curso, es decir la Bitmap es borrada de la Pantalla pero no desaparece completamente, quedan Pixeles perdidos, imagino que es porque no desactivo antes el modo Bitmap y vuelvo al modo texto.

 ¿Alguien me puede decir como desactivo el Modo Bitmap y activo el Modo texto?

 En esta foto podeis ver como la P. De Presentacion no se borra totalmente:

(http://a4.sphotos.ak.fbcdn.net/hphotos-ak-ash3/553758_252865711496439_542941255_n.jpg)

   Como siempre Mil Gracias
Título: Re:Empezando con ensamblador
Publicado por: josepzin en Junio 27, 2012, 11:24:00
Para poner el modo texto usando C (ese lenguaje que tanto te gusta jaja):

Código: [Seleccionar]
poke(0xD011, peek(0xD011) & 0xDF);
De todos modos la lógica creo que se entiende bien asi lo pasas a ensamblador: leer 0xD011, con el valor leído hacer AND con 0xDF y volver a ponerlo en 0xD011

Lo otro que puedes hacer es rellenar toda la memoria de la pantalla de video con 00.
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 27, 2012, 14:30:58
Gracias Jose, lo unico que no me termino de enterar bien con la explicacion que me adjuntas, a ver si alguien me pude dar luz sobre el tema en un lenguaje mas de Ensamblador.

Ya que estoy aqui, otra preguntita:

 Mostrada la Bitmap al jugador se le pide que pulse ESPACIO y se queda a la espera con esta rutina:

Código: [Seleccionar]
;WAIT SPACE
SPACE
LDA $DC01
CMP #$EF
BNE SPACE

Pero me encuentro que el ESPACIO interfiere con el Disparo, es decir, cuando comienza el juego,..comienza disparando, ocurre lo que decia Lobo de que el ordenador guarda varias pulsaciones, a pesar de que adjunto esta otra rutina que hace que el ordenador solo cuente UNA pulsacion,..el fallo persiste:

Código: [Seleccionar]
; NOT REPEAT KEY
LDA #$7F
STA $28A

Y aqui mi pregunta,...quiero cambiar la pulsacion de la tecla, es decir que en vez de ESPACIO se pulse por ejemplo: RETURN (ENTER), o CUALQUIER TECLA o simplemente la "S",...alguien me podria pasar alguna rutinilla enla que el ordenador se quede esperando que el jugador pulse RETURN (como primera opcion) o alguna de las otras opciones que he dicho?

    SALUDOS!!!
Título: Re:Empezando con ensamblador
Publicado por: josepzin en Junio 27, 2012, 14:42:04
Gracias Jose, lo unico que no me termino de enterar bien con la explicacion que me adjuntas, a ver si alguien me pude dar luz sobre el tema en un lenguaje mas de Ensamblador.

Yo creo que sería asi, pero tampoco lo podría asegurar!

Código: [Seleccionar]
LDA $D011
AND #$DF
STA $D011
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 27, 2012, 15:04:01
Ya,.... si eso segun lo has escrito tu lo entiendo perfectamente e incluso yo mismo te lo podria haber hecho,..lo que me refiero que no entiendo es que para activar el modo texto tengas que utilizar la Logica AND (solo ambos bits encendidos) para dicha accion ya que no se trata de "comparar" nada,..sino de "activar"

Consultando en el curso al que se enlaza veo esto,..aqui va una rutina de activacion de modo texto en la que no se utiliza AND para nada:

LDA #1B
STA $D011

  Voy a probarlo a ver si ya funciona bien...os cuento.
Título: Re:Empezando con ensamblador
Publicado por: josepzin en Junio 27, 2012, 16:04:00
En realidad habría que saber qué hacen los otros bits de $D011, ya que el AND se usa para modificar sólo el bit del modo texto y no a los demás.
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 27, 2012, 16:07:41
Comorrr??,..Gracias Jose.
Título: Re:Empezando con ensamblador
Publicado por: josepzin en Junio 27, 2012, 16:29:37
El tema es asi, $D011 se usa para varias cosas:
Citar
Bits #0-#2: Vertical raster scroll.
Bit #3: Screen height; 0 = 24 rows; 1 = 25 rows.
Bit #4: 0 = Screen off, complete screen is covered by border; 1 = Screen on, normal screen contents are visible.
Bit #5: 0 = Text mode; 1 = Bitmap mode.
Bit #6: 1 = Extended background mode on.
Bit #7: Read: Current raster line (bit #8). Write: Raster line to generate interrupt at (bit #8).
Valor por defecto de $D011: $1B, %00011011.

Para poner el modo texto solo tenemos que desactivar el bit#5 y el resto no tocarlos porque sino estarías haciendo alguna de las otras cosas que se controlan con los otros bits, por eso para hacerlo de forma segura hay que usar el AND asi:

Código: [Seleccionar]
LDA $D011
AND #%11011111
STA $D011

Para estas asignaciones el ensamblador es realmente bueno y claro! algún día me pondré a trastear, ¡promesa!
Título: Re:Empezando con ensamblador
Publicado por: lobogris en Junio 27, 2012, 18:55:12
Para poner el modo texto:

1º) desactivar el modo bitmap, desactivando el bit 5 en $d011
2º) ajustar las posiciones de la RAM de video si fueran distintas (usualmente lo son). La RAM de color es siempre fija en $d800. Por supuesto el banco del VIC debe cambiarse al que pertenezca la dirección de la nueva RAM de video.
3º) ajustar la dirección del generador de caracteres. Esto es, el lugar de memoria donde se alojan los patrones de pixels (bits) de cada caracter, en el modo de texto estándard, la memoria de video es un indice directo a  esta tabla del generador de caracteres.
4º) ajustar el banco en el VIC
5º) informar el SO (kernal) de la nueva dirección de la RAM de video (sólo si pretendes usar el editor de pantalla en BASIC correctamente, o rutinas relacionadas del kernal/basic)

Aquí te pongo mi código para cambiar al modo texto:

Código: [Seleccionar]
// --------------------------------------
// Modo texto estandard 40 x 25 
// --------------------------------------

modo_texto:
                    :set_vic_bank(VIC_BANK_TXT)
                    //configura ram video y memoria generador caracteres ($d018)
                    lda #[[txtmem & $3fff] / 64] | [[chmem & $3fff] / 1024]
                    sta $d018
                    lda #[txtmem/256]
                    sta $0288       // informamos al kernal de la nueva mem. pantalla
                    lda $d011       // valor estandar para modo texto (modo bmp off, etc)
                    and #%11011111  // modo bitmap (bit5) = 0
                    sta $d011

                    lda #$08
                    sta $d016       // valores estandar VIC modo texto

                    rts

txtmem, es la dirección donde comienza mi ram de video (del modo texto)
chmem, es la dirección donde comienza mi generador de caracteres (del modo texto)

La macro para cambiar de banco, ya la puse antes, y bueno seguro que ya sabes como hacerlo, a tu manera.

El bit 4 en $d016, controla el modo multicolor (on/off). Podria haberlo configurado con máscaras binarias, pero me resulta más práctico, en este caso, poner el valor estándar del modo texto en $d016. Este valor, simplemente se averigua haciendo un PEEK en basic, nada más encender el ordenador.

Espero que te sirva. ;)
Título: Re:Empezando con ensamblador
Publicado por: lobogris en Junio 27, 2012, 19:33:11
Para leer cualquier tecla, de forma sencilla, usa la rutina del SO llamada GETIN ($ffe4)
al llamarla, en el acumulador tienes el codigo ASCII (PETSCII hablando apropiadamente) de la tecla pulsada...
Si se pulsó una A, es 65, B es 66, etc. 

si pulsas RETURN, el código 13

Supongo que tendrás el manual del c64 a mano por ahi (hay una tabla con todos los códigos en los apéndices)
De todas maneras es más rapido saber el código desde el mismo basic:

PRINT ASC("A")
65

ahi te va un ejemplo de GETIN, en ensamblador donde se espera a que se pulse return:

Código: [Seleccionar]
                    lda #$00
                    sta $c6             // limpia buffer de teclado
espera_tecla:
                    jsr $ffe4
                    cmp #13
                    beq pulsaron_return
                    bne espera_tecla

pulsaron_return:
                    rts

es como usar el GET del basic...

Para CALIGULA, creo que pulsar S quedaria bien (cód. "S" = 83). 
Título: Re:Empezando con ensamblador
Publicado por: lobogris en Junio 28, 2012, 12:08:30
Bueno, y ya lo último de hoy...

Sorpresita (http://dl.dropbox.com/u/37131/c64/pac.zip)

Ejecutar el prg y luego hacer un SYS2064

La verdad esto esto es más fácil de lo que pensaba...

Que chulo Manu!

Hace un tiempo queria hacer una demo en c64 usando senos y cosenos, en ensamblador (por supuesto con tablas)

Algo asi hacia hace tiempo, pero se me ha olvidado...

Podrias ponerme como generaste la tabla de senos, o la "fórmula" ? Por que tiene tela pasar un valor de -1 a 1 a una coordenada de pantalla de 0...200 por ejemplo para la Y...

En código máquina los números decimales son una pesadilla para mi... y quiero ampliar mis conocimientos sobre ellos ¿Que consejos podrias darme acerca de usarlos? Tengo pendiente estudiar bien el tema de los FAC del SO, pero tambien y más importante saber como van realmente los números en coma flotante, esos que les sumas una constante y tal...

Te agradeceria si pudieras arrojarme algo más de luz en estos campos  (o quien lo sepa bien por aqui)

Salu2!
Título: Re:Empezando con ensamblador
Publicado por: Manu en Junio 28, 2012, 13:02:34
La respuesta es muy sencilla...

Sinus Creator (http://www.pouet.net/prod.php?which=14718)

Sólo me limité a copiar y pegar xD
Título: Re:Empezando con ensamblador
Publicado por: lobogris en Junio 28, 2012, 18:58:15
Gracias, yo hacia estas cosas con un programa en basic. Sinus Creator es lo que necesito.

Hace poco me acordé de un detalle sobre todo esto... para que el numero de -1 a 1 en la tabla oscilara habia que multiplicarlo por una constante de escalado y luego redondearlo con INT (en basic) a lo que se le añade, por supuesto coord. de centrado!!

¿de lo de coma flotante y tal, ni papa no?
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Junio 28, 2012, 23:08:27
Muchas Gracias a todos!!!,..ahora Jueves, Viernes y Sabado estoy "petado" de Curro, pero el Domingo me pongo a "digerir" toda la información.

   SALUDOS!!!
Título: Re:Empezando con ensamblador
Publicado por: Manu en Junio 29, 2012, 12:14:21
Lobo, lo de la coma flotante la verdad es que se me escapa un poco (de no usarlo), aunque me acuerdo que lo vi en la universidad y no era complicado :)
Título: Re:Empezando con ensamblador
Publicado por: lobogris en Junio 29, 2012, 12:25:39
Ok, Manu, yo algo sabia hace tiempo tambien, recuerdo que se guardaban como dos bytes por ejemplo 10 05 era 10,5 y que se multiplicaban por un factor... etc, pero me veo liado a la hora de aplicarlo seriamente, se que no era muy dificil ( pero tenia su telilla) y la verdad, no recuerdo casi nada !!

A ver si me leo algún documento por ahi y lo vuelvo a pillar...  de momento con tablas precalculadas ya me apañaré jeje
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Julio 06, 2012, 22:51:07
Jose, fue muy interesante la explicacion de las distintas funciones de los Bits en dicha posicion,..luego Lobo me lo explico por privado (en una autentica tarde de batalla, que no olvidare),..la rutina que muestra Lobo hace unos calculos que son necesarios para establecer los inicios de la Memoria de Video y la de Color en los distintos Bancos de Memorias segun se situen...Lobo me ha mandado unas Tablas que ya te dan los valores para hacer los calculos sencillos y darle al Yunque que son Bestiales!!!

El Caso es que si queremos fijar el principio en el Banco 0 y con los valores por defecto,..todo "digeridito" y "picadito" se le queda al Hierro en esto:

Código: [Seleccionar]
TEXT MODE

LDA #$14
STA $D018
LDA #$1B
STA $D011
LDA #$08
STA $D016
  Visto asi parece sencillo pero detras hay que hacer ciertos calculos...

    Gracias Lobo por todo, como siempre!!!, sigo diciendo que esas Tablas que me has mandado son MONUMENTALES y me van a venir divinas...y sobre todo por esas explicaciones desinteresadas en tiempo real durante mas de una y dos horas de Claustro!!!

  SALUDOS!!
Título: Re:Empezando con ensamblador
Publicado por: lobogris en Julio 07, 2012, 09:54:56
De nada, ¡ un placer ayudarte ! ;)

Esas tablas que te di son una ampliación que meticulosamente me puse a calcular hace tiempo, a partir de la tabla del banco 0, según aparece en la guia de referencia del programador de Commodore. Durante mucho tiempo me han resultado muy útiles, evitándome  tener que hacer sumas de banco y tal, hasta que hallé esa pequeña fórmula, aún más ahorradora de tiempo je je
Título: Re:Empezando con ensamblador
Publicado por: Zonacas en Julio 28, 2012, 10:20:15
Estaría bien que esas tablas aparecieran en el curso Tutorial sobre ensamblador :)
Título: Re:Empezando con ensamblador
Publicado por: R. INTERNATIONAL en Julio 30, 2012, 23:10:56
Te lo adjunto yo en esta Respuesta en un archivo, aquí las tienes, las tablas te dan los valores (A) de la Memoria de Pantalla y de Caracter segun el banco que utilices y dependiendo en que posicion de memoria lo situes (veras que dan saltos minimos para que entren los Sets), luego aplicando un OR a los dos resultados llegas al valor final que tendras que atribuir a $D018.

  Saludos!!!

(Tablas para calculos para distintas acciones tengo mas, te mando las referidas a lo que nos ocupaba que es volver al Modo Texto en los diferentes Bancos.)
Título: Re:Empezando con ensamblador
Publicado por: Zonacas en Agosto 01, 2012, 10:13:15
Gracias, muy interesante

para programar en ensamblador es imprescindible conocer todas estas cosillas de como se organiza la memoria
Título: Re:Empezando con ensamblador
Publicado por: lobogris en Agosto 01, 2012, 10:26:26
@Zonacas: Por supuesto, todo ese material, y todo lo que tenga, o pueda elaborar,  lo iré añadiendo de una forma u otra en el curso de ensamblador que estoy haciendo.
Título: Re:Empezando con ensamblador
Publicado por: Maniako en Agosto 06, 2015, 08:59:36
Está claro que hay que leerse todos los hilos del foro.
Sinus creator es practiquisismo!!!.

Que ganas tengo de empezar mis 2 semanitas de vacaciones para poder poner en práctica lo que voy viendo por aquí.
Título: Re:Empezando con ensamblador
Publicado por: josepzin en Agosto 06, 2015, 12:31:08
Una pena que a Lobogris se lo haya tragado la estepa :-(
Título: Re:Empezando con ensamblador
Publicado por: Maniako en Agosto 06, 2015, 13:37:35
Una pena que a Lobogris se lo haya tragado la estepa :-(

Este forero hizo mucho por y para enseñar. Pero en fin, la gente va y viene.
Queda su legado y para mi ha sido muy útil, lo cual le agradezco.
Este donde este, le deseo lo mejor.