*参考 98とpc/at互換機用のプログラム比較

   






pc9821用プログラム pc/at互換機用プログラム
procedure tform1.button10click(sender: tobject);
 var
roop:integer;
xmaxint:integer;
dxasm: word;
begin
   asm            {assemblerの開始}          
     mov al,$e     {クロックl}
     out $46,al

                                        
     mov al,$f2    {poweron6〜9とcsをh}
     out $40,al
      

   end;   {assemblerの終わり

  xmaxint:=strtoint(form1.edit22.text);
 for roop:=1 to xmaxint
 do begin
     ch1bwr;
    data[roop]:=dxasm;
  end;
end;

{pc9821 1回データを読み込むサブルーチン}
 procedure ch1bwr;  {ch1から入力}
begin
    asm          {assemblerの開始}

    mov al,$f1   {241=240(poweron pin6〜9)
    out $40,al       +1(チップセレクトリセットcsをl) 
                       スタートコンバート1}
     mov al,$f  {clock}
     out $46,al
     mov al,$e
     out $46,al


{ alレジスタと入出力ポートの間でデータの入出力,
  ポートの指定イミディエート値は8ビット(0〜255,hff)
  データで示すポート番号}         *入出力で使用できる

     mov al,$f1  {241=240(poweron pin6〜9)
     out $40,al         +1(標準1)}


     mov al,$f   {clock}
     out $46,al
     mov al,$e
     out $46,al



     mov al,$f1 {$f1 240+1 1 チャネル選択}
     out $40,al  {$f0 240+0 0 チャネル選択}
                 {240(poweron pin6〜9)}

     mov al,$f   {clock}
     out $46,al
     mov al,$e
     out $46,al



     mov al,$f1 {241=240(poweron pin6〜9)
     out $40,al        +1ステータスデータ1}


     mov al,$f   {clock}
     out $46,al
     mov al,$e
     out $46,al



     xor dx,dx   {dx=0}

     mov al,$f   {clock}
     out $46,al
     mov al,$e
     out $46,al



 in al,$42 {b7  read  11pin busy信号}
 and al,$4 {2bit,high;0 al=0,low;22 al=1}
 sub al,$1{high0-1=0 cf=1,low1-1=0 cf=0}
 adc dx,dx {dx=dx+dx+cf highの時キャリーフラグ
                            cf=1}


     mov al,$f   {clock}
     out $46,al
     mov al,$e
     out $46,al



      in al,$42  {b6  read}
     and al,$4
     sub al,$1
     adc dx,dx


     mov al,$f   {clock}
     out $46,al
     mov al,$e
     out $46,al





      in al,$42   {b5  read}
     and al,$4
     sub al,$1
     adc dx,dx


     mov al,$f   {clock}
     out $46,al
     mov al,$e
     out $46,al



      in al,$42   {b4  read}
     and al,$4
     sub al,$1
     adc dx,dx


     mov al,$f   {clock}
     out $46,al
     mov al,$e
     out $46,al



      in al,$42   {b3  read}
     and al,$4
     sub al,$1
     adc dx,dx



     mov al,$f   {clock}
     out $46,al
     mov al,$e
     out $46,al



     in al,$42   {b2  read}
     and al,$4
     sub al,$1
     adc dx,dx


     mov al,$f   {clock}
     out $46,al
     mov al,$e
     out $46,al



      in al,$42   {b1  read}
     and al,$4
     sub al,$1
     adc dx,dx


     mov al,$f   {clock}
     out $46,al
     mov al,$e
     out $46,al



      in al,$42   {b0  read}
     and al,$4
     sub al,$1
     adc dx,dx


     mov al,$f   {clock}
     out $46,al
     mov al,$e
     out $46,al





     mov dxasm,dx  {dxasmにdata 格納}

     xor al,al      {al=0}

     mov al,$f2 {240+2;poweron6〜9とcsをh}
     out $40,al


    end;            {assemblerの終わり}
  end;           { procedureの終わり}
procedure tform1.button10click(sender: tobject);
 var
roop:integer;
 xmaxint:integer;
dxasm: word;
begin
    asm          {assemblerの開始}    
@{表 操作手順の番号}     
      mov ax,$f        {クロックl}
      mov dx,$37a
      out dx,ax
A                                          
      mov ax,$f2       {poweron6〜9とcsをh}
      mov dx,$378
      out dx,ax

    end;        {assemblerの終わり}
  xmaxint:=strtoint(form1.edit22.text);
 for roop:=1 to xmaxint
 do begin
    ch1bwr;
    data[roop]:=dxasm;
  end;
end;

{pc/at互換機1回データを読み込むサブルーチン}
procedure ch1bwr;   {ch1から入力}
begin
    asm           {assemblerの開始}
B
   mov ax ,$f1   {241= 240(poweron pin6〜9)
    mov dx,$378      1(チップセレクトリセットcsをl)
    out dx,ax             スタートコンバート1}
C
    mov ax ,$e    {clock}
     mov dx,$37a
     out dx,ax   { axレジスタと入出力ポートの間で
     mov ax,$f     データ入出力,dx指定でポート番
     mov dx,$37a   号を格納すると16ビットのデータ
     out dx,ax    (0〜65535,hffff)でポート指定
                    できる}
レジスタはax,alレジスタだけである。
D
    mov ax ,$f1   {241=240(poweron pin6〜9)
     mov dx,$378          +1(標準1)}
     out dx,ax
E
    mov ax ,$e    {clock}
     mov dx,$37a
     out dx,ax
     mov ax ,$f
     mov dx,$37a
     out dx,ax
F
     mov ax ,$f1   {$f1 240+1 1 チャネル選択}
      mov dx,$378   {$f0 240+0 0 チャネル選択}
      out dx,ax     {240(poweron pin6〜9)}
G
    mov ax ,$e      {clock}
     mov dx,$37a
     out dx,ax
     mov ax ,$f
     mov dx,$37a
     out dx,ax
H
     mov ax ,$f1   {241=240(poweron pin6〜9)
      mov dx,$378        +1(ステータスデータ1)}
      out dx,ax
I
     mov ax ,$e    {clock}
     mov dx,$37a
     out dx,ax
     mov ax ,$f
    mov dx,$37a
     out dx,ax

      xor cx,cx     {cx=0}
J
    mov ax ,$e     {clock}
     mov dx,$37a
     out dx,ax
     mov ax ,$f
     mov dx,$37a
     out dx,ax
L
mov dx,$379    {b7  read 11pin busy信号}
in ax,dx   
and ax,$80 {7bit,high;0 al=0,low;27 $80 al=1}
sub ax,$1{high0-1=0ボロー=1 cf=1,low1-1=0 cf=0}
adc cx,cx   {cx=cx+cx+cf highの時キャリーフラグ
                                   cf=1}
M
    mov ax ,$e      {clock}
     mov dx,$37a
     out dx,ax
     mov ax ,$f
     mov dx,$37a
     out dx,ax
N
      mov dx,$379     {b6  read}
      in ax,dx
      and ax,$80
      sub ax,$1
      adc cx,cx
O
      mov ax ,$e      {clock}
     mov dx,$37a
     out dx,ax
     mov ax ,$f
     mov dx,$37a
     out dx,ax


P
      mov dx,$379     {b5  read}
      in ax,dx
      and ax,$80
      sub ax,$1
      adc cx,cx
Q
     mov ax ,$e       {clock}
     mov dx,$37a
     out dx,ax
     mov ax ,$f
     mov dx,$37a
     out dx,ax
R
       mov dx,$379   {b4  read}
       in ax,dx
       and ax,$80
       sub ax,$1
       adc cx,cx
S
     mov ax ,$e     {clock}
     mov dx,$37a
     out dx,ax
     mov ax ,$f
     mov dx,$37a
     out dx,ax
21
       mov dx,$379   {b3  read}
       in ax,dx
       and ax,$80
       sub ax,$1
       adc cx,cx
22

       mov ax ,$e      {clock}
       mov dx,$37a
       out dx,ax
       mov ax ,$f
       mov dx,$37a
       out dx,ax
23
       mov dx,$379     {b2  read}
       in ax,dx
       and ax,$80
       sub ax,$1
       adc cx,cx
24
       mov ax ,$e      {clock}
       mov dx,$37a
       out dx,ax
       mov ax ,$f
       mov dx,$37a
       out dx,ax
25
       mov dx,$379     {b1  read}
       in ax,dx
       and ax,$80
       sub ax,$1
       adc cx,cx
26
       mov ax ,$e       {clock}
       mov dx,$37a
      out dx,ax
      mov ax ,$f
      mov dx,$37a
      out dx,ax
27
       mov dx,$379     {b0  read}
       in ax,dx
       and ax,$80
       sub ax,$1
       adc cx,cx
28
       mov ax ,$e       {clock}
      mov dx,$37a
      out dx,ax
      mov ax ,$f
      mov dx,$37a
      out dx,ax



     mov dxasm,cx       {dxasmにdata 格納}

     xor ax,ax          {ax=0}
30 or 2
     mov ax ,$f2  {240+2;poweron6〜9とcsをh}
     mov dx,$378
     out dx,ax
                       
        end;            {assemblerの終わり}
   end;              { procedureの終わり} 
pc9821用プログラム pc/at互換機用プログラム

プログラムの流れ
a    ボタンをクリックすることで表3の操作手順@を実行する。コンピュータの起動時はプリンタポートの1番ピン
      は通常はhighになっているのでまずlowにする必要がある。
b   チャネル1からデータを読み込む手続きch1bwrをサンプリング数の最大値xmaxintに等しい回数,
      ループで呼び出す。
c   手続きch1bwrの中で表3の操作手順A〜28を実行する。
d    ビットを読み込む操作手順毎に,busy信号がhighかlowか論理和(and)で判定している。
      busy信号は反転してコンピュータに入るのでhighの時0,lowの時1がalまたはaxに格納される。
e      busy信号は反転してコンピュータに入るので,論理和の結果(alまたはaxに格納されている値)と$1の
       減算(sub)を行って,キャリーフラグcfの値がbusy信号がhighの時1,lowの時  0になる(反転を直す)
       ようにする。
f    キャリー付き加算(adc)を行ってdx(pc9821の時)またはcxレジスタ(dos/vの時)に格納する。
g     手続きch1bwrの中でd〜fを8回繰り返すことで8ビットの信号に2n―1(nビット目毎  に)の重みがか
       かって加算され,アナログデータに対応するデジタルデータの値が得られる。
h    手続きch1bwrの最後でデジタルデータを変数dxasmに格納する。
i       手続きch1bwrを呼ぶループの中で,変数dxasmを配列変数data[roop]に格納する。
       roopの最大値がサンプリング数になる。



〔参考文献〕 「パソコンを計測機器として使用する方法の検討」平成4年度長期研修集録 田中 佳典


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