D windows上でのi/oポートの読み書きプログラム
  windowsになってハードウエアを直接アクセスすることが制限されるようになって,自作の周辺
 装置を接続して動かすことが難しくなっている。例えばvisualbasicでi/oポートを通してアクセ
 スしようとしたら,他の言語(例えばvisual c++)で作ったdllファイル(i/oポートを通してア
 クセスするように作成)をdeclairの宣言文で読み出さなければならない。つまり,visualbasic
 でできない点を他の言語で作成したdllファイルで機能追加することになる。そのためには事前に
 dllファイルをwindows95のシステムにコピーしておく必要が出てくる。また完全実行形式の実行
 プログラムはできないので,プログラムを配布のときにdllファイルも一緒に配布するわずらわし
 さがある。
  では,windows上でi/oポートを直接制御できるc++を使えばという話になるが,c言語に特有の
 何でも設定しなければならず,グラフィックの部分の表示はなかなか難しく手ごわい。それより
 はグラフィックを表示するコンポーネントを貼り付けて時間をかけずに簡単にプログラミングで
 きる言語の方が楽である。
   ところで,borland社(最近inprise社に改名)から出ているdelphiという言語は,pascal言語で
 あるが,実際に使ってみるとコンパイルや実行速度が速く,またapi関数もdeclairの宣言文
  なしに関数のように直接呼び出すことが可能である。また容易にアセンブラが使えるので直
  接i/oポートを制御することもできる。また100近くのコンポーネントがついていて簡単に機能が
  追加でき,かつ完全実行形式の実行ファイルができ,大変優れものである。visualbasicもコンポ
  ーネントが ついているが,これを使って他のコンピュータで実行形式のプログラム(exeファイル)
  を動かそうとしたらコンポーネントに対応するocxファイルをシステムに次から次へとコピーして
  いかなければならない。delphiと違ってvisualbasicは完全実行形式のファイルを作成できない。
  学校現場でこども達や先生方に自作のプログラムソフトを自由に使ってもらうためにはどうしても
  完全実行形式の実行ファイルが必要である。 	
   ここでは,従来ms-dos上のbasicで動かしていたadコンバータをwindows95上のdelphiのア
  セン ブラを使ってi/oポートを制御し,動かせるようにしたこと(当然ながら完全実行形式
  のexeファイルができる)について簡単に説明する。

   * pascal言語の中で直接assemblerを呼び出してポートを制御する。



delphiでは組み込みアセンブラをasmとend を使ってobjectpascal文中に直接記述できる。        
    ・・・・・・・objectpascal文
            asm       {アセンブラの始まり}
            ・・・・・ 組み込みアセンブラ
       ・・・・・・・・
            end;      {アセンブラの終わり}
    ・・・・・・objectpascal文

i/oポートの読み書きソフト
   

プログラムリスト
unit ioport;
interface
uses
  windows, messages, sysutils, classes, graphics, controls, forms, dialogs,
  stdctrls, extctrls;
type
  tform1 = class(tform)
    button1: tbutton;
    edit1: tedit;
    button2: tbutton;
    edit2: tedit;
    edit3: tedit;
    edit4: tedit;
    panel1: tpanel;
    label1: tlabel;
    label2: tlabel;
    panel2: tpanel;
    label3: tlabel;
    label4: tlabel;
    procedure button1click(sender: tobject);
    procedure button2click(sender: tobject);
  private
    { private 宣言 }
  public
    { public 宣言 }
  end;
var
  form1: tform1;

implementation

{$r *.dfm}

procedure tform1.button1click(sender: tobject);          {ポートへの書き込み}
var
 w:word;
 port:word;
begin
  w:=strtoint('$'+edit2.text);      {書き込むデータを読み込み,文字からwordへ変換}
  port:=strtoint('$'+edit1.text);{書き込むポートアドレスを読み込み,文字からwordへ変換}
   asm                            {アセンブラの始まり}
     mov ax ,w
     mov dx,port
     out dx,ax
   end;                           {アセンブラの終わり}
end;

procedure tform1.button2click(sender: tobject);          {ポートからの読み}
var
 ri:integer;
 r:word;
 port:word;
begin
 port:=strtoint('$'+edit3.text); {読み込むポートアドレスを読み込み,文字からwordへ変換}
 asm                              {アセンブラの始まり}
   mov dx,port
   in ax,dx
   mov ah,0
   mov r,ax
 end;                              {アセンブラの終わり}
     ri:=r;                             {読み込んだデータをワードから整数に変換}
     edit4.text:=inttohex(ri,2);        {読み込んだデータを16進に変換して表示}
end;

end.

       
  〔参考文献〕 delphi2.0 q&a 120選 大野元久著 株式会社ビレッジセンター出版局 1996年

       次へ進む       前に戻る    理科におけるコンピュータの活用へ