El Motorola 68000 (a veces abreviado como Motorola 68k o m68k y generalmente pronunciado "sesenta y ocho mil") [2] [3] es un microprocesador de computadora con conjunto de instrucciones complejas (CISC) de 16/32 bits , introducido en 1979 por Motorola Semiconductor . Sector Productos.
El diseño implementa un conjunto de instrucciones de 32 bits , con registros de 32 bits y un bus de datos interno de 16 bits . [4] El bus de direcciones es de 24 bits y no utiliza segmentación de memoria , lo que facilitó la programación. Internamente, utiliza una unidad lógica aritmética (ALU) de datos de 16 bits y dos ALU más de 16 bits utilizadas principalmente para direcciones, [4] y tiene un bus de datos externo de 16 bits . [5] Por esta razón, Motorola lo denominó procesador de 16/32 bits.
Como uno de los primeros procesadores ampliamente disponibles con un conjunto de instrucciones de 32 bits, un gran espacio de direcciones no segmentadas y una velocidad relativamente alta para la época, el 68k fue un diseño popular durante la década de 1980. Fue ampliamente utilizado en una nueva generación de computadoras personales con interfaces gráficas de usuario , incluidas Macintosh 128K , Commodore Amiga , Atari ST y Sharp X68000 . La consola Sega Genesis/Mega Drive de 1988 funciona con un 68000.
Los procesadores posteriores de la serie Motorola 68000 , comenzando con el Motorola 68020 , utilizan ALU completas de 32 bits y tienen buses de datos y direcciones completos de 32 bits, lo que acelera las operaciones de 32 bits y permite un direccionamiento completo de 32 bits en lugar de 24 bits. direccionamiento del 68000 y Motorola 68010 o el direccionamiento de 31 bits del Motorola 68012 . El 68k original es generalmente compatible con el software del resto de la línea a pesar de estar limitado a un bus externo de 16 bits de ancho. [4]
Después de 45 años en producción , la arquitectura 68000 todavía está en uso. [6] [7]
El primer microprocesador de Motorola producido ampliamente fue el 6800 , presentado a principios de 1974 y disponible en grandes cantidades a finales de ese año. [8] La empresa se fijó el objetivo de vender 25.000 unidades en septiembre de 1976, objetivo que cumplió. Aunque era un diseño capaz, fue eclipsado por diseños más potentes, como el Zilog Z80 , y diseños menos costosos, como el MOS Technology 6502 . [9] A finales de 1976, la cartera de ventas estaba estable y la división sólo se salvó gracias a un proyecto para General Motors que se convirtió en una enorme línea de productos para el control de motores y otras tareas. [10]
Cuando se introdujo el 6800, ya había llegado al mercado una pequeña cantidad de diseños de 16 bits. Estos generalmente se modelaron en plataformas de minicomputadoras como Data General Nova o PDP-8 . Basados en los procesos de fabricación de semiconductores de la época, a menudo se trataba de soluciones de múltiples chips como el National Semiconductor IMP-16 o el PACE de un solo chip que tenía problemas de velocidad. [11]
Con las perspectivas de ventas para el 6800 decayendo, pero aún con dinero en efectivo proveniente de las ventas de controles de motor, a finales de 1976 Colin Crook, Gerente de Operaciones, comenzó a considerar cómo ganar con éxito ventas futuras. Sabían que Intel estaba trabajando en una extensión de 16 bits de su serie 8080 , que surgiría como Intel 8086 , y habían oído rumores sobre un Zilog Z80 de 16 bits , que se convertiría en el Z8000 . Estos utilizarían nuevas técnicas de diseño que eliminarían los problemas observados en sistemas anteriores de 16 bits. [12]
Motorola sabía que si lanzaban un producto similar al 8086, dentro del 10% de sus capacidades, Intel los acabaría en el mercado. Para competir, se fijaron el objetivo de ser dos veces más potentes al mismo coste, o la mitad con el mismo rendimiento. Crook decidió que atacarían la gama alta del mercado con el procesador más potente del mercado. [12] Otro de 16 bits no serviría, su diseño tendría que ser más grande, y eso significaba tener algunas características de 32 bits. [13] Crook había decidido adoptar este enfoque a finales de 1976. [12]
Crook formó el proyecto Motorola Advanced Computer System on Silicon (MACSS) para construir el diseño y contrató a Tom Gunter como su arquitecto principal. Gunter comenzó a formar su equipo en enero de 1977. [14] El objetivo de rendimiento se fijó en 1 millón de instrucciones por segundo (MIPS). Querían que el diseño no sólo recuperara a proveedores de microcomputadoras como Apple Computer y Tandy , sino también a compañías de minicomputadoras como NCR y AT&T . [14]
El equipo decidió abandonar el intento de compatibilidad con versiones anteriores del 6800, ya que sentían que los diseños de 8 bits eran demasiado limitados para ser la base de nuevos diseños. El nuevo sistema fue influenciado por el PDP-11 , el diseño de minicomputadora más popular de la época. [15] En ese momento, un concepto clave en minis era el concepto de un conjunto de instrucciones ortogonales , en el que cada operación podía funcionar con cualquier tipo de datos. Para introducir los datos correctos en las unidades internas, MACSS hizo un uso extensivo de microcódigo , esencialmente pequeños programas en memoria de solo lectura que reunían los datos requeridos, realizaban las operaciones y escribían los resultados. MACSS fue uno de los primeros en utilizar esta técnica en un microprocesador. [16] [17]
Había una gran cantidad de hardware de soporte para el 6800 que seguiría siendo útil, como UART y sistemas de interfaz similares. Por esta razón, el nuevo diseño conservó un modo de compatibilidad de protocolo de bus para los dispositivos periféricos 6800 existentes. [18] [17]
Un chip con 32 pines de datos y 32 de direccionamiento requeriría 64 pines, y más para alimentación y otras funciones. En ese momento, los paquetes en línea dual (DIP) de 64 pines eran sistemas "grandes, costosos" y "simplemente terribles", lo que los convertía en los más grandes que podían considerar. Para adaptarlo, Crook seleccionó un diseño híbrido, con una arquitectura de conjunto de instrucciones (ISA) de 32 bits pero componentes de 16 bits que la implementan, como la unidad lógica aritmética (ALU). [14] La interfaz externa se redujo a 16 pines de datos y 24 para direcciones, lo que permite que todo quepa en un paquete de 64 pines. Esto se conoció como la "Cucaracha de Texas". [13] [un]
A mediados de la década de 1970, las técnicas de diseño MOS de Motorola se habían vuelto menos avanzadas que las de su competencia, y sus líneas de fabricación en ocasiones luchaban con bajos rendimientos. A finales de la década de 1970, la empresa había iniciado un programa de intercambio de tecnología con Hitachi , mejorando drásticamente sus capacidades de producción. Como parte de esto, se construyó una nueva fábrica, MOS-8, utilizando los últimos tamaños de oblea de 5 pulgadas y el proceso HMOS de Intel con un tamaño de característica de 3,5 µm . [19] Esta fue una inversión destinada a atrapar a la competencia: incluso las nuevas empresas de semiconductores como Zilog y MOS Technology habían introducido CPU fabricadas con lógica NMOS en modo de agotamiento antes que Motorola. De hecho, es posible que Motorola se haya quedado sustancialmente rezagado con respecto a sus contemporáneos en la eliminación gradual del modo de mejora y la puerta metálica, y el director de productos de la serie 68k, Tom Gunter, recordó que el 68000 tuvo que tener éxito a pesar de adoptar inicialmente un diseño de puerta metálica. [20] Aunque el punto sobre ponerse al día es claro, este no podría haber sido un resumen completamente preciso porque las hojas de datos de Motorola de 1976, anteriores al inicio del proyecto MACCS, denotan la mayor parte de su familia 6800 en puerta de silicio. [21] De hecho, el propio artículo de Gunter de 1979 que presentaba el 68000 lo destacó como un diseño HMOS en modo de agotamiento de puerta de silicio. [22] Cualquiera que sea el grado de los déficits de proceso y fabricación de Motorola en los primeros días, el equipo no se inmutó y no se comprometió en su búsqueda de un microprocesador con un rendimiento líder en la industria. [23]
Presentado formalmente en septiembre de 1979, [24] muestras iniciales se lanzaron en febrero de 1980, y los chips de producción estuvieron disponibles sin receta en noviembre. [25] Los grados de velocidad iniciales son 4, 6 y 8 MHz . Los chips de 10 MHz estuvieron disponibles durante 1981, [26] y los chips de 12,5 MHz en junio de 1982. [25] La versión "12F" de 16,67 MHz del MC68000, la versión más rápida del chip HMOS original, no se produjo hasta finales de los años 1980.
A principios de 1981, el 68k estaba logrando múltiples avances en diseño en la gama alta, y Gunter comenzó a acercarse a Apple para ganar su negocio. En ese momento, el 68k se vendía por unos 125 dólares en cantidad. En reuniones con Steve Jobs , Jobs habló sobre el uso del 68k en el Apple Lisa , pero afirmó que "el verdadero futuro está en este producto que estoy haciendo personalmente. Si quieres este negocio, debes comprometerte a venderlo". por 15 dólares." [27] Motorola respondió ofreciendo venderlo a 55 dólares al principio, luego bajarlo a 35 dólares, y así sucesivamente. Jobs estuvo de acuerdo y el Macintosh pasó del 6809 al 68k. El precio medio finalmente alcanzó los 14,76 dólares. [27]
En 1982, el 68000 recibió una actualización menor de su arquitectura de conjunto de instrucciones (ISA) para admitir memoria virtual y cumplir con los requisitos de virtualización de Popek y Goldberg . El chip actualizado se llama 68010 . [28] También agrega un nuevo "modo de bucle" que acelera los bucles pequeños y aumenta el rendimiento general en aproximadamente un 10% a las mismas velocidades de reloj. También se produjo en pequeñas cantidades una versión ampliada adicional, la 68012 , que expone 31 bits del bus de direcciones .
Para admitir sistemas de menor costo y aplicaciones de control con tamaños de memoria más pequeños, Motorola presentó el MC68008 compatible con 8 bits , también en 1982. Este es un 68000 con un bus de datos de 8 bits y un bus de direcciones más pequeño (20 bits). Después de 1982, Motorola dedicó más atención a los proyectos 68020 y 88000 .
Varias otras empresas fueron fabricantes de segunda fuente del HMOS 68000. Entre ellas se encontraban Hitachi (HD68000), que redujo el tamaño de la característica a 2,7 µm para su versión de 12,5 MHz, [25] Mostek (MK68000), Rockwell (R68000), Signetics (SCN68000 ), Thomson / SGS-Thomson (originalmente EF68000 y posteriormente TS68000) y Toshiba (TMP68000). Toshiba también fue un segundo fabricante del CMOS 68HC000 (TMP68HC000).
Las variantes cifradas del 68000, que son Hitachi FD1089 y FD1094, almacenan claves de descifrado para códigos de operación y datos de códigos de operación en una memoria respaldada por batería y se usaron en ciertos sistemas arcade de Sega, incluido el System 16, para prevenir la piratería y los juegos piratas ilegales. [29]
El 68HC000, la primera versión CMOS del 68000, fue diseñado por Hitachi y presentado conjuntamente en 1985. [30] La versión de Motorola se llama MC68HC000, mientras que la de Hitachi es HD68HC000. El 68HC000 ofrece velocidades de 8 a 20 MHz. Excepto por el uso de circuitos CMOS, se comportó de manera idéntica al HMOS MC68000, pero el cambio a CMOS redujo en gran medida su consumo de energía. El HMOS MC68000 original consumía alrededor de 1,35 vatios a una temperatura ambiente de 25 °C , independientemente de la velocidad del reloj, mientras que el MC68HC000 consumía sólo 0,13 vatios a 8 MHz y 0,38 vatios a 20 MHz. (A diferencia de los circuitos CMOS, HMOS todavía consume energía cuando está inactivo, por lo que el consumo de energía varía poco con la frecuencia del reloj). Apple seleccionó el 68HC000 para usarlo en el Macintosh Portable .
Motorola reemplazó el MC68008 con el MC68HC001 en 1990. [31] Este chip se parece al 68HC000 en muchos aspectos, pero su bus de datos puede funcionar en modo de 16 u 8 bits, dependiendo del valor de un pin de entrada en el reinicio. Así, al igual que el 68008, se puede utilizar en sistemas con memorias de 8 bits más económicas.
La evolución posterior del 68000 se centró en aplicaciones de control integradas más modernas y periféricos en chip. El chip 68EC000 y el núcleo SCM68000 eliminan el bus periférico M6800 y excluyen la instrucción MOVE de SR de los programas en modo usuario, lo que convierte a 68EC000 y 68SEC000 en las únicas CPU 68000 que no son 100% compatibles con el código objeto con CPU 68000 anteriores cuando se ejecutan en modo usuario. Cuando se ejecuta en modo supervisor, no hay diferencia. [32] En 1996, Motorola actualizó el núcleo independiente con circuitos totalmente estáticos, consumiendo sólo 2 µW en modo de bajo consumo, llamándolo MC68SEC000. [33]
Motorola cesó la producción del HMOS MC68000, así como del MC68008, MC68010, MC68330 y MC68340 el 1 de junio de 1996, [34] [35] pero su empresa derivada Freescale Semiconductor todavía producía el MC68HC000, MC68HC001, MC68EC000. y MC68SEC000, así como los microcontroladores MC68302 y MC68306 y versiones posteriores de la familia DragonBall . Los descendientes arquitectónicos del 68000, las familias 680x0 , CPU32 y Coldfire , también estaban todavía en producción. Más recientemente, con el cierre fabuloso de Sendai, se descontinuaron todas las piezas 68HC000, 68020, 68030 y 68882, dejando solo el 68SEC000 en producción. [36]
Desde que fue reemplazado por los "verdaderos" microprocesadores de 32 bits, el 68000 se utiliza como núcleo de muchos microcontroladores . En 1989, Motorola presentó el procesador de comunicaciones MC68302 . [37]
IBM consideró el 68000 para IBM PC pero eligió el Intel 8088 ; sin embargo, IBM Instruments vendió brevemente los sistemas informáticos de laboratorio IBM System 9000 basados en 68000. El conjunto de instrucciones de 68k es particularmente adecuado para implementar Unix, [38] y el 68000 y sus sucesores se convirtieron en las CPU dominantes para estaciones de trabajo basadas en Unix , incluidas las estaciones de trabajo Sun y Apollo/Domain .
En 1981, Motorola presentó la placa de computadora educativa Motorola 68000 , una computadora de placa única para fines educativos y de capacitación que, además del 68000, contenía memoria, dispositivos de E/S, temporizador programable y área de cableado para circuitos personalizados. La placa se siguió utilizando en las universidades de EE. UU. como herramienta para aprender a programar en ensamblador hasta principios de la década de 1990. [39]
En su introducción, el 68000 se utilizó por primera vez en sistemas de alto precio, incluidas microcomputadoras multiusuario como la WICAT 150, [40] las primeras computadoras Alpha Microsystems , Sage II/IV , Tandy 6000/ TRS-80 Model 16 y Fortune 32:16. ; estaciones de trabajo de un solo usuario, como los sistemas HP 9000 Serie 200 de Hewlett-Packard , los primeros sistemas Apollo/Domain , el Sun-1 de Sun Microsystems y el Corvus Concept ; y terminales gráficos como VAXstation 100 de Digital Equipment Corporation y IRIS 1000 y 1200 de Silicon Graphics . Los sistemas Unix pasaron rápidamente a las generaciones posteriores más capaces de la línea 68k, que siguió siendo popular en ese mercado durante la década de 1980.
A mediados de la década de 1980, la caída de los costos de producción hizo que el 68000 fuera viable para su uso en computadoras personales , comenzando con Apple Lisa y Macintosh , seguido por Amiga , Atari ST y X68000 .
La microcomputadora Sinclair QL , junto con sus derivados, como la terminal comercial ICL One Per Desk , fue la utilización más importante comercialmente del 68008. Helix Systems (en Missouri, Estados Unidos) diseñó una extensión del bus SWTPC SS-50 . el SS-64 y produjo sistemas construidos alrededor del procesador 68008.
Si bien la adopción de RISC y x86 desplazó a la serie 68000 como CPU de escritorio/estación de trabajo, el procesador encontró un uso sustancial en aplicaciones integradas . A principios de la década de 1990, se podían comprar 68.000 CPU por menos de 30 dólares la pieza. [ cita necesaria ]
El 68000 también tuvo un gran éxito como controlador integrado. Ya en 1981, las impresoras láser como la Imagen Imprint-10 estaban controladas por placas externas equipadas con el 68000. La primera HP LaserJet , introducida en 1984, venía con un 68000 de 8 MHz incorporado. Otros fabricantes de impresoras adoptaron el 68000. incluido Apple con la introducción de LaserWriter en 1985, la primera impresora láser PostScript . El 68000 siguió utilizándose ampliamente en impresoras durante el resto de la década de 1980 y persistió hasta bien entrada la década de 1990 en impresoras de gama baja.
El 68000 tuvo éxito en el campo de los sistemas de control industrial. Entre los sistemas beneficiados por tener un 68000 o derivado como microprocesador se encontraban familias de controladores lógicos programables (PLC) fabricados por Allen-Bradley , Texas Instruments y posteriormente, tras la adquisición de esa división de TI, por Siemens . Los usuarios de tales sistemas no aceptan la obsolescencia del producto al mismo ritmo que los usuarios domésticos, y es muy probable que, a pesar de haber sido instalados hace más de 20 años, muchos controladores basados en 68000 continúen en servicio confiable hasta bien entrado el siglo XXI.
En varios osciloscopios digitales de los años 80, [41] el 68000 se ha utilizado como procesador de visualización de formas de onda; algunos modelos, incluido el LeCroy 9400/9400A [42], también utilizan el 68000 como procesador matemático de formas de onda (incluyendo suma, resta, multiplicación y división de dos formas de onda/referencias/memorias de formas de onda), y algunos osciloscopios digitales que utilizan el 68000 (incluido el 9400/9400A) también puede realizar funciones rápidas de transformada de Fourier en una forma de onda.
Los microcontroladores 683XX , basados en la arquitectura 68000, se utilizan en equipos de telecomunicaciones y redes, decodificadores de televisión, instrumentos médicos y de laboratorio e incluso calculadoras portátiles. El MC68302 y sus derivados se han utilizado en muchos productos de telecomunicaciones de Cisco, 3com, Ascend, Marconi, Cyclades y otros. Los modelos anteriores de Palm PDA y Handspring Visor usaban DragonBall , un derivado del 68000. AlphaSmart usó la familia DragonBall en versiones posteriores de sus procesadores de texto portátiles. Texas Instruments utilizó el 68000 en sus calculadoras gráficas de alta gama, las series TI-89 y TI-92 y Voyage 200 .
Una versión modificada del 68000 formó la base del emulador de hardware IBM XT/370 del procesador System 370.
Los fabricantes de videojuegos utilizaron el 68000 como columna vertebral de muchos juegos arcade y consolas de juegos domésticas : Atari's Food Fight , de 1982, fue uno de los primeros juegos arcade basados en 68000. Otros incluyeron System 16 de Sega , CP System y CPS-2 de Capcom y Neo Geo de SNK . A finales de la década de 1980, el 68000 era lo suficientemente económico como para alimentar consolas de juegos domésticas, como la consola Sega Genesis de Sega y también el accesorio Sega CD (un sistema Sega CD tiene tres CPU, dos de ellas 68000). La consola multiprocesador Atari Jaguar de 1993 utilizó un 68000 como chip de soporte, aunque algunos desarrolladores lo utilizaron como procesador principal debido a su familiaridad. La consola Sega Saturn utilizó el 68000 como coprocesador de sonido. En octubre de 1995, el 68000 se convirtió en una consola de juegos portátil , Genesis Nomad de Sega , como CPU. [43]
Ciertos juegos arcade (como Steel Gunner y otros basados en Namco System 2 ) utilizan una configuración de CPU dual 68000, [44] y también existen sistemas con una configuración de CPU triple 68000 (como Galaxy Force y otros basados en Sega Y Board). , [45] junto con una configuración de CPU cuádruple 68000, que ha sido utilizada por Jaleco (una 68000 para sonido tiene una frecuencia de reloj más baja en comparación con las otras CPU 68000) [46] para juegos como Big Run y Cisco Heat ; otro quinto 68000 (a una frecuencia de reloj diferente a la de las otras CPU 68000) se utilizó en el juego arcade de Jaleco Wild Pilot para el procesamiento de entrada/salida (E/S). [47]
El 68000 tiene un bus de direcciones externo de 24 bits y dos señales de selección de bytes "reemplazadas" por A0. Por tanto, estas 24 líneas pueden direccionar 16 MB de memoria física con resolución de bytes. El almacenamiento y el cálculo de direcciones utilizan 32 bits internamente; sin embargo, los 8 bits de dirección de orden superior se ignoran debido a la falta física de pines del dispositivo. Esto le permite ejecutar software escrito para un espacio de direcciones lógicamente plano de 32 bits , mientras accede solo a un espacio de direcciones físicas de 24 bits. La intención de Motorola con el espacio de direcciones interno de 32 bits era la compatibilidad hacia adelante, lo que hacía factible escribir software 68000 que aprovecharía al máximo las implementaciones posteriores de 32 bits del conjunto de instrucciones 68000. [4]
Sin embargo, esto no impidió que los programadores escribieran software incompatible. El software de "24 bits" que descarta el byte de dirección superior o lo utiliza para fines distintos del direccionamiento podría fallar en implementaciones 68000 de 32 bits. Por ejemplo, las primeras versiones (anteriores a 7.0) del sistema operativo Mac de Apple utilizaban el byte alto de los punteros maestros de bloque de memoria para mantener indicadores como bloqueado y purgable . Las versiones posteriores del sistema operativo trasladaron las banderas a una ubicación cercana y Apple comenzó a enviar computadoras que tenían ROM " limpias de 32 bits " a partir del lanzamiento del Mac IIci de 1989.
La familia 68000 almacena números enteros de varios bytes en la memoria en orden big-endian .
La CPU tiene ocho registros de datos de uso general de 32 bits (D0-D7) y ocho registros de direcciones (A0-A7). El último registro de dirección es el puntero de la pila y los ensambladores aceptan la etiqueta SP como equivalente a A7. En aquel momento se trataba de un buen número de registros en muchos sentidos. Era lo suficientemente pequeño como para permitir que el 68000 respondiera rápidamente a las interrupciones (incluso en el peor de los casos, donde era necesario guardar los 8 registros de datos D0-D7 y los 7 registros de direcciones A0-A6, 15 registros en total) y, sin embargo, lo suficientemente grande para agiliza la mayoría de los cálculos, porque se pueden realizar íntegramente dentro del procesador sin mantener ningún resultado parcial en la memoria. (Tenga en cuenta que una rutina de excepción en modo supervisor también puede guardar el puntero de pila de usuario A7, lo que daría un total de 8 registros de dirección. Sin embargo, el diseño del puntero de pila dual (A7 y modo supervisor A7') del 68000 hace que esto normalmente sea innecesario, excepto cuando se realiza un cambio de tarea en un sistema multitarea).
Tener los dos tipos de registros permite que se realicen al mismo tiempo una dirección de 32 bits y un cálculo de datos de 16 bits. Esto da como resultado un tiempo de ejecución de instrucciones reducido, ya que las direcciones y los datos se pueden procesar en paralelo. [4]
El 68000 tiene un registro de estado de 16 bits. Los 8 bits superiores son el byte del sistema y su modificación es privilegiada. Los 8 bits inferiores son el byte de usuario, también conocido como registro de código de condición (CCR), y su modificación no tiene privilegios. Las operaciones lógicas, aritméticas y de comparación 68000 modifican los códigos de condición para registrar sus resultados para su uso en saltos condicionales posteriores. Los bits del código de condición son "llevar" (C), "desbordamiento" (V), "cero" (Z), "negativo" (N) y "extender" (X). La bandera "extender" (X) merece una mención especial, porque está separada de la bandera de acarreo . Esto permite separar el bit extra de las operaciones aritméticas, lógicas y de desplazamiento de la aritmética de multiprecisión de acarreo . [48]
Los diseñadores intentaron hacer que el lenguaje ensamblador fuera ortogonal . Es decir, las instrucciones se dividen en operaciones y modos de dirección , y casi todos los modos de dirección están disponibles para casi todas las instrucciones. Hay 56 instrucciones y un tamaño mínimo de instrucción de 16 bits. Muchas instrucciones y modos de direccionamiento son más largos para incluir más bits de dirección o modo.
La CPU, y más tarde toda la familia, implementa dos niveles de privilegios. El modo de usuario brinda acceso a todo excepto a instrucciones privilegiadas, como controles de nivel de interrupción. [49] El privilegio de supervisor da acceso a todo. Una interrupción siempre se convierte en supervisión. El bit de supervisión se almacena en el registro de estado y es visible para los programas de usuario. [49]
Una ventaja de este sistema es que el nivel de supervisor tiene un puntero de pila independiente. Esto permite que un sistema multitarea utilice pilas muy pequeñas para las tareas, porque los diseñadores no tienen que asignar la memoria necesaria para contener los marcos de pila de una acumulación máxima de interrupciones.
La CPU reconoce siete niveles de interrupción . Los niveles 1 a 5 tienen una prioridad estricta. Es decir, una interrupción con un número más alto siempre puede interrumpir una interrupción con un número más bajo. En el registro de estado, una instrucción privilegiada permite configurar el nivel mínimo de interrupción actual, bloqueando interrupciones de menor o igual prioridad. Por ejemplo, si el nivel de interrupción en el registro de estado se establece en 3, niveles más altos de 4 a 7 pueden causar una excepción. El nivel 7 es una interrupción no enmascarable (NMI) activada por nivel . El nivel 1 puede ser interrumpido por cualquier nivel superior. El nivel 0 significa que no hay interrupción. El nivel se almacena en el registro de estado y es visible para los programas de nivel de usuario.
Las interrupciones de hardware se señalan a la CPU mediante tres entradas que codifican la prioridad de interrupción pendiente más alta. Generalmente se requiere un codificador separado para codificar las interrupciones, aunque para sistemas que no requieren más de tres interrupciones de hardware es posible conectar las señales de interrupción directamente a las entradas codificadas a costa de una mayor complejidad del software. El controlador de interrupciones puede ser tan simple como un codificador de prioridad 74LS148 , o puede ser parte de un chip periférico de integración a muy gran escala (VLSI), como el periférico multifunción MC68901 (utilizado en la gama de computadoras Atari ST y Sharp X68000 ). , que también proporciona UART , temporizador y E/S paralelas.
La "tabla de excepciones" ( tabla de vectores de interrupción direcciones de vectores de interrupción) está fijada en las direcciones 0 a 1023, lo que permite 256 vectores de 32 bits. El primer vector (RESET) consta de dos vectores, a saber, la dirección de pila inicial y la dirección de código inicial. Los vectores del 3 al 15 se utilizan para informar varios errores: error de bus , error de dirección, instrucción ilegal , división por cero , vector CHK y CHK2, violación de privilegios (para bloquear la escalada de privilegios ) y algunos vectores reservados que se convirtieron en el emulador de la línea 1010 y el emulador de la línea 1111. y punto de interrupción de hardware . El vector 24 inicia las interrupciones reales : interrupción espuria (sin reconocimiento de hardware) y autovectores del nivel 1 al 7, luego los 16 vectores TRAP, luego algunos vectores más reservados y luego los vectores definidos por el usuario.
Dado que el vector de dirección del código inicial siempre debe ser válido al restablecerse, los sistemas comúnmente incluían alguna memoria no volátil (por ejemplo, ROM ) comenzando en la dirección cero para contener los vectores y el código de arranque . Sin embargo, para un sistema de propósito general es deseable que el sistema operativo pueda cambiar los vectores en tiempo de ejecución. Esto a menudo se lograba apuntando los vectores en la ROM a una tabla de salto en la RAM , o mediante el uso de conmutación de banco para permitir que la ROM fuera reemplazada por RAM en tiempo de ejecución.
El 68000 no cumple con los requisitos de virtualización de Popek y Goldberg para la virtualización completa del procesador porque tiene una única instrucción sin privilegios, "MOVE from SR", que permite al software en modo de usuario acceso de solo lectura a una pequeña cantidad de estado privilegiado. El 68EC000 y el 68SEC000, que son derivados posteriores del 68000, cumplen con los requisitos ya que la instrucción "MOVE from SR" tiene privilegios. El mismo cambio se introdujo en las CPU 68010 y posteriores.
El 68000 tampoco puede admitir fácilmente memoria virtual , lo que requiere la capacidad de capturar y recuperarse de un acceso fallido a la memoria. El 68000 proporciona una excepción de error de bus que se puede utilizar para interceptar, pero no guarda suficiente estado del procesador para reanudar la instrucción fallida una vez que el sistema operativo haya manejado la excepción. Varias empresas lograron fabricar estaciones de trabajo Unix basadas en 68000 con memoria virtual que funcionaban utilizando dos chips 68000 ejecutándose en paralelo en relojes de diferentes fases. Cuando el 68000 "principal" encontraba un acceso incorrecto a la memoria, el hardware adicional interrumpiría el 68000 "principal" para evitar que también encontrara el acceso incorrecto a la memoria. Esta rutina de interrupción manejaría las funciones de la memoria virtual y reiniciaría el 68000 "principal" en el estado correcto para continuar la operación sincronizada correctamente cuando el 68000 "principal" regresara de la interrupción.
Estos problemas se solucionaron en la siguiente revisión importante de la arquitectura 68k con el lanzamiento del MC68010. Las excepciones de error de bus y error de dirección envían una gran cantidad de estado interno a la pila del supervisor para facilitar la recuperación, y la instrucción "MOVE from SR" se convirtió en privilegiada. Se proporciona una nueva instrucción sin privilegios "MOVE from CCR" para que la utilice en su lugar el software en modo usuario; un sistema operativo puede capturar y emular las instrucciones "MOVER desde SR" en modo de usuario si lo desea.
Los modos de direccionamiento estándar son:
Además: acceso al registro de estado y, en modelos posteriores, a otros registros especiales.
La mayoría de las instrucciones tienen variantes que operan con bytes de 8 bits, palabras de 16 bits y longitudes de 32 bits; Los lenguajes ensambladores utilizan sufijos de letras de punto ".b", ".w" y ".l" después del mnemotécnico de instrucción para indicar la variante.
Como muchas CPU de su época, el tiempo del ciclo de algunas instrucciones variaba según los operandos de origen. Por ejemplo, la instrucción de multiplicación sin signo tarda (38+2n) ciclos de reloj en completarse, donde 'n' es igual al número de bits establecidos en el operando. [50] Para crear una función que tomara un conteo de ciclo fijo se requirió la adición de código adicional después de la instrucción de multiplicación. Por lo general, esto consumiría ciclos adicionales por cada bit que no se configuró en el operando de multiplicación original.
La mayoría de las instrucciones son diádicas , es decir, la operación tiene un origen y un destino, y se cambia el destino. Las instrucciones notables son:
El 68EC000 es una versión de bajo costo del 68000 con una distribución de pines ligeramente diferente, diseñada para aplicaciones de controlador integrado. El 68EC000 puede tener un bus de datos de 8 o 16 bits , conmutable al restablecerse. [51]
Los procesadores están disponibles en una variedad de velocidades, incluidas configuraciones de 8 y 16 MHz , y producen 2100 y 4376 Dhrystones cada uno. Estos procesadores no tienen unidad de punto flotante y es difícil implementar un coprocesador FPU ( MC68881/2 ) con una porque la serie EC carece de las instrucciones de coprocesador necesarias.
El 68EC000 se utilizó como controlador en muchas aplicaciones de audio, incluidos los instrumentos musicales y tarjetas de sonido Ensoniq , donde formaba parte del sintetizador MIDI . [52] En las placas de sonido Ensoniq, el controlador proporcionaba varias ventajas en comparación con los competidores sin una CPU a bordo. El procesador permitió configurar la placa para realizar diversas tareas de audio, como la síntesis MIDI MPU-401 o la emulación MT-32 , sin el uso de un programa residente de terminación y permanencia . Esto mejoró la compatibilidad del software, redujo el uso de la CPU y eliminó el uso de la memoria del sistema host.
El núcleo Motorola 68EC000 se utilizó más tarde en los procesadores DragonBall basados en m68k de Motorola/ Freescale .
También se utilizó como controlador de sonido en la consola de juegos Sega Saturn y como controlador para las placas controladoras HP JetDirect Ethernet para las impresoras HP LaserJet de mediados de la década de 1990 .
El siguiente código ensamblador 68000 es para una subrutina denominada strtolower
, que copia una cadena terminada en nulo de caracteres de 8 bits en una cadena de destino, convirtiendo todos los caracteres alfabéticos a minúsculas.
La subrutina establece una trama de llamada utilizando el registro A6 como puntero de trama. Este tipo de convención de llamada admite código reentrante y recursivo y normalmente se utiliza en lenguajes como C y C++ . Luego, la subrutina recupera los parámetros que se le pasan ( src
y dst
) de la pila. Luego realiza un bucle, lee un carácter ASCII (un byte) de la src
cadena, verifica si es un carácter alfabético en mayúscula y, de ser así, lo convierte en un carácter en minúscula; de lo contrario, lo deja como está y luego escribe el carácter en la dst
cuerda. Finalmente, verifica si el carácter era nulo ; si no, repite el bucle; de lo contrario, restaura el marco de pila anterior (y el registro A6) y regresa. Tenga en cuenta que los punteros de cadena (registros A0 y A1) se incrementan automáticamente en cada iteración del bucle.
Por el contrario, el siguiente código es para una función independiente, incluso en la versión más restrictiva de AMS para la serie de calculadoras TI-89 , siendo independiente del kernel, sin valores buscados en tablas, archivos o bibliotecas durante la ejecución. sin llamadas al sistema, sin procesamiento de excepciones, registros mínimos a utilizar ni necesidad de guardar ninguno. Es válido para fechas históricas julianas del 1 de marzo del 1 d.C., o para fechas gregorianas . En menos de dos docenas de operaciones calcula un número de día compatible con ISO 8601 cuando se llama con tres entradas almacenadas en sus UBICACIONES correspondientes:
;; WDN, una dirección - para almacenar el resultado d0; BANDERA, 0 o 2 - para elegir entre juliano o gregoriano, respectivamente; FECHA, año0mda: sello de fecha como palabra binaria, byte y byte en formato ISO básico;(AÑO, año ~ AÑO=FECHA debido al big- endianness );move.l DATE,d0
move.l d0,d1
;; Aplicar el paso 1: congruencia de Lachmanandi.l #$f00,d0
divu #100,d0
addi.w #193,d0
andi.l #$ff,d0
divu #100,d0 ; d0 has the month index i in the upper word (mod 100)
;; Aplique el paso 2: encontrar spqr como el año del día bisiesto juliano anterior a la FECHAswap d0
andi.l #$ffff,d0
add.b d1,d0
add.w YEAR,d0
subi.l #$300,d1
lsr #2,d1
swap d1
add.w d1,d0 ; spqr/4 + year + i + da
;; (Aplicar paso 0 - ajuste gregoriano)mulu FLAG,d1
divu #50,d1
mulu #25,d1
lsr #2,d1
add.w d1,d0
add.w FLAG,d0 ; (sp32div16) + spqr/4 + year + i + da
;divu #7,d0
swap d0 ; d0.w becomes the day number
;move.w d0,WDN ; returns the day number to address WDN
rts
;; Los días de la semana corresponden a los números de los días de la semana como:; Dom=0 Lun=1 Mar=2 Mié=3 Jue=4 Viernes=5 Sáb=6;