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.

Anuncios
Esta entrada fue publicada en Sin categoría. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s