------------------------------------------------------------------------------------------------------------------------------------- -- Exemplo de um arquivo de entrada de dados. -- -- Um comentario tem inicio com '--' ou apos a coluna 20 -- -- A primeira coluna contem o endereco de um dado e a segunda coluna a instrucao. -- -- Tome cuidado com nas instrucoes que ocupam duas posicoes de memoria consecutivas como: 'LDmS,mm', 'Jump,mm' -- Nestes casos, nao esqueca de reservar uma posicao de memoria logo apos a instrucao para que o dado seja armazenado. -- -- Dados num endereco podem ser identificados na forma: Endereco H#valor. Note: somente na base hexadecimal e' permitida -- ------------------------------------------------------------------------------------------------------------------------------------- -- Programa exemplo: ordenacao de valores armazenados entre os enderecos [90]...[9F] ou [144]...[159] -- Chamada da subrotina: -- Posicao de memoria A0 = endereco inicial dos dados a serem ordenados -- Posicao de memoria A1 = endereco final+1 dos dados a serem ordenados -- -- Pseudo-codigo da operacao ordenacao: -- De i=1 Ate n Repita -- De j=0 Ate n-1 Repita -- Se dado(j) > dado(j+1) -- permute as posicoes dos dados dado(j) e dado(j+1) -- Fim Se -- Fim Repita -- Fim Repita -- -- Posicoes de memoria empregadas: -- A0 H#90 -- endereco inicial -- A1 H#A0 -- endereco final +1 -- A2 H#FF -- rascunho -- A3 H#FF -- rascunho -- A5 H#FF -- endereco final-1 -- A6 H#FF -- valor do contador i, ou endereco_i atual -- A7 H#FF -- valor do contador j, ou endereco_j atual -- A8 H#FF -- valor do contador j+1, ou endereco_j+1 atual -- AD H#FF -- valor 1 para incrementos ------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------- -- Prepara o ponteiro da pilha e pagina dos registradores ------------------------------------------------------------------------------------------------------- 00 LDmS,FF -- Sp <= FF (inicia o ponteiro de pilha com valor FF) 01 02 LDmP,A -- Pg <= A (inicia o registrador de pagina com valor A) 03 Call,0A (chama subrotina de ordenacao) 04 05 Halt -- (fim do programa) ------------------------------------------------------------------------------------------------------- -- Subrotina de Ordenacao ------------------------------------------------------------------------------------------------------- -- prepara enderecos auxiliares com valores iniciais 0A LDmA,01 -- Acc <= 01 (valor 01) 0B 0C STdA,D -- [AD] <= Acc 0D LDdA,0 -- Acc <= [A0] (endereco inicial) 0E STdA,7 -- [A7] <= Acc (endereco_j atual, valor inicial) 0F ADdA,D -- Acc <= Acc+[AD] (Acc incrementado, [AD]=01) 10 STdA,6 -- [A6] <= Acc (endereco_i atual, valor inicial) 11 STdA,8 -- [A8] <= Acc (endereco_j+1 atual, valor incial) 12 LDdA,1 -- Acc <= [A1] (endereco final) 13 SBdA,D -- Acc <= Acc-[AD] (Acc decrementado, [AD]=01) 14 STdA,5 -- [A5] <= Acc (endereco final -1) -- Ordenacao -- De i=1 Ate n Repita 15 LDdA,6 -- ([A6]= valor atual de i, ou endereco_i atual) 16 SBdA,1 -- ([A1]= valor de n, ou endereco final) 17 JP_Z,2F -- (se zero fim da iteracao de i => fim da subrotina) 18 -- prepara o contador j para mais um inicio do laco j 19 LDdA,0 -- ([A0]= valor inicial de j, ou endereco inicial) 1A STdA,7 -- ([A7]= valor atual de j, ou endereco_j atual) 1B ADdA,D -- Acc <= Acc+[AD] ([AD]= 01) 1C STdA,8 -- [A8] <=Acc ([A8] recebe o valor de j+1 incrementado -- De j=0 Ate n-1 Repita 1D LDdA,7 -- ([A7]= valor atual de j, ou endereco_j atual) 1E SBdA,5 -- ([A5]= valor de n-1, ou endereco final-1) 1F JP_Z,29 -- (se zero fim da iteracao de j) 20 -- Se dado(j) > dado(j+1): permute as posicoes dos dados dado(j) e dado(j+1) 21 Call,30 -- (nao zero, chama subrotina de troca caso dado(j+1)< dado(j)) 22 -- Fim laco j: incremento de j e j+1 23 LDdA,7 -- Acc <= [A7] (operacao de incremento do valor de j, endereco [A7]) 24 ADdA,D -- Acc <= Acc+[AD] ([AD]= 01) 25 STdA,7 -- [A7] <= Acc ([A7] recebe o valor de j incrementado 26 ADdA,D -- Acc <= Acc+[AD] ([AD]= 01) 27 STdA,8 -- [A8] <=Acc ([A8] recebe o valor de j+1 incrementado 28 Jump,1D (retorna para o incio do laco j) 29 -- Fim laco i: incremento de i 2A LDdA,6 -- Acc <= [A6] (operacao de incremento do valor de i, endereco [A6]) 2B ADdA,D -- Acc <= Acc+[AD] ([AD]= 01) 2C STdA,6 -- [A6] <= Acc ([A6] recebe o valor incrementado, i+1 2D Jump,15 (retorna para o inicio do laco i) 2E ---------------------------------------------------------------------------------------------------------- 2F Retn -- (laco i terminou, retorna) ---------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------- -- Subrotina para a troca caso dado(j+1)< dado(j) ---------------------------------------------------------------------------------------------------------- -- Teste se dado(j+1)< dado(j) 30 LDmP,A 31 LDiA,7 -- Acc <= [[A7]] (endereco A7 aponta para dado(j)) 32 STdA,2 -- [A2] <= Acc 33 LDiA,8 -- Acc <= [[A8]] (endereco A8 aponta para dado(j+1)) 34 SBdA,2 -- Acc <= Acc-[A2] (Acc <= dado(j+1)- dado(j) 35 JP_O,40 -- (Se ocorreu transbordo dado(j+1)< dado(j)) 36 37 JPNG,40 -- (Se negativo: dado(j+1)< dado(j)) 38 39 Retn -- (Nao negativo: dado(j+1) > dado(j) posicao mantida) -- Troca de posicao entre dado(j+1)e dado(j) -- [A2] contem dado(j) 40 LDiA,8 -- Acc <= [[A8]] (endereco A8 aponta para dado(j+1)) 41 STdA,3 -- [A3] <= Acc 42 STiA,7 -- [[A7]] <= Acc (dado(j+1) armazenado na posicao de dado(j)) 43 LDdA,2 -- Acc <= [A2] (dado(j) transferido para Acc) 44 STiA,8 -- [[A8]] <= Acc (dado(j) armazenado na posicao de dado(j+1) 45 Retn -- (Posicao dado(j+1)e dado(j) trocada e retorna) ------------------------------------------------------------------------------------------------------------ -- Tabela de dados a serem ordenados 90 H#07 -- +7 91 H#7F -- +127 92 H#B6 -- -74 93 H#00 -- 0 94 H#12 -- +18 95 H#25 -- +37 96 H#25 -- +37 97 H#00 -- 0 98 H#A6 -- -90 99 H#8A -- -127 9A H#07 -- +7 9B H#D4 -- -44 9C H#01 -- +1 9D H#FF -- -1 9E H#80 -- -128 9F H#80 -- -128 -- Dados para a subrotina de ordenacao A0 H#90 -- endereco inicial A1 H#A0 -- endereco final +1