USR
O Manual do BASIC do MC1000 lista "USR" entre suas palavras reservadas, mas não dá qualquer explicação sobre como usar essa função.
Assim como a instrução CALL, a função USR chama uma rotina em linguagem de máquina, com a diferença de que o BASIC passa para a rotina um parâmetro (numérico ou string), e dela recebe um valor numérico.
Ponto de início
Para usar a função USR é preciso antes informar o endereço de início da rotina em linguagem de máquina (USRLOC). Em alguns dialetos de BASIC, isso é feito com a instrução DEF USR = endereço. O MC1000 não tem essa instrução. Esse endereço deve ser colocado por meio de instruções POKE nos endereços 772 e 773 (em hexadecimal, $0304 e $0305), assim:
POKE 772, endereço AND 255: POKE 773, INT(endereço / 256)
Chamar a função USR sem definir um endereço de início gera erro de parâmetro ilegal ("PI ERRO").
Parâmetro e valor de retorno
O parâmetro recebido do BASIC vem armazenado em quatro bytes a partir do endereço 959 ($03BF). O tipo do parâmetro é indicado no endereço 912 ($390) (0: numérico; ≠0: string).
O valor de retorno deve ser armazenado na mesma posição (quatro bytes a partir de $03BF), e deve ser numérico.
Utilize as rotinas para números de ponto flutuante para tratar o parâmetro e gerar o valor de retorno.
Hacks
Quando o controle passa para a rotina em linguagem de máquina, a pilha do Z80 (apontada pelo registrador SP) contém:
Uma situação semelhante ocorre quando se chama uma rotina com CALL:
Modificando o conteúdo da pilha do Z80 deve ser possível:
evitar a rotina de checagem de tipo numérico, fazendo o interpretador BASIC aceitar que a função USR produza strings.
consultar ou avançar o ponto de execução do BASIC, permitindo passar dados adicionais para a rotina USR após os parêntese, numa sintaxe independente da sintaxe do BASIC do MC1000, como: X = USR(0) DRAW TEXT "SEU NOME E " + X$. A suposta rotina detectaria os tokens de "DRAW" e "TEXT" e executaria uma sub-rotina de desenho de texto em modo gráfico para consumir a expressão string a seguir.