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

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13628
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Dudas en Ensamblador
« Respuesta #180 en: Julio 03, 2015, 20:53:55 »
Qué bello es el ensamblador!
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #181 en: Julio 03, 2015, 21:11:18 »
Bello y elegante.
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #182 en: Julio 04, 2015, 11:48:36 »
 me acabo de dar cuenta de una cosa,...en el set de char que estoy trabajando he cambiado de lugar las ultimas 5 letras del abecedario y la relacion de numeros,.....mal hecho!, tengo que restaurarlos a su posicion porque sino el ordenador me mostrara en pantalla caracteres distintos a los movidos..

 y encima a ver como organizo el set porque para mover esos char a su sitio voy a tener que liar una de la leche porque en el set ya no entra ni una mosca y encima muchos de los chars son corelativos,...

  Algo que aprendo y que no me vuelve a pasar.."Modifica el set de char se quieres pero no toques las posiciones de memoria deletras y los numeros"
« última modificación: Julio 04, 2015, 15:15:58 por R. INTERNATIONAL »

Maniako

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 1008
  • SYS 8*4096
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #183 en: Julio 04, 2015, 18:44:47 »
¿No habian 6 posiciones donde poder colocar los caracteres progamables?.

Muevelos a otra zona y cambia la dirección de memoria ¿53272?.
A no ser que tu programa ocupe toda la memoria del Commodore...  :o
LDA #$50
STA $0400
RTS
Lloré cuando conseguí hacer esto con el monitor del FC1.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #184 en: Julio 04, 2015, 20:47:09 »
 Ya lo he solucionado, al final solo he tenido que restaurar las cinco ultimas letras del abecedario que no ha sido mucha movida, los numeros se quedan donde estan sin problemas...

 Proximamente me quiero liar con la colision de sprites y gestion de sprites por encima de la barrera de los 255 (ya se postrarlo pero quiero saber gestionar varios en movimiento superandola tanto en un sentido como en otro)

  Hablamos.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #185 en: Julio 17, 2015, 12:42:57 »
  Salgo del Claustro a ver si alguien me puede ayudar que me estoy volviendo loco con esto,..os cuento:

     En el proximo proyecto he empezado a mover Scrolls por primera vez, es verdad que lo hago de una forma sencilla y primitiva pero bueno,..estoy empezando con ésta tecnica,..ya los tengo construidos, mostrados y se mueven y todo va bien,..pero la tecnica que he usado me ha supuesto un despelote de bytes tremendo que pienso que tiene que haber alguna forma de economizar, por mas que prueblo bucles no doy con la solucion...

   El Scroll se forma por una cadena de 4 o 6 chars que se repite,...cuando llega al ultimo de la cadena el programa refresca la secuencia y vuelve al primero y el efecto queda bien, lo que hago es incrementar el valor (char) asignado en una posicion de memoria y muestra el siguiente, haciendo esto en cadena se mueven todos en toda la pantalla...

  Supongamos una linea de pantalla cualquiera de char de la pantalla, por ejemplo la que va desde la posicion $680 a la posicion $6A7,...primero creo un bucle que montara en cadenas de cuatro repitiendose y la linea queda completa....creo el otro bucle que hara que cuando se llega al char 4 vuelva al uno en todos los ciclos quedando asi (todo esto por ejemplo moviendonos hacia la derecha) supongamos que el primer char de la cadena tiene el valor $A0 y el ultimo char el valor $A3, con lo cual el "hierro" cuando detecta que ha llegado al char $A3 lo restaura al $A0 y el listado al final queda asi:

 
Código: [Seleccionar]
                LDA $680             ;LEE LA POSICION INICIAL
CMP #$A3            ; COMPRUEBA SI ES EL ULTIMO CHAR DE LA CADENA
BEQ JMPRUE2       ; SI ES ASI RESTAURA AL PRIMERA CHAR
JSR SCRODER3     ; AHORA MUEVE (CAMBIA/INCREMENTA) EL VALOR (CHAR) EN MEMORIA

JMPRUE2                              ; RESTAURA/REFRESCA LA CADENA DE CHAR
                LDA #$A0             ; CARGA PRIMER CHAR
                STA $680             ; APLICA EN LA PRIMERA POSICION DE MEMORIA EN PANTALLA
                LDA #$A1             ; CARGA SEGUNDO CHAR
                STA $681             ; APLICA EN LA SEGUNDA POSICION DE MEMORIA EN PANTALLA
                LDA #$A2             ; CARGA TERCER CHAR
                STA $682             ; APLICA EN LA TERCERA POSICION DE MEMORIA EN PANTALLA
                LDA #$A3             ; CARGA CUARTO CHAR
                STA $683            ; APLICA EN LA CUARTA POSICION DE MEMORIA EN PANTALLA
                                            ; REALMENTE ESTO ES UN BUCLE QUE MONTA CADENAS DE CUATRO CHARS
                                            ; EN TODA LA LINEA, PERO SOLO PONGO CUATRO PARA QUE SE VEA

SCRODER3
                INC $680
INC $681
INC $682
INC $683
INC $684
INC $685
INC $686
INC $687
INC $688
INC $689
INC $68A
INC $68B
INC $68C
INC $68D
INC $68E
INC $68F
INC $690
INC $691
INC $692
INC $693
INC $694
INC $695
INC $696
INC $697
INC $698
INC $699
INC $69A
INC $69B
INC $69C
INC $69D
INC $69E
INC $69F
INC $6A0
INC $6A1
INC $6A2
INC $6A3
INC $6A4
INC $6A5
INC $6A6
INC $6A7
RTS


    Como podreis apreciar la rutina contenida en SCRODER3 me supone un despilfarro de bytes del copon, pues esto sumarselo a la mayoria de las lineas de pantalla y encima no solo hacia a la derecha con la instruccion INC,...sino también hacia la izquierda cuando lo hago con el DEC,.....vamos,...Barra libre de bytes para todos, que invito yo!!

   A ver si alguien me puede ayudar a encontrar la forma de economizar todo esto porque seguro que la hay, lo que pasa es que no se...gracias..

   

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #186 en: Julio 17, 2015, 12:56:40 »
 Otra cuestion que voy tirando para que la vayais analizando,...supongamos que tengo un sprite #0 en el centro de la pantalla (independientemente de la coordenada Y) y luego tengo otro sprite #1 (el 1 por ejemplo) a la izquierda del central y tengo otro sprite #2 (que puede ser el 2) a la derecha del central a unos cuantos puntos de coordenada alejados del central...

 Lo que quiero hacer es que cuando el ordenador lea la posicion X de los sprites #1 y #2 el ordenador sepa/reconozca si el sprite que chequea se encuentra a la izquierda o a la derecha del central,...no lo he probado pero asi a bote pronto quizas se me ocurre esta rutina.

   SP0X     ; VALOR DE COORDENADA X EN SPRITE #0
   SP1X     ; VALOR DE COORDENADA X EN SPRITE #1
   SP2X     ; VALOR DE COORDENADA X EN SPRITE #2

                ; POR EJEMPLO CON EL SPRITE #1

   LDA SP1X             ; CARGA VALOR DE COORDENADA DE SPRITE #1
   CMP #<SP0X       ; CHEQUEA SI EL VALOR DE X EN SPRITE #1 ES MENOR QUE EL VALOR
                               ; DEL SPRITE #0
   BEQ  HACE           ; SI ES ASI HARÁ LO QUE YO QUIERO
   RTS

HACE
    ; AQUI RUTINA QUE HACE LO QUE YO QUIERA QUE ES DESPLAZARLO HACIA LA IZQUIERDA O LA
    ; DERECHA SEGUN POSICION DE JOY, PERO BUENO, ESE ES OTRO TEMA.

   Ya os digo que todo esto esta sin probar, el secreto tiene que estar en la linea...

   CMP #<SP0X       ; CHEQUEA SI EL VALOR DE X EN SPRITE #1 ES MENOR QUE EL VALOR

   ya os contare, aunque si sabeis algo o esta mal hecha me viene bien cualquier ayuda

    Como siempre, mil gracias, me vuelvo al claustro y ....

    AL HIERRO!!

   (Jose, a ver si para el 2020 tienes un huequito (en vez de cambiar respuestas innecesariamente de hilos en las que concuerdan) y me haces el favor de lo del grafico de Los Premios, gracias.)



   

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #187 en: Julio 17, 2015, 13:37:50 »
     En el proximo proyecto he empezado a mover Scrolls por primera vez, es verdad que lo hago de una forma sencilla y primitiva pero bueno,..estoy empezando con ésta tecnica,..ya los tengo construidos, mostrados y se mueven y todo va bien,..pero la tecnica que he usado me ha supuesto un despelote de bytes tremendo que pienso que tiene que haber alguna forma de economizar, por mas que prueblo bucles no doy con la solucion...
No me puse a analizar demasiado el codigo pero interpreto que estas experimentando con scroll por hard, y que cada 8 puntos, o 4 o lo que convenga, haces scroll de caracteres, o que directamente lo haces de a caracter, es decir 8 puntos (o 4 en multicolor) a la vez.
No se si se puede compactar mucho el codigo, pero me parece limitado, porque no tienes libertad para imprimir lo que quieras, al usar INC o DEC necesitas tener la definicion de los caracteres contiguos en memoria. Lo ideal seria que pudieras imprimir la linea que fuera con cualquier combinacion de caracteres y tener una rutina generica para hacer scroll.
Simplificando un poco la cosa, si tuvieras una linea de 5 caracteres y sus posiciones de memoria fueran A, B, C, D y E, imprimirias la linea de 5 caracteres con lo que se te ocurra, y luego en cada paso del scroll harias:

Leer A y guardarlo en una "variable" X
Leer B y escribirlo en A
Leer C y escribirlo en B
Leer D y escribirlo en C
Leer E y escribirlo en D
Leer X y escribirlo en E

Eso se podria generalizar para cualquier linea usando algun puntero o indice, primero se guardaria el contenido de la posicion actual de memoria, que deberia ser el primer caracter de la linea, luego se haria un bucle que repitiera N-1 veces (N es el ancho de la pantalla en caracteres) el proceso de leer la siguiente direccion de memoria y guardarla en la actual, para luego incrementar el indice apuntando al siguiente caracter. Por ultimo, habria que volver e leer el primer caracter guardado, y colocarlo en la direccion de memoria actual, que a esta altura deberia ser el caracter mas a la derecha de la linea. A esa rutina solo tendrias que darle como parametro la direccion inicial de la linea, y cargar el indice, por ejemplo el registro X, a 0. Tambien deberias reservarle un byte de memoria para guardar temporalmente el primer caracter.
La misma rutina despues se puede usar para el scroll por pixel, pero en ese caso deberias trabajar en 38 columnas, para eliminar el parpadeo en los bordes.
   

pastbytes

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 556
  • SYS 0
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #188 en: Julio 17, 2015, 13:49:33 »
Lo que quiero hacer es que cuando el ordenador lea la posicion X de los sprites #1 y #2 el ordenador sepa/reconozca si el sprite que chequea se encuentra a la izquierda o a la derecha del central,...
En ensamblador las comparaciones hacen una resta entre dos parametros, creo que en 6502 era A y el parametro que se especifique, una direccion o una constante, no recuerdo ahora cual es el orden de la resta, pero uno determina cual es mayor chequeando las banderas de cero, carry, y negativo, lo que determina si son iguales o uno es mayor que el otro.

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #189 en: Julio 17, 2015, 15:39:42 »
No me puse a analizar demasiado el codigo pero interpreto que estas experimentando con scroll por hard, y que cada 8 puntos, o 4 o lo que convenga, haces scroll de caracteres, o que directamente lo haces de a caracter, es decir 8 puntos (o 4 en multicolor) a la vez.

   Asi es Pastbytes,...no lo has podido decir mejor...

No se si se puede compactar mucho el codigo, pero me parece limitado, porque no tienes libertad para imprimir lo que quieras, al usar INC o DEC

   Me he dado cuenta de esto y tambien lo veo así,..mi mente no solo procesa rutinas cuando programo,..sino cuando trabajo, cocino, etc (y ya no se si cuando duermo) y dentro de mi humilde experiencia y conocimientos no le veo mucha salida de ahorrro de bytes con ésta tecnica.

necesitas tener la definicion de los caracteres contiguos en memoria. Lo ideal seria que pudieras imprimir la linea que fuera con cualquier combinacion de caracteres y tener una rutina generica para hacer scroll.
Simplificando un poco la cosa, si tuvieras una linea de 5 caracteres y sus posiciones de memoria fueran A, B, C, D y E, imprimirias la linea de 5 caracteres con lo que se te ocurra, y luego en cada paso del scroll harias:

Leer A y guardarlo en una "variable" X
Leer B y escribirlo en A
Leer C y escribirlo en B
Leer D y escribirlo en C
Leer E y escribirlo en D
Leer X y escribirlo en E


  Tengo que reconocer que esto es muy interesante y me da luz para futuras tecnicas,..segun lo que me cuentas lo que haces es cambiar el valor de un char a otro char,..yo lo que he estado haciendo es cambiar en un mismo char el valor....es otra forma de tantas que nos ofrece el idioma universal que es el ensamblador (una misma cosa se puede hacer de 1000 formas distintas)

  En cualquier caso te agradezco mucho la ayuda (eso es lo importante) y no como otro/s....

 O.T: (Dirigido a los nuevos usuarios Argentinos y a los de la Espena (perdon Escena) Espáñola)... Yo no soy mas que un "simple" Carnicero, que disfrutó lo indisfrutable en su epoca con las Arcades en los recreativos y con el Commodore luego en Casa,...os podeis imaginar lo que me ha costado y me esta costando avanzar en Programacion en ensamblador, que yo de informatica no se ni papa,..de hecho no se ni como en tan poco tiempo humildemente he podido avanzar tanto: MKII, Impire, Robot Nation, Laberinto, Xain y lo proximo...debe de ser el corazon que le lpongo a esto...

  Lo que me toca la polla (y no pienso consentir, aviso)  y sinceramente ya uno se cansa es de tanto superprogramador tipo Siliceb_it o Madon _na que luego te dejan tirado (de boca todo mucho) o tipo Sand_ro que rechaza una solicitud de ayuda por privado y que te remite a este hilo y que al final ni privado ni hilo,...no hay nada!!! y luego encima vuelven con el rabo entre las piernas defraudados por la Mojoneria twinera y sus colaboradores, que ya lo avise yo que era un camino equivocado (que por mi se puede ir a la tumba con sus secretos en programacion),...por no hablar ya de Mamandurrios tipo confundadores del foro (y ya sabeis de quien hablo) que buscan la anelada tranquilidad del principio del foro y que criticaban la incorporacion de nuevos usuarios en el foro (como mi querido amigo...apuntate a reichi que te has equivocado de sitio o mejor dicho los tiempos han cambiado) o por no hablar de los muertos que se dedican todo el dia perdiendo el dia en foros y blogs abanderandose el nombre de Commodore como si fuera suyo...por no hablar de los gurus del foro en programacion que llevo 5 años en el foro y todavia estoy esperando un minimo proyecto (otros que tal bailan)...

  La Escena Española es la "EsPena" Española,...que luego ni hacen caso a cualquier proyecto que se presenta aqui (y no hablo por mi y no digo nombres de autores porque de esto ya se va dando cuenta la peña nueva desarrolladora) pero esoi sí que luego "abrazan la farola" a la escena internacional (tampoco digo nombres) y que por si fuera poco, cuando a uno (con sus humildes conocimientos pero impresionante corazon) le cruzifican en CSDb no tiene ni los minimos peles de salir a defender el Desarrollo actual en España,......son unos mamandurrios y abrazafarolas!!!

   Sinceramente.....YA ESTA BIEN!!!

  Tenemos que reinventar todo esto o vamos de culo,...no van a quedar al final mas que cuatro frikis blogeros y foreros y esto se acabara el dia que mueran...

  Eso si,...bienvenida toda la Savia nueva que ha venido desde Argentina (que yo adoro) y todos los nuevos usuarios que le dan nueva vida a la escena en lengua Castellana ( no como mi "colega" que salta criticando tanto nuevo usuario,..manda cojones con lo que ha costado levantar esto),..porque lo que es aqui en España es vergonzoso!!

   He dicho......

   Volvamos a lo que nos ocupa que es el Ensamblador y el Commodore en el Siglo XXI!,..pero nada de paja por favor,..solo gente de verdad!!

   Ya veo que la he liado,.pero bueno, me da igual,..perdidos al rio!!,..ja,j,aj,aja,aj

   
   



 
« última modificación: Julio 17, 2015, 23:53:43 por R. INTERNATIONAL »

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #190 en: Julio 17, 2015, 15:49:46 »
  Buff!!,...volviendo a leer la respuesta lo siento por la Espena Española,..pero veo que mi colega en vez de 200 veces os va a mandar que escribaís 5000 veces en la Pizarra..."Raul es Polemico"...(la madre que me pario),..aj,aj,aj,aj,ajja

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #191 en: Julio 18, 2015, 00:00:09 »
 Bueno, vamos a comenzar la danza,....hay dos cosas que tengo que manejar si o si, es la gestion de sprites por encima de 255 y gestion de colision de sprites,..vamos con la primera:

  En esta respuesta os adjunto dos archivos, uno es un ejecutable en el Vice del Programa y otro es el listado en .asm para que lo veais y podais modificar si quereis en vuestro editor de texto (yo utilizo Notepad++)

  He creado un mini listado/programa que muestra tres sprites en pantalla,..podremos controlar el Sprite Flecha con nuestro Joystick de izquierda a derecha, vereis que cambia el grafico de la flecha segun la direccion...

  con este ejercicio voy a intentar dominar minimamente la gestion de varios sprites en movimiento por encima y debajo de la barrera de los 255,....ahora mismo esta preliminar y mañana empezamos a experimentar....id cargando el programa en el Vice y viendo el listado y nos ponemos con ello...os adjunto los dos archivos en la respuesta.

  Como veis ya se mostrarlo y cambiarlo de la barrera de 255, me falta practicar la gestion en movimiento,..ahora estoy cansado y lo dejo,..mañana seguimos.

   chao
« última modificación: Julio 18, 2015, 00:02:28 por R. INTERNATIONAL »

Jeff

  • Commodore Master
  • *****
  • Mensajes: 811
  • RUN/STOP + RESTORE
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #192 en: Julio 18, 2015, 00:51:36 »
R Tape Loading error
« última modificación: Diciembre 18, 2019, 20:03:32 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 #193 en: Julio 18, 2015, 00:53:56 »
  Atencion al archivo Texto.asm que adjunto en la respuesta anterior porque puece venir muy  bien como Matriz a gente que no sepa nada de ensamblador y quiera iniciarse en dicho mundo,...solo tiene que abrir dicho archivo y simplemente modificando el listado podra hacer sus primeros pinitos, encima el listado contiene y muestra lo siguiente:

- Inicio de Programa y configuracion a Codigo Maquina
- Carga de Set de Chars
- Carga de Set de Sprites
- Gestion de rutina de Joystick
- Configuracion y muestra de Sprites en pantalla
- Carga de Set de Constantes basicas y standars internacionales de posiciones de memoria necesarias para luego utilizar en nuestros listados

 Luego ya esta en nosotros cambiar el Set de Sprites con Spritepad o el Set de Chars con Charpad (yo utilizo Cuneiform (recomendado por Lobo Gris y que es la leche)) y modificarlos a nuestro gusto o incluirles nuestras creaciones graficas..

 Osea que lo dicho,..la gente que no sepa pero que algun dia quiera dar el salto al ensamblador que se guarde este listado como oro en paño porque ahora que lo pienso les puede ser una herramienta muy buena y sencilla para iniciarse...
   

R. INTERNATIONAL

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 667
  • THE NEW IRON AGE HAS COME!!
    • Ver Perfil
Re:Dudas en Ensamblador
« Respuesta #194 en: Julio 18, 2015, 00:57:06 »
Cuando superas la barrera 255, hay algún momento en que aparezcan por el otro extremo?

  No, no saldra por el otro lado,...se dara con el tipico tope tanto a derecha como izquierda en la pantalla,..que se ejecuta llamando a la subrutina que lo aplica y ejecuta,..buena pregunta!, con esto contesto a la segunda observacion,...los limites deben de ser configurados para que el personaje siempre sea visible....