Listado de MNEMÓNICOS del Z80 – Ordenados por DIRECCIÓN

OK-MSX_-_MNEM_NICOS_por_N_MERO_-_MSX_EXTRA_-_1

OK-MSX_-_MNEM_NICOS_por_N_MERO_-_MSX_EXTRA_-_2

OK-MSX_-_MNEM_NICOS_por_N_MERO_-_MSX_EXTRA_-_3

Publicado en Sin categoría | Deja un comentario

Listado de MNEMÓNICOS del Z80 – Ordenados por NOMBRE

Publicado en Sin categoría | Deja un comentario

Entrevista a Ramón Sala, autor del Ensamblador/Desensamblador RSC / RSC II

Hola a todos:

Pues bien pese a que este material ya lo tengo desde hace tiempo por unas cosas y por otras lo he ido procrastinando, procrastinando y procrastinando y no ha sido hasta hoy que me he decidido a publicarlo. 😉

Si como yo lleváis ya tiempo en la escena MSX-era, eráis lectores de la MSX-Club y además os gustaba el tema de la Programación seguro que habéis oído hablar del Ensamblador/Desensamblador RSC / RSC II. Para quien no lo conozca decir que era un Ensamblador / Desensamblador de la época, en mi opinión MUY BUENO (yo era el que usaba y sigo usando) y encima “Made in Spain”. Desde luego para la época fue todo un lujo contar con Software como ese. Además recuerdo que incluso luego se llegó a incluir en la MSX-CLUB una Sección/Curso sobre el Ensamblador al hilo de la publicación del RSC.

Viendo Entrevistas publicadas en otras Web, como por ejemplo alguna de Konamito, a Carlos Mesa y otras que han aparecido de Jesús Manuel Montané y demás, siempre me ha “picado el gusanillo” de saber qué fue de otras de las personas que aparecían en la MSX-CLUB. Por ejemplo siento curiosidad de saber qué ha sido de Willy Miragall, Ronald Van Ginkel y que alguien les haga una Entrevista en “profundidad” y que nos cuente cosas de la época, entresijos de la MSX-Club, etc, etc, etc.

Pues bien, en esta ocasión, cosas de la vida y del “azahar” (que diría Millán, el de Martes y 13) di por causalidad con el autor del RSC y casi casi como que le “asalté” para hacerle un amago de “Entrevista”. Lamentablemente no le pillé en un buen momento porque no disponía de mucho tiempo pero tuvo la AMABILIDAD de responder e intentar saciar mi curiosidad.

Así que sin más dilación, vamos allá con el amago de “Entrevista”:

 




 ¡Hola Ramón!:

En primer lugar mil gracias por contestar.

No sé si sigues o no de alguna forma el mundo de la Emulación y en concreto el del MSX. El caso es que ayer charlando sobre temas de Ensamblador y demás en un Grupo de Desarrollo de MSX en Facebook salió el tema del RSC II.

Alguien me preguntaba que porqué no usaba otros Ensambladores/Desensambladores y yo respondí que bueno, que el RSC me gustaba, que me parecía un Ensamblador / Desensamblador bastante cómodo y potente y encima estaba hecho en España y en español. Luego además estuve releyendo varias Entrevistas que se han publicado sobre algunos miembros de la extinta MSX-CLUB:

http://www.msxblog.es/carlos-mesa-redactor-y-director-de-msx-club/

http://www.msxblog.es/entrevista-a-jesus-manuel-montane-msx-club/

Siempre sentí curiosidad por conocer algo sobre el autor del RSC ya que apenas se sabe nada y googleando un poco parece ser que he tenido la suerte de dar con él. En principio iba tan sólo a hacerte algunas preguntas a nivel particular pero ya que estamos y tras leer las Entrevistas hechas a Carlos Mesa y Jesús Manuel Montané pues creí que sería mejor hacerlo en modo de “Entrevista” y si te parece bien pues compartirlo. Así que vamos allá:

Nota: perdona que te “asalte” así pero es que me ha podido la emoción, así que espero que perdones este ímpetu mío y te agradecería respondieras a mis preguntas y cuentes todo lo que quieras, ¡qué bienvenido será…! Probablemente luego colgaré la Entrevista, si te parece bien, en mi Blog:   https://yotambientuveunmsx.wordpress.com/
(si logro ésto sería más feliz que una perdiz…) XD

Nota 2: te he reeenviado el Correo porque no sé si el otro se te traspapeló, o quizás tan sólo sea que no hayas tenido tiempo a contestarme o quizás que te hayas asustado y salido corriendo al leerlo…. (que espero que no sea el caso) XD

 

1. ¿Podrías contarnos algo sobre el pimer MSX que tuviste? (qué modelo/s tuviste, cuándo te lo regalaron, para qué lo usabas,  ….)

En estos momentos no le puedo dedicar tiempo al ordenador, así que voy a intentar comentarte brevemente todo lo que recuerdo (vagamente) de MSX.  Llegué a la informática tarde, a los 25 años, comparado con otras personas de mi generación, pero enseguida me sentí atraído por la programación de ordenadores.

Me compré yo mismo un MSX y, aunque no recuerdo el modelo, me parece que era el que tenía más prestaciones.

2. Yo al menos tan solo te “conocía” por ser el autor del RSC pero ayer me enteré que habías publicado algún Listado Basic en la MSX-CLUB. ¿Podrías comentarnos cuáles han sido tus colaboraciones en la MSX-CLUB, qué Listados y/o Artículos publicaste, etc?.

No estaba muy interesado en los juegos, aunque admito jugué con más de uno,  pero me interesó más la programación.

3. ¿Qué te llevó a hacer el Ensamblador/Desensamblador RSC?, ¿fue idea tuya?, ¿surgió de la necesidad que tuviste para poder programar más cómodamente sobre el MSX teniendo una Herramienta más potente?

Para hacer programas era necesario un ensamblador, así que me puse a programar el RSC.

4. ¿Qué versiones sacaste del RSC? Hasta donde yo sé creo que habría 3 versiones: el RSC, el RSC 2.0 y el RSC II. ¿es correcto?, ¿cuáles son las mejoras que incluían cada versión?

Creo recordar que, efectivamente, hubo tres versiones: RSC, el RSC 2.0 y el RSC II, pero lamento decir que no recuerdo las mejoras de cada una de ellas. Enseguida me compré un PC y el MSX quedó totalmente olvidado.

5. ¿Conservas alguna copia de esas versiones del RSC, Manuales, Código Fuente Original, etc?

Accidentalmente perdí los códigos fuente de todos los RSC, cosa que lamento porque me gustaría tenerlos.

6. ¿Tuviste contacto directo con alguno de los Colaboradores de la Revista (Willy MIragall, Carlos Mesa, Jesús Manuel Montané, Ronie Van Ginkel…)  y/o visitaste la Redacción de la MSX-Club?

Efectivamente, tuve contacto con casi todos los colaboradores de la revista y visité en muchas ocasiones la redacción de la MSX-Club. De hecho, ellos se pusieron en contacto conmigo para publicar el programa en su revista.

7. ¿Cuál era tu opinión sobre la Revista MSX-Club?, ¿y sobre los Redactores?.

Mi opinión era que la revista MSX-Club era la mejor que se podía encontrar y sus redactores eran gente seria.

8. ¿Alguna anécdota que nos puedas contar sobre tu relación con la MSX-CLUB o en general algo que nos quieras contar de aquella época dorada del MSX?

Hombre, anécdota en particular ninguna, simplemente tuve una buena relación con ellos.

9. No sé si después de la muerte comercial del MSX has seguido de alguna forma ligado al Sistema a través de Emuladores, de Foros, Web sobre el Sistema, etc. ¿Sigues en la actualidad el tema del MSX?, ¿usas algún Emulador o MSX Real?,  ¿estás al tanto de los Proyectos que han salido y van a salir? Por si no estás al tanto te dejo alguna información:

Cartucho MFR de Manuel Pazos para poder cargar imágenes DSK y juegos en formato “.dsk” en cualquier MSX, MSX-2, MSX-2+ o Turbo-R: 

https://www.msx.org/es/news/hardware/es/megaflashrom-scc-sd

Rookie Drive (es un proyecto que saldrá dentro de poco (de hecho acaba de salir ya) y que permite además conectar al MSX memorias USB para cargar Programas):

http://rookiedrive.com/es/inicio/

– Un nuevo modelo de MSX que vendría a ser un MSX “supervitaminado” y con muchísimas mejoras y ampliaciones: el MSX VroBit:

https://vrobit.com/en/blog/project-presentation-n2

Como te comentaba antes, poco después de un año me compré un PC y abandoné completamente el MSX. Desde entonces me he dedicado a la programación de los PC y actualmente hay un ensamblador para Windows (llamado Easy Code) que goza de muy buena prensa. Es gratuito y se puede bajar en  http://www.easycode.cat

10. ¿Sigues alguna Web o Foro relacionado con el MSX?

No.

11. ¿Cúales eran tus Juegos o Programas favoritos del MSX?

Lo cierto es que no lo recuerdo, pero es que más bien me dedicaba a programar utilidades.

12. ¿Qué opinabas sobre que la mayoría de los Juegos que nos llegaban fueran meras Conversiones de Spectrum?

Pues que me imagino que había pocos programadores de juegos que se dedicaran a MSX.

13. ¿Qué Programas llegaste a desarrollar para el MSX?, ¿Qué lenguajes usabas?, ¿llegaste a realizar algún Juego?

Desarrollé el Ensamblador RSC y un Programa de Utilidades (del tipo PC Tools) que permitía recuperar archivos borrados, etc.

14. Sobre el RSC, ¿cómo surgió comercializarlo a través de la MSX-Club?, ¿se lo pediste tú a la Revista presentándoles el Programa para que valoraran su comercialización?, ¿fue la Revista quién te lo pidió a ti?, ¿podrías darnos una aproximación sobre el número de copias que crees que se llegaron a vender de las diferentes versiones de tu RSC?

Envié el listado del código fuente de RSC a MSX-Club y Willy Miragall se puso en contacto conmigo. A partir de ese momento empezó mi relación con ellos.

15. ¿Qué supuso el MSX en tu vida?, ¿marcó el desarrollo de tu carrera profesional actual?

Efectivamente, supuso el inicio de mi carrera profesional. Actualmente, y desde hace muchos años, trabajo como programador de  aplicaciones para Windows.

16. Aparte del MSX, ¿fuiste Usuario de algún otro Sistema de 8 Bits o de 16 Bits?

Sí, como te comentaba antes, compré el primer modelo de IBM PC (un clon, para ser exacto) y desde entonces me he ido actualizando en este sistema. Actualmente tengo un ordenador con procesador Intel Core i7 6700 @ 3.40GHz.

17. Entiendo que el hecho de haber programado el RSC se debía a que te gustaba ese Lenguaje. ¿Cuál era la parte o funcionalidad de la que te sentiste más orgulloso al crear el RSC y qué era lo que menos te gustaba?, ¿Usas o usaste algún Ensamblador “cruzado” sobre PC para programar en MSX alguna vez?

En general me sentí y me siento orgulloso de RSC porque fue un programa importante en su momento, y así lo entendieron también en MSC-Club.

No, nunca  usé un Ensamblador “cruzado” sobre PC para programar en MSX.

18. Como Programador, ¿qué opinión te merecía el MSX?, ¿piensas que era realmente superior al resto de 8 Bits?, ¿piensas que el hecho de que hubiera tantos Modelos de MSX distintos con distintas con figuraciones de Memoria y pequeñas diferencias a nivel de Hardware eran una ventaja o un inconveniente?

En su momento creo que MSX fue el mejor ordenador personal que se podía tener. Lo que ocurrió es que enseguida apareció el IMB PC y aunque era muy superior también era muy caro, pero muy pronto aparecieron los “clones” a precios muy asequibles y eso marcó el fin del MSX.

19. ¿Llegaste a tener usar MSX-2, MSX-2+, MSX-Turbo R?

Llegué a tener un MSX-2

20. ¿Piensas que cualquier tiempo pasado fue mejor?, ¿qué ventajas e inconvenientes, o qué es lo que más te gusta y lo que menos te gusta de la Informática de los 8 Bits y de la Informática actual?, ¿A qué te dedicas en la actualidad?

Para mí la informática de 8 y 16 bits está totalmente obsoleta y hace más de una década que no trabajo con ella, incluso los 32 bits están empezando a pasar a la historia con la llegada de los 64 bits. Actualmente formo parte de un equipo de desarrollo de aplicaciones de una importante empresa catalana.

21. ¿Conservas en la actualidad algún vínculo-contacto con algún miembro de la MSX-CLUB?, ¿sabes algo de ellos?

No mantengo ningún contacto con nadie de MSX-Club ni sé nada de ninguno de ellos.

22. ¿Qué has pensado-sentido-…. cuándo has visto mi Correo y esta pseudo-“Entrevista”?, ¿te han venido recuerdos gratos que te ha apetecido “desenterrar” o te han dado ganas de echar a correr y no responder…?

Pues sí que me han venido buenos y gratos recuerdos, siempre los tendré, pero no me ha entusiasmado especialmente tener que responder a tantas preguntas porque no dispongo de mucho tiempo. Aun así, y por cortesía, lo estoy haciendo.

23. ¿Algo que quieras añadir  y que no esté reflejado en las anteriores preguntas?

Nada especial que no se haya dicho ya. El MSX fue un buen sistema que introdujo a mucha gente en el mundo informático.

Pues esto ha sido todo. Agradecerte Ramón que hayas respondido a mi Correo y que nos hayas dedicado esta parte de tu tiempo para responder a estas preguntas y a mi “malsana” curiosidad… 😉 




 

Pues lo dicho, desde aquí agradecer públicamente a Ramón el haberme dedicado parte de su tiempo y haber respondido a mi “batería” de preguntas… XD

Gracias & Saludetes. 😉

Publicado en Sin categoría | 3 comentarios

Listado TOKENS MSX – Cómo Ejecutar BASIC desde ENSAMBLADOR

¿Qué es un TOKEN?

Un TOKEN es un código que sustituye a un Comando Basic.

El MSX BASIC internamente nunca guarda en memoria el comando de forma “literal”, ya que esto ocuparía mucho espacio. Lo que hace después de finalizar la introducción/modificacion de una línea es reconocer todas los comandos usados y se sustituyen por sus respectivos códigos –> TOKEN.

El Ordenador, en su ROM, asigna a cada Comando un número y éste es el que se almacena cuando se utiliza dicho Comando.

Es decir, por ejemplo, para un comando PRINT, nuestro querido MSX  le asigna un valor numérico que se grabará con la instrucción.

Existe un truco muy simple para determinar la relación entre Comandos<–>Token. Introduzcamos en Basic esta línea:

10 REM Hola

El Token para el comando REM está inmediatamente después del número de línea. Sabiendo que la Dirección de inicio del Basic es &h8000 tenemos que nuestra línea se almacena a partir de la dirección &h8005. Si hacemos:

PRINT PEEK(&h8005) nos devuelve el valor 143 en decimal, que equivale a 8F en Hexadecimal. –> Luego sabremos que el Token asociado al Comando REM es el valor hexadecimal 8F.

Sustituyamos ahora ese Token por otro, haciendo esto:

POKE &h80005, &h91

Si ahora ejecutamos LIST veremos que nuestra línea ha cambiado y ahora tendremos:

10 PRINT Hola

Hagamos ahora POKE &h80005, &h84 y hagamos un LIST con lo que obtendremos ahora:

10 DATA Hola

Luego sabemos que el valor hexadecimal 84 es el Token asociando al comando DATA. Fácil, ¿verdad?. 😉

Para facilitarnos la vida y que no tengamos que comprobar uno por uno la relación entre Comandos Basic y Token aquí os dejo este Listado.

Nota: Para simplificar el Listado a nivel “visual” he omitido poner “H” o “&H” delante de cada Token / Dirección, pero debéis tener en cuenta que estamos hablando siempre de valores de Token y de Memoria hexadecimales.

Listado de Instrucciones BASIC con sus respectivos TOKEN y DIRECCIÓN

Comando  Token Dirección     Comando  Token Dirección
ABS      06    39E8          LOC      2C    3A34
AND      F6    3A18          LOCATE   D8    39DC
ASC      15    3A06          LOF      2D    3A36
ATN      0E    39F8          LOG      0A    39F0
ATTR$    E9    39FE          LPOS     1C    3A14
AUTO     A9    3973          LPRINT   9D    394C
BASE     C9    39BE          LSET     B8    399C
BEEP     C0    39AC          MAX      CD    39C6
BIN$     1D    3A16          MERGE    B6    3998
BLOAD    CF    39CA          MID$     03    39E2
BSAVE    D0    39CC          MKD$     30    3A3C
CALL     CA    39C0          MKI$     2E    3A38
CDBL     20    3A1C          MKS$     2F    3A3A
CHR$     16    3A08          MOD      FB    3A22
CINT     1E    3A18          MOTOR    CE    39C8
CIRCLE   BC    39A4          NAME     D3    39D2
CLEAR    92    3950          NEW      94    3954
CLOAD    9B    3962          NEXT     83    3932
CLOSE    B4    3994          NOT      E0    39EC
CLS      9F    396A          OCT$     1A    3A10
CMD      D7    39DA          OFF      EB    3A02
COLOR    BD    39A6          ON       95    3956
CONT     99    395E          OPEN     B0    398C
COPY     D6    39D8          OR       F7    3A1A
COS      0C    39F4          OUT      9C    3964
CSAVE    9A    3960          PAD      25    3A26
CSNG     1F    3A1A          PAINT    BF    39AA
CSRLIN   E8    39FC          PDL      24    3A24
CVD      2A    3A30          PEEK     17    3A0A
CVI      28    3A2C          PLAY     C1    39AE
CVS      29    3A2E          POINT    ED    3A06
DATA     84    3934          POKE     98    395C
DEF      97    395A          POS      11    39FE
DEFDBL   AE    3988          PRESET   C3    39B2
DEFINT   AC    3984          PRINT    91    394E
DEFSNG   AD    3986          PSET     C2    39B0
DEFSTR   AB    3982          PUT      B3    3992
DELETE   A8    397C          READ     87    393A
DIM      86    3938          REM      8F    394A
DRAW     BE    39A8          RENUM    AA    3980
DSKF     26    3A28          RESTORE  8C    3944
DSKI$    EA    3A00          RESUME   A7    397A
DSKO$    D1    39CE          RETURN   8E    3948
ELSE     A1    396E          RIGHT$   02    39E0
END      81    392E          RND      08    39EC
EOF      2B    3A32          RSET     B9    399E
EQU      F9    3A1E          RUN      8A    3940
ERASE    A5    3976          SAVE     BA    39A0
ERL      E1    39EE          SCREEN   C5    39B6
ERR      E2    39F0          SET      D2    39D0
ERROR    A6    3978          SGN      04    39E4
EXP      0B    39F2          SIN      09    39EE
FIELD    B1    398E          SOUND    C4    39B4
FILES    B7    39AA          SPACE$   19    397E
FIX      21    3A1E          SPACE$   19    3A0E
FN       DE    39E8          SPC      DF    39EA
FOR      82    3920          SPRITE   C7    39BA
FPOS     27    3A2A          SQR      07    39EA
FRE      0F    39FA          STEP     DC    39E4
GET      B2    3990          STICK    22    3A20
GOTO     89    393E          STOP     90    394C
GOSUB    8E    3948          STR$     13    3A02
GOTO     89    393E          STRIG    23    3A22
HEX$     1B    3A12          STRING$  E3    39F2
IF       8B    3942          SWAP     A4    3974
IMP      FA    3A20          TAB      DB    39E2
INKEY$   EC    3A04          TAN      0D    39F6
INP      10    39FC          THEN     DA    39E0
INPUT    85    3936          TIME     CB    39C2
INSTR    E5    39F6          TO       D9    39DE
INT      05    39E6          TROFF    A3    3972
IPL      D5    39D6          TRON     A2    3970
KEY      CC    3964          USING    E4    39F4
KILL     D4    39D4          USR      DD    39E6
LEFT$    01    39DE          VAL      14    3A04
LEN      12    3A00          VARPTR   E7    39FA
LET      88    393C          VDP      C8    39BC
LFILES   BB    39A2          VPEEK    18    3A0C
LINE     AF    398A          VPOKE    C6    39B8
LIST     93    3952          WAIT     96    3958
LLIST    9E    3968          WIDTH    A0    396C
LOAD     B5    3996          XOR      F8    3A1C

 

Ejecutar un Comando BASIC desde Ensamblador

Veamos ahora un ejemplo práctico del uso de los TOKEN…

Imaginemos que estás haciendo un Programa Ensamblador y necesitas ejecutar un Comando BASIC. Evidentemente puedes hacer el equivalente a dicho Comando a base de instrucciones Ensamblador pero si no dominas el tema puede que te resulte complejo. Algo tan simple como grabar un Programa en Disco supongo que requeriría muchas o bastantes líneas de Código lo cual implicaría además que tienes que conocer cómo funciona la Unidad de Disco, qué Rutinas de la BIOS utiliza, etc, etc, etc.

La idea Básica para hacer esto sería:

– Primero obtener la Dirección de la Instrucción BASIC que queremos ejecutar (podéis obtenerla de la Tabla que os  he puesto arriba).

– Definir una línea BASIC “virtual, que va a contener los parámetros necesarios que van a acompañar a esa Función.

– Importante acabar nuestra línea BASIC “virtual” con “&H00“.

Vamos a ver un ejemplo “chorra” en el que vamos a ejecutar desde Ensablador la instrucción: BSAVE”PATATA.BIN”, &HC000, &HC119

Es decir, vamos a grabar un Programa en Disco que se llama PATATA.BIN y que tiene como Dirección Inicial &HC000 y como Dirección Final &HC110.

El “complejo” Código sería este:

RSC II MSX 1.0                                                

   10 		ORG  &HC000
   20 BSAVEDSK:	EQU  &H39CC
   30 CHGET:	EQU  &H9F
   40 CALBAS:	EQU  &H159
   50 		LD   HL, LINBAS
   60 		LD   IX, (BSAVEDSK)
   70 		CALL CALBAS
   80 		CALL CHGET
   90 		RET 
  100 LINBAS:	DEFB &H22
  110 		DEFM "PATATA.BIN"
  120 		DEFB &H22
  130 		DEFM ",&HC000"
  140 		DEFM ",&HC119"
  150 		DEFB &H00
  160 FIN:	NOP

El Programa está hecho usando el Ensamblador/Desensamblador para MSX RSC II.

Vamos allá con las explicaciones:

– En la línea 10 indicamos a partir de que dirección queremos ubicar el Código del Programa. En nuestro caso: &HC000
– En la línea 20 tenemos la Dirección de la Instrucción BSAVE.
– La línea 30 tiene como finalidad que pulsemos una Tecla.
– La línea 40 nos servirá para ejecutar la Instrucción BSAVE.
– En la línea 50 hacemos que HL apunte a una falsa línea en Basic (LINBAS)
– En la línea 60 cargamos la dirección de la Rutina BSAVE.
– En la línea 70 ejecutamos la instrucción BSAVE.
– En la línea 80 esperamos a que se pulse una Tecla.
– En la línea 100 y posteriores definimos nuestra línea Basic “virtual” en la lo que hacemos simplemente es definir todos los argumentos-parámetros necesarios para completar la Instrucción BSAVE (lo que pongo abajo en negrita)

BSAVE “PATATA.BIN”, &HC000, &HC119

Pues bien, yo con lo que me liaba, entre otras cosas era en la definición de todos esos parámetros que pongo en negrita. No sabía como poner las comillas usando la instrucción DEFM, ya que no sería posible hacer esto: DEFM “”PATATA.BIN”” (no podemos meter el caracter “comillas”) así que lo tendremos que hacer por partes, es decir:

– En la línea 120 lo que hacemos es definir las “comillas” (&H22)
– En la línea 130 el nombre del Fichero (PATATA.BIN)
– En la línea 140 otra vez las comillas (&H22)
– Muy importante en la línea 150 hacemos que nuestra instrucción acabe con &H00.

La verdad es que se me antoja una opción muy potente el usar este método para ejecutar comandos y funciones BASIC desde nuestros programas en Ensamblador.

Toda esta Info viene recogida en el Libro-Manual “MSX TOP SECRET“, en concreto en el Tema 2 páginas 36 a 39. ¡¡¡1.000 gracias a su autor por toda esta Info!!!

Las Aplicaciones prácticas de todo ésto son ¡INFINITAS! y seguro que os pueden sacar de algún apuro en vuestro Programa Ensamblador. No sé si es la mejor forma, ni la más pedagógica pero desde luego seguro que es la más sencilla para hacer pruebas rápidas en vuestros Programas y no complicaros la vida si no domináis el Ensamblador. 😉

Nota: Las explicaciones del principio las he tomado del Libro “MSX – Consejos y Trucos“, de Data Becker.

Publicado en Sin categoría | Deja un comentario

MSX BASIC

MSX BASIC 1.0

  • ABS
  • AND
  • AS #
  • ASC
  • ATN
  • AUTO
  • BASE
  • BEEP
  • BIN$
  • BLOAD
  • BSAVE
  • CALL
  • CDBL
  • CHR$
  • CINT
  • CIRCLE
  • CLEAR
  • CLOAD
  • CLOAD?
  • CLOSE #
  • CLS
  • COLOR
  • CONT
  • COS
  • CSAVE
  • CSNG
  • CSRLIN
  • DATA
  • DEF FN
  • DEFDBL
  • DEFINT
  • DEFSNG
  • DEFSTR
  • DEFUSR
  • DELETE
  • DIM
  • DRAW
  • END
  • EOF
  • ERASE
  • ERR
  • ERL
  • ERROR
  • EQV
  • EXP
  • FIX
  • FOR TO STEP
  • FRE
  • GOSUB
  • GOTO
  • HEX$
  • IF THEN ELSE
  • INKEY$
  • IMP
  • INP
  • INPUT
  • INPUT$
  • INSTR
  • INT
  • INTERVAL ON/OFF/STOP
  • KEY
  • KEY LIST
  • KEY ON/OFF
  • KEY ON/OFF/STOP
  • FOR TO STEP NEXT
  • LEFT$
  • LEN
  • LET
  • LINE
  • LINE INPUT
  • LIST
  • LLIST
  • LOAD
  • LOCATE
  • LOG
  • LPOS
    LPRINT
  • MAXFILES
  • MERGE
  • MID$
  • MOD
  • MOTOR
  • NEW
  • NOT
  • OCT$
  • ON ERROR GOTO
  • ON GOSUB
  • ON GOTO
  • ON INTERVAL GOSUB
  • ON KEY GOSUB
  • ON SPRITE GOSUB
  • ON STOP GOSUB
  • ON STRIG GOSUB
  • OPEN
  • OR
  • OUT
  • PAD
  • PAINT
  • PDL
  • PEEK
  • PLAY
  • PLAY()
  • POINT
  • POKE
  • POS
  • PRESET
  • PRINT
  • PSET
  • PUT SPRITE
  • READ
  • REM
  • RENUM
  • RESTORE
  • RESUME
  • RETURN
  • RIGHT$
  • RND
  • RUN
  • SAVE
  • SCREEN
  • SGN
  • SIN
  • SOUND
  • SPACE$
  • SPC
  • SPRITE ON/OFF/STOP
  • SPRITE$
  • SQR
  • STICK
  • STOP
  • STOP ON/OFF/STOP
  • STRIG
  • STRIG ON/OFF/STOP
  • STR$
  • STRING$
  • SWAP
  • TAB
  • TAN
  • TIME
  • TROFF
  • TRON
  • USR
  • VAL
  • VARPTR
  • VDP
  • VPEEK
  • VPOKE
  • WAIT
  • WIDTH
  • XOR

MSX BASIC 2.0[editar]

  • COLOR SPRITE
  • COLOR SPRITE$
  • COLOR=
  • COLOR=RESTORE
  • COLOR=NEW
  • CALL MEMINI
  • CALL MKILL
  • CALL MNAME
  • CALL MFILES
  • SET PAGE
  • SET VIDEO
  • SET ADJUST
  • SET BEEP
  • SET TITLE
  • SET PASSWORD
  • SET PROMPT
  • SET SCREEN
  • SET DATE
  • SET TIME
  • GET DATE
  • GET TIME

MSX BASIC 3.0[editar]

  • SET SCROLL

MSX BASIC 4.0[editar]

  • CALL PAUSE
  • CALL PCMPLAY
  • CALL PCMREC

 

 

Publicado en Sin categoría | Deja un comentario

Programa para Listar los Datos de una Cinta

Programa que Lista TODOS los Ficheros que se encuentran en la Cinta, mostrando el Tipo de Programa y Direcciones de Inicio, Final y Ejecución.
Luego todo lo que encuentra puede grabarse en Basic con Líneas “Rem”.

10 KEY OFF:SCREEN 0:WIDTH40
20 COLOR15,4,4
30 ON ERROR GOTO 620
40 CY=2:NL=899
50 U=&HF610:DEFUSR=U
60 FORI=UTOU+62
70 READK:POKEI,K
80 NEXT
90 REM **********************
100 CLS
110 LOCATE4,0:PRINT"*** Listar bloques de caset ***"
120 LOCATE10,1:PRINT"(C)Phoenix Software"
130 LOCATE12,22:PRINT"pulsa una tecla"
140 A$=INKEY$:IFA$=""THEN140
150 LOCATE12,22:PRINT"                "
160 REM **********************
170 A=USR(0)
180 F$="":CY=CY+1:NL=NL+1
190 IFCY>21THENCY=2
200 B=&HF600
210 T=PEEK(B)
220 IF(T<>&HD0)AND(T<>&HD3)AND(T<>&HEA)THENGOTO 340
230 FORI=B+1TOB+6
240 F$=F$+CHR$(PEEK(I))
250 NEXT
260 LOCATE0,CY:PRINT NL;"' ";F$
270 IFT=&HD0THENGOTO 360
280 IFT=&HD3THENGOTO 320
290 REM *******************
300 LOCATE 13,CY:PRINT" .sav"
310 GOTO 170
320 LOCATE 13,CY:PRINT" .csav"
330 GOTO 170
340 LOCATE 13,CY:PRINT" .???"
350 GOTO 170
360 LOCATE 13,CY:PRINT" .bsav"
370 S=PEEK(B+7)+PEEK(B+8)*256
380 E=PEEK(B+9)+PEEK(B+10)*256
390 X=PEEK(B+11)+PEEK(B+12)*256
400 LOCATE22,CY:PRINT HEX$(S)
410 LOCATE28,CY:PRINT HEX$(E)
420 LOCATE34,CY:PRINT HEX$(X)
430 GOTO 170
440 REM ********************
450 DATA &H21,&H00,&HF6,&HE5
460 DATA &HCD,&HE1,&H00,&H38
470 DATA &H24,&HCD,&H47,&HF6
480 DATA &H4F,&H06,&H09,&HCD
490 DATA &H47,&HF6,&HB9,&H20
500 DATA &HEF,&H10,&HF8,&HE1
510 DATA &H71,&HCD,&H31,&HF6
520 DATA &HE5,&HCD,&HE1,&H00
530 DATA &HE1,&H06,&H06,&HCD
540 DATA &H47,&HF6,&H23,&H77
550 DATA &H10,&HF9,&HC3,&HE7
560 DATA &H00,&HCD,&HE7,&H00
570 DATA &HDD,&H21,&HB2,&H73
580 DATA &HC3,&H59,&H01,&HD9
590 DATA &HCD,&HE4,&H00,&H38
600 DATA &HF0,&HD9,&HC9
610 REM *******************
620 LOCATE12,22:PRINT"Fin de la cinta?"

Versión “preliminar” y equivalente en Código Máquina:

CSAVE_FILE		equ	0xD3		; eof = n data hasta 7bytes 0x0
SAVE_FILE		equ	0xEA		; eof = n bloques 256 bytes hasta CTRL+Z
BSAVE_FILE		equ	0xD0

INI_BASIC	 	equ	0x8001		; lol!
INI_PRG			equ	0xF000

; --------------------------------------				
			.bios
			.basic
			.org INI_PRG
			.start MAIN				

MAIN:			di
			
			xor	a			; limpiando la casa
			ld	hl, iniram
			ld	bc, endram-iniram-1
			call	CLSRAM	

			call	LHEADER			; leemos una cabecera

			ret

; --------------------------------------				
; inicia o detiene el motor del cassette
MOTORON:		ld	a, 1
bmotor:			call	STMOTR      
			ret 
MOTOROFF:		xor	a
			jr	bmotor

; --------------------------------------
; salimos (por error de lectura) o paramos el cassete
EXIT:			pop	hl
STOP:			call	TAPIOF      
			ret 

; --------------------------------------				
; leemos datos (un byte) del cassete; C si se produce un error
READ:			exx               
			call	TAPIN     
			jr	c, EXIT
			exx               
			ret               

; --------------------------------------			
; leemos la cabecera larga del cassete; tipo = 10 bytes + nombre = 6 bytes
LHEADER:		call	TAPION
			jr	c, EXIT

			ld	b, 10				; 10 bytes
			ld	hl, tipo_fichero
bucH:			call	READ   
			ld	[hl], a				
			djnz	bucH

			ld	b, 6				; 6 bytes
			ld	hl, nom_fichero
bucN:			call 	READ
			ld	[hl], a
			inc	hl
			djnz	bucN
				
			call 	STOP
			
			ld	a, [tipo_fichero]		; tipo de fichero

			cp	BSAVE_FILE
			jp	z, BLOAD			; cargamos binario

			cp	SAVE_FILE
			jp	z, LOAD				; cargamos basic SAVE
				
			cp	CSAVE_FILE
			jp	z, CLOAD			; cargamos basic CSAVE

			; TODO: fichero desconocido

			; TODO: presentar informacion
			; TODO: grabar fichero a disco

			ret

; --------------------------------------
; cload tiene una cabecera corta que leemos con TAPION y luego 
; los datos hasta encontrar 7 ceros seguidos
CLOAD:			call	rstzeros
			xor	a
			ld	[INI_BASIC-1], a		; 0 en 0x8000; requerido

			ld	hl, INI_BASIC			
			push	hl
			call	TAPION
			pop	hl
			jr	c, EXIT

bcld:			call	READ
			ld	[hl], a
			inc	hl
			cp	0
			call	nz, rstzeros
			call	z, inczeros
			ld	a, [temp1]
			cp	7				; termina con 7 ceros	
			jr	nz, bcld

			jr	STOP

rstzeros:		xor	a
			ld	[temp1], a
			ret

inczeros:		ld	a, [temp1]
			inc	a
			ld	[temp1], a
			ret

; --------------------------------------
; load contiene multiples bloques de 256 bytes hasta 0x1a (ctrl+z)
; cada bloque tiene su cabecera corta que leemos con TAPION
LOAD:			xor	a
			ld	[INI_BASIC-1], a		; 0 en 0x8000; requerido

			ld	hl, INI_BASIC				

bld1:			push	hl				
			call	TAPION
			pop	hl
			jp	c, EXIT

			ld	b, 0				; carga bloques de 256 bytes			
bld2:			call	READ
			cp	0x1a				; ctrl + z
			jp	z, STOP
			ld	[hl], a
			inc	hl
			djnz	bld2				; fin de bloque
				
			push	hl
			call	TAPIOF
			pop	hl
			jr	bld1

; --------------------------------------
; bload tiene una cabecera corta seguida de 6 bytes con 
; las direcciones de inicio, fin y ejecución del programa
; a continuación va el bloque de datos, todo seguido
BLOAD:			xor	a
			ld	hl, inifile
			ld	bc, finfile-inifile-1
			call	CLSRAM				; borra dirs fichero
		
			call	TAPION
			jp	c, EXIT
				
			ld	b, 6				; 6 bytes
			ld	hl, inifile
bblh:			call 	READ
			ld	[hl], a
			inc	hl
			djnz	bblh
				
			call	MOTOROFF			
			call	calclng				; calculamos longitud
			push	hl
			call	MOTORON
			pop	bc				; longitud
			ld	hl,INI_BASIC			; inicio (temporal)

bbld:			call	READ
			ld	[hl], a
			inc	hl
			dec	bc
			ld	a, b
			or	c
			jr	nz, bbld

			jp	STOP

calclng:		ld	ix,inifile
			ld	e, [ix+0]
			ld	d, [ix+1]			; de = ini (real)
			ld	l, [ix+2]
			ld	h, [ix+3]			; hl = fin (real)
			sbc	hl, de				; longitud = fin - ini 
			ret
				
; -------------------------------------
; rellenamos bc+1 bytes de ram con el valor de A
CLSRAM:			ld	[hl], a				
			ld	d, h
			ld	e, l
			inc	de
			ldir
			ret

; --------------------------------------
iniram:			defb	0

tipo_fichero:		defs	1				
nom_fichero:		defs	6

inifile:		defs	2
finfile:		defs	2
exefile:		defs	2

temp1:			defs	1

endram:			defb	0

 

 

 

Publicado en Sin categoría | Deja un comentario

El Casete en MSX – Info técnica

Codificación de BIT y BYTE

La información en el Casete es almacenada como ondas cuadradas de 1.200 ó 2.400 baudios.

La codificación usada es FSK (Frequency Shifting Key)

En la siguiente figura podemos ver la relación que existe entre la Velocidad de Grabación, los Bits y los Pulsos almacenados en el Casete:

onda-casete

Cada BYTE es almacenado en Cinta como una secuencia formada por 11 Bits:

0 b0 b1 b2 b3 b4 b5 b6 b7 1 1

Como podemos ver hay un bit de comienzo 0 luego va el Byte propiamente dicho y a continuación dos bit 11 que indican el fin del Byte.

Además son usados 2 Tipos de Cabecera:

  • cabecera corta
  • cabecera larga

La cabecera larga tiene 4 veces la longitud de la corta. Están formadas por una serie de ondas cuadradas (con bit de valor 1)

 Bps     Cabecera   Frecuencia (Hz)   Nº de Pulsos
 1.200   Corta         2.400           4.000 ( 5/3 sec)
 1.200   Larga         2.400          16.000 (20/3 sec)
 2.400   Corta         4.800           8.000
 2.400   Larga         4.800          32.000

 

Formatos de Fichero en Casete:

Los Ficheros en Cinta están formados por 2 Bloques:

-el primer bloque es el Descriptor de Fichero (nos indica el Tipo de Fichero)
-el segundo bloque contiene los Datos del Fichero propiamente dichos.

Existen 3 Tipos de Ficheros:

1.Ficheros BASIC (CSAVE/CLOAD)

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 del Fichero propiamente dichos, formados por:
-Cabecera Corta
-Caracteres del Programa BASIC “Tokenizados
7 bytes  con el valor “00” que indican el final del Fichero.

 

2.Ficheros con Código Máquina (BSAVE/BLOAD)

Descriptor de Fichero, formado por:
-Cabecera Larga.
10 bytes con el valor “D0” (el valor “D0” nos indica que es un Fichero BLOAD)
6 bytes con el nombre del Fichero.

Datos del Fichero propiamente dichos, 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.

 

3.Ficheros LOAD/OPEN  –> (ASCII)

Descriptor de Fichero, formado por:
-Cabecera Larga
10 bytes con el valor “EA” (el valor “EA”  indica que es un Fichero LOAD/OPEN)
6 bytes con el nombre del Fichero.

Datos del Fichero propiamente dichos, 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” (–> final del Fichero)

 

 

Rutinas BIOS para el Casete

TAPION

Address  : #00E1
Function : Reads the header block after turning the casete motor ON
Output   : C-flag set if failed
Registers: All

TAPIN

Address  : #00E4
Function : Read data from the tape
Output   : A  - read value
           C-flag set if failed
Registers: All

TAPIOF

Address  : #00E7
Function : Stops reading from the tape

TAPOON

Address  : #00EA
Function : Turns on the cassette motor and writes the header
Input    : A  - #00 short header
            not #00 long header
Output   : C-flag set if failed
Registers: All

TAPOUT

Address  : #00ED
Function : Writes data on the tape
Input    : A  - data to write
Output   : C-flag set if failed
Registers: All

TAPOOF

Address  : #00F0
Function : Stops writing on the tape

STMOTR

Address  : #00F3
Function : Sets the cassette motor action
Input    : A  - #00 stop motor
                #01 start motor
                #FF reverse the current action
Registers: AF
Publicado en Sin categoría | Deja un comentario