Peculiaridades del ensamblador para la CPU de un ciclo de S.E.M.
==============================================================================

El formato genérico de una línea de código fuente es:

etiqueta:  mnemónico/directiva  operando,operando...  ;(comentarios)
etiqueta=  expresión  ; (comentarios)

La etiqueta puede estar o no estar presente. El nombre de la etiquena no puede empezar con un dígito numérico y debe estar terminada bien por dos puntos ':' o por igual '='. En el primer caso a la etiqueta se le asigna la dirección de la instrucción actual, mientras que en el segundo se asigna el resultado de evaluar la expresión que sigue. 
Los operandos pueden ser registros ('R0' a 'R7') o expresiones evaluables para los casos de operandos literales. En el caso de los saltos relativos a estas expresiones se les resta de forma automática la dirección de la instrucción para obtener un desplazamiento con signo.

Ejemplos:

			ORG		0x120
label1:		LDI		R1,<const16		;	label1 pasa a valer 0x120

label2=		0x314					;	label2 pasa a valer 0x314

Obsérvese que el segundo operando de la instrucción LDI del ejemplo es una expresión. En particular es el byte menos significativo (<) del valor de la etiqueta 'const16' que debe estar definida en alguna otra parte del programa.

A la hora de evaluar etiquetas, mnemonicos, registros, y expresiones no se consideran diferencias entre mayúsculas y minúsculas. Esto sólo es relevante para las constantes y cadenas en ASCII. Así por ejemplo 'A' vale 0x41 mientras que 'a' vale 0x61.

DIRECTIVAS
==========
Estas son las directivas soportadas:

	ORG <expresión>	 Hace que el contador de direcciones pase a tener el valor indicado.

	WORD <expresión> Genera directamente una palabra en el código con el valor indicado

	ASCZBE "texto entre comillas dobles" 
Empaqueta los caracteres ASCII del texto en una serie de palabras, dos bytes por palabra, con el primer byte del texto en la parte más significativa de la primera palabra generada. La cadena de texto se termina con uno o dos bytes en cero, hasta completar un número par de bytes.

	ASCZLE "texto entre comillas dobles" 
Empaqueta los caracteres ASCII del texto en una serie de palabras, dos bytes por palabra, con el primer byte del texto en la parte menos significativa de la primera palabra generada. La cadena de texto se termina con uno o dos bytes en cero, hasta completar un número par de bytes.

Las cadenas de texto pueden incluir caracteres de escape para generar caracteres especiales. Estos caracteres comienzan por la barra de escape '\' y son:

	\r		Retorno de carro (ASCII 0x0D)
	\n		Nueva línea	(ASCII 0x0A)
	\t		Tabulador (ASCII 0x09)
	\b		Backspace (ASCII 0x08)
	\"		Comillas dobles (ASCII 0x22)
	\'		Comillas simples (ASCII 0x27)
	\\		Barra de escape (ASCII 0x5C)
	\e		Escape (ASCII 0x1B)


EXPRESIONES
===========
Las expresiones incluyen constantes numéricas, variables predefinidas, etiquetas, y sus posibles combinaciones mediante operaciones aritméticas y/o lógicas. A continuación describimos estos componentes:

Constantes numéricas:

	512		Constante expresada en base decimal
	0x200	La misma constante en base hexadecimal
	'A'		valor del código ASCII de la letra A mayúscula.

Variables predefinidas:

	.		(punto) Es el valor actual del contador de direcciones.
			Ejemplo de uso: "		JR	.	; bucle indefinido"

	CPUMODEL	Tipo de CPU para el que se genera el código. 0: CPU original, 1: CPU con pipeline.

Operadores unarios:
Son el primer caracter de la expresión:

	-valor	La expresión "valor" se cambia de signo mediante el cálculo de su complemento a dos.
	~valor	Los bits de la expresión "valor" se invierten (complemento a uno)
	<valor	Los 8 bits menos significativos de la expresión "valor". Equivale a (valor&0xff)
	>valor	Los 8 bits más significativos de la expresión valor. Equivale a (valor>>8)

Operadores binarios:

	a+b		La suma de las expresiones a y b
	a-b		La resta de a y b
	a*b		El producto de a por b
	a/b		La división entera de a entre b
	a%b		El resto (módulo) de la división entera de a entre b
	a&b		La AND lógica de los bits de a y de b
	a|b		La OR lógica de los bits de a y de b
	a^b		La función O-exclusiva (XOR) de los bits de a y de b
	a>>b	a desplazado b bits a la derecha. Se introducen ceros en los bits MSB.
	a<<b	a desplazado b bits a la izquierda. Se introducen ceros en los bits LSB.

Paréntesis:
	Permiten especificar el orden de las operaciones en expresiones complejas. A continuacón se muestran algunos ejemplos:

	indice=		(etiq2-etiq1)/2

	pos=		base+(resvd+indice)*2

	divider=	(FCLK/16+BAUD/2)/BAUD-1

				TSTI	R0,(1<<RX_AVIL)

				ANDI	R0,(~((1<<ENAB)|(1<<PWON)))&0xf

				org		(.+0x000f)&0xfff0	; alinea a múltiplo de 16

Las expresiones se evalúan usando aritmética entera de 32bits, lo que suele evitar los desbordamientos en los resultados intemedios, pero no se comprueba tal eventualidad. 

Fichero de salida
=================

El fichero de salida contiene una secuencia de segmentos de memoria listados como valores hexadecimales de 16 bits. Cada segmento comienza con una marca de dirección del tipo "@abcd" a la que sigue un listado de los datos del segmento. 

Ejemplo con dos segmentos, uno de una única palabra en la dirección 0x0000 y otro de 5 palabras en la dirección 0x0200:
	@0000
	F200
	@0200
	6F02
	F002
	FFFE
	0081
	6887
Este tipo de ficheros se pueden leer en lenguaje Verilog mediante:
	$readmemh

Opciones de línea de comando
============================

La línea de comando del ensamblador cruzado para la CPU de un ciclo es:

./ucasm [opciones] sourcefile.asm

Hay dos posibles opciones para indicar en la línea de comandos:

-o outputfile.hex	Indica el nombre del fichero de salida. Por defecto es "out.hex"

-l listfile.lst		Indica el nombre del fichero de listado. Por defecto es "out.lst"


