El POKE 710,0 seríadogdark escribió:quede mas colgado
COMO SE HACE AAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHH10 GR.0:POKE 710,0
20 ? "INGRESE NUMERO"
30 INPUT A
40 ? A
LDA #00
STA $02C6
Lo demás no se.
El POKE 710,0 seríadogdark escribió:quede mas colgado
COMO SE HACE AAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHH10 GR.0:POKE 710,0
20 ? "INGRESE NUMERO"
30 INPUT A
40 ? A
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 |
-----------------------------------------------------------------------------------------
Algunas aclaraciones: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...
En la linea 91 dice:parche escribió:Batman.
Ahora hagamos un direccionamiento indirectoCó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 | -----------------------------------------------------------------------------------------
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?
Entendido perfectamente!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.
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).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!
8 y 16 bits, no 4.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?
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: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:
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 |
-----------------------------------------------------------------------------------------
No hay problema con preguntar. Me gusta ayudar.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:
Disculpa lo burro amigo Willy, no es mi intención hacerte pasar estas rabias, creeme que no es así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 | -----------------------------------------------------------------------------------------
p.s. a todo esto, vas a la Atariada del Sábado?
Muchas gracias amigo!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.