; output ports PORTA_NUMERICO_0 EQU 0 PORTA_NUMERICO_1 EQU 1 PORTA_LEDS EQU $A0 PORTA_SWITCHES EQU 0 PORTA_BTNS EQU $FF ; registers valor_btns EQU sA valor_switches EQU sB temp EQU sC acumulador EQU sD controle EQU sE carry EQU sF valor_leds EQU s0 valor_neg EQU s1 underflow EQU s2 ; inicialização das variáveis LOAD acumulador, 0 LOAD controle, 0 OUT acumulador, PORTA_LEDS LOAD underflow, 2 ; loop -> verifica que botão esta pressionado loop: IN valor_btns, PORTA_BTNS LOAD temp, valor_btns SUB temp, 8 JUMP Z, showr LOAD temp, valor_btns SUB temp, 4 JUMP Z, reset LOAD temp, valor_btns SUB temp, 2 JUMP Z, SUB LOAD temp, valor_btns SUB temp, 1 JUMP Z, ADD JUMP shows ADD : ; verifica se o numero presente no display é o mesmo número utilizado na última operação IN temp, PORTA_SWITCHES SUB controle, temp IN controle, PORTA_SWITCHES JUMP Z, loop ; verifica se o numero armazenado no acumulador está em underflow SUB underflow, 1 JUMP NZ, addP JUMP addN ; addP -> adição quando o valor do acumulador é positivo addP: LOAD underflow, 2 ADD acumulador, temp LOAD carry, 0 SLA carry JUMP NZ, over JUMP loop ; addN -> adição quando o valor do acumulador é negativo addN: LOAD valor_neg, $FF SUB valor_neg, acumulador ADD valor_neg, 1 LOAD carry, temp SUB carry, valor_neg LOAD carry, 0 SLA carry JUMP NZ, stay_under LOAD underflow, 2 ADD acumulador, temp JUMP resetleds ; stay_under -> mantém o estado de underflow stay_under: ADD acumulador, temp JUMP under SUB : ; verifica se o numero presente no display é o mesmo número utilizado na última operação IN temp, PORTA_SWITCHES SUB controle, temp IN controle, PORTA_SWITCHES JUMP Z, loop ; verifica se o numero armazenado no acumulador está em underflow SUB underflow, 1 JUMP NZ, subP ; subtração quando o valor do acumulador é negativo SUB acumulador, temp JUMP under ; subP -> subtração quando o valor do acumulador é positivo subP: SUB acumulador, temp LOAD carry, 0 SLA carry JUMP NZ, under LOAD underflow, 2 JUMP loop ; reset -> zera o acumulador, o controle e apaga os leds reset: LOAD acumulador, 0 LOAD controle, 0 OUT controle, PORTA_LEDS LOAD underflow, 2 JUMP loop ; showr -> mostra o valor do acumulador (resultado atual das operacoes aritmeticas) showr: LOAD temp, acumulador LOAD controle, 0 OUT temp, PORTA_NUMERICO_1 SR0 temp SR0 temp SR0 temp SR0 temp OUT temp, PORTA_NUMERICO_0 JUMP loop ; shows -> mostra o valor presente nos switches shows: IN valor_switches, PORTA_SWITCHES OUT valor_switches, PORTA_NUMERICO_1 SR0 valor_switches SR0 valor_switches SR0 valor_switches SR0 valor_switches OUT valor_switches, PORTA_NUMERICO_0 JUMP loop ; under -> sinaliza o underflow acendendo o led mais a direita under: LOAD underflow, 1 OUT underflow, PORTA_LEDS JUMP loop ; over -> sinaliza o overflow acendendo o led mais a esquerda over: LOAD carry, $80 OUT carry, PORTA_LEDS JUMP loop ; resetled -> apaga todos os leds da plataforma resetleds: LOAD carry, 0 OUT carry, PORTA_LEDS JUMP loop