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
前へ
次へ
ホームページトップへ戻る