DDT
El programa DDT permite la prueba interactiva dinamica y la depuracion de programas generados en el entorno CP/M.
Introduccion
Invoque el depurador desde CP con un comando de una de las siguientes formas:
DDT
Inombredearchivo.hex
Inombredearchivo.COM
donde nombredearchivo
es el nombre del programa que se
va a cargar y probar. En ambos casos, el programa DDT se lleva a la
memoria principal en lugar del Procesador de comandos de la consola
(CCP) y reside directamente debajo de la parte del Sistema operativo de
disco basico (BDOS) de CP/M. La direccion inicial de BDOS, ubicada en el
campo de direccion de la instruccion JMP en la ubicacion
5H
, se modifica para reflejar el tamano reducido del Area
de programa transitorio (TPA).
La segunda y tercera formas del comando DDT realizan las mismas acciones que la primera, excepto que hay una carga automatica posterior del archivo HEX o COM especificado. La accion es identica a la siguiente secuencia de comandos:
DDT
Inombredearchivo.HEX o Inombredearchivo.COM
R
donde los comandos I
y R
configuran y leen
el programa especificado para evaluar. Consulte la explicacion de los
comandos I y R a continuacion para obtener detalles
exactos.
Tras el inicio, DDT imprime un mensaje de inicio de sesion en el formulario:
DDT VER m.m
donde m.m
es el numero de revision.
Despues del mensaje de inicio de sesion, DDT le solicita el caracter
de guion, -
y espera los comandos de entrada de la consola.
Puede escribir cualquiera de varios comandos de un solo caracter,
seguido de tecla Intro para ejecutar el comando. Cada
linea de entrada se puede editar en linea usando los siguientes
controles estandar de CP/M:
Controles de edicion de linea
Control | Resultado |
rubout | elimina el ultimo caracter escrito |
CTRL-U | elimina toda la linea, lista para volver a escribir |
CTRL-C | reinicia el sistema |
Cualquier comando puede tener hasta 32 caracteres de longitud. Se inserta un retorno de carro automatico como caracter 33, donde el primer caracter determina el tipo de comando.
Comandos DDT Comando
Caracter | Resultado |
A | ingresa mnemonicos en lenguaje ensamblador con operandos. |
D | muestra la memoria en hexadecimal y ASCII. |
F | llena la memoria con datos constantes. |
G | comienza la ejecucion con puntos de interrupcion opcionales. |
I | Configuro un bloque de control de archivos de entrada estandar. |
L | enumera la memoria usando mnemonicos de ensamblador. |
M | mueve un segmento de memoria desde el origen hasta el destino. |
R | lee un programa para pruebas posteriores. |
S | sustituye valores de memoria. |
T | traza la ejecucion del programa. |
U | Supervision de programas no rastreados. |
X | examina y opcionalmente altera el estado de la CPU. |
El caracter de comando, en algunos casos, va seguido de cero, uno, dos o tres valores hexadecimales, que estan separados por comas o caracteres en blanco. Toda la salida numerica de DDT estara en forma hexadecimal. Los comandos no se ejecutan hasta que se presione Intro al final del comando.
En cualquier punto de la ejecucion de depuracion, puede detener la
ejecucion de DDT usando CTRL-C o G0
(saltar a la ubicacion 0000H
) y guardar la imagen de
memoria actual usando un comando SAVE de la siguiente
manera:
SAVE n nombre de archivo.COM
donde n es el numero de paginas (bloques de 256
bytes) que se almacenaran en el disco. El numero de bloques se determina
tomando el byte de orden superior de la direccion en el TPA y
convirtiendo este numero a decimal. Por ejemplo, si la direccion mas
alta en el TPA es 134H
, el numero de paginas es
12H
o 18 en decimal. Puede introducir
CTRL-C durante la ejecucion de depuracion, volviendo al
nivel del interprete CCP, seguido de
SAVE 18 X.COM
La imagen de la memoria se guardara como X.COM
en el
disco y podra ejecutarla directamente introduciendo ahora su nombre
X
. Si se requieren mas pruebas, la imagen de la memoria se
puede recuperar escribiendo
DDT X.COM
que volvera a cargar el programa previamente guardado desde la
ubicacion 100H
hasta la pagina 18, 23FFH
. El
estado de la CPU no forma parte de un archivo COM; por lo tanto, el
programa debe reiniciarse desde el principio para probarlo
correctamente.
Comandos DDT
Los comandos individuales se detallan a continuacion. En cada caso,
el operador debe esperar el caracter de indicador de guion
-
antes de ingresar el comando. Si se pasa el control a un
programa bajo prueba y el programa no ha alcanzado un punto de
interrupcion, se puede devolver el control a DDT ejecutando un RST 7
desde el panel frontal. En la explicacion de cada comando, la letra del
comando se muestra en algunos casos con numeros separados por comas, los
numeros se representan con letras minusculas. Siempre se supone que
estos numeros estan en una base hexadecimal y de uno a cuatro digitos de
longitud. Los numeros mas largos se truncan automaticamente a la
derecha.
Muchos de los comandos operan sobre un estado de la CPU que corresponde al programa bajo prueba. El estado de la CPU contiene los registros del programa que se esta depurando e inicialmente contiene ceros para todos los registros y banderas excepto para el contador del programa, P, y el puntero de pila, S, que por defecto es 100H. El contador del programa se establece posteriormente en la direccion de inicio proporcionada en el ultimo registro de un archivo HEX si se carga un archivo de este formato, consulte los comandos I y R.
Comando A (ensamblaje)
DDT permite que el lenguaje ensamblador en linea se inserte en la imagen de memoria actual usando el comando A, que toma la forma:
As
donde s
es la direccion inicial hexadecimal para el
ensamblado en linea. DDT solicita a la consola la direccion de la
siguiente instruccion para completar y lee la consola, buscando
mnemonicos en lenguaje ensamblador seguidos de referencias de registro y
operandos en forma hexadecimal absoluta. Consulte la tarjeta de
referencia del lenguaje ensamblador Intel 8080 para obtener una lista de
mnemonicos. Cada direccion de carga sucesiva se imprime antes de leer la
consola. El comando A termina cuando se ingresa la primera linea vacia
desde la consola.
Una vez completada la entrada en lenguaje ensamblador, puede revisar el segmento de memoria utilizando el desensamblador DDT (vea el comando L).
Tenga en cuenta que la parte del ensamblador/desensamblador de DDT se puede superponer con el programa transitorio que se esta probando, en cuyo caso el programa DDT responde con una condicion de error cuando se usan los comandos A y L.
Comando D (Presentar)
El comando D le permite presentar el contenido de la memoria en formato hexadecimal y ASCII. El comando D toma las formas:
D
Ds
Ds,f
En la primera forma, la memoria se muestra desde la direccion de
visualizacion actual, inicialmente 100H
, y continua durante
16 lineas de visualizacion. Cada linea de visualizacion toma la
siguiente forma:
aaaa bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb cccccccccccccccc
siendo aaaa
la direccion de visualizacion en hexadecimal
y bb
representa los datos presentes en la memoria a partir
de aaaa
. Los caracteres ASCII que comienzan en
aaaa
estan a la derecha (representados por la secuencia del
caracter c
) donde los caracteres no graficos se imprimen
como un punto. Debe tener en cuenta que se muestran letras mayusculas y
minusculas, y apareceran como simbolos en mayusculas en un dispositivo
de consola que solo admita mayusculas. Cada linea de visualizacion da
los valores de 16 bytes de datos, con la primera linea truncada para que
la siguiente linea comience en una direccion que sea un multiplo de
16.
La segunda forma del comando D es similar a la primera, excepto que
la direccion de visualizacion se establece primero en la direccion
s
.
La tercera forma hace que la visualizacion continua el
intervalo desde la direccion s
hasta la direccion
f
. En todos los casos, la direccion de visualizacion se
establece en la primera direccion que no se muestra en este comando, de
modo que se pueda lograr una visualizacion continua emitiendo comandos D
sucesivos sin direcciones explicitas.
Las visualizaciones excesivamente largas se pueden cancelar presionando la tecla Intro.
El comando F (Llenar)
El comando F toma la forma:
fs,f,c
donde s es la direccion inicial, f
es la direccion final
y c
es una constante de byte hexadecimal. DDT almacena la
constante c
en la direccion s
, incrementa el
valor de s
y prueba contra f
. Si
s
excede f
, la operacion termina, de lo
contrario se repite la operacion. Por lo tanto, el comando de llenado se
puede usar para establecer un bloque de memoria en un valor constante
especifico.
Comando G (Ir)
Un programa se ejecuta usando el comando G, con hasta dos direcciones de punto de interrupcion opcionales. El comando G toma las formas:
G
Gs
Gs,b
Gs,b,c
G,b
G,b,c
La primera forma ejecuta el programa en el valor actual del contador del programa en el estado actual de la maquina, sin establecer puntos de interrupcion. La unica forma de recuperar el control en DDT es a traves de una ejecucion RST 7. El contador del programa actual se puede ver escribiendo un comando X o XP.
La segunda forma es similar a la primera, excepto que el contador del programa en el estado actual de la maquina se establece en la direccion s antes de que comience la ejecucion.
La tercera forma es igual a la segunda, excepto que la ejecucion del programa se detiene cuando se encuentra la direccion b (b debe estar en el area del programa bajo prueba). La instruccion en la ubicacion b no se ejecuta cuando se encuentra el punto de interrupcion.
La cuarta forma es identica a la tercera, excepto que se especifican dos puntos de corte, uno en b y otro en c. Si se encuentra cualquiera de los puntos de interrupcion, se detiene la ejecucion y se borran ambos puntos de interrupcion. Las dos ultimas formas toman el contador del programa del estado actual de la maquina y establecen uno y dos puntos de interrupcion, respectivamente.
La ejecucion continua desde la direccion inicial en tiempo real hasta el siguiente punto de interrupcion. No hay intervencion entre la direccion inicial y la direccion de corte por parte de DDT. Si el programa bajo prueba no alcanza un punto de interrupcion, el control no puede volver a DDT sin ejecutar una instruccion RST 7. Al encontrar un punto de interrupcion, DDT detiene la ejecucion y escribe
*d
donde d es la direccion de parada. El estado de la maquina se puede examinar en este punto usando el comando X (Examinar). Debe especificar puntos de interrupcion que difieran de la direccion del contador del programa al comienzo del comando G. Por lo tanto, si el contador del programa actual es 1234H, entonces los siguientes comandos:
G,1234
G400,400
ambos producen un punto de interrupcion inmediato sin ejecutar ninguna instruccion.
Comando I (Entrada)
El comando I le permite insertar un nombre de archivo en el Bloque de control de archivos (FCB) predeterminado en 5CH. El FCB creado por CP/M para programas transitorios se coloca en esta ubicacion (consulte la Seccion 5). El FCB predeterminado puede ser utilizado por el programa bajo prueba como si hubiera sido aprobado por el procesador de la consola CP/M. Tenga en cuenta que DDT tambien utiliza este nombre de archivo para leer archivos HEX y COM adicionales. El comando I toma las formas:
Inombre de archivo
Inombredearchivo.ext
Si se usa la segunda forma y la extension del archivo es
HEX
o COM
, los comandos R subsiguientes se
pueden usar para leer el codigo de maquina en formato hexadecimal o
binario puro.
Comando L (Listar)
El comando L se usa para enumerar mnemonicos en lenguaje ensamblador en una region de programa particular. El comando L toma las formas:
L
ls
Ls,f
El primer formulario enumera doce lineas de codigo de maquina
desensamblado de la direccion de la lista actual. La segunda forma
establece la direccion de la lista en s
y luego enumera
doce lineas de codigo. La ultima forma enumera el codigo desensamblado
desde s
hasta la direccion f
. En los tres
casos, la direccion de la lista se establece en la siguiente ubicacion
no listada en preparacion para un comando L posterior.
Al encontrar un punto de interrupcion de ejecucion, la direccion de la
lista se establece en el valor actual del contador del programa
(comandos G y T). Una vez mas, los
tecleos largos se pueden cancelar presionando Intro
durante el proceso de la lista.
Comando M (mover)
El comando M permite el movimiento de bloques de programas o areas de datos de una ubicacion a otra en la memoria. El comando M toma la forma:
Ms,f,d
donde s
es la direccion de inicio del movimiento,
f
es la direccion final y d es la direccion de destino.
Primero se eliminan los datos de s a d, y ambas direcciones se
incrementan. Si s excede f, la operacion de movimiento se detiene; de lo
contrario, se repite la operacion de movimiento.
Comando R (Leer)
El comando R se usa junto con el comando
I para leer archivos de extension COM
y
HEX
del disco en el area del programa transitorio en
preparacion para la ejecucion de depuracion. El comando R toma las
formas:
R
Rb
donde b
es una direccion de polarizacion opcional que se
agrega a cada programa o direccion de datos a medida que se carga. La
operacion de carga no debe sobrescribir ninguno de los parametros del
sistema desde 000H
hasta 0FFH
(es decir, la
primera pagina de la memoria). Si se omite b, entonces se asume b =
0000. El comando R requiere un comando I previo, especificando el nombre
de un archivo HEX
o COM
. La direccion de carga
de cada registro se obtiene de cada registro HEX individual, mientras
que para los archivos COM se utiliza una direccion de carga supuesta de
100H. Tenga en cuenta que se puede emitir cualquier cantidad de comandos
R despues del comando I para volver a leer el programa bajo prueba,
suponiendo que el programa probado no destruya el area predeterminada en
5CH. Se supone que cualquier archivo especificado con el tipo de archivo
COM
contiene codigo de maquina en formato binario puro
(creado con el comando LOAD o SAVE), y
se supone que todos los demas contienen codigo de maquina en formato
hexadecimal de Intel (producido, por ejemplo, con el comando
ASM).
Recuerde que el comando,
DDT nombre de archivo.tipo
que inicia el programa DDT, equivale a los siguientes comandos:
DDT
- Inombredearchivo.ext
- R
Cada vez que se emite el comando R, DDT responde con
el indicador de error ?
(el archivo no se puede abrir o se
produjo un error de suma de comprobacion en un archivo HEX) o con un
mensaje de LOAD. El mensaje de carga toma la forma:
SIGUIENTE PC nnnnpppp
donde nnnn es la siguiente direccion que sigue al programa cargado y pppp es el contador de programa asumido (100H para archivos COM, o tomado del ultimo registro si se especifica un archivo HEX).
Comando S (Establecer)
El comando S permite que las ubicaciones de la memoria se examinen y, opcionalmente, se modifiquen. El comando S toma la forma:
Ss
donde s es la direccion inicial hexadecimal para el examen y alteracion de la memoria. DDT responde con un indicador numerico, brindando la ubicacion de la memoria, junto con los datos que se encuentran actualmente en la memoria. Si escribe un retorno de carro, los datos no se modifican. Si se escribe un valor de byte, el valor se almacena en la direccion solicitada. En cualquier caso, DDT continua solicitando direcciones y valores sucesivos hasta que escriba un punto o se detecte un valor de entrada no valido.
Comando T (Trazar)
El comando T permite el seguimiento selectivo de la ejecucion del programa de 1 a 65535 pasos de programa. El comando T toma las formas:
T Tennesse
En la primera forma, se muestra el estado de la CPU y se ejecuta el siguiente paso del programa. El programa finaliza inmediatamente y la direccion de finalizacion se muestra como
*hhhh
donde hhhh es la siguiente direccion a ejecutar. La direccion de visualizacion (utilizada en el comando D) se establece en el valor de H y L, y la direccion de lista (utilizada en el comando L) se establece en hhhh. El estado de la CPU al finalizar el programa se puede examinar mediante el comando X.
La segunda forma del comando T es similar a la primera, excepto que la ejecucion se rastrea durante n pasos (n es un valor hexadecimal) antes de que ocurra un punto de interrupcion del programa. Se puede forzar un punto de interrupcion en el modo de seguimiento escribiendo un caracter de borrado. El estado de la CPU se muestra antes de que se realice cada paso del programa en el modo de rastreo. El formato de la pantalla es el mismo que se describe en el comando X.
Debe tener en cuenta que el seguimiento del programa se interrumpe en la interfaz de CP/M y se reanuda despues de regresar de CP/M al programa bajo prueba. Por lo tanto, las funciones de CP/M que acceden a los dispositivos de E/S, como la unidad de disco, se ejecutan en tiempo real, evitando problemas de tiempo de E/S. Los programas que se ejecutan en modo de seguimiento se ejecutan aproximadamente 500 veces mas lento que en tiempo real porque DDT obtiene el control despues de que se ejecuta cada instruccion del usuario. Las rutinas de procesamiento de interrupciones se pueden rastrear, pero los comandos que utilizan la funcion de punto de interrupcion (G, T y U) realizan la interrupcion mediante una instruccion RST 7, lo que significa que el programa probado no puede utilizar esta ubicacion de interrupcion. Ademas, el modo de rastreo siempre ejecuta el programa probado con las interrupciones habilitadas, lo que puede causar problemas si se reciben interrupciones asincronas durante el rastreo.
Para devolver el control a DDT durante el rastreo, presione RETURN en lugar de ejecutar un RST 7. Esto asegura que el rastreo de la instruccion actual se complete antes de la interrupcion.
Comando U (Destrazar)
El comando U es identico al comando T, excepto que no se muestran los pasos intermedios del programa. El modo untrace permite ejecutar de 1 a 65535 (0FFFFH) pasos en modo monitoreado y se usa principalmente para retener el control de un programa en ejecucion mientras alcanza condiciones de estado estable. Todas las condiciones del comando T se aplican al comando U.
Comando X (Examinar)
El comando X permite la visualizacion selectiva y la alteracion del estado actual de la CPU para el programa bajo prueba. El comando X toma las formas:
X Xr
donde r es uno de los registros de CPU 8080 enumerados en la siguiente tabla.
Tabla 4-3. Registros de la CPU
Registro | Significado | Valor |
C | Flag de acarreo | (0/1) |
Z | Indicador cero Z | (0/1) |
M | Flag de menos | (0/1) |
E | Indicador de paridad par | (0/1) |
I | Resto lnterdigito | (0/1) |
A | Acumulador | (0-FF) |
BC | Par de registros BC | (0-FFFF) |
D | par de registros DE | (0-FFFF) |
H | Par de registros HL | (0-FFFF) |
S | Puntero de pila | (0-FFFF) |
P | Puntero de programa | (0-FFFF) |
En el primer caso, el estado del registro de la CPU se muestra en el formato:
CfZfMfEflf A=bb B=dddd D=dddd H=dddd S=dddd P=dddd inst
donde f
es un valor de indicador 0
o
1
, bb
es un valor de byte y dddd
es una cantidad de doble byte correspondiente al par de registros. El
campo inst contiene la instruccion desensamblada, que ocurre en la
ubicacion direccionada por el contador de programa del estado de la
CPU.
La segunda forma permite la visualizacion y alteracion opcional de
valores de registro, donde r
es uno de los registros dados
anteriormente (C, Z, M, E, I, A, B, D, H, S o P). En cada caso, el flag
o valor de registro se muestra primero en la consola. El programa DDT
luego acepta la entrada de la consola. Si se presiona
Intro, el indicador o valor de registro no se modifica.
Si se escribe un valor en el rango adecuado, se modifica el valor de
indicador o registro. Debe tener en cuenta que BC
,
DE
y HL
se muestran como pares de registros.
Por lo tanto, debe escribir el par de registros completo cuando se
modifica B
, C
o el par BC
.
Notas de implementacion
La organizacion de DDT permite superponer ciertas partes no esenciales para obtener un area de programa transitorio mas grande para depurar programas grandes. El programa DDT consta de dos partes: el nucleo DDT y el modulo ensamblador/desensamblador. El nucleo DDT se carga sobre el CCP y, aunque se carga con el nucleo DDT, el ensamblador/desensamblador se puede superponer a menos que se use para ensamblar o desensamblar.
En particular, la direccion BDOS en la ubicacion 6H (campo de direccion de la instruccion JMP en la ubicacion 5H) es modificada por DDT para direccionar la ubicacion base del nucleo DDT, que, a su vez, contiene una instruccion JMP para BDOS. Por lo tanto, los programas que usan este campo de direccion para dimensionar la memoria ven el final logico de la memoria en la base del nucleo DDT en lugar de la base del BDOS.
El modulo ensamblador/desensamblador reside directamente debajo del nucleo DDT en el area del programa transitorio. Si se utilizan los comandos A, L, T o X durante el proceso de depuracion, el programa DDT modifica nuevamente el campo de direccion en 6H para incluir este modulo, lo que reduce aun mas el final logico de la memoria. Si un programa se carga mas alla del comienzo del modulo ensamblador/desensamblador, los comandos A y L se pierden (su uso produce un ? en respuesta) y los comandos rastrear y mostrar (T y X) enumeran el campo inst de la pantalla en hexadecimal. , en lugar de como una instruccion decodificada.