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