Pular para o conteúdo principal

Coletânea de funções

Operacionais

saveRegisters

Salva o contexto dos registradores para posterior recuperação, e carrega o valor dos argumentos nestes. A ser utilizado no inicio de demais funções.

Argumentos

Nenhum

Retorna

Nada

saveRegisters:
pop r0 ; Armazena o endereço de retorno da função
push r1
push r2
push r3
push r4
push r5
push r6
push r7
push r0 ; Coloca-o de volta no topo da pilha
load r1, Arg1
load r2, Arg2
load r3, Arg3
load r4, Arg4
load r5, Arg5
load r6, Arg6
load r7, Arg7
loadn r0, #0
rts ; Desempilha e retorna.

restoreRegisters

Recupera o contexto dos registradores à partir da pilha. A ser utilizado ao término das funções.

Argumentos

Nenhum

Retorna

Nada

restoreRegisters:
pop r0
pop r7
pop r6
pop r5
pop r4
pop r3
pop r2
pop r1
push r0
loadn r0, #0
rts
atenção

As funções saveRegisters e restoreRegisters são requeridas para o funcionamento de muitas outras funções aqui exibidas.

Matemáticas

screenPosition

Dados valores para linha e coluna, retorna o índice que corresponde a posição esperada na tela. Valores maiores que aqueles definidos em HEIGHT e WIDTH descrevem voltas na tela. Dados valores para linha e coluna, retorna o índice que corresponde a posição esperada na tela. Valores maiores que aqueles definidos em HEIGHT e WIDTH descrevem voltas na tela.

Argumentos

LabelValor esperado
Arg1Linha
Arg2Coluna
HEIGHTAltura da tela
WIDTHLargura da tela

Returna

LabelValor esperado
RetÍndice da posição na tela
screenPosition:
call saveRegisters
load r3, HEIGHT
load r4, WIDTH
mod r1, r1, r3
mul r1, r1, r4
mod r2, r2, r4
add r1, r1, r2
store Ret, r1
call restoreRegisters
rts

Impressão

printIntR

Imprime um valor inteiro na tela, com alinhamento à direita.

Argumentos

LabelValor esperado
Arg1Inteiro a ser impresso
Arg2Posição na tela donde começar a impressão
Arg3Valor de cor para imprimir o número

Retorna

Nada

printIntR:
call saveRegisters
loadn r4, #10 ; carrega o valor 10 para aplicar a operação de módulo
loadn r5, #'0' ; carrega o valor índice do caractere 0

pirLoop: ; inicia o laço de impressão
mod r6, r1, r4 ; obtém o dígito menos significativo de r1
add r6, r5, r6 ; aplica-o como um deslocamento no mapa de caracteres
add r6, r6, r3 ; aplica o valor da cor
outchar r6, r2 ; imprime o caractere na posição r2
div r1, r1, r4 ; divisão inteira de r1 por 10
jz pirEnd ; sai do loop se r1 = 0
dec r2 ; caso contrário, decrementa r2
jmp pirLoop ; e continua

pirEnd:
call restoreRegisters
rts

Input

takeInput

Função que atrasa a execução do jogo por um período para obter uma entrada do jogador. Se a entrada é aquela esperada, o atraso é cancelado.

Argumentos

LabelValor esperado
Arg1Fator de atraso
Arg2Entrada esperada

Retorna

LabelValor esperado
Ret0, se não foi pressionada nenhuma tecla, caso contrário, o valor ASCII da tecla pressionada
takeInput:
call saveRegisters
loadn r3, #1000 ; Atraso base, implica um microssegundo em 1 MHz
loadn r4, #255 ; Valor padrão retornado por inchar quando não é detectado o pressionamento de qualquer tecla
store Ret, r0

delay_A:
mov r5, r1
delay_B:
inchar r6
cmp r4, r6
jeq delayContinue
store Ret, r6
cmp r2, r6
jeq delayEnd
delayContinue:
dec r5
jnz delay_B
dec r3
jnz delay_A
delayEnd:
call restoreRegisters
rts
dica

A função takeInput pode ser utilizada para dar ao jogo uma dado intervalo entre as ações. Para tal basta passar o valor esperado para interromper o intervalo como sendo um que não pode ser correspondido: 0.