Mos Technology INC MCS6502 Instruction Set

Avatar de Usuario
minter
Mensajes: 1355
Registrado: 22 Jul 2014 18:51
Agradecido : 577 veces
Agradecimiento recibido: 288 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor minter » 24 Nov 2017 18:20

Último mensaje de la página anterior:

Código: Seleccionar todo

            ORG  0000h
INICIO:     LDA  0A0h       ;Carga el primer operando
            CLC             ;Borra el Carry
            ADC  0A1h       ;Suma a A el contenido de 00A1h
            STA  0B0h       ;Almacena el byte bajo del resultado
            BCC  NOCARRY    ;Salta a NOCARRY si C=0
            LDA  #01        ;Carga 1 en A
            STA  0B1h       ;Almacena el byte alto (el acarreo)
            JMP  FIN       
NOCARRY:    LDA  #00h       ;Si no hay acarreo, byte alto a cero
            STA  0B1h       
FIN:        NOP
            END  INICIO


Vamos a explicar este sencillo programa antes indicado:

Este programa suma dos números que están en memoria y deja el resultado en otro punto de la memoria.

Un apunte:

Si sumamos dos número que no superan el valor 255 en decimal o FF en hexadecimal, nos vale un solo byte para guardar el resultado.

Pero si el valor de la suma de dos bytes es mayor a 255 o FF, entonces necesitaremos en segundo byte.

Bien, pero la suma mas grande que se puede realizar con dos bytes es FF+FF=1FE (255+255=510).
Por lo que unicamente emplearemos un bit del byte de otra posición de memoria para seguir representando los valores que van desde 100 a 1FE. Este byte lo llamaremos byte alto.

¿Como sabemos que esa suma es superior a FF? Pues cuando la realizamos, el registro C (de acarreo) nos dice que hubo acarreo.
Es decir: de la suma, me llevo una.

El programa hace eso:
Suma dos números. Que están en la posición de memoria A0 y A1.

El resultado que da en el Acumulador lo pone como byte bajo en B0.

Y si el resultado ha dado acarreo, pone en 1 el bit de menor peso del byte alto B1. Aunque lo hace a lo bestia, poniendo directamente el valor de todo el byte de mayor peso con el valor 1.

Y si no da acarreo, pone el bit de mayor peso B1 a cero . Pero también a lo bestia, pone a cero todo el byte alto.

Y fin!

Avatar de Usuario
Chema
Mensajes: 1548
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 459 veces
Agradecimiento recibido: 188 veces
Contactar:

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor Chema » 24 Nov 2017 20:24

Código: Seleccionar todo

            ORG  0000h
INICIO:     LDA  0A0h       ;Carga el primer operando
            CLC             ;Borra el Carry
            ADC  0A1h       ;Suma a A el contenido de 00A1h
            STA  0B0h       ;Almacena el byte bajo del resultado
            BCC  NOCARRY    ;Salta a NOCARRY si C=0
            LDA  #01        ;Carga 1 en A
            BNE SUMA      ; Salta siempre a SUMA
NOCARRY:    LDA  #00h       ;Si no hay acarreo, byte alto a cero
SUMA:
            STA  0B1h       
FIN:        NOP
            END  INICIO


Hace lo mismo, pero es más pequeño y rápido. -grin

Ahora es cuando la cagué por listo... No sería la primera vez... -rofl

O cuando empieza la peña a aportar mejoras endiabladas al código -507

Gracias Minter! Esto tiene pinta de curso completo en unas semanas!! -thumbup

Avatar de Usuario
minter
Mensajes: 1355
Registrado: 22 Jul 2014 18:51
Agradecido : 577 veces
Agradecimiento recibido: 288 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor minter » 24 Nov 2017 21:09

Chema escribió:Gracias Minter! Esto tiene pinta de curso completo en unas semanas!!

Gracias a tí, Chema, con los juegos que nos das! -thumbup
Y lo del curso...la verdad... no se me había pasado por la cabeza. Y menos sin saber.
Digamos que estoy haciendo un autocurso. -507

BlackHole
Mensajes: 697
Registrado: 03 Ago 2011 23:07
Agradecido : 1 vez
Agradecimiento recibido: 37 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor BlackHole » 25 Nov 2017 02:08

Minter puso arriba del todo unas capturas de pantalla de programas que parecían de DOS muy antiguos. Al hilo del tema, ¿conocéis algún simulador moderno de 6502 que sea genérico, es decir, que no dependa de un entorno determinado como pueda ser Commodore 64, BBC Micro, Apple II, Oric... cuyos respectivos emuladores tendrán sus ROMs, sus interrupciones cada pocos milisegundos, I/O mapeadas a memoria...

Lo digo porque ahora mismo, para debugear una rutina que no sé por qué falla, necesitaría un simulador del procesador 6502 que me permitiese ejecutar código en una zona de 64K (el espacio direccionable) de RAM contínua, poder poner puntos de ruptura, y lo más importante de todo: poder cargar y grabar la zona de memoria que me venga en gana en cualquier momento. Lo he intentado con VICE pero me falla y no consigo encontrar el motivo, por eso quiero algo independiente al C64.

¿Alguna idea?

Avatar de Usuario
Chema
Mensajes: 1548
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 459 veces
Agradecimiento recibido: 188 veces
Contactar:

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor Chema » 25 Nov 2017 10:00

He oído hablar de
https://skilldrick.github.io/easy6502/

no lo conozco, pero tiene buena pinta, tanto el contenido como el simulador en JavaScript.

BlackHole
Mensajes: 697
Registrado: 03 Ago 2011 23:07
Agradecido : 1 vez
Agradecimiento recibido: 37 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor BlackHole » 25 Nov 2017 11:40

Chema: Ya lo había visto, pero no me sirve de nada, puesto que no tiene opciones para cargar ni grabar datos binarios en la posición que desee, que es lo que necesito ahora mismo.
Puede servir para rutinas simples como las de un tutorial, pero lo que necesito evaluar es extremadamente complejo, moviendo 91370 datos por toda la memoria. ¿Más ideas?

Avatar de Usuario
minter
Mensajes: 1355
Registrado: 22 Jul 2014 18:51
Agradecido : 577 veces
Agradecimiento recibido: 288 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor minter » 25 Nov 2017 12:11

creo que el sim6502.net es lo que buscas.
https://sourceforge.net/projects/sim6502net/
A ver si te vale.

Avatar de Usuario
Chema
Mensajes: 1548
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 459 veces
Agradecimiento recibido: 188 veces
Contactar:

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor Chema » 25 Nov 2017 12:23

@BlackHole vaya, es verdad que pedías poder cargar y grabar datos en binario... Parece que leí tu mensaje demasiado por encima y no sé por qué pensé que querías evaluar rutinas sencillas... Se me cruzó el cable :)

BlackHole
Mensajes: 697
Registrado: 03 Ago 2011 23:07
Agradecido : 1 vez
Agradecimiento recibido: 37 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor BlackHole » 25 Nov 2017 12:42

minter: Pide (más bien exige) tener instalado el .NET 1.1.4322. En tiempos de .NET 4.7.1 resulta paradójico, y te envía a una web de Microsoft donde la mínima opción que te da ya es instalar el .NET 1.1.5, que pudo servir bien en XP, pero para W7 es anacrónico. Intenté instalar diversos runtime desde .NET 1.1.0 a .NET 1.1.5 y no funcionó ninguno de ellos.

Edito: He encontrado un página muy antigua de Microsoft con un instalador de .NET 1.1 de 2003, que da ciertos errores al ponerlo en 2017, crea un cristo en el registro y en un principio no me salía opción para desinstalar. Solo así ha funcionado este simulador de 6502. La verdad es que no me ha hecho ninguna gracia poner ese .NET en el sistema, no estamos en los tiempos de XP.

Edito 2: Bien, resulta que el programa sim6502 no tiene la opción de grabar memoria a disco después... pero por lo que he podido ejecutar *parece* que la rutina es correcta, porque una vez finalizada, los vectores en página cero parecen tener los valores adecuados que tienen que tener. Me explico: tenía que comprobar que 28 KB de datos comprimidos de un juego, descomprimían bien a los 62 KB que ocupa realmente. La rutina es compleja: no en vano, el fichero de traza ocupa 25.216 KB y 1.053.682 líneas. También los datos descomprimidos *parecen* que están en su sitio y no observo la corrupción que estaba detectando en VICE. Ahora tendré que buscar la causa en el emulador de C64.

Gracias por todo. El programa está bien y es útil, pero me ha dado quebraderos de cabeza por su antigüedad.

Avatar de Usuario
Silicebit
Mensajes: 1326
Registrado: 16 May 2011 21:13
Ubicación: La buhardilla del silicio.
Agradecido : 30 veces
Agradecimiento recibido: 78 veces
Contactar:

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor Silicebit » 26 Nov 2017 17:08

BlackHole, visita la página del 6502 (6502.org), concretamente aquí: http://www.6502.org/tools/emu/

De todos los que hay, el que me ha parecido más interesante es el "6502 Macroassembler & Simulator". Creo que te permite cargar desde binarios hasta formatos Intel-HEX y Motorola-S en la posición de memoria que quieras, y funciona en Windows 7. Al menos, de momento, no me ha dado problemas corriendo en mi Windows 7.

Simulador6502.png
Simulador6502.png (398.78 KiB) Visto 344 veces

Ya nos contarás.
El 6809 es el Rolls-Royce de los 8bits, el 6502 es el Mercedes, y el Z80 el SEAT 850. Sorry, but... I think different. :-P -0r1c -m3s3x -t4nd1 -cbmja YouTube

Avatar de Usuario
explorer
Mensajes: 88
Registrado: 10 Ene 2016 18:43
Ubicación: Valladolid, España
Agradecido : 3 veces
Agradecimiento recibido: 68 veces
Contactar:

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor explorer » 26 Nov 2017 22:36

En http://6502asm.com/ hay otro ensamblador en línea. Si quieres una zona rellenada de datos, te vale con usar zonas con dcb:

Código: Seleccionar todo

logo:
 dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
 dcb 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

BlackHole
Mensajes: 697
Registrado: 03 Ago 2011 23:07
Agradecido : 1 vez
Agradecimiento recibido: 37 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor BlackHole » 27 Nov 2017 02:46

Silicebit: Conocía la página y probé algunos de la lista pero no di con uno bueno. El que me has apuntado tú es muy bueno, y funciona muy bien: he podido confirmar al 100% que la prueba de descompresión funciona correctamente y hay algo externo en el entorno del C64 que corrompe los datos y tengo que revisar en VICE (ya te dije en la charla de Gabriel el otro día, que había observado inconsistencias en una prueba que hice con esta rutina, pero la rutina parece que es correcta).

Por cierto, si alguien quiere cacharrear, es importante que revise el menú "Simulator > Options" y que desactive la zona "In/out memory area" y cambie los valores de "Memory protection" para que coincidan con el entorno deseado.

Avatar de Usuario
minter
Mensajes: 1355
Registrado: 22 Jul 2014 18:51
Agradecido : 577 veces
Agradecimiento recibido: 288 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor minter » 27 Nov 2017 15:47

Venga, otro ejemplo comentado que voy sacando de unos apuntes:

Programa que copia el bloque de memoria comprendido entre las direcciones 00h y 1Fh a partir de la dirección 100h.


Código: Seleccionar todo

            ORG  0000h
inic        EQU  00h      ;Declaramos inic=00h
fin         EQU  1Fh      ;Declaramos fin=1Fh
INICIO      LDX  #fin+1       ;Número de datos + 1 (Cargamos en X el valor de 1F más 1, osea 20)
BUCLE       DEX               ;Decrementamos (el contador) X una unidad.
            LDA  inic,X      ;Cargamos el Acumulador con la posición en página cero, más el valor del registro X.
            STA  0100h,X   ;Guarda el Acumulador en Memoria en la posición 0100h + el valor de X
            CPX  #00      ;Comparamos el registro X con cero. CPX nos genera efecto en el registro Z
            BNE  BUCLE        ;Salta a la etiqueta BUCLE si el resultado de comparar X con cero no es igual.
                    ;Este comprueba si Z=0. Si no se completó el proceso.
FIN         NOP


Este programita es un bucle del tipo HAZ... MIENTRAS... sea distinto de cero. Y se sale del bucle, cuando es cero.

Coge un dato de un sitio y lo pone en otro mientras que el contador X no haya llegado al final.
De la memoria de página cero, al acumulador. Y del acumulador... a otra zona de memoria (la 0100h)
Lo hace en orden descendente. Desde la posición más alta hasta la mas baja. Aprovechando que el contador X nos hace de apuntador.
1F => 011F... decrementamos X... ¿Es cero? (Si, entonces continua ejecutando hacia abajo. No, entonces salta a Bucle)
1E=>011E... decrementamos X... ¿Es cero?... lo mismo hasta ....

Que luego compara si el contador ha llegado a cero. Si llegó a cero el contador X, pues sale del bucle y para la ejecución.

Lo curioso de este programa, es que se copia a sí mismo. Ya que está hubicado en página cero (Origen en 0000h)

PituFIN!

Avatar de Usuario
explorer
Mensajes: 88
Registrado: 10 Ene 2016 18:43
Ubicación: Valladolid, España
Agradecido : 3 veces
Agradecimiento recibido: 68 veces
Contactar:

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor explorer » 27 Nov 2017 16:30

No sé si ha comentado antes, añado el emulador ICU64, que permite editar la memoria en tiempo real, lo cual puede ayudar bastante a la hora de afinar comportamientos de enemigos, por ejemplo.

Aquí tenéis un vídeo. En el minuto 01:10 se empieza a ver la manipulación de la memoria. Y en el 05:00, la manipulación de la memoria de vídeo, cambiando el escenario de juego en tiempo real.

https://www.youtube.com/watch?v=tjcvR5McmSg

Avatar de Usuario
minter
Mensajes: 1355
Registrado: 22 Jul 2014 18:51
Agradecido : 577 veces
Agradecimiento recibido: 288 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor minter » 27 Nov 2017 17:27

Ese programa lo tengo instalado por defecto con el VICE. Va conmigo a todos los lados.
Lo suelo utilizar cuando quiero buscar un archivo SID, para ver donde lo coloca en memoria y como lo va tocando a medida que va realizando otras tareas. Es una pasada.
Igual BlackHole puede ver en tiempo real, donde le tropieza la descompresión con este programa.
A mí me vino bien para ver como funcionaban las rutinas de sonido del juego Spriteman, que no sabía como creaba el ruido y luego descubrí que eran unos bucles FOR NEXT con unos POKES y creaba unas tablas para reproducir con el SID a partir de unas líneas de BASIC.

Avatar de Usuario
Chema
Mensajes: 1548
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 459 veces
Agradecimiento recibido: 188 veces
Contactar:

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor Chema » 27 Nov 2017 18:54

O, ya que $1F, o mejor $20 que es el numero de bytes a copiar, es positivo, podemos hacer algo mejor -grin

Código: Seleccionar todo

    ldx #$20-1
loop
    lda inic,x
    sta $0100,x
    dex
    bpl loop


Y si el numero de bytes a copiar fuera mayor de $7f, por ejemplo $f0, podemos hacer:

Código: Seleccionar todo

    ldx #$f0
loop
    lda inic-1,x
    sta $0100-1,x
    dex
    bne loop


Y si es toda una página, todavía mejor:

Código: Seleccionar todo

    ldx #00
loop
    lda inic,x
    sta $0100,x
    dex
    bne loop


Lo he escrito así, de memoria, así que puedo haberme equivocado en algún sitio. Si alguien ve un error...

-507

Avatar de Usuario
minter
Mensajes: 1355
Registrado: 22 Jul 2014 18:51
Agradecido : 577 veces
Agradecimiento recibido: 288 veces

Re: Mos Technology INC MCS6502 Instruction Set

Mensajepor minter » 04 Dic 2017 18:23

Venga, ultimo ejemplo para no dar la turra con estas cosas tan tontunas. -grin

Programa que ordena los datos de una tabla que comienza en la dirección 00B0 y que contiene el número de elementos que se indica la posición 00A0h, considerándolos como números sin signo.

Código: Seleccionar todo

ORG     0000
TABLA   EQU     0B0h    ;Comienzo de la tabla de datos. A partir de aquí, tendremos los datos almacenados
NUMDAT  EQU     0A0h    ;Contiene el número de elementos. Y esto nos da la cantidad de datos.
INICIO: LDY #0          ;Indicador de cambios en la tabla. Cargamos en Y el valor cero
        LDX #01         ;Índice. Cargamos en X el valor uno.

BUCLE:  LDA TABLA-1,X   ;Carga un elemento en el acumulador. Cargamos en el acumulador, el contenido que hay en B0 más la posición de X. Pero como X ya es 1, pues B0, le quitamos uno y le sumamos X (uno) Total, cargamos lo que hay en B0.

        CMP TABLA,X     ;Compara con el siguiente elemento. Osea, compara el Acumulador con lo que apunta. Que es el valor de la tabla, mas lo que diga X. Si lo que hay en el accumulador es mas grande que la memoria, no cambia C al comparar con CMP.

        BCS NOCAMB      ;Si el acumulador es mayor no hay cambio. Salta si en operación de comparar, el acarreo fue 1 (C=1). Es decir.

        PHA             ;Cambio de elemento a través de la pila. Bueno, salvamos el acumulador para luego colocarlo en el sitio nuevo. Pero mientras tanto, movemos el otro dato.
        LDA TABLA,X     ;Intercambio de datos en la tabla. Cogemos el dato que hay en la tabla, que resultó mas alto que el acumulador.
        STA TABLA-1,X   ; Y lo colocamos en el lugar del otro dato que había antes en el acumulador.
        PLA      ; Recuperamos el acumulador, que es el dato menor
        STA TABLA,X   ;Y lo ponemos donde habíamos cogido el dato anterior.
         ; Osea, un plis plas de contenido de memoria usando como registro auxiliar la pila.
         
        LDY #01         ;Si es distinto de cero, hubo cambio. Bueno, claro, carga en Y el 1 indicando que ha cambiado las posiciones. Y continuamos

NOCAMB: INX             ;Incrementamos X para coger los dos siguientes valores.
        CPX (NUMDAT)    ;Comprueba si el índice alcanzó el máximo. Es decir. Comprueba que X=al valor contenido en A0h
        BNE BUCLE   ;Comprueba Z=0, si es cero... Osea, que la comparación no fue igual. Es decir, que X y el contenido de A0 no es el mismo.
        DEY             ;Decrementa el indicador de cambios.
        BEQ INICIO      ;Repite el proceso si hubo cambios. Vamos, que salta al INICIO si Z=1. Y repite todo el proceso desde cero.
FIN     NOP
        END  INICIO

El uso que se da a la pila en este ejemplo es un poco tonto. Emplea la pila como una una posición de memoria auxiliar, pero no aprovecha las caracteristicas de ir apilando cosas.
Este programa, coge dos elementos, dos compara y si ve que el de la izq (por decir un lado) es mas pequeño, los intercambia. ZAS!
Como no puede pegar saltos entre distintos puntos, sino que hace los cambios entre dos elementos juntos, pues tiene que hacer la comprobación desde el principio cada vez que hay un cambio.
Y comenzar de nuevo. Cuando no puede cambiar nada, porque todos los elementos van ordenados, o cumplen que el de la izquierda es mayor que el de la derecha, entonces se acaba el programa. -banghead

Fin!


Volver a “Lenguajes de Programación y herramientas Dev”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados