プロセッサ/メモリ直接アクセス関数 (dos.h) [LC]

メモ   dos.h およびその中の関数は、ISO/JIS/ANSI 規格ではありません。これらの関数の名前については、非 ISO/JIS/ANSI ヘッダーの dos.h をインクルードしない限り有効にならず、通常は他の名前と競合する可能性がないため、先頭に下線 (_) は付きません。

int peekw( unsigned seg, unsigned off );
char
peekb( unsigned seg, unsigned off );
int
peekwf( void far* ptr );
char
peekbf( void far* ptr );

メモリのデータを読み出します。peekw と peekwf は 2 バイト、peekb と peekbf は 1 バイトのデータを読み出します。peekw と peekb はアドレス seg:off から、peekwf と peekbf はアドレス ptr からデータを読み出します。これらの関数は、マクロで定義されています。
int d = peekw( 0xA800, 0x0000 ); // A800:0000 から 2 バイトを取得
int far* ptr = (int far*)0xA8000000;
d = *ptr; // このように書いても同じ

void pokew( unsigned seg, unsigned off, int data );
void
pokeb( unsigned seg, unsigned off, char data );
void
pokewf( void far* ptr, int data );
void
pokebf( void far* ptr, char data );

上の peek 系関数とは逆に、メモリにデータを書き込みます。
pokeb( 0xA800, 0x0000, 'A' ); // A800:0000 に 41h を書き込む
int far* ptr = (int far*)0xA8000000;
*ptr = 'A'; // このように書いても同じ

int inportw( int no );
char
inportb( int no );

プロセッサの no 番の I/O ポートから 2 バイトまたは 1 バイトのデータを入力します。

これらの関数は、_macro を使って定義されています。

void outportw( int no, int data );
void
outportb( int no, char data );

プロセッサの no 番の I/O ポートへ 2 バイトまたは 1 バイトの data を出力します。

これらの関数は、_macro を使って定義されています。
outportw( 0x70, 'A' ); // 70h 番ポートへ 41h を出力

unsigned FP_SEG( void far* ptr );
unsigned
FP_OFF( void far* ptr );
void far*
MK_FP( unsigned seg, unsigned off );

C 言語の far ポインタと、アセンブラ レベルのセグメントおよびオフセットとを相互に変換します。

FP_SEG は、ポインタ ptr のセグメント部分を取得します。FP_OFF は、ポインタ ptr のオフセット部分を取得します。MK_FP は、セグメント値とオフセット値から far ポインタを作成します。

これらの関数は、マクロで定義されています。

void get_regs( union REGS* regs );
void
set_regs( union REGS* regs );

レジスタの現在の値を取得または設定します。

REGS は、dos.h で次のように定義されています。
struct WORDREGS {
  unsigned ax;
  unsigned bx;
  unsigned cx;
  unsigned dx;
  unsigned si;
  unsigned di;
  unsigned cflag;
};
struct BYTEREGS {
  unsigned char al, ah;
  unsigned char bl, bh;
  unsigned char cl, ch;
  unsigned char dl, dh;
};
union REGS {
  struct WORDREGS x;
  struct BYTEREGS h;
};

get_regs は、現在のレジスタ値を regs に格納します。

set_regs は、regs の値をプロセッサのレジスタに格納します。

void get_sregs( struct SREGS* sregs );

セグメント レジスタの現在の値を取得します。

SREGS は、dos.h で次のように定義されています。
struct SREGS {
  unsigned es;
  unsigned cs;
  unsigned ss;
  unsigned ds;
};

int int86( int no, union REGS* iregs, union REGS* oregs );

iregs の値を sp、bp 以外の各レジスタに設定し、8086 プロセッサの no 番のソフトウェア割り込みを実行して、実行後のレジスタ値を oregs に格納します。割り込み終了時点の AX レジスタの値を返します。

割り込みハンドラ」も参照してください。
union REGS regs;
regs.h.dl = 'A';
regs.h.ah = 2;
int86( 0x21, &regs, &regs ); // 'A' と表示

int int86x( int no, union REGS* iregs, union REGS* oregs, struct SREGS* sregs );

iregs および sregs の値を各レジスタに設定し、8086 プロセッサの no 番のソフトウェア割り込みを実行して、実行後のレジスタ値を oregs および sregs に格納します。cs、ss、sp、bp の値は無視されます。割り込み終了時点の AX レジスタの値を返します。

int intdos( int no, union REGS* iregs, union REGS* oregs );   [OS]

iregs の値を sp、bp 以外の各レジスタに設定し、no 番の MS-DOS ファンクション コール (int 21h) を実行して、実行後のレジスタ値を oregs に格納します。

割り込み終了時点の AX レジスタの値を返します。

MS-DOS ファンクション コールでエラーが発生した場合、つまりキャリーフラグがセットされた場合は、errno にエラー コードが設定されます。
union REGS regs;
regs.h.dl = 'A';
intdos( 2, &regs, &regs ); // 'A' と表示

int intdosx( int no, union REGS* iregs, union REGS* oregs, struct SREGS* sregs );   [OS]

intdos のバリエーションです。int86 に対する int86x に相当します。

inthdlr_t getvect( int no );
void
setvect( int no, inthdlr_t func );

getvect は、no 番割り込みに設定されている割り込みハンドラのアドレスを取得します。setvect は、funcno 番割り込みのハンドラとして登録します。 inthdlr_t は、dos.h で次のように定義されています。

typedef void interrupt far (*inthdlr_t)( void );

これらの関数は、メモリ上の割り込みベクタに直接アクセスします。MS-DOS 互換環境では、代わりにファンクション コール 25h および 35h の使用が推奨されているため、MS-DOS 環境では intdos 関数を使用してください。