Comando “CALL” do CPC BASIC
Recentemente, tenho usado um emulador Amstrad CPC. Não escrevo código BASIC há anos, mas na época eu realmente usei um CPC de verdade.
De qualquer forma, olhando a documentação online, vejo que o CPC tem um CALLcomando para executar sub-rotinas arbitrárias de código de máquina Z80. No entanto, estou tendo problemas para encontrar muita documentação sobre isso; a maioria das listas de comandos apenas dizem "se você não sabe o que é isso, não toque!"
CALLé seguido pelo endereço do código de máquina a ser executado. Presumivelmente, uma simples instrução de retorno da sub-rotina o levará de volta ao BASIC quando terminar.
Isso deixa o problema de como passar dados entre o BASIC e o código de máquina. Em particular, o CALLcomando parece aceitar parâmetros adicionais após o endereço inicial, mas não parece estar documentado o que eles realmente fazem. (Infelizmente, não parece haver uma maneira de retornar os resultados ao BASIC.)
Respostas
A chamada aceita apenas inteiros e ponteiros como parâmetros; ambos são valores de 16 bits. Os parâmetros são colocados na pilha BASIC. IX aponta para o topo dessa pilha. O número de parâmetros é colocado em A. A operação do código de máquina precisa partir daí, incluindo descobrir (ou apenas assumir) o tipo de dados dos parâmetros.
Para ver um exemplo, por exemplo http://www.cpcwiki.eu/index.php/Technical_information_about_Locomotive_BASIC; mas tome cuidado, pois a descrição é um pouco confusa.
Note que quando você passa um ponteiro, você efetivamente passa por referência, então um valor pode ser retornado para a variável que está sendo apontada.
Algumas dicas:
Um bom livro para fazer a montagem do Z80 a partir de algum HLL POV sempre foram as subrotinas da linguagem de montagem Z80 de Osborne .
Para endereços específicos de CPC, você pode consultar sites relacionados a CPC, como o CPCWIKI
E a instrução de retorno 8080 genérica é RET(C9h)
O retorno condicional é
RET xxcom xx como condição.