Comando "CALL" BÁSICO de CPC
Recientemente he estado jugando con un emulador de CPC de Amstrad. No he escrito código BÁSICO durante años, pero en el día en que realmente usaba un CPC de verdad.
De todos modos, mirando la documentación en línea, veo que el CPC tiene un CALLcomando para ejecutar subrutinas de código de máquina Z80 arbitrarias. Sin embargo, tengo problemas para encontrar mucha documentación al respecto; la mayoría de las listas de comandos simplemente dicen "si no sabes qué es esto, ¡no lo toques!"
CALLva seguido de la dirección del código de máquina a ejecutar. Presumiblemente, una simple instrucción de retorno de una subrutina lo llevará de regreso a BÁSICO cuando haya terminado.
Eso deja el problema de cómo pasar datos entre BASIC y código de máquina. En particular, el CALLcomando parece aceptar parámetros adicionales después de la dirección de inicio, pero no parece estar documentado lo que realmente hacen. (Lamentablemente, no parece haber una forma de devolver los resultados a BÁSICO).
Respuestas
Call acepta solo números enteros y punteros como parámetros; ambos son valores de 16 bits. Los parámetros se colocan en la pila BASIC. IX apunta a la parte superior de esa pila. El número de parámetros se coloca en A. La operación del código de máquina debe partir de allí, incluido el cálculo (o simplemente asumiendo) el tipo de datos de los parámetros.
Para ver un ejemplo, consulte, por ejemplo, http://www.cpcwiki.eu/index.php/Technical_information_about_Locomotive_BASIC; pero tenga en cuenta que la descripción es un poco confusa.
Tenga en cuenta que cuando pasa un puntero, pasa efectivamente por referencia, por lo que se puede devolver un valor a la variable a la que se apunta.
Algunos consejos:
Un buen libro para hacer el ensamblaje del Z80 a partir de algunos puntos de vista de HLL siempre han sido las subrutinas del lenguaje ensamblador Z80 de Osborne .
Para direcciones específicas de CPC, es posible que desee consultar sitios relacionados con CPC como CPCWIKI
Y la instrucción de retorno genérica 8080 es RET(C9h)
El retorno condicional es
RET xxcon xx como condición.