2018.10.19
前へ
次へ
ホームページトップへ戻る


16ビットマイコンボードの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使ってみるつもりで入手してそのまま置いてあった16ビットCPUのことを思い出しました。
AMD社のAM188です。
その名の通り、CPUコアは80188互換の16ビットCPUです。
そのAM188を使った16ビットマイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第101回]



●ストップウォッチプログラム(3)

ストップウォッチプログラムのアセンブルリストです。

2018/10/15  18:58  stwatch.LST
[00001]                     ;;;stop watch program for am188
[00002]                     ;18/10/15
[00003]                         ORG=8000
[00004]                         SEG8=FFF8
[00005]                         ADRSH=FFEF
[00006]                         ADRSL=FFEE
[00007]                         DARAH=FFED
[00008]                         DATAL=FFEC
[00009]                         ADDSP=01A1
[00010]                         LEDDP=01A4
[00011]                         KEY=0247
[00012]                     ;
[00013] 8000  BBF8FF            MOV BX,SEG8
[00014] 8003  B080              MOV AL,80
[00015] 8005  8807          TMR0:MOV [BX],AL
[00016] 8007  43                INC BX
[00017] 8008  75FB              JNZ TMR0 <8005>
[00018] 800A  E89781            CALL LEDDP <01A4>
[00019]                     ;tmr0 set
[00020] 800D  B850C3            MOV AX,C350;=50000
[00021] 8010  BA52FF            MOV DX,FF52;T0CMPA
[00022] 8013  EF                OUT DX,AX
[00023] 8014  E83082        STNBY:CALL KEY <0247>
[00024] 8017  FEC0              INC AL
[00025] 8019  74F9              JZ STNBY <8014>
[00026] 801B  FEC8              DEC AL
[00027] 801D  7407              JZ ZCLR <8026>
[00028] 801F  3C01              CMP AL,01
[00029] 8021  7415              JZ START <8038>
[00030] 8023  EBEF90            JMP STNBY <8014>
[00031]                     ;
[00032] 8026  33C0          ZCLR:XOR AX,AX
[00033] 8028  A3ECFF            MOV [*DATAL],AX
[00034] 802B  A3EEFF            MOV [*ADRSL],AX
[00035] 802E  BA50FF            MOV DX,FF50;T0CNT
[00036] 8031  EF                OUT DX,AX
[00037] 8032  E86C81        ZCLR2:CALL ADDSP <01A1>
[00038] 8035  EBDD90            JMP STNBY <8014>
[00039]                     ;
[00040] 8038  BA56FF        START:MOV DX,FF56;T0CON
[00041] 803B  B801C0            MOV AX,C001
[00042] 803E  EF                OUT DX,AX
[00043] 803F  E80582        START2:CALL KEY <0247>
[00044] 8042  FEC0              INC AL
[00045] 8044  7404              JZ START3;no key <804A>
[00046] 8046  3C03              CMP AL,03;[2] input?
[00047] 8048  7422              JZ STOP <806C>
[00048] 804A  ED            START3:IN AX,DX
[00049] 804B  A820              TEST AL,20;max count?
[00050] 804D  74F0              JZ START2;no <803F>
[00051] 804F  BEECFF            MOV SI,*DATAL
[00052] 8052  B104              MOV CL,04
[00053] 8054  8A04          START4:MOV AL,[SI]
[00054] 8056  0401              ADD AL,01
[00055] 8058  27                DAA
[00056] 8059  8804              MOV [SI],AL
[00057] 805B  7305              JNC START5 <8062>
[00058] 805D  46                INC SI
[00059] 805E  FEC9              DEC CL
[00060] 8060  75F2              JNZ START4 <8054>
[00061] 8062  B80100         START5:MOV AX,0001;clr MC
[00062] 8065  EF                OUT DX,AX
[00063] 8066  E83881            CALL ADDSP <01A1>
[00064] 8069  EBD490            JMP START2 <803F>
[00065]                     ;
[00066] 806C  B80140        STOP:MOV AX,4001
[00067] 806F  EF                OUT DX,AX
[00068] 8070  EBA290            JMP STNBY <8014>
[00069]                     ;
ADDSP        =01A1  ADRSH        =FFEF  ADRSL        =FFEE  DARAH        =FFED  
DATAL        =FFEC  KEY          =0247  LEDDP        =01A4  SEG8         =FFF8  
START        =8038  START2       =803F  START3       =804A  START4       =8054  
START5       =8062  STNBY        =8014  STOP         =806C  TMR0         =8005  
ZCLR         =8026  ZCLR2        =8032  

プログラムを開始すると7セグメントLEDに........と表示してキー入力待ちになります。
このときキー入力は[0]と[1]以外は受け付けません。
[0]はタイマーをリセットします。
その結果7セグメントLEDの表示は00000000になります。
そのあとまたキー入力待ちになります。
[1]の入力でタイマーがスタートします。
Timer 0はシステムクロック(20MHz)の4クロックごとにカウントアップします。
20/4=5MHzですから0.2μsecごとにカウントアップすることになります。
Maxcount Compare AレジスタにはC350H(=50000)をセットします。
この結果Timer 0は0.2×50000=10000μsec=10msecごとにMaxcountになりMCビットが1になります。
プログラムはMCビットを監視していてMC=1になったら7セグメントLEDの最下位桁を+1します。
7セグメントLEDの表示は右2桁がDATAL、その左2桁がDATAH、その左2桁がADRSL、一番左の2桁がADRSHの値をそれぞれ表示します。
ですからプログラムの動作は10msecごとにDATALに+1を加算し、繰り上がりがあればその上位桁(DATAH)に+1を加算する、というように計算します。
時計の表示は十進ですから加算後に十進補正命令DAAを実行します。
7セグメントLEDの右から3桁目が秒になります。
プログラムが複雑になるため分、時への換算は行ないません。
カウント中は[2]のみキー入力を受け付けます。
[2]をキー入力するとカウントストップします。
そのあとはカウント値の表示を保持したまま最初に戻って、[0]または[1]の入力を待ちます。
[1]を入力するとストップしたときの値からカウントアップを再開します。

Timer 0がMaxcountに達してMCビットが1になったあとの処理について。
Timer 0の設定は連続カウントになっていますから、MCビットが1になったあとTimer 0は0からまたカウントを続けます。
このときMCビットは1のままですから、MCビットだけ0にします。
それを行なっているのがSTART5:のところです。

こうやって実際にプログラムでAM188の内蔵タイマーを使ってみた感想としては、割と扱い易いタイマーだと思います。

16ビットマイコンボードの製作[第101回]
2018.10.19upload

前へ
次へ
ホームページトップへ戻る