Especificacoes Gerais do Entendo® Versao 0.5 - Registradores * IP - apontador de instrucao. Interno. (24 bits) * AX e AY - uso geral (16 bits) * BTN - estado dos botoes do controlador (16 bits): bit 0 = A bit 1 = B bit 2 = C bit 3 = D bit 4 = UP bit 5 = DOWN bit 6 = LEFT bit 7 = RIGHT bit 8 = SELECT bit 9 = START bit A = ESC * CX - contador (16 bits) * IX - indice (16 bits) * SP - apontador de pilha (16 bits) * DP - apontador de dados (24 bits) * AR - apontador de uso geral (24 bits) - Flags (Indicadores) 16 bits, 10 reservados para uso futuro => NOBCGLE <== * Equal (Zero) - Bit 0 * Less - Bit 1 * Greater - Bit 2 * Carry - Bit 3 * Boolean - Bit 4 (1 = TRUE; 0 = FALSE) * Overflow - Bit 5 * Negative - Bit 6 - Comandos SEM parametros * CLS - limpa a tela * LOWRES - entra no modo de baixa resolucao (320x200x256) * STOP - para execucao de uma musica * STOPS - para execucao de um efeito sonoro * SCROLL - faz um scroll da tela (*) * PAINT - pinta a tela * RET - retorna de sub-rotina * END - fim do programa - Comandos COM parametros * FDI op - fade in (op = velocidade) * FDO op - fade out (op = velocidade) * PLAY op - toca musica (op = indice da musica) * SOUND op - toca efeito sonoro (op = indice do efeito sonoro) * LOADB op - carrega figura como fundo de tela (op = indice da figura) * PUT op - coloca sprite na tela (op = indice do sprite) (*) * PUSHF - coloca os flags na pilha * POPF - tira elemento do topo da pilha e coloca nos flags * PUSH op - coloca op na pilha * POP op - tira elemento do topo da pilha e coloca em op * CALL ad - chama sub-rotina no endereco ad * MOV op1,op2 - faz op1 = op2 * MOVD op1,op2 - idem ao anterior, mas para os registradores de 24 bits * MOVH op1,op2 - move op2 para os 8 bits mais significativos de op1 * MOVL op1,op2 - move op2 para os 8 bits menos significativos de op1 * SWAP op1,op2 - troca os valores de op1 e op2 * CMP op1,op2 - faz uma comparacao entre op1 e op2 * ISON op,n - verifica se o bit n de op esta setado * ADD op1,op2 - faz op1 = op1 + op2 * SUB op1,op2 - faz op1 = op1 - op2 * ADC op1,op2 - faz op1 = op1 + op2 + Carry * SBC op1,op2 - faz op1 = op1 - op2 - Carry * MUL op1,op2 - faz op1 = op1 * op2 * DIV op1,op2 - faz op1 = op1 / op2 (divisao inteira) * MOD op1,op2 - faz op1 = op1 % op2 (resto da divisao inteira) * INC op - incrementa op * DEC op - decrementa op * SHL op,n - faz um shift para esquerda de n bits em op * SHR op,n - faz um shift para direita de n bits em op * FOR vl - marca incio de loop (vl = valor maximo de CX; caso este valor seja ultrapassado, sai do loop mas coloca valor 0 no flag de boolean) * LOOPE,LOOPL,LOOPG,LOOPC,LOOPB,LOOPO,LOOPN - volta para o FOR se flag = 1 * LOOP - volta para o for (nestes casos, o loop so termina quando CX ultrapassa o valor maximo) * RND op,vl - sorteia um numero em coloca em op. 0 <= op < vl * NOT op - inverte os bits de op * NEG op - inverte os bits de op e soma 1 (negacao) * AND op1,op2 - faz E logico e guarda em op1: op1 = op1 & op2 * OR op1,op2 - faz OU logico e guarda em op1: op1 = op1 | op2 * XOR op1,op2 - faz OU EXCLUSIVO logico e guarda em op1: op1 = op1 ^ op2 (*) Instrucoes em que os valores de AX e AY sao usados como referencia. - Saltos * JMP lbl - pula para posicao especificada * JE lbl - pula se o flag de igual estiver setado * JNE lbl - pula se o flag de igual nao estiver setado * JL lbl - pula se o flag de menor estiver setado * JNL lbl - pula se o flag de menor nao estiver setado * JG lbl - pula se o flag de maior estiver setado * JNG lbl - pula se o flag de maior nao estiver setado * JT lbl - pula se o flag booleano estiver setado * JF lbl - pula se o flag booleano nao estiver setado - Comandos para manipulacao dos sprites * Declarando um sprite: nome SPIRTE tam ident - cria uma estrutura de sprites numa posicao de memoria referenciada por nome e de tamanho tam com identificacao ident. [ID][ID][INDEX][INDEX][POSX][POSX][POSY][POSY][STATE][STATE][FRAME][FRAME] [DIRECTION] Cada [] sao 8 bits. A estrutura tem, portanto, 13 bytes. Com excecao de ID e INDEX, as demais variaveis sao incializadas com valor 0 (zero). * REFID nome,vl * REFPOSX nome,vl * REFPOSY nome,vl * REFSTATE nome,vl * REFFRAME nome,vl - estes comandos atualizam o valor das variaveis de um sprite. O valor do indice (INDEX) deve ser passado em IX. * GETPOSX nome,op * GETPOSY nome,op * GETSTATE nome,op * GETFRAME nome,op - estes comandos retornam o valor das variaveis de um sprite em op. O indice deve ser passado em IX. * DRAW nome - coloca em AX a posicao x do sprite nome; coloca em AY a posicao y desse mesmo sprite; chama PUT com o valor da variavel frame do sprite nome, indice IX * ROTSP nome,vl - faz uma rotacao de vl * 90 graus no sprite. Ou seja, incrementa o valor de DIRECTION em vl. Caso o valor em AX seja nao-zero ele so fara a rotacao se esta for possivel. Ou seja, se o sprite puder fazer a rotacao sem exceder os limites nem bater com algum elemento de indice nao-zero. * RETID op - retorna o ID do sprite localizado em (AX,AY) em op. Caso nao haja sprite o ID de retorno sera zero (por isso nao eh uma boa ideia colocar ID = 0 em sprites, a nao ser que seja so de decoracao). * GOLEFT nome,vl * GORIGHT nome,vl * GOUP nome,vl * GODOWN nome,vl - Esses quatro comandos verificam se ha algum "obstaculo" no caminho do sprite: vl guarda quantas posicoes (em pixels) ele andaria. Na pilha guarda o resultado da busca: 0 = nada encontrado (caminho livre) 1 a 254 = ID do sprite encontrado 255 = fim de tela * MOVELEFT nome,vl * MOVERIGHT nome,vl * MOVEUP nome,vl * MOVEDOWN nome,vl - Idem aos anteriores, mas, com uma diferenca: caso retorno seja 0, ele move automaticamente o sprite (ou seja, soma vl a POSX ou POSY). NAO guarda retorno na pilha. OBS: caso o valor de AX seja nao-zero, os comandos anteriores verificam, primeiro, se o botao respectivo (UP, DOWN, LEFT e RIGHT) esta pressionado. Caso nao esteja, eles retornam 0 no flag Boolean. No caso dos comandos MOVE, alem de retornar 0 no flag Boolean eles tambem nao movem o sprite. Em IX deve estar o valor de indice do sprite.