Window(C="Test - parameters";w=900;h=140;a=h)
{
    Pages(l=0;t=0;w=500;h=130)
    {
        Page(c="Питание")
        {
            Button(c="VCC Вкл";proc=pOn;l=5;t=5;w=75;h=20)
            Button(c="VCC Выкл";proc=pOff;l=5;t=25;w=75;h=20)
            Button(c="VCC = 5B";proc=vcc5;l=80;t=5;w=75;h=20)
            Button(c="VCC = 3B";proc=vcc3;l=80;t=25;w=75;h=20)

            Button(c="12B Вкл";proc=On12;l=180;t=5;w=75;h=20)
            Button(c="12B Выкл";proc=Off12;l=180;t=25;w=75;h=20)
            Button(c="12 = 12";proc=vcc10;l=260;t=5;w=75;h=20)
            Button(c="12 = 10";proc=vcc12;l=260;t=25;w=75;h=20)
            Button(c="5B вкл";proc=on5;l=5;top=55;h=20;w=75)
            Button(c="5B выкл";proc=off5;l=80;top=55;h=20;w=75)
            Button(c="Проверить внешнее питание";l=5;t=75;h=20;w=170;proc=chkext)
        }
        Page(c="Параллельный порт")
        {
            Button(c="Тест параллельного порта";proc=partest;l=5;top=5;w=150;h=25)
        }
        Page(c="UART")
        {
            digit(c="Скорость";l=245;w=50;t=5;value=115200;name=uart_speed)
            Button(c="Тест последовательного порта";proc=uart_test;l=5;top=5;w=150;h=35)
        }
        Page(c="Потоковая передача")
        {
            list(c="Режим генерации";l=95;t=5;w=150;items="Одна переменная","Массив";name=pulse_mode)
            hexedit(c="Значение (hex)";l = 345;t=5;w=100;value = 0x55555555;n=pulse_source)
            digit(c="Длина импульса (мкс)";l=185;w=50;t=35;value=10;name=pulse_width)
            digit(c="Количество импульсов в посылке";l=185;w=50;t=60;value=32;name=pulse_number)
            Button(c="Включить";proc=souten;l=345;t=45;w=80;h=25)
            Button(c="Выключить";proc=soutdis;l=345;t=70;w=80;h=25)
        }
    }
}

Editor
{
 (C="EEPROM";size=128;mode=8;bytes=16)
}

$HOST

//#include "power.inc"

emem fbuf=0;

byte pwr;

proc ShowPwr()
{
    var a;
    a = pwr;
    print("\n pwr = "+#h1.a);
}

proc chkext()   
{
    var a;
    a = device.get_power();
    print("\n Power = "+#h4.a);

    if(a & 0x20)    print("\n Внешнее питание есть");
    else            print("\n Внешнего питания нет");
}

proc on5()      { pwr |= 0x10; showpwr();device.set(pwr);}

proc off5()     { pwr &= 0x10^255; showpwr();device.set(pwr);}

proc pon()      { pwr |= 1;     showpwr();device.Set(pwr);}

proc poff()     { pwr &= 1^255; showpwr();device.Set(pwr);}

proc vcc5()     { pwr |= 2;     showpwr();device.Set(pwr);}

proc vcc3()     { pwr &= 2^255; showpwr();device.Set(pwr);}

proc on12()     { pwr |= 4;     showpwr();device.Set(pwr);}
                  
proc off12()    { pwr &= 4^255; showpwr();device.Set(pwr);}

proc vcc10()    { pwr |= 8;     showpwr();device.Set(pwr);}

proc vcc12()    { pwr &= 8^255; showpwr();device.Set(pwr);}

proc vcc()    { pwr &= 8^255; showpwr();device.Set(pwr);}

byte state;


proc uart_test()
{
    var a,b;
    device.set(0x03);
    device.uart_init();
    for(a = 0; a < 256; a++)
    {
        b = device.uart_transmit(a);
        print("\n a = "+#i.a+" b = "+#i.b);
    }
    device.set(0);
}


proc partest()
{
    var a,b,error;
    print("\n Питание 3В...");  
    device.set(1);
    error = 0;
    for(a = 0; a < 256;a++)
    {
        b = device.out(a);
        error |= (b ^ a);
    }
    print(" error = 0x"+#h1.error);
    print("\n Питание 5В...");  
    device.set(3);
    error = 0;
    for(a = 0; a < 256;a++)
    {
        b = device.out(a);
        error |= (b ^ a);
    }
    print(" error = 0x"+#h1.error);
    device.set(0);
}

proc Souten()
{
    // проверяем правильность параметров
    if(pulse_width = 0)
    {
        mbox("Длина импульса не может быть 0",0);
        return;
    }
    if(pulse_number = 0)
    {
        mbox("Количество импульсов не может быть 0",0);
        return;
    }
    if(pulse_mode = 0)
    {
        // передача из одной переменной
        if(pulse_number > 32)
        {
            mbox("Количество импульсов не может быть более 32",0);
            return;
        }
    }
    else
    {
        memcopy(device.sbuffer=fbuf[0],128);    
    }
    device.pulse_source = pulse_source;
    device.pulse_mode = pulse_mode;
    device.pulse_number = pulse_number;
    device.pulse_width = pulse_width;  
    device.spin();
    device.swithsout(1);        
}

proc Soutdis()
{
    device.swithsout(0);            
}


//--------------------------------------------------

$device

#include "uart.inc"

byte sbuffer[128];   // массив для генерации посылки 128 байт (1024 бит)

dword delay_value;
byte state;
byte pulse_mode;
word pulse_width;
word pulse_number;
dword pulse_source;


proc uart_init()
{
    UART_CR = UART_ON | UART_NORMAL | PAR_NO | CHL_8BIT | STOP_BIT1 | 10470;
}

proc uart_transmit(a)
{
    UART_DATA = a;
    a = UART_DATA;
    return(a);
}

proc spin()
{
    STREAMPIN = PORTB.3;
}

proc Set(a)
{
    POWER = a;
}

proc out(a)
{
    PORTE = a;
    a = PORTE;
    return(a);
}

proc get_power()
{
    return(POWER);
}

proc swithsout(a)
{
    if(a)   
    {
        POWER = 3;
        IDLE_ENABLE = 1;
    }
    else    
    {
        POWER = 0;
        IDLE_ENABLE = 0;
    }
}

proc txcmd(a,cnt)
{
    while(cnt)
    {
        PORTB |= (1<<5);
        Delay(37);
        PORTB &= (1<<5)^255;
        if(a & 0x80000000)  Delay(21*8);
        else                Delay(12*8);
        a = a << 1; 
        cnt--;
    }   
    Delay(40*8); // условие STOP
}

// длина короткого импульса 4..6 отсчетов
// длина длинного импульса 9...12 отсчетов

proc GetManBit()
{
    var a,result,level,i;
    if(Timer > 200) ;       
    if(IRQ_FLAG) ; 
    if(state = 0)
    {
        if(a = 255) ;  // ошибка протокола - завершение передачи
        if(a & 1)
        {
            // длинный импульс, инвертируем входной уровень и добавляем к приему
            result = result << 1;
            level ^= 1;
            result |= level;
            i++;
        }
        else state = 1; // короткий - ждем обязательного второго короткого
    }
    else
    {
        // должен быть обязательный второй короткий импульс
        if(a = 255) ;  // ошибка протокола - завершение передачи
        if((a & 1) = 0)
        {
            // короткий импульс,
            result = (result << 1) | level;
            i++;
            state = 0;
        }
    }
}


proc idle()
{
    if(pulse_mode = 0)
    {
        // передача из одной переменной
        StreamOut(pulse_source,pulse_number,pulse_width);
    }
    else
    {
        // передача из массива
        StreamOut(sbuffer,pulse_number,pulse_width);
    }
}
