quarta-feira, 29 de janeiro de 2020



Essa é uma calculadora básica, + - x /, só que possui 32 dígitos:




Displays acesos:


Circuito impresso:



Aqui o circuito eletrônico. O programa principal que faz os cálculos roda num Atmega328
com cristal de 20MHz. A soma, subtração e multiplicação são baseados nas instruções do
microcontrolador, com algoritmos fáceis, porém não há instruções para a divisão,
onde foi necessário elaborar um algoritmo específico e conseqüentemente, ficou um pouco
mais lento:



Aqui o circuito do módulo. São usados quatro módulos endereçados via I2C:





Vídeo:



















.include<m328Pdef.inc> ;avrprog:  core:atmega88  flash:atmega32



.include"bindec64_i"
.include"dec32bin14_i"
.include"soma_i"
.include"mul28bytes_i"
.include"div16bytes_i"



;fuse high  0xd9
;fuse low 0xee cristal 20MHz









.org 0x0000 ;0x0000 = reset
rjmp INICIO


.org 0x000e ;0x000e = int tc2
rjmp INT_TC2









INT_TC2: ;128us
push r16
in r16,sreg
push r16



lds r16,0x0200 ;inc pré contador teclado
inc r16
sts 0x0200,r16


lds r16,0x0206 ;0x0206 = zera contador twi
inc r16
sts 0x0206,r16


lds r16,0x02a2 ;0x02a2 = principal contador
inc r16
sts 0x02a2,r16
brne int_tc2_pc2_fim ;sem 0x00
lds r16,0x02a3 ;0x02a3 = principal contador 2
inc r16 ;128us * 256 = 32ms
sts 0x02a3,r16
int_tc2_pc2_fim:


lds r16,0x02a5 ;0x02a5 = teste contador
inc r16
sts 0x02a5,r16
brne int_tc2_tst_fim ;sem 0x00
lds r16,0x02a6 ;0x02a6 = teste contador 2
inc r16 ;128us * 256 = 32ms
sts 0x02a6,r16
int_tc2_tst_fim:



pop r16
out sreg,r16
pop r16
reti

















INICIO:


ldi r17,0x08 ;stack pointer = 0x08ff
ldi r16,0xff
out sph,r17
out spl,r16



sbi ddrd,0 ;saídas
sbi ddrd,1
sbi ddrd,2
sbi ddrd,3
sbi ddrd,4
sbi ddrb,1
sbi ddrb,2
sbi ddrb,3
sbi ddrb,4
sbi ddrb,5
sbi ddrc,0
sbi ddrc,1
sbi ddrc,2


ldi r16,0x02 ;0x02: ctc, ocra
sts tccr2a,r16
ldi r16,0x04 ;0x04: clk / 64
sts tccr2b,r16
ldi r16,0x28 ;0x28: 1/(20MHz/64) * 0x28 = 128us
sts ocr2a,r16
ldi r16,0x02 ;0x02: int comp a match
sts timsk2,r16






;Variáveis:
ldi r16,0x00 ;0x0200 = pré contador teclado
sts 0x0200,r16

ldi r16,0x00 ;0x0201 = estado teclado
sts 0x0201,r16

ldi r16,0x00 ;0x0202 = tecla acionada = ta0
sts 0x0202,r16 ;7 6 5 4 3 2 1 0

ldi r16,0x00 ;0x0203 = tecla acionada = ta1
sts 0x0203,r16 ;/ x - + = . 9 8

ldi r16,0x00 ;0x0204 = tecla acionada = ta2
sts 0x0204,r16 ;        mr m <- +/-

ldi r16,0x00 ;0x0205 = zera contador teclado
sts 0x0205,r16

ldi r16,0x00 ;0x0206 = zera contador
sts 0x0206,r16


ldi r16,0x09 ;0x09 = 0x0207 = estado twi fim
sts 0x0207,r16

ldi r16,0x00 ;0x0208 = byte twi
sts 0x0208,r16


ldi r16,0x00 ;0x02 = endereço 1  =>  0x020a = endereço twi
sts 0x020a,r16 ;b6 b5 b4 b3 b2 b1 b0 x





;memória display:
ldi r16,0x10 ;0x020d = dígito 0
sts 0x020d,r16
ldi r16,0x10 ;0x020e = dígito 1
sts 0x020e,r16
ldi r16,0x10 ;0x020f = dígito 2
sts 0x020f,r16
ldi r16,0x10 ;0x0210 = dígito 3
sts 0x0210,r16
ldi r16,0x10 ;0x0211 = dígito 4
sts 0x0211,r16
ldi r16,0x10 ;0x0212 = dígito 5
sts 0x0212,r16
ldi r16,0x10 ;0x0213 = dígito 6
sts 0x0213,r16
ldi r16,0x10 ;0x0214 = dígito 7
sts 0x0214,r16
ldi r16,0x10 ;0x0215 = dígito 8
sts 0x0215,r16
ldi r16,0x10 ;0x0216 = dígito 9
sts 0x0216,r16
ldi r16,0x10 ;0x0217 = dígito 10
sts 0x0217,r16
ldi r16,0x10 ;0x0218 = dígito 11
sts 0x0218,r16
ldi r16,0x10 ;0x0219 = dígito 12
sts 0x0219,r16
ldi r16,0x10 ;0x021a = dígito 13
sts 0x021a,r16
ldi r16,0x10 ;0x021b = dígito 14
sts 0x021b,r16
ldi r16,0x10 ;0x021c = dígito 15
sts 0x021c,r16
ldi r16,0x10 ;0x021d = dígito 16
sts 0x021d,r16
ldi r16,0x10 ;0x021e = dígito 17
sts 0x021e,r16
ldi r16,0x10 ;0x021f = dígito 18
sts 0x021f,r16
ldi r16,0x10 ;0x0220 = dígito 19
sts 0x0220,r16
ldi r16,0x10 ;0x0221 = dígito 20
sts 0x0221,r16
ldi r16,0x10 ;0x0222 = dígito 21
sts 0x0222,r16
ldi r16,0x10 ;0x0223 = dígito 22
sts 0x0223,r16
ldi r16,0x10 ;0x0224 = dígito 23
sts 0x0224,r16
ldi r16,0x10 ;0x0225 = dígito 24
sts 0x0225,r16
ldi r16,0x10 ;0x0226 = dígito 25
sts 0x0226,r16
ldi r16,0x10 ;0x0227 = dígito 26
sts 0x0227,r16
ldi r16,0x10 ;0x0228 = dígito 27
sts 0x0228,r16
ldi r16,0x10 ;0x0229 = dígito 28
sts 0x0229,r16
ldi r16,0x10 ;0x022a = dígito 29
sts 0x022a,r16
ldi r16,0x10 ;0x022b = dígito 30
sts 0x022b,r16
ldi r16,0x10 ;0x022c = dígito 31
sts 0x022c,r16
;md ponto:
ldi r16,32 ;32 = 0x022d = ponto apagado
sts 0x022d,r16
;md sinal menos:
ldi r16,0x00 ;0x022e = sinal menos
sts 0x022e,r16

;md estado:
ldi r16,0x00 ;0x0231 = estado transmite byte
sts 0x0231,r16

ldi r16,0x00 ;0x0233 = ponto m1
sts 0x0233,r16
ldi r16,0x00 ;0x0234 = ponto m2
sts 0x0234,r16
ldi r16,0x00 ;0x0235 = ponto m3
sts 0x0235,r16
ldi r16,0x00 ;0x0236 = ponto m4
sts 0x0236,r16





;número A:
ldi r16,0x00 ;0x0237 = dígito 0
sts 0x0237,r16
ldi r16,0x00 ;0x0238 = dígito 1
sts 0x0238,r16
ldi r16,0x00 ;0x0239 = dígito 2
sts 0x0239,r16
ldi r16,0x00 ;0x023a = dígito 3
sts 0x023a,r16
ldi r16,0x00 ;0x023b = dígito 4
sts 0x023b,r16
ldi r16,0x00 ;0x023c = dígito 5
sts 0x023c,r16
ldi r16,0x00 ;0x023d = dígito 6
sts 0x023d,r16
ldi r16,0x00 ;0x023e = dígito 7
sts 0x023e,r16
ldi r16,0x00 ;0x023f = dígito 8
sts 0x023f,r16
ldi r16,0x00 ;0x0240 = dígito 9
sts 0x0240,r16
ldi r16,0x00 ;0x0241 = dígito 10
sts 0x0241,r16
ldi r16,0x00 ;0x0242 = dígito 11
sts 0x0242,r16
ldi r16,0x00 ;0x0243 = dígito 12
sts 0x0243,r16
ldi r16,0x00 ;0x0244 = dígito 13
sts 0x0244,r16
ldi r16,0x00 ;0x0245 = dígito 14
sts 0x0245,r16
ldi r16,0x00 ;0x0246 = dígito 15
sts 0x0246,r16
ldi r16,0x00 ;0x0247 = dígito 16
sts 0x0247,r16
ldi r16,0x00 ;0x0248 = dígito 17
sts 0x0248,r16
ldi r16,0x00 ;0x0249 = dígito 18
sts 0x0249,r16
ldi r16,0x00 ;0x024a = dígito 19
sts 0x024a,r16
ldi r16,0x00 ;0x024b = dígito 20
sts 0x024b,r16
ldi r16,0x00 ;0x024c = dígito 21
sts 0x024c,r16
ldi r16,0x00 ;0x024d = dígito 22
sts 0x024d,r16
ldi r16,0x00 ;0x024e = dígito 23
sts 0x024e,r16
ldi r16,0x00 ;0x024f = dígito 24
sts 0x024f,r16
ldi r16,0x00 ;0x0250 = dígito 25
sts 0x0250,r16
ldi r16,0x00 ;0x0251 = dígito 26
sts 0x0251,r16
ldi r16,0x00 ;0x0252 = dígito 27
sts 0x0252,r16
ldi r16,0x00 ;0x0253 = dígito 28
sts 0x0253,r16
ldi r16,0x00 ;0x0254 = dígito 29
sts 0x0254,r16
ldi r16,0x00 ;0x0255 = dígito 30
sts 0x0255,r16
ldi r16,0x00 ;0x0256 = dígito 31
sts 0x0256,r16

ldi r16,0x00 ;0x0257 = ponto na
sts 0x0257,r16

ldi r16,0x00 ;0x0258 = sinal na
sts 0x0258,r16



;número B:
ldi r16,0x00 ;0x0259 = dígito 0
sts 0x0259,r16
ldi r16,0x00 ;0x025a = dígito 1
sts 0x025a,r16
ldi r16,0x00 ;0x025b = dígito 2
sts 0x025b,r16
ldi r16,0x00 ;0x025c = dígito 3
sts 0x025c,r16
ldi r16,0x00 ;0x025d = dígito 4
sts 0x025d,r16
ldi r16,0x00 ;0x025e = dígito 5
sts 0x025e,r16
ldi r16,0x00 ;0x025f = dígito 6
sts 0x025f,r16
ldi r16,0x00 ;0x0260 = dígito 7
sts 0x0260,r16
ldi r16,0x00 ;0x0261 = dígito 8
sts 0x0261,r16
ldi r16,0x00 ;0x0262 = dígito 9
sts 0x0262,r16
ldi r16,0x00 ;0x0263 = dígito 10
sts 0x0263,r16
ldi r16,0x00 ;0x0264 = dígito 11
sts 0x0264,r16
ldi r16,0x00 ;0x0265 = dígito 12
sts 0x0265,r16
ldi r16,0x00 ;0x0266 = dígito 13
sts 0x0266,r16
ldi r16,0x00 ;0x0267 = dígito 14
sts 0x0267,r16
ldi r16,0x00 ;0x0268 = dígito 15
sts 0x0268,r16
ldi r16,0x00 ;0x0269 = dígito 16
sts 0x0269,r16
ldi r16,0x00 ;0x026a = dígito 17
sts 0x026a,r16
ldi r16,0x00 ;0x026b = dígito 18
sts 0x026b,r16
ldi r16,0x00 ;0x026c = dígito 19
sts 0x026c,r16
ldi r16,0x00 ;0x026d = dígito 20
sts 0x026d,r16
ldi r16,0x00 ;0x026e = dígito 21
sts 0x026e,r16
ldi r16,0x00 ;0x026f = dígito 22
sts 0x026f,r16
ldi r16,0x00 ;0x0270 = dígito 23
sts 0x0270,r16
ldi r16,0x00 ;0x0271 = dígito 24
sts 0x0271,r16
ldi r16,0x00 ;0x0272 = dígito 25
sts 0x0272,r16
ldi r16,0x00 ;0x0273 = dígito 26
sts 0x0273,r16
ldi r16,0x00 ;0x0274 = dígito 27
sts 0x0274,r16
ldi r16,0x00 ;0x0275 = dígito 28
sts 0x0275,r16
ldi r16,0x00 ;0x0276 = dígito 29
sts 0x0276,r16
ldi r16,0x00 ;0x0277 = dígito 30
sts 0x0277,r16
ldi r16,0x00 ;0x0278 = dígito 31
sts 0x0278,r16

ldi r16,0x00 ;0x0279 = ponto nb
sts 0x0279,r16

ldi r16,0x00 ;0x027a = sinal nb
sts 0x027a,r16



;memória:
ldi r16,0x00 ;0x027b = dígito 0
sts 0x027b,r16
ldi r16,0x00 ;0x027c = dígito 1
sts 0x027c,r16
ldi r16,0x00 ;0x027d = dígito 2
sts 0x027d,r16
ldi r16,0x00 ;0x027e = dígito 3
sts 0x027e,r16
ldi r16,0x00 ;0x027f = dígito 4
sts 0x027f,r16
ldi r16,0x00 ;0x0280 = dígito 5
sts 0x0280,r16
ldi r16,0x00 ;0x0281 = dígito 6
sts 0x0281,r16
ldi r16,0x00 ;0x0282 = dígito 7
sts 0x0282,r16
ldi r16,0x00 ;0x0283 = dígito 8
sts 0x0283,r16
ldi r16,0x00 ;0x0284 = dígito 9
sts 0x0284,r16
ldi r16,0x00 ;0x0285 = dígito 10
sts 0x0285,r16
ldi r16,0x00 ;0x0286 = dígito 11
sts 0x0286,r16
ldi r16,0x00 ;0x0287 = dígito 12
sts 0x0287,r16
ldi r16,0x00 ;0x0288 = dígito 13
sts 0x0288,r16
ldi r16,0x00 ;0x0289 = dígito 14
sts 0x0289,r16
ldi r16,0x00 ;0x028a = dígito 15
sts 0x028a,r16
ldi r16,0x00 ;0x028b = dígito 16
sts 0x028b,r16
ldi r16,0x00 ;0x028c = dígito 17
sts 0x028c,r16
ldi r16,0x00 ;0x028d = dígito 18
sts 0x028d,r16
ldi r16,0x00 ;0x028e = dígito 19
sts 0x028e,r16
ldi r16,0x00 ;0x028f = dígito 20
sts 0x028f,r16
ldi r16,0x00 ;0x0290 = dígito 21
sts 0x0290,r16
ldi r16,0x00 ;0x0291 = dígito 22
sts 0x0291,r16
ldi r16,0x00 ;0x0292 = dígito 23
sts 0x0292,r16
ldi r16,0x00 ;0x0293 = dígito 24
sts 0x0293,r16
ldi r16,0x00 ;0x0294 = dígito 25
sts 0x0294,r16
ldi r16,0x00 ;0x0295 = dígito 26
sts 0x0295,r16
ldi r16,0x00 ;0x0296 = dígito 27
sts 0x0296,r16
ldi r16,0x00 ;0x0297 = dígito 28
sts 0x0297,r16
ldi r16,0x00 ;0x0298 = dígito 29
sts 0x0298,r16
ldi r16,0x00 ;0x0299 = dígito 30
sts 0x0299,r16
ldi r16,0x00 ;0x029a = dígito 31
sts 0x029a,r16

ldi r16,0x00 ;0x029b = ponto m
sts 0x029b,r16

ldi r16,0x00 ;0x029c = sinal m
sts 0x029c,r16



ldi r16,0x00 ;0x029d = principal estado
sts 0x029d,r16
ldi r16,0x00 ;0x029e = principal operação
sts 0x029e,r16

ldi r16,0x00 ;0x029f = escreve display ponteiro alto
sts 0x029f,r16
ldi r16,0x00 ;0x02a0 = escreve display ponteiro baixo
sts 0x02a0,r16
ldi r16,0x00 ;0x02a1 = escreve display estado
sts 0x02a1,r16

ldi r16,0x00 ;0x02a2 = principal contador
sts 0x02a2,r16
ldi r16,0x00 ;0x02a3 = principal contador 2
sts 0x02a3,r16

ldi r16,0x00 ;0x02a4 = retorna erro
sts 0x02a4,r16

ldi r16,0x00 ;0x02a5 = teste contador
sts 0x02a5,r16
ldi r16,0x00 ;0x02a6 = teste contador 2
sts 0x02a6,r16
ldi r16,0x00 ;0x02a7 = teste número
sts 0x02a7,r16
ldi r16,0x00 ;0x02a8 = teste estado
sts 0x02a8,r16
ldi r16,0x00 ;0x02a9 = teste ponto
sts 0x02a9,r16








sei ;liga ints









;clock twi
ldi r16,255 ;255 = 26us
sts twbr,r16
ldi r16,0 ;0: twps = 1
sts twsr,r16


;teclado
sbi portd,0 ;seta saída d0
cbi portd,1
cbi portd,2
cbi portd,3
cbi portd,4









;tempo inicial: empresta 0x02a2 0x02a3
ti_contando:
lds r16,0x02a3 ;0x02a3 = principal contador 2
cpi r16,15 ;15 * 32ms  0.5s
brsh ti_fim
rjmp ti_contando
ti_fim:
clr r16
sts 0x02a2,r16 ;0x02a2 = principal contador
sts 0x02a3,r16 ;0x02a3 = principal contador 2




















;////////////////////////////////////////////////////////////////////////////
processamento:
;////////////////////////////////////////////////////////////////////////////











;----------------------------------------------------------------------------
;máquina de estados do teclado:

lds r16,0x0200 ;0x0200 = pré contador teclado
cpi r16,16 ;16 * 128us = 2 ms
brlo mtc_fim_alcance
rjmp mtc_ponte_1
mtc_fim_alcance:
rjmp mtc_fim
mtc_ponte_1:
clr r16
sts 0x0200,r16 ;0x0200 = zera pré contador



lds r16,0x0201 ;0x0201 = estado teclado
cpi r16,0
breq mtc0_alcance
cpi r16,1
breq mtc1_alcance
cpi r16,2
breq mtc2_alcance
cpi r16,3
breq mtc3_alcance
cpi r16,4
breq mtc4_alcance
cpi r16,5
breq mtc5_alcance
cpi r16,6
breq mtc6_alcance
cpi r16,7
breq mtc7_alcance
cpi r16,8
breq mtc8_alcance
cpi r16,9
breq mtc9_alcance


mtc0_alcance:
rjmp mtc0
mtc1_alcance:
rjmp mtc1
mtc2_alcance:
rjmp mtc2
mtc3_alcance:
rjmp mtc3
mtc4_alcance:
rjmp mtc4
mtc5_alcance:
rjmp mtc5
mtc6_alcance:
rjmp mtc6
mtc7_alcance:
rjmp mtc7
mtc8_alcance:
rjmp mtc8
mtc9_alcance:
rjmp mtc9









mtc0: ;C0_0
call mtc_entradas ;leitura entradas
cpi r20,0 ;0
breq mtc0_leu_0
rjmp mtc0_leu_dif_0
mtc0_leu_0:
call mtc_zera_contador ;0x0205 = zera contador teclado
cbi portd,0
sbi portd,1 ;seta saída d1
cbi portd,2
cbi portd,3
cbi portd,4
ldi r16,2 ;2 = próximo estado
sts 0x0201,r16 ;0x0201 = estado teclado
rjmp mtc0_fim
mtc0_leu_dif_0:
call mtc_incrementa_contador ;0x0205 = inc contador teclado
cpi r16,20 ;20 * 2 = 40ms
brlo mtc0_inc_contando
;lê teclas r20 - coluna 0 = 7 4 1 0:
lds r16,0x0202 ;0x0202 = tecla acionada = ta0
bst r20,0 ;b0 = 7
bld r16,7 ;r16,b7 = 7
bst r20,1 ;b1 = 4
bld r16,4 ;r16,b4 = 4
bst r20,2 ;b2 = 1
bld r16,1 ;r16,b1 = 1
bst r20,3 ;b3 = 0
bld r16,0 ;r16,b0 = 0
sts 0x0202,r16 ;0x0202 = tecla acionada = ta0

ldi r16,1 ;estado 1
sts 0x0201,r16 ;0x0201 = estado teclado
rjmp mtc0_fim
mtc0_inc_contando:

mtc0_fim:
rjmp mtc_fim



mtc1: ;C0_1
call mtc_entradas ;leitura entradas
cpi r20,0 ;0
brne mtc1_fim
ldi r16,0 ;estado 0 anterior
sts 0x0201,r16 ;0x0201 = estado teclado
mtc1_fim:
rjmp mtc_fim






mtc2: ;C1_0
call mtc_entradas ;leitura entradas
cpi r20,0 ;0
breq mtc2_leu_0
rjmp mtc2_leu_dif_0
mtc2_leu_0:
call mtc_zera_contador ;0x0205 = zera contador teclado
cbi portd,0
cbi portd,1 ;seta saída d2
sbi portd,2
cbi portd,3
cbi portd,4
ldi r16,4 ;4 = próximo estado
sts 0x0201,r16 ;0x0201 = estado teclado
rjmp mtc2_fim
mtc2_leu_dif_0:
call mtc_incrementa_contador ;0x0205 = inc contador teclado
cpi r16,20 ;20 * 2 = 40ms
brlo mtc2_inc_contando
;lê teclas r20 - coluna 1 = 8 5 2 .:
lds r16,0x0202 ;0x0202 = tecla acionada = ta0
lds r17,0x0203 ;0x0203 = tecla acionada = ta1
bst r20,0 ;b0 = 8
bld r17,0 ;r17,b0 = 8
bst r20,1 ;b1 = 5
bld r16,5 ;r16,b5 = 5
bst r20,2 ;b2 = 2
bld r16,2 ;r16,b2 = 2
bst r20,3 ;b3 = .
bld r17,2 ;r17,b2 = .
sts 0x0202,r16 ;0x0202 = tecla acionada = ta0
sts 0x0203,r17 ;0x0203 = tecla acionada = ta1

ldi r16,1 ;estado 1
sts 0x0201,r16 ;0x0201 = estado teclado
rjmp mtc2_fim
mtc2_inc_contando:

mtc2_fim:
rjmp mtc_fim



mtc3: ;C1_1
call mtc_entradas ;leitura entradas
cpi r20,0 ;0
brne mtc3_fim
ldi r16,0 ;estado 0 anterior
sts 0x0201,r16 ;0x0201 = estado teclado
mtc3_fim:
rjmp mtc_fim







mtc4: ;C2_0
call mtc_entradas ;leitura entradas
cpi r20,0 ;0
breq mtc4_leu_0
rjmp mtc4_leu_dif_0
mtc4_leu_0:
call mtc_zera_contador ;0x0205 = zera contador teclado
cbi portd,0
cbi portd,1 ;seta saída d3
cbi portd,2
sbi portd,3
cbi portd,4
ldi r16,6 ;6 = próximo estado
sts 0x0201,r16 ;0x0201 = estado teclado
rjmp mtc4_fim
mtc4_leu_dif_0:
call mtc_incrementa_contador ;0x0205 = inc contador teclado
cpi r16,20 ;20 * 2 = 40ms
brlo mtc4_inc_contando
;lê teclas r20 - coluna 2 = 9 6 3 =:
lds r16,0x0202 ;0x0202 = tecla acionada = ta0
lds r17,0x0203 ;0x0203 = tecla acionada = ta1
bst r20,0 ;b0 = 9
bld r17,1 ;r17,b1 = 9
bst r20,1 ;b1 = 6
bld r16,6 ;r16,b6 = 6
bst r20,2 ;b2 = 3
bld r16,3 ;r16,b3 = 3
bst r20,3 ;b3 = =
bld r17,3 ;r17,b3 = =
sts 0x0202,r16 ;0x0202 = tecla acionada = ta0
sts 0x0203,r17 ;0x0203 = tecla acionada = ta1

ldi r16,1 ;estado 1
sts 0x0201,r16 ;0x0201 = estado teclado
rjmp mtc4_fim
mtc4_inc_contando:

mtc4_fim:
rjmp mtc_fim



mtc5: ;C2_1
call mtc_entradas ;leitura entradas
cpi r20,0 ;0
brne mtc5_fim
ldi r16,0 ;estado 0 anterior
sts 0x0201,r16 ;0x0201 = estado teclado
mtc5_fim:
rjmp mtc_fim







mtc6: ;C3_0
call mtc_entradas ;leitura entradas
cpi r20,0 ;0
breq mtc6_leu_0
rjmp mtc6_leu_dif_0
mtc6_leu_0:
call mtc_zera_contador ;0x0205 = zera contador teclado
cbi portd,0
cbi portd,1 ;seta saída d4
cbi portd,2
cbi portd,3
sbi portd,4
ldi r16,8 ;8 = próximo estado
sts 0x0201,r16 ;0x0201 = estado teclado
rjmp mtc6_fim
mtc6_leu_dif_0:
call mtc_incrementa_contador ;0x0205 = inc contador teclado
cpi r16,20 ;20 * 2 = 40ms
brlo mtc6_inc_contando
;lê teclas r20 - coluna 3 =  + - x /:
lds r16,0x0203 ;0x0203 = tecla acionada = ta1
bst r20,0 ;b0 = +
bld r16,4 ;r16,b4 = +
bst r20,1 ;b1 = -
bld r16,5 ;r16,b5 = -
bst r20,2 ;b2 = x
bld r16,6 ;r16,b6 = x
bst r20,3 ;b3 = /
bld r16,7 ;r16,b7 = /
sts 0x0203,r16 ;0x0203 = tecla acionada = ta1

ldi r16,1 ;estado 1
sts 0x0201,r16 ;0x0201 = estado teclado
rjmp mtc6_fim
mtc6_inc_contando:

mtc6_fim:
rjmp mtc_fim



mtc7: ;C3_1
call mtc_entradas ;leitura entradas
cpi r20,0 ;0
brne mtc7_fim
ldi r16,0 ;estado 0 anterior
sts 0x0201,r16 ;0x0201 = estado teclado
mtc7_fim:
rjmp mtc_fim






mtc8: ;C4_0
call mtc_entradas ;leitura entradas
cpi r20,0 ;0
breq mtc8_leu_0
rjmp mtc8_leu_dif_0
mtc8_leu_0:
call mtc_zera_contador ;0x0205 = zera contador teclado
sbi portd,0
cbi portd,1 ;seta saída d0
cbi portd,2
cbi portd,3
cbi portd,4
ldi r16,0 ;0 = próximo estado
sts 0x0201,r16 ;0x0201 = estado teclado
rjmp mtc8_fim
mtc8_leu_dif_0:
call mtc_incrementa_contador ;0x0205 = inc contador teclado
cpi r16,20 ;20 * 2 = 40ms
brlo mtc8_inc_contando
;lê teclas r20 - coluna 4 =  +/-  <-  m  mr:
lds r16,0x0204 ;0x0204 = tecla acionada = ta2
bst r20,0 ;b0 = +/-
bld r16,0 ;r16,b0 = +/-
bst r20,1 ;b1 = <-
bld r16,1 ;r16,b1 = <-
bst r20,2 ;b2 = m
bld r16,2 ;r16,b2 = m
bst r20,3 ;b3 = mr
bld r16,3 ;r16,b3 = mr
sts 0x0204,r16 ;0x0204 = tecla acionada = ta2

ldi r16,1 ;estado 1
sts 0x0201,r16 ;0x0201 = estado teclado
rjmp mtc8_fim
mtc8_inc_contando:

mtc8_fim:
rjmp mtc_fim



mtc9: ;C4_1
call mtc_entradas ;leitura entradas
cpi r20,0 ;0
brne mtc9_fim
ldi r16,0 ;estado 0 anterior
sts 0x0201,r16 ;0x0201 = estado teclado
mtc9_fim:
rjmp mtc_fim



mtc_fim:
;----------------------------------------------------------------------------




















;----------------------------------------------------------------------------
;memória display
;   0x22e   0x022d        0x022c...0x020d
;   sinal   ponto            d31...d0

memoria_display:

lds r16,0x0207 ;0x0207 = twi estado
cpi r16,9 ;9 = fim
brne md_fim_alcance
clr r16 ;zera = início
sts 0x0207,r16 ;0x0207 = twi estado


rjmp ponte2
md_fim_alcance:
rjmp md_fim
ponte2:









;calcula ponto
lds r16,0x022d ;0x022d = ponto 31...00
cpi r16,32 ;32: sem ponto
brsh cp_sem_ponto
cpi r16,24 ;24: m1
brsh cp_m1
cpi r16,16 ;16: m2
brsh cp_m2
cpi r16,8 ;08: m3
brsh cp_m3
rjmp cp_m4 ;00: m4
cp_sem_ponto:
ldi r16,8 ;8: sem ponto
sts 0x0233,r16 ;0x0233 = ponto m1
sts 0x0234,r16 ;0x0234 = ponto m2
sts 0x0235,r16 ;0x0235 = ponto m3
sts 0x0236,r16 ;0x0236 = ponto m4
rjmp cp_fim
cp_m1:
subi r16,24 ;24:  31...24  =  07...00
sts 0x0233,r16 ;0x0233 = ponto m1
ldi r16,8 ;8: sem ponto
sts 0x0234,r16 ;0x0234 = ponto m2
sts 0x0235,r16 ;0x0235 = ponto m3
sts 0x0236,r16 ;0x0236 = ponto m4
rjmp cp_fim
cp_m2:
subi r16,16 ;16:  23...16  =  07...00
sts 0x0234,r16 ;0x0234 = ponto m2
ldi r16,8 ;8: sem ponto
sts 0x0233,r16 ;0x0233 = ponto m1
sts 0x0235,r16 ;0x0235 = ponto m3
sts 0x0236,r16 ;0x0236 = ponto m4
rjmp cp_fim
cp_m3:
subi r16,8 ;8:  15...08  =  07...00
sts 0x0235,r16 ;0x0235 = ponto m3
ldi r16,8 ;8: sem ponto
sts 0x0233,r16 ;0x0233 = ponto m1
sts 0x0234,r16 ;0x0234 = ponto m2
sts 0x0236,r16 ;0x0236 = ponto m4
rjmp cp_fim
cp_m4:
sts 0x0236,r16 ;0x0236 = ponto m4
ldi r16,8 ;8: sem ponto
sts 0x0233,r16 ;0x0233 = ponto m1
sts 0x0234,r16 ;0x0234 = ponto m2
sts 0x0235,r16 ;0x0235 = ponto m3
rjmp cp_fim
cp_fim:




lds r16,0x0231 ;0x0231 = memória display estado
cpi r16,0
breq md_0_alcance
cpi r16,1
breq md_1_alcance
cpi r16,2
breq md_2_alcance
cpi r16,3
breq md_3_alcance
cpi r16,4
breq md_4_alcance
cpi r16,5
breq md_5_alcance
cpi r16,6
breq md_6_alcance
cpi r16,7
breq md_7_alcance
cpi r16,8
breq md_8_alcance
cpi r16,9
breq md_9_alcance
cpi r16,10
breq md_10_alcance
cpi r16,11
breq md_11_alcance
cpi r16,12
breq md_12_alcance
cpi r16,13
breq md_13_alcance
cpi r16,14
breq md_14_alcance
cpi r16,15
breq md_15_alcance
cpi r16,16
breq md_16_alcance
cpi r16,17
breq md_17_alcance
cpi r16,18
breq md_18_alcance
cpi r16,19
breq md_19_alcance
cpi r16,20
breq md_20_alcance

rjmp ponte3

md_0_alcance:
rjmp md_0
md_1_alcance:
rjmp md_1
md_2_alcance:
rjmp md_2
md_3_alcance:
rjmp md_3
md_4_alcance:
rjmp md_4
md_5_alcance:
rjmp md_5
md_6_alcance:
rjmp md_6
md_7_alcance:
rjmp md_7
md_8_alcance:
rjmp md_8
md_9_alcance:
rjmp md_9
md_10_alcance:
rjmp md_10
md_11_alcance:
rjmp md_11
md_12_alcance:
rjmp md_12
md_13_alcance:
rjmp md_13
md_14_alcance:
rjmp md_14
md_15_alcance:
rjmp md_15
md_16_alcance:
rjmp md_16
md_17_alcance:
rjmp md_17
md_18_alcance:
rjmp md_18
md_19_alcance:
rjmp md_19
md_20_alcance:
rjmp md_20

ponte3:

cpi r16,21
breq md_21_alcance
cpi r16,22
breq md_22_alcance
cpi r16,23
breq md_23_alcance
cpi r16,24
breq md_24_alcance
cpi r16,25
breq md_25_alcance
cpi r16,26
breq md_26_alcance
cpi r16,27
breq md_27_alcance
cpi r16,28
breq md_28_alcance
cpi r16,29
breq md_29_alcance
cpi r16,30
breq md_30_alcance
cpi r16,31
breq md_31_alcance
cpi r16,32
breq md_32_alcance
cpi r16,33
breq md_33_alcance
cpi r16,34
breq md_34_alcance
cpi r16,35
breq md_35_alcance
cpi r16,36
breq md_36_alcance
cpi r16,37
breq md_37_alcance
cpi r16,38
breq md_38_alcance
cpi r16,39
breq md_39_alcance
cpi r16,40
breq md_40_alcance



md_21_alcance:
rjmp md_21
md_22_alcance:
rjmp md_22
md_23_alcance:
rjmp md_23
md_24_alcance:
rjmp md_24
md_25_alcance:
rjmp md_25
md_26_alcance:
rjmp md_26
md_27_alcance:
rjmp md_27
md_28_alcance:
rjmp md_28
md_29_alcance:
rjmp md_29
md_30_alcance:
rjmp md_30
md_31_alcance:
rjmp md_31
md_32_alcance:
rjmp md_32
md_33_alcance:
rjmp md_33
md_34_alcance:
rjmp md_34
md_35_alcance:
rjmp md_35
md_36_alcance:
rjmp md_36
md_37_alcance:
rjmp md_37
md_38_alcance:
rjmp md_38
md_39_alcance:
rjmp md_39
md_40_alcance:
rjmp md_40








md_0:
ldi r16,0x02
sts 0x020a,r16 ;endereço
ldi r16,0x55
sts 0x0208,r16 ;byte
ldi r16,1
sts 0x0231,r16 ;estado
rjmp md_fim
md_1:
ldi r16,0x02
sts 0x020a,r16 ;endereço
lds r16,0x0225
sts 0x0208,r16 ;byte
ldi r16,2
sts 0x0231,r16 ;estado
rjmp md_fim
md_2:
ldi r16,0x02
sts 0x020a,r16 ;endereço
lds r16,0x0226
sts 0x0208,r16 ;byte
ldi r16,3
sts 0x0231,r16 ;estado
rjmp md_fim
md_3:
ldi r16,0x02
sts 0x020a,r16 ;endereço
lds r16,0x0227
sts 0x0208,r16 ;byte
ldi r16,4
sts 0x0231,r16 ;estado
rjmp md_fim
md_4:
ldi r16,0x02
sts 0x020a,r16 ;endereço
lds r16,0x0228
sts 0x0208,r16 ;byte
ldi r16,5
sts 0x0231,r16 ;estado
rjmp md_fim
md_5:
ldi r16,0x02
sts 0x020a,r16 ;endereço
lds r16,0x0229
sts 0x0208,r16 ;byte
ldi r16,6
sts 0x0231,r16 ;estado
rjmp md_fim
md_6:
ldi r16,0x02
sts 0x020a,r16 ;endereço
lds r16,0x022a
sts 0x0208,r16 ;byte
ldi r16,7
sts 0x0231,r16 ;estado
rjmp md_fim
md_7:
ldi r16,0x02
sts 0x020a,r16 ;endereço
lds r16,0x022b
sts 0x0208,r16 ;byte
ldi r16,8
sts 0x0231,r16 ;estado
rjmp md_fim
md_8:
ldi r16,0x02
sts 0x020a,r16 ;endereço
lds r16,0x022c
sts 0x0208,r16 ;byte
ldi r16,9
sts 0x0231,r16 ;estado
rjmp md_fim
md_9:
ldi r16,0x02
sts 0x020a,r16 ;endereço
lds r16,0x0233 ;0x0233 = ponto m1
sts 0x0208,r16 ;byte
ldi r16,10
sts 0x0231,r16 ;estado
rjmp md_fim


md_10:
ldi r16,0x04
sts 0x020a,r16 ;endereço
ldi r16,0x55
sts 0x0208,r16 ;byte
ldi r16,11
sts 0x0231,r16 ;estado
rjmp md_fim
md_11:
ldi r16,0x04
sts 0x020a,r16 ;endereço
lds r16,0x021d
sts 0x0208,r16 ;byte
ldi r16,12
sts 0x0231,r16 ;estado
rjmp md_fim
md_12:
ldi r16,0x04
sts 0x020a,r16 ;endereço
lds r16,0x021e
sts 0x0208,r16 ;byte
ldi r16,13
sts 0x0231,r16 ;estado
rjmp md_fim
md_13:
ldi r16,0x04
sts 0x020a,r16 ;endereço
lds r16,0x021f
sts 0x0208,r16 ;byte
ldi r16,14
sts 0x0231,r16 ;estado
rjmp md_fim
md_14:
ldi r16,0x04
sts 0x020a,r16 ;endereço
lds r16,0x0220
sts 0x0208,r16 ;byte
ldi r16,15
sts 0x0231,r16 ;estado
rjmp md_fim
md_15:
ldi r16,0x04
sts 0x020a,r16 ;endereço
lds r16,0x0221
sts 0x0208,r16 ;byte
ldi r16,16
sts 0x0231,r16 ;estado
rjmp md_fim
md_16:
ldi r16,0x04
sts 0x020a,r16 ;endereço
lds r16,0x0222
sts 0x0208,r16 ;byte
ldi r16,17
sts 0x0231,r16 ;estado
rjmp md_fim
md_17:
ldi r16,0x04
sts 0x020a,r16 ;endereço
lds r16,0x0223
sts 0x0208,r16 ;byte
ldi r16,18
sts 0x0231,r16 ;estado
rjmp md_fim
md_18:
ldi r16,0x04
sts 0x020a,r16 ;endereço
lds r16,0x0224
sts 0x0208,r16 ;byte
ldi r16,19
sts 0x0231,r16 ;estado
rjmp md_fim
md_19:
ldi r16,0x04
sts 0x020a,r16 ;endereço
lds r16,0x0234 ;0x0234 = ponto m2
sts 0x0208,r16 ;byte
ldi r16,20
sts 0x0231,r16 ;estado
rjmp md_fim


md_20:
ldi r16,0x06
sts 0x020a,r16 ;endereço
ldi r16,0x55
sts 0x0208,r16 ;byte
ldi r16,21
sts 0x0231,r16 ;estado
rjmp md_fim
md_21:
ldi r16,0x06
sts 0x020a,r16 ;endereço
lds r16,0x0215
sts 0x0208,r16 ;byte
ldi r16,22
sts 0x0231,r16 ;estado
rjmp md_fim
md_22:
ldi r16,0x06
sts 0x020a,r16 ;endereço
lds r16,0x0216
sts 0x0208,r16 ;byte
ldi r16,23
sts 0x0231,r16 ;estado
rjmp md_fim
md_23:
ldi r16,0x06
sts 0x020a,r16 ;endereço
lds r16,0x0217
sts 0x0208,r16 ;byte
ldi r16,24
sts 0x0231,r16 ;estado
rjmp md_fim
md_24:
ldi r16,0x06
sts 0x020a,r16 ;endereço
lds r16,0x0218
sts 0x0208,r16 ;byte
ldi r16,25
sts 0x0231,r16 ;estado
rjmp md_fim
md_25:
ldi r16,0x06
sts 0x020a,r16 ;endereço
lds r16,0x0219
sts 0x0208,r16 ;byte
ldi r16,26
sts 0x0231,r16 ;estado
rjmp md_fim
md_26:
ldi r16,0x06
sts 0x020a,r16 ;endereço
lds r16,0x021a
sts 0x0208,r16 ;byte
ldi r16,27
sts 0x0231,r16 ;estado
rjmp md_fim
md_27:
ldi r16,0x06
sts 0x020a,r16 ;endereço
lds r16,0x021b
sts 0x0208,r16 ;byte
ldi r16,28
sts 0x0231,r16 ;estado
rjmp md_fim
md_28:
ldi r16,0x06
sts 0x020a,r16 ;endereço
lds r16,0x021c
sts 0x0208,r16 ;byte
ldi r16,29
sts 0x0231,r16 ;estado
rjmp md_fim
md_29:
ldi r16,0x06
sts 0x020a,r16 ;endereço
lds r16,0x0235 ;0x0235 = ponto m3
sts 0x0208,r16 ;byte
ldi r16,30
sts 0x0231,r16 ;estado
rjmp md_fim


md_30:
ldi r16,0x08
sts 0x020a,r16 ;endereço
ldi r16,0x55
sts 0x0208,r16 ;byte
ldi r16,31
sts 0x0231,r16 ;estado
rjmp md_fim
md_31:
ldi r16,0x08
sts 0x020a,r16 ;endereço
lds r16,0x020d
sts 0x0208,r16 ;byte
ldi r16,32
sts 0x0231,r16 ;estado
rjmp md_fim
md_32:
ldi r16,0x08
sts 0x020a,r16 ;endereço
lds r16,0x020e
sts 0x0208,r16 ;byte
ldi r16,33
sts 0x0231,r16 ;estado
rjmp md_fim
md_33:
ldi r16,0x08
sts 0x020a,r16 ;endereço
lds r16,0x020f
sts 0x0208,r16 ;byte
ldi r16,34
sts 0x0231,r16 ;estado
rjmp md_fim
md_34:
ldi r16,0x08
sts 0x020a,r16 ;endereço
lds r16,0x0210
sts 0x0208,r16 ;byte
ldi r16,35
sts 0x0231,r16 ;estado
rjmp md_fim
md_35:
ldi r16,0x08
sts 0x020a,r16 ;endereço
lds r16,0x0211
sts 0x0208,r16 ;byte
ldi r16,36
sts 0x0231,r16 ;estado
rjmp md_fim
md_36:
ldi r16,0x08
sts 0x020a,r16 ;endereço
lds r16,0x0212
sts 0x0208,r16 ;byte
ldi r16,37
sts 0x0231,r16 ;estado
rjmp md_fim
md_37:
ldi r16,0x08
sts 0x020a,r16 ;endereço
lds r16,0x0213
sts 0x0208,r16 ;byte
ldi r16,38
sts 0x0231,r16 ;estado
rjmp md_fim
md_38:
ldi r16,0x08
sts 0x020a,r16 ;endereço
lds r16,0x0214
sts 0x0208,r16 ;byte
ldi r16,39
sts 0x0231,r16 ;estado
rjmp md_fim
md_39:
ldi r16,0x08
sts 0x020a,r16 ;endereço
lds r16,0x0236 ;0x0236 = ponto m4
sts 0x0208,r16 ;byte
ldi r16,40
sts 0x0231,r16 ;estado
rjmp md_fim


md_40:
ldi r16,9 ;9 = twi fim
sts 0x0207,r16 ;0x0207 = twi estado
clr r16
sts 0x0231,r16 ;0x0231 = transmite byte estado = início
rjmp memoria_display


md_fim:
;----------------------------------------------------------------------------











;----------------------------------------------------------------------------
;Transmite byte twi 0x0208 = byte   0x020a = endereço


;contador twi
lds r16,0x0206 ;0x0206 = zera contador twi
cpi r16,1 ;1 * 128us
brsh c_twi_contou
rjmp c_twi_contando
c_twi_contou:
clr r16 ;zera contador
sts 0x0206,r16 ;0x0206





;máquina de estados
lds r16,0x0207 ;0x0207 = estado twi
cpi r16,0
breq tb_twi_0_alcance
cpi r16,1
breq tb_twi_1_alcance
cpi r16,2
breq tb_twi_2_alcance
cpi r16,3
breq tb_twi_3_alcance
cpi r16,4
breq tb_twi_4_alcance
cpi r16,5
breq tb_twi_5_alcance
cpi r16,6
breq tb_twi_6_alcance
cpi r16,7
breq tb_twi_7_alcance
cpi r16,8
breq tb_twi_8_alcance
cpi r16,9
breq tb_twi_9_alcance


tb_twi_0_alcance:
rjmp tb_twi_0
tb_twi_1_alcance:
rjmp tb_twi_1
tb_twi_2_alcance:
rjmp tb_twi_2
tb_twi_3_alcance:
rjmp tb_twi_3
tb_twi_4_alcance:
rjmp tb_twi_4
tb_twi_5_alcance:
rjmp tb_twi_5
tb_twi_6_alcance:
rjmp tb_twi_6
tb_twi_7_alcance:
rjmp tb_twi_7
tb_twi_8_alcance:
rjmp tb_twi_8
tb_twi_9_alcance:
rjmp tb_twi_9



tb_twi_0: ;início
ldi r16,1 ;1 = próximo estado
sts 0x0207,r16 ;0x0207 = estado
rjmp tb_twi_fim



tb_twi_1: ;etapa 1 = start
ldi r16,0xe4 ;0xe4 = start
sts twcr,r16
ldi r16,2 ;2 = próximo estado
sts 0x0207,r16 ;0x0207 = estado
rjmp tb_twi_1_fim
tb_twi_1_fim:
rjmp tb_twi_fim



tb_twi_2: ;etapa 2 = espera twint
lds r16,twcr ;pronto
sbrs r16,twint
rjmp tb_twi_2_fim
ldi r16,3 ;3 = próximo estado
sts 0x0207,r16 ;0x0207 = estado
rjmp tb_twi_2_fim
tb_twi_2_fim:
rjmp tb_twi_fim



tb_twi_3: ;etapa 3 = sla+w
lds r16,twsr ;código
andi r16,0xf8 ;0xf8 = b2 b1 b0 = 0
cpi r16,0x08 ;0x08 = start transmitido
brne tb_erro
lds r16,0x020a ;0x020a = endereço twi = endereço sla+w
sts twdr,r16
ldi r16,0xc4 ;0xc4 = twint transmite
sts twcr,r16
ldi r16,4 ;4 = próximo estado
sts 0x0207,r16 ;0x0207 = estado
rjmp tb_twi_3_fim
tb_twi_3_fim:
rjmp tb_twi_fim



tb_twi_4: ;etapa 4 = espera twint
lds r16,twcr ;pronto
sbrs r16,twint
rjmp tb_twi_4_fim
ldi r16,5 ;5 = próximo estado
sts 0x0207,r16 ;0x0207 = estado
rjmp tb_twi_4_fim
tb_twi_4_fim:
rjmp tb_twi_fim



tb_twi_5: ;etapa 5 = dado
lds r16,twsr ;código
andi r16,0xf8 ;0xf8 = b2 b1 b0 = 0
cpi r16,0x18 ;0x18 = sla+w transmitido
brne tb_erro
lds r16,0x0208 ;0x0208 = byte twi
sts twdr,r16 ;byte transmitido
ldi r16,0xc4 ;0xc4 = twint transmite
sts twcr,r16
ldi r16,6 ;6 = próximo estado
sts 0x0207,r16 ;0x0207 = estado
rjmp tb_twi_5_fim
tb_twi_5_fim:
rjmp tb_twi_fim



tb_twi_6: ;etapa 6 = espera twint
lds r16,twcr ;pronto
sbrs r16,twint
rjmp tb_twi_6_fim
ldi r16,7 ;7 = próximo estado
sts 0x0207,r16 ;0x0207 = estado
rjmp tb_twi_6_fim
tb_twi_6_fim:
rjmp tb_twi_fim



tb_twi_7: ;etapa 7 = stop
lds r16,twsr ;código
andi r16,0xf8 ;0xf8 = b2 b1 b0 = 0
cpi r16,0x28 ;0x28 = byte transmitido
brne tb_erro
ldi r16,0xd4 ;0xd4 = stop
sts twcr,r16
ldi r16,8 ;8 = próximo estado
sts 0x0207,r16 ;0x0207 = estado
rjmp tb_twi_7_fim
tb_twi_7_fim:
rjmp tb_twi_fim



tb_erro:
ldi r16,8 ;8: desliga, fim
sts 0x0207,r16 ;0x0207 = estado
rjmp tb_twi_fim



tb_twi_8: ;desliga twi
;desliga twi
lds r16,twcr
andi r16,0xfb ;0xfb = zera twen = desliga twi
sts twcr,r16
ldi r16,9 ;9 = próximo estado
sts 0x0207,r16 ;0x0207 = estado
rjmp tb_twi_8_fim
tb_twi_8_fim:
rjmp tb_twi_fim



tb_twi_9: ;fim, sem atividade
rjmp tb_twi_fim



tb_twi_fim:
c_twi_contando:
;----------------------------------------------------------------------------










;----------------------------------------------------------------------------
;sinal menos
lds r16,0x022e ;0x022e = sinal menos
cpi r16,0
brne sinal_ligado
rjmp sinal_desligado
sinal_ligado:
sbi portc,1 ;c1 = sinal menos ligado
rjmp sinal_fim
sinal_desligado:
cbi portc,1 ;c1 = sinal menos desligado
sinal_fim:
;----------------------------------------------------------------------------










;principal:
lds r16,0x029d ;0x029d = principal estado
cpi r16,0
breq pr_0_alcance
cpi r16,1
breq pr_1_alcance
cpi r16,2
breq pr_2_alcance
cpi r16,3
breq pr_3_alcance
cpi r16,4
breq pr_4_alcance
cpi r16,5
breq pr_5_alcance
cpi r16,6
breq pr_6_alcance
cpi r16,7
breq pr_7_alcance
cpi r16,8
breq pr_8_alcance
cpi r16,9
breq pr_9_alcance
cpi r16,10
breq pr_10_alcance
cpi r16,11
breq pr_11_alcance
cpi r16,12
breq pr_12_alcance
cpi r16,13
breq pr_13_alcance
cpi r16,14
breq pr_14_alcance
cpi r16,15
breq pr_15_alcance
cpi r16,16
breq pr_16_alcance
rjmp pr_ponte_1

pr_0_alcance:
rjmp pr_0
pr_1_alcance:
rjmp pr_1
pr_2_alcance:
rjmp pr_2
pr_3_alcance:
rjmp pr_3
pr_4_alcance:
rjmp pr_4
pr_5_alcance:
rjmp pr_5
pr_6_alcance:
rjmp pr_6
pr_7_alcance:
rjmp pr_7
pr_8_alcance:
rjmp pr_8
pr_9_alcance:
rjmp pr_9
pr_10_alcance:
rjmp pr_10
pr_11_alcance:
rjmp pr_11
pr_12_alcance:
rjmp pr_12
pr_13_alcance:
rjmp pr_13
pr_14_alcance:
rjmp pr_14
pr_15_alcance:
rjmp pr_15
pr_16_alcance:
rjmp pr_16

pr_ponte_1:
cpi r16,17
breq pr_17_alcance
cpi r16,18
breq pr_18_alcance
cpi r16,19
breq pr_19_alcance
cpi r16,20
breq pr_20_alcance
cpi r16,21
breq pr_21_alcance
cpi r16,22
breq pr_22_alcance
cpi r16,23
breq pr_23_alcance
cpi r16,24
breq pr_24_alcance
cpi r16,25
breq pr_25_alcance
cpi r16,26
breq pr_26_alcance
cpi r16,27
breq pr_27_alcance
cpi r16,28
breq pr_28_alcance
cpi r16,29
breq pr_29_alcance
cpi r16,30
breq pr_30_alcance
cpi r16,31
breq pr_31_alcance
cpi r16,32
breq pr_32_alcance
cpi r16,33
breq pr_33_alcance

pr_17_alcance:
rjmp pr_17
pr_18_alcance:
rjmp pr_18
pr_19_alcance:
rjmp pr_19
pr_20_alcance:
rjmp pr_20
pr_21_alcance:
rjmp pr_21
pr_22_alcance:
rjmp pr_22
pr_23_alcance:
rjmp pr_23
pr_24_alcance:
rjmp pr_24
pr_25_alcance:
rjmp pr_25
pr_26_alcance:
rjmp pr_26
pr_27_alcance:
rjmp pr_27
pr_28_alcance:
rjmp pr_28
pr_29_alcance:
rjmp pr_29
pr_30_alcance:
rjmp pr_30
pr_31_alcance:
rjmp pr_31
pr_32_alcance:
rjmp pr_32
pr_33_alcance:
rjmp pr_33





pr_0: ;início
ldi r16,1 ;1: próximo estado
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_1: ;reset ed, apagado zerado
ldi r16,0 ;0 = reset
sts 0x02a1,r16 ;0x02a1 = escreve display estado
rcall apaga_escreve_display
clr r16 ;apaga sinal
sts 0x022e,r16 ;0x022e = sinal
ldi r16,2 ;2: próximo estado
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_2: ;número a
lds r16,0x0204 ;0x0204 = ta2
sbrs r16,2 ;2: b2 = m
rjmp pr_2_m_nao
cbr r16,0x04 ;0x04: zera b2
sts 0x0204,r16
ldi r16,5 ;5: estado 5
sts 0x029d,r16 ;0x029d = estado
rjmp pr_2_fim
pr_2_m_nao:
lds r16,0x0204 ;0x0204 = ta2
sbrs r16,3 ;3: b3 = mr
rjmp pr_2_mr_nao
cbr r16,0x08 ;0x08: zera b3
sts 0x0204,r16
ldi r16,6 ;6: estado 6
sts 0x029d,r16 ;0x029d = estado
rjmp pr_2_fim
pr_2_mr_nao:
rcall p_mm ;+ - x /
cpi r16,0 ;0: não
breq pr_2_fim
ldi r16,10 ;10: estado 10
sts 0x029d,r16 ;0x029d = estado
pr_2_fim:
;zera bits: =
lds r16,0x0203 ;0x0203: ta1, b3: =
cbr r16,0x08 ;0x08: zera b3
sts 0x0203,r16
rjmp pr_fim



pr_3: ;carrega m
;m -> md
ldi r31,0x02 ;0x027b: memória início = z
ldi r30,0x7b
ldi r29,0x02 ;0x020d: memória display início = y
ldi r28,0x0d
pr_3_carregando:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0x9d ;0x9d: depois fim
brne pr_3_carregando
ldi r16,2 ;2: estado 2
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_4: ;espera c
lds r16,0x02a3 ;0x02a3 = principal contador 2
cpi r16,5 ;5 * 32ms =160ms
brsh pr_4_contou
rjmp pr_4_fim
pr_4_contou:
clr r16 ;zera contador
sts 0x02a2,r16 ;0x02a2 = principal contador
sts 0x02a3,r16 ;0x02a3 = principal contador 2
ldi r16,3 ;3: estado 3
sts 0x029d,r16 ;0x029d = estado
rjmp pr_4_fim
pr_4_fim:
rjmp pr_fim



pr_5: ;guarda m, apaga
;md -> m
ldi r31,0x02 ;0x027b: memória início = z
ldi r30,0x7b
ldi r29,0x02 ;0x020d: memória display início = y
ldi r28,0x0d
pr_5_carregando:
ld r16,y
st z,r16
inc r30
inc r28
cpi r30,0x9d ;0x9d: depois fim
brne pr_5_carregando
rcall apaga_escreve_display
ldi r16,32 ;32 = ponto apagado
sts 0x022d,r16 ;0x022d: ponto memoria display
clr r16 ;sinal apagado
sts 0x022e,r16 ;0x022e: sinal memoria display
clr r16 ;zera contador
sts 0x02a2,r16 ;0x02a2 = contador
sts 0x02a3,r16 ;0x02a3 = contador 2
ldi r16,4 ;4: estado 4
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_6: ;apaga
rcall apaga_escreve_display
ldi r16,32 ;32 = ponto apagado
sts 0x022d,r16 ;0x022d: ponto memoria display
clr r16 ;sinal apagado
sts 0x022e,r16 ;0x022e: sinal memoria display
clr r16 ;zera contador
sts 0x02a2,r16 ;0x02a2 = contador
sts 0x02a3,r16 ;0x02a3 = contador 2
ldi r16,7 ;7 = estado 7
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_7: ;espera c
lds r16,0x02a3 ;0x02a3 = principal contador 2
cpi r16,5 ;5 * 32ms =160ms
brsh pr_7_contou
rjmp pr_7_fim
pr_7_contou:
clr r16 ;zera contador
sts 0x02a2,r16 ;0x02a2 = principal contador
sts 0x02a3,r16 ;0x02a3 = principal contador 2
ldi r16,8 ;8: estado 8
sts 0x029d,r16 ;0x029d = estado
rjmp pr_7_fim
pr_7_fim:
rjmp pr_fim



pr_8: ;carrega m
;m -> md
ldi r31,0x02 ;0x027b: memória início = z
ldi r30,0x7b
ldi r29,0x02 ;0x020d: memória display início = y
ldi r28,0x0d
pr_8_carregando:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0x9d ;0x9d: depois fim
brne pr_8_carregando
ldi r16,9 ;9: estado 9
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_9: ;memória
rcall p_09 ;verifica: 0...9  .   <-
cpi r16,0 ;0: não
breq pr_9_proximo
ldi r16,1 ;1: estado 1
sts 0x029d,r16 ;0x029d = estado
rjmp pr_9_fim
pr_9_proximo:
rcall p_mm ;verifica:  + - x /
cpi r16,0 ;0: não
breq pr_9_fim
ldi r16,10 ;10: estado 10
sts 0x029d,r16 ;0x029d = estado
rjmp pr_9_fim
pr_9_fim:
;zera bits: m mr =
lds r16,0x0203 ;0x0203: ta1, b3: =
cbr r16,0x08 ;0x08: zera b3
sts 0x0203,r16
lds r16,0x0204 ;0x0204: ta2,   b2:m   b3:mr
cbr r16,0x0c ;0x0c: zera b2 b3
sts 0x0204,r16
rjmp pr_fim



pr_10: ;guarda número a, apaga
;memória display -> número a:
ldi r31,0x02 ;0x020d: memória display início = z
ldi r30,0x0d
ldi r29,0x02 ;0x0237: número a início = y
ldi r28,0x37
pr_10_carregando:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0x2f ;0x2f: depois fim
brne pr_10_carregando
rcall apaga_escreve_display
ldi r16,32 ;32 = ponto apagado
sts 0x022d,r16 ;0x022d: ponto memoria display
clr r16 ;sinal apagado
sts 0x022e,r16 ;0x022e: sinal memoria display
clr r16 ;zera contador
sts 0x02a2,r16 ;0x02a2 = contador
sts 0x02a3,r16 ;0x02a3 = contador 2
ldi r16,11 ;11: estado 11
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_11: ;espera c
lds r16,0x02a3 ;0x02a3 = principal contador 2
cpi r16,5 ;5 * 32ms =160ms
brsh pr_11_contou
rjmp pr_11_fim
pr_11_contou:
clr r16 ;zera contador
sts 0x02a2,r16 ;0x02a2 = principal contador
sts 0x02a3,r16 ;0x02a3 = principal contador 2
ldi r16,12 ;12: estado 12
sts 0x029d,r16 ;0x029d = estado
rjmp pr_11_fim
pr_11_fim:
rjmp pr_fim



pr_12: ;carrega número a
;na -> md
ldi r31,0x02 ;0x0237: número a início = z
ldi r30,0x37
ldi r29,0x02 ;0x020d: memória display início = y
ldi r28,0x0d
pr_12_carregando:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0x59 ;0x59: depois fim
brne pr_12_carregando
ldi r16,13 ;13: estado 13
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_13: ;outro operador
rcall p_09 ;verifica: 0...9  .   <-
cpi r16,0 ;0: não
breq pr_13_09_nao
ldi r16,14 ;14: estado 14
sts 0x029d,r16 ;0x029d = estado
rjmp pr_13_fim
pr_13_09_nao:
rcall p_mm ;verifica:  + - x /
cpi r16,0 ;0: não
breq pr_13_mm_nao
ldi r16,10 ;10: estado 10
sts 0x029d,r16 ;0x029d = estado
rjmp pr_13_fim
pr_13_mm_nao:
;mr
lds r16,0x0204 ;0x0204 = ta2
sbrs r16,3 ;b3 = mr
rjmp pr_13_mr_nao
cbr r16,0x08 ;0x08 = zera b3
sts 0x0204,r16
ldi r16,19 ;19: estado 19
sts 0x029d,r16 ;0x029d = estado
rjmp pr_13_fim
pr_13_mr_nao:
;m
lds r16,0x0204 ;0x0204 = ta2
sbrs r16,2 ;b2 = m
rjmp pr_13_m_nao
cbr r16,0x04 ;0x04 = zera b2
sts 0x0204,r16
ldi r16,32 ;32: estado 32
sts 0x029d,r16 ;0x029d = estado
rjmp pr_13_fim
pr_13_m_nao:
pr_13_fim:
;zera bits: m  =
lds r16,0x0203 ;0x0203: ta1, b3: =
cbr r16,0x08 ;0x08: zera b3
sts 0x0203,r16
rjmp pr_fim



pr_14: ;reset ed, apagado zerado
ldi r16,0 ;0 = reset
sts 0x02a1,r16 ;0x02a1 = escreve display estado
rcall apaga_escreve_display
clr r16 ;apaga sinal
sts 0x022e,r16 ;0x022e = sinal
ldi r16,15 ;15: próximo estado
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_15: ;número b
lds r16,0x0204 ;0x0204 = ta2
sbrs r16,2 ;2: b2 = m
rjmp pr_15_m_nao
cbr r16,0x04 ;0x04: zera b2
sts 0x0204,r16
ldi r16,18 ;18: estado 18
sts 0x029d,r16 ;0x029d = estado
rjmp pr_15_fim
pr_15_m_nao:
lds r16,0x0204 ;0x0204 = ta2
sbrs r16,3 ;3: b3 = mr
rjmp pr_15_mr_nao
cbr r16,0x08 ;0x08: zera b3
sts 0x0204,r16
ldi r16,19 ;19: estado 19
sts 0x029d,r16 ;0x029d = estado
rjmp pr_15_fim
pr_15_mr_nao:
lds r16,0x0203 ;0x0203 = ta1, b3: =
sbrs r16,3 ;3: b3
rjmp pr_15_igual_nao
cbr r16,0x08 ;0x08: zera b3
sts 0x0203,r16
ldi r16,23 ;23: estado 23
sts 0x029d,r16 ;0x029d = estado
pr_15_igual_nao:
pr_15_fim:
;zera bits: / x - +
lds r16,0x0203 ;0x0203: ta1, b7:/ b6:x b5:- b4:+
cbr r16,0xf0 ;0xf0: zera b7 b6 b5 b4
sts 0x0203,r16
rjmp pr_fim



pr_16: ;carrega m
;m -> md
ldi r31,0x02 ;0x027b: memória início = z
ldi r30,0x7b
ldi r29,0x02 ;0x020d: memória display início = y
ldi r28,0x0d
pr_16_carregando:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0x9d ;0x9d: depois fim
brne pr_16_carregando
ldi r16,15 ;15: estado 15
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_17: ;espera c
lds r16,0x02a3 ;0x02a3 = principal contador 2
cpi r16,5 ;5 * 32ms =160ms
brsh pr_17_contou
rjmp pr_17_fim
pr_17_contou:
clr r16 ;zera contador
sts 0x02a2,r16 ;0x02a2 = principal contador
sts 0x02a3,r16 ;0x02a3 = principal contador 2
ldi r16,16 ;16: estado 16
sts 0x029d,r16 ;0x029d = estado
rjmp pr_17_fim
pr_17_fim:
rjmp pr_fim



pr_18: ;guarda m, apaga
;md -> m
ldi r31,0x02 ;0x027b: memória início = z
ldi r30,0x7b
ldi r29,0x02 ;0x020d: memória display início = y
ldi r28,0x0d
pr_18_carregando:
ld r16,y
st z,r16
inc r30
inc r28
cpi r30,0x9d ;0x9d: depois fim
brne pr_18_carregando
rcall apaga_escreve_display
ldi r16,32 ;32 = ponto apagado
sts 0x022d,r16 ;0x022d: ponto memoria display
clr r16 ;sinal apagado
sts 0x022e,r16 ;0x022e: sinal memoria display
clr r16 ;zera contador
sts 0x02a2,r16 ;0x02a2 = contador
sts 0x02a3,r16 ;0x02a3 = contador 2
ldi r16,17 ;17: estado 17
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_19: ;apaga
rcall apaga_escreve_display
ldi r16,32 ;32 = ponto apagado
sts 0x022d,r16 ;0x022d: ponto memoria display
clr r16 ;sinal apagado
sts 0x022e,r16 ;0x022e: sinal memoria display
clr r16 ;zera contador
sts 0x02a2,r16 ;0x02a2 = contador
sts 0x02a3,r16 ;0x02a3 = contador 2
ldi r16,20 ;20 = estado 20
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_20: ;espera c
lds r16,0x02a3 ;0x02a3 = principal contador 2
cpi r16,5 ;5 * 32ms =160ms
brsh pr_20_contou
rjmp pr_20_fim
pr_20_contou:
clr r16 ;zera contador
sts 0x02a2,r16 ;0x02a2 = principal contador
sts 0x02a3,r16 ;0x02a3 = principal contador 2
ldi r16,21 ;21: estado 21
sts 0x029d,r16 ;0x029d = estado
rjmp pr_20_fim
pr_20_fim:
rjmp pr_fim



pr_21: ;carrega m
;m -> md
ldi r31,0x02 ;0x027b: memória início = z
ldi r30,0x7b
ldi r29,0x02 ;0x020d: memória display início = y
ldi r28,0x0d
pr_21_carregando:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0x9d ;0x9d: depois fim
brne pr_21_carregando
ldi r16,22 ;22: estado 22
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_22: ;memória
rcall p_09 ;verifica: 0...9  .   <-
cpi r16,0 ;0: não
breq pr_22_proximo
ldi r16,14 ;14: estado 14
sts 0x029d,r16 ;0x029d = estado
rjmp pr_22_fim
pr_22_proximo:
lds r16,0x0203 ;0x0203 = ta1, b3: =
sbrs r16,3 ;3: b3
rjmp pr_22_fim
cbr r16,0x08 ;0x08: zera b3
sts 0x0203,r16
ldi r16,23 ;23: estado 23
sts 0x029d,r16 ;0x029d = estado
pr_22_fim:
;zera bits: / x - +
lds r16,0x0203 ;0x0203: ta1, b7:/ b6:x b5:- b4:+
cbr r16,0xf0 ;0xf0: zera b7 b6 b5 b4
sts 0x0203,r16
lds r16,0x0204 ;0x0204: ta2,   b2:m   b3:mr
cbr r16,0x0c ;0x0c: zera b2 b3
sts 0x0204,r16
rjmp pr_fim



pr_23: ;guarda número b, apaga
;memória display -> número b:
ldi r31,0x02 ;0x020d: memória display início = z
ldi r30,0x0d
ldi r29,0x02 ;0x0259: número b início = y
ldi r28,0x59
pr_23_carregando:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0x2f ;0x2f: depois fim
brne pr_23_carregando
rcall apaga_escreve_display
ldi r16,32 ;32 = ponto apagado
sts 0x022d,r16 ;0x022d: ponto memoria display
clr r16 ;sinal apagado
sts 0x022e,r16 ;0x022e: sinal memoria display
clr r16 ;zera contador
sts 0x02a2,r16 ;0x02a2 = contador
sts 0x02a3,r16 ;0x02a3 = contador 2
ldi r16,24 ;24: estado 24
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_24: ;zera
rcall na_apagados_zerados ;zera número a
rcall nb_apagados_zerados ;zera número b
ldi r16,33 ;33 = estado 33
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_25: ;resultado
lds r16,0x0204 ;0x0204 = ta2
sbrs r16,2 ;2: b2 = m
rjmp pr_25_m_nao
cbr r16,0x04 ;0x04: zera b2
sts 0x0204,r16
ldi r16,28 ;28: estado 28
sts 0x029d,r16 ;0x029d = estado
rjmp pr_25_fim
pr_25_m_nao:
lds r16,0x0204 ;0x0204 = ta2
sbrs r16,3 ;3: b3 = mr
rjmp pr_25_mr_nao
cbr r16,0x08 ;0x08: zera b3
sts 0x0204,r16
ldi r16,6 ;6: estado 6
sts 0x029d,r16 ;0x029d = estado
rjmp pr_25_fim
pr_25_mr_nao:
rcall p_mm ;zera: + - x /
cpi r16,0
breq pr_25_mm_nao
ldi r16,10 ;10: estado 10
sts 0x029d,r16 ;0x029d = estado
rjmp pr_25_fim
pr_25_mm_nao:
rcall p_09 ;verifica: 0...9  .   <-
cpi r16,0 ;0: não
breq pr_25_09_nao
ldi r16,1 ;1: estado 1
sts 0x029d,r16 ;0x029d = estado
rjmp pr_25_fim
pr_25_09_nao:
pr_25_fim:
;zera bits: =
lds r16,0x0203 ;0x0203: ta1, b3: =
cbr r16,0x08 ;0x08: zera b3
sts 0x0203,r16
rjmp pr_fim



pr_26: ;carrega m
;m -> md
ldi r31,0x02 ;0x027b: memória início = z
ldi r30,0x7b
ldi r29,0x02 ;0x020d: memória display início = y
ldi r28,0x0d
pr_26_carregando:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0x9d ;0x9d: depois fim
brne pr_26_carregando
ldi r16,25 ;25: estado 25
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_27: ;espera c
lds r16,0x02a3 ;0x02a3 = principal contador 2
cpi r16,5 ;5 * 32ms =160ms
brsh pr_27_contou
rjmp pr_27_fim
pr_27_contou:
clr r16 ;zera contador
sts 0x02a2,r16 ;0x02a2 = principal contador
sts 0x02a3,r16 ;0x02a3 = principal contador 2
ldi r16,26 ;26: estado 26
sts 0x029d,r16 ;0x029d = estado
rjmp pr_27_fim
pr_27_fim:
rjmp pr_fim



pr_28: ;guarda m, apaga
;md -> m
ldi r31,0x02 ;0x027b: memória início = z
ldi r30,0x7b
ldi r29,0x02 ;0x020d: memória display início = y
ldi r28,0x0d
pr_28_carregando:
ld r16,y
st z,r16
inc r30
inc r28
cpi r30,0x9d ;0x9d: depois fim
brne pr_28_carregando
rcall apaga_escreve_display
ldi r16,32 ;32 = ponto apagado
sts 0x022d,r16 ;0x022d: ponto memoria display
clr r16 ;sinal apagado
sts 0x022e,r16 ;0x022e: sinal memoria display
clr r16 ;zera contador
sts 0x02a2,r16 ;0x02a2 = contador
sts 0x02a3,r16 ;0x02a3 = contador 2
ldi r16,27 ;27: estado 27
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_29: ;erro
lds r16,0x0202 ;0x0202 = ta0
lds r17,0x0203 ;0x0203 = ta1
lds r18,0x0204 ;0x0204 = ta2
cbr r18,0xf0 ;0xf0: somente:  mr  m  <-  +/-

cpi r16,0 ;0
brne pr_29_teclas_sim
cpi r17,0 ;0
brne pr_29_teclas_sim
cpi r18,0 ;0
brne pr_29_teclas_sim
rjmp pr_29_teclas_nao

pr_29_teclas_sim:
ldi r16,1 ;1: estado 1
sts 0x029d,r16 ;0x029d = principal estado

pr_29_teclas_nao:
rjmp pr_fim



pr_30: ;carrega m
;m -> md
ldi r31,0x02 ;0x027b: memória início = z
ldi r30,0x7b
ldi r29,0x02 ;0x020d: memória display início = y
ldi r28,0x0d
pr_30_carregando:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0x9d ;0x9d: depois fim
brne pr_30_carregando
ldi r16,13 ;13: estado 13
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim



pr_31: ;espera c
lds r16,0x02a3 ;0x02a3 = principal contador 2
cpi r16,5 ;5 * 32ms =160ms
brsh pr_31_contou
rjmp pr_31_fim
pr_31_contou:
clr r16 ;zera contador
sts 0x02a2,r16 ;0x02a2 = principal contador
sts 0x02a3,r16 ;0x02a3 = principal contador 2
ldi r16,30 ;30: estado 30
sts 0x029d,r16 ;0x029d = estado
rjmp pr_31_fim
pr_31_fim:
rjmp pr_fim



pr_32: ;guarda m, apaga
;md -> m
ldi r31,0x02 ;0x027b: memória início = z
ldi r30,0x7b
ldi r29,0x02 ;0x020d: memória display início = y
ldi r28,0x0d
pr_32_carregando:
ld r16,y
st z,r16
inc r30
inc r28
cpi r30,0x9d ;0x9d: depois fim
brne pr_32_carregando
rcall apaga_escreve_display
ldi r16,32 ;32 = ponto apagado
sts 0x022d,r16 ;0x022d: ponto memoria display
clr r16 ;sinal apagado
sts 0x022e,r16 ;0x022e: sinal memoria display
clr r16 ;zera contador
sts 0x02a2,r16 ;0x02a2 = contador
sts 0x02a3,r16 ;0x02a3 = contador 2
ldi r16,31 ;31: estado 31
sts 0x029d,r16 ;0x029d = estado
rjmp pr_fim







pr_33: ;calcula
rcall calcula

lds r16,0x02a4 ;0x02a4 = retorna erro
cpi r16,0
breq pr_33_sem_erro


;errado:
;apaga display:
ldi r31,0x02 ;0x020d = memória display início
ldi r30,0x0d
ldi r16,0x10 ;0x10 = apagado
pr_33_erro_apagando:
st z,r16
inc r30
cpi r30,0x2d ;0x2d = md depois fim
brne pr_33_erro_apagando
;sem ponto
ldi r16,32 ;32 = sem ponto
sts 0x022d,r16 ;0x022d = ponto
;sem sinal
clr r16
sts 0x022e,r16 ;0x022e = sinal
;escreve "erro"
ldi r16,0x0a ;0x0a = 'E'
ldi r17,0x0b ;0x0b = 'r'
ldi r18,0x0f ;0x0f = 'o'
sts 0x022c,r16 ;0x022c
sts 0x022b,r17 ;0x022b
sts 0x022a,r17 ;0x022a
sts 0x0229,r18 ;0x0229

ldi r16,29 ;29: estado erro
sts 0x029d,r16 ;0x029d = estado
rjmp pr_33_fim

pr_33_sem_erro:
ldi r16,25 ;25: estado 25
sts 0x029d,r16 ;0x029d = estado

pr_33_fim:
rjmp pr_fim







pr_fim:














;----------------------------------------------------------------------------
;escreve display:

lds r16,0x02a1 ;0x02a1 = escreve display estado
cpi r16,0
breq ed_0_alcance
cpi r16,1
breq ed_1_alcance
cpi r16,2
breq ed_2_alcance
cpi r16,3
breq ed_3_alcance
cpi r16,4
breq ed_4_alcance
cpi r16,5
breq ed_5_alcance
cpi r16,6
breq ed_6_alcance
cpi r16,7
breq ed_7_alcance
cpi r16,8
breq ed_8_alcance


ed_0_alcance:
rjmp ed_0
ed_1_alcance:
rjmp ed_1
ed_2_alcance:
rjmp ed_2
ed_3_alcance:
rjmp ed_3
ed_4_alcance:
rjmp ed_4
ed_5_alcance:
rjmp ed_5
ed_6_alcance:
rjmp ed_6
ed_7_alcance:
rjmp ed_7
ed_8_alcance:
rjmp ed_8




ed_0:
ldi r17,0x02 ;0x022c = último
ldi r16,0x2c
sts 0x029f,r17 ;0x029f = escreve display ponteiro alto
sts 0x02a0,r16 ;0x02a0 = escreve display ponteiro baixo
ldi r16,32 ;32 = apagado
sts 0x022d,r16 ;0x022d = ponto = p
ldi r16,1 ;1 = próximo
sts 0x02a1,r16 ;0x02a1 = escreve display estado
rjmp ed_fim



ed_1: ;próximo
;n
lds r16,0x0202 ;0x0202 = ta0:  7..... 0
lds r17,0x0203 ;0x0203 = ta1:  .....9 8
cbr r17,0xfc ;0xfc: somente 9 8
cpi r16,0
brne ed_1_n1 ;tem número
cpi r17,0
brne ed_1_n1
rjmp ed_1_n0 ;não tem número
ed_1_n1:
;n
ldi r16,2 ;2 = estado
sts 0x02a1,r16 ;0x02a1 = escreve display estado
rjmp ed_1_fim
ed_1_n0:
;p
lds r16,0x0203 ;0x0203 = ta1:    . 9 8
cbr r16,0xfb ;0xfb: somente b2 =  .
cpi r16,0
breq ed_1_p0
rjmp ed_1_p1
ed_1_p1:
lds r16,0x0203 ;0x0203 = ta1:    . 9 8
cbr r16,0x04 ;0x04: zera b2 = ponto
sts 0x0203,r16
ldi r16,8 ;8 = estado
sts 0x02a1,r16 ;0x02a1 = escreve display estado
rjmp ed_1_fim
ed_1_p0:
;<-
lds r16,0x0204 ;0x0204 = ta2:    ...   <-  +/-
cbr r16,0xfd ;0xfd: somente b1 =  <-
cpi r16,0
breq ed_1_r0
rjmp ed_1_r1
ed_1_r1:
lds r16,0x0204 ;0x0204 = ta2:    ...   <-  +/-
cbr r16,0x02 ;0x02: zera b1 = <-
sts 0x0204,r16
ldi r16,4 ;4 = estado
sts 0x02a1,r16 ;0x02a1 = escreve display estado
rjmp ed_1_fim
ed_1_r0:
rjmp ed_1_fim
ed_1_fim:
rjmp ed_fim



ed_2: ;z >= 0 ?
lds r17,0x029f ;0x029f = escreve display ponteiro alto
lds r16,0x02a0 ;0x02a0 = escreve display ponteiro baixo
cpi r17,0x02 ;0x02
breq ed_2_zb
rjmp ed_2_prox
ed_2_zb:
cpi r16,0x0d ;0x0d = 00
brsh ed_2_nz ;>= vai
rjmp ed_2_prox
ed_2_nz:
ldi r16,3 ;3 = próximo estado
sts 0x02a1,r16 ;0x02a1 = escreve display estado
rjmp ed_2_fim
ed_2_prox:
;sem n
clr r16
sts 0x0202,r16 ;0x0202 = ta0
lds r16,0x0203 ;0x0203 = ta1
cbr r16,0x03 ;0x03: zera b1 b0 = 9 8
sts 0x0203,r16
ldi r16,1 ;1 = próximo estado
sts 0x02a1,r16 ;0x02a1 = escreve display estado
rjmp ed_2_fim
ed_2_fim:
rjmp ed_fim



ed_3: ;n => z
lds r17,0x0202 ;0x0202 = ta0   7 6 5 4 3 2 1 0
lds r16,0x0203 ;0x0203 = ta1               9 8

lds r31,0x029f ;0x029f = escreve display ponteiro alto
lds r30,0x02a0 ;0x02a0 = escreve display ponteiro baixo

sbrc r16,1 ;1 = b1: 9
rjmp ed_3_n9
sbrc r16,0 ;0 = b0: 8
rjmp ed_3_n8
sbrc r17,7 ;7 = b7: 7
rjmp ed_3_n7
sbrc r17,6 ;6 = b6: 6
rjmp ed_3_n6
sbrc r17,5 ;5 = b5: 5
rjmp ed_3_n5
sbrc r17,4 ;4 = b4: 4
rjmp ed_3_n4
sbrc r17,3 ;3 = b3: 3
rjmp ed_3_n3
sbrc r17,2 ;2 = b2: 2
rjmp ed_3_n2
sbrc r17,1 ;1 = b1: 1
rjmp ed_3_n1
sbrc r17,0 ;0 = b0: 0
rjmp ed_3_n0

ed_3_n9:
ldi r18,9 ;9
st z,r18
cbr r16,0x02 ;0x02: zera b1 = 9
sts 0x0203,r16 ;0x0203 = ta1               9 8
rjmp ed_3_n_fim
ed_3_n8:
ldi r18,8 ;8
st z,r18
cbr r16,0x01 ;0x01: zera b0 = 8
sts 0x0203,r16 ;0x0203 = ta1               9 8
rjmp ed_3_n_fim
ed_3_n7:
ldi r18,7 ;7
st z,r18
cbr r17,0x80 ;0x80: zera b7 = 7
sts 0x0202,r17 ;0x0202 = ta0   7 6 5 4 3 2 1 0
rjmp ed_3_n_fim
ed_3_n6:
ldi r18,6 ;6
st z,r18
cbr r17,0x40 ;0x40: zera b6 = 6
sts 0x0202,r17 ;0x0202 = ta0   7 6 5 4 3 2 1 0
rjmp ed_3_n_fim
ed_3_n5:
ldi r18,5 ;5
st z,r18
cbr r17,0x20 ;0x20: zera b5 = 5
sts 0x0202,r17 ;0x0202 = ta0   7 6 5 4 3 2 1 0
rjmp ed_3_n_fim
ed_3_n4:
ldi r18,4 ;4
st z,r18
cbr r17,0x10 ;0x10: zera b4 = 4
sts 0x0202,r17 ;0x0202 = ta0   7 6 5 4 3 2 1 0
rjmp ed_3_n_fim
ed_3_n3:
ldi r18,3 ;3
st z,r18
cbr r17,0x08 ;0x08: zera b3 = 3
sts 0x0202,r17 ;0x0202 = ta0   7 6 5 4 3 2 1 0
rjmp ed_3_n_fim
ed_3_n2:
ldi r18,2 ;2
st z,r18
cbr r17,0x04 ;0x04: zera b2 = 2
sts 0x0202,r17 ;0x0202 = ta0   7 6 5 4 3 2 1 0
rjmp ed_3_n_fim
ed_3_n1:
ldi r18,1 ;1
st z,r18
cbr r17,0x02 ;0x02: zera b1 = 1
sts 0x0202,r17 ;0x0202 = ta0   7 6 5 4 3 2 1 0
rjmp ed_3_n_fim
ed_3_n0:
ldi r18,0 ;0
st z,r18
cbr r17,0x01 ;0x01: zera b0 = 0
sts 0x0202,r17 ;0x0202 = ta0   7 6 5 4 3 2 1 0
rjmp ed_3_n_fim
ed_3_n_fim:
;sem n
clr r16
sts 0x0202,r16 ;0x0202 = ta0
lds r16,0x0203 ;0x0203 = ta1
cbr r16,0x03 ;0x03: zera b1 b0 = 9 8
sts 0x0203,r16
;dec z
dec r30
sts 0x02a0,r30 ;0x02a0 = escreve display ponteiro baixo
ldi r16,1 ;1 = próximo estado
sts 0x02a1,r16 ;0x02a1 = escreve display estado
rjmp ed_3_fim
ed_3_fim:
rjmp ed_fim



ed_4: ;z >= 31 ?
lds r31,0x029f ;0x029f = escreve display ponteiro alto
lds r30,0x02a0 ;0x02a0 = escreve display ponteiro baixo

cpi r31,0x02 ;0x02
breq ed_4_b
rjmp ed_4_proximo
ed_4_b:
cpi r30,0x2c ;0x2c = 31: ponteiro z fim
brsh ed_4_proximo ;>=  vai
rjmp ed_4_zp
ed_4_proximo:
ldi r16,1 ;1 = próximo estado
sts 0x02a1,r16 ;0x02a1 = escreve display estado
rjmp ed_4_fim
ed_4_zp:
ldi r16,5 ;5 = estado inc z apaga
sts 0x02a1,r16 ;0x02a1 = escreve display estado
rjmp ed_4_fim
ed_4_fim:
rjmp ed_fim



ed_5: ;z = apagado, inc z
;inc z
lds r31,0x029f ;0x029f = escreve display ponteiro alto
lds r30,0x02a0 ;0x02a0 = escreve display ponteiro baixo
inc r30
sts 0x02a0,r30
;z = apagado
ldi r16,0x10 ;0x10 = caractere apagado
st z,r16
ldi r16,6 ;6 = estado z = p ?
sts 0x02a1,r16 ;0x02a1 = escreve display estado
rjmp ed_5_fim
ed_5_fim:
rjmp ed_fim



ed_6: ;z = p ?
lds r17,0x029f ;0x029f = escreve display ponteiro alto
lds r16,0x02a0 ;0x02a0 = escreve display ponteiro baixo
subi r16,0x0d ;0x0d = 00 = início
lds r18,0x022d ;0x022d = ponto
cp r16,r18
breq ed_6_igual
ldi r16,1 ;1 = próximo estado
sts 0x02a1,r16 ;0x02a1 = escreve display estado
rjmp ed_6_fim
ed_6_igual:
ldi r16,7 ;7 = estado p32
sts 0x02a1,r16 ;0x02a1 = escreve display estado
rjmp ed_6_fim
ed_6_fim:
rjmp ed_fim



ed_7: ;p = 32 apagado
ldi r16,32 ;32 = apagado
sts 0x022d,r16 ;0x022d = ponto
ldi r16,1 ;1 = próximo estado
sts 0x02a1,r16 ;0x02a1 = escreve display estado
ed_7_fim:
rjmp ed_fim



ed_8: ;p = z + 1
lds r17,0x029f ;0x029f = escreve display ponteiro alto
lds r16,0x02a0 ;0x02a0 = escreve display ponteiro baixo
subi r16,0x0d ;0x0d = 00 = início
ldi r18,1 ;1 = +1
add r16,r18
sts 0x022d,r16 ;0x022d = ponto
ldi r16,1 ;1 = estado próximo
sts 0x02a1,r16 ;0x02a1 = escreve display estado
ed_8_fim:
rjmp ed_fim



ed_fim:
;----------------------------------------------------------------------------










;----------------------------------------------------------------------------
;inverte_mais_menos:
lds r16,0x0204 ;0x0204 = ta2: b0: +/-
sbrc r16,0 ;b0
rjmp i_m_m_sim
rjmp i_m_m_nao

i_m_m_sim:
cbr r16,0x01 ;0x01: zera b0
sts 0x0204,r16

;--------------------------------------
;inverte
lds r16,0x022e ;0x022e = sinal memória display
cpi r16,0
breq i_m_m_inv_0
rjmp i_m_m_inv_1
i_m_m_inv_0:
ldi r16,1 ;1
sts 0x022e,r16
rjmp i_m_m_inv_fim
i_m_m_inv_1:
clr r16 ;0
sts 0x022e,r16
i_m_m_inv_fim:
;--------------------------------------

rjmp i_m_m_fim
i_m_m_nao:
i_m_m_fim:
;----------------------------------------------------------------------------










;----------------------------------------------------------------------------
;teste:

;teste estado = 0 ?
lds r16,0x02a8 ;0x02a8 = teste estado
cpi r16,0 ;0
brne tst_testando
;estado teclado  = 1,3,5,7,9 ?
lds r16,0x0201 ;0x0201 = estado teclado
cpi r16,1
breq tst_contando
cpi r16,3
breq tst_contando
cpi r16,5
breq tst_contando
cpi r16,7
breq tst_contando
cpi r16,9
breq tst_contando
;zera contador
clr r16 ;zera contador
sts 0x02a5,r16 ;0x02a5 = teste contador
sts 0x02a6,r16 ;0x02a6 = teste contador 2
rjmp tst_fim
tst_contando:
lds r16,0x02a6 ;0x02a6 = teste contador 2
cpi r16,214 ;214 * 128us * 256 = 7s
brsh tst_contou
rjmp tst_fim
tst_contou:
;zera contador
clr r16 ;zera contador
sts 0x02a5,r16 ;0x02a5 = teste contador
sts 0x02a6,r16 ;0x02a6 = teste contador 2
;teste estado = 1
ldi r16,1 ;1
sts 0x02a8,r16 ;0x02a8 = teste estado
rjmp tst_fim

;testando:
tst_testando:
;cont 2 > 0.5s ?
lds r16,0x02a6 ;0x02a6 = teste contador 2
cpi r16,10 ;10 * 128us * 256 = 0.33s
brsh tst_testando_contou
rjmp tst_fim
tst_testando_contou:
lds r17,0x02a7 ;0x02a7 = teste número
ldi r31,0x02 ;0x020d = md00 = início = z
ldi r30,0x0d
tst_testando_contou_escrevendo:
st z,r17
inc r30
cpi r30,0x2d ;0x2d = depois fim
brne tst_testando_contou_escrevendo
;inc teste número
lds r16,0x02a7 ;0x02a7 = teste número
inc r16
sts 0x02a7,r16 ;0x02a7 = teste número
cpi r16,10 ;10: zera
brne tst_testando_contou_escrevendo_fim
clr r16 ;zera
sts 0x02a7,r16 ;0x02a7 = teste número
tst_testando_contou_escrevendo_fim:
;ponto
lds r16,0x02a9 ;0x02a9 = teste ponto
sts 0x022d,r16 ;0x022d= ponto
inc r16
sts 0x02a9,r16
cpi r16,32 ;32 = depois fim
brne tst_testando_contou_ponto_fim
clr r16 ;zera ponto
sts 0x02a9,r16 ;0x02a9 = teste ponto
tst_testando_contou_ponto_fim:
;cont = 0
clr r16 ;zera contador
sts 0x02a5,r16 ;0x02a5 = teste contador
sts 0x02a6,r16 ;0x02a6 = teste contador 2
tst_fim:

;----------------------------------------------------------------------------










;////////////////////////////////////////////////////////////////////////////
jmp processamento
;////////////////////////////////////////////////////////////////////////////




















;############################################################################
;subrotinas:










;============================================================================
mtc_entradas:
in r16,pind ;lê entradas em r20
in r17,pinb
clr r20
bst r16,5 ;b0 d7 d6 d5  =  r20:b3 b2 b1 b0
bld r20,0
bst r16,6
bld r20,1
bst r16,7
bld r20,2
bst r17,0
bld r20,3
ret
;-------------
mtc_zera_contador:
clr r16 ;0x0205 = zera contador teclado
sts 0x0205,r16
ret
;-------------
mtc_zera_pre_contador:
clr r16 ;0x0200 = zera pre contador teclado
sts 0x0200,r16
ret
;-------------
mtc_incrementa_contador:
lds r16,0x0205 ;0x0205 = contador teclado
inc r16 ;incrementa 2ms
sts 0x0205,r16
ret
;-------------
;============================================================================










;============================================================================
p_09: ;r16=0:teclas não r16=1: teclas sim
lds r16,0x0202 ;0x0202 = ta0
lds r17,0x0203 ;0x0203 = ta1
lds r18,0x0204 ;0x0204 = ta2
cpi r16,0
brne p_09_sim
cbr r17,0xf8 ;0xf8: somente: . 9 8
cpi r17,0
brne p_09_sim
cbr r18,0xfd ;0xfd: somente:  <-
cpi r18,0
brne p_09_sim
p_09_nao:
clr r16 ;não
rjmp p_09_fim
p_09_sim:
ldi r16,1 ;1: sim
p_09_fim:
ret
;============================================================================










;============================================================================
;+ - x /  r16=0: sem sinal    r16=1: tem sinal
p_mm:
lds r16,0x0203 ;0x0203 = ta1 = + - x /
cbr r16,0x0f ;0x0f: somente +-x/
cpi r16,0 ;0
breq p_mm_sinal_nao
rjmp p_mm_sinal_sim
p_mm_sinal_sim:
sts 0x029e,r16 ;0x029e = guarda operação

lds r16,0x0203 ;0x0203 = ta1 = + - x /
cbr r16,0xf0 ;0xf0 = zera sinais
sts 0x0203,r16

ldi r16,1 ;r16 = 1: tem sinal
rjmp p_mm_fim
p_mm_sinal_nao:
ldi r16,0 ;r16 = 0: sem sinal
p_mm_fim:
ret
;============================================================================










;============================================================================
apaga_escreve_display:
ldi r31,0x02 ;0x020d: ed: início
ldi r30,0x0d
ldi r16,0x10 ;0x10: apagado
apaga_escreve_display_proximo:
st z,r16
inc r30
cpi r30,0x2d ;0x2d: depois fim
brne apaga_escreve_display_proximo
ret
;============================================================================










;============================================================================
na_apagados_zerados:
;número a:   converte caracteres apagados 0x10 em zerados 0x00:

;z = fim
ldi r31,0x02 ;0x0256 = número a fim = z
ldi r30,0x56
clr r17

;ponto = 32?
lds r16,0x0257 ;0x0257 = ponto a
cpi r16,32 ;32
breq na_z010_1
rjmp na_z010_2

na_z010_1: ;z = 0x10 ? 1
ld r16,z
cpi r16,0x10 ;0x10: apagado
breq na_zfim
rjmp na_decz1

na_decz1: ;dec z 1
dec r30
rjmp na_zini1

na_zini1: ;z = início ?  1
cpi r30,0x36 ;0x36 = ante início a
breq na_pini1
rjmp na_z010_1

na_pini1: ;p = início 1
clr r16
sts 0x0257,r16 ;0x0257: ponto a
rjmp na_fim

na_zfim: ;z = fim ?
cpi r30,0x56 ;0x56: a fim
breq na_pini2
rjmp na_pz

na_pini2: ;p = início 2
clr r16
sts 0x0257,r16 ;0x0257: ponto a
rjmp na_zz

na_pz: ;p = z + 1
mov r16,r30
subi r16,0x37 ;0x37: início a
ldi r18,1 ;1
add r16,r18
sts 0x0257,r16 ;0x0257: ponto a
rjmp na_zz

na_zz: ;zera z
st z,r17
rjmp na_decz2

na_decz2: ;dec z 2
dec r30
rjmp na_zini2

na_zini2: ;z = início ?  2
cpi r30,0x36 ;0x36 = ante início a
breq na_fim
rjmp na_z010_2

na_z010_2: ;z = 0x10 ? 2
ld r16,z
cpi r16,0x10 ;0x10: apagado
breq na_zz
rjmp na_decz2

na_fim: ;fim
ret
;============================================================================










;============================================================================
nb_apagados_zerados:
;número a:   converte caracteres apagados 0x10 em zerados 0x00:

;z = fim
ldi r31,0x02 ;0x0278 = número b fim = z
ldi r30,0x78
clr r17

;ponto = 32?
lds r16,0x0279 ;0x0279 = ponto b
cpi r16,32 ;32
breq nb_z010_1
rjmp nb_z010_2

nb_z010_1: ;z = 0x10 ? 1
ld r16,z
cpi r16,0x10 ;0x10: apagado
breq nb_zfim
rjmp nb_decz1

nb_decz1: ;dec z 1
dec r30
rjmp nb_zini1

nb_zini1: ;z = início ?  1
cpi r30,0x58 ;0x58 = ante início b
breq nb_pini1
rjmp nb_z010_1

nb_pini1: ;p = início 1
clr r16
sts 0x0279,r16 ;0x0279: ponto b
rjmp nb_fim

nb_zfim: ;z = fim ?
cpi r30,0x78 ;0x78: b fim
breq nb_pini2
rjmp nb_pz

nb_pini2: ;p = início 2
clr r16
sts 0x0279,r16 ;0x0279: ponto b
rjmp nb_zz

nb_pz: ;p = z + 1
mov r16,r30
subi r16,0x59 ;0x59: início b
ldi r18,1 ;1
add r16,r18
sts 0x0279,r16 ;0x0279: ponto b
rjmp nb_zz

nb_zz: ;zera z
st z,r17
rjmp nb_decz2

nb_decz2: ;dec z 2
dec r30
rjmp nb_zini2

nb_zini2: ;z = início ?  2
cpi r30,0x58 ;0x58 = ante início b
breq nb_fim
rjmp nb_z010_2

nb_z010_2: ;z = 0x10 ? 2
ld r16,z
cpi r16,0x10 ;0x10: apagado
breq nb_zz
rjmp nb_decz2

nb_fim: ;fim
ret
;============================================================================















;============================================================================
;============================================================================
;============================================================================
;============================================================================
;============================================================================
calcula:
cli ;desliga ints



lds r16,0x029e ;0x029e = principal operação
;/ x - + = . 9 8
sbrc r16,4 ;4: b4: +
rjmp ca_soma
sbrc r16,5 ;5: b5: -
rjmp ca_subtrai
sbrc r16,6 ;6: b6: x
rjmp ca_multiplica
rjmp ca_divide







;============================================================================
;============================================================================
;============================================================================
;============================================================================
;============================================================================
ca_soma:
ldi r16,0 ;0: soma
sts 0x0444,r16 ;0x0444 = ngt = negativo
rjmp ca_ss_sinal_fim
ca_subtrai:
ldi r16,1 ;1: subtrai
sts 0x0444,r16 ;0x0144 = ngt = negativo
ca_ss_sinal_fim:


;copia a:
ldi r31,0x02 ;0x0237 = a início = z
ldi r30,0x37
ldi r29,0x04 ;0x0400 = soma a início = y
ldi r28,0x00
ca_ss_copiando_a:
ld r16,z ;z -> y
st y,r16
inc r30
inc r28
cpi r30,0x59 ;0x59 = a depois fim
brne ca_ss_copiando_a

;copia b:
ldi r31,0x02 ;0x0259 = b início = z
ldi r30,0x59
ldi r29,0x04 ;0x0422 = soma b início = y
ldi r28,0x22
ca_ss_copiando_b:
ld r16,z ;z -> y
st y,r16
inc r30
inc r28
cpi r30,0x7b ;0x7b = b depois fim
brne ca_ss_copiando_b

;----------------------------
call somacompleto
;----------------------------

lds r16,0x0446 ;0x0446: soma erro
cpi r16,0 ;0: sem erro
breq ca_soma_sem_erro
;erro
ldi r16,1 ;1: erro
sts 0x02a4,r16 ;0x02a4 = retorna erro
rjmp ca_ss_fim
ca_soma_sem_erro:
ldi r16,0 ;0: sem erro
sts 0x02a4,r16 ;0x02a4 = retorna erro



;copia resultado em:   memória display:
ldi r31,0x01 ;0x0100 = soma resultado início = z
ldi r30,0x00
ldi r29,0x02 ;0x020d = memória display início = y
ldi r28,0x0d
ca_ss_copiando_resultado:
ld r16,z ;z -> y
st y,r16
inc r30
inc r28
cpi r30,0x20 ;0x20 = resultado depois fim
brne ca_ss_copiando_resultado
;ponto
lds r16,0x0420 ;0x0420 = ponto resultado
sts 0x022d,r16 ;0x022d = ponto memória display
;sinal
lds r16,0x0421 ;0x0421 = sinal resultado
sts 0x022e,r16 ;0x022e = sinal memória display

rjmp ca_ss_fim

ca_ss_fim:
lds r16,0x029e ;0x029e = principal operação
cbr r16,0xf0 ;0xf0: zera b7 b6 b5 b4: / x - +
sts 0x029e,r16



sei ;liga ints
ret
;============================================================================
;============================================================================
;============================================================================
;============================================================================
;============================================================================










;============================================================================
;============================================================================
;============================================================================
;============================================================================
;============================================================================
ca_multiplica:


;copia a:
ldi r31,0x02 ;0x0237 = a início = z
ldi r30,0x37
ldi r29,0x04 ;0x0400 = multiplica a início = y
ldi r28,0x00
ca_m_copiando_a:
ld r16,z ;z -> y
st y,r16
inc r30
inc r28
cpi r30,0x59 ;0x59 = a depois fim
brne ca_m_copiando_a

;copia b:
ldi r31,0x02 ;0x0259 = b início = z
ldi r30,0x59
ldi r29,0x04 ;0x0422 = multiplica b início = y
ldi r28,0x22
ca_m_copiando_b:
ld r16,z ;z -> y
st y,r16
inc r30
inc r28
cpi r30,0x7b ;0x7b = b depois fim
brne ca_m_copiando_b

;----------------------------
call mul28bytescompleto
;----------------------------

lds r16,0x0445 ;0x0445: multiplica erro
cpi r16,0 ;0: sem erro
breq ca_m_sem_erro
;erro
ldi r16,1 ;1: erro
sts 0x02a4,r16 ;0x02a4 = retorna erro
rjmp ca_m_fim
ca_m_sem_erro:
ldi r16,0 ;0: sem erro
sts 0x02a4,r16 ;0x02a4 = retorna erro

;copia resultado em:   memória display:
ldi r31,0x01 ;0x0120 = multiplica resultado início = z
ldi r30,0x20
ldi r29,0x02 ;0x020d = memória display início = y
ldi r28,0x0d
ca_m_copiando_resultado:
ld r16,z ;z -> y
st y,r16
inc r30
inc r28
cpi r30,0x42 ;0x40 = resultado depois fim
brne ca_m_copiando_resultado
;ponto
lds r16,0x0420 ;0x0420 = ponto resultado
sts 0x022d,r16 ;0x022d = ponto memória display
;sinal
lds r16,0x0421 ;0x0421 = sinal resultado
sts 0x022e,r16 ;0x022e = sinal memória display

rjmp ca_m_fim

ca_m_fim:
lds r16,0x029e ;0x029e = principal operação
cbr r16,0xf0 ;0xf0: zera b7 b6 b5 b4: / x - +
sts 0x029e,r16



sei ;liga ints
ret
;============================================================================
;============================================================================
;============================================================================
;============================================================================
;============================================================================










;============================================================================
;============================================================================
;============================================================================
;============================================================================
;============================================================================
ca_divide:


;copia a:
ldi r31,0x02 ;0x0237 = a início = z
ldi r30,0x37
ldi r29,0x04 ;0x0400 = divide a início = y
ldi r28,0x00
ca_d_copiando_a:
ld r16,z ;z -> y
st y,r16
inc r30
inc r28
cpi r30,0x57 ;0x57 = a depois fim
brne ca_d_copiando_a

lds r16,0x0257 ;0x0257 = a ponto
sts 0x045c,r16 ;0x045c = ap
lds r16,0x0258 ;0x0258 = a sinal
sts 0x045e,r16 ;0x045e = as



;copia b:
ldi r31,0x02 ;0x0259 = b início = z
ldi r30,0x59
ldi r29,0x04 ;0x0420 = divide b início = y
ldi r28,0x20
ca_d_copiando_b:
ld r16,z ;z -> y
st y,r16
inc r30
inc r28
cpi r30,0x79 ;0x79 = b depois fim
brne ca_d_copiando_b

lds r16,0x0279 ;0x0279 = b ponto
sts 0x045d,r16 ;0x045d = bp
lds r16,0x027a ;0x027a = b sinal
sts 0x045f,r16 ;0x045f = bs

;----------------------------
call div16bytescompleto
;----------------------------

lds r16,0x0464 ;0x0464: divide erro
cpi r16,0 ;0: sem erro
breq ca_d_sem_erro
;erro
ldi r16,1 ;1: erro
sts 0x02a4,r16 ;0x02a4 = retorna erro
rjmp ca_d_fim
ca_d_sem_erro:
ldi r16,0 ;0: sem erro
sts 0x02a4,r16 ;0x02a4 = retorna erro

;copia resultado em:   memória display:
ldi r31,0x01 ;0x0100 = divide resultado início = z
ldi r30,0x00
ldi r29,0x02 ;0x020d = memória display início = y
ldi r28,0x0d
ca_d_copiando_resultado:
ld r16,z ;z -> y
st y,r16
inc r30
inc r28
cpi r30,0x20 ;0x20 = resultado depois fim
brne ca_d_copiando_resultado
;ponto
lds r16,0x0460 ;0x0460 = rp
sts 0x022d,r16 ;0x022d = ponto memória display
;sinal
lds r16,0x0461 ;0x0461 = rs
sts 0x022e,r16 ;0x022e = sinal memória display

rjmp ca_d_fim

ca_d_fim:
lds r16,0x029e ;0x029e = principal operação
cbr r16,0xf0 ;0xf0: zera b7 b6 b5 b4: / x - +
sts 0x029e,r16



sei ;liga ints
ret
;============================================================================
;============================================================================
;============================================================================
;============================================================================
;============================================================================










.org 0x3f61






bindec64:







;A decimal

ldi r31,0x01 ;0x0100 = A0
ldi r30,0x00
clr r16
zerando_a:
st z,r16
inc r30
cpi r30,0x40 ;0x40 = A depois fim
brne zerando_a





;C decimal
ldi r31,0x01 ;0x015c = C0
ldi r30,0x5c
clr r16
zerando_c:
st z,r16
inc r30
cpi r30,0x9c ;0x9c = C depois fim
brne zerando_c

ldi r30,0x5c ;0x5c = C0 = 1
ldi r16,1 ;1
st z,r16








;C1
ldi r16,0x00 ;0x019c = C1 = 0
sts 0x019c,r16

;V
ldi r16,0x00 ;0x019d = V = 0
sts 0x019d,r16






proximo:
clr r16 ;0x019d = V = 0
sts 0x019d,r16

ldi r31,0x01 ;0x0100 = A0 = z
ldi r30,0x00

ldi r29,0x01 ;0x015c = C0 = y
ldi r28,0x5c




;B0 = 1?
lds r16,0x0140 ;0x0140 = B0
sbrs r16,0 ;0
rjmp pulasoma



;A + C
somando_2:
lds r18,0x019d ;0x019d = V
ld r17,z
ld r16,y
add r17,r16 ;A0 + C0
add r17,r18 ;+ V
cpi r17,10 ;10 < vai
brlo somou
subi r17,10 ;10 = menos 10
st z,r17
ldi r18,1 ;1 = vai 1
sts 0x019d,r18 ;0x019d = V
rjmp somou_vai_1
somou:
st z,r17
ldi r18,0 ;0
sts 0x019d,r18 ;0x019d = V = 0
somou_vai_1:
inc r30
inc r28
cpi r30,0x40 ;0x40 = A depois fim
brne somando_2




;Cont x 2 Dec
pulasoma:
push r31 ;z
push r30

ldi r31,0x01 ;0x015c = C0
ldi r30,0x5c
ldi r17,2 ;2
ldi r18,0 ;0
multiplicando:
ld r16,z
mul r16,r17 ;x 2
lds r16,0x0000 ;0x0000 = R0
add r16,r18 ;+ r18 = vai
cpi r16,10 ;10 < vai
brlo mult_menor_10
subi r16,10 ;10 = menos 10
st z,r16
ldi r18,1 ;1 = vai
rjmp mult_prox
mult_menor_10:
st z,r16
ldi r18,0 ;0
mult_prox:
inc r30
cpi r30,0x9c ;0x9c = C depois fim
brne multiplicando

pop r30 ;z
pop r31




;B / 2 bin
push r31 ;z
push r30

ldi r31,0x01 ;0x0140 = B0
ldi r30,0x40

b_2_dividindo:
ld r16,z ;r17 r16
inc r30
ld r17,z
dec r30

lsr r16 ;r16->1bit   =   r16/2
bst r17,0 ;r17,b0  ->  r16,b7
bld r16,7

st z,r16

inc r30

cpi r30,0x5b ;0x5b = B fim
brne b_2_dividindo

ld r16,z ;B fim / 2
lsr r16
st z,r16

pop r30 ;z
pop r31






;Inc C1
lds r16,0x019c ;0x019c = C1
inc r16
sts 0x019c,r16




;C1 = 224 ?
cpi r16,224 ;224:  28 bytes x 8 bits = 224 bits
breq soma_fim
rjmp proximo




;Fim
soma_fim:




ret












.org 0x3e98









dec32bin14:











;A100 = 0?
lds r16,0x0100 ;0x0100 = A
cpi r16,0
breq a100_igual_1
rjmp a0_igual_0


;A100 = 1
a100_igual_1:
ldi r16,1
sts 0x0100,r16 ;0x0100 = A = 1


;A0 = 1
sts 0x015c,r16 ;0x015c = A0 = 1
rjmp a100_a0_fim


;A0 = 0
a0_igual_0:
ldi r16,0
sts 0x015c,r16 ;0x015c = A0 = 0


a100_a0_fim:





;----------
;Inverte A
ldi r31,0x01 ;0x011f = An = Af = 0x1f = z
ldi r30,0x1f

ldi r29,0x01 ;0x012e = Cn = Ci = 0x2e = y
ldi r28,0x2e

;An = 0 ?
an_igual_0:
ld r16,z
cpi r16,0
brne cn_igual_an

;Dec n
dec r30

;N = ff ?
cpi r30,0xff ;0xff = A ante inicio
brne an_igual_0
rjmp inv_a_fim

;Cn = An
cn_igual_an:
ld r16,z
st y,r16

;Dec An
dec r30

;Inc Cn
inc r28

;An = ff ?
cpi r30,0xff ;0xff = A ante inicio
brne cn_igual_an

;Cn = 14e fim ?
cn_igual_14e:
cpi r28,0x4e ;0x4e = C depois fim
breq a_igual_c

;Cn = 0
clr r16
st y,r16

;Inc Cn
inc r28
rjmp cn_igual_14e


;A = C
a_igual_c:
ldi r31,0x01 ;0x0100 = A = z
ldi r30,0x00

ldi r29,0x01 ;0x012e = C = y
ldi r28,0x2e

a_igual_c_copiando:
ld r16,y
st z,r16

inc r30
inc r28

cpi r30,0x20 ;0x20 = A depois fim
brne a_igual_c_copiando

inv_a_fim:
;----------





;B = 0
clr r16
ldi r31,0x01 ;0x0120 = B = z
ldi r30,0x20
b_zerando:
st z,r16
inc r30
cpi r30,0x2e ;0x2e = B depois fim
brne b_zerando



;A = 0 ?
a_igual_0_calculando:

ldi r31,0x01 ;0x0060 = A = z
ldi r30,0x00
a_igual_0_checando:
ld r16,z
cpi r16,0
brne a100_igual_0
inc r30
cpi r30,0x20 ;0x20 = A depois fim
brne a_igual_0_checando
rjmp a0_igual_1



;A100 = 0 ?
a100_igual_0:
lds r16,0x0100
cpi r16,0
breq a_div_10



;Dec A100
dec r16
sts 0x0100,r16



;Inc B
ldi r31,0x01 ;0x0120 = B = z
ldi r30,0x20
clr r17

clc ;c = 0
set ;t = 1

inc_b_calculando:
in r16,sreg ;t -> c
bld r16,0
out sreg,r16

ld r16,z ;B + c
adc r16,r17
st z,r16

in r16,sreg
bst r16,0 ;c -> t

inc r30
cpi r30,0x2e ;0x2e = B depois fim
brne inc_b_calculando


rjmp a_igual_0_calculando



;A / 10
a_div_10:
ldi r31,0x01 ;0x0100 = A = z
ldi r30,0x00

a_div_10_calculando:
inc r30
ld r16,z
dec r30
st z,r16

inc r30
cpi r30,0x1f ;0x1f = A fim
brne a_div_10_calculando

clr r16
st z,r16



;----------
;B x 10
ldi r31,0x01 ;0x0120 = B = z
ldi r30,0x20

ldi r29,0x01 ;0x014e = D = y
ldi r28,0x4e

b_x_10_d_igual_b:
ld r16,z
st y,r16

inc r30
inc r28

cpi r30,0x2e ;0x2e = B depois fim
brne b_x_10_d_igual_b

clr r18 ;contador

b_x_10_calculando:
ldi r31,0x01 ;0x0120 = B = z
ldi r30,0x20
ldi r29,0x01 ;0x014e = D = y
ldi r28,0x4e

clc ;c = 0
clt ;t = 0

b_x_10_somando:
in r16,sreg ;t -> c
bld r16,0
out sreg,r16

ld r17,z ;Bn + Dn
ld r16,y
adc r17,r16
st z,r17

in r16,sreg ;c -> t
bst r16,0

inc r30
inc r28
cpi r30,0x2e ;0x2e = B depois fim
brne b_x_10_somando

inc r18
cpi r18,9 ;9 =  9vezes+1
brne b_x_10_calculando

;----------



rjmp a_igual_0_calculando



;A0 = 1 ?
a0_igual_1:
lds r16,0x015c ;0x015c = A0
cpi r16,1
brne dec_bin_fim



;B - 1
ldi r31,0x01 ;0x0120 = B = z
ldi r30,0x20

set ;t = 1
clc ;c = 0

b_menos_1_subtraindo:
in r16,sreg ;t -> c
bld r16,0
out sreg,r16

ld r16,z ;zn - c
sbci r16,0
st z,r16

in r16,sreg ;c -> t
bst r16,0

inc r30
cpi r30,0x2e ;0x2e = B depois fim
brne b_menos_1_subtraindo



;Fim
dec_bin_fim:



ret










.org 0x3af9






somacompleto:









;Desloca A à Esquerda
d_e_proximo:
lds r16,0x0420 ;0x0420 = PA
cpi r16,31 ;31
breq d_e_fim
lds r16,0x041f ;0x041f = A fim
cpi r16,0 ;0
brne d_e_fim

;A x 10
ldi r31,0x04 ;0x041f = A fim
ldi r30,0x1f
d_e_deslocando:
dec r30
ld r16,z
inc r30
st z,r16
dec r30
cpi r30,0x00 ;0x00 = A0
brne d_e_deslocando
clr r16
st z,r16

lds r16,0x0420 ;0x0420 = PA
inc r16
sts 0x0420,r16
rjmp d_e_proximo
d_e_fim:






;Desloca B à Esquerda
d_e_proximo_2:
lds r16,0x0442 ;0x0442 = PB
cpi r16,31 ;31
breq d_e_fim_2
lds r16,0x0441 ;0x0441 = B fim
cpi r16,0 ;0
brne d_e_fim_2

;B x 10
ldi r31,0x04 ;0x0441 = B fim
ldi r30,0x41
d_e_deslocando_2:
dec r30
ld r16,z
inc r30
st z,r16
dec r30
cpi r30,0x22 ;0x22 = B0
brne d_e_deslocando_2
clr r16
st z,r16

lds r16,0x0442 ;0x0442 = PB
inc r16
sts 0x0442,r16
rjmp d_e_proximo_2
d_e_fim_2:









;Ajusta Pontos

;C
ldi r16,0x00 ;0x0445 = C0
sts 0x0445,r16


lds r17,0x0420 ;0x0420 = PA
lds r16,0x0442 ;0x0442 = PB

cp r17,r16
breq aj_p_fim
brsh aj_p_a_maior
rjmp aj_p_a_menor



aj_p_a_maior:
lds r17,0x0420 ;0x0420 = PA
lds r16,0x0442 ;0x0442 = PB
sub r17,r16 ;PA - PB
sts 0x0445,r17 ;0x0445 = C0

;A / 10
aj_p_a_maior_proximo:
ldi r31,0x04 ;0x0400 = A0
ldi r30,0x00
aj_p_a_maior_deslocando:
inc r30
ld r16,z
dec r30
st z,r16
inc r30
cpi r30,0x1f ;0x1f = A fim
brne aj_p_a_maior_deslocando
clr r16
st z,r16
;dec C0
lds r16,0x0445 ;0x0445 = C0
dec r16
sts 0x0445,r16
;C0 = 0 ?
cpi r16,0 ;0
brne aj_p_a_maior_proximo
;PA = PB  
lds r16,0x0442 ;0x0442 = PB
sts 0x0420,r16 ;0x0420 = PA

rjmp aj_p_fim



aj_p_a_menor:
lds r17,0x0420 ;0x0420 = PA
lds r16,0x0442 ;0x0442 = PB
sub r16,r17 ;PB - PA
sts 0x0445,r16 ;0x0445 = C0

;B / 10
aj_p_a_menor_proximo:
ldi r31,0x04 ;0x0422 = B0
ldi r30,0x22
aj_p_a_menor_deslocando:
inc r30
ld r16,z
dec r30
st z,r16
inc r30
cpi r30,0x41 ;0x41 = B fim
brne aj_p_a_menor_deslocando
clr r16
st z,r16
;dec C0
lds r16,0x0445 ;0x0445 = C0
dec r16
sts 0x0445,r16
;C0 = 0 ?
cpi r16,0 ;0
brne aj_p_a_menor_proximo
;PB = PA  
lds r16,0x0420 ;0x0420 = PA
sts 0x0442,r16 ;0x0442 = PB

rjmp aj_p_fim



aj_p_fim:








;Adec 41f...400 -> 11f...100
ldi r31,0x04 ;0x041f = A fim = z
ldi r30,0x1f

ldi r29,0x01 ;0x011f = A' fim = y
ldi r28,0x1f
adec_copiando:
ld r16,z
st y,r16

dec r30
dec r28
cpi r28,0xff ;0xff = A ante-início
brne adec_copiando







;Dec32Bin14
;A decimal 11f...100  -> dec32bin14 -> 12d...120
rcall dec32bin14

;push 120...12d
lds r16,0x0120
push r16
lds r16,0x0121
push r16
lds r16,0x0122
push r16
lds r16,0x0123
push r16
lds r16,0x0124
push r16
lds r16,0x0125
push r16
lds r16,0x0126
push r16
lds r16,0x0127
push r16
lds r16,0x0128
push r16
lds r16,0x0129
push r16
lds r16,0x012a
push r16
lds r16,0x012b
push r16
lds r16,0x012c
push r16
lds r16,0x012d
push r16




;Bdec 441...422 -> 11f...100
ldi r31,0x04 ;0x0441 = B fim = z
ldi r30,0x41

ldi r29,0x01 ;0x011f = B' fim = y
ldi r28,0x1f
bdec_copiando:
ld r16,z
st y,r16

dec r30
dec r28
cpi r28,0xff ;0xff = B ante-início
brne bdec_copiando





;Dec32Bin14
;B decimal 11f...100  -> dec32bin14 -> 12d...120
rcall dec32bin14

;push 120...12d
lds r16,0x0120
push r16
lds r16,0x0121
push r16
lds r16,0x0122
push r16
lds r16,0x0123
push r16
lds r16,0x0124
push r16
lds r16,0x0125
push r16
lds r16,0x0126
push r16
lds r16,0x0127
push r16
lds r16,0x0128
push r16
lds r16,0x0129
push r16
lds r16,0x012a
push r16
lds r16,0x012b
push r16
lds r16,0x012c
push r16
lds r16,0x012d
push r16









;SOMA


;B pop 11c...10f
pop r16
sts 0x011c,r16
pop r16
sts 0x011b,r16
pop r16
sts 0x011a,r16
pop r16
sts 0x0119,r16
pop r16
sts 0x0118,r16
pop r16
sts 0x0117,r16
pop r16
sts 0x0116,r16
pop r16
sts 0x0115,r16
pop r16
sts 0x0114,r16
pop r16
sts 0x0113,r16
pop r16
sts 0x0112,r16
pop r16
sts 0x0111,r16
pop r16
sts 0x0110,r16
pop r16
sts 0x010f,r16




;A pop 10d...100
pop r16
sts 0x010d,r16
pop r16
sts 0x010c,r16
pop r16
sts 0x010b,r16
pop r16
sts 0x010a,r16
pop r16
sts 0x0109,r16
pop r16
sts 0x0108,r16
pop r16
sts 0x0107,r16
pop r16
sts 0x0106,r16
pop r16
sts 0x0105,r16
pop r16
sts 0x0104,r16
pop r16
sts 0x0103,r16
pop r16
sts 0x0102,r16
pop r16
sts 0x0101,r16
pop r16
sts 0x0100,r16











;Negativo    1 = neg
lds r16,0x0444 ;0x0444 = NGT
cpi r16,0
breq nao_negativo

lds r16,0x0421 ;0x0421 = SA
cpi r16,0
breq ngt_ap
rjmp ngt_an
ngt_ap:
lds r16,0x0443 ;0x0443 = SB
cpi r16,0
breq ngt_ap_bp
rjmp ngt_ap_bn
ngt_ap_bp:
ldi r17,0
ldi r16,1
sts 0x0421,r17 ;0x0421 = SA
sts 0x0443,r16 ;0x0443 = SB
rjmp ngt_fim
ngt_ap_bn:
ldi r17,0
ldi r16,0
sts 0x0421,r17 ;0x0421 = SA
sts 0x0443,r16 ;0x0443 = SB
rjmp ngt_fim

ngt_an:
lds r16,0x0443 ;0x0443 = SB
cpi r16,0
breq ngt_an_bp
rjmp ngt_an_bn
ngt_an_bp:
ldi r17,1
ldi r16,1
sts 0x0421,r17 ;0x0421 = SA
sts 0x0443,r16 ;0x0443 = SB
rjmp ngt_fim
ngt_an_bn:
ldi r17,1
ldi r16,0
sts 0x0421,r17 ;0x0421 = SA
sts 0x0443,r16 ;0x0443 = SB
rjmp ngt_fim

ngt_fim:
nao_negativo:







;copia sinal:
lds r16,0x0421 ;0x0421 = sa
sts 0x010e,r16 ;0x010e = sa soma
lds r16,0x0443 ;0x0443 = sb
sts 0x011d,r16 ;0x011d = sb soma







;SOMA
;|A| >= |B|
;|A| <  |B|
ldi r31,0x01 ;0x010d = a fim = z
ldi r30,0x0d
ldi r29,0x01 ;0x011c = b fim = y
ldi r28,0x1c

sm_a_b_comparando:
ld r17,z
ld r16,y

cp r17,r16
brlo sm_a_b_menor
breq sm_a_b_proximo
rjmp sm_a_b_maior

sm_a_b_proximo:
dec r30
dec r28
cpi r30,0xff ;0xff = a ante início
brne sm_a_b_comparando
rjmp sm_a_b_igual





sm_a_b_maior:
sm_a_b_igual:
lds r16,0x010e ;0x010e = sa
cpi r16,0
breq sm_a_b_mi_ap
rjmp sm_a_b_mi_an


sm_a_b_mi_ap:
lds r16,0x011d ;0x011d = sb
cpi r16,0
breq sm_a_b_mi_ap_bp
rjmp sm_a_b_mi_ap_bn
sm_a_b_mi_an:
lds r16,0x011d ;0x011d = sb
cpi r16,0
breq sm_a_b_mi_an_bp
rjmp sm_a_b_mi_an_bn


sm_a_b_mi_ap_bp:
rcall sm_a_mais_b
ldi r16,0
sts 0x010e,r16 ;0x010e = sa
rjmp sm_a_b_mi_fim
sm_a_b_mi_ap_bn:
rcall sm_a_menos_b
ldi r16,0
sts 0x010e,r16 ;0x010e = sa
rjmp sm_a_b_mi_fim

sm_a_b_mi_an_bp:
rcall sm_a_menos_b
ldi r16,1
sts 0x010e,r16 ;0x010e = sa
rjmp sm_a_b_mi_fim
sm_a_b_mi_an_bn:
rcall sm_a_mais_b
ldi r16,1
sts 0x010e,r16 ;0x010e = sa
rjmp sm_a_b_mi_fim

sm_a_b_mi_fim:
rjmp sm_a_b_fim






sm_a_b_menor:
lds r16,0x010e ;0x010e = sa
cpi r16,0
breq sm_a_b_m_ap
rjmp sm_a_b_m_an


sm_a_b_m_ap:
lds r16,0x011d ;0x011d = sb
cpi r16,0
breq sm_a_b_m_ap_bp
rjmp sm_a_b_m_ap_bn
sm_a_b_m_an:
lds r16,0x011d ;0x011d = sb
cpi r16,0
breq sm_a_b_m_an_bp
rjmp sm_a_b_m_an_bn


sm_a_b_m_ap_bp:
rcall sm_a_mais_b
ldi r16,0
sts 0x010e,r16 ;0x010e = sa
rjmp sm_a_b_m_fim
sm_a_b_m_ap_bn:
rcall sm_b_menos_a
ldi r16,1
sts 0x010e,r16 ;0x010e = sa
rjmp sm_a_b_m_fim

sm_a_b_m_an_bp:
rcall sm_b_menos_a
ldi r16,0
sts 0x010e,r16 ;0x010e = sa
rjmp sm_a_b_m_fim
sm_a_b_m_an_bn:
rcall sm_a_mais_b
ldi r16,1
sts 0x010e,r16 ;0x010e = sa
rjmp sm_a_b_m_fim

sm_a_b_m_fim:
sm_a_b_fim:






;retorna sinal:
lds r16,0x010e ;0x010e = sa soma
sts 0x0421,r16 ;0x0421 = sa






;Adec:10d...100 -> 14d...140

ldi r31,0x01 ;0x0100 = A0 = z
ldi r30,0x00
ldi r29,0x01 ;0x0140 = A0' = y
ldi r28,0x40
b_d_64_copiando:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0x0e ;0x0e = A depois fim
brne b_d_64_copiando

;zera resto
clr r16
b_d_64_zerando:
st y,r16
inc r28
cpi r28,0x5c ;0x5c = Abin depois fim
brne b_d_64_zerando






;BinDec64
rcall bindec64






;Erro 0x0446

;n = 3f
ldi r31,0x01 ;0x013f = Adec fim
ldi r30,0x3f

;An = 0 ?
erro_proximo:
ld r16,z
cpi r16,0 ;0
brne erro_nao_zero

;dec n
dec r30

;n = ff ?
cpi r30,0xff ;0xff = Adec ante-início
brne erro_proximo
rjmp sem_erro

;n >= p ?
erro_nao_zero:
lds r16,0x0420 ;0x0420 = P
cp r30,r16
brlo erro_p_n
rjmp erro_n_p

;n - p
erro_n_p:
sub r30,r16

;n > 31 ?
cpi r30,31 ;31
breq sem_erro
brlo sem_erro
rjmp com_erro

;p - n
erro_p_n:
sub r16,r30

;p > 31 ?
cpi r16,31 ;31
breq sem_erro
brlo sem_erro
rjmp com_erro

com_erro:
ldi r16,1 ;1 = 0x0446 = errado
sts 0x0446,r16
rjmp soma_finalizou

sem_erro:
ldi r16,0 ;0 = 0x0446 = certo
sts 0x0446,r16















;Converte A64 p/ A32

;UD
;n=3f
ldi r31,0x01 ;0x013f = Adec fim
ldi r30,0x3f
;An = 0 ?
ca_proximo:
ld r16,z
cpi r16,0
brne ca_nao_zero
;dec n
dec r30
;n = ff ?
cpi r30,0xff ;0xff = A ante-início
brne ca_proximo
rjmp ca_fim


ca_nao_zero:
lds r16,0x0420 ;0x0420 = P
;n >= p ?
cp r30,r16
brsh ca_ud_maior_igual
rjmp ca_ud_menor




;n' = n-(p)
ca_ud_maior_igual:
mov r18,r30
sub r18,r16
;c=0
clr r17
;push An
ca_ud_maior_igual_proximo:
ld r16,z
push r16
;dec n
dec r30
;inc c
inc r17
;c = 32 ?
cpi r17,32 ;32
breq ca_ud_maior_igual_copiou_32
;n = ff ?
cpi r30,0xff ;0xff = A ante-início
breq ca_ud_maior_igual_copiou

rjmp ca_ud_maior_igual_proximo


;copiou
ca_ud_maior_igual_copiou:
;c' = 32 - c
ldi r16,32 ;32
sub r16,r17
;n = 0
ldi r31,0x01 ;0x0100 = A0
ldi r30,0x00
clr r19
;c' = 0 ?
ca_ud_maior_igual_copiou_proximo:
cpi r16,0 ;0
breq ca_ud_maior_igual_colando
;An = 0
st z,r19
;dec c'
dec r16
;inc n
inc r30
rjmp ca_ud_maior_igual_copiou_proximo


;colando
;pop An
ca_ud_maior_igual_colando:
pop r16
st z,r16
;inc n
inc r30
;n = 20?
cpi r30,0x20 ;0x20 = A' depois fim
breq ca_ud_maior_igual_colou
rjmp ca_ud_maior_igual_colando

;P = 31 - n'
ca_ud_maior_igual_colou:
ldi r16,31 ;31
sub r16,r18
sts 0x0420,r16 ;0x0420 = P

rjmp ca_fim


;copiou32
;n = 0
ca_ud_maior_igual_copiou_32:
ldi r31,0x01 ;0x0100 = A0
ldi r30,0x00

;pop An
ca_ud_maior_igual_colando_32:
pop r16
st z,r16
;inc n
inc r30
;dec c
dec r17

breq ca_ud_maior_igual_colou_32
rjmp ca_ud_maior_igual_colando_32
ca_ud_maior_igual_colou_32:
clr r16
;An = 0
ca_ud_maior_igual_zerando:
st z,r16
;inc n
inc r30
;n = 40 ?
cpi r30,0x40 ;0x40 = A depois fim
brne ca_ud_maior_igual_zerando
;P = 31 - n'
ldi r16,31 ;31
sub r16,r18
sts 0x0420,r16 ;0x0420 = P

rjmp ca_fim






;n = (p)
ca_ud_menor:
ldi r31,0x01
mov r30,r16
;c = 0
clr r17
;push An
ca_ud_menor_proximo:
ld r16,z
push r16
;inc c
inc r17
;dec n
dec r30
;c = 32?
cpi r17,32 ;32
breq ca_ud_menor_copiou_32

cpi r30,0xff ;0xff = A ante-início
breq ca_ud_menor_copiou
rjmp ca_ud_menor_proximo

;copiou
ca_ud_menor_copiou:
;n' = 32 - c
ldi r16,32 ;32
sub r16,r17
;n = 0
ldi r31,0x01 ;0x0100 = A0
ldi r30,0x00
clr r18
;n' = 0 ?
ca_ud_menor_copiou_proximo:
cpi r16,0 ;0
breq ca_ud_menor_colando
;An = 0
st z,r18
;dec n'
dec r16
;inc n
inc r30
rjmp ca_ud_menor_copiou_proximo

;colando
;pop An
ca_ud_menor_colando:
pop r16
st z,r16
;inc n
inc r30
;n = 1f ?
cpi r30,0x1f ;0x1f = A' fim
breq ca_ud_menor_colou
rjmp ca_ud_menor_colando

;P = 31
ca_ud_menor_colou:
ldi r16,31 ;31
sts 0x0420,r16 ;0x0420 = P

rjmp ca_fim


;copiou32
;n = 0
ca_ud_menor_copiou_32:
ldi r31,0x01 ;0x0100 = A0
ldi r30,0x00
clr r16

;pop An
ca_ud_menor_colando_32:
pop r16
st z,r16
;inc n
inc r30
;n = 20 ?
cpi r30,0x20 ;0x20 = A' depois fim
breq ca_ud_menor_colou_32
rjmp ca_ud_menor_colando_32
ca_ud_menor_colou_32:
ldi r16,31 ;31
sts 0x0420,r16 ;0x0420 = P

rjmp ca_fim



ca_fim:





soma_finalizou:



ret














;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;Subrotinas










;//////////////////////////////////////////////////////////////////
;A + B
sm_a_mais_b:
ldi r31,0x01 ;0x0100 = a início = z
ldi r30,0x00
ldi r29,0x01 ;0x010f = b início = y
ldi r28,0x0f

in r16,sreg
andi r16,0xbe ;0xbe: t,c = 0
out sreg,r16

sm_a_mais_b_somando:
in r16,sreg
bld r16,0 ;t -> c
out sreg,r16

ld r17,z
ld r16,y
adc r17,r16
st z,r17

in r16,sreg
bst r16,0 ;0: c -> t

inc r30
inc r28

cpi r30,0x0e ;0x0e = a depois fim
brne sm_a_mais_b_somando

ret
;//////////////////////////////////////////////////////////////////










;//////////////////////////////////////////////////////////////////
;A - B
sm_a_menos_b:
ldi r31,0x01 ;0x0100 = a início = z
ldi r30,0x00
ldi r29,0x01 ;0x010f = b início = y
ldi r28,0x0f

in r16,sreg
andi r16,0xbe ;0xbe: t,c = 0
out sreg,r16

sm_a_menos_b_subtraindo:
in r16,sreg
bld r16,0 ;c -> t
out sreg,r16

ld r17,z
ld r16,y
sbc r17,r16
st z,r17

in r16,sreg
bst r16,0 ;0: c -> t

inc r30
inc r28

cpi r30,0x0e ;0x0e = a depois fim
brne sm_a_menos_b_subtraindo

ret
;//////////////////////////////////////////////////////////////////










;//////////////////////////////////////////////////////////////////
;B - A
sm_b_menos_a:
ldi r31,0x01 ;0x0100 = a início = z
ldi r30,0x00
ldi r29,0x01 ;0x010f = b início = y
ldi r28,0x0f

in r16,sreg
andi r16,0xbe ;0xbe = t,c = 0
out sreg,r16

sm_b_menos_a_subtraindo:
in r16,sreg
bld r16,0 ;0: t -> c
out sreg,r16

ld r17,z
ld r16,y
sbc r16,r17
st z,r16

in r16,sreg
bst r16,0 ;0: c -> t

inc r30
inc r28

cpi r30,0x0e ;0x0e = a depois fim
brne sm_b_menos_a_subtraindo

ret
;//////////////////////////////////////////////////////////////////











.org 0x3880






mul28bytescompleto:










;A = 0: 0
ldi r31,0x04 ;0x0400 = a inicio = z
ldi r30,0x00
a_0_verif:
ld r16,z
cpi r16,0
brne a_b_0_fim
inc r30
cpi r30,0x20 ;0x20: a depois fim
brne a_0_verif

;B = 0: 0
ldi r31,0x04 ;0x0422 = b inicio = z
ldi r30,0x22
b_0_verif:
ld r16,z
cpi r16,0
brne a_b_0_fim
inc r30
cpi r30,0x42 ;0x42: b depois fim
brne b_0_verif

a_b_zero:
;resultado
ldi r31,0x01 ;0x0120 = resultado início
ldi r30,0x20
clr r16
a_b_zerando:
st z,r16
inc r30
cpi r30,0x40 ;0x40 = depois fim
brne a_b_zerando
ldi r16,32 ;32 = sem ponto
sts 0x0420,r16 ;0x0420 = ponto
clr r16
sts 0x0421,r16 ;0x0421 = sinal
sts 0x0445,r16 ;0x0445 = erro
rjmp mul28bytescompletofim

a_b_0_fim:










;A desloca zeros à direita
;PA = 0 ?
pa_igual_0:
lds r16,0x0420 ;0x0420 = PA
cpi r16,0
breq a_desl_0_dir_fim
;A400 = 0 ?
lds r16,0x0400 ;0x0400 = A0
cpi r16,0
brne a_desl_0_dir_fim
;Adec / 10
ldi r31,0x04
ldi r30,0x00 ;0x0400 = A0 = z
a1dec_div_10_proximo:
inc r30
ld r16,z
dec r30
st z,r16
inc r30
cpi r30,0x1f ;0x1f = A fim
brne a1dec_div_10_proximo
clr r16
st z,r16
;dec PA
lds r16,0x0420 ;0x0420 = PA
dec r16
sts 0x0420,r16
rjmp pa_igual_0
a_desl_0_dir_fim:







;B desloca zeros à direita
;PB = 0 ?
pb_igual_0:
lds r16,0x0442 ;0x0442 = PB
cpi r16,0
breq b_desl_0_dir_fim
;B422 = 0 ?
lds r16,0x0422 ;0x0422 = B0
cpi r16,0
brne b_desl_0_dir_fim
;Bdec / 10
ldi r31,0x04
ldi r30,0x22 ;0x0422 = B0 = z
b1dec_div_10_proximo:
inc r30
ld r16,z
dec r30
st z,r16
inc r30
cpi r30,0x41 ;0x41 = B fim
brne b1dec_div_10_proximo
clr r16
st z,r16
;dec PB
lds r16,0x0442 ;0x0442 = PB
dec r16
sts 0x0442,r16
rjmp pb_igual_0
b_desl_0_dir_fim:







;copia A
ldi r31,0x04 ;0x0400 = A0
ldi r30,0x00

ldi r29,0x01 ;0x0100 = A0'
ldi r28,0x00

cp_a_copiando:
ld r16,z
st y,r16

inc r30
inc r28
cpi r30,0x20 ;0x20 = A depois fim
brne cp_a_copiando


rcall dec32bin14


lds r16,0x0120 ;push 120...12d
push r16
lds r16,0x0121
push r16
lds r16,0x0122
push r16
lds r16,0x0123
push r16
lds r16,0x0124
push r16
lds r16,0x0125
push r16
lds r16,0x0126
push r16
lds r16,0x0127
push r16
lds r16,0x0128
push r16
lds r16,0x0129
push r16
lds r16,0x012a
push r16
lds r16,0x012b
push r16
lds r16,0x012c
push r16
lds r16,0x012d
push r16



;copia B
ldi r31,0x04 ;0x0422 = B0
ldi r30,0x22

ldi r29,0x01 ;0x0100 = A0'
ldi r28,0x00

cp_b_copiando:
ld r16,z
st y,r16

inc r30
inc r28
cpi r30,0x42 ;0x42 = B depois fim
brne cp_b_copiando


rcall dec32bin14


lds r16,0x0120 ;push 120...12d
push r16
lds r16,0x0121
push r16
lds r16,0x0122
push r16
lds r16,0x0123
push r16
lds r16,0x0124
push r16
lds r16,0x0125
push r16
lds r16,0x0126
push r16
lds r16,0x0127
push r16
lds r16,0x0128
push r16
lds r16,0x0129
push r16
lds r16,0x012a
push r16
lds r16,0x012b
push r16
lds r16,0x012c
push r16
lds r16,0x012d
push r16






;000000000000000000000000000000000000000000000000000000000000000000







;B pop
pop r16 ;pop 11b...10e
sts 0x011b,r16
pop r16
sts 0x011a,r16
pop r16
sts 0x0119,r16
pop r16
sts 0x0118,r16
pop r16
sts 0x0117,r16
pop r16
sts 0x0116,r16
pop r16
sts 0x0115,r16
pop r16
sts 0x0114,r16
pop r16
sts 0x0113,r16
pop r16
sts 0x0112,r16
pop r16
sts 0x0111,r16
pop r16
sts 0x0110,r16
pop r16
sts 0x010f,r16
pop r16
sts 0x010e,r16




;A pop
pop r16 ;pop 10d...100
sts 0x010d,r16
pop r16
sts 0x010c,r16
pop r16
sts 0x010b,r16
pop r16
sts 0x010a,r16
pop r16
sts 0x0109,r16
pop r16
sts 0x0108,r16
pop r16
sts 0x0107,r16
pop r16
sts 0x0106,r16
pop r16
sts 0x0105,r16
pop r16
sts 0x0104,r16
pop r16
sts 0x0103,r16
pop r16
sts 0x0102,r16
pop r16
sts 0x0101,r16
pop r16
sts 0x0100,r16



;C 137...11c = 0
ldi r31,0x01 ;0x011c = C0
ldi r30,0x1c
clr r16
zerando_c137:
st z,r16
inc r30
cpi r30,0x38 ;0x38 = C depois fim
brne zerando_c137



;D 153...138 = 0
ldi r31,0x01 ;0x0138 = D0
ldi r30,0x38
clr r16
zerando_d153:
st z,r16
inc r30
cpi r30,0x54 ;0x54 = D depois fim
brne zerando_d153







;V
ldi r16,0x00 ;0x0154 = V
sts 0x0154,r16

;M100H
ldi r16,0x00 ;0x0155 = M100H
sts 0x0155,r16

;C1
ldi r16,0x00 ;0x0156 = C1
sts 0x0156,r16

;PA
lds r16,0x0420 ;PA: 420 -> 157
sts 0x0157,r16

;SA
lds r16,0x0421 ;SA: 421 -> 158
sts 0x0158,r16

;PB
lds r16,0x0442 ;PB: 442 -> 159
sts 0x0159,r16

;SB
lds r16,0x0443 ;SB: 443 -> 15a
sts 0x015a,r16

;PD
ldi r16,0x00 ;0x015b = PD
sts 0x015b,r16

;SD
ldi r16,0x00 ;0x015c = SD
sts 0x015c,r16






;Z
ldi r31,0x01 ;0x0100 = z
ldi r30,0x00

;Y
ldi r29,0x01 ;0x010e = y
ldi r28,0x0e

;X
ldi r27,0x01 ;0x011c = x
ldi r26,0x1c










inicio_m:

;An x Bn + V = V, Cn
ld r17,z
ld r16,y

clr r20
mul r17,r16
lds r17,0x0000 ;R0
lds r18,0x0001 ;R1
lds r19,0x0154 ;0x0154 = V
add r17,r19
adc r18,r20

sts 0x0154,r18 ;0x0154 = V = R1

;Cn = R0
st x,r17
;inc An
;inc Cn
inc r30
inc r26
;An = 0e ?
cpi r30,0x0e ;0x0e = a depois fim
breq cn_igual_v
rjmp inicio_m
;Cn = V
cn_igual_v:
lds r16,0x0154 ;0x0154 = V
st x,r16

;m100h = c1
m100h_c1:
lds r16,0x0156 ;0x0156 = c1
sts 0x0155,r16 ;0x0155 = m100h

;m100h = 0?
m100h_0:
lds r16,0x0155 ;0x0155 = m100h
cpi r16,0
breq d_mais_c

;C x 100h
push r27
push r26

ldi r27,0x01 ;0x0137 = c fim
ldi r26,0x37
deslocando:
dec r26
ld r16,x
inc r26
st x,r16
dec r26
cpi r26,0x1c ;0x1c = c início
brne deslocando
clr r16
st x,r16

pop r26
pop r27

;dec m100h
lds r16,0x0155 ;0x0155 = m100h
dec r16
sts 0x0155,r16
rjmp m100h_0


;D + C
d_mais_c:
push r31
push r30
push r29
push r28

ldi r31,0x01 ;0x011c = c início
ldi r30,0x1c
ldi r29,0x01 ;0x0138 = d início
ldi r28,0x38

in r16,sreg
andi r16,0xbe ;0xbe: zera t c
out sreg,r16

d_mais_c_somando:
ld r16,z
ld r17,y

in r18,sreg
bld r18,0 ;0 = c
out sreg,r18

adc r17,r16

in r18,sreg
bst r18,0 ;0: c -> t

st y,r17

inc r30
inc r28

cpi r30,0x38 ;0x38 = c depois fim
brne d_mais_c_somando


pop r28
pop r29
pop r30
pop r31



;zera inc
;A0
ldi r31,0x01 ;0x0100 = a início
ldi r30,0x00

;C = 0
push r31
push r30
clr r16
ldi r31,0x01 ;0x011c = c início
ldi r30,0x1c
zera_inc_zerando:
st z,r16
inc r30
cpi r30,0x38 ;0x38 = c depois fim
brne zera_inc_zerando
pop r30
pop r31

;C0
ldi r27,0x01 ;0x011c = c início
ldi r26,0x1c
;V=0
clr r16
sts 0x0154,r16 ;0x0154 = v
;inc C1
lds r16,0x0156 ;0x0156 = c1
inc r16
sts 0x0156,r16
;inc Bn
inc r28

;Bn = 1c?
cpi r28,0x1c ;0x1c = b depois fim
brne inicio_alcance



rjmp ponte1
inicio_alcance:
rjmp inicio_m
ponte1:




fim:



;soma pontos
lds r17,0x0157 ;0x0157 = pa
lds r16,0x0159 ;0x0159 = pb
add r17,r16
sts 0x015b,r17 ;0x015b = pd


;multiplica sinais
lds r17,0x0158 ;0x0158 = sa
cpi r17,0
breq s_ap
rjmp s_an
s_ap:
lds r16,0x015a ;0x015a = sb
cpi r16,0
breq s_ap_bp
rjmp s_ap_bn
s_an:
lds r16,0x015a ;0x015a = sb
cpi r16,0
breq s_an_bp
rjmp s_an_bn



s_ap_bp:
ldi r16,0
sts 0x015c,r16 ;0x015c = sd
rjmp s_fim
s_ap_bn:
ldi r16,1
sts 0x015c,r16 ;0x015c = sd
rjmp s_fim
s_an_bp:
ldi r16,1
sts 0x015c,r16 ;0x015c = sd
rjmp s_fim
s_an_bn:
ldi r16,0
sts 0x015c,r16 ;0x015c = sd
rjmp s_fim

s_fim:








;copia:
lds r16,0x015b ;0x015b = pd
sts 0x0420,r16 ;0x0420 = pa
lds r16,0x015c ;0x015c = sd
sts 0x0421,r16 ;0x0421 = sa







;0000000000000000000000000000000000000000000000000000000







;D:  153...138 -> 15b...140  copia resultado

ldi r31,0x01
ldi r30,0x38 ;0x0138 = D0
m28b_gravando:
ld r16,z
push r16
inc r30
cpi r30,0x54 ;0x54 = D depois fim
brne m28b_gravando


ldi r31,0x01 ;0x015b = Bbin fim
ldi r30,0x5b
m28b_copiando:
pop r16
st z,r16

dec r30
cpi r30,0x3f ;0x3f = Bbin ante-inicio
brne m28b_copiando

rcall bindec64





;UD
ldi r31,0x01 ;0x013f = Adec fim
ldi r30,0x3f
ud_deslocando:
ld r16,z
cpi r16,0
brne ud_deslocado
dec r30
cpi r30,0xff ;0xff = Adec ante_início
brne ud_deslocando
rjmp ud_zerado

ud_deslocado:
sts 0x0444,r30 ;0x0444 = UD

ud_zerado:






;erro
lds r17,0x0420 ;0x0420 = pd (pa)
lds r16,0x0444 ;0x0444 = ud

cp r16,r17
brsh erro_maior_igual
rjmp erro_menor

erro_maior_igual:
sub r16,r17
cpi r16,31 ;31
breq erro_desligado
brsh erro_ligado
rjmp erro_desligado

erro_menor:
sub r17,r16
cpi r17,31 ;31
breq erro_desligado
brsh erro_ligado
rjmp erro_desligado

erro_ligado:
ldi r16,1 ;1 = 0x0445 = erro
sts 0x0445,r16
rjmp erro_ligado_fim

erro_desligado:
ldi r16,0
sts 0x0445,r16

erro_fim:












;Ajusta A

;pd >= ud ?
lds r17,0x0420 ;0x0420 = pd (pa)
lds r16,0x0444 ;0x0444 = ud
cp r17,r16
brsh aj_a_pd_maior_igual
rjmp aj_a_pd_menor

;r16 = 63 - pd
aj_a_pd_maior_igual:
ldi r16,63 ;r16 = 63 - pd
sub r16,r17

;r16 = 0 ?
aj_a_pd_r16_0:
cpi r16,0 ;0
breq aj_a_pd_desloca_fim

;z = adecfim = 0x013f
ldi r31,0x01 ;0x013f = Adec fim = z
ldi r30,0x3f

;<- adec x 10
aj_a_pd_deslocando:
dec r30
ld r17,z
inc r30
st z,r17
dec r30
cpi r30,0x00 ;0x00 = Adec 0
brne aj_a_pd_deslocando
clr r17
st z,r17

;dec r16
dec r16
rjmp aj_a_pd_r16_0

;pd = 63
aj_a_pd_desloca_fim:
ldi r17,63 ;63
sts 0x0420,r17 ;0x0420 = pd
rjmp aj_a_pd_fim



;r17 = 63 - ud
aj_a_pd_menor:
ldi r17,63 ;r17 = 63 - ud
sub r17,r16

;r17 = 0 ?
aj_a_pd_r17_0:
cpi r17,0 ;0
breq aj_a_pd_fim

;z = adecfim = 0x013f
ldi r31,0x01 ;0x013f = Adec fim = z
ldi r30,0x3f

;<- adec x 10
aj_a_pd_deslocando_2:
dec r30
ld r16,z
inc r30
st z,r16
dec r30
cpi r30,0x00 ;0x00 = Adec 0
brne aj_a_pd_deslocando_2
clr r16
st z,r16

;inc pd
lds r16,0x0420 ;0x0420 = inc pd
inc r16
sts 0x0420,r16

;dec r17
dec r17
rjmp aj_a_pd_r17_0



aj_a_pd_fim:


;pd-32
lds r16,0x0420 ;0x0420 = pd
subi r16,32 ;-32
sts 0x0420,r16



erro_ligado_fim:




;0000000000000000000000000000000000000000000000000000000










mul28bytescompletofim:










ret











.org 0x34bf








div16bytescompleto:








;RP
ldi r16,0x00
sts 0x0460,r16
;RS
ldi r16,0x00
sts 0x0461,r16
;UD
ldi r16,0x00
sts 0x0462,r16
;C
ldi r16,0x00
sts 0x0463,r16
;E
ldi r16,0x00
sts 0x0464,r16






;Erro:


;A = 0?
ldi r31,0x04 ;0x0400 = A0 = z
ldi r30,0x00
a_igual_0_proximo:
ld r16,z
cpi r16,0
brne a_igual_0_sem_erro
inc r30
cpi r30,0x20 ;0x20 = A depois fim
brne a_igual_0_proximo
;erro
lds r16,0x0464 ;0x0464 = erro
sbr r16,0x01 ;0x01
sts 0x0464,r16
a_igual_0_sem_erro:




;B = 0?
ldi r31,0x04 ;0x0420 = B0 = z
ldi r30,0x20
b_igual_0_proximo:
ld r16,z
cpi r16,0
brne b_igual_0_sem_erro
inc r30
cpi r30,0x40 ;0x40 = B depois fim
brne b_igual_0_proximo
;erro
lds r16,0x0464 ;0x0464 = erro
sbr r16,0x02 ;0x02
sts 0x0464,r16
b_igual_0_sem_erro:



;Erro
;0x00c5:0x01: A   = 0  -> zero
; 0x02: B   = 0  -> infinito
; 0x03: A,B = 0  -> indefinido
;
lds r16,0x0464 ;0x0464 = erro
cpi r16,0 ;0
breq sem_erro_2
rjmp div_16_b_fim ;erro, vai p/ fim
sem_erro_2:









;A desloca zeros à direita
;AP = 0 ?
ap_igual_0:
lds r16,0x045c ;0x045c = AP
cpi r16,0
breq a_desl_0_dir_fim_2
;A400 = 0 ?
lds r16,0x0400 ;0x0400 = A0
cpi r16,0
brne a_desl_0_dir_fim_2
;A1dec / 10
ldi r31,0x04
ldi r30,0x00 ;0x0400 = A0 = z
a1dec_div_10_proximo_2:
inc r30
ld r16,z
dec r30
st z,r16
inc r30
cpi r30,0x1f ;0x1f = A fim
brne a1dec_div_10_proximo_2
clr r16
st z,r16
;dec AP
lds r16,0x045c ;0x045c = AP
dec r16
sts 0x045c,r16
rjmp ap_igual_0
a_desl_0_dir_fim_2:






;B desloca zeros à direita
;BP = 0 ?
bp_igual_0:
lds r16,0x045d ;0x045d = BP
cpi r16,0
breq b_desl_0_dir_fim_2
;B420 = 0 ?
lds r16,0x0420 ;0x0420 = B0
cpi r16,0
brne b_desl_0_dir_fim_2
;B1dec / 10
ldi r31,0x04
ldi r30,0x20 ;0x0420 = B0 = z
b1dec_div_10_proximo_2:
inc r30
ld r16,z
dec r30
st z,r16
inc r30
cpi r30,0x3f ;0x3f = B fim
brne b1dec_div_10_proximo_2
clr r16
st z,r16
;dec BP
lds r16,0x045d ;0x045d = BP
dec r16
sts 0x045d,r16
rjmp bp_igual_0
b_desl_0_dir_fim_2:







;Adec:41f...
ldi r31,0x04 ;0x0400 = Adec 0 = z
ldi r30,0x00
ldi r29,0x01 ;0x0100 = A0 =  y
ldi r28,0x00
adec41f_copiando:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0x20 ;0x20 = Adec depois fim
brne adec41f_copiando


call dec32bin14


;Abin:
ldi r31,0x01 ;0x0120 = resultado = z
ldi r30,0x20
ldi r29,0x04 ;0x0440 = Abin =  y
ldi r28,0x40
bbin_copiando:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0x2e ;0x2e = result. depois fim
brne bbin_copiando




;Bdec:43f...
ldi r31,0x04 ;0x0420 = Bdec 0 = z
ldi r30,0x20
ldi r29,0x01 ;0x0100 = B0 =  y
ldi r28,0x00
bdec43f_copiando:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0x40 ;0x40 = Bdec depois fim
brne bdec43f_copiando


call dec32bin14


;Bbin:
ldi r31,0x01 ;0x0120 = resultado = z
ldi r30,0x20
ldi r29,0x04 ;0x044e = Bbin =  y
ldi r28,0x4e
bbin_copiando_2:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0x2e ;0x2e = result. depois fim
brne bbin_copiando_2






;Abin:44d...
ldi r31,0x04 ;0x0440 = A14b 0 = z
ldi r30,0x40
ldi r29,0x01 ;0x0100 = A16b 0 = y
ldi r28,0x00
abin_44d_copiando:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0x4e ;0x4e = result. depois fim
brne abin_44d_copiando

ldi r31,0x01 ;0x010e = 0 = z
ldi r30,0x0e
clr r16
abin_44d_zerando:
st z,r16
inc r30
cpi r30,0x20 ;0x20: depois fim
brne abin_44d_zerando




;Bbin:45b...
ldi r31,0x04 ;0x044e = Bbin = z
ldi r30,0x4e
ldi r29,0x01 ;0x0120 = B =  y
ldi r28,0x20
abin_45b_copiando:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0x5c ;0x5c = Bbin depois fim
brne abin_45b_copiando

ldi r31,0x01 ;0x012e = 0 = z
ldi r30,0x2e
clr r16
abin_45b_zerando:
st z,r16
inc r30
cpi r30,0x40 ;0x40: depois fim
brne abin_45b_zerando









rcall div16bytes










;Calcula Ponto RP:
lds r17,0x045c ;0x045c = AP
lds r16,0x045d ;0x045d = BP
cp r17,r16
brsh ap_bp_maior_igual
rjmp ap_bp_menor

ap_bp_maior_igual:
;rp = (ap - bp) + c1
sub r17,r16
lds r16,0x01a1 ;0x01a1 = c1 = ponto
add r17,r16
sts 0x0460,r17 ;0x0460 = RP
rjmp ap_bp_fim

ap_bp_menor:
;rp = c1 - (bp - ap)
sub r16,r17
lds r17,0x01a1 ;0x01a1 = c1 = ponto
sub r17,r16
sts 0x0460,r17 ;0x0460 = RP
rjmp ap_bp_fim

ap_bp_fim:










;E:19f...
ldi r31,0x01 ;0x0180 = E0  =  z
ldi r30,0x80
ldi r29,0x01 ;0x014e = B0  =  y
ldi r28,0x4e
abin_b5_copiando_3:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0xa0 ;0xa0 = E depois fim
brne abin_b5_copiando_3






rcall bin32dec78












;-----------------------
;Ajusta A Fim


;A1n = 14d
ldi r31,0x01 ;0x014d = A1 = z
ldi r30,0x4d

;C = 0
clr r16
sts 0x0463,r16 ;0x0463 = C

;UD = 77
ldi r16,77 ;0x0462 = UD = 77
sts 0x0462,r16


;A1n = 0 ?
a1n_igual_0:
ld r16,z
cpi r16,0
brne ud_maior_igual_rp

;dec 1n
dec r30

;dec UD
lds r16,0x0462 ;0x0462 = UD
dec r16
sts 0x0462,r16

;1n = ff ?
cpi r30,0xff ;0xff = A1 ante-início
brne a1n_igual_0
rjmp aj_a_fim



;UD >= RP ?
ud_maior_igual_rp:
lds r17,0x0462 ;0x0462 = UD
lds r16,0x0460 ;0x0460 = RP
cp r17,r16
brlo rp_maior_igual_78


;UD' = UD - RP
lds r17,0x0462 ;0x0462 = UD
lds r16,0x0460 ;0x0460 = RP
sub r17,r16 ;r17 = UD - RP


;UD' >= 32 ?
cpi r17,32 ;32d
brlo    ud_menos_rp_certo
rjmp ud_menos_rp_errado
ud_menos_rp_certo:
ldi r16,0 ;0 = 0x0464 = erro
sts 0x0464,r16
rjmp ud_menos_rp_fim

;erro = 4
ud_menos_rp_errado:
ldi r16,4 ;4 = 0x0464 = erro
sts 0x0464,r16
rjmp div_16_b_fim

ud_menos_rp_fim:



;UD < 31 ?
lds r17,0x0462 ;0x0462 = UD
cpi r17,31 ;31, R17 = UD'
brlo push_a1n


;UD - RP
lds r16,0x0460 ;0x0460 = RP
sub r17,r16


;RP = 31 - UD
ldi r16,31 ;31
sub r16,r17 ;r17 = UD
sts 0x0460,r16 ;0x0460 = RP
rjmp push_a1n


;push A1n
push_a1n:
ld r16,z
push r16

;inc C
lds r16,0x0463 ;0x0463 = C
inc r16
sts 0x0463,r16


;C = 32?
cpi r16,32 ;32
breq a2n_igual_100

;dec 1n
dec r30

;A1n = ff?
cpi r30,0xff ;0xff = A1 ante-inicio
breq a2n_igual_100


rjmp push_a1n



;RP >= 78 ?
rp_maior_igual_78:
lds r16,0x0460 ;0x0460 = RP
cpi r16,78 ;78
brsh dec_rp
rjmp rp_igual_77

;dec RP
dec_rp:
dec r16
sts 0x0460,r16 ;0x0460 = RP




;A1 / 10
ldi r27,0x01 ;0x0100 = A0 = x
ldi r26,0x00
a1_div_10_proximo:
inc r26
ld r16,x
dec r26
st x,r16
inc r26
cpi r26,0x4d ;0x4d = A fim
brne a1_div_10_proximo
clr r16
st x,r16

rjmp rp_maior_igual_78







;RP = 77 ?
rp_igual_77:
lds r16,0x0460 ;0x0460 = RP
cpi r16,77 ;77
breq a1n_igual_14d

;inc RP
inc r16
sts 0x0460,r16 ;0x0460 = RP

;A1 x 10
ldi r27,0x01 ;0x014d = A1 fim = x
ldi r26,0x4d
a1_x_10_proximo:
dec r26
ld r16,x
inc r26
st x,r16
dec r26
cpi r26,0x00 ;0x00 = A1 inicio
brne a1_x_10_proximo
clr r16
st x,r16

rjmp rp_igual_77



;A1n = 14d
a1n_igual_14d:
ldi r30,0x4d ;0x4d = A1 fim

;RP = 31
ldi r16,31 ;31
sts 0x0460,r16 ;0x0460 = RP

rjmp push_a1n



;A2n = 100
a2n_igual_100:
ldi r29,0x01 ;0x0100 = A2n = y
ldi r28,0x00

;pop A2n
pop_a2n:
pop r16
st y,r16

;inc 2n
inc r28

;dec C
lds r16,0x0463 ;0x0463 = C
dec r16
sts 0x0463,r16

;C = 0 ?
cpi r16,0
brne pop_a2n


;Fim
aj_a_fim:

;-----------------------













;Sinais
lds r17,0x045e ;0x045e = AS
cpi r17,0
breq s_ap_2
rjmp s_an_2
s_ap_2:
lds r16,0x045f ;0x045f = BS
cpi r16,0
breq s_ap_bp_2
rjmp s_ap_bn_2
s_an_2:
lds r16,0x045f ;0x045f = BS
cpi r16,0
breq s_an_bp_2
rjmp s_an_bn_2


s_ap_bp_2:
ldi r16,0
sts 0x0461,r16 ;0x0461 = RS
rjmp s_fim_2
s_ap_bn_2:
ldi r16,1
sts 0x0461,r16 ;0x0461 = RS
rjmp s_fim_2
s_an_bp_2:
ldi r16,1
sts 0x0461,r16 ;0x0461 = RS
rjmp s_fim_2
s_an_bn_2:
ldi r16,0
sts 0x0461,r16 ;0x0461 = RS
rjmp s_fim_2

s_fim_2:








;Erro zero sinal negativo
ldi r31,0x01 ;0x0100 = Adec0 = z
ldi r30,0x00
erro_sinal_proximo:
ld r16,z
cpi r16,0 ;0
brne erro_sinal_fim
inc r30
cpi r30,0x20 ;0x20 = A depois fim
brne erro_sinal_proximo
clr r16 ;0x0461 = RS
sts 0x0461,r16
erro_sinal_fim:









div_16_b_fim:



ret














;////////////////////////////////////////////////////////////////////
;Subrotinas:










;////////////////////////////////////////////////////////////////////
div16bytes:



;Vai
ldi r16,0x00
sts 0x01a0,r16
;C1
ldi r16,0x00
sts 0x01a1,r16
;C2
ldi r16,0x00
sts 0x01a2,r16









;A x Ah
a_x_ah_calculando:

;zera C
ldi r31,0x01 ;0x0140 = C
ldi r30,0x40
clr r16
a_x_ah_zera_c:
st z,r16
inc r30
cpi r30,0x60 ;0x60 = C depois fim
brne a_x_ah_zera_c

; A x Ah
ldi r31,0x01 ;0x0100 = A = z
ldi r30,0x00
ldi r29,0x01 ;0x0140 = C = y
ldi r28,0x40
clr r16
sts 0x01a0,r16 ;0x01a0 = Vai

a_x_ah_multiplicando:
lds r18,0x01a0 ;0x01a0 = Vai
ldi r17,0x0a ;0x0a = mult
ld r16,z
mul r16,r17
lds r16,0x0000 ;0x0001 0x0000 = R1 R0 = resultado
lds r17,0x0001
clr r19
add r16,r18
adc r17,r19

st y,r16 ;C
sts 0x01a0,r17 ;0x01a0 = Vai

cpi r17,0 ;Vai nao zero, transbordou? 
brne a_x_ah_verif_a10f
rjmp a_x_ah_ponte_1
a_x_ah_verif_a10f:
lds r16,0x011f ;0x011f = A11f = último
cpi r16,0
brne a_x_ah_transbordou
a_x_ah_ponte_1:

inc r30 ;A
inc r28 ;C
cpi r30,0x20 ;0x20 = A depois fim
brne a_x_ah_multiplicando

;A = C
ldi r31,0x01 ;0x0100 = A = z
ldi r30,0x00
ldi r29,0x01 ;0x0140 = C = y
ldi r28,0x40
a_x_ah_copiando:
ld r16,y
st z,r16
inc r30
inc r28
cpi r30,0x20 ;0x20 = A depois fim
brne a_x_ah_copiando




;Inc C1
lds r16,0x01a1 ;0x01a1 = Inc C1
inc r16
sts 0x01a1,r16


rjmp a_x_ah_calculando







a_x_ah_transbordou:










;D = B
ldi r31,0x01 ;0x0120 = z = B
ldi r30,0x20
ldi r29,0x01 ;0x0160 = y = D
ldi r28,0x60
d_b_copiando:
ld r16,z
st y,r16
inc r30
inc r28
cpi r30,0x40 ;0x40 = B depois fim
brne d_b_copiando




;E = 0
ldi r31,0x01 ;0x0180 = E = z
ldi r30,0x80
clr r16
zerando_e:
st z,r16
inc r30
cpi r30,0xa0 ;0xa0 = E depois fim
brne zerando_e








;C2 = 0
clr r16 ;0x01a2 = C2
sts 0x01a2,r16







;Comp A B
compara_a_b:
rcall comp_a_b

cpi r16,1
breq a_menos_b
cpi r16,2
breq bu_igual_0
rjmp b_div_2




;Bit último = 0?
bu_igual_0:
lds r16,0x013f ;0x013f = B último byte
sbrs r16,7 ;7 = último bit
rjmp b_vezes_2
rjmp a_menos_b





;B x 2
b_vezes_2:
ldi r31,0x01 ;0x013f = B último byte = z
ldi r30,0x3f
b_vezes_2_multiplicando:
ld r16,z
lsl r16
dec r30
ld r17,z
inc r30
bst r17,7
bld r16,0
st z,r16
dec r30
cpi r30,0x20 ;0x20 = primeiro byte
brne b_vezes_2_multiplicando
lsl r17
st z,r17

;Inc C2
lds r16,0x01a2 ;0x01a2 = C2
inc r16
sts 0x01a2,r16
rjmp compara_a_b





;B / 2
b_div_2:
ldi r31,0x01 ;0x0120 = B primeiro byte = z
ldi r30,0x20
b_div_2_dividindo:
ld r16,z
lsr r16
inc r30
ld r17,z
dec r30
bst r17,0
bld r16,7
st z,r16
inc r30
cpi r30,0x3f ;0x3f = último byte
brne b_div_2_dividindo
lsr r17
st z,r17


;Dec C2
lds r16,0x01a2 ;0x01a2 = C2
dec r16
sts 0x01a2,r16





;A - B
a_menos_b:
ldi r31,0x01 ;0x0100 = A = z
ldi r30,0x00

ldi r29,0x01 ;0x0120 = B = y
ldi r28,0x20

clc ;sreg c = 0
clt ;sreg,t = 0

a_menos_b_subtraindo:
in r18,sreg ;t -> c
bld r18,0
out sreg,r18

ld r17,z ;A
ld r16,y ;B
sbc r17,r16 ;A - B
st z,r17

in r18,sreg ;c -> t
bst r18,0

inc r30 ;A
inc r28 ;B
cpi r30,0x20 ;0x20 = A depois fim
brne a_menos_b_subtraindo



;C2 = 0 ?
lds r16,0x01a2 ;0x01a2 = C2
cpi r16,0
breq b_igual_d





;C = 2
ldi r31,0x01 ;0x0140 = C = z
ldi r30,0x40
clr r16
zerando_c_2:
st z,r16
inc r30
cpi r30,0x60 ;0x60 = C depois fim
brne zerando_c_2
ldi r16,2 ;2
sts 0x0140,r16 ;0x0140 = C inicio




;Dec C2
dec_c2:
lds r16,0x01a2 ;0x01a2 = C2
dec r16
sts 0x01a2,r16





;C2 = 0 ?
lds r16,0x01a2 ;0x01a2 = C2
cpi r16,0
breq e_mais_c





;C x 2
c_vezes_2:
ldi r31,0x01 ;0x015f = C último byte = z
ldi r30,0x5f
c_vezes_2_multiplicando:
ld r16,z
lsl r16
dec r30
ld r17,z
inc r30
bst r17,7
bld r16,0
st z,r16
dec r30
cpi r30,0x40 ;0x40 = primeiro byte
brne c_vezes_2_multiplicando
lsl r17
st z,r17
rjmp dec_c2








;E + C
e_mais_c:
ldi r31,0x01 ;0x0180 = E = z
ldi r30,0x80

ldi r29,0x01 ;0x0140 = C = y
ldi r28,0x40

clc ;sreg c = 0
clt ;sreg,t = 0

e_mais_c_somando:
in r18,sreg ;t -> c
bld r18,0
out sreg,r18

ld r17,z ;E
ld r16,y ;C
adc r17,r16 ;E + C
st z,r17

in r18,sreg ;c -> t
bst r18,0

inc r30 ;E
inc r28 ;C
cpi r30,0xa0 ;0xa0 = E depois fim
brne e_mais_c_somando





;B = D
b_igual_d:
ldi r31,0x01 ;0x0120 = z = B
ldi r30,0x20
ldi r29,0x01 ;0x0160 = y = D
ldi r28,0x60
b_d_copiando:
ld r16,y
st z,r16
inc r30
inc r28
cpi r30,0x40 ;0x40 = B depois fim
brne b_d_copiando




;C2 = 0
clr r16
sts 0x01a2,r16 ;0x01a2 = C2




;A >= B ?
rcall comp_a_b
cpi r16,0 ;0
breq div16_fim
rjmp compara_a_b









div16_fim:



ret

;////////////////////////////////////////////////////////////////////










;////////////////////////////////////////////////////////////////////
;Comp A B
comp_a_b:
ldi r31,0x01 ;0x011f = A ultimo = z
ldi r30,0x1f
ldi r29,0x01 ;0x013f = B ultimo = y
ldi r28,0x3f

comp_a_b_comparando:
ld r17,z
ld r16,y

cp r17,r16
breq comp_a_b_igual_proximo
brsh comp_a_b_maior
rjmp comp_a_b_menor

comp_a_b_igual_proximo:
dec r30
dec r28
cpi r30,0xff ;0xff = A ante-inicio
breq comp_a_b_igual
rjmp comp_a_b_comparando

comp_a_b_maior:
ldi r16,2 ;2 = maior
rjmp comp_a_b_fim
comp_a_b_igual:
ldi r16,1 ;1 = igual
rjmp comp_a_b_fim
comp_a_b_menor:
ldi r16,0 ;0 = menor

comp_a_b_fim:

ret


;////////////////////////////////////////////////////////////////////










;////////////////////////////////////////////////////////////////////
bin32dec78:





;A decimal
ldi r31,0x01 ;0x0100 = A0
ldi r30,0x00
clr r16
b3278_zerando_a:
st z,r16
inc r30
cpi r30,0x4e ;0x4e = A depois fim
brne b3278_zerando_a




;C decimal
ldi r31,0x01 ;0x016e = C0
ldi r30,0x6e
clr r16
b3278_zerando_c:
st z,r16
inc r30
cpi r30,0xbc ;0xbc = C depois fim
brne b3278_zerando_c

ldi r30,0x6e ;0x6e = C0 = 1
ldi r16,1 ;1
st z,r16








;C1
ldi r16,0x00 ;0x01bd 0x01bc = C1 = 0
sts 0x01bc,r16
sts 0x01bd,r16


;V
ldi r16,0x00 ;0x01be = V = 0
sts 0x01be,r16





b3278_proximo:
clr r16 ;0x01be = V = 0
sts 0x01be,r16

ldi r31,0x01 ;0x0100 = A0 = z
ldi r30,0x00

ldi r29,0x01 ;0x016e = C0 = y
ldi r28,0x6e




;B0 = 1?
lds r16,0x014e ;0x014e = B0
sbrs r16,0 ;0
rjmp b3278_pulasoma



;A + C
b3278_somando:
lds r18,0x01be ;0x01be = V
ld r17,z
ld r16,y
add r17,r16 ;A0 + C0
add r17,r18 ;+ V
cpi r17,10 ;10 < vai
brlo b3278_somou
subi r17,10 ;10 = menos 10 
st z,r17
ldi r18,1 ;1 = vai 1
sts 0x01be,r18 ;0x01be = V
rjmp b3278_somou_vai_1
b3278_somou:
st z,r17
ldi r18,0 ;0
sts 0x01be,r18 ;0x01be = V = 0
b3278_somou_vai_1:
inc r30
inc r28
cpi r30,0x4e ;0x4e = A depois fim
brne b3278_somando




;Cont x 2 Dec
b3278_pulasoma:
push r31 ;z
push r30
ldi r31,0x01 ;0x016e = C0
ldi r30,0x6e
ldi r17,2 ;2
ldi r18,0 ;0
b3278_multiplicando:
ld r16,z
mul r16,r17 ;x 2
lds r16,0x0000 ;0x0000 = R0
add r16,r18 ;+ r18 = vai
cpi r16,10 ;10 < vai
brlo b3278_mult_menor_10
subi r16,10 ;10 = menos 10
st z,r16
ldi r18,1 ;1 = vai
rjmp b3278_mult_prox
b3278_mult_menor_10:
st z,r16
ldi r18,0 ;0
b3278_mult_prox:
inc r30
cpi r30,0xbc ;0xbc = C depois fim
brne b3278_multiplicando
pop r30 ;z
pop r31




;B / 2 bin
push r31 ;z
push r30

ldi r31,0x01 ;0x014e = B0
ldi r30,0x4e

b3278_b_2_dividindo:
ld r16,z ;r17 r16
inc r30
ld r17,z
dec r30

lsr r16 ;r16->1bit   =   r16/2
bst r17,0 ;r17,b0  ->  r16,b7
bld r16,7

st z,r16

inc r30

cpi r30,0x6d ;0x6d = B fim
brne b3278_b_2_dividindo

ld r16,z ;B fim / 2
lsr r16
st z,r16

pop r30 ;z
pop r31







;Inc C1
lds r16,0x01bc ;0x01bc = C1 baixo
inc r16
sts 0x01bc,r16
breq b3278_inc_c1_alto
rjmp b3278_inc_c1_fim
b3278_inc_c1_alto:
lds r16,0x01bd ;0x01bd = C1 alto
inc r16
sts 0x01bd,r16
b3278_inc_c1_fim:




;C1 = 256 ?
lds r16,0x01bd ;0x01bd = C1 alto
cpi r16,1 ;1:0x100h = 256: 32bytes x8 bits=256 bits
breq b3278_soma_fim
rjmp b3278_proximo




;Fim
b3278_soma_fim:



ret



;////////////////////////////////////////////////////////////////////













.include<m8def.inc>

;fuse high 0xd9
;fuse low 0xe1



;endereço do módulo: twar=0x02=endereço 1  ->  b6 b5 b4 b3 b2 b1 b0 x
;módulo 1: 0x02
;módulo 2: 0x04
;módulo 3: 0x06
;módulo 4: 0x08
#define ENDERECO 0x02







.org 0x000
rjmp INICIO

.org 0x003
rjmp TCC2COMP









TCC2COMP: ;1,024ms
push r16
in r16,sreg
push r16



lds r16,0x0069 ;0x0069 = contador display
inc r16
sts 0x0069,r16


pop r16
out sreg,r16
pop r16
reti











INICIO:
ldi r16,0x04 ;stack pointer = 0x045f
out sph,r16
ldi r16,0x5f
out spl,r16
sbi ddrc,0 ;saídas
sbi ddrc,1
sbi ddrc,2
sbi ddrc,3
sbi ddrb,0
sbi ddrb,1
sbi ddrb,2
sbi ddrb,3
sbi ddrb,4
sbi ddrb,5
sbi ddrb,6
sbi ddrb,7
sbi ddrd,4
sbi ddrd,5
sbi ddrd,6
sbi ddrd,7

ldi r16,0x0e ;0x0e = clk / 256,ctc
out tccr2,r16
ldi r16,0x80 ;0x80 = int match ocr2
out timsk,r16

ldi r16,0x04 ;(1/1MHz) * 256 * 0x04 = 1,024ms
out ocr2,r16



;Variáveis:
ldi r16,0x00 ;0x0060 = dígito 0
sts 0x0060,r16
ldi r16,0x00 ;0x0061 = dígito 1
sts 0x0061,r16
ldi r16,0x00 ;0x0062 = dígito 2
sts 0x0062,r16
ldi r16,0x00 ;0x0063 = dígito 3
sts 0x0063,r16
ldi r16,0x00 ;0x0064 = dígito 4
sts 0x0064,r16
ldi r16,0x00 ;0x0065 = dígito 5
sts 0x0065,r16
ldi r16,0x00 ;0x0066 = dígito 6
sts 0x0066,r16
ldi r16,0x00 ;0x0067 = dígito 7
sts 0x0067,r16

ldi r16,0x08 ;0x0068 = ponto: 7...0 = display 7...0
sts 0x0068,r16 ;0x08 = apagado

ldi r16,0x00 ;0x0069 = contador display
sts 0x0069,r16
ldi r16,0x00 ;0x006a = maquina de estados do display
sts 0x006a,r16


ldi r16,0x00 ;0x006b = caracteres estado
sts 0x006b,r16
ldi r16,0x00 ;0x006d = twi recebe byte estado
sts 0x006d,r16
ldi r16,0x00 ;0x006e = flags
sts 0x006e,r16 ;b0 = recebeu byte

ldi r16,0x00 ;0x006f = byte recebido
sts 0x006f,r16





sei ;liga ints




















;////////////////////////////////////////////////////////////////////////////
processamento:
;////////////////////////////////////////////////////////////////////////////








;----------------------------------------------------------------------------
;varredura display
lds r16,0x0069 ;0x0069 = contador display
cpi r16,2 ;2 = 2ms
brlo v_d_fim_alcance
clr r16 ;zera contador
sts 0x0069,r16

rjmp v_d_ponte
v_d_fim_alcance:
rjmp v_d_fim
v_d_ponte:



;muda de estado
lds r16,0x006a ;0x006a = maquina de estados do display
inc r16
cpi r16,8 ;8 = depois do último estado
breq v_d_mq_inc_fim
rjmp v_d_mq_inc
v_d_mq_inc_fim:
clr r16
v_d_mq_inc:
sts 0x006a,r16 ;0x006a = maquina de estados do display



lds r16,0x006a ;0x006a = maquina de estados do display
cpi r16,0
breq v_d_mq_0_alcance
cpi r16,1
breq v_d_mq_1_alcance
cpi r16,2
breq v_d_mq_2_alcance
cpi r16,3
breq v_d_mq_3_alcance
cpi r16,4
breq v_d_mq_4_alcance
cpi r16,5
breq v_d_mq_5_alcance
cpi r16,6
breq v_d_mq_6_alcance
cpi r16,7
breq v_d_mq_7_alcance

v_d_mq_0_alcance:
rjmp v_d_mq_0
v_d_mq_1_alcance:
rjmp v_d_mq_1
v_d_mq_2_alcance:
rjmp v_d_mq_2
v_d_mq_3_alcance:
rjmp v_d_mq_3
v_d_mq_4_alcance:
rjmp v_d_mq_4
v_d_mq_5_alcance:
rjmp v_d_mq_5
v_d_mq_6_alcance:
rjmp v_d_mq_6
v_d_mq_7_alcance:
rjmp v_d_mq_7



v_d_mq_0:
cbi portb,0 ;l6
cbi portb,1 ;l7
cbi portb,6 ;l1
cbi portb,7 ;l2
sbi portd,4 ;l0
cbi portd,5 ;l3
cbi portd,6 ;l4
cbi portd,7 ;l5

lds r16,0x0060 ;0x0060 = dígito 0
rcall v_d_mq_segmentos

lds r16,0x0068 ;0x0068 = ponto
cpi r16,0x00 ;0x00 = ponto display 0
breq v_d_mq_0_ponto
rjmp v_d_mq_0_sem_ponto
v_d_mq_0_ponto:
sbi portb,2 ;seta ponto
rjmp v_d_mq_0_ponte
v_d_mq_0_sem_ponto:
cbi portb,2 ;zera ponto
v_d_mq_0_ponte:
rjmp v_d_mq_fim



v_d_mq_1:
cbi portb,0 ;l6
cbi portb,1 ;l7
sbi portb,6 ;l1
cbi portb,7 ;l2
cbi portd,4 ;l0
cbi portd,5 ;l3
cbi portd,6 ;l4
cbi portd,7 ;l5

lds r16,0x0061 ;0x0061 = dígito 1
rcall v_d_mq_segmentos

lds r16,0x0068 ;0x0068 = ponto
cpi r16,0x01 ;0x01 = ponto display 1
breq v_d_mq_1_ponto
rjmp v_d_mq_1_sem_ponto
v_d_mq_1_ponto:
sbi portb,2 ;seta ponto
rjmp v_d_mq_1_ponte
v_d_mq_1_sem_ponto:
cbi portb,2 ;zera ponto
v_d_mq_1_ponte:
rjmp v_d_mq_fim



v_d_mq_2:
cbi portb,0 ;l6
cbi portb,1 ;l7
cbi portb,6 ;l1
sbi portb,7 ;l2
cbi portd,4 ;l0
cbi portd,5 ;l3
cbi portd,6 ;l4
cbi portd,7 ;l5

lds r16,0x0062 ;0x0062 = dígito 2
rcall v_d_mq_segmentos

lds r16,0x0068 ;0x0068 = ponto
cpi r16,0x02 ;0x02 = ponto display 2
breq v_d_mq_2_ponto
rjmp v_d_mq_2_sem_ponto
v_d_mq_2_ponto:
sbi portb,2 ;seta ponto
rjmp v_d_mq_2_ponte
v_d_mq_2_sem_ponto:
cbi portb,2 ;zera ponto
v_d_mq_2_ponte:
rjmp v_d_mq_fim



v_d_mq_3:
cbi portb,0 ;l6
cbi portb,1 ;l7
cbi portb,6 ;l1
cbi portb,7 ;l2
cbi portd,4 ;l0
sbi portd,5 ;l3
cbi portd,6 ;l4
cbi portd,7 ;l5

lds r16,0x0063 ;0x0063 = dígito 3
rcall v_d_mq_segmentos

lds r16,0x0068 ;0x0068 = ponto
cpi r16,0x03 ;0x03 = ponto display 3
breq v_d_mq_3_ponto
rjmp v_d_mq_3_sem_ponto
v_d_mq_3_ponto:
sbi portb,2 ;seta ponto
rjmp v_d_mq_3_ponte
v_d_mq_3_sem_ponto:
cbi portb,2 ;zera ponto
v_d_mq_3_ponte:
rjmp v_d_mq_fim



v_d_mq_4:
cbi portb,0 ;l6
cbi portb,1 ;l7
cbi portb,6 ;l1
cbi portb,7 ;l2
cbi portd,4 ;l0
cbi portd,5 ;l3
sbi portd,6 ;l4
cbi portd,7 ;l5

lds r16,0x0064 ;0x0064 = dígito 4
rcall v_d_mq_segmentos

lds r16,0x0068 ;0x0068 = ponto
cpi r16,0x04 ;0x04 = ponto display 4
breq v_d_mq_4_ponto
rjmp v_d_mq_4_sem_ponto
v_d_mq_4_ponto:
sbi portb,2 ;seta ponto
rjmp v_d_mq_4_ponte
v_d_mq_4_sem_ponto:
cbi portb,2 ;zera ponto
v_d_mq_4_ponte:
rjmp v_d_mq_fim



v_d_mq_5:
cbi portb,0 ;l6
cbi portb,1 ;l7
cbi portb,6 ;l1
cbi portb,7 ;l2
cbi portd,4 ;l0
cbi portd,5 ;l3
cbi portd,6 ;l4
sbi portd,7 ;l5

lds r16,0x0065 ;0x0065 = dígito 5
rcall v_d_mq_segmentos

lds r16,0x0068 ;0x0068 = ponto
cpi r16,0x05 ;0x05 = ponto display 5
breq v_d_mq_5_ponto
rjmp v_d_mq_5_sem_ponto
v_d_mq_5_ponto:
sbi portb,2 ;seta ponto
rjmp v_d_mq_5_ponte
v_d_mq_5_sem_ponto:
cbi portb,2 ;zera ponto
v_d_mq_5_ponte:
rjmp v_d_mq_fim



v_d_mq_6:
sbi portb,0 ;l6
cbi portb,1 ;l7
cbi portb,6 ;l1
cbi portb,7 ;l2
cbi portd,4 ;l0
cbi portd,5 ;l3
cbi portd,6 ;l4
cbi portd,7 ;l5

lds r16,0x0066 ;0x0066 = dígito 6
rcall v_d_mq_segmentos

lds r16,0x0068 ;0x0068 = ponto
cpi r16,0x06 ;0x06 = ponto display 6
breq v_d_mq_6_ponto
rjmp v_d_mq_6_sem_ponto
v_d_mq_6_ponto:
sbi portb,2 ;seta ponto
rjmp v_d_mq_6_ponte
v_d_mq_6_sem_ponto:
cbi portb,2 ;zera ponto
v_d_mq_6_ponte:
rjmp v_d_mq_fim



v_d_mq_7:
cbi portb,0 ;l6
sbi portb,1 ;l7
cbi portb,6 ;l1
cbi portb,7 ;l2
cbi portd,4 ;l0
cbi portd,5 ;l3
cbi portd,6 ;l4
cbi portd,7 ;l5

lds r16,0x0067 ;0x0067 = dígito 7
rcall v_d_mq_segmentos

lds r16,0x0068 ;0x0068 = ponto
cpi r16,0x07 ;0x07 = ponto display 7
breq v_d_mq_7_ponto
rjmp v_d_mq_7_sem_ponto
v_d_mq_7_ponto:
sbi portb,2 ;seta ponto
rjmp v_d_mq_7_ponte
v_d_mq_7_sem_ponto:
cbi portb,2 ;zera ponto
v_d_mq_7_ponte:
rjmp v_d_mq_fim



v_d_mq_fim:
rjmp v_d_fim



;-----------------
;subrotinas display
v_d_mq_segmentos:
cpi r16,0x00
breq v_d_mq_00_alcance
cpi r16,0x01
breq v_d_mq_01_alcance
cpi r16,0x02
breq v_d_mq_02_alcance
cpi r16,0x03
breq v_d_mq_03_alcance
cpi r16,0x04
breq v_d_mq_04_alcance
cpi r16,0x05
breq v_d_mq_05_alcance
cpi r16,0x06
breq v_d_mq_06_alcance
cpi r16,0x07
breq v_d_mq_07_alcance
cpi r16,0x08
breq v_d_mq_08_alcance
cpi r16,0x09
breq v_d_mq_09_alcance
cpi r16,0x0a
breq v_d_mq_0a_alcance
cpi r16,0x0b
breq v_d_mq_0b_alcance
cpi r16,0x0c
breq v_d_mq_0c_alcance
cpi r16,0x0c
breq v_d_mq_0d_alcance
cpi r16,0x0e
breq v_d_mq_0e_alcance
cpi r16,0x0f
breq v_d_mq_0f_alcance
cpi r16,0x10
breq v_d_mq_10_alcance

v_d_mq_00_alcance:
rjmp v_d_mq_00
v_d_mq_01_alcance:
rjmp v_d_mq_01
v_d_mq_02_alcance:
rjmp v_d_mq_02
v_d_mq_03_alcance:
rjmp v_d_mq_03
v_d_mq_04_alcance:
rjmp v_d_mq_04
v_d_mq_05_alcance:
rjmp v_d_mq_05
v_d_mq_06_alcance:
rjmp v_d_mq_06
v_d_mq_07_alcance:
rjmp v_d_mq_07
v_d_mq_08_alcance:
rjmp v_d_mq_08
v_d_mq_09_alcance:
rjmp v_d_mq_09
v_d_mq_0a_alcance:
rjmp v_d_mq_0a
v_d_mq_0b_alcance:
rjmp v_d_mq_0b
v_d_mq_0c_alcance:
rjmp v_d_mq_0c
v_d_mq_0d_alcance:
rjmp v_d_mq_0d
v_d_mq_0e_alcance:
rjmp v_d_mq_0e
v_d_mq_0f_alcance:
rjmp v_d_mq_0f
v_d_mq_10_alcance:
rjmp v_d_mq_10



v_d_mq_00: ;0
cbi portb,3 ;g
sbi portb,4 ;f
sbi portb,5 ;e
sbi portc,0 ;d
sbi portc,1 ;c
sbi portc,2 ;b
sbi portc,3 ;a
rjmp v_d_mq_s_fim

v_d_mq_01: ;1
cbi portb,3 ;g
cbi portb,4 ;f
cbi portb,5 ;e
cbi portc,0 ;d
sbi portc,1 ;c
sbi portc,2 ;b
cbi portc,3 ;a
rjmp v_d_mq_s_fim

v_d_mq_02: ;2
sbi portb,3 ;g
cbi portb,4 ;f
sbi portb,5 ;e
sbi portc,0 ;d
cbi portc,1 ;c
sbi portc,2 ;b
sbi portc,3 ;a
rjmp v_d_mq_s_fim

v_d_mq_03: ;3
sbi portb,3 ;g
cbi portb,4 ;f
cbi portb,5 ;e
sbi portc,0 ;d
sbi portc,1 ;c
sbi portc,2 ;b
sbi portc,3 ;a
rjmp v_d_mq_s_fim

v_d_mq_04: ;4
sbi portb,3 ;g
sbi portb,4 ;f
cbi portb,5 ;e
cbi portc,0 ;d
sbi portc,1 ;c
sbi portc,2 ;b
cbi portc,3 ;a
rjmp v_d_mq_s_fim

v_d_mq_05: ;5
sbi portb,3 ;g
sbi portb,4 ;f
cbi portb,5 ;e
sbi portc,0 ;d
sbi portc,1 ;c
cbi portc,2 ;b
sbi portc,3 ;a
rjmp v_d_mq_s_fim

v_d_mq_06: ;6
sbi portb,3 ;g
sbi portb,4 ;f
sbi portb,5 ;e
sbi portc,0 ;d
sbi portc,1 ;c
cbi portc,2 ;b
sbi portc,3 ;a
rjmp v_d_mq_s_fim

v_d_mq_07: ;7
cbi portb,3 ;g
cbi portb,4 ;f
cbi portb,5 ;e
cbi portc,0 ;d
sbi portc,1 ;c
sbi portc,2 ;b
sbi portc,3 ;a
rjmp v_d_mq_s_fim

v_d_mq_08: ;8
sbi portb,3 ;g
sbi portb,4 ;f
sbi portb,5 ;e
sbi portc,0 ;d
sbi portc,1 ;c
sbi portc,2 ;b
sbi portc,3 ;a
rjmp v_d_mq_s_fim

v_d_mq_09: ;9
sbi portb,3 ;g
sbi portb,4 ;f
cbi portb,5 ;e
sbi portc,0 ;d
sbi portc,1 ;c
sbi portc,2 ;b
sbi portc,3 ;a
rjmp v_d_mq_s_fim

v_d_mq_0a: ;e
sbi portb,3 ;g
sbi portb,4 ;f
sbi portb,5 ;e
sbi portc,0 ;d
cbi portc,1 ;c
cbi portc,2 ;b
sbi portc,3 ;a
rjmp v_d_mq_s_fim

v_d_mq_0b: ;r
sbi portb,3 ;g
cbi portb,4 ;f
sbi portb,5 ;e
cbi portc,0 ;d
cbi portc,1 ;c
cbi portc,2 ;b
cbi portc,3 ;a
rjmp v_d_mq_s_fim

v_d_mq_0c: ;n
sbi portb,3 ;g
cbi portb,4 ;f
sbi portb,5 ;e
cbi portc,0 ;d
sbi portc,1 ;c
cbi portc,2 ;b
cbi portc,3 ;a
rjmp v_d_mq_s_fim

v_d_mq_0d: ;d
sbi portb,3 ;g
cbi portb,4 ;f
sbi portb,5 ;e
sbi portc,0 ;d
sbi portc,1 ;c
sbi portc,2 ;b
cbi portc,3 ;a
rjmp v_d_mq_s_fim

v_d_mq_0e: ;f
sbi portb,3 ;g
sbi portb,4 ;f
sbi portb,5 ;e
cbi portc,0 ;d
cbi portc,1 ;c
cbi portc,2 ;b
sbi portc,3 ;a
rjmp v_d_mq_s_fim

v_d_mq_0f: ;o
sbi portb,3 ;g
cbi portb,4 ;f
sbi portb,5 ;e
sbi portc,0 ;d
sbi portc,1 ;c
cbi portc,2 ;b
cbi portc,3 ;a
rjmp v_d_mq_s_fim

v_d_mq_10: ;apagado
cbi portb,3 ;g
cbi portb,4 ;f
cbi portb,5 ;e
cbi portc,0 ;d
cbi portc,1 ;c
cbi portc,2 ;b
cbi portc,3 ;a
rjmp v_d_mq_s_fim

v_d_mq_s_fim:
ret
;-----------------



v_d_fim:
;----------------------------------------------------------------------------












;----------------------------------------------------------------------------
;Recebe byte twi

lds r16,0x006d ;0x006d = twi recebe byte estado
cpi r16,0
breq rb_inicio
cpi r16,1
breq rb_espera1
cpi r16,2
breq rb_espera2
cpi r16,3
breq rb_finalizou



rb_inicio:
ldi r16,ENDERECO ;endereço
out twar,r16

ldi r16,0x44 ;0x44 = inicio
out twcr,r16

ldi r16,1 ;1 = próximo estado
sts 0x006d,r16
rjmp rb_fim



rb_espera1:
in r16,twcr ;pronto
sbrs r16,twint
rjmp rb_fim

in r16,twsr ;código
cpi r16,0x60 ;0x60 = próprio sla+w recebido
brne rb_erro

ldi r16,0xc4 ;0xc4 = liga twint
out twcr,r16

ldi r16,2 ;2 = próximo estado
sts 0x006d,r16
rjmp rb_fim


rb_erro:
ldi r16,3 ;3: desliga fim
sts 0x006d,r16 ;0x006d = twi recebe byte estado



rb_espera2:
in r16,twcr ;pronto
sbrs r16,twint
rjmp rb_fim

in r17,twdr ;dado recebido
sts 0x006f,r17 ;0x006f = byte recebido
lds r16,0x006e ;0x006e = flags
sbr r16,1 ;1 = b0 = 1 = recebeu byte
sts 0x006e,r16

ldi r16,3 ;3 = próximo estado
sts 0x006d,r16

rjmp rb_fim


rb_finalizou:
;desliga twi
in r16,twcr
andi r16,0xfb ;0xfb = zera twen
out twcr,r16

ldi r16,0 ;0 = estado inicial
sts 0x006d,r16
rjmp rb_fim



rb_fim:
;----------------------------------------------------------------------------














;----------------------------------------------------------------------------
;máquina de estados - caracteres

lds r16,0x006e ;0x006e = flags
sbrs r16,0 ;b0 = 1 = byte recebido
rjmp c_fim
cbr r16,1 ;1 = b0 = 0 = recebeu byte
sts 0x006e,r16



lds r16,0x006b ;0x006b = caracteres estado
cpi r16,0
breq c_0_alcance ;aguarda inicio = 0x55
cpi r16,1
breq c_1_alcance ;aguarda d0
cpi r16,2
breq c_2_alcance ;aguarda d1
cpi r16,3
breq c_3_alcance ;aguarda d2
cpi r16,4
breq c_4_alcance ;aguarda d3
cpi r16,5
breq c_5_alcance ;aguarda d4
cpi r16,6
breq c_6_alcance ;aguarda d5
cpi r16,7
breq c_7_alcance ;aguarda d6
cpi r16,8
breq c_8_alcance ;aguarda d7
cpi r16,9
breq c_9_alcance ;aguarda p

c_0_alcance:
rjmp c_0
c_1_alcance:
rjmp c_1
c_2_alcance:
rjmp c_2
c_3_alcance:
rjmp c_3
c_4_alcance:
rjmp c_4
c_5_alcance:
rjmp c_5
c_6_alcance:
rjmp c_6
c_7_alcance:
rjmp c_7
c_8_alcance:
rjmp c_8
c_9_alcance:
rjmp c_9



c_0: ;aguarda início
lds r16,0x006f ;0x006f = byte recebido
cpi r16,0x55 ;0x55 = início
breq c_0_proximo
rjmp c_0_fim
c_0_proximo:
ldi r16,1 ;estado 1
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_0_fim
c_0_fim:
rjmp c_fim



c_1: ;aguarda digito 0
lds r16,0x006f ;0x006f = byte recebido
cpi r16,0x55 ;0x55 = início
breq c_1_d0
sts 0x0060,r16 ;0x0060 = dígito 0
ldi r16,2 ;2 = próximo
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_1_fim
c_1_d0:
ldi r16,1 ;estado 1 = d0
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_1_fim
c_1_fim:
rjmp c_fim



c_2: ;aguarda digito 1
lds r16,0x006f ;0x006f = byte recebido
cpi r16,0x55 ;0x55 = início
breq c_2_d0
sts 0x0061,r16 ;0x0061 = dígito 1
ldi r16,3 ;3 = próximo
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_2_fim
c_2_d0:
ldi r16,1 ;estado 1 = d0
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_2_fim
c_2_fim:
rjmp c_fim



c_3: ;aguarda digito 2
lds r16,0x006f ;0x006f = byte recebido
cpi r16,0x55 ;0x55 = início
breq c_3_d0
sts 0x0062,r16 ;0x0062 = dígito 2
ldi r16,4 ;4 = próximo
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_3_fim
c_3_d0:
ldi r16,1 ;estado 1 = d0
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_3_fim
c_3_fim:
rjmp c_fim



c_4: ;aguarda digito 3
lds r16,0x006f ;0x006f = byte recebido
cpi r16,0x55 ;0x55 = início
breq c_4_d0
sts 0x0063,r16 ;0x0063 = dígito 3
ldi r16,5 ;5 = próximo
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_4_fim
c_4_d0:
ldi r16,1 ;estado 1 = d0
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_4_fim
c_4_fim:
rjmp c_fim



c_5: ;aguarda digito 4
lds r16,0x006f ;0x006f = byte recebido
cpi r16,0x55 ;0x55 = início
breq c_5_d0
sts 0x0064,r16 ;0x0064 = dígito 4
ldi r16,6 ;6 = próximo
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_5_fim
c_5_d0:
ldi r16,1 ;estado 1 = d0
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_5_fim
c_5_fim:
rjmp c_fim



c_6: ;aguarda digito 5
lds r16,0x006f ;0x006f = byte recebido
cpi r16,0x55 ;0x55 = início
breq c_6_d0
sts 0x0065,r16 ;0x0065 = dígito 5
ldi r16,7 ;7 = próximo
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_6_fim
c_6_d0:
ldi r16,1 ;estado 1 = d0
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_6_fim
c_6_fim:
rjmp c_fim



c_7: ;aguarda digito 6
lds r16,0x006f ;0x006f = byte recebido
cpi r16,0x55 ;0x55 = início
breq c_7_d0
sts 0x0066,r16 ;0x0066 = dígito 6
ldi r16,8 ;8 = próximo
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_7_fim
c_7_d0:
ldi r16,1 ;estado 1 = d0
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_7_fim
c_7_fim:
rjmp c_fim



c_8: ;aguarda digito 7
lds r16,0x006f ;0x006f = byte recebido
cpi r16,0x55 ;0x55 = início
breq c_8_d0
sts 0x0067,r16 ;0x0067 = dígito 7
ldi r16,9 ;9 = próximo
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_8_fim
c_8_d0:
ldi r16,1 ;estado 1 = d0
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_8_fim
c_8_fim:
rjmp c_fim



c_9: ;aguarda ponto
lds r16,0x006f ;0x006f = byte recebido
cpi r16,0x55 ;0x55 = início
breq c_9_d0
sts 0x0068,r16 ;0x0068 = ponto
ldi r16,0 ;0 = início
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_9_fim
c_9_d0:
ldi r16,1 ;estado 1 = d0
sts 0x006b,r16 ;0x006b = caracteres estado
rjmp c_9_fim
c_9_fim:
rjmp c_fim



c_fim:
;----------------------------------------------------------------------------















;////////////////////////////////////////////////////////////////////////////
rjmp processamento
;////////////////////////////////////////////////////////////////////////////





















Nenhum comentário:

Postar um comentário