+1 И я о том-же... Как припрет, ужом изовьешься, лишь бы было полезно...
#include <windows.h>
#include <dos.h>
#define ST_PORT 0x368 /* Адрес программного запуска */
#define TIMER_0 0x36c /* Адрес 0-го таймера/счетчика */
#define TIMER_1 0x36d /* Адрес 1-го таймера/счетчика */
#define TIMER_2 0x36e /* Адрес 2-го таймера/счетчика */
#define TIMER_CTRL 0x36f /* Адрес управляющего регистра таймера */
#define INTR 0X8 /* The clock tick interrupt */
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
int count=0;
int count1=0;
int out_mas[8];
unsigned char out_val;
unsigned char i;
void FAR interrupt ( *oldhandler)(__CPPARGS);
void FAR interrupt handler(__CPPARGS)
{
count++;
count1++;
outportb(0x378,out_val);
for(i=0;i<8;i++)
{
if(out_mas[i] < count) out_val &= 255-(1<<i);
else out_val |= (1<<i);
}
if(count==31)count=0;
if(count1==128)
{
count1=0;
oldhandler(); /* call the old routine */
}
else outportb(0x20,0x20);
}
#pragma argsused
int FAR PASCAL LibMain( HINSTANCE hInstance, WORD wDataSegment,
WORD wHeapSize, LPSTR lpszCmdLine )
{
if ( wHeapSize != 0 )
UnlockData( 0 );
outp(0x364,0); //init adc
outp(TIMER_CTRL, 0x34); /* Задание частоты запусков АЦП */
outp(TIMER_0, 0xff); /* Частота = 2000/К (кГц) */
outp(TIMER_0, 0x00); /* К - код в счетчике 0 */
outp(TIMER_CTRL, 0x74); /* Задание частоты запусков АЦП */
outp(TIMER_1, 0xff); /* Частота = 2000/К (кГц) */
outp(TIMER_1, 0x00); /* К - код в счетчике 0 */
oldhandler = getvect(INTR);
setvect(INTR, handler);
outportb(0x43,0x36);
outportb(0x40,0);
outportb(0x40,0x2); //18.2*128
return 1;
}
#pragma argsused
int FAR PASCAL WEP ( int bSystemExit )
{
setvect(INTR, oldhandler);
outportb(0x43,0x36);
outportb(0x40,0);
outportb(0x40,0); //18.2
return 1;
}
int FAR PASCAL _export ADC(int * channel)
{
outp(0x360,* channel);
while(! (inp(0x366) & 1));
return((inpw(0x360)) & 0xfff);
}
void FAR PASCAL _export DAC(int *channel,int *value)
{
out_mas[*channel] = *value >>7;
}