#define FClk 20000
#define PORT PORTB
#define DDR  DDRB
#define PIN  PINB
#define BitNum 0

/*
    Команды:
	    0 - далее 
		1 - сброс
		2 - чтение
		3 - запись
*/

.cseg

   // свободны 3 команды

#define  WaitCount r26
#define  BitCount  r27
#define  Res0      r28
#define  Cmd       r29
#define  ByteCnt   r16
#define  KS        r17 

.global _Dbg

_Dbg: //cbi PORTB, 1   
    cbi PORT, BitNum 
	push WaitCount
	in   WaitCount, SREG
    sbi DDR, BitNum // пошел запрос прерывания (5 т.и.)
    
	push WaitCount

	clr  WaitCount

WaitSendItr: // запрос прерывания делаем ~ 1/10 сек.
    dec WaitCount
	brne WaitSendItr

    cbi DDR, BitNum // снятие запроса прерывания (надо что б единица устоялась)

    push BitCount
	push Res0
	push Cmd     
	push ByteCnt
    push KS

Cikl: // перед начала цикла ждем завершения прошлого - единицы на линии.    
	clt // чтение
    rcall ReadWrite
    mov   Cmd, Res0

	rcall ReadWrite
    mov r30, Res0

	rcall ReadWrite
    mov r31, Res0

	rcall ReadWrite
	
	cpi   Cmd, 1
	brcs  CmdContinue // был код 0

	breq  CmdWrite // был код 1	

M1: ldi   ByteCnt, 8
    set // передача
    ldi  KS, 0xAA
ReadCikl:
    ld   Res0, Z+ 
	add   KS, Res0
    rcall ReadWrite
	dec   ByteCnt
	brne  ReadCikl

	mov   Res0, KS
	rcall ReadWrite

    rjmp Cikl

CmdWrite:
    st Z, Res0
    rjmp Cikl

CmdContinue:
    set // передача
	ldi Res0, 0x55
	rcall ReadWrite

Exit: 
    //sbi  PORTB, 1   
    pop  KS
	pop  ByteCnt
	pop  Cmd
	pop  Res0
	pop  BitCount
	pop  WaitCount
	out  SREG, WaitCount
	pop  WaitCount
	ret
	

//-------------------------    ОСНОВНАЯ ПРОЦЕДУРА ЧТЕНИЯ - ЗАПИСИ  --------------------

ReadWrite:
/*
    Чтение: флаг T = 0
	          
*/    
    ldi  BitCount, 8
    

//-------------------------    ЖДЕМ УСТАНОВКИ НУЛЯ  --------------------------------------------
Wait0:
    sbic PIN, BitNum
	rjmp Wait0

    //sbic PinB, 0
	//rjmp Wait0

	

//-------------------------    ТЕПЕРЬ ЖДЕМ СНЯТИЕ НУЛЯ  -----------------------------------------------

    
Wait1: 
    
    sbis PIN, BitNum
	rjmp Wait1
	
    //sbis PinB, 0
	//rjmp Wait1

	
//----------------------------------  ЕСЛИ ЭТО ЗАПИСЬ - СТАВИМ СИГНАЛ, И ДЕРЖИМ ЕГО НЕ МЕНЬШЕ 20 т.и.----------------
    lsr Res0  //2 мКс (без 4 т.и.)
	brtc Reading

    brcs BitCikl   // если единица, то и делать ни чего не надо

    sbi  DDR, BitNum   // иначе устанавливаем 0


//-------------------------------------  ЗАДЕРЖКА ОТ 65 ДО 96 т.и. ПРИ 20 мГц  ----------------------


     ldi WaitCount, (65 * FClk - 140000) / 60000 + 1
SignalWait:
     dec WaitCount
     brne SignalWait
	
	cbi  DDR, BitNum   // возвращаем 1 
    
	rjmp BitCikl

//-------------------------    СНИМАЕМ РЕЗУЛЬТАТ    ------------------------------------------
Reading:
    
	ldi WaitCount, (79 * FClk - 120000) / 60000 + 1//от 73 до 105

EndReadingWait:
	dec WaitCount
    brne EndReadingWait 

	sbic PIN, BitNum
    ori  Res0, 0x80

//-------------------------    НУ И ИДЕМ ЖДАТЬ СЛЕДУЮЩЕГО ЦИКЛА     ----------------------------
BitCikl:
    dec BitCount
    brne Wait0

//-------------------------   ВЫХОД - ПРЕДВАРИТЕЛЬНО ЖДЕМ ПОЯВЛЕНИЯ 1  -------------------------

    //ori Res0, 1
	//out PORTC, Res0
m0:
	sbis PIN, BitNum
	rjmp m0

	ret 
