Sistema Mínimo con CPU 6502 (Bootloader)

6502SbcSchematic 1.1.gif

Especificaciones

16K ROM
32K RAM
PPI 8255 o 6522
ACIA 68B50
CPU 6502 corriendo a 1.8432MHz con crystal (0.9216MHz o 1.8432MHz clock)
57, 600 Baudios seriales con interface a modulo USB


Mapa de Memoria

0000-7FFF 32K RAM
8000-8FFF PPI 8255
9000-9FFF SERIAL 68B50
A000-AFFF PERIFERICO
B000-BFFF PERIFERICO
C000-CFFF PERIFERICO
D000-FFFF 8K ROM

La imagen de arriba es nuestra imagen referencial para la creacion de nuestro circuito minimo a desarrollar con el famoso Microprocesador 6502 al cual le adaptare el Bootloader desarrollado para el Z80 , mientras programaba en asembler para Z80 le fui agarrando el hilo a la madeja y hasta me parecio entretenido en las secuencias de toma de deciciones , antes de llegar al poderoso MC68008 creo que tendre que pasar primero por sus ancestros , primero por el 6502 y luego por el 68B09 , segun la referencia del MOS 6502 este opera solo a 1 Mhz (tan lento no puede ser) pero tambien tenia una version de 2 Mhz segun habia leido de otros fabricantes como Rockwell en versiones cmos como el 65C02, se que tengo algunos de estos chips en mi alacena pero no recuerdo que versiones y hasta los pobres ya andaban oscureciendoseles los pines , tendre que pasarle su lijado jeje, cuando vemos su modelo de programacion con un escueto numero de registros versus los numerosos registros que tienen otros procesadores como el 8085 o el Z80 uno se queda maravillado de que con tan pocos registros se programara tan bien y se montaran unas buenas computadoras ya clasicas, segun tengo entendido el truco con el 6502 era que tenia incorporado un novedoso sistema llamado pipeline con el que aventajaba a la competencia que tenian un procedimiento mas largo para capturar y ejecutar sus instrucciones mientras que este bicho 6502 capturaba una instruccion y mientras la estaba decodificando ya estaba capturando la proxima instruccion o dato osea se iban solapando sus ciclos asi que con menos velocidad de reloj le hacia la pelea a los otros de mas velocidad.

Sino me equivoco entre sus herederos que vinieron despues esta una CPU de 40 pines dip el 65C816 que es un 6502 ampliado a 16 bits internos pero con bus externo de 8 bits , ampliando su rango de memoria externa a 16 mbytes , mantenia una compatibilidad en modo emulacion con el 6502 y podia funcionar hasta los 20 mhz (wow) se me antoja hecharle mano a ese micro tambien jeje,
Aunque les parezca un cacharro antiquisimo tengo entendido que se sigue fabricando actualmente o corrijanme sino, para el ambiente academico para el aprendizaje del ensamblador y quizas en algunos equipos todavia los nesesiten como a las evoluciones del Z80 pero ya en versiones smd nomas que ya no son tan faciles de manipular en los protoboard.

Sobre este Procesador clasico 6502 creo que varios colegas tendran mucho que contar tambien mientras vamos avanzando con lo que se pueda con el tiempo :)
 
"Tan lento no puede ser" un 6502 a 1MHz equivale a bulto a un z80 a 3MHz.
En cierto modo el 6502 es RISC y el z80 CISC . "En cierto modo" ojo, no digo que sea así.
Ya has explicado lo de la pipeline.

"Pocos registros de programción" el 6502 tiene 256 registros, toda la página 0 se puede usar como registro, puntero, direccionamiento indirecto, preindexado, post indexado... Una lectura simple induce a pensar que tiene 4 de 8 bits A, X, Y y Sp pero no es así. Es otra filosofía a los Intel/zilog si los usas "pensando Intel" no les vas a sacar partido.
Cuando empecé a usar los Intel me faltaban registros acostumbrado a tener 256


Yo por ser purista usaría un 6550 y no un 68xx y PPIs ni una, PIAs, 6520, 6522 o en todo caso RIOT 6532
 
Última edición:
Muy buen punto con la mencion de la pagina cero como 256 registros pero en el interior solo lleva pocos registros, sera cuestion de acostumbrarse a manejar esa pagina externa como si fueran los 256 registros con tanta facilidad, vaya en mi alacena solo tenia MOS 6502 osea tendre que hecharlos a andar a 1Mhz hasta que encuentre por alli un 65C02 o me agencie de un WDC 65C816 , revisando mas de este ultimo chip mejorado a 16 bits su frecuencia de trabajo era de 14 Mhz , vaya a esa velocidad quizas ya superaria a un 8088 de 10 Mhz o a un 68000 de 12 mhz en potencia de calculo no?,
Buscando entre mis chips me encontre tambien un par de VIA 6522 que podria tambien adjuntarlo en el circuito como alternativo al PPI 8255 del cual tengo muchos mas a la mano, tambien tenia un ACIA 6551 pero creo que preferire usar el 68B50 como en el diseño de la imagen y ahora que ya lo conozco mejor con el modulo del Z80,

En una parte sobre la historia del 6502 previamente se habia diseñado el 6501 que era un reemplazo directo del 6800 mejorado y costaba muchismo menos creo que 20 dolares respecto a los 150 dolares del 6800 por lo que les entablaron una demanda los de motorola por plagiarles el chip y a raiz de ello nacio el 6502 donde tuvieron que colocarles los pines en otro orden para evitarse mas conflictos legales, se mencionaba que de cada 10 unidades del 6501 fabricadas le salian 7 defectuosos y solo 3 buenos y con el 6502 se revirtio la relacion a 7 buenos y seguian vendiendose a precios economicos de 20 a 25 dolares que obligo a la competencia a reducir el precio de sus costos micros , despues decia creo el mismo diseñador que tomaba los chips defectuosos y experimentaba overcloqueandolos hasta 10 mhz y el chip respondia !! entonces porque tenian que trabajar solo a 1 o 2 mhz los 6502? o ese experimento lo haria mucho despues de ya estar standarizado todo el funcionamiento en esas PCS de la epoca a esas velocidades de 1 y 2 mhz o tambien que el hardware de apoyo de ese entonces tampoco podria correr a mas de un par de Mhz .

Scooter cual es ese micro 6550? es alguna version mejorada del 6502 con mas caracteristicas y velocidad?
 
Un poco de nociones del 6502 como para ir habituandonos o refrescarnos la memoria tambien

EL 6502

El Microprocesador 6502 corresponde a la serie 6500, que forma una familia de microprocesadores compuesta por diez modelos diferentes, fabricados en tecnología NMOS y procesan palabras de 8 bits.
La familia de microprocesadores fue desarrollada en 1975 por un grupo de ingenieros que formaron una nueva compañia llamada Mos Technology. Actualmente esta familia es fabricada Rockwel International y Sinertek, constituyendo éste microprocesador de 8 bits el alma de muchos ordenadores personales (Apple, Commodore, Atari...).
El 6502, junto con el 6512 dispone de 40 patilas mientras que los demás miembros cuentan con 28.
Desde 1983 se encuentra disponible una versión del 6502 en tecnología CMOS con un consumo más reducido y un juego de instrucciones más amplio.

post-7456-0-52371000-1334371541.gif

Las caracteristicas más notables son:

-Alimentación única de +5 voltios.
-Procesamiento paralelo de palabras o datos de 8 bits.
-Juego de 56 instrucciones.
-13 modos de direccionamiento para las instrucciones.
-Aritmética binaria y decimal.
-Stack Pointer programable de 8 bits.
-Interrupciones mascarables y no mascarables.
-Generador interno de señales de reloj.
-Capacidad de direccionamiento de memoria de hasta 64K.
-Frecuencia de trabajo de 1 y 2 Mhz; Ciclo de máquina de 1us o 500 ns.
-La instruccion más rápida es de dos ciclos de máquina y la más lenta es de siete.
-Pueden usarse con cualquier tipo y velocidad de memoria.
-La estabilización del reloj interno puede efectuarse mediante cristal o por una sencilla red R-C.


El modelo de programacion del 6502
Registros 6502.JPG


ACUMULADOR
Es un registro de 8 bits, es el registro principal de trabajo que proporciona a la ALU uno de los operandos para las operaciones aritmeticas y logicas luego el resultado se puede guardar en la memoria.

REGISTRO X
El registro mas usado comúnmente. Se emplea para saltos, leery grabar en memoria valores, no puede hacer operaciones lógicas, pero sí se puede sumar y restar unidades,se emplea como contador de bucles o direccionamientos indexados muy util en tablas.

REGISTRO Y

Es como el REGISTRO X

CONTADOR DE PROGRAMA PC (Program Counter)

Lo forman dos registros de 8 bits. PCL y PCH que conforman un bus de direcciones de 16 bits con el que se puede acceder a 64K de memoria , a travez de el se va accediendo a la memoria de programa secuencialmente para ir recogiendo las instrucciones y sean ejecutadas en el siguiente paso, tambien nos permite saltar a otros puntos del programa o a subrutinas.

STACK POINTER o PUNTERO DE PILA

La PILA del 6502, es un registro apuntador que señala la ubicacion de una dirección almacenada para retornar a su cauce del programa principal despues de atender una subrutina o interrupcion, laa PILA, o STACK empieza a contar desde el número más alto (FFh) y va descendiendo .La pila la manejamos únicamente con cuatro instrucciones: PHA, PHP y PLA, PLP.
Y los datos se guardan desde la dirección 01FF a la 0100 .El 6502 permite guardar 256 pilas de 256 posiciones pero inicialmente está en el segundo bloque de 256 encima de la página cero.

REGISTRO P o REGISTRO DE ESTADO

Se trata de un registro de 8 bits, 7 de los cuales son significativos y sirven para señalar una situación provocada en la ejecución de la instrucción que se acaba de realizar.
Los bits del registro de estados, según el nivel lógico al que se encuentren, significan lo siguiente:

Microprocesador


N- flag de signo:cuando se utiliza una aritmetica con signo, este viene indicado por el 8° bit. El bit N representa el signo del resultado de la operación realizada
(1=negativo; 0=positivo). Su interpretación tiene mucha importancia para el tratamiento de los resultados.

V- flag de sobrepasamiento (overflow):cuando se utiliza el 8° bit como signo, conviene saber si se produce acarreo en el 7°(el de más peso), porque esta situación afecta a aquel y puede originar resultados erroneos.

B- flag de Break: esta bandera se pone a 1 cuando la interrupción mascarable admitida por la CPU ha sido provocada por software, mediante la instrucción
BRK. si la interrupción ha sido provocada por hardware(activando desde el exterior la linea IRQ), el bit B presenta un nivel 0.

D- flag para el tratamiento aritmetico: puesto a 1 la ALU realiza las operaciones en decimal o BCD, puesto a 0 realiza las operaciones en binario o hexadecimal.

I- flag de enmascaramiento de interrupciones:La petición de interrupción IRQ (solo se admite y se ejecuta cuando el flag I esta a 0, poner el flag I a 1 supone la no aceptación de la petición de interrupción IRQ.

Z- flag de cero:Se pone en 1 cuando el resultado de la operación anterior ha sido cero.

C- flag de acarreo: si no se emplea el bit de signo, C pasa a 1 cuando hay un acarreo en el 8° bit, es decir, cuando el valor de la operación en curso sobrepasa el valor FF en binario o 99 en decimal.
 

Adjuntos

  • 1601448090496.png
    1601448090496.png
    18 KB · Visitas: 6
Es que si no usas la página 0 a conciencia no puedes hacer nada.
En este microprocesador no se puede usar la pila intensivamente, porque pierdes tiempo y porque es muy pequeña, solo 256 bytes.
La gracia es desplegar los registros y punteros en la página 0.
Cuando empecé a usar el 8085 quemaba los registros en un santiamén y entonces pila que va pila que viene y es un follonazo y muy incómodo. Que si desborda y pisa algo, que si no hago el metesaca en orden etc.


6550 que yo sepa es una uart a lo mejor era 6551 lo puse de.memoria. 68xx son periféricos de Motorola, 65xx de Rockwell.
Los buses motorola-rockwell son diferentes a los intel-zilog, se pueden adaptar las señales pero ciertos periféricos serán complicados. Los intel-zilog tienen mapa de IO aparte de la memoria y los motorola-rockwell no.


Los MHz, pues está clarísimo, puede que el micro admita 10MHz, pero lo admite el resto, memoria, periféricos... Te tienes que adaptar al más lento, y si oficialmente era 1, tenías que ir probando a ver si el tuyo iba a 3 o no y eso en una producción en serie no se puede hacer, un aficionado si.

Los ordenadores de 8 bits son muy complicados de overclokear porque del reloj del sistema penden los sincronismo a de video y muchas otras cosas, si tocas el oscilador se cae todo. Aparte de que ningún software está adaptado.
 
Última edición:
Scooter nos tendra que enseñar mas de como usar la pagina cero cuando lleguemos a la parte de los ejercicios de programacion (que tambien quiero aprender de eso) despues de completar el hardware , con el Z80 casi senti tambien la necesidad de querer mas registros mientras programaba ,pero tiene mas facilidades respecto al 8085 con sus registros indexados y ese duplicado de registros para respaldos rapidos al entrar a alguna interrupcion o subrutina , me parece que una de las razones por las que el Z80 consume mas ciclos respecto al 6502 puede ser el refrescado de las memorias RAM dinamicas que tienen que soltar en el bus esas señales, los diseñadores del Z80 le hubieran agregado una instruccion o un pin fisico para descativarlo en caso de querer usar memoria estatica y prescindir del refrescado.

Ya me extrañaba que no encontraba que micro era ese 6550, yo tambien por alli habia cometido un error al mencionar al USART de intel y le puse 8051 (que es el uC) en lugar de 8251 jeje, sobre el overcloquear microprocesadores he leido que para las computadoras que usaban el 6502 el overcloqkin no era elevarle la frecuencia a todo el sistema sino mas bien colocarle una tarjeta en el zocalo del micro con otro micro mejorado y mas veloz como W65C818S pero sin afectar el resto del hardware que seguiria corriendo al mismo ritmo de 1 Mhz pero con esa adicion el nucleo ya procesaba mucho mejor mas rapido , vaya algo asi se nesesitaba para el 8088 que para las operaciones mas largas se tomaba como 90 ciclos de reloj y con algun reemplazo corriendo a 20 mhz y mejorado los ciclos lehubieran bajado esos tiempos excesivos.
Aun asi ahora que montemos el circuito minimo con 6502 que funcionara a 1 o 2 mhz tal como esta en el diagrama, me tienta elevarle el clock desde 4 a 6 MHz para ver si se suelta como dice esa leyenda de que corrio hasta los 10 Mhz , por compromiso con la eeprom , ram y demas perifericos asociados es posible que levante hasta los 6 mhz antes que se atasquen los buses del sistema.
Veo que este micro W65C816S que corre a 14 mhz todavia se vende , vere si puedo conseguirme un par para dentro de unos meses para incorporarlo a las pruebas de este sistema minimo del 6502

WDC W65C816S.jpg
 
Modos de Direccionamiento del 6502

El 6502 tiene 13 modos de direccionamiento o vías de acceso a memoria y El 65C02 tiene dos modos más.

- Immediate
- Absolute
- Zero Page
- Implied
- Indirect Absolute
- Absolute Indexed,X
- Absolute Indexed,Y
- Zero Page Indexed,X
- Zero Page Indexed,Y
- Indexed Indirect
- Indirect Indexed
- Relative
- Accumulator

Immediate (Inmediato)

El valor dado es el que usará inmediatamente la instrucción. Por ejemplo,
LDA #$99 carga el valor $99 en el acumulador.

Absolute (Absoluto)

El valor dado es la direccion de memoria (de 16 bits) que contiene el
valor de 8 bits que debe usar la instrucción. Por ejemplo, STA $3E32
almacena el valor que hay en el acumulador en la dirección $3E32.

Zero Page (Página cero)

Las primeras 256 direcciones de memoria ($0000-00FF) se dice que están en
la “página cero”. Las siguientes 256 ($0100-01FF) están en página 1, etc.
Las instrucciones que usan página cero ahorran memoria ya que no utilizan
el $00 la parte superior (high) de la dirección. Por ejemplo,

LDA $0023 -- funciona pero utiliza un byte extra
LDA $23 -- dirección en página cero

Implied (Implicado)

Hay instrucciones que solo ocupan un byte y no hacen referencia a
memoria. Se dice que estas instrucciones usan dirección implicadao
tácita. Por ejemplo,

CLC -- resetea el carry del processor status
DEX -- decrementa el registro X en 1
TYA -- transfiere el registro Y al acumulador

Indirect Absolute (Absoluto Indirecto)

Sólo es usado por la instrucción JMP (JuMP - salto). Toma la dirección
dada y la usa como un puntero a la parte inferior (low) de una dirección
en memoria, luego hace que el programa salte a esa dirección. Por
ejemplo,

JMP ($2345) ; salta a la dirección cuya parte inferior es el
valor en $2345 y cuya parte superior es el valor en $2346

O sea, si $2345 contiene $EA y $2346 contiene $12 entonces la próxima
instrucción a ejecutar es la que se encentra en $12EA. El 6502 utiliza
las direcciones en formato low/high (parte inferior/parte superior).

Absolute Indexed (Absoluto Indexado)

La dirección final se obtiene tomando la dirección dada como base y
sumando el valor contenido en el registro X o Y como offset. O sea,

LDA $F453,X ; suponiendo que X contiene un 3

Carga el acumulador con el contenido de la dirección $F453 + 3 = $F456.

Zero Page Indexed (Página Cero Indexada)

Es lo mismo que el anterior pero la dirección dada está en la página
cero, ahorrando un byte.

Indexed Indirect (Indexado Indirecto)

La dirección de 16 bits se encuentra comenzando por la dirección dada más
el contenido del registro X. El valor es el contenido de esa dirección.
Por ejemplo,

LDA ($B4,X) ; suponiendo que X contiene un 6

Dada la dirección $B4 + 6 = $BA. Si $BA y $BB contienen $12 y $EE
respectivamente, entonces la dirección final es $EE12. El valor en $EE12
es el que se carga en el acumulador.

Indirect Indexed (Indirecto Indexado)

Se toma la dirección de 16 bits contenida en la dirección dada (y en la
siguiente). Se suma el contenido del registro Y. Se toma el valor
almacenado en esta nueva dirección. Por ejemplo,

LDA ($B4),Y ; suponiendo que Y contiene 6

Si $B4 contiene $EE y $B5 contiene $12 entonces el valor en la dirección
$12EE + Y (6) = $12F4 es la que se almacena en el acumulador.

Relative (Relativo)

El direccionamiento relativo es usado por las instrucciones de salto del
6502. El byte dado se usa como un offset con signo a partir de la
dirección actual y el resultado es la dirección de la próxima instrucción
a ejecutar. Por ejemplo,

BNE $7F (saltar si la bandera “zero” está en reset)

añadirá 127 a la dirección en que se encuentra el PC (program counter) en
ese momento (que es la dirección donde está la instrucción BNE $7F) y
comienza la ejecución de la instrucción contenida en esta nueva
dirección. Similarmente,

BEQ $F9 (saltar si la bandera “zero” está en set)

añadirá -7 a la dirección en que se encuentra el PC en ese momento y
comienza la ejecución de la instrucción contenida en esta nueva
dirección.

Recordemos que si tomamos el bit 7 (el más alto o high) de un byte como
el signo (0= positivo; 1= negativo) entonces es posible tener números en
el rango -128 ($80) a +127 (7F). Si el bit 7 está seteado, o sea si el
número is > $7F, es un salto negativo (hacia atrás en el programa). Qué
tan lejos es el salto? Si el valor es < $80 (positivo), simplemente es
esa cantidad de bytes. Si el valor es > $7F (negativo) entonces es el
complemento de 2 del valor dado en la dirección negativa.

-Complemento de 2

El complemento de 2 de un número se obtiene intercambiando todos los bits
de 0 -> 1 y de 1 -> 0, y luego sumando 1. Entonces,

$FF = 1111 1111 <-- original
0000 0000 <-- complemento de 1
+ 1
---------
0000 0001 <-- complemento de 2, por lo tanto $FF = -1

En la práctica, el programador utiliza una etiqueta y el ensamblador se
preocupa por los cálculos. Notar que los saltos de programa solo pueden
ser a direcciones entre -128 y +127 bytes a partir de la dirección
actual. El 6502 no permite saltos a una dirección absoluta.

Accumulator (Acumulador)

Como el direccionamiento implicado, el objeto de la instrucción es el
acumulador y no necesita ser especificado.
 
Cada vez que veo el tema de "paginas de memoria" me acuerdo del hdrmp del SC/MP (scamp) que nos enseñaban en la universidad. El sistema de desarrollo tenía una arquitectura tan bastarda que te hacía parir por que siempre debías saltar de página para hacer un programa medianamente decente (mas de 256 bytes), aparte que se programaba en hexadecimal por lo que había que convertir los opcodes a mano (nooooo....no había ensamblador disponible ni conexión serie/usb).
 
Vaya pesadilla con ese Scamp, ya le di una leida a ese Scamp y una ojeada a su datasheet ,si que esta medio fastidioso con esa organizacion de 16 paginas de 4K , 3 registros indices y sin pila SP, este uP si debe ya estar extinto como encontrarse un 4004 o 8080 para llevarlo al precio de la historia jeje, por alli he visto en youtube a algunos entusiastas construir sus sistemas minimos con puros interruptores y leds , como 30 interruptores para ingresar direcciones y datos y otros 30 leds para visualizar todo hecho en una caja pequeña y traduciendo a lapiz y papel los codigos en binario a ingresar.

Bueno para comenzar con la traduccion del codigo del bootloader del Z80 a codigo del 6502 requeria de algun ensamblador sencillo y practico que no me de complicaciones o dolores de cabeza en instalarlo y configurarlo como ese Visual studio code que me parecio algo engorroso ,asi que buscando me parece haber encontrado uno sencillo llamado "6502 Macroassembler & Simulator" que no requiere instalacion y funciona en mi windows 7 de 64 bits, otros programas mas antiguos estan requiriendo de una version de windows de 32 y tuve que descartarlos , creo que ya casi todos tenemos instaladas versiones de 64 bits nomas en nuestras PCs.

Desplegando las ventanas de esta aplicacion se ve que tiene esta apariencia de la imagen (permite cambiar los colores) , los archivos en assembler tienen la extencion *.65s y cuando lo ensamblas tienes que darle salvar code para que recien te guarde el archivo resultante en extension *.65h (h de hexadecimal) y al revisar el archivofinal pues esta en el formato intel-hex asi que para que los reconozcan los programadores como el TL866 habria que cambiarle la extension a *.hex, pero para el caso de enviarselo por el hyperterminal a la placa minima 6502 no habria inconveniente alguno.

He subido el programa en adjuntos para que lo podais revisar y probar
Simulador6502.jpg
 

Adjuntos

  • 6502_1.2.11.rar
    1.2 MB · Visitas: 16
Si es macroensamblador, lo primero que haría es programarme unas macros con los opcodes "que me faltan" por ejemplo los saltos largos.

Es decir algo así:
Bla bla bla programa
Beq etiqueta ; Salta si igual

Si el salto a etiqueta es muy largo no irá y dará error

Yo definiría la macro:
Macro LBEQ etiqueta ; definición de long BEQ
BNE sigue ; si no es igual continúa
JMP etiqueta ; si si que es igual salto largo absoluto
Sigue:
Endmacro

Es decir, si la no es igual sigo y si si que es igual hago un salto largo.

Esto se escribe igual cuando programas
En lugar de
BEQ etiqueta
Escribes
LBEQ etiqueta
Y seguro que llega.

Eso sí, del código no es reubicable como pasa con los saltos cortos, pero da lo mismo, lo reensamblas y ya está.

Esos macros me los hice para el 8052 con todas las condiciones en las que había que chequear dos flaca del registro de estado etc, así hice salto si igual, salto si mayor, salto si menor, salto si distinto, si mayor e igual, si menor o igual...
Eso normalmente se hace leyendo yos flags y es incómodo cada vez.

Si ya eres un sibarita se puede poner ensamblado condicional en la definición del macro. A el salto corto llega, pone solo la instrucción simple, y si no llega, la larga. Así ya siempre pones tu macro y no la instrucción de salto original.


Este sistema se puede aplicar a cualquier microprocesador. Hace el ensamblador mucho más amigable.
 
Se me dio por comprobar aquella mencion de uno de los ingenieros que diseño el 6502 de MOS que probando las unidades defectuosas le inyecto 10 Mhz y lo hizo correr ( ya suena a leyenda) , asi que me arme de paciencia para comprobarlo o ver que resultaba con los chips que tenia en mi alacena , tenia 2 chips de MOS , uno de Rockwell y otro de otra marca que estaba inoperativo, despues de las pruebas sin intrumentacion como osciloscopios a mi alcanze me encontre con estos resultados no tan concluyentes pero extraños...

En la siguiente imagen se representa a grandes razgos la conexion del 6502 con los componentes auxiliares , hagase la idea que todos los pines estan conectados a donde corresponden osea la alimentacion a VCC y a GND y las señales tambien como por ejemplo /INT, RDY, /S.O. conectados a VCC, como para que el uP empieze a funcionar con normalidad pero ademas a sus entradas D7...D0 se le a conectado tambien resistencias de 470 ohm tanto a GND como a VCC apropiadamente para proveerle de la instruccion NOP osea "EA" que se requiere para esta prueba, configurandolo de esa manera el 6502 leera continuamente esa instruccion y su bus de direcciones correra de forma continua y ciclica una cuenta binaria de 16 bits despues de darle el reset de partida.
Ambos contadores divisores son los CD4040 , como el bus de direcciones del 6502 es de 16 bits y lo concatenamos al segundo contador CD4040 tomamos la salida Q4 como salida final de referencia, entonces tenemos 16 + 4 = 20 bits que se comportaria como un divisor de 1 millon aproximadamente a su salida donde esta conectada al led final, respecto a la frecuencia de reloj que ingresa al micro se divide entre un millon a la salida final, supongamos que el reloj fuera de 1 Mhz entonces a la salida final encontrariamos una frecuencia de 1 Hz, con ello se puede constatar que el bus de direcciones esta corriendo la cuenta binaria sin perturbarse. si la salida final resultara oscilar con irregularidad osea en un momento oscila bien despues se detiene pasa un tiempo oscila o cambia de estado entonces se deduce que el micro esta a la deriva por la frecuencia muy alta ya no es estable .
prueba con cristal.jpg

Entonces las pruebas que hize son con los cristales que tengo a la mano , unos cristales de 4 pines que contienen un oscilador interno y nos entrega una frecuencia estable . esta salida de reloj es conectada al CD4040 que tiene al lado , notese que la salida Q1 es la que le inyecta los pulsos de reloj al micro osea que le estara ingresando una frecuencia dividia entre 2.
Al colocarle un cristal de 4 MHZ a la salida del contador dividida entre 2 tenemos que le llegan 2 Mhz al 6502 lo cual es recomendable segun su especificacion de funcionamiento, y ademas al 6502 le toma dos ciclos de reloj procesar la instruccion NOP, entonces probando con los diferentes cristales obtube un resultado asi:

- con Oscilador de 4 Mhz le llega frecuencia de 2 Mhz , las direcciones oscilan sin problema y el led final prende y apaga a una velocidad aproximada de casi 1 seg (calculo al ojo)

- con Oscilador de 8 Mhz le llega frecuencia de 4 Mhz , las direcciones oscilan sin problema y el led final prende y apaga a una velocidad aproximada de 1/2 seg

con Oscilador de 10 Mhz le llega frecuencia de 5 Mhz , las direcciones oscilan sin problema y el led final prende y apaga a una velocidad aproximada de casi 1/2 seg

con Oscilador de 20 Mhz le llega frecuencia de 10 Mhz , las direcciones oscilan sin problema y el led final prende y apaga a una velocidad aproximada de 1/4 seg (segun apreciacion empirica)

con esta prueba hay un resultado preliminar de que el chip MOS 6502 si puede estar corriendo a 10 Mhz de frecuencia , su bus de direcciones oscila bien, no se a detenido o parado en seco o confundido para nada.

Hasta aqui parece que si funcionara realmente el 6502 de MOS (mejor que el de rockwell) a esos miticos 10 Mhz mientras que una unidad de Z80 con nomenclatura de 20 Mhz se me colgaba al llegar a los 10 Mhz y me dio a pensar que estaba truqueada la etiqueta en el cuerpo y resultaran ser de menos velocidad de 4 a 6 mhz disfrazados de 20 mhz.

Pues continuando con la siguiente prueba que equivale practicamente a conectarle la salida del chip cristal oscilador al 6502 , o bien directa o a travez de un inversor para ver su comportamiento. esa conexion quedaria como se muestra en la imagen siguiente

prueba con inversor.jpg

- con Oscilador de 4 Mhz directa o a travez del inversor, las direcciones oscilan sin problema y el led final prende y apaga a una velocidad aproximada de 1/2 seg

- con Oscilador de 8 Mhz directa o a travez del inversor, las direcciones corrieron erraticamente y se detuvo la cuenta binaria, el led final no respondio

- con Oscilador de 10 Mhz directa o a travez del inversor, el comportamiento fue el mismo que con 8 Mhz , la cuenta binaria perdio el rumbo, led final no prendio o se queda prendido en otras pruebas

- con Oscilador de 20 Mhz no tiene caso probar porque es muy alta la frecuencia para usarla directamente


Asi que es este resultado lo que me deja intrigado, como es que al conectarle un cristal de 20 Mhz a travez del divisor entre 2 y que le llegan 10 Mhz al micro este funciona aparentemente bien con su cuenta binaria constante comprobada en el led final que oscila perdiodicamente pero en cambio cuando tomo un cristal de 10 Mhz y se lo coloco directamente sin intermediarios y despues con un inversor o dos por si la señal estuviera debil se obtiene como resultado que el micro termina confundido y se pierde la cuenta binaria o se queda congelado, que curioso no?

Algo que parece bueno de esta prueba es que si un 6502 corriendo a 1 Mhz era equiparable a un Z80 de 3 Mhz sino me equivoco , entonces imagineselo corriendo a 4 o 5 Mhz de forma estable entonces seria equivalente a un Z80 de 12 Mhz no?
Bueno las pruebas de fuego de este overclocking al 6502 las comprobare mas rigurosamente cuando lo vea corriendo un programa completo como un secuencial de leds y no solo una unica instruccion NOP a esas velocidades de prueba y a travez de ese divisor de frecuencia.
 
Continuando con el diseño del Sistema minimo 6502 le he tenido que hacer algunas modificaciones a las especificaciones que serian como se muestran a continuacion.

Especificaciones

28K EEPROM (usamos un chip 28C256 sacrificando 4 K)
32K RAM
PPI 8255 o VIA 6522 o RIOT 6532
ACIA 68B50
CPU 6502 corriendo a 1.8432MHz con crystal (probaremos hacerlo funcionar de 4 a 6 Mhz)
57, 600 Baudios seriales con interface a modulo USB

Mapa de Memoria

0000-7FFF 32K RAM 62C256
8000-8FFF Perifericos (ventana en donde se ubican los Modulos)
9000-FFFF 28K EEPROM 28C256 (no se utilizan los primeros 4 K)

Mapa de Modulos

8200-82FF PPI , VIA o RIOT
8300-83FF SERIAL 68B50
8400-84FF MODULO
8500-85FF MODULO
8600-86FF MODULO

Como se vera se a dividido el mapeo de la memoria en 2 grandes porciones una para los 32K de RAM y otra gran porcion para la Eeprom donde residiria el bootloader y otros programas hasta la capacidad de 28K , se deja una pequeña éntre la RAM y la Eeprom que es de un tamaño de 4K , es en ese espacio de 4 k donde se mapearan todos los modulos perifericos , claro que no se llegan a utilizar los 4k pero esa region queda reservada y a continuacion de ella comienza la memoria EEprom.

La siguiente imagen muestra como van alineadas las señales de los zocalos para la tarjeta principal , el conector y la tarjeta de Perifericos, en este caso las señales para los zocalos de la RAM y Eeprom son iguales que para el sistema minimo de Z80 asi que en ese sentido son compatibles de usar esas mismas tarjetas teniendo cuidado de seleccionar los jumper en la posicion conveniente.
Las señales del zocalo de conexion a la tarjeta de expansion ya no es compatible con la del sistema preparado para Z80 por lo mismo la tarjeta de expansion cuenta con mas señales que la tarjeta de expansion del Z80 esto por motivo de poder alojar los chips VIA y RIOT que requieren de mas señales del bus de direcciones elevando el numero de señales hasta los 36 pines, espero poder usar este mismo diseño ya para el sistema minimo con el 68B09 tambien con el 68008.

mapa de memoria 6502.jpg

En tiendas chinas se vende un microprocesador de codigo W65C02S8P -10 que por la datasheet es una version mejorada del 6502 a 10 Mhz pero muchos de los compradores se han dado cuenta que estan vendiendose chips reetiquetados y que son simples R6502 , estoy chinos si que son unos bribones con estos chips clasicos de alli de la desconfianza tambien de que el Z80 de 20 Mhz realmente es solo un chip de 6 u 8 Mhz jeje, Bueno aun asi en cuanto me consiga esos chips de codigo W65C02SP o su otra version evolucionada de 16 bits de codigo W65C816S tambien los probare en esta tarjeta minima.
 
Practicamente ya esta lista la placa principal para el sistema minimo con 6502 , que alojara al micro, su circuito de reloj que contempla usar un circuito oscilador de cristal con compuertas inversoras o de frente un oscilador integrado en chip de 4 pines , ademas de los dos zocalos para alojar a la memoria RAM 62C256 y a la EEprom 28C256 que son los mismos modulos para el modulo del Z80, los buses a la tarjeta de expansion y las señales de la misma ya son mas ampliadas por lo tanto los modulos tendran otro formato no compatible con los modulos para el Z80.

imagen de circuito principal.jpg
 
Ya me llegaron los microcontroladores w65c816s que encargue , bueno tuve que adquirir un lote de 5 unidades porque asi lo vendian por lote, como tenia aun armado en protoboard un circuito para el 6502 pude probarlos y parece que estan funcionando al menos en la simple prueba de correr libremente con la instruccion NOP mientras el bus de direciones avanza su cuenta binaria, bueno solo lo probe a velocidad lenta no a los 14 Mhz a los que dice que corre , aunque uno de los chips que me llego estaba con rastros de soldadura en sus pines mientras que otros estaban en mejor estado pero igual a funcionado y es lo que interesa , algunos compradores se quejaban de que todos eran de segunda por el estado de sus pines.
Este chip w65c816s tiene señales adicionales respecto al clasico 6502 que las tiene marcadas como NC y parece que su bus de datos tienen mas actividad tambien porque con el 6502 las señales de la instruccion NOP que era "EA" le llegaban transparentemente y probadas con mi punta logica en cambio en el w65c816s la instruccion NOP era leida pero tambien estaba presente señales de ceros alternandose con lo que se deduce que ese bus es muy activo quizas se esta enviando alguna señales que deben ser multiplexadas , sera cuestion de leer su datasheet con mas detenimiento pero bueno esos chips estan respondiendo bien asi que por esta vez no hay quejas para los chinos pero si en otro chip que les compre.

IMG_20201104_121632046.jpg

Bueno tambien ya se avanzo con el Slot que acompaña a la tarjeta principal del 6502 y se veria asi la version final , creo que para conectarle un w65c816s tendria dos alternativas o acondicionarlo una pequeña tarjetita para insertarlo en el zocalo de 40 pines o quizas tener que rediseñarle una placa principal , el slot y modulos seguirian siendo compatibles sin problema . 1604511529269.png
 

Adjuntos

  • IMG_20201104_121632046.jpg
    IMG_20201104_121632046.jpg
    302.6 KB · Visitas: 2
Hola quisiera saber si ustedes tienen en su poder un manual de programación del R6502, yo encontré algo en Internet pero la verdad no le entiendo entre NADA y muy poco.

Hasta ahorita ando haciendo experimentos con la programación del Atari 2600.

Lo que quiero hacer es saber como el chip TIA genera vídeo y audio para poderlo usar en mi computadora casera, pude generar audio, generar líneas y algo de texto.

El programa de Atari 2600 lo hago con Notepad++ para editar el código y DASM para compilar.

Mi idea es reciclar el chip de vídeo llamado TIA (televisión interfaz adaptor) y usarlo en un Z80.

No es que sea un asesino de consolas retro, lo que pasa es que el chip RIOT (RAM, TIMER, INPUT OUTPUT) está dañado y no funciona, extraje el TIA , lo conecte a un pic18f4550 y funciona correctamente.

Quisiera que alguien me oriente con documentación y ejemplos en ASM del 6502 por que en Internet me hago bolas y la verdad no le estoy entendiendo mucho

esto es lo que llevo hecho con el TIA.
playfield.pngsprite.png
 
Atrás
Arriba