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


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

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

[第89回]



●LCD表示サブルーチン

前回お約束しましたので、今回はAM188のI/O制御のサンプルとしてLCD表示プログラムをお見せします。
と書きましたけれど、プログラムの全部ではなくて一部分です。
LCDに表示データを送る部分はBASICプログラムの一部となっていて、部分的に取り出すのがちょっとむつかしいです。
ですので、LCDの初期設定の部分を中心に見ていただくことにします。
それだけでも結構複雑です。
丁寧に説明をしている時間はとてもありませんので、ほとんどリストのみになります。
特にLCDの初期設定の部分はLCDに内蔵のLCDコントローラのコマンドルールの資料がないとなにをやっているのかわからないと思います。
たかがLCDですけれど。結構大変なことをやっているのだな、という程度の軽い気持ちで見ていただければ、と思います。

下はPIO端子の入出力設定の部分です。
LCDの制御にはP13、14、15、17、18、19、31を使います。
IOOUTSETはその全部を出力に設定します。
IOINSETはP13、19、31を出力、P14、15、17、18を入力に設定します。
ちなみにP14、15、17、18はデータラインD4、D5、D6、D7です。
P13がRS、P19がR/W_、P31がEです。

[00814]                     ;;p13,14,15,17,18,19,31=out//mode=1,dir=0
[00815] 1D75  BA70FF        IOOUTSET:MOV DX,FF70;mode reg 0-15
[00816] 1D78  ED                IN AX,DX
[00817] 1D79  80CCE0            OR AH,E0;p15,14,13
[00818] 1D7C  EF                OUT DX,AX
[00819] 1D7D  BA76FF            MOV DX,FF76;mode reg 16-31
[00820] 1D80  ED                IN AX,DX
[00821] 1D81  0D0E80            OR AX,800E;p31,19,18,17
[00822] 1D84  EF                OUT DX,AX
[00823] 1D85  BA72FF            MOV DX,FF72;dir reg 0-15
[00824] 1D88  ED                IN AX,DX
[00825] 1D89  80E41F            AND AH,1F;p15,14,13
[00826] 1D8C  EF                OUT DX,AX
[00827] 1D8D  BA78FF            MOV DX,FF78;dir reg 16-31
[00828] 1D90  ED                IN AX,DX
[00829] 1D91  25F17F            AND AX,7FF1;p31,19,18,17
[00830] 1D94  EF                OUT DX,AX
[00831] 1D95  C3                RET
[00832]                     ;
[00833]                     ;;p13,19,31=out//mode=1,dir=0,p14,15,17,18=in//mode=0,dir=1
[00834] 1D96  BA70FF        IOINSET:MOV DX,FF70;mode reg 0-15
[00835] 1D99  ED                IN AX,DX
[00836] 1D9A  80E43F            AND AH,3F;p15,14=0,13=1
[00837] 1D9D  80CC20            OR AH,20
[00838] 1DA0  EF                OUT DX,AX
[00839] 1DA1  BA76FF            MOV DX,FF76;mode reg 16-31
[00840] 1DA4  ED                IN AX,DX
[00841] 1DA5  25F9FF            AND AX,FFF9;p31,19=1,18,17=0
[00842] 1DA8  0D0880            OR AX,8008
[00843] 1DAB  EF                OUT DX,AX
[00844] 1DAC  BA72FF            MOV DX,FF72;dir reg 0-15
[00845] 1DAF  ED                IN AX,DX
[00846] 1DB0  80E4DF            AND AH,DF;p15,14=1,p13=0
[00847] 1DB3  80CCC0            OR AH,C0;p15,14=in
[00848] 1DB6  EF                OUT DX,AX
[00849] 1DB7  BA78FF            MOV DX,FF78;dir reg 16-31
[00850] 1DBA  ED                IN AX,DX
[00851] 1DBB  25F77F            AND AX,7FF7;p31,19=0
[00852] 1DBE  0C06              OR AL,06;p18,17=in
[00853] 1DC0  EF                OUT DX,AX
[00854] 1DC1  C3                RET

LCDからデータまたはビジーフラグを読むためのサブルーチンです。
以前の回路のハード上の制約からLCDIFのデータのIN/OUTは8ビットではなくて4ビット×2回で行なっています。
8ビットのデータを読むだけでもこれだけのプログラムになってしまいます。

[00856] 1DC2  E8D1FF        LCDINSB:CALL IOINSET <1D96>
[00857] 1DC5  B000          MOV AL,00    
[00858] 1DC7  FEC8          LCDINSB1:DEC AL
[00859] 1DC9  75FC          JNZ LCDINSB1 <1DC7>
[00860]                     ;MOV AL,10;       P14(R/W_)=1,P15(RS)=0
[00861]                     ;OUT 2E
[00862] 1DCB  BA74FF            MOV DX,FF74;pdata reg 0-15
[00863] 1DCE  ED                IN AX,DX
[00864] 1DCF  80E4DF            AND AH,DF;p13(RS)=0
[00865] 1DD2  EF                OUT DX,AX
[00866] 1DD3  BA7AFF            MOV DX,FF7A;pdata reg 16-31
[00867] 1DD6  ED                IN AX,DX
[00868] 1DD7  0D0880            OR AX,8008;p31(E)=1;p19(R/W_)=1
[00869] 1DDA  EF                OUT DX,AX
[00870]                     ;MOV AL,CF;       P27(E)=1
[00871]                     ;OUT 33
[00872] 1DDB  EB0190        JMP LCDINSB2 <1DDE>
[00873] 1DDE  ED            LCDINSB2:IN AX,DX;IN AL,2E
[00874] 1DDF  A804              TEST AL,04;BF //? BIT 3,A
[00875] 1DE1  9C                PUSHF;? PUSH AF;       SAVE FLAG
[00876] 1DE2  8AD8              MOV BL,AL;bit2=d7,bit1=d6//? LD L,A
[00877] 1DE4  B105              MOV CL,5
[00878] 1DE6  D2C3              ROL BL,CL
[00879] 1DE8  80E3C0            AND BL,C0;d7,d6
[00880] 1DEB  BA74FF            MOV DX,FF74
[00881] 1DEE  ED                IN AX,DX
[00882] 1DEF  D0CC              ROR AH
[00883] 1DF1  D0CC              ROR AH
[00884] 1DF3  80E430            AND AH,30;d5,d4
[00885] 1DF6  0ADC              OR BL,AH
[00886]                     ;MOV AL,CE;       P27(E)=0
[00887]                     ;OUT 33
[00888] 1DF8  BA7AFF            MOV DX,FF7A
[00889] 1DFB  ED                IN AX,DX
[00890] 1DFC  80E47F            AND AH,7F;p31(E)=0
[00891] 1DFF  EF                OUT DX,AX
[00892] 1E00  EB0190        JMP LCDINSB3 <1E03>
[00893]                     LCDINSB3:;MOV AL,CF;P27(E)=1
[00894]                     ;OUT 33
[00895] 1E03  80CC80            OR AH,80;p31(E)=1
[00896] 1E06  EF                OUT DX,AX
[00897] 1E07  EB0190        JMP LCDINSB4 <1E0A>
[00898]                     LCDINSB4:;IN AL,2E
[00899]                     ;AND AL,0F
[00900]                     ;? SLA L
[00901]                     ;? SLA L
[00902]                     ;? SLA L
[00903]                     ;? SLA L
[00904] 1E0A  ED                IN AX,DX
[00905] 1E0B  D0C0              ROL AL;bit3,bit2
[00906] 1E0D  240C              AND AL,0C
[00907] 1E0F  0AD8              OR BL,AL
[00908] 1E11  BA74FF            MOV DX,FF74
[00909] 1E14  ED                IN AX,DX
[00910] 1E15  D0C0              ROL AL
[00911] 1E17  D0C0              ROL AL;bit1,bit0
[00912] 1E19  2403              AND AL,03
[00913] 1E1B  0AD8              OR BL,AL
[00914]                     ;OR AL,L
[00915]                     ;? LD L,A
[00916]                     ;MOV AL,CE;p27(E)=0
[00917]                     ;OUT 33
[00918] 1E1D  BA7AFF            MOV DX,FF7A
[00919] 1E20  ED                IN AX,DX
[00920] 1E21  80E47F            AND AH,7F;p31(E)=0
[00921] 1E24  EF                OUT DX,AX
[00922] 1E25  E84DFF            CALL IOOUTSET <1D75>
[00923] 1E28  9D            POPF;BF//? POP AF
[00924] 1E29  C3            RET;BL=in data


こちらはデータ出力サブルーチンです。
プログラムが長くなるにはわけがあります。
もともとはZBKボード用に作ったインターフェースを利用しています。
KL5C80A12CPUボードの出力端子と同じ端子配列のコネクタをAM188のPIOとして使おうとすると、4ビットのデータだけでもPDATAレジスタの下位4ビットとか上位4ビットとかというようにまとめるようにはできません。
最初からAM188用の端子配列のコネクタを用意すればもっと簡単なプログラムにできたのですが、それだけのことをしている時間がありませんでした。
ハードでKL5C80A12とAM188の端子を同じ配列で利用しているために、そのしわ寄せがプログラムに来てしまいました。

[00765] 1D1F  A0D9F0        LCDOT:MOV AL,[LCDMK]
[00766] 1D22  0AC0          OR AL,AL
[00767] 1D24  7501              JNZ LCDOT2 <1D27>
[00768] 1D26  C3                RET;? RET Z ///no LCD
[00769] 1D27  E89800        LCDOT2:CALL LCDINSB <1DC2>
[00770] 1D2A  75FB          JNZ LCDOT2 <1D27>
[00771] 1D2C  E80400        LCDOTSB:CALL LCDOTSB2 <1D33>
[00772] 1D2F  B104              MOV CL,04
[00773] 1D31  D2C7              ROL BH,CL
[00774]                     ;
[00775]                     ;BH bit7-4 data,CH=02 or 00
[00776]                     LCDOTSB2:;AND AL,0F
[00777] 1D33  BA74FF            MOV DX,FF74
[00778] 1D36  ED                IN AX,DX
[00779] 1D37  80CCE0            OR AH,E0
[00780] 1D3A  F6C720            TEST BH,20;bit5
[00781] 1D3D  7503              JNZ LCDOTSB3 <1D42>
[00782] 1D3F  80E47F            AND AH,7F
[00783] 1D42  F6C710        LCDOTSB3:TEST BH,10;bit4
[00784] 1D45  7503              JNZ LCDOTSB4 <1D4A>
[00785] 1D47  80E4BF            AND AH,BF
[00786] 1D4A  0AED          LCDOTSB4:OR CH,CH
[00787] 1D4C  7503              JNZ LCDOTSB5 <1D51>
[00788] 1D4E  80E4DF            AND AH,DF;RS=0
[00789] 1D51  EF            LCDOTSB5:OUT DX,AX
[00790] 1D52  BA7AFF            MOV DX,FF7A
[00791] 1D55  ED                IN AX,DX
[00792] 1D56  0C06              OR AL,06
[00793] 1D58  F6C780            TEST BH,80;bit7
[00794] 1D5B  7502              JNZ LCDOTSB6 <1D5F>
[00795] 1D5D  24F3              AND AL,F3
[00796] 1D5F  F6C740        LCDOTSB6:TEST BH,40;bit6
[00797] 1D62  7502              JNZ LCDOTSB7 <1D66>
[00798] 1D64  24F5              AND AL,F5
[00799] 1D66  24F7          LCDOTSB7:AND AL,F7;wr_
[00800] 1D68  80E47F            AND AH,7F;E=0
[00801] 1D6B  EF                OUT DX,AX
[00802]                     ;OR AL,C;p15(bit5,RS)=1 or 0
[00803]                     ;OUT 2E
[00804]                     ;MOV AL,CF;E=1
[00805]                     ;OUT 33
[00806] 1D6C  80CC80            OR AH,80
[00807] 1D6F  EF                OUT DX,AX
[00808]                     ;DEC A;E=0
[00809]                     ;OUT 33
[00810] 1D70  80E47F            AND AH,7F
[00811] 1D73  EF                OUT DX,AX
[00812] 1D74  C3            RET


こちらがLCDの初期設定ルーチンです。
TXXMSとかTXXMCというのはXXms、XXμsのウェイトルーチンです。
そのリストは省略します。

[00961] 1E5D  E815FF        LINIT:CALL IOOUTSET <1D75>
[00962] 1E60  E8CDFF            CALL T15MS <1E30>
[00963] 1E63  32ED              XOR CH,CH;MOV BL,00
[00964] 1E65  B730              MOV BH,30;MOV AL,03
[00965] 1E67  E8C9FE        CALL LCDOTSB2 <1D33>
[00966] 1E6A  E8BDFF        CALL T5MS <1E2A>
[00967] 1E6D  B730              MOV BH,30;MOV AL,03
[00968] 1E6F  E8C1FE        CALL LCDOTSB2 <1D33>
[00969] 1E72  E8D3FF        CALL T240MC <1E48>
[00970] 1E75  B730              MOV BH,30;MOV AL,03
[00971] 1E77  E8B9FE        CALL LCDOTSB2 <1D33>
[00972] 1E7A  E8CBFF        CALL T240MC <1E48>
[00973] 1E7D  B720              MOV BH,20;MOV AL,02
[00974] 1E7F  E8B1FE        CALL LCDOTSB2 <1D33>
[00975] 1E82  E8C3FF        CALL T240MC <1E48>
[00976] 1E85  E83AFF        CALL LCDINSB <1DC2>
[00977] 1E88  7406          JZ LIN2 <1E90>
[00978] 1E8A  32C0              XOR AL,AL
[00979] 1E8C  A2D9F0            MOV [LCDMK],AL;? LD (LCDMK),A
[00980] 1E8F  C3            RET
[00981] 1E90  B001          LIN2:MOV AL,01
[00982] 1E92  A2D9F0            MOV [LCDMK],AL;? LD (LCDMK),A
[00983] 1E95  B728          MOV BH,28
[00984] 1E97  E885FE        CALL LCDOT <1D1F>
[00985] 1E9A  B708          MOV BH,08
[00986] 1E9C  E880FE        CALL LCDOT <1D1F>
[00987] 1E9F  B701          MOV BH,01
[00988] 1EA1  E87BFE        CALL LCDOT <1D1F>
[00989] 1EA4  B706          MOV BH,06
[00990] 1EA6  E876FE        CALL LCDOT <1D1F>
[00991] 1EA9  E884FF        CALL T15MS <1E30>
[00992] 1EAC  B70E          MOV BH,0E
[00993] 1EAE  E86EFE        CALL LCDOT <1D1F>
[00994] 1EB1  C3            RET


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

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