CURSO DE ASSEMBLER

ATARI Lo que nos ha unido en el tiempo. XL XE ST 2600 7800 Jaguar Lynx.

Re: CURSO DE ASSEMBLER

Notapor ZZT el Mar Jun 18, 2013 11:43 pm

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
ZZT
Site Admin
Site Admin
 
Mensajes: 11057
Registrado: Mar Nov 07, 2006 5:45 pm
Ubicación: La Florida-Santiago-Chile

Re: CURSO DE ASSEMBLER

Notapor dogdark el Mié Jun 19, 2013 1:32 am

estamos en las mismas
Avatar de Usuario
dogdark
hard player
hard player
 
Mensajes: 353
Registrado: Dom Nov 12, 2006 1:01 pm
Ubicación: en todos lados

Re:

Notapor batman el Mar Oct 24, 2017 2:25 am

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
batman
expert
expert
 
Mensajes: 957
Registrado: Mar Abr 17, 2007 8:35 pm

Re: Re:

Notapor WillySoft el Mié Oct 25, 2017 12:54 pm

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
WillySoft
expert
expert
 
Mensajes: 654
Registrado: Mié Nov 08, 2006 1:02 am

Re: Re:

Notapor batman el Mié Oct 25, 2017 1:42 pm

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
batman
expert
expert
 
Mensajes: 957
Registrado: Mar Abr 17, 2007 8:35 pm

Re: Re:

Notapor WillySoft el Mié Oct 25, 2017 3:16 pm

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
WillySoft
expert
expert
 
Mensajes: 654
Registrado: Mié Nov 08, 2006 1:02 am

Re: Re:

Notapor batman el Jue Oct 26, 2017 5:02 pm

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
batman
expert
expert
 
Mensajes: 957
Registrado: Mar Abr 17, 2007 8:35 pm

Re: CURSO DE ASSEMBLER

Notapor ZZT el Jue Oct 26, 2017 6:04 pm

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
ZZT
Site Admin
Site Admin
 
Mensajes: 11057
Registrado: Mar Nov 07, 2006 5:45 pm
Ubicación: La Florida-Santiago-Chile

Re: Re:

Notapor WillySoft el Sab Oct 28, 2017 12:35 pm

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
WillySoft
expert
expert
 
Mensajes: 654
Registrado: Mié Nov 08, 2006 1:02 am

Re: CURSO DE ASSEMBLER

Notapor vitoco el Sab Oct 28, 2017 1:36 pm

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
vitoco
expert
expert
 
Mensajes: 875
Registrado: Mié Nov 08, 2006 10:25 pm

Re: CURSO DE ASSEMBLER

Notapor batman el Lun Oct 30, 2017 12:35 pm

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!
Avatar de Usuario
batman
expert
expert
 
Mensajes: 957
Registrado: Mar Abr 17, 2007 8:35 pm

Anterior

Volver a COMPUTADORES Y CONSOLAS

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado