Juas lo del BEGIN no me fijara bueno, lo importante es que ahora el programa ya tiene otra pinta, que no quiero ofenderte, pero el código anterior parecia un poco chapuzas...

Sinceramente, raro si que es lo de que no te deje usar ReadString, y lo de Read 2 veces también... la única explicación que le puedo encontrar es:
que la definición de variable string que hiciste no fuera aceptable para tu compilador, basicamente hay 3 tipos de variables aceptables como String:
Forma 1:
TYPE string= [0..N] ARRAY OF CHAR;
(*TYPE string= ARRAY OF CHAR; es otra opción*)
VAR cadena: string;
Forma 2:
VAR string: [0..N] ARRAY OF CHAR;
Forma 3:
VAR string: ARRAY OF CHAR;
(*simplemente es una variación del anterior poniendo el string como vector abierto*)
NOTA: string y cadena pueden ser cualquier identificador válido de Modula2

Muchas veces hay fallos porque la gente en lugar de declarar las variables STRING así comete algun fallo del tipo:
VAR cadena: [1..10] ARRAY OF CHAR;
En este caso es un Array, pero no un STRING valido (aunque haya compiladores que lo acepten)... ya que para ser un STRING tiene que empezar siempre en 0 y tiene un tamaño N porque el último caracter es siempre "0c".
Tu declaras la cadena como:
TYPE cadena = ARRAY[1..8] OF CHAR;
, por lo cual seguramente es el fallo...

En cuanto a lo de tener que poner 2 veces Read, pues no se que decirte, realmente es "raro raro". Aun así te recomiendo que hagas un cambio, en lugar de asiganar el valor directamente al Array, pues que lo pases primero por una variable:
VAR c: CHAR;
...
c:="5"; (*por inicializarlo a un valor*)
Read(c);
a[j]:=c;
Esta es una forma mucho más correcta (la otra también lo es, pero en menor grado, aunque tiene que funcionar siempre) en programación estructurada, ya que tal como lo haces, realizas una doble asignación en un solo paso y la programación estructurada purista (cumpliendo normas y recomendaciones -éstas últimas no obligatorias-) dice que jamás se deben hacer operaciones multiples, y en tu caso primero guardas un valor CHAR en una variable y posteriormente el valor en un Array (aunque el array estea compuesto de CHARs se considera una doble asignación)...pero es una medida para que el código sea más claro, no ofecta al programa en si.
Realmente, la única posible explicación (y es bien rebuscada) es que tengas que hacerlo 2 veces porque ese nodo del Array no este inicializado y la primera vez se inicialice y la segunda cargue el valor, aunque realmente me parece una jilipollez, vete tu a saber, porque hay que recordad que aunque externamente (para el programador) los arrays en Modula 2 son estaticos, realmente, internamente (para el compilador y posteriormente en ejecución) son dinámicos...

Por otro lado, lo que dice Giskard tiene mucha lógica, aunque precisamente una de las pecualidades del Modula 2 es que también se pueden capturar Intros directamente (si cuando te pide la variable pulsas directamente Intro)... aunque no debería de suceder eso si escribes algo, ya que solo guarda un caracter y siempre el primero desde la posición inicial del cursor y teóricamente no guarda estados anteriores... pero como cada compilador es un mundo... y puede ser que aqui suceda eso.

En cuanto a tu error "f" yo le encuentro una explicación, anque tendría que saber cual erra la siguiente linea de código. Y la expliación es simple, que despues venga un END y en ese caso no debe ponerse el ";", aun así, funciono o no, jamás debes hacer eso en programación estructurada (bueno, puedes hacerlo pero entonces estarías programando no programando estructuradamente), ya que estas poniendo en una sola linea de código 2 operaciones, y en este caso 2 operaciones complejas... si bien parece que queda muy bien visualmente, cuando el progrma tiene cierta extensión, eso resta legibilidadad al código y además complica la función del precompilador...

Un Saludo

PD: a ver si en los proximos días remato el segundo tema, que al final me retrase de lo previsto, juas menudo fin de semana que tuve...