Proyecto de Software de Base

El objetivo del proyecto es el de escribir un ensamblador simple para el microcontrolador ATtiny10 de Atmel. El ensamblador se irá construyendo en diversas etapas. Cada etapa estará especificada en esta página y tendrá una fecha de entrega. La evaluación de la etapa se hará en base a que lo entregado satisfaga exactamente las especificaciones requeridas, es decir, ni más ni menos. Cada una de las etapas tendrá un valor que será anunciado junto con la especificación. Finalmente, los nombres de los programas serán de la forma nombreZZ donde ZZ es un código de dos dígitos que será entregado por el profesor junto con sus cuentas.

Primera etapa: Códigos de operación de 16 bits fijos : 10 puntos : 24 de febrero de 2011 a las 10pm

Deberá escribir un programa llamado codigoZZ.c o codigoZZ.cpp o codigoZZ.java que lea un archivo con nemónicos y que escriba un archivo con los códigos de operación correspondientes. Como podrá ver en el manual del ATtiny10, todas sus instrucciones tienen códigos de operación que caben en un entero de 16 bits. En esta primera sólo trabajaremos con las instrucciones cuyo código de operación son fijos. El archivo nemonico.txt consistirá de una sucesión de líneas de texto con un máximo de 80 caracteres y terminará con el fin de archivo. Cada línea de texto podrá:
  1. Estar en blanco (los caracteres definidos por isspace).
  2. Contener además de blancos una cadena alfanumérica.
Las cadenas alfanuméricas que correspondan con nemónicos serán construídas de la siguiente manera a partir de los nemónicos que aparecen en el manual:
  1. Aquellos nemónicos cuyos códigos de operación aparezcan completamente escritos con 0 y 1 simplemente se tomarán tal cual eliminando cualquier espacio y coma que aparezca. Ejemplo: el nemónico BREAK se convertirá en BREAK con código de operación 1001 0101 1001 1000 (ver página 28 del manual).
  2. Aquellos nemónicos en cuyos códigos de operación aparezca s se expandirán para producir tantos nemónicos como sea necesario, reemplazando s por el número correspondiente: de 0 a 7. Ejemplo: el nemónico BCLR se deberá convertir en ocho nemónicos diferentes, como por ejemplo BCLR 3 se deberá convertir en BCLR3 con código de operación 1001 0100 1sss 1000 = 1001 0100 1011 1000 (ver página 22 del manual).
  3. Aquellos nemónicos en cuyos códigos de operación aparezcan r o d se expandirán para producir tantos nemónicos como sea necesario, reemplazando r y d por el nombre abreviado del registro correspondiente: de R0 a R31. Ejemplo: el nemónico ADC Rd,Rr se deberá convertir en una gran cantidad de nemónicos diferentes, como por ejemplo ADC R5,R7 se deberá convertir en ADCR5R7 con código de operación 0001 11rd dddd rrrr = 0001 1100 0101 0111 (ver página 16 del manual).
  4. Es posible que haya otros casos que describiré luego.
Como les dije en clase, les recomiendo que escriban uno o varios pequeños programas para generar automáticamente la tabla de códigos de operación. Si así lo desean, su programa codigoZZ podrá leer un archivo de texto adicional que ustedes me envíen donde esté contenida esta tabla.

El programa ejecutable codigoZZ deberá leer cada una de las líneas del archivo nemonico.txt y para cada una de ellas deberá escribir una línea en el archivo codigoop.txt como sigue:
  1. Si la línea de la entrada está en blanco entonces la línea de la salida deberá consistir únicamente del caracter '\n'.
  2. Si la línea de la entrada contiene blancos y un nemónico entonces la línea de la salida deberá consistir únicamente del código de operación correspondiente representado con 16 bits seguido de un espacio seguido del mismo código representado como cuatro dígitos hexadecimales (con letras mayúsculas) seguido del caracter '\n'.
  3. En cualquier otro caso la línea de la salida deberá consistir únicamente de la cadena "ERROR\n".
Abajo encontrará un ejemplo del funcionamiento de este programa:

Ejemplo de entrada nemonico.txt
Explicación del ejemplo
Ejemplo de salida codigoop.txt
BREAK
break
BREAK ME

BCLR3
ADCR5R7
Un nemónico válido
Una cadena alfanumérica que no es un nemónico
Una línea que contiene más de una cadena alfanumérica
Una línea en blanco
Un nemónico válido
Un nemónico válido
1001010110011000 9598
ERROR
ERROR

1001010010111000 94B8
0001110001010111 1C57

Segunda etapa: Operandos : 10 puntos : 10 de marzo de 2011 a las 10pm

Deberá escribir un programa llamado operanZZ.c o operanZZ.cpp o operanZZ.java que lea un archivo con nemónicos y operandos y que escriba un archivo con los códigos de operación y los operandos correspondientes. El archivo nemonico.txt consistirá de una sucesión de líneas de texto con un máximo de 80 caracteres y terminará con el fin de archivo. Cada línea de texto podrá:
  1. Estar en blanco (los caracteres definidos por isspace).
  2. Contener además de blancos una cadena alfanumérica.
  3. Contener además de blancos dos cadenas alfanuméricas.
Como podrán ver en el manual, el ATtiny10 tiene dos tipos de instrucciones según su longitud en bits:
  1. Instrucciones de 16 bits: los dos bytes de la instrucción contienen el código de operación y sus posibles operandos. Ejemplo: BREAK.
  2. Instrucciones de 32 bits: los cuatro bytes de la instrucción contienen el código de operación y sus posibles operandos. Ejemplo: CALL.
Deberán agregar a su tabla de códigos de operación las instrucciones de 32 bits y aquellas que contengan k en su código de operación. Observe que el operando indicado por k es a veces de 8 bits, a veces de 16 bits y a veces de 24 bits.

Todos los operandos se representarán como constantes numéricas en binario, decimal o hexadecimal.
  1. Un número binario quedará representado por el caracter '%' seguido de uno o más dígitos binarios '0' o '1'.
  2. Un número decimal quedará representado por uno o más dígitos decimales '0' a '9'.
  3. Un número hexadecimal quedará representado por el caracter '$' seguido de uno o más dígitos hexadecimales '0' a 'F'.
El programa ejecutable operanZZ deberá leer cada una de las líneas del archivo nemonico.txt y para cada una de ellas deberá escribir una línea en el archivo codigoop.txt como sigue:
  1. Si la línea de la entrada está en blanco entonces la línea de la salida deberá consistir únicamente del caracter '\n'.
  2. Si la línea de la entrada contiene blancos y un nemónico entonces:
    1. Si el nemónico corresponde con una instrucción que no tiene operandos de tipo k, entonces la línea de la salida deberá consistir únicamente del código de operación escrito en hexadecimal seguido del caracter '\n'.
    2. En cualquier otro caso la línea de la salida deberá consistir únicamente de la cadena "ERROR\n".
  3. Si la línea de la entrada contiene blancos, un nemónico y una constante entonces:
    1. Si el nemónico corresponde con una instrucción que sí tiene operandos de tipo k, entonces la línea de la salida deberá consistir del código de operación y la constante escritos en hexadecimal seguido del caracter '\n'.
    2. En cualquier otro caso la línea de la salida deberá consistir únicamente de la cadena "ERROR\n".
  4. En cualquier otro caso la línea de la salida deberá consistir únicamente de la cadena "ERROR\n".
Abajo encontrará un ejemplo del funcionamiento de este programa:

Ejemplo de entrada nemonico.txt
Explicación del ejemplo
Ejemplo de salida codigoop.txt
HOLA
BREAK
BREAK $5
JMP
JMP %101
%101 JMP
JMP %2
JMP $F 5
No es un nemónico
Instrucción sin operando
Sobra operando
Falta operando
Instrucción con operando
Línea en desorden
Constante errónea
Sobra operando
ERROR

ERROR
ERROR

ERROR
ERROR
ERROR

Tercera etapa: Símbolos : 10 puntos : 24 de marzo de 2011 a las 10pm

Cuarta etapa: Código objeto : 10 puntos : 7 de abril de 2011 a las 10pm