Hola:
Estos días he estado mirando un poco tu Programa Ensamblador,
PhSoft y tratando de entenderlo. Más o menos entiendo, o intuyo, lo que haces aunque bueno mis conocimientos de Ensamblador son muy muy MUY LIMITADOS. :-(
"Googleando" también encontré un Documento sobre el Cassette en el MSX. El documento en cuestión está aquí:
http://www.msxarchive.nl/pub/msx/docs/hardware/msx-tape.docComo creo que puede resultar de interés hago un "Ana Rosa Quintana" (copy & paste) aquí:
MSX Tape I/O
-------------
BIT AND BYTE ENCODING
Information on tape is stored as square waves of 1200 or 2400 baud. The
encoding used is FSK (frequency shifting key). The next table shows the
relation between the selected recording speed, the bits and the pulses
put on tape:
bps bit encoding freq (Hz)
_______
1200 0 _______| | 1200
___ ___
1200 1 ___| |___| | 2400
___
2400 0 ___| | 2400
_ _
2400 1 _| |_| | 4800
Each byte is put on tape as a sequence of 11 bits:
0 b0 b1 b2 b3 b4 b5 b6 b7 1 1 (one startbit, 2 stopbits, LSb first)
Futhermore 2 kinds of headers are used: short and long, a long header being
4 times as long as a short one. They consist of a series of square wave pulses
(bit value 1):
bps header freq (Hz) nr of pulses
1200 short 2400 4000 (5/3 sec)
1200 long 2400 16000 (20/3 sec)
2400 short 4800 8000
2400 long 4800 32000
FILE FORMATS
Files on tape are stored in two blocks. The first block is the filedescriptor,
the second contains the filedata. Three types of files exist:
BASIC file, memory dump and data file.
BASIC File (CSAVE/CLOAD)
filedescriptor: long header
10x #D3 (filetype)
6 bytes filename
file data: short header
tokenized BASIC
7x #00
memory dump (BSAVE/BLOAD)
filedescriptor: long header
10x #D0
6 bytes filename
file data: short header
2 bytes start address
2 bytes end address
2 bytes exec address
memory dump
data file (SAVE/LOAD/OPEN)
filedescriptor: long header
10x #EA
6 bytes filename
file data: short header
block of 256 bytes
short header
block of 256 bytes
....
last block contains 256x #1A (^Z/EoF)
Así pues tenemos que en MSX hay 3 tipos de Carga/Grabación desde/en Cassette:
-CLOAD/CSAVE.
-LOAD/SAVE.
-BLOAD/BSAVE.
Hay 2 velocidades diferentes para grabar nuestros Programas:
- 1200 baudios.
- 2400 baudios.
Cada Byte se graba siempre añadiendo un bit por la Izquierda (un
0) que indica el comienzo, luego iría el
Byte propiamente dicho, y al final se añaden dos bits (
dos CEROS) que indican el final del Byte.
Los Ficheros-Programas para grabarse en Cinta se graban en
2 Bloques:
- Un primer Bloque (
Descriptor de Fichero) que nos indica el tipo de Fichero.
- Un segundo Bloque que contiene los
Datos propiamente dichos.
Cada Tipo de Fichero (CLOAD, LOAD, BLOAD) tiene sus peculiaridades:
1.
Ficheros CLOAD --> (BASIC) ■
Descriptor de Fichero, formado por:
-Cabecera Larga.
-10 bytes con el valor "
D3" (el valor "D3" nos indica que es un Fichero CLOAD)
-6 bytes que contienen el nombre del Fichero.
■
Datos propiamente dichos del Fichero, formados por:
-Cabecera Corta
-Caracteres del Programa BASIC "Tokenizados"
-7 bytes con el valor "
00" que indican el final del Fichero.
2.
Ficheros LOAD/OPEN --> (ASCII) ■
Descriptor de Fichero, formado por:
-Cabecera Larga
-10 bytes con el valor "
EA" (ese valor "EA" nos indica que es un fichero de tipo LOAD/OPEN)
-6 bytes con el nombre del Fichero.
■
Datos propiamente dichos del Fichero, formados por:
-Cabecera Corta.
-Bloque de 256 bytes -Cabecera Corta.
-Bloque de 256 bytes -Cabecera Corta.
-Bloque de 256 bytes ..........................
..........................
-Cabecera Corta.
-Un último Bloque que contiene 256 bytes con el valor "1A" (ese valor "1A" indica el final del Fichero)
3.
Ficheros BLOAD --> Código Máquina:
■
Descriptor de Fichero, formado por:
-Cabecera Larga.
-10 bytes que contienen el valor "
D0" (este valor "D0" nos indica que es un Fichero de Tipo BLOAD)
-6 bytes con el nombre del Fichero.
■
Datos propiamentes dichos del Fichero, formados por:
-2 bytes, que contienen la Dirección de
Inicio.
-2 bytes, que contienen la Dirección
Final.
-2 bytes, que contienen la Dirección de
Ejecución.
-El Volcado de los Datos del Programa que están en memoria.
-La Instrucción
TAPION (Dir.
&H00E1), hace un "Motor On" y lee una Cabecera del Cassette (tanto larga como corta).
-La Instrucción
TAPIN (Dir.
&H00E4), lee solamente un Byte del Cassette.
-La Instrucción
TAPIOF (Dir.
&H00E7), pone fin a la Lectura desde el Cassette.
Preguntas que me surgen...
1. ¿La Instrucción "TAPION" lee CABECERAS tanto largas como cortas, ¿verdad?
2. Cuando se comienza a leer un Programa al principio hay un Bit/Byte que indica el tipo de velocidad: 1200 ó 2400 Baudos. El tipo de Velocidad lo obtenemos de la Cabecera Larga, ¿verdad? La velocidad con la que ha sido grabado el Programa entiendo que viene al Principio y es un Dato que siempre está presente para todos los Tipos de Fichero: CLOAD/LOAD/BLOAD, ¿cierto?
3. ¿Cuál es la Estructura de esa Cabecera Larga?
4. En los Ficheros de Tipo LOAD entiendo que cada Bloque de 256Bytes está precedido por una Cabecera Corta, ¿cierto?
5. Cuando leemos las Direcciones de Inicio/Fin/Ejecución en los Ficheros "BLOAD" se interprenta al revés, ¿verdad? Es decir si al leer de la Cinta primero tenemos "
00" y luego "
1A" la dirección sería "
1A00", ¿correcto?
Gracias & Saludetes. ;-)