Hola:
A veces el intentar implementar en Ensamblador según que instrucciones puede resultar demasiado complejo y a la dificultad habría que añadir el montón de líneas de Código que tendríamos que teclear. Por ejemplo el ejecutar una instrucción de Lectura/Grabación en DISCO.
¿A qué sería estupendo poder ejecutar instrucciones BASIC cómodamente desde nuestros Programas en Ensamblador...? Y alguno se preguntará, ¿es eso posible?, ¿es muy difícil? Afortunadamente las respuestas son: SÍ a la primera pregunta y NO a la segunda pregunta.
La idea Básica es:
- Primero obtener la Dirección de la Instrucción BASIC que queremos ejecutar (podéis obtenerla de la Tabla que os dejo al final de este Post).
- 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" y para ejecutar desde Ensablador la instrucción:
BSAVE"PATATA.BIN", &HC000 y &HC119El "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 rojo)
BSAVE"PATATA.BIN", &HC000, &HC119Pues bien, yo con lo que me liaba, entre otras cosas era en la definición de todo eso que pongo en rojo. No sabía como poner las comillas usando la instrucción DEFM, ya que no sería posible hacer esto: DEFM ""PATATA.BIN"" 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!!!
Saludetes. ;-)
Pd. Os dejo aquí el Listado completo de las Instrucciones BASIC, el Código Token y Dirección para cada Instrucción.
Comando Token Dirección Comando Token Dirección Comando Token Dirección
ABS 06H 39E8H FN DEH 39E8H PEEK 17H 3A0AH
AND F6H 3A18H FOR 82H 3920H PLAY C1H 39AEH
ASC 15H 3A06H FPOS 27H 3A2AH POINT EDH 3A06H
ATN 0EH 39F8H FRE 0FH 39FAH POKE 98H 395CH
ATTR$ E9H 39FEH GET B2H 3990H POS 11H 39FEH
AUTO A9H 3973H GO TO 89H 393EH PRESET C3H 39B2H
BASE C9H 39BEH GOSUB 8EH 3948H PRINT 91H 394EH
BEEP C0H 39ACH GOTO 89H 393EH PSET C2H 39B0H
BIN$ 1DH 3A16H HEX$ 1BH 3A12H PUT B3H 3992H
BLOAD CFH 39CAH IF 8BH 3942H READ 87H 393AH
BSAVE D0H 39CCH IMP FAH 3A20H REM 8FH 394AH
CALL CAH 39C0H INKEY$ ECH 3A04H RENUM AAH 3980H
CDBL 20H 3A1CH INP 10H 39FCH RESTORE 8CH 3944H
CHR$ 16H 3A08H INPUT 85H 3936H RESUME A7H 397AH
CINT 1EH 3A18H INSTR E5H 39F6H RETURN 8EH 3948H
CIRCLE BCH 39A4H INT 05H 39E6H RIGHT$ 02H 39E0H
CLEAR 92H 3950H IPL D5H 39D6H RND 08H 39ECH
CLOAD 9BH 3962H KEY CCH 3964H RSET B9H 399EH
CLOSE B4H 3994H KILL D4H 39D4H RUN 8AH 3940H
CLS 9FH 396AH LEFT$ 01H 39DEH SAVE BAH 39A0H
CMD D7H 39DAH LEN 12H 3A00H SCREEN C5H 39B6H
COLOR BDH 39A6H LET 88H 393CH SET D2H 39D0H
CONT 99H 395EH LFILES BBH 39A2H SGN 04H 39E4H
COPY D6H 39D8H LINE AFH 398AH SIN 09H 39EEH
COS 0CH 39F4H LIST 93H 3952H SOUND C4H 39B4H
CSAVE 9AH 3960H LLIST 9EH 3968H SPACE$ 19H 397EH
CSNG 1FH 3A1AH LOAD B5H 3996H SPACE$ 19H 3A0EH
CSRLIN E8H 39FCH LOC 2CH 3A34H SPC DFH 39EAH
CVD 2AH 3A30H LOCATE D8H 39DCH SPRITE C7H 39BAH
CVI 28H 3A2CH LOF 2DH 3A36H SQR 07H 39EAH
CVS 29H 3A2EH LOG 0AH 39F0H STEP DCH 39E4H
DATA 84H 3934H LPOS 1CH 3A14H STICK 22H 3A20H
DEF 97H 395AH LPRINT 9DH 394CH STOP 90H 394CH
DEFDBL AEH 3988H LSET B8H 399CH STR$ 13H 3A02H
DEFINT ACH 3984H MAX CDH 39C6H STRIG 23H 3A22H
DEFSNG ADH 3986H MERGE B6H 3998H STRING$ E3H 39F2H
DEFSTR ABH 3982H MID$ 03H 39E2H SWAP A4H 3974H
DELETE A8H 397CH MKD$ 30H 3A3CH TAB DBH 39E2H
DIM 86H 3938H MKI$ 2EH 3A38H TAN 0DH 39F6H
DRAW BEH 39A8H MKS$ 2FH 3A3AH THEN DAH 39E0H
DSKF 26H 3A28H MOD FBH 3A22H TIME CBH 39C2H
DSKI$ EAH 3A00H MOTOR CEH 39C8H TO D9H 39DEH
DSKO$ D1H 39CEH NAME D3H 39D2H TROFF A3H 3972H
ELSE A1H 396EH NEW 94H 3954H TRON A2H 3970H
END 81H 392EH NEXT 83H 3932H USING E4H 39F4H
EOF 2BH 3A32H NOT E0H 39ECH USR DDH 39E6H
EQU F9H 3A1EH OCT$ 1AH 3A10H VAL 14H 3A04H
ERASE A5H 3976H OFF EBH 3A02H VARPTR E7H 39FAH
ERL E1H 39EEH ON 95H 3956H VDP C8H 39BCH
ERR E2H 39F0H OPEN B0H 398CH VPEEK 18H 3A0CH
ERROR A6H 3978H OR F7H 3A1AH VPOKE C6H 39B8H
EXP 0BH 39F2H OUT 9CH 3964H WAIT 96H 3958H
FIELD B1H 398EH PAD 25H 3A26H WIDTH A0H 396CH
FILES B7H 39AAH PAINT BFH 39AAH XOR F8H 3A1CH
FIX 21H 3A1EH PDL 24H 3A24H