;output ports CONSTANT PORTA_NUMERICO_0, 00 CONSTANT PORTA_NUMERICO_1, 01 CONSTANT PORTA_LEDS, A0 CONSTANT PORTA_SWITCHES, 00 CONSTANT PORTA_BTNS, FF ;registers NAMEREG sA, valor_btns NAMEREG sB, valor_switches NAMEREG sC, temp NAMEREG sD, acumulador NAMEREG sE, controle NAMEREG sF, carry NAMEREG s0, valor_leds NAMEREG s1, valor_neg NAMEREG s2, underflow ;inicialização das variáveis LOAD acumulador, 00 LOAD controle, 00 OUTPUT acumulador, PORTA_LEDS LOAD underflow, 02 ;loop -> verifica que botão esta pressionado loop: INPUT valor_btns, PORTA_BTNS LOAD temp, valor_btns SUB temp, 08 JUMP Z, showr LOAD temp, valor_btns SUB temp, 04 JUMP Z, reset LOAD temp, valor_btns SUB temp, 02 JUMP Z, sub LOAD temp, valor_btns SUB temp, 01 JUMP Z, add JUMP shows add: ;verifica se o numero presente no display é o mesmo número utilizado na última operação INPUT temp, PORTA_SWITCHES SUB controle, temp INPUT controle, PORTA_SWITCHES JUMP Z, loop ;verifica se o numero armazenado no acumulador está em underflow SUB underflow, 01 JUMP NZ, addP JUMP addN ;addP -> adição quando o valor do acumulador é positivo addP: LOAD underflow, 02 ADD acumulador, temp LOAD carry, 00 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, 01 LOAD carry, temp SUB carry, valor_neg LOAD carry, 00 SLA carry JUMP NZ, stay_under LOAD underflow, 02 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 INPUT temp, PORTA_SWITCHES SUB controle, temp INPUT controle, PORTA_SWITCHES JUMP Z, loop ;verifica se o numero armazenado no acumulador está em underflow SUB underflow, 01 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, 00 SLA carry JUMP NZ, under LOAD underflow, 02 JUMP loop ;reset -> zera o acumulador, o controle e apaga os leds reset: LOAD acumulador, 00 LOAD controle, 00 OUTPUT controle, PORTA_LEDS LOAD underflow, 02 JUMP loop ;showr -> mostra o valor do acumulador (resultado atual das operacoes aritmeticas) showr: LOAD temp, acumulador LOAD controle, 00 OUTPUT temp, PORTA_NUMERICO_1 SR0 temp SR0 temp SR0 temp SR0 temp OUTPUT temp, PORTA_NUMERICO_0 JUMP loop ;shows -> mostra o valor presente nos switches shows: INPUT valor_switches, PORTA_SWITCHES OUTPUT valor_switches, PORTA_NUMERICO_1 SR0 valor_switches SR0 valor_switches SR0 valor_switches SR0 valor_switches OUTPUT valor_switches, PORTA_NUMERICO_0 JUMP loop ;under -> sinaliza o underflow acendendo o led mais a direita under: LOAD underflow, 01 OUTPUT underflow, PORTA_LEDS JUMP loop ;over -> sinaliza o overflow acendendo o led mais a esquerda over: LOAD carry, 80 OUTPUT carry, PORTA_LEDS JUMP loop ;resetled -> apaga todos os leds da plataforma resetleds: LOAD carry, 00 OUTPUT carry, PORTA_LEDS JUMP loop