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

lobogris

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 453
  • Programador
    • Ver Perfil
    • http://back2theretro.blogspot.com
Re:Empezando con ensamblador
« Respuesta #60 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.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #61 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!!

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #62 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.
« última modificación: Junio 20, 2012, 11:38:42 por R. INTERNATIONAL »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #63 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.
« última modificación: Junio 20, 2012, 12:14:45 por R. INTERNATIONAL »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #64 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.

lobogris

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 453
  • Programador
    • Ver Perfil
    • http://back2theretro.blogspot.com
Re:Empezando con ensamblador
« Respuesta #65 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
« última modificación: Junio 20, 2012, 19:30:25 por lobogris »

lobogris

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 453
  • Programador
    • Ver Perfil
    • http://back2theretro.blogspot.com
Re:Empezando con ensamblador
« Respuesta #66 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
« última modificación: Junio 20, 2012, 20:05:38 por lobogris »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #67 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!!!

lobogris

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 453
  • Programador
    • Ver Perfil
    • http://back2theretro.blogspot.com
Re:Empezando con ensamblador
« Respuesta #68 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...


R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #69 en: Junio 21, 2012, 19:18:22 »
Adjunto la foto del mapa de memoria de la churufleta actualizado:



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!!!
« última modificación: Junio 21, 2012, 19:20:11 por R. INTERNATIONAL »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #70 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!!

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #71 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!!!
« última modificación: Junio 21, 2012, 19:28:33 por R. INTERNATIONAL »

lobogris

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 453
  • Programador
    • Ver Perfil
    • http://back2theretro.blogspot.com
Re:Empezando con ensamblador
« Respuesta #72 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 ;)
« última modificación: Junio 21, 2012, 19:35:16 por lobogris »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 669
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Empezando con ensamblador
« Respuesta #73 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!!!

lobogris

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 453
  • Programador
    • Ver Perfil
    • http://back2theretro.blogspot.com
Re:Empezando con ensamblador
« Respuesta #74 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.