Mensajepor antoniovillena » Mié, 21 May 2014, 16:48
$this->bbcode_second_pass_quote('na_th_an', '
')@Antonio: lo leí a medida que lo ibas escribiendo, pero no pensé que iba a tener que ponerlo en práctica tan pronto. Puede que, como dices, sea algo sencillo, pero sin nadie que te lo explique, como todo, se hace muy cuesta arriba. Además, eso de hacer un c/m autoejecutable en BASIC para mí era ciencia ficción... E incluso ahora sigo sin entender demasiado bien cómo lo haces
Pero mira, funciona
Eso es porque apenas lo explico, era un poco complicado para meterlo en el tutorial. Uso el método de Paolo Ferraris, si quieres indagar más te puedes bajar el BIN2REM y leerte el readme, desde aquí:
http://www.worldofspectrum.org/utilities.htmlEn dicho método sólo bastan 11 bytes de BASIC para saltar al C/M, y teniendo en cuenta que en los 4 primeros bytes puedes poner casi lo que quieras (excepto que el primer byte debe ser menor de $40) lo único que pierdes son 7 bytes.
El programa BASIC se carga en la dirección $5CCB, lo que se ejecuta es un OVER USR $5CCB, es decir que saltamos al propio código BASIC. Los primeros 4 bytes son el número de línea y la longitud de la línea, aquí ponemos el C/M que queramos (siempre que la primera instrucción sea un LD RR, NN o alguna con opcode menor a $40). Los siguientes 7 bytes en código máquina son basura (en BASIC son el OVER USR), y lo siguiente ya es código máquina normal y corriente. También puedes cambiar el OVER por RANDOMIZE o algo parecido para hacer algo útil en C/M pero no suelo aprovecharlo tanto.
Como curiosidad, el OVER USR numero está super optimizado, el número se codifica en punto flotante con sólo 3 bytes (en lugar de los 5 normales que harían falta), para eso sí que te tienes que leer el readme de Paolo Ferraris.