mohai
Karoshi Fan
Mensajes: 80
|
|
« : 11 de Septiembre de 2014, 04:56:37 pm » |
|
Buenas,
Estudiando unos listados BASIC de Spectrum (no me tireis piedras ...), para un proyecto que me traigo entre manos, me he dado cuenta de una manera muy ágil que tenemos en MSX para pasar valores a codigo maquina.
Os dejo un pequeño tocho y un par de dudas a ver que os parece y si se os ocurre una manera más sencilla.
A veces se requiere pasar valores y variables a una rutina en C/M, llamada desde BASIC.
Un posible uso sería pasar a una rutina en C/M, un puntero de memoria o simplemente un número comprendido en 16 bits, tipo INTEGER.
Para pasar el valor de una variable numérica de forma fácil a C/M, normalmente se pasa el argumento con el comando zz=usr(variable o valor). Luego se recoge el valor de las posiciones F7F6 - F7F9 ?? y se puede trabajar con él en C/M. (para qué se usan las posiciones F69D y F69E ?? ).
Además, el uso de la sentencia USR(var), nos limita a una sola variable o un solo valor.
Trabajar con VARPTR no es ágil desde C/M, pues el formato en que se guardan las variables numéricas en memoria, no es el adecuado. Se podrían separar el byte alto del bajo con AND &HFF00 y &H00ff, pero éste comando solo acepta números entre -32768 y 32767 (16 bits con signo).
Si trabajamos con formato hexadecimal, uno de los problemas para pasar un valor numérico a memoria, es que desde BASIC hay que hacer unos cálculos un poco complejos y nada elegantes. Para números a partir de &H8000, el conversor a decimal del BASIC, lo trata como un número de 16 bits con signo, con lo cual, a partir del valor 32768, el número convertido sale negativo
Otra manera sencilla de pasar un valor numérico a C/M (en formato de 16 bits, recuperable por los registros del Z80 con un simple LD), es poniéndolo en las variables del sistema, en alguna que no moleste y lo almacene en formato recuperable desde C/M de forma sencilla. Por ejemplo, en las tablas de las funciones DEFUSRn, se pueden pasar valores o variables, que se almacenan en el formato deseado. Normalmente no se usan las 10 funciones de usuario a la vez. Existe una tabla de 10 llamadas DEFUSR en las variables del sistema. Cada una es de 2 bytes. Esta tabla comienza en &HF39A y termina en &HF3AD:
Esta tabla nos permitiría, además, pasar hasta 9 valores distintos.
USRTAB #F39A 2 Address to call with Basic USR0 #F39C 2 Address to call with Basic USR1 #F39E 2 Address to call with Basic USR2 #F3A0 2 Address to call with Basic USR3 #F3A2 2 Address to call with Basic USR4 #F3A4 2 Address to call with Basic USR5 #F3A6 2 Address to call with Basic USR6 #F3A8 2 Address to call with Basic USR7 #F3AA 2 Address to call with Basic USR8 #F3AC 2 Address to call with Basic USR9
Ejemplo:
10 input “Introduce un valor entre 0 y 65535”;V 20 defusr9=V 30 print “El valor de V es “; peek (&HF3AC)+256*peek(&HF3AD)
|