CURSO DE ASSEMBLER

ATARI Lo que nos ha unido en el tiempo. XL XE ST 2600 7800 Jaguar Lynx.
Avatar de Usuario
ZZT
Site Admin
Site Admin
Mensajes: 10892
Registrado: Mar Nov 07, 2006 2:45 pm
Reputación: 8
Ubicación: La Florida-Santiago-Chile
Contactar:

Re: CURSO DE ASSEMBLER

Mensaje por ZZT »

dogdark escribió:quede mas colgado
10 GR.0:POKE 710,0
20 ? "INGRESE NUMERO"
30 INPUT A
40 ? A
COMO SE HACE AAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHH
El POKE 710,0 sería

LDA #00
STA $02C6

Lo demás no se. :-X
Avatar de Usuario
dogdark
hard player
hard player
Mensajes: 381
Registrado: Dom Nov 12, 2006 10:01 am
Reputación: 1
Ubicación: en todos lados
Contactar:

Re: CURSO DE ASSEMBLER

Mensaje por dogdark »

estamos en las mismas
Avatar de Usuario
batman
expert
expert
Mensajes: 938
Registrado: Mar Abr 17, 2007 4:35 pm
Reputación: 0

Re:

Mensaje por batman »

Buena explicación, pero me asalta una duda, y eso que yo soy un balazo jajajaja (léase como decía Humbertito).
Ojalá alguien me pudiera aclarar...

[quote="parche"]Batman.
Ahora hagamos un direccionamiento indirecto

Código: Seleccionar todo

Assembler
-----------------------------------------------------------------------------------------
|   |    |    |  *=$0600    |                                     |  Decimal            |
|a9 | 44 |    | lda #$44    | Digito menos significativo          | 169 |   68   |      |
|85 | cb |    | sta $cb     | Guardo el 44 en una direccion       | 133 |        |      |
|a9 | 02 |    | lda #$02    | Digito mas significativo            | 169 |   2    |      |
|85 | cc |    | sta $cc     | Guardo la parte alta de la memoria  | 133 |        |      |
|a9 | 01 |    | lda #1      | Guardo el valor del poke            | 169 |   1    |      |
|a0 | 00 |    | ldy #0      | Inicializo un indice                | 160 |   0    |      |
|91 | cb |    | sta ($cb),y | Hago poke 580, 1                    | 145 |        |      |
|4c | 77 | e4 | jmp $e477   |                                     | 76  |  119   | 228  |
-----------------------------------------------------------------------------------------
En la linea 91 dice:


Y mi pregunta es la siguiente:
Si en la dirección 85 vimos que $cb vale "44":
|85 | cb | | sta $cb | Guardo el 44 en una dirección | 133 | | |

Porqué en la dirección 91
|91 | cb | | sta ($cb),y | Hago poke 580, 1 | 145 | | |

En el comentario Parche dice "Hago Poke 580,1"? Si para que eso fuera cierto $cb debería valer "0244" (580)
Parece que me perdí de algo, no caché como el $cb pasó de valer "44" a "0244", fue concatenando el low byte con el high byte? pero cómo el procesador sabe que es una dirección de memoria que esta formada por la concatenación de $cb y $cc?? o el 'sta' siempre toma la dirección indicada mas la siguiente?
Avatar de Usuario
WillySoft
expert
expert
Mensajes: 657
Registrado: Mar Nov 07, 2006 10:02 pm
Reputación: 2

Re: Re:

Mensaje por WillySoft »

batman escribió:Buena explicación, pero me asalta una duda, y eso que yo soy un balazo jajajaja (léase como decía Humbertito).
Ojalá alguien me pudiera aclarar...
parche escribió:Batman.
Ahora hagamos un direccionamiento indirecto

Código: Seleccionar todo

Assembler
-----------------------------------------------------------------------------------------
|   |    |    |  *=$0600    |                                     |  Decimal            |
|a9 | 44 |    | lda #$44    | Digito menos significativo          | 169 |   68   |      |
|85 | cb |    | sta $cb     | Guardo el 44 en una direccion       | 133 |        |      |
|a9 | 02 |    | lda #$02    | Digito mas significativo            | 169 |   2    |      |
|85 | cc |    | sta $cc     | Guardo la parte alta de la memoria  | 133 |        |      |
|a9 | 01 |    | lda #1      | Guardo el valor del poke            | 169 |   1    |      |
|a0 | 00 |    | ldy #0      | Inicializo un indice                | 160 |   0    |      |
|91 | cb |    | sta ($cb),y | Hago poke 580, 1                    | 145 |        |      |
|4c | 77 | e4 | jmp $e477   |                                     | 76  |  119   | 228  |
-----------------------------------------------------------------------------------------
En la linea 91 dice:


Y mi pregunta es la siguiente:
Si en la dirección 85 vimos que $cb vale "44":
|85 | cb | | sta $cb | Guardo el 44 en una dirección | 133 | | |

Porqué en la dirección 91
|91 | cb | | sta ($cb),y | Hago poke 580, 1 | 145 | | |

En el comentario Parche dice "Hago Poke 580,1"? Si para que eso fuera cierto $cb debería valer "0244" (580)
Parece que me perdí de algo, no caché como el $cb pasó de valer "44" a "0244", fue concatenando el low byte con el high byte? pero cómo el procesador sabe que es una dirección de memoria que esta formada por la concatenación de $cb y $cc?? o el 'sta' siempre toma la dirección indicada mas la siguiente?
Algunas aclaraciones:

1. Las "direcciones" que tú mencionas no son direcciones, sino bytes descritos en hexadecimal que corresponden a instrucciones en lenguaje máquina del procesador 6502. Ejemplos: los bytes "85 cb" descritos equivalen a la instrucción en assembler "sta $cb". Los bytes "95 cb" equivalen a un "sta ($cb),y". Es decir, es la compilación.

2. Las direcciones que ocupan más de 8 bits se guardan en formato LSB, MSB (Less Significant Byte, Most Significant Byte). ¿En qué consiste esto? Se utilizan DOS BYTES para almacenar una dirección de 16 bits, donde el primer byte representa a los primeros 8 bits de dirección y el segundo byte a los 8 bits restantes. En este caso particular, las direcciones $cb y $cc guardan los valores $44 y $02, respectivamente, que REPRESENTAN la dirección $0244. Esto funciona ya que el procesador 6502 fue diseñado de esta manera para guardar direcciones de memoria de 16 bits con valores de 8 bits.

Cualquier otra consulta, avisas. ¡Saludos!
Avatar de Usuario
batman
expert
expert
Mensajes: 938
Registrado: Mar Abr 17, 2007 4:35 pm
Reputación: 0

Re: Re:

Mensaje por batman »

WillySoft escribió: Algunas aclaraciones:

1. Las "direcciones" que tú mencionas no son direcciones, sino bytes descritos en hexadecimal que corresponden a instrucciones en lenguaje máquina del procesador 6502. Ejemplos: los bytes "85 cb" descritos equivalen a la instrucción en assembler "sta $cb". Los bytes "95 cb" equivalen a un "sta ($cb),y". Es decir, es la compilación.
Entendido perfectamente!
WillySoft escribió: 2. Las direcciones que ocupan más de 8 bits se guardan en formato LSB, MSB (Less Significant Byte, Most Significant Byte). ¿En qué consiste esto? Se utilizan DOS BYTES para almacenar una dirección de 16 bits, donde el primer byte representa a los primeros 8 bits de dirección y el segundo byte a los 8 bits restantes. En este caso particular, las direcciones $cb y $cc guardan los valores $44 y $02, respectivamente, que REPRESENTAN la dirección $0244. Esto funciona ya que el procesador 6502 fue diseñado de esta manera para guardar direcciones de memoria de 16 bits con valores de 8 bits.
Cualquier otra consulta, avisas. ¡Saludos!
Entonces mi pregunta es, cómo sabe el procesador que la dirección que le pondremos es de 8 bits y no de 4 bits? (como en los primeros ejemplos del libro que estoy siguiendo).
Será que el 'sta' solo trabaja con direcciones en 8 bits y entonces sabe que los primeros 4 bits son $44 y espera a que le pasen los restantes 4 bits que son pasados por el segundo lda?
Avatar de Usuario
WillySoft
expert
expert
Mensajes: 657
Registrado: Mar Nov 07, 2006 10:02 pm
Reputación: 2

Re: Re:

Mensaje por WillySoft »

batman escribió: Entonces mi pregunta es, cómo sabe el procesador que la dirección que le pondremos es de 8 bits y no de 4 bits? (como en los primeros ejemplos del libro que estoy siguiendo).
Será que el 'sta' solo trabaja con direcciones en 8 bits y entonces sabe que los primeros 4 bits son $44 y espera a que le pasen los restantes 4 bits que son pasados por el segundo lda?
8 y 16 bits, no 4.

Respecto a tu pregunta: por el resultado de la compilación. Según el código máquina utilizado, ejecutará la instrucción con registros de 8 o 16 bits de direccionamiento. La determinación de usar una instrucción u otra lo determina el compilador al momento de ensamblar el binario final.

Ejemplo de dos instrucciones:

STA $CB : El compilador entiende que se refiere a una dirección de memoria de la página cero (8 bits), por lo que utiliza el código de máquina "85". Por lo tanto, el resultado en código máquina será: "85 CB"

STA $2000 : El compilador entiende que se refiere a una dirección de memoria de 16 bits, por lo que utilizará el código de instrucción "8D". el resultado final será: "8D 00 20". Esta vez, en formato LSB/MSB.

Asi con este ejemplo, existen muchas condiciones que generan distintos códigos de máquina según el contexto. El procesador 6502 está diseñado para trabajar con todos ellos y ejecutar adecuadamente. Información más técnica la puedes encontrar en:

http://www.oxyron.de/html/opcodes02.html

Ahí podrás ver información detallada de qué código máquina se utiliza para una misma instrucción bajo diferentes contextos: ya sea si se trata de página cero, modo inmediato, absoluto, absoluto.x, absoluto.y, indirecto, etc.

Espero haber ayudado a despejar la duda. ¡Saludos!
Avatar de Usuario
batman
expert
expert
Mensajes: 938
Registrado: Mar Abr 17, 2007 4:35 pm
Reputación: 0

Re: Re:

Mensaje por batman »

WillySoft escribió: Respecto a tu pregunta: por el resultado de la compilación. Según el código máquina utilizado, ejecutará la instrucción con registros de 8 o 16 bits de direccionamiento. La determinación de usar una instrucción u otra lo determina el compilador al momento de ensamblar el binario final.

Ejemplo de dos instrucciones:

STA $CB : El compilador entiende que se refiere a una dirección de memoria de la página cero (8 bits), por lo que utiliza el código de máquina "85". Por lo tanto, el resultado en código máquina será: "85 CB"

STA $2000 : El compilador entiende que se refiere a una dirección de memoria de 16 bits, por lo que utilizará el código de instrucción "8D". el resultado final será: "8D 00 20". Esta vez, en formato LSB/MSB.

Asi con este ejemplo, existen muchas condiciones que generan distintos códigos de máquina según el contexto. El procesador 6502 está diseñado para trabajar con todos ellos y ejecutar adecuadamente. Información más técnica la puedes encontrar en:
Entiendo bien lo que señalas pero en tu ejemplo el 'sta $2000' ya se sabe automaticamente que es una dirección mayor a 255, pero en el ejemplo de parche no, pues, dice 'sta Scb', según yo en este caso no tiene como saber que el 'cb' se va a unir,luego, con 'cc' para formar una unica dirección:

Código: Seleccionar todo

Assembler
-----------------------------------------------------------------------------------------
|   |    |    |  *=$0600    |                                     |  Decimal            |
|a9 | 44 |    | lda #$44    | Digito menos significativo          | 169 |   68   |      |
|85 | cb |    | sta $cb     | Guardo el 44 en una direccion       | 133 |        |      |
|a9 | 02 |    | lda #$02    | Digito mas significativo            | 169 |   2    |      |
|85 | cc |    | sta $cc     | Guardo la parte alta de la memoria  | 133 |        |      |
|a9 | 01 |    | lda #1      | Guardo el valor del poke            | 169 |   1    |      |
|a0 | 00 |    | ldy #0      | Inicializo un indice                | 160 |   0    |      |
|91 | cb |    | sta ($cb),y | Hago poke 580, 1                    | 145 |        |      |
|4c | 77 | e4 | jmp $e477   |                                     | 76  |  119   | 228  |
-----------------------------------------------------------------------------------------
Disculpa lo burro amigo Willy, no es mi intención hacerte pasar estas rabias, creeme que no es así :(

p.s. a todo esto, vas a la Atariada del Sábado?
Avatar de Usuario
ZZT
Site Admin
Site Admin
Mensajes: 10892
Registrado: Mar Nov 07, 2006 2:45 pm
Reputación: 8
Ubicación: La Florida-Santiago-Chile
Contactar:

Re: CURSO DE ASSEMBLER

Mensaje por ZZT »

Abría sido más fácil decir, que el número máximo representado en un byte (ocho dígitos) es hasta 255. Para poder representar 65535 (requiere 16 dígitos), el máximo que maneja la cpu, hay que hacerlo en dos partes. Osea, para ingresar una dirección que requiere 16 dígitos binarios, en una máquina que solo tiene un registro de 8... se hace en dos partes de 8. :-D

La primera mitad se llama byte menos significativo o LSB (Least Significant Byte) y la segunda parte MSB, o byte más significativo (more significant byte).

MSB LSB
00000000 00000000 = 0 0000h
11111111 11111111 = 65535 FFFFh

Lo que no sé, es si primero se introduce el LSB o el MSB. :-D
Avatar de Usuario
WillySoft
expert
expert
Mensajes: 657
Registrado: Mar Nov 07, 2006 10:02 pm
Reputación: 2

Re: Re:

Mensaje por WillySoft »

batman escribió:
Entiendo bien lo que señalas pero en tu ejemplo el 'sta $2000' ya se sabe automaticamente que es una dirección mayor a 255, pero en el ejemplo de parche no, pues, dice 'sta Scb', según yo en este caso no tiene como saber que el 'cb' se va a unir,luego, con 'cc' para formar una unica dirección:

Código: Seleccionar todo

Assembler
-----------------------------------------------------------------------------------------
|   |    |    |  *=$0600    |                                     |  Decimal            |
|a9 | 44 |    | lda #$44    | Digito menos significativo          | 169 |   68   |      |
|85 | cb |    | sta $cb     | Guardo el 44 en una direccion       | 133 |        |      |
|a9 | 02 |    | lda #$02    | Digito mas significativo            | 169 |   2    |      |
|85 | cc |    | sta $cc     | Guardo la parte alta de la memoria  | 133 |        |      |
|a9 | 01 |    | lda #1      | Guardo el valor del poke            | 169 |   1    |      |
|a0 | 00 |    | ldy #0      | Inicializo un indice                | 160 |   0    |      |
|91 | cb |    | sta ($cb),y | Hago poke 580, 1                    | 145 |        |      |
|4c | 77 | e4 | jmp $e477   |                                     | 76  |  119   | 228  |
-----------------------------------------------------------------------------------------
Disculpa lo burro amigo Willy, no es mi intención hacerte pasar estas rabias, creeme que no es así :(

p.s. a todo esto, vas a la Atariada del Sábado?
No hay problema con preguntar. Me gusta ayudar.

Lo que pasa es que la cpu "entiende" cómo trabajar con $CB y $CC en este caso para la instrucción sta ($CB),y. De hecho, es una funcionalidad que posee el 6502, conocido como "indirecto indexado". Si te fijas en la compilación, dicho STA está representado como el código máquina 91 y no 85 como se ve más arriba.

Esa funcionalidad es muy útil, ya que permite rellenar zonas de memoria, copiar pantallas, hacer animaciones por sprites, etc. Hay muchos ejemplos en la literatura. De hecho, en el curso de assembler aparece cómo funciona. Te invito a echarle un vistazo. ¡Saludos!
Avatar de Usuario
vitoco
expert
expert
Mensajes: 869
Registrado: Mié Nov 08, 2006 7:25 pm
Reputación: 5
Contactar:

Re: CURSO DE ASSEMBLER

Mensaje por vitoco »

Sólo para meter la cuchara... en mi página publiqué la tarjeta de referencia del cartucho Assembler/Editor que puede ser impresa en una hoja tamaño carta por ambos lados, o bien sobre cartón color mostaza para reproducir el tríptico original.

En esa tarjeta está la matriz de instrucciones y sus respectivos modos de direccionamiento, la cantidad de bytes que ocupa cada instrucción con sus parámetros, los códigos de estado que se ven afectados en cada operación, la cantidad de ciclos de CPU para determinar la velocidad del código y otras cosillas más.

Ojo que sólo aparecen las instrucciones legales. Existe un conjunto de OPCODES no oficiales que realizan incluso combinaciones de instrucciones oficiales en un mismo paso, pero eso es harina de otro costal... los ensambladores y desensabladores habituales no las reconocen.
Avatar de Usuario
batman
expert
expert
Mensajes: 938
Registrado: Mar Abr 17, 2007 4:35 pm
Reputación: 0

Re: CURSO DE ASSEMBLER

Mensaje por batman »

vitoco escribió:Sólo para meter la cuchara... en mi página publiqué la tarjeta de referencia del cartucho Assembler/Editor que puede ser impresa en una hoja tamaño carta por ambos lados, o bien sobre cartón color mostaza para reproducir el tríptico original.

En esa tarjeta está la matriz de instrucciones y sus respectivos modos de direccionamiento, la cantidad de bytes que ocupa cada instrucción con sus parámetros, los códigos de estado que se ven afectados en cada operación, la cantidad de ciclos de CPU para determinar la velocidad del código y otras cosillas más.

Ojo que sólo aparecen las instrucciones legales. Existe un conjunto de OPCODES no oficiales que realizan incluso combinaciones de instrucciones oficiales en un mismo paso, pero eso es harina de otro costal... los ensambladores y desensabladores habituales no las reconocen.
Muchas gracias amigo!
Tambien gracias a Willy por las explicaciones en directo en la Atariada :)
B!
Responder