¿Ubicación del puntero de pila ZiLOG Z80 en la memoria?

Estoy tratando de diseñar una placa para una computadora basada en Z80 y tengo problemas para diseñar el mapa de memoria. Descubrí que el valor predeterminado del contador de programa es address #0000, pero no puedo encontrar el valor predeterminado del puntero de pila. ¿ También lo es #0000? ¿Se supone que debo configurarlo en lo que quiera en el inicio?

Gracias.

Hoja de datos Z80

Sí, lo configura usted mismo antes de realizar cualquier operación que requiera la pila, como llamar a subrutinas.

Respuestas (4)

Normalmente establecería el puntero de la pila al comienzo de su programa.

Creo que el valor inicial habitual para el puntero de la pila sería la parte superior de la RAM disponible (pero hace mucho tiempo que no uso un microprocesador estilo 8085/Z80).

De acuerdo con The Undocumented Z80 Documented, el puntero de la pila está configurado en FFFF al encenderse, pero esto no está documentado.

Aquí hay una pieza simple del inicio del código Z80:

; Example for 32K system...
RAM_END         equ 8400h                   ; Last byte is actually 83ffh.

; Start here on power up/reset.
;
        org 0
RST0:   ld sp,RAM_END   ; Stack at the end of ram.
        jp START
        db 0, 0         ; Filler bytes...

RST8:   db 0, 0, 0, 0, 0, 0, 0, 0

RST10H: db 0, 0, 0, 0, 0, 0, 0, 0

RST18H: db 0, 0, 0, 0, 0, 0, 0, 0

RST20H: db 0, 0, 0, 0, 0, 0, 0, 0

RST28H: db 0, 0, 0, 0, 0, 0, 0, 0

RST30H: db 0, 0, 0, 0, 0, 0, 0, 0


; Mode 1 Interrupt handler.
; 
RST38H:
    di              ; Disable interrupts.
                    ; Do interrupt stuff here.
    ei              ; Enable interrupts.
    reti

    db  (0066H-$) dup (0)

; Non-maskable interrupt handler (NMI).
;
    org 0066H
NMIINT:
    ; Do NMI stuff here.
    retn

; Main monitor start,
;
START:
    im 1            ; Interrupt mode 1.
    ei              ; Enable interrupts.
    ...

Notas:

  • El puntero de la pila se establece al final de la RAM (la dirección siempre es par, 1 mayor que la última dirección real, ya que el SP siempre se reduce justo antes de la inserción).

  • Después de configurar la pila, saltamos al inicio real (omitimos todas las áreas que queramos usar para reiniciar el software).

  • También agregué un código predeterminado para la interrupción del modo 1 y el manejo de NMI.

  • Al inicio configuro el modo de interrupción y habilito las interrupciones.

Entonces, después de este código, tengo la configuración de la pila, la configuración básica de interrupción, etc. Es una buena idea buscar ejemplos de código de monitores Z80 reales, etc.

¿No reside el puntero de pila, entre otros registros de CPU como PC, en la CPU?

Pero si está preguntando a qué dirección apunta el puntero de la pila, entonces es una historia diferente. No sé sobre Z80, pero generalmente apunta a la parte superior de la memoria disponible, por ejemplo, -1 (FFFF) y disminuye, tiene sentido ya que está cargando variables estáticas de abajo hacia arriba, entonces la CPU no puede crear una pila y luego límpiela en medio de las variables asignadas o del programa (von Neuman). Entonces, la única forma de hacer una pila en la parte superior de la pila, en la parte superior de la pila ... es almacenar variables de arriba hacia abajo, hasta que la pila crezca para que "toque" los datos asignados en la parte inferior - esto se llama desbordamiento de pila. Las pilas se acumulan en cada llamada de función y luego las llamadas de función anidadas, se purgan en el orden inverso.

EDITAR: parte inferior y superior intercambiadas.

ingrese la descripción de la imagen aquí

Llamaría a 0xFFFF la parte superior de una memoria de 64K: es la dirección más alta.
Sí tu puedes. No soy un gran experto en informática, por lo que también puede haber un mal uso de los sinónimos en mi respuesta. Los corregiré.

El puntero de pila es desconocido en el reinicio, debe configurarse como parte de su programa. Generalmente es la primera instrucción en el código. La razón de esto es que si recibe una interrupción (sí, el NMI) se apagará porque no tiene una dirección válida a la que regresar. Es un decremento previo, por lo que la primera escritura de pila será en una dirección menos que el valor del puntero de pila existente. Establézcalo uno por encima de su dirección de RAM alta existente, si es 0xFFFF, configúrelo en cero, ya que es un registro de 16 bits y retrocederá a 0xFFFF para la primera escritura. Puede empujar el puntero de la pila, colocarlo en HL (u otros) para que pueda determinar su valor.

Las direcciones inferiores que comienzan en cero son "especiales", son para los vectores de interrupción. Normalmente, la dirección cero contiene la dirección de la primera instrucción de su programa. Si mi memoria es correcta, 0-0xFFH están reservados para la tabla de vectores. Los periféricos también pueden bloquear una interrupción en el bus, según la configuración.

Hubo varias versiones del Z80 comenzando con Zylog, NEC (upd780) y muchos otros. No todos eran exactamente iguales. Otra peculiaridad es que la mayoría usa un ciclo de reloj menos para buscar un operando, puede causar problemas de sincronización si no se espera.