;=======================================================
; Проект 13. Счётчик 0..99 на двух индикаторах
; ATmega8, 8 МГц. Сегменты PB0..PB6, разряды PD0 и PD1
;=======================================================
.include "m8def.inc"
.def    temp  = r16
.def    tens  = r17
.def    ones  = r18
.def    d1    = r19
.def    d2    = r20
.def    loops = r21

.cseg
.org    0x0000
        rjmp    RESET

SEGTAB: .db 0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110
        .db 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111

RESET:
        ldi     temp, low(RAMEND)
        out     SPL, temp
        ldi     temp, high(RAMEND)
        out     SPH, temp
        ldi     temp, 0x7F
        out     DDRB, temp
        ldi     temp, 0x03
        out     DDRD, temp
        clr     tens
        clr     ones

MAIN:
        ldi     loops, 100              ; около секунды показа
SHOW:
        rcall   DIGITS
        dec     loops
        brne    SHOW

        inc     ones                    ; счёт с переносом
        cpi     ones, 10
        brne    MAIN
        clr     ones
        inc     tens
        cpi     tens, 10
        brne    MAIN
        clr     tens
        rjmp    MAIN

DIGITS:
        cbi     PORTD, PD1
        mov     temp, tens
        rcall   SEG
        out     PORTB, temp
        sbi     PORTD, PD0
        rcall   DELAY5MS
        cbi     PORTD, PD0
        mov     temp, ones
        rcall   SEG
        out     PORTB, temp
        sbi     PORTD, PD1
        rcall   DELAY5MS
        ret

SEG:
        ldi     ZL, low(SEGTAB<<1)
        ldi     ZH, high(SEGTAB<<1)
        add     ZL, temp
        clr     temp
        adc     ZH, temp
        lpm     temp, Z
        ret

DELAY5MS:
        ldi     d2, 52
V2:     ldi     d1, 255
V1:     dec     d1
        brne    V1
        dec     d2
        brne    V2
        ret
