Ejecutar BASIC desde Ensamblador & Listado TOKEN-Dirección

By manolito74

Paladin (979)

manolito74's picture

18-10-2015, 16:49

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: 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 &HC119

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!!!

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					
Login or register to post comments

By Victor

Champion (467)

Victor's picture

19-10-2015, 05:22

Genial!! Muchísimas gracias por la currada y la explicación. Seguro que le sacamos utilidad.

Respecto al Libro-Manual "MSX TOP SECRET", he visto que los del foro Karoshi habían hecho una traducción del mismo al castellano... pero al descargarlo, los links están caidos. Si alguien tuviera esa traducción y pudiera compartirla...

By x-nen Aivalahostia

Paladin (1016)

x-nen Aivalahostia's picture

19-10-2015, 12:40

Me uno a la peticion de Victor

By kabish

Master (223)

kabish's picture

19-10-2015, 14:41

Aqui esta. Msx Top Secret -Castellano-

Me he fijado que en alguno de los temas finales se me han descuadrado las imagenes.

By manolito74

Paladin (979)

manolito74's picture

19-10-2015, 15:08

Gracias a Kabish por el enlace y por completar la información. ;-)

Víctor: me alegro que te haya parecido interesante y muchas gracias por tus comentarios. ;-)

En el MSX- Top Secret el Listado de las Instrucciones BASIC viene dividido en dos partes: COMANDOS y FUNCIONES y ocupa varias Páginas. Por si a alguien le interesara he creado un Documento en el que aparecen todos juntos por orden alfabético y ocupando una sola Página. Por si a alguien le interesa lo puede descargar de AQUÍ

Saludetes. ;-)

By Victor

Champion (467)

Victor's picture

19-10-2015, 16:25

Gracias, gracias y.... GRACIAS!!!