;;CALCULADORA SIMPLES - 16 BITS CONSTANT PORTA_NUMERICO0, 01 CONSTANT PORTA_NUMERICO1, 02 CONSTANT PORTA_NUMERICO2, 03 CONSTANT PORTA_NUMERICO3, 00 CONSTANT PORTA_LEDS, A0 CONSTANT PORTA_SWITCHES, 00 CONSTANT PORTA_BTNS, FF NAMEREG sA, valor_btns NAMEREG sB, valor_switches NAMEREG sC, valor_leds NAMEREG sD, lo_byte ;byte menos significativo do resultado NAMEREG sE, hi_byte ;byte mais significativo do resultado NAMEREG sF, ultima_opcao ;armazena a ultima opção usada (soma, sub, reset ou mostrar o acumulador) NAMEREG s0, sinal_overflow ;indicador de overflow NAMEREG s1, sinal_negativo ;indicador de sinal negativo NAMEREG s2, display NAMEREG s3, tem ;registrador temporário NAMEREG s4, temp_result ;utilizado para armazenar 8 bits temporários. Regs são 8 bits, calc é 16 bits ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LOAD valor_leds, 00 ;zera os leds LOAD lo_byte, 00 ;\ LOAD hi_byte, 00 ;/ inicializa o acumulador com 0 LOAD ultima_opcao, 00 ;ultima_opcao = 0, nenhum botão pressionado ;; JUMP op4 loop: INPUT valor_btns, PORTA_BTNS ;lê o valor dos botões SUB ultima_opcao, 00 ;se não foi pressionado nenhum botão... JUMP Z, mostra_valor ;... mostra o valor dos switches cont: LOAD temp, 08 ; \ SUB temp, valor_btns ; / verifica se foi o botão de impressão (botão 4) que foi pressionado JUMP NZ, op1 ;se não foi, pula para verificar se foi soma JUMP op4 ;se foi pula para imprimir o resultado mostra_valor: INPUT valor_switches, PORTA_SWITCHES ;lê o valor dos switches LOAD temp, valor_switches ;guardando o valor dos switches para mostrar depois os 8 bits OUTPUT temp, PORTA_NUMERICO2 ;mostra os 4 LSB dos switches... SR0 temp ;\ SR0 temp ; \ SR0 temp ; /... desloca os bits a direita para... SR0 temp ;/ OUTPUT temp, PORTA_NUMERICO3 ;... mostrar os 4 MSB dos switches JUMP cont ;continua a execução do laço principal op1: ;operação 1: soma o valor dos switches com o acumulador LOAD temp, 01 ;\ SUB temp, valor_btns ;/ verifica se foi o botão de soma (botão 1) que foi pressionado JUMP NZ, op2 ;se não foi, pula para verificar se foi subtração INPUT valor_switches, PORTA_SWITCHES ;se foi, carrega o valor dos switches ADD lo_byte, valor_switches ;soma o valor que está nos switches com o acumulador ADDCY hi_byte, 00 ;soma o carry em hi_byte JUMP C, overflow ;pula para verificar se ocorreu overflow JUMP btn_press ;não permite que a operação seja repetida enquanto o botão estiver pressionado overflow: SUB sinal_overflow, 01 ;verfica a ocorrência JUMP Z, loop ;se não ocorreu overflow, volta ao início LOAD sinal_overflow, 80 ;se ocorreu, seta o sinal de overflow OUTPUT sinal_overflow, PORTA_LEDS ;mostra no LED7 o sinal de overflow JUMP loop ;pula para atualizar os displays op2: ;operação 2: subtrai o valor dos switches do acumulador LOAD temp, 02 ;\ SUB temp, valor_btns ;/ verifica se foi o botão de subtração (botão 2) que foi pressionado JUMP NZ, op3 ;se não foi, pula para verificar se foi o botão de reset INPUT valor_switches, PORTA_SWITCHES ;se foi, carrega o valor dos switches SUB lo_byte, valor_switches ;subtrai o valor dos switches do acumulador SUBCY hi_byte, 00 ;subtrai o carry em hi_byte JUMP C, negativo ;verifica se o resultado é negativo JUMP btn_press ;não permite que a operação seja repetida enquanto o botão estiver pressionado negativo: LOAD sinal_negativo, 01 ;se é negativo, seta o sinal de negativo OUTPUT sinal_negativo, PORTA_LEDS ;mostra no LED0 o sinal negativo JUMP loop op3: ;reseta o acumulador LOAD temp, 04 ;\ SUB temp, valor_btns ;/ verificar se foi o botão de reset (botão 3) que foi pressionado JUMP NZ, op4 ;se não foi, pula para mostrar o valor do acumulador LOAD lo_byte, 00 ;se foi, reseta o acumulador (lo_byte)... LOAD hi_byte, 00 ;... (hi_byte) ... LOAD sinal_overflow, 00 ;... o indicador de overflow e... LOAD sinal_negativo, 00 ;... o indicador de número negativo JUMP loop ;volta para o início do laço principal btn_press: INPUT valor_btns, PORTA_BTNS ;lê o valor dos botões LOAD ultima_opcao, valor_btns ;carrega o valor dos botões SUB valor_btns, 00 ;verifica se nenhum botão está pressionado JUMP Z, loop ;se não está, volta para loop JUMP btn_press ;se está reinicia o laço op4: ;mostra o resultado nos displays LOAD temp_result, lo_byte ;carrega o byte menos significativo em um reg de resultado temporário OUTPUT temp_result, PORTA_NUMERICO2 ;mostra os 4 LSB de lo_byte... SR0 temp_result ;\ SR0 temp_result ; \ SR0 temp_result ; /... desloca os bits a direita para... SR0 temp_result ;/ OUTPUT temp_result, PORTA_NUMERICO3 ;... mostrar os 4 MSB de hi_byte nos displays LOAD temp_result,hi_byte ;carrega o byte mais significativo em um reg de resultado temporário OUTPUT temp_result, PORTA_NUMERICO0 ;mostra os 4 LSB de hi_byte... SR0 temp_result ;\ SR0 temp_result ; \ SR0 temp_result ; /... desloca os bits a direita para... SR0 temp_result ;/ OUTPUT temp, PORTA_NUMERICO1 ;... mostrar os 4 MSB de hi_byte nos displays JUMP loop ;volta para o início do laço principal