Autor Tema: Tutorial de ensamblador de C64  (Leído 19158 veces)

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Tutorial de ensamblador de C64
« en: Julio 01, 2010, 09:37:44 »
Últimamente me estoy metiendo mas y mas con rutinas en assembler para el commodore pero todavía tengo demasiadas lagunas con este tema ya que hasta ahora casi todo lo he hecho en C.

¿Conoceis algún tutorial que enseñe lo básico de ensamblador para C64? me refiero a que empiece desde lo más simple, por ejemplo cómo construir comparaciones, bucles, operaciones matemáticas, ...

Busco algo como lo que viene en esta web (http://www.c64.ch/programming/) pero que esté acabado  :wink: . Me he bajado algún libro de assembler que recomiendan como el de Jim Butterfield pero aunque está bien no acabo de verlo bien estructurado y encontrar lo que busco.

marcos64

  • Commodore Master
  • *****
  • Mensajes: 2970
    • Ver Perfil
    • http://marcos64.orgfree.com/
Re: Tutorial de ensamblador de C64
« Respuesta #1 en: Julio 01, 2010, 22:43:31 »
Cita de: "Carlos"
por ejemplo cómo construir comparaciones, bucles, operaciones matemáticas, ...


Si has programado en C, primero vas a tener que cambiar el 'enfoque'. Me refiero a que el ensamblador del 6502 tiene unas instrucciones muy simples y hacer operaciones matematicas, por ejemplo calcular el coseno, ya es un programa en si mismo.

Lo comento porque yo estoy en una situacion parecida a la tuya y repasando codigo voy de sorpresa en sorpresa de como programan las cosas.

Primero 'olvida' lo que tienes aprendido porque si quieres programar en assembler como lo haces en C mucho me temo de que no llegaras muy lejos.

Repetire el mejor consejo que he leido: Estudia el codigo que otros han hecho.

Pero respondiendo a tu pregunta leete el manual del Turbo Assembler http://turbo.style64.org/ y quizas encuentres algo aqui http://codebase64.org/doku.php

Creo que no es lo que tu querias exactamente pero es util para aprender.
http://marcos64.orgfree.com/
Actualizacion 22/4/2018: Actualizada Load'N'Run numero 5 con nuevos TAPs y PRGs.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13740
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Tutorial de ensamblador de C64
« Respuesta #2 en: Julio 02, 2010, 09:09:00 »
Por lo que recuerdo del Assembler, en realidad es bastante simple, es como dice Marcos64, entender la base del funcionamiento y luego ir viendo para que sirve cada instrucción.

La mayoría de las operaciones sirven para transferir datos de una parte a otra, procesarlos (desplazamientos, ands, ors) y hacer comparaciones entre esos datos... y saltar de aqui para allá.

Y con eso ya se hace todo  :D

Si, creo que lo he simplificado demasiado, pero esa es la sensación/recuerdo que tengo.
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Tutorial de ensamblador de C64
« Respuesta #3 en: Julio 02, 2010, 11:57:39 »
Una pequeña duda estúpida que no acabo de ver, si hago lo siguiente:

[code]lda #$7
sta _var1[/quote]

lo que estoy haciendo es almacenar el valor 7 en la variable 'var1', pero ¿cómo puedo hacer para almacenar el valor 7 en la dirección de memoria apuntada por la variable 'var1'? es decir, supongamos que var1 tiene el valor $9a y yo quiero almacenar el 7 en esa dirección de memoria.

marcos64

  • Commodore Master
  • *****
  • Mensajes: 2970
    • Ver Perfil
    • http://marcos64.orgfree.com/
Tutorial de ensamblador de C64
« Respuesta #4 en: Julio 02, 2010, 16:27:48 »
Eso no lo tienes que hacer tu, sino que lo hace el macroensamblador que  uses. No es algo que se pueda hacer en assembler 'puro', el assembler no tiene variables, con un monitor de codigo maquina simplemente seria imposible.
Con un ensamblador, como el del link que te he puesto arriba, tu declaras la 'variable' (es un decir, no es una variable como en C, sino algo mucho mas simple) y al 'copilar' el programa el asembler se encarga.
El '7' es un '7' hexadecimal y el simbolo '_' no se si signica algo o es solo un error al teclear?
Y evidentemente puedes hacer un 'sta $9a' , pero me imagino que no es lo que preguntas.
http://marcos64.orgfree.com/
Actualizacion 22/4/2018: Actualizada Load'N'Run numero 5 con nuevos TAPs y PRGs.

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Tutorial de ensamblador de C64
« Respuesta #5 en: Julio 02, 2010, 16:59:19 »
Cita de: "Marcos64"
Eso no lo tienes que hacer tu, sino que lo hace el macroensamblador que  uses. No es algo que se pueda hacer en assembler 'puro', el assembler no tiene variables, con un monitor de codigo maquina simplemente seria imposible.
Con un ensamblador, como el del link que te he puesto arriba, tu declaras la 'variable' (es un decir, no es una variable como en C, sino algo mucho mas simple) y al 'copilar' el programa el asembler se encarga.
El '7' es un '7' hexadecimal y el simbolo '_' no se si signica algo o es solo un error al teclear?
Y evidentemente puedes hacer un 'sta $9a' , pero me imagino que no es lo que preguntas.


A ver que creo que me he explicado como el culo  :lol: algo de ensamblador si que sé y el código que he puesto antes es perfectamente válido al menos con el cross-assembler que uso (el ca65).

En el ejemplo que he puesto lo que estoy haciendo es asignar un valor (el $7) a una variable, si alguien está familiarizado con el assembler del ca65 y con otros similares si que se pueden usar 'variables' o al menos etiquetas que las simulan (si es que en assembler puro no se puede que eso no lo sabía), mi pregunta era como poder almacenar el valor no en la variable en sí sino en la dirección de memoria que apunta la variable, es decir, en la dirección de memoria que indica el contenido de la variable. Creo que es algún tipo de direccionamiento pero desconozco cómo hacerlo.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13740
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Tutorial de ensamblador de C64
« Respuesta #6 en: Julio 02, 2010, 17:12:14 »
Yo creo que deberias hacer algo asi:

tmp = var
sta tmp

pero no creo que haya una instruccion para hacer eso...
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13740
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Tutorial de ensamblador de C64
« Respuesta #7 en: Julio 02, 2010, 17:12:52 »
Una guía básica de ensamblador para 6502 para tener un pantallazo general: http://web.atari.org/ass1paso.txt (y en castellano)

Lo siento si estoy siendo "captain obvious" :D :D
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

marcos64

  • Commodore Master
  • *****
  • Mensajes: 2970
    • Ver Perfil
    • http://marcos64.orgfree.com/
Tutorial de ensamblador de C64
« Respuesta #8 en: Julio 03, 2010, 11:51:11 »
Pues si, vamos a tener un pequeño problema de comunicacion.  :D

Yo entiendo que tu haces lo siguiente:

var1=$9a ;declaras la 'variable' o 'etiqueta'
.
.
.
lda #$07 ; cargas el acumulador con $07
sta var1 ; almacenas el acumulador en var1
.
.
.

entonces al copilar este 'codigo fuente' con un ensamblador que soporte las 'etiquetas' o 'variables' el propio ensamblador sustituye el 'var1' por $9a y al ejecutar ese codigo se realiza la siguiente accion: sta $9a que, si no recuerdo mal, es un direcionamiento directo de pagina cero.
Es decir tu no tienes que hacer nada, si lo tubieras que hacer los ensambladores con estas 'funciones avanzadas' serian de poca utilidad.  :)

De todas formas mejor leerte tranquilamente un buen libro/manual/tutorial de ensamblador porque antes de seguir tienes que conocer las siguientes cosas:
-Instruciones del 6502, y como afectan al registro de estado.
-Modos de direccionamiento.
-El registro de estado.
-Acumulador.
-Registros X e Y.
-PC.
-Pila.
-Memoria.
-Se me olvida algo?
Con esto se hace todo, no hay mas. No se pueden hacer bucles o comparaciones como en lenguajes de alto nivel, sino cosas equivalentes pero mucho, mucho mas sencillas. Y operaciones matematicas pues te tienes que conformas con sumar y restar numeros de 8 bits, aunque tambien puedes hacer divisiones o multiplicacion por 2 desplazando los bits de un byte (logica binaria). Enfin cosas asi.
Quizas ya lo conozcas, no se hasta donde has llegado. Yo mismo aun tengo problemas en comprender como se modifica el registro de estado con algunas instruciones (lo cual hace que no entienda algunas rutinas que me parecen magia).
Y luego esta conocer a fondo el VIC, el SID, las CIAs... Ten en cuenta que muchas cosas que en otros ordenadores de 8 bits necesitan del procesador para realizarse en el 64 las hacen los chips, como por ejemplo lo referente a sprites.
Y disculpa si he contado algunas cosas que son obvias para ti.
http://marcos64.orgfree.com/
Actualizacion 22/4/2018: Actualizada Load'N'Run numero 5 con nuevos TAPs y PRGs.

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Tutorial de ensamblador de C64
« Respuesta #9 en: Julio 06, 2010, 10:37:09 »
Al parecer la soluci?n a la pregunta que plantee es usar uno de los punteros de la ZP (Zero Page) para acceder mediante ?l al dato que quer?a.

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Tutorial de ensamblador de C64
« Respuesta #10 en: Julio 06, 2010, 10:37:25 »
Al parecer la soluci?n a la pregunta que plantee es usar uno de los punteros de la ZP (Zero Page) para acceder mediante ?l al dato que quer?a.

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Tutorial de ensamblador de C64
« Respuesta #11 en: Julio 06, 2010, 10:53:58 »
Al parecer la soluci?n a la pregunta que plante? era usar un puntero de la ZP (Zero Page) para acceder al dato mediante el mismo.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13740
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Tutorial de ensamblador de C64
« Respuesta #12 en: Julio 10, 2010, 12:39:38 »
¿Podrías poner exactamente cómo es la solución?
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

Carlos

  • Desarrolladores
  • Commodore Master
  • ******
  • Mensajes: 652
    • Ver Perfil
Tutorial de ensamblador de C64
« Respuesta #13 en: Agosto 06, 2010, 13:12:55 »
No tengo ahora el código a mano, pero se basa en usar el modo de direccionamiento Indirecto Indexado del 6510.

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13740
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Tutorial de ensamblador de C64
« Respuesta #14 en: Agosto 06, 2010, 16:00:40 »
Si puedes copia ese trocito de código
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com