|
안녕하세요..
DIO카드 회사에서 라이브러리 제공한 걸 사용하시거나
NT계열 이하의 OS에서는 직접 포트를 Read/Write해도 상관 없습니다.
보통 BaseAddress를 지정해주고 그곳에서 offset 위치 떨어진
특정포트에 읽기 전용, 또는 쓰기 전용으로 포트 속성을 지정한 후
(보통 위 작업을 하는 컨트롤 포트가 따로 있습니다.
단, 특정 카드는 읽기 /쓰기 포트가 고정된 것도 있지요)
아래 함수를 이용해서 직접 입출력 하시면 될껍니다.
읽을값은 비트단위로 각기 채널에 따라 분리 해야 겠고..
쓰기하실때는 기존 포트값을 읽은 후 쓸 비트(채널)값과 OR한 후
Write해야되는 것두 잊지 마시구여.
(단, 특정카드는 출력포트를 되읽지 못하는 경우도 있으므로
포트 출력값을 변수에 저장해서 유지하는 방법도 간구해야 겠지요)
void outportb(WORD port, BYTE value)
{
__emit__(0x8b, 0x95, &port); // mov edxl, *(&port);
__emit__(0x8a, 0x85, &value); // mov al, *(&value);
__emit__(0x66, 0xee); // out dx, al;
}
void outportw(WORD port, WORD value)
{
__emit__(0x8b, 0x95, &port); // mov edx, *(&port);
__emit__(0x66, 0x8b, 0x85, &value); // mov ax, *(&value);
__emit__(0xef); // out dx, ax;
}
BYTE inportb(WORD port)
{
BYTE value;
__emit__(0x8b, 0x95, &port); // mov edx, *(&port);
__emit__(0x66, 0xec); // in al, dx;
__emit__(0x88, 0x85, &value); // mov *(&value), al;
return value;
}
WORD inportw(WORD port)
{
WORD value;
__emit__(0x8b, 0x95, &port); // mov edx, *(&port);
__emit__(0xed); // in ax, dx;
__emit__(0x66, 0x89, 0x85, &value); // mov *(&value), ax;
return value;
}
|