ST6 y ST7
# ST6 y ST7

ST6 y ST7 son líneas de productos de microcontroladores de 8 bits de STMicroelectronics . Se utilizan comúnmente en pequeñas aplicaciones integradas como electrodomésticos, aplicaciones comerciales e industriales de pequeña escala.

Aunque utilizan periféricos similares y se comercializan como parte de la misma línea de productos, las dos arquitecturas son bastante diferentes.

Ambos tienen un acumulador de 8 bits que se usa para la mayoría de las operaciones, además de dos registros de índice de 8 bits (X e Y) que se usan para el direccionamiento de la memoria. Además, ambos tienen instrucciones de 8 bits seguidas de hasta 2 bytes de operandos, y ambos admiten la manipulación y bifurcación de bits de memoria individuales.

aquí acaban las similitudes.

El ST6 es una arquitectura Harvard con un espacio de direcciones de datos de 8 bits (256 bytes) y un espacio de programa separado de 12 bits (4096 bytes). Los operandos siempre tienen 1 byte de longitud y algunas instrucciones admiten dos operandos, como "mover 8 bits inmediatos a una dirección de memoria de 8 bits". Las llamadas a subrutinas se realizan utilizando una pila de hardware independiente. Los registros de datos (pero no el contador de programa o las banderas) están mapeados en memoria.

Los modos de direccionamiento del ST6 se limitan a la dirección de memoria absoluta inmediata de 8 bits y los modos indirectos de registro (X) e (Y).

El ST7 es una arquitectura de von Neumann con un solo espacio de direcciones de 16 bits (64 kiB). Los primeros 256 bytes de RAM (la página cero ) tienen flexibilidad adicional. No hay instrucciones de dos operandos, excepto "bit de prueba y bifurcación". Sus registros no están mapeados en memoria y utiliza RAM de uso general (más un registro de puntero de pila ) para llamadas a subrutinas.

El ST7 admite una amplia variedad de modos de direccionamiento, incluidos base+índice y doble indirecto.

## Arquitectura ST6

El ST6 tiene 64 bytes de RAM y 4096 bytes de memoria ROM de programa. Se accede a cantidades más grandes cambiando de banco la sección baja de 2 K de la ROM.

El espacio de direcciones de RAM es en realidad 256 bytes, divididos de la siguiente manera:

* 0 – 63: No implementado
* 64 – 127: Ventana conmutable de banco en ROM de programa y EPROM de datos.
* 128 – 191: RAM de uso general
* 192 – 255: registros de control de periféricos (puertos GPIO, temporizadores, etc. ) El acumulador está mapeado en la dirección 255, pero es más comúnmente direccionado implícitamente.

Lo no asignado al espacio de direcciones es un contador de programa de 12 bits y una pila de hardware asociada (cuatro o seis niveles de profundidad, según el modelo). Solo hay dos bits de estado (acarreo y cero ), y se agrupan según el modo del procesador, con bits de estado separados para la operación de interrupción normal, de interrupción y no enmascarable .

Las primeras cuatro ubicaciones de RAM de uso general también se conocen como registros X, Y, V y W, y algunas instrucciones pueden acceder a ellos mediante modos especiales de direccionamiento corto. Los registros X e Y sirven como registros de índice y pueden usar modos de direccionamiento indirecto (X) e (Y) .

El conjunto de instrucciones consta de un byte de código de operación, seguido de hasta dos operandos de un byte. El conjunto de instrucciones se puede resumir de la siguiente manera:

Set de instrucciones de la familia ST6 :

| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | b2 | b3 | Nemónico | C | Z | Descripción |
| - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| desplazamiento | desplazamiento | desplazamiento | desplazamiento | desplazamiento | opc | opc | 0 | — | — | Saltos condicionales (5-bit PC-relative) | Saltos condicionales (5-bit PC-relative) | Saltos condicionales (5-bit PC-relative) | Saltos condicionales (5-bit PC-relative) |
| desplazamiento | desplazamiento | desplazamiento | desplazamiento | desplazamiento | 0 | 0 | 0 | — | — | JRNZ dirección | | | Jump to PC + simm5 if Z == 0 |
| desplazamiento | desplazamiento | desplazamiento | desplazamiento | desplazamiento | 1 | 0 | 0 | — | — | JRZ dirección | | | Jump to PC + simm5 if Z == 1 |
| desplazamiento | desplazamiento | desplazamiento | desplazamiento | desplazamiento | 0 | 1 | 0 | — | — | JRNC dirección | | | Jump to PC + simm5 if C == 0 |
| desplazamiento | desplazamiento | desplazamiento | desplazamiento | desplazamiento | 1 | 1 | 0 | — | — | JRC dirección | | | Jump to PC + simm5 if C == 1 |
| imm4 | imm4 | imm4 | imm4 | c | 0 | 0 | 1 | imm8 | — | Saltos incondicionales (12-bit absolute) | Saltos incondicionales (12-bit absolute) | Saltos incondicionales (12-bit absolute) | Saltos incondicionales (12-bit absolute) |
| imm4 | imm4 | imm4 | imm4 | 0 | 0 | 0 | 1 | imm8 | — | CALL imm12 | | | Push PC, jump to 12-bit address |
| imm4 | imm4 | imm4 | imm4 | 1 | 0 | 0 | 1 | imm8 | — | JP imm12 | | | Salto a una dirección de 12-bit |
| — | — | — | 0 | 0 | 1 | 0 | 1 | — | — | (reservedo) | (reservedo) | (reservedo) | (reservedo) |
| reg | reg | c | 1 | c | 1 | 0 | 1 | — | — | Register operations (on X, Y, V or W) | Register operations (on X, Y, V or W) | Register operations (on X, Y, V or W) | Register operations (on X, Y, V or W) |
| reg | reg | 0 | 1 | 0 | 1 | 0 | 1 | — | — | INC reg | Z | | Incrementa register. Z is set, C is not. |
| reg | reg | 1 | 1 | 0 | 1 | 0 | 1 | — | — | LD A,reg | Z | | A := {X, Y, V or W} |
| reg | reg | 0 | 1 | 1 | 1 | 0 | 1 | — | — | DEC reg | Z | | Decrement register. Z is set, C is not. |
| reg | reg | 1 | 1 | 1 | 1 | 0 | 1 | — | — | LD reg,A | Z | | {X, Y, V or W} := A |
| opcode | opcode | opcode | 0 | 1 | 1 | 0 | 1 | — | — | Miscellaneous operations | Miscellaneous operations | Miscellaneous operations | Miscellaneous operations |
| 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | addr | imm8 | LDI addr,imm8 | | | Set RAM to 8-bit immediate value |
| 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | — | — | (reserved) | (reserved) | (reserved) | (reserved) |
| 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | — | — | RETI | | | Return from interrupt. Pop PC, restore flags. |
| 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | — | — | RET | | | Return from subroutine. Pop PC from hardware stack. |
| 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | — | — | COM A | Z | C | Complement: C := msbit(A); A := ~A |
| 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | — | — | RLC A | | C | A := A + A + C |
| 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | — | — | STOP | | | Halt processor, clock, most peripherals until next interrupt |
| 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | — | — | WAIT | | | Halt processor until next interrupt; clock continues |
| bit | bit | bit | opc | opc | 0 | 1 | 1 | address | ? | Bit operations (absolute address only) | Bit operations (absolute address only) | Bit operations (absolute address only) | Bit operations (absolute address only) |
| bit | bit | bit | 0 | 0 | 0 | 1 | 1 | src | simm8 | JRR bit,src,address | | C | C := src.bit; jump to PC+simm8 if reset (clear) |
| bit | bit | bit | 1 | 0 | 0 | 1 | 1 | src | simm8 | JRS bit,src,address | | C | C := src.bit; jump to PC+simm8 if set |
| bit | bit | bit | 0 | 1 | 0 | 1 | 1 | dst | — | RES bit,dst | | | Reset (set to 0) dst.bit |
| bit | bit | bit | 1 | 1 | 0 | 1 | 1 | dst | — | SET bit,dst | | | Set (to 1) dst.bit |
| opcode | opcode | opcode | data | data | 1 | 1 | 1 | ? | — | ALU operations with RAM or immediate | ALU operations with RAM or immediate | ALU operations with RAM or immediate | ALU operations with RAM or immediate |
| opcode | opcode | opcode | 0 | 0 | 1 | 1 | 1 | — | — | (X) | | | Operand is (X) |
| opcode | opcode | opcode | 0 | 1 | 1 | 1 | 1 | — | — | (Y) | | | Operand is (Y) |
| opcode | opcode | opcode | 1 | 0 | 1 | 1 | 1 | imm8 | — | imm8 | | | Operand is 8-bit immediate (source only) |
| opcode | opcode | opcode | 1 | 1 | 1 | 1 | 1 | addr | — | addr | | | Operand is 8-bit RAM address |
| 0 | 0 | 0 | origen | origen | 1 | 1 | 1 | ? | — | LD A,origen | Z | | A := origen |
| 1 | 0 | 0 | destino | destino | 1 | 1 | 1 | ? | — | LD destino,A | Z | | destino:= A (immediate forbidden) |
| 0 | 1 | 0 | origen | origen | 1 | 1 | 1 | ? | — | ADD A,origen | Z | C | A := A + origen |
| 1 | 1 | 0 | origen | origen | 1 | 1 | 1 | ? | — | SUB A,origen | Z | $C^†$ | A := A − origen |
| 0 | 0 | 1 | origen | origen | 1 | 1 | 1 | ? | — | CP A,origen | Z | $C^†$ | A − origen |
| 1 | 0 | 1 | origen | origen | 1 | 1 | 1 | ? | — | AND A,origen | Z | | A := A & origen |
| 0 | 1 | 1 | destino | destino | 1 | 1 | 1 | ? | — | INC destino | Z | | dst := dst + 1 (immediate forbidden) |
| 1 | 1 | 1 | destino | destino | 1 | 1 | 1 | ? | — | DEC destino | Z | | dst := dst − 1 (immediate forbidden) |

†: ^ $^{ab}$ De manera confusa, los diferentes modelos de la familia ST6 usan diferentes convenciones para el valor del bit de acarreo después de una resta. Los procesadores ST60 usan la convención "carry", que borra el bit si la resta se desborda, mientras que los procesadores ST62 y ST63 usan la convención "borrow", que establece el bit en ese $caso.^{:21–22,42}$

## Arquitectura ST7

El ST7 tiene seis registros: el acumulador, los registros de índice X e Y, el puntero de pila, el contador de programa y el registro de código de condición. Además, el direccionamiento indirecto doble permite que la página cero de la RAM sirva como registros adicionales. Una característica inusual pero útil es que una interrupción empuja cuatro de estos registros en la pila (A y X, así como el PC y CC habituales), y el retorno de la interrupción los restaura.

Las instrucciones ALU se dividen en dos categorías, dos operandos y un operando.

Las instrucciones de dos operandos utilizan el acumulador como primera fuente. El modo de direccionamiento especifica la segunda fuente, que puede ser:

* inmediato de 8 bits
* dirección absoluta de 8 bits
* dirección absoluta de 16 bits
* Indexado (X)
* Indexado más desplazamiento de 8 bits (dirección 8, X)
* Indexado más desplazamiento de 16 bits (dirección 16, X)

El destino suele ser el acumulador, pero algunas instrucciones modifican la segunda fuente. (Los operandos inmediatos están prohibidos en tales casos. )

Las instrucciones de un operando usan el operando especificado tanto para el origen como para el destino. El operando puede ser:

* El acumulador A
* El registro X
* dirección absoluta de 8 bits
* Indexado (X)
* Indexado más desplazamiento de 8 bits (dirección 8, X)

El registro más el desplazamiento calcula una suma de ancho completo, por lo que la forma de 8 bits puede direccionar la memoria hasta 255+255 = 510.

Además de lo anterior, hay tres bytes de prefijo que se pueden anteponer a cualquier instrucción para la que tengan sentido:

* PDY (0x90) cambia todas las referencias al registro X a Y. Esto permite los modos de direccionamiento (Y), (dirección8,Y) y (dirección16,Y). Esto también afecta a los operandos implícitos, por lo que la instrucción "cargar X" se convierte en "cargar Y". Una consecuencia de esto es que la carga X solo puede usar los modos de direccionamiento relativos a X, y la carga Y solo puede usar los relativos a Y.
* PIX (0x92) agrega un paso de direccionamiento indirecto a la instrucción. La dirección de 8 o 16 bits que sigue al byte del código de operación se reemplaza por una dirección de 8 bits de una ubicación de memoria que contiene una dirección de 8 o 16 bits (esta última en orden big-endian ). Esto puede luego ser indexado por el registro X como de costumbre. Esto permite los modos de direccionamiento (dirección8), (dirección16), ([dirección8],X) y ([dirección8.w],X).
* PIY (0x91) combina los efectos anteriores. Esto permite los modos de direccionamiento ([dirección8],Y) y ([dirección8.w],Y). (También se puede usar con otros modos como parte de las instrucciones "cargar Y" y "almacenar Y". )
