MOS 6510
De Wikipedia, la enciclopedia libre
El microprocesador MOS 6510 diseñado por MOS Technology, Inc. es sucesor del 6502 A diferencia del 6502 a éste se le añadió un puerto entrada/salida de 8 bits.
El 6510 solamente fue utilizado en la computadora personal Commodore 64. Era posible, escribiendo la configuración correcta de bits en la dirección $01, exponer totalmente los 64K de RAM en la C64 sin dejar expuesta a la ROM o al hardware de E/S.
Tabla de contenidos |
[editar] Variantes
En 1985 MOS produjo los 8500, una versión de HMOS de los 6510. Con excepción del cambio de proceso, es virtualmente idéntica a la versión del NMOS 6510. Los 8500 fueron diseñados originalmente para el uso en la C64 modernizado (la C64C). Sin embargo en 1985, las cantidades limitadas de 8500s fueron encontrados en unas C64s basadas en NMOS más viejos. Finalmente se lanzaron en 1987, apareciendo en una placa base usando el nuevo chipset de 85xx HMOS.
La variante de 7501/8501 de los 6510 fue utilizada en los ordenadores personales C16, C116 y Plus/4, y la variante Megaciclo-capaz 2 8502 fue utilizada en la C128. Todas estas CPU son opcode compatibles ( incluyendoopcodes indocumentados, excepto los 8502, donde algunas diferencias referentes a los opcodes indocumentados se han divulgado). El accionamiento 1551 de disco de la Commodore utilizó el 6510T, una versión de los 6510 con ocho líneas de E/S. Las señales de NMI y de RDY no están disponibles.
[editar] Componentes
Program Counter: Elemento que una vez proporcionada la primera instrucción, basta que sea incrementado en una unidad para que proporcione la dirección de la segunda instrucción.
Registros índices X e Y: Sirven para llevar a cabo un modo de direccionado, denominado indexado con el que la localización del operando de una instrucción se busca en la MEM añadiendo el contenido de estos registros a la dirección especificada en la instrucción.
Registro de Estados: Registro de 8 bits, 7 son significativos y sirven para señalar una situación provocada en la ejecución que se acaba de realizar.
Stack Pointer: Se trata de un contador programable que direcciona la página 1 de la MEM como si se tratase de una pila LIFO. Para simplificar la localización de las posiciones de MEM se lee la estructura en forma de páginas, cada una de las cuales consta de varias líneas o posiciones. Así, una MEM de 64K posiciones, se puede dividir en 256 páginas de 256 líneas cada una.
Bus de direcciones: Comprende las 16 líneas del bus de direcciones, de carácter unidireccional.
Bus de Datos: Consta de 8 líneas bidireccionales, por las que se transfieren los datos y las instrucciones, en sus salidas hay buffers amplificadores capaces de soportar una carga.
[editar] Características y Mnemotécnicos
A partir de un código creado en C para emular el funcionamiento se obtiene:
Definiendo los tipos word de tamaño de 16 bits (2 bytes) y byte (8 bits) Un struct cpu:
word cpu.PC, cpu.MAR byte cpu.A, cpu.X, cpu.Y, cpu.IR, cpu.SP, cpu.MBR, cpu.FLAGS
funciones "void":
memoria() cmp() fetch_dato() cpx() fetch_codigo() cpy() poner_dato() dec() fetch_dir() eor() carry() inc() negative() lsr() zero() pop() overflow() push() adc() rol() and() ror() asl() sbc() brach() cilco_ejec()
El switch (cpu.IR) contendrá 85 opcodes (codop) de los 256 disponibles (0..255) ya que solo hay definidos 151 de ellos y se utilizan 105.
Los cases del swich son los siguientes y a cada uno le corresponde un opcode:
ADC 0x69 0x6D 0x7D 0x69 PHA 0x48 AND 0x29 0x2d 0x3D 0x39 PHP 0x08 ASL 0x0A 0x0E 0x1E PLA 0x68 Branch 0x90 0xB0 0xF0 0x30 0xD0 0x10 PLP 0x28 Clear 0x18 0xB8 ROL 0x2A 0x2E 0x3E CMP 0xC9 0xCD 0xDD 0xD9 0xE0 0xEC 0xC0 0xCC ROR 0x6A 0x6E 0x7E DEC 0xCE 0xDE 0xCA 0x88 SBC 0xE9 0xED 0xFD 0xF9 DEX DEY 0xCA 0x88 SEC 0x38 0xF8 0x78 EOR 0x49 0x4D 0x5D 0x59 STA 0x8D 0x9D 0x99 INC 0xEE 0xFE STX STY 0x8E 0x8C INX INY 0xE8 0xC8 TAX TAY 0xAA 0xA8 JMP 0x4C TXA TYA 0x8A 0x98 JSR 0x20 TXS TSX 0x9A 0xBA LDX 0xA2 0xAE 0xBE LDA 0xA9 0xAD 0xBD 0xB9 LDY 0xA0 0xAC 0xBC LSR 0x4A 0x4E 0x5E ORA 0x09 0x0D 0x1D 0x19 RTS 0x60
Se definieron banderas como constantes:
NFLAG 0x80 10000000 Bandera de negativo VFLAG 0x40 01000000 Bandera de overflow DFLAG 0x08 00001000 Bandera de modo decimal IFLAG 0x04 00000100 Bandera de interrupt VFLAG 0x02 00000010 Bandera de cero CFLAG 0x01 00000001 Bandera de carry