Comandos, parametros y bits de paridad.

Al final de la pagina anterior mencione que el data pattern esta divido en tres partes:

  1. Comandos.

  2. Parametros.

  3. Bits de paridad.

Dejando a un lado la forma de las señales en las lineas SDCKA y B, un frame con todas sus partes se ve de la siguiente forma:

Si pueden notar, hay un maximo en el numero de bytes por frame que se pueden enviar, en este punto no hablare de ello, eso lo platicare mas a fondo en las consideraciones especiales. Ahora explicare cada una de esas partes para que al final queden en claro todo lo que conforman una transmisión de datos por el MB.

El primer byte despues del start pattern es el Command Code, el MP maneja 254 comandos diferentes segun el documento de sega llamado MAPLE82E capitulo 6 (esta en el comprimido Hardware_Doc en la Documentación) pero realmente se manejan de forma convencionalmente 22 comandos si no estoy contando mal. Todos los comandos son para manejo de errores, transmision de datos, peticion de estados, etc. Dependiendo del tipo de proyecto que se quiera realizar va a ser necesario el uso de algunos de los comandos.

Los siguientes tres bytes son el destination AP, source AP y el data size. El destination AP y el source AP son bytes que indican de donde proviene la transmision y a donde va, el siguiente es el data size, que es donde se coloca el numero de bytes que están en la transmisión, pero el valor de este byte no dice directamente el numero sino que se tiene que multiplicar por 4 y el resultado es el numero de bytes totales en la transmisión.

El desination AP y el source AP son los dos tipos de AP que se manejan en el MB, AP significa Absolute Position y el AP esta compuesto de la siguiente forma:

Los bits POx indican en cual de los 4 puertos se esta llevando a cabo la transmisión.

El bit D/E indica si el AP proviene de un dispositivo como un control, o un dispositivo de expansión como una VMU o si el AP es de uno de los cuatro puertos.

Los bits LMx Se utilizan cuando el AP es de uno de los dispositivos de expansión, se haría uso de los LM cuando la dreamcast quiera leer una VMU en un dispositivo (control). (ver documento MAPLE82E tema LM-Bus capitulo 5)

Lo siguiente es el campo de los datos o DATA como se ve en la imagen, dentro de los datos se debe colocar algo extra ademas de los datos a transmitir que se llama Function Type. Se incluye en algunos comandos y sirve para indicar a que tipo de dispositivo al que esta orientado el comando enviado que puede ser un control, un volante, teclado, etc. por eso el function type varia en tamaño y datos incluidos según el tipo de dispositivo.

Finalmente están los parity bits, que es un byte que sirve para verificar que los datos recibidos estén correctos, la verificación es con un XOR bit a bit de todos los bytes enviados

. Ahora bien vamos a analizar un paquete de datos:

Durante mis investigaciones y sniffing del MB de mi dreamcast, realicé apuntes y leeia a mano el MB. El siguiente paquete de datos lo envía la dreamcast a cada uno de los 4 puertos continuamente para detectar dispositivos conectados, no tenia conectados controles en ese momento en la dreamcast y estaba haciendo sniffing del puerto A y no tenia disco de juego corriendo.

00000000 Data size

00000000 Source AP

00100000 Destiny AP

00000001 Command code

00100001 parity bits

Primero que nada se puede notar que el orden en que están los datos anteriores es diferente al que esta descrito en la patente y en lo descrito anteriormente, lo que sucede es que se manejan algunas cosas en little endian, o sea que los últimos bytes son los primeros.

Ahora el análisis del paquete:

  • Data size es cero, por que no hay datos que enviar.

  • Source AP son POx igual a cero, D/E cero y los bits LM tambien son cero, lo que indica que el AP fuente es el Puerto A

  • Destiny AP, POx son cero indicando que el dispositivo destino esta conectado al puerto A, D/E es uno lo que indica que el AP es hacia un dispositivo como un control o un teclado por lo tanto como D/E es uno entonces los LM deben ser cero, por que los LM se refieren a dispositivos de expansión conectados al LM-Bus.

  • Command code es 01h que indica comando de Device Request (documento MAPLE82E capitulo 6).

  • Los parity bits son para verificar la integridad de la información, cuando cada parte recibe un frame, se calculan los parity bits y se comparan con los del frame, si son iguales quiere decir que los datos son correctos, si no pues quiere decir que algo anda mal. Los parity bits se generan de la siguiente forma: se toman todos los bytes de información recibidos y se separan en columnas, se hace una operacion XOR entre los dos primeros bits y se toma el resultado y se hace una operacion XOR entre el resultado y el tercer bit y se repite la operacion hasta que se ha hecho con todos los bits de la columna, al final obtenemos un solo bit, esta operacion se repite con las 7 columnas restantes y finalmente obtenemos un byte completo, este byte se compara con el byte llamado parity bits, ambos deben ser iguales para indicar que los datos no estan corruptos. Calculemos la primer columna del paquete mostrado anteriormente, tomando la primer columna (numeros entre corchetes) aplicamos el procedimiento para calcular el parity bit.

0000000[0] Data size

0000000[0] Source AP

0010000[0] Destiny AP

0000000[1] Command code

00100001 parity bits

0 (Data Size) XOR 0 (Source AP) = 0

0 (Resultado anterior) XOR 0 (Destiny AP) = 0

0 (Resultado anterior) XOR 1 (Commando code) = 1 (Primer parity bit)

El resulatdo es 1 y comparando con el parity bit de esa columna que es tambien 1 entonces se puede decir que esa columna es correcta, aplicando el mismo procedimiento a las demás columnas podremos verificar a mano la integridad de los datos, o esto nos puede servir en el caso de que nosotros queramos no se... enviar o pedir alguna información a la Dreamcast o a algún periférico como un control o mando, debemos tener en cuenta los parity bits bien calculados acorde a los datos que estemos enviando, este calculo abarca desde el Data size hasta el ultimo byte de la sección Data (o sea el ultimo byte antes del byte llamado parity bits).