Autor Tema: Dudas en Ensamblador  (Leído 166712 veces)

Jeff

  • Commodore Master
  • *****
  • Mensajes: 810
  • RUN/STOP + RESTORE
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #195 en: Julio 18, 2015, 01:08:43 »
R Tape Loading error
« última modificación: Diciembre 18, 2019, 20:03:21 por Jeff »
Press ANY key (¿Donde esta la tecla ANY???)

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #196 en: Julio 18, 2015, 01:19:07 »
   Me ha faltado mandaros los Set de Chars, Sprites y Constantes para que los veais y los modifiqueis si quereis,..es interesante ver el archivo Constantes (yo lo veo con el notepad) para familiarizarse con el Standar internacional basico de posiciones de memoria....vereis que dichas constantes son las que encontrareis en cualquier libro de programacion de commodore,..no es un archivo hecho por mi sino un estandar que hay en la red,...imprimido es parte de los papeles que tengo chincheteados en la pared como consulta rapida...

  Recordad (dicho mas que nada para la gente que se inicia en ensamblador que todo debe de estar en la misma carpeta junto con el Compilador) a la hora de ensamblarlo desde el Simbolo del Sistema.

 Os adjunto los archivos en ésta respuesta...

   Chao
« última modificación: Julio 18, 2015, 01:26:56 por R. INTERNATIONAL »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #197 en: Julio 18, 2015, 01:24:01 »
Otra cosa, que no tiene que ver con sprites. Yo he perdido la costumbre de los diagramas de flujo. Los que tenemos el asm oxidado miramos los listados con cara de búho sin entender nada.
Tengo un día que agarrar algún listado y hacer su diagrama y viceversa para entrenar


  Me ha llamado la atención esto en relacion a los diagramas de flujo,...se lo que son...

     pero no los utilizo!

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #198 en: Julio 18, 2015, 01:36:56 »
  Ahora que lo pienso si todos los Desarrolladores o gente que se Inicia se basara en el estandar que he adjuntado de constantes que es el internacional y el que vereis en cualquier libro de programacion en ensamblador para commodore todos nos entenderiamos mejor y avanzariamos mucho mas rapido,...porque si cada uno le pone su nombre particular a las posiciones de memoria basicas operativas esto es una torre de babel!!

  Asi que todos a familiarizarse con dicho listado,...yo antes de sabermelo ya de memoria de tantas horas y horas lo que hacia era no llamarlo con un .include sino que lo copiaba y pegaba al principio del programa y asi lo podia consultar en cualquier momento,...(es un truco al principio).

  vuevlo a adjuntar el archivo en cuestion para comodidad de la gente que lo quiera tener a mano sin necesidad de remontar respuestas..

  Chao
 
 
« última modificación: Julio 18, 2015, 01:42:17 por R. INTERNATIONAL »

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #199 en: Julio 18, 2015, 01:50:07 »
Si no te quieres complicar la vida con las coordenadas, y puedes sacrificar un poco de suavidad en el movimiento, podrias usar en los sprites coordenadas de pixel doble, ya que por lo general los juegos suelen usar el modo multicolor de 160 puntos.
Lo que tendrias que hacer es guardar las coordenadas X de cada sprite en una posicion de memoria, y periodicamente actualizar eso en los registros del VIC, previamente multiplicando por 2 estas coordenadas. Para esto, usas la instruccion ASL, que corre a la izquierda los bits del parametro, en este caso la "variable" donde guardas la coordenada X del sprite. Esta instruccion, a diferencia de ROL, coloca automaticamente un 0 en el bit 0 (ROL coloca ahi el valor de carry), y el bit 7 que se pierde se copia a carry, por lo que despues deberias colocar el valor de carry en el bit mas significativo de la coordenada X en el registro correspondiente del VIC para ese sprite.
De esta manera al mover el sprite incrementarias 1 pixel, pero al actualizar a traves de esa rutina se incrementarian 2, internamente tu manejarias coordenadas de 0 a 159, pero en la pantalla manejarias de 0 a 319, avanzando de a 2 puntos.
Solo tendrias que tener en cuenta que para leer las coordenadas X desde el VIC deberias dividir por 2 si quieres obtenerlas tambien en un rango de 0 a 159, esto lo harias con la instruccion ROR, que rota el parametro hacia la derecha, colocando en el bit 7 el valor de carry, y el bit 0 perdido en carry, por lo que primero deberias leer el bit mas significativo de la coordenada X de ese sprite desde el VIC, y colocar este valor en carry, luego usar ROR con el registro de coordenada X de ese sprite (para dividirlo por 2 incorporando carry en el bit 7), y en carry te quedaria el bit 0 que ya no te importa.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #200 en: Julio 18, 2015, 01:57:29 »
 Copio y pego el listado para que sea visible de un plumazo...
Código: [Seleccionar]
[code]
; ****************************************************
;    EJERCICIO GESTION DE SPRITES EN TODA LA PANTALLA
; ****************************************************

.INCLUDE "CONSTANTES.ASM"
*=$0801 ; INICIA PROGRAMA EN ESA POSICION
.WORD NEXT,1                  ; CREA LINEA EN BASIC E INICIA CODIGO MAQUINA
.NULL $9E,^START           ; "SYS START" (START=INIT M.C.)
NEXT .WORD 0 ; FIN BASIC
; LOAD SPRITES                ; CARGA SPRITES
*=$2000 ; CARGA SPRITES POSICION 49152 BANK0
.BINARY SPRITES.BIN
FRAMES .BYTE 0 ; VIDEO FRAMES COUNTER
FRAMES2 .BYTE 0 ; VIDEO FRAMES COUNTER
*=FONTS_END ; CARGA PAQUETE DE FUENTES POSICION AL FINAL DE PROGRAMA
; START
START ; HABILITA INTERRUPCIONES (SEI, DESABILITA)

VICCHIP
LDA VMCSB ; VIC-II CHIP MEMORY CONTROL REGISTER
AND #$F1
ORA #$0A
STA VMCSB ; VIC-II CHIP MEMORY CONTROL REGISTER

; COLOR NEGRO A PANTALLA Y BORDE
LDA #$00 ; NEGRO
STA EXTCOL ; BORDER COLOR
LDA #$00 ; GRIS MEDIO
STA BGCOL0 ; BACKGROUND COLOR 0

; RUTINA QUE LIMPIA PANTALLA
LDX #0                 ; CARGA VALOR
LDA #$00       ; SIMBOLO ESPACIO SEGUN EL SET DE CHAR CARGADO Y MODIFICADO
BUCLE1                       ; INICIO DE BUCLE
STA $0400,X                  ; APLICA A POSICION DE COLOR MAS ESPACIO
STA $04FF,X                  ; APLICA A POSICION DE COLOR MAS ESPACIO
STA $05FE,X                  ; APLICA A POSICION DE COLOR MAS ESPACIO
STA $06FD,X                  ; APLICA A POSICION DE COLOR MAS ESPACIO
INX                            ; INCREMENTA ESPACIO
CPX #25                 ; TOPE DE ESPACIO
BNE BUCLE1                 ; SI NO ES IGUAL VUELVE A BUCLE

; ACTIVA MODO MULTICOLOR EN TODOS LOS SPRITES
LDA #$FF ; CARGA MAXIMO VALOR
STA SPMC ; SPRITE MULTICOLOR REGISTERS

; PREPARA PARAMETROS SPRITES 1,2 Y 3 Y MUESTRA EN PANTALLA
; PUNTEROS DE GRAFICO
LDA #$80 ; BLOQUE GRAFICO
STA POINSP0 ; PUNTERO SPRITE #0
LDA #$81 ; BLOQUE GRAFICO
STA POINSP1 ; PUNTERO SPRITE #1
LDA #$82 ; BLOQUE GRAFICO
STA POINSP2 ; PUNTERO SPRITE #0
; COORDENADAS SPRITES 0 Y 1
LDA #150 ; CARGA VALOR 50 COORDENADAS DE XAIN
STA SP0X ; APLICA A X SPRITE 0
LDA #80 ; CARGA VALOR 50 COORDENADAS DE XAIN
STA SP1X ; APLICA A X SPRITE 0
LDA #200 ; CARGA VALOR 50 COORDENADAS DE XAIN
STA SP0Y ; APLICA A Y SPRITE 0
STA SP1Y ; APLICA A Y SPRITE 0
STA SP2Y ; APLICA A Y SPRITE 0
; COORDENADAS SPRITE 2
LDA $D010
ORA #%00000100                 ; CARGA VALOR SPRITE 2 ENCENDIDO
STA $D010 ; APLICA A $D010, POR ENCIMA DE 255

LDA #30 ; CARGA VALOR 50 COORDENADAS DE XAIN
; ATENCION PORQUE SOLO ES 30 YA QUE SE MOSTRARA POR ENCIMA
; DE LA BARRERA DE 255 COMO SE VE MAS ADELANTE
STA SP2X ; APLICA A Y SPRITE 0
; COLOR DE SPRITES
LDA #$01 ; COLOR BLANCO
STA SP0COL ; APLICA A COLOR SPRITE 0
STA SP1COL ; APLICA A COLOR SPRITE 0
STA SP2COL ; APLICA A COLOR SPRITE 0

;ACTIVA TODOS LOS SPRITES
LDA #$FF ; CARGA MAXIMO VALOR Y ACTIVARA TODOS LOS SPRITES
STA SPENA ; APLICA A LA POSICION DE MEMORIA $DO15 QUE LO ACOMETE

; COMIENZA RUTINA QUE GESTIONA JOYSTICK EN PUERTO 2 Y QUE NOS PERMITIRA
; GESTIONAR EL MOVIMIENTO DEL SPRITE 0 QUE SERA EL NUESTRO
MENUJOY

DERECHA
LDA CIAPRA ; CARGA POSICION DE JOY EN PUERTO 2
AND #8 ; COMPARA CON EL BIT QUE CONTROLA DERECHA
BNE IZQUIERDA ; SI NO SE HA PULSADO MANDA A IZQUIERDA
LDA #$80 ; BLOQUE GRAFICO FLECHA A LA DERECHA
STA POINSP0 ; PUNTERO SPRITE #0
INC SP0X ; SI SE HA PULSADO MUEVE EN UN PUNTO EL SPRITE 0 A LA DERECHA
JSR RETARDO ; RUTINA QUE CONTIENE BUCLE QUE CREA RETARDO DE TIEMPO

IZQUIERDA
LDA CIAPRA ; CARGA POSICION DE JOY EN PUERTO 2
AND #4 ; COMPARA CON EL BIT QUE CONTROLA IZQUIERDA
BNE FINAL ; SI NO SE A PULSADO MANDA A ARRIBA
LDA #$83 ; BLOQUE GRAFICO FLECHA A LA IZQUIERDA
STA POINSP0 ; PUNTERO SPRITE #0
DEC SP0X ; SI SE HA PULSADO MUEVE EN UN PUNTO EL SPRITE 0 A LA IZQUIERDA
JSR RETARDO ; RUTINA QUE CONTIENE BUCLE QUE CREA RETARDO DE TIEMPO

FINAL
JMP MENUJOY ; RETORNA AL INICIO DE BUCLE QUE GESTIONA JOYSTICIK

RETARDO
LDX #$FF
CICL ; PRIMER BUCLE
DEX
BNE CICL
LDX #$FF
CICL2 ; SEGUNDO BUCLE
DEX
BNE CICL2
CICL3 ; SEGUNDO BUCLE
DEX
BNE CICL3
RTS


; DATA: FUENTES LETRAS
*=$4000
CHARS
.BINARY "FONTS.BIN" ; BANCO DE CARACTERES
FONTS_END
[/code]
« última modificación: Julio 18, 2015, 02:07:30 por R. INTERNATIONAL »

Jeff

  • Commodore Master
  • *****
  • Mensajes: 810
  • RUN/STOP + RESTORE
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #201 en: Julio 18, 2015, 11:21:49 »
R Tape Loading error
« última modificación: Diciembre 18, 2019, 20:03:11 por Jeff »
Press ANY key (¿Donde esta la tecla ANY???)

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #202 en: Julio 18, 2015, 11:44:44 »
   GESTION DE SPRITE A LO LARGO DE TODA LA PANTALLA

 Bueno, ya está hecho y esto funciona perfecto,...ahora el sprite de la flecha (el #0 que controlamos con el Joystick) recorre toda la pantalla a sus anchas a nuestro gusto, voy a explicar como sencillamente lo he hecho para que la gente que se inicia lo sepa hacer sin problemas...

  En el listado concretamente en la rutina que gestiona los parametros Derecha e Izquierda de Joystick justo antes de incrementar o decrementar la coordenada X del sprite #0 llamo a una rutina (con el tipico JSR) que sera la que gestione que el sprite #0 este por encima o por debajo de la barrera de los 255,
,...si la rutina de Joy tuviera tambien las posiciones Arriba y Abajo no habria hecho falta incluirla antes de incrementar o decrementar el valor de Y ya que el tema de la superacion de la barrera de 255 solo aplica a la coordenada X,....dicha rutina la he llamado CHECXSP0 (chequea X en Sprite 0) y ha sido incluida en la rutina de Joy a derecha e izquierda de esta forma:

Código: [Seleccionar]
MENUJOY

DERECHA
LDA CIAPRA ; CARGA POSICION DE JOY EN PUERTO 2
AND #8 ; COMPARA CON EL BIT QUE CONTROLA DERECHA
BNE IZQUIERDA ; SI NO SE HA PULSADO MANDA A IZQUIERDA
LDA #$80 ; BLOQUE GRAFICO FLECHA A LA DERECHA
STA POINSP0 ; PUNTERO SPRITE #0
JSR CHECXSP0 ; RUTINA QUE GESTIONA SUPERACION 255 EN SPRITE #0
INC SP0X ; SI SE HA PULSADO MUEVE EN UN PUNTO EL SPRITE 0 A LA DERECHA
JSR RETARDO ; RUTINA QUE CONTIENE BUCLE QUE CREA RETARDO DE TIEMPO

IZQUIERDA
LDA CIAPRA ; CARGA POSICION DE JOY EN PUERTO 2
AND #4 ; COMPARA CON EL BIT QUE CONTROLA IZQUIERDA
BNE FINAL ; SI NO SE A PULSADO MANDA A FINAL Y VUELVE AL BUCLE
LDA #$83 ; BLOQUE GRAFICO FLECHA A LA IZQUIERDA
STA POINSP0 ; PUNTERO SPRITE #0
JSR CHECXSP0 ; RUTINA QUE GESTIONA SUPERACION 255 EN SPRITE #0
DEC SP0X ; SI SE HA PULSADO MUEVE EN UN PUNTO EL SPRITE 0 A LA IZQUIERDA
JSR RETARDO ; RUTINA QUE CONTIENE BUCLE QUE CREA RETARDO DE TIEMPO

FINAL
JMP MENUJOY ; RETORNA AL INICIO DE BUCLE QUE GESTIONA JOYSTICIK

   Creo que se aprecia claramente la inclusion de JSR CHECXSP0 en la rutina de Joy, pero vamos a ver ahora mas detenidamente que hace dicha rutina...antes de nada es importante explicar para la gente que se inicia el conocer las Logicas que nos ofrece el ordenador y que seran muy importantes conocer para utilizar la que sea segun lo que queramos hacer,...las pongo aqui para que se vayan familizarizando:

AND 1-1 >1   "AMBOS"
        1-0 >0
        0-1 >0
        0-0 >0

OR  1-1 > 1  " UNO O AMBOS"
       1-0 > 1
       0-1 > 1
       0-0 > 0

EOR 1-1 > 0  "UNO U OTRO PERO NO AMBOS"
       1-0 > 1
        0-1 > 1
        0-0 > 0

  Estas logicas lo que siempre hacen es comparar dos bits segun esten encendidos (valor1) o apagados (valor 0) y simplemente dependiendo de la Logica que utlicemos obtendremos un resultados u otro, si analizamos las logicas veremos que es muy sencillo entenderlas y en consecuencia utilizarlas,...explicado esto vamos a ver que hacia la rutina CHECXSP0....

Código: [Seleccionar]
CHECXSP0 ; RUTINA QUE GESTIONA SUPERACION 255 EN SPRITE #0
LDA SP0X ; CARGA EL VALOR DE X DE SPRITE #0 POSICION $D000
CMP #$FF ; COMPARA/CHEQUEA SI HA LLEGADO A LA POSICION 255
BEQ ENCIMA ; SI ES 255 MANDA A SUBRUTINA ENCIMA
CMP #$00 ; COMPARA/CHEQUEA SI HA LLEGADO A LA POSICION 0
BEQ DEBAJO ; SI ES 0 MANDA A SUBRUTINA DEBAJO

RTS ; RETORNA A LA RUTINA DE JOY E INCREMENTARA O DECREMENTARA
; X SEGUN EL PUNTO DONDE RETORNE EN MAINJOY, MENU JOYSTICK

  Que como veis es sencillisima,...simplemente cargara el valor de la coordenada X (SP0X...$D000) y chequeara si ha llegado al valor 255 (entonces tiene que superar la barrera de los 255 y moverse por encima de ella) o si es 0 (entonces no tiene que superar la barrera de los 255 y quedará por debajo de ella),....segun tenga un valor u otro, el programa lo mandara o otra subrutina que verdaderamente gestionara el salto a un lado u otro de la barrera....supongamos que ha llegado a 255 entonces se le manda a la subrutina ENCIMA  (por encima de la barrera) dicha rutina tiene este sencillo listado:

Código: [Seleccionar]
ENCIMA
LDA MSIGX ; CARGA POSICION $D010 QUE GESTION LA SUPERACION
ORA #%00000001 ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA
STA MSIGX ; APLICA A LA POSICION DE MEMORIA QUE GESTIONA SUPERACION
LDA #00 ; CARGA VALOR CERO PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; ENCIMA DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 255 POR ENCIMA DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA
RTS


   Lo primero que hace es cargar el valor de MSIGX (posicion $D010, que es la que activa desactiva la superacion o no de la barrera, en dicha posicion cada bit (de los 8 que tiene) controlará un sprites, recordad que la cuenta de sprites #0, #1, #3, etc, etc,....en el byte que estamos usando se hara de derecha a izquierda,..es decir con el bit de la derecha del todo controlaremos el sprite #0

      LDA MSIGX         ; CARGA POSICION $D010 QUE GESTION LA SUPERACION

  supongamos que el sprite se encuentra por debajo de la barrera de los 255, con lo cual el valor en MSIGX es el siguiente: #%00000000,...el valor de la derecha del todo es 0, luego nuestro sprite no supera la barrera,....ahora queremos que la supere para ello tendremos que encender el bit correspondiente, con lo que quedaria asi: #%00000001,...pero claro queremos actuar solo sobre ese bit y ese sprite,..aqui es donde viene la utilizacion de las Logicas, en este caso la que mejor nos va es ORA y hacemos la comparacion (la hace la rutina en esta linea)...

  ORA #%00000001      ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA

 Voy a explicar mas detenido que es lo que hace la logica,..compara los valores de MSIGX con otro valor para que salga el resultado que nosotros queremos,..aqui la comparacion:

    VALORES CONTENIDOS EN MSIGX      00000000     (esto es aleatorio ya que pueden ser cualquiera)
    VALORES QUE ASIGNAMOS A ORA      00000001     (activamos bit para gracias a ORA obtener resultado)
    RESULTADO FINAL DE COMPARAR       00000001    (siempre quedara por encima de la barrera de 255)

  Ahora nuestro Sprite ya esta por encima de la barrera de 255,...ahora solo nos queda ajustar una cosa,...al superar el sprite la barrera de los 255, resulta que el valor 255 de la coordenada X no aplica ya que al moverse por encima de la barrera con dicho el sprite no aparece en pantalla,..lo unico que tenemos que hacer cuando superamos la barrera es aplicarle el valor 0 a la coordenada X ya que ahora esta por encima y asi es contiguo su paso de un lado a otro cuando la supera, eso se hace en estas lineas finales....

   
Código: [Seleccionar]
LDA #00 ; CARGA VALOR CERO PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; ENCIMA DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 255 POR ENCIMA DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA

  Ahora vamos a ver que hace la segunda parte de la rutina,..cuando desde CHECXSP0 se le mandaba a la subrutina DEBAJO,...dicha subrutina gestionara que el Sprite #0 que en ese momento se encuentra por encima de la barrera de 255 haga lo contrario que antes, es decir, que se situe por debajo de dicha barrera,...aqui teneis la rutina que es muy parecida a la anterior cuando hacia que la superase

Código: [Seleccionar]
DEBAJO
LDA MSIGX ; CARGA POSICION $D010 QUE GESTION LA SUPERACION
EOR #%00000001 ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA
STA MSIGX ; APLICA A LA POSICION DE MEMORIA QUE GESTIONA SUPERACION
LDA #255 ; CARGA VALOR 255 PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; DEBAJO DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 0 POR DEBAJO DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA
RTS

  Solo hay dos cosas reseñable y explicables en dicha rutina,...lo primero que ahora el valor de X del sprite #0 que carga es 0 y eso lo hacia en CHECXSP0 en estas lineas...

Código: [Seleccionar]
CMP #$00 ; COMPARA/CHEQUEA SI HA LLEGADO A LA POSICION o
BEQ DEBAJO ; SI ES 0 MANDA A SUBRUTINA NOSUPERA

,..¿y porque 0?,...bueno os cuento, en realidad como el sprite llevara un TOPE de pantalla por el lado izquierdo que sera en la coordenada 30 de X,..esto hara que el sprite nunca llegue al valor 0 cuando este por debajo de la barrera y en su lado mas proximo a la izquierda de la pantalla,..como mucho descenderá al valor 30,..esto es como una especie de trampita, ya que hara que nos indique que SOLO cuando el sprite ha llegado al valor 0 se encuentra por encima de la barrera, con lo cual ya sabemos que hacer,..el reconocimiento de coordenada lo hace como veis en las primera lineas en CHECXSP0 si es 0 mandara a DEBAJO

  Y atencion porque aqui viene el kit de la cuestion,..antes utlizamos la Logica ORA,..pero ahora lo que queremos es que el bit que controla nuestro sprites, este donde este, tras la comparacion nos de como resultado 0 para que de esa forma se ponga por debajo de la barrera,...es por eso que utilizaremos EOR (comparacion "uno u otro pero no ambos",..supongamos que el sprite esta por encima de la barrera y su valor en MSIGX en su bit correspondiente es 1 (encendido),.para hacer que sea 0 utilizaremos EOR con el siguiente valor y haremos la comparacion

 ALORES CONTENIDOS EN MSIGX      00000001    (esto es aleatorio ya que pueden ser cualquiera)
VALORES QUE ASIGNAMOS A EOR      00000001     (activamos bit para gracias a EOR obtener resultado)RESULTADO FINAL DE COMPARAR       00000000   (siempre quedara por debajo de la barrera de 255)

 en la rutina esto se hace asi:

Código: [Seleccionar]
LDA MSIGX ; CARGA POSICION $D010 QUE GESTION LA SUPERACION
EOR #%00000001 ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA
STA MSIGX ; APLICA A LA POSICION DE MEMORIA QUE GESTIONA SUPERACION

  Ahora solo nos queda calibrar el valor de X en el sprite para que el salto de un lado a otro de la barrera sea suave,...antes metiamos el valor 0,..ahora metemos el valor 255 que es mas proximo al limite de la barrera una vez superada,..lo hace aqui.

Código: [Seleccionar]
LDA #00 ; CARGA VALOR CERO PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; ENCIMA DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 255 POR ENCIMA DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA


  Y....YA ESTA!!!,...nuestro sprite se pone por encima o por debajo de la barrera de los 255 a nuestro antojo y corretea como "pedro por su casa",...perdonadme el ladrillo pero ya puestos he hecho una explicacion para que quede como consulta para la gente que se inicia en esto y no sabe como hacerlo,..con tanta letra parece complicado, pero es mas sencillo que tirarse un pedo (y perdonen la expresion) una vez entendido,..vuelvo a poner la rutina completa para que vean lo sencilla que es,..recordemos que es una rutina que llamaremos con CHECXSP0 y a la que llamaremos con JSR justo antes de incrementar o decrementar el valor de la coordenada X del sprite #0 en este caso..

Código: [Seleccionar]
CHECXSP0 ; RUTINA QUE GESTIONA SUPERACION 255 EN SPRITE #0
LDA SP0X ; CARGA EL VALOR DE X DE SPRITE #0 POSICION $D000
CMP #$FF ; COMPARA/CHEQUEA SI HA LLEGADO A LA POSICION 255
BEQ ENCIMA ; SI ES 255 MANDA A SUBRUTINA ENCIMA
CMP #$00 ; COMPARA/CHEQUEA SI HA LLEGADO A LA POSICION 0
BEQ DEBAJO ; SI ES 0 MANDA A SUBRUTINA DEBAJO

RTS ; RETORNA A LA RUTINA DE JOY E INCREMENTARA O DECREMENTARA
; X SEGUN EL PUNTO DONDE RETORNE EN MAINJOY, MENU JOYSTICK
ENCIMA
LDA MSIGX ; CARGA POSICION $D010 QUE GESTION LA SUPERACION
ORA #%00000001 ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA
STA MSIGX ; APLICA A LA POSICION DE MEMORIA QUE GESTIONA SUPERACION
LDA #00 ; CARGA VALOR CERO PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; ENCIMA DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 255 POR ENCIMA DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA
RTS

DEBAJO
LDA MSIGX ; CARGA POSICION $D010 QUE GESTION LA SUPERACION
EOR #%00000001 ; APLICA SOLO AL SPRITE #0, PRIMERO DE LA DERECHA
STA MSIGX ; APLICA A LA POSICION DE MEMORIA QUE GESTIONA SUPERACION
LDA #255 ; CARGA VALOR 255 PARA COORDENADA X
STA SP0X ; APLICA A COORDENADA X DE SPRITE #0 YA QUE AHORA ESTA POR
; DEBAJO DE LA BARRERA DE 255, SI NO SE HICIERA EL SPRITE
; APARECERECIA EN LA POSICION 0 POR DEBAJO DE LA BARRERA Y SE
; SALDRIA DE LA PANTALLA Y NO SE VERIA
RTS

   Podreis apreciar que la rutina completa en sí no es nada,...abultan mas las explicaciones que otra cosa, los he estado contado y la rutina completa no consume mas que 153 bytes..

   Bueno troncos os dejo que ya está bien,..ojala sea de ayuda a la gente que comienza ésta explicacion,..agregada la rutina al listado y compilado queda de la lforma que veis cargando el archivo que os adjunto en esta respuesta en el vice...

  Proximo capitulo: poniendole topes de pantalla a derecha e izquierda para que nuestro sprite no se salga de la pantalla y desaparezca de la vista..

   Chao

P.D: Este mini ladrillo explicativo esta hecho para gente que se quiera iniciar en el ensamblador, pero va especialmente dedicado a gente como Maniako que demuestra un impetu, ganas y corazon por aprender ensamblador dentro de sus limitaciones y que es de lo mas encomiable,....gente como tu, motiva!!



« última modificación: Julio 18, 2015, 17:59:01 por R. INTERNATIONAL »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #203 en: Julio 18, 2015, 12:15:25 »
 Con ésta explicacion simplemente he querido demostrar como "deberían" de ser las cosas,...si muchos de los gurus en programacion que habitan en la "Espena" Española en Commodore hicieran lo que yo ( en vez de llenarseles la bocaza o viniendo con aires de superioridad para luego dejar tirada a la gente que quiere aprender y comienza con ganas o simplemente ignorandoles cuando se les pide ayuda),..compartieran sus conocimientos y sobre todo los explicaran sencillamente de cara a la gente que se inicia,..os aseguro que en cuestion de un año se recogerian unos resultados tan positivos como inimaginables,..porque para recoger hay que sembrar,....pero no,..mejor nos guardamos nuestros conocimientos como un tesoro como si se tratara de un lingote de oro y nos los llevamos a la tumba..

 Yo humildemente hago lo que puedo porque no sea así y me encanta transmitir mis humildes conocimientos con los demas a medida que voy aprendiendo, lo que está claro es que en los ultimos 5 años ya he aguantado bastantes tonterias y niñerias y ya no paso mas....

  Chao
« última modificación: Julio 18, 2015, 17:20:33 por R. INTERNATIONAL »

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #204 en: Julio 18, 2015, 20:16:31 »
Entre los listados comentados , los consejos sobre "los sprites coordenadas de pixel doble" y lo del "estandar  de constantes internacional ", en un solo dia he aprendido lo que en una vida no consegui  :o

Son buenos consejos para como dice R.International unificar esfuerzos y volverlo todo mas simple para los que empezamos (o intentamos continuar) con el ensamblador.

Muchisimas gracias por todo.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #205 en: Julio 19, 2015, 03:00:26 »
Templemos ánimos.

Creo que a todos los del foro, por propia lógica, nos interesa que nuestra afición por el C64 continúe lo más activa posible, pero no siempre se puede contribuir de la forma que nos gustaría.

Sin ir más lejos últimamente apenas participo, principalmente por motivos laborales, aunque no dejo de visitarlo siempre que puedo.

Además para cuatro gatos que somos, no estamos para perder más unidades.  ;D

riq

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 567
    • Ver Perfil
    • From the C64 until today, a developer's perspective
Re:Dudas en Ensamblador
« Respuesta #206 en: Julio 19, 2015, 05:38:31 »

Iapetus

  • Desarrolladores
  • Commodoremaníaco
  • ******
  • Mensajes: 158
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #207 en: Julio 19, 2015, 10:58:09 »
No sé si ya conocéis pero hay este sitio con un simulador de 6502: Easy 6502

(También podéis bajar el programa para usar en vuestro ordenador sin usar internet: JavaScript 6502 assembler and simulator (Para usar el simulador basta pinchar en el fichero html).)

El sitio está en inglés pero uno no necesita saber ese idioma para usa el simulador de 6502, se puede probar código. Es muy bueno por ejemplo cuando se está aprendiendo cosas como las banderitas de estado; para ver como son afectadas por ciertos mnemónicos.

La pantallita esa en memoria está en las posiciones $0200 a $05FF.

Un pequeño programilla que he creado ayer para probar la cosa:

Citar
lda #$00
ldy #$00
mas:
sta $0200,y
sta $0300,y
sta $0400,y
sta $0500,y
tax
inx
txa
dey
bne mas
rts



R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #208 en: Julio 19, 2015, 11:39:58 »
 Yo la verdad Carlos es que a ti te estoy muy agradecido, gracias a tí aprendí lo de la superacion de la Barrera de los 255 y a poner el Texto en modo multicolor y a luego aplicar el color char,..que no es poco y supuso un salto en mi aprendizaje,...ya solo me queda lo de la colision de Sprites para ser minimamente completo.

  Gracias y nada, tú aparece cuando puedas, que cuando lo haces aportas y ayudas.
   

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #209 en: Julio 19, 2015, 12:08:50 »
  Maniako, me acabo de dar cuenta de una cosa revisando el listado CONSTANTES,..el que te he mandado esta "capado", es decir, no esta completo, le faltan todas las constantes relacionadas con el Sonido, Timers y mas cosas..

  Como son cosas que yo todavia no he utilizado, hacia una copia y todas las constantes que no utilizaba las borraba para economizar bytes al ser cargadas,...no veas si me ha costado encontrar el listado completo, lo tenia practicamente escondido en un reducto pero lo he encontrado,..aqui te lo mando completo y guardalo como oro en paño, te lo adjunto en la respuesta,...lleva el nombre de HARDWARE para que no se te equivoque con el otro.

  Tambien lo pongo aqui para que la gente lo vea de un plumazo por si acaso a ver que le parece...

Código: [Seleccionar]
; $0000-$0001 6510 ON-CHIP I/O PORT

D6510 = $0000 ; 6510 ON-CHIP I/O DATA DIRECTION REGISTER
R6510 = $0001

; $D000-$D02E VIC-II CHIP REGISTERS

; $D000-$D010 SPRITE HORIZONTAL AND VERTICAL POSITION REGISTERS

SP0X = $D000 ; SPRITE 0 HORIZONTAL POSITION
SP0Y = $D001 ; SPRITE 0 VERTICAL   POSITION
SP1X = $D002 ; SPRITE 1 HORIZONTAL POSITION
SP1Y = $D003 ; SPRITE 1 VERTICAL   POSITION
SP2X = $D004 ; SPRITE 2 HORIZONTAL POSITION
SP2Y = $D005 ; SPRITE 2 VERTICAL   POSITION
SP3X = $D006 ; SPRITE 3 HORIZONTAL POSITION
SP3Y = $D007 ; SPRITE 3 VERTICAL   POSITION
SP4X = $D008 ; SPRITE 4 HORIZONTAL POSITION
SP4Y = $D009 ; SPRITE 4 VERTICAL   POSITION
SP5X = $D00A ; SPRITE 5 HORIZONTAL POSITION
SP5Y = $D00B ; SPRITE 5 VERTICAL   POSITION
SP6X = $D00C ; SPRITE 6 HORIZONTAL POSITION
SP6Y = $D00D ; SPRITE 6 VERTICAL   POSITION
SP7X = $D00E ; SPRITE 7 HORIZONTAL POSITION
SP7Y = $D00F ; SPRITE 7 VERTICAL   POSITION
MSIGX = $D010 ; MSB'S OF SPRITES 0-7 HORIZONTAL POSITIONS

; $D011-$D012 SCROLL & RASTER

SCROLY = $D011 ; VERTICAL FINE SCROLLING AND CONTROL REGISTER
RASTER = $D012 ; READ CURRENT RASTER SCAN LINE/WRITE LINE TO COMPARE
; FOR RASTER IRQ

; $D013-$D014 LIGHT PEN REGISTERS

LPENX = $D013 ; LIGHT PEN HORIZONTAL POSITION
LPENY = $D014 ; LIGHT PEN VERTICAL   POSITION

;

SPENA = $D015 ; SPRITE ENABLE REGISTER
SCROLX = $D016 ; HORIZONTAL FINE SCROLLING AND CONTROL REGISTER
YXPAND = $D017 ; SPRITE VERTICAL EXPANSION REGISTER
VMCSB = $D018 ; VIC-II CHIP MEMORY CONTROL REGISTER
VICIRQ = $D019 ; VIC INTERRUPT FLAG REGISTER
IRQMSK = $D01A ; IRQ MASK REGISTER
SPBGPR = $D01B ; SPRITE TO FOREGROUND DISPLAY PRIORITY REGISTER
SPMC = $D01C ; SPRITE MULTICOLOR REGISTERS
XXPAND = $D01D ; SPRITE HORIZONTAL EXPANSION REGISTER

; $D01E-$D01F SPRITE COLLISION DETECTION REGISTERS

SPSPCL = $D01E ; SPRITE TO SPRITE COLLISION REGISTER
SPBGCL = $D01F ; SPRITE TO FOREGROUND COLLISION REGISTER

; $D020-$D026 VIC-II COLOR REGISTER

EXTCOL = $D020 ; BORDER COLOR REGISTER
BGCOL0 = $D021 ; BACKGROUND COLOR 0
BGCOL1 = $D022 ; BACKGROUND COLOR 1
BGCOL2 = $D023 ; BACKGROUND COLOR 2
BGCOL3 = $D024 ; BACKGROUND COLOR 3
SPMC0 = $D025 ; SPRITE MULTICOLOR REGISTER 0
SPMC1 = $D026 ; SPRITE MULTICOLOR REGISTER 1

; $D027-$D02E SPRITE COLOR REGISTERS

SP0COL = $D027 ; SPRITE 0 COLOR REGISTER
SP1COL = $D028 ; SPRITE 1 COLOR REGISTER
SP2COL = $D029 ; SPRITE 2 COLOR REGISTER
SP3COL = $D02A ; SPRITE 3 COLOR REGISTER
SP4COL = $D02B ; SPRITE 4 COLOR REGISTER
SP5COL = $D02C ; SPRITE 5 COLOR REGISTER
SP6COL = $D02D ; SPRITE 6 COLOR REGISTER
SP7COL = $D02E ; SPRITE 7 COLOR REGISTER

; $D02F-$D03F NOT CONNECTED

; $D040-$D3FF VIC-II REGISTER IMAGES

;
; SOUND INTERFACE DEVICE (SID) REGISTERS
;

; $D400-$D414 VOICE CONTROLS

FRELO1 = $D400 ; VOICE 1 FREQUENCY CONTROL (LOW BYTE)
FREHI1 = $D401 ; VOICE 1 FREQUENCY CONTROL (HIGH BYTE)
PWLO1 = $D402 ; VOICE 1 PULSE WAVEFORM WIDTH (LOW BYTE)
PWHI1 = $D403 ; VOICE 1 PULSE WAVEFORM WIDTH (HIGH BYTE)
VCREG1 = $D404 ; VOICE 1 CONTROL REGISTER
ATDCY1 = $D405 ; VOICE 1 ATTACK/DECAY REGISTER
SUREL1 = $D406 ; VOICE 1 SUSTAIN/RELEASE CONTROL REGISTER

FRELO2 = $D407 ; VOICE 2 FREQUENCY CONTROL (LOW BYTE)
FREHI2 = $D408 ; VOICE 2 FREQUENCY CONTROL (HIGH BYTE)
PWLO2 = $D409 ; VOICE 2 PULSE WAVEFORM WIDTH (LOW BYTE)
PWHI2 = $D40A ; VOICE 2 PULSE WAVEFORM WIDTH (HIGH BYTE)
VCREG2 = $D40B ; VOICE 2 CONTROL REGISTER
ATDCY2 = $D40C ; VOICE 2 ATTACK/DECAY REGISTER
SUREL2 = $D40D ; VOICE 2 SUSTAIN/RELEASE CONTROL REGISTER

FRELO3 = $D40E ; VOICE 3 FREQUENCY CONTROL (LOW BYTE)
FREHI3 = $D40F ; VOICE 3 FREQUENCY CONTROL (HIGH BYTE)
PWLO3 = $D410 ; VOICE 3 PULSE WAVEFORM WIDTH (LOW BYTE)
PWHI3 = $D411 ; VOICE 3 PULSE WAVEFORM WIDTH (HIGH BYTE)
VCREG3 = $D412 ; VOICE 3 CONTROL REGISTER
ATDCY3 = $D413 ; VOICE 3 ATTACK/DECAY REGISTER
SUREL3 = $D414 ; VOICE 3 SUSTAIN/RELEASE CONTROL REGISTER

; $D415-$D418 FILTER CONTROLS

CUTLO = $D415 ; FILTER CUTOFF FREQUENCY (LOW BYTE)
CUTHI = $D416 ; FILTER CUTORR FREQUENCY (HIGH BYTE)
RESON = $D417 ; FILTER RESONANCE CONTROL REGISTER
SIGVOL = $D418 ; VOLUME AND FILTER SELECT REGISTER

; $D419-$D41A GAME PADDLE INPUTS

POTX = $D419 ; READ GAME PADDLE 1 (OR 3) POSITION
POTY = $D41A ; READ GAME PADDLE 2 (OR 4) POSITION

RANDOM = $D41B ; READ OSCILLATOR 3/RANDOM NUMBER GENERATOR
ENV3 = $D41C ; ENVELOPE GENERATOR 3 OUTPUT

; $D41D-$D41F NOT CONNECTED

; $D420-$D7FF SID REGISTER IMAGES

; $D800-$DBFF COLOR RAM

; $DC00-$DC0F CIA #1

CIAPRA = $DC00 ; DATA PORT REGISTER A
CIAPRB = $DC01 ; DATA PORT REGISTER B
CIDDRA = $DC02 ; DATA DIRECTION REGISTER A
CIDDRB = $DC03 ; DATA DIRECTION REGISTER B

TIMALO = $DC04 ; TIMER A (LOW BYTE)
TIMAHI = $DC05 ; TIMER A (HIGH BYTE)
TIMBLO = $DC06 ; TIMER B (LOW BYTE)
TIMBHI = $DC07 ; TIMER B (HIGH BYTE)

TODTEN = $DC08 ; TIME OF DAY CLOCK TENTHS OF SECONDS
TODSEC = $DC09 ; TIME OF DAY CLOCK SECONDS
TODMIN = $DC0A ; TIME OF DAY CLOCK MINUTES
TODHRS = $DC0B ; TIME OF DAY CLOCK HOURS

CIASDR = $DC0C ; SERIAL DATA PORT
CIAICR = $DC0D ; INTERRUPT CONTROL REGISTER
CIACRA = $DC0E ; CONTROL REGISTER A
CIACRB = $DC0F ; CONTROL REGISTER B

; $DC10-$DCFF CIA #1 REGISTER IMAGES

; $DD00-$DD0F CIA #2

CI2PRA = $DD00 ; DATA PORT REGISTER A
CI2PRB = $DD01 ; DATA PORT REGISTER B
C2DDRA = $DD02 ; DATA DIRECTION REGISTER A
C2DDRB = $DD03 ; DATA DIRECTION REGISTER B

TI2ALO = $DD04 ; TIMER A (LOW BYTE)
TI2AHI = $DD05 ; TIMER A (HIGH BYTE)
TI2BLO = $DD06 ; TIMER B (LOW BYTE)
TI2BHI = $DD07 ; TIMER B (HIGH BYTE)

TO2TEN = $DD08 ; TIME OF DAY CLOCK TENTHS OF SECONDS
TO2SEC = $DD09 ; TIME OF DAY CLOCK SECONDS
TO2MIN = $DD0A ; TIME OF DAY CLOCK MINUTES
TO2HRS = $DD0B ; TIME OF DAY CLOCK HOURS

CI2SDR = $DD0C ; SERIAL DATA PORT
CI2ICR = $DD0D ; INTERRUPT CONTROL REGISTER
CI2CRA = $DD0E ; CONTROL REGISTER A
CI2CRB = $DD0F ; CONTROL REGISTER B

; $DD10-$DDFF CIA #2 REGISTER IMAGES

  Saludos