Mapeo de memoria en el microprocesador 8085

En el microprocesador 8085 hay 64 kb de memoria disponible de los cuales algunos están asignados a ROM mientras que otros están asignados a RAM. Mi pregunta es, ¿por qué la ROM siempre se asigna a una región inferior del mapa de memoria en el microprocesador 8085?

Respuestas (4)

El 8085 requiere que la ROM tenga la dirección de memoria más baja porque, después de un reinicio, intenta obtener una instrucción de la ubicación 0. Si hubiera RAM en esa dirección, el procesador obtendría datos aleatorios y no iniciaría el programa.

Cuando el 8085 se inicia, comenzará a buscar instrucciones desde la dirección cero. Por lo tanto, es necesario que la memoria que se encuentra allí contenga contenidos definidos. Sin embargo, eso no implica que la dirección cero deba asignarse permanentemente a la ROM. Se podría construir un sistema con, por ejemplo, 2K de ROM, 64K de RAM y una unidad de disquete, y usar un bit de E/S para controlar si las lecturas de la memoria provienen de la ROM o de la RAM. En el inicio, haga que todas las lecturas provengan de la ROM (las escrituras van a la RAM independientemente del bit de control) y haga que el programa de la ROM se copie a sí mismo en la RAM. Luego habilite las lecturas desde la RAM y cargue el software desde el disquete. Dado que la parte inferior del espacio de direcciones sería RAM, el software cargado desde un disquete podría configurar vectores de interrupción para sus propios fines, algo que no sería posible si la ROM todavía estuviera asignada allí.

LDIRes una instrucción Z80 y no existe en el 8085.
@DaveTweed: Corregido. Si la dirección de origen y de destino pueden ser idénticas, me pregunto si sería más rápido de usar MOV A,M / MOV M,A / INC L / JNZ / DEC H / JPo mejor usar un ciclo de POP / PUSH / POPinstrucciones (no sé acerca de los tiempos 8085, pero en el Z80, la secuencia anterior sería de 10 bytes y toma alrededor de 28 ciclos/byte copiado, o 13 bytes y 23/byte si se desenrolla 2x; este último tomaría 11 bytes y tomaría alrededor de 22 ciclos/byte copiado si no se desenrolla, o 14 bytes y 18,5 ciclos/byte si se desenrolla 2x)
@DaveTweed: Supongo que con un ligero ajuste de hardware, uno podría hacer las cosas aún más rápido al tener la RAM habilitada para todos los accesos a la memoria, pero haciendo que cuando la ROM esté habilitada, la línea R/W de la RAM se afirme, no es que la velocidad realmente importe para tal inicialización. Tengo curiosidad, por cierto, cuántas máquinas de "hardware de direccionamiento creativo" incluyeron. Con un hardware de direccionamiento equivalente a un CPLD más bien pequeño (algunos pestillos de 8 bits, una ALU de 16 bits y algunos multiplexores), uno podría convertir un 8085 en una CPU decente orientada a objetos de 16 bits que acceda a 256K de RAM.
Un ejemplo de "hardware de direccionamiento creativo" sería el Hitachi HD64180 (un superconjunto Z80). Tenía una forma de dividir el espacio de direcciones lógicas de 64 kB en hasta tres regiones, cada una de las cuales podía asignarse a un espacio de direcciones físicas de 1 MB. Esto encaja bastante bien con las características avanzadas de las versiones posteriores de CP/M, lo que hace posible una especie de multitarea, junto con el disco RAM, la memoria caché del disquete, etc. Los procesadores de bits se estaban volviendo comunes, por lo que no se hizo mucho más que esto en los procesadores de 8 bits.
En caso de que te lo estés preguntando, hay una razón por la que dije 1 MB, y el artículo de Wikipedia dice 512 kB. El HD64180 estaba disponible en dos paquetes, un PLCC de 68 pines y un DIP de 64 pines (!). El bit de dirección de orden superior (A19) fue uno de los pines que tuvieron que colocar en el paquete DIP, limitándolo a 512 kB.
@DaveTweed: Eso parece bastante "normal". Mi idea habría sido tener un rango de espacio de direcciones que estuviera disponible para el uso de interrupciones y un par de rangos de espacios de direcciones que podrían reubicarse en límites de 4 bytes. La MMU bloquearía continuamente el último byte obtenido de la dirección par o impar en la RAM en un área sin interrupciones, y un o MOV B,Bestablecería MOV C,Cla base del área reubicable superior o inferior en la última palabra obtenida, desplazada por dos; MOV A,Aestablecería la base reubicable a su valor predeterminado. Por lo tanto, si uno quisiera acceder al byte 4 de un objeto...
...los bytes 160 y 161 de la base predeterminada, diría uno mov A,A / lda 80A0h / mov B,B / lda 8004h. Por lo tanto, hacer que el acceso a objetos en un espacio de direcciones de 256 K sea más rápido de lo que normalmente sería el acceso incluso en un espacio de direcciones de 64 K. Hice trucos algo similares (aunque más simples) en un cartucho de juego Atari 2600 (que obtiene 13 cables de dirección, 8 cables de datos, alimentación, tierra y NADA MÁS de la CPU), por lo que pude trazar un píxel HIRES en la coordenada X ,Y de un mapa de bits adecuadamente organizado a través de LDA $7F00,X / ORA $7E00,Y / STA $7E00,Y.

Sé que esto es viejo, pero aquí, de memoria. Según recuerdo, el 8080 y el 8085 generalmente tenían un circuito de hardware que los diseñadores usaban y que estaba compuesto por una sola puerta que reasignaba la memoria después de tres señales de reloj, lo suficiente para ejecutar una instrucción JMP. Entonces, las primeras ubicaciones de memoria en 0: 0 procedían de una EPROM, y la puerta intercambiaría la EPROM con RAM en el cuarto ciclo de reloj en 0: 0. Eso es de mi memoria hace 30 años. Buscaría circuitos de hardware de inicio para computadoras caseras 8085; supongo que está allí.

La ROM siempre se asigna en la región inferior del mapa de memoria en el microprocesador 8085 porque después de reiniciar intenta obtener una instrucción de la ubicación o. Si hubiera RAM en ese momento, la dirección, el procesador buscaría datos aleatorios y no iniciaría el programa. Entonces, la ROM no se movió a otra región.