16ビットマイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使ってみるつもりで入手してそのまま置いてあった16ビットCPUのことを思い出しました。
AMD社のAM188です。
その名の通り、CPUコアは80188互換の16ビットCPUです。
そのAM188を使った16ビットマイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第98回]
●電子オルガンプログラム
このところAM188版の説明書の作成作業に取り組んでいます。
86モニタプログラム(TK80的モニタプログラム)の取扱説明書がもうじき出来上がります。
本日はその中に記載する予定のサンプルプログラム、電子オルガンプログラムを作成しました。
電子オルガンプログラムはND80Z3.5のTK80モニタプログラム操作説明書に記載しています。
それは8080ニーモニックで書いて8080アセンブラでマシン語プログラムを作成したものです。
TK80モニタモードで動作します。
今回作成した8086版は8080版と同じ動作をします。
ニーモニックや命令コードはもちろん8080とは異なりますが、プログラムのつくりは8080版と同じですので、8080版のプログラムリストと比べてみていただくことで、8086のマシン語プログラムを理解する上での助けになると思います。
TK80モニタと同じシステムサブルーチン(KEY=0247)をCALLしていますが、前回説明しましたアドレスを直接指定してのCALLになっているところにも注目してください。
ただし8080と違ってマシン語コードでは相対アドレスになっています(相対アドレスについては前回を参照してください)。
2018/10/15 11:51 86sound.LST [00001] ;;; sound for am188 clock=20MHz [00002] ;from sound6 [00003] ;;; 18/10/15 [00004] ;;; [00005] ORG=8000 [00006] ; [00007] KEY=0247 [00008] ; [00009] 8000 E84482 SND:CALL KEY <0247> [00010] 8003 FEC0 INC AL [00011] 8005 74F9 JZ SND <8000> [00012] 8007 FEC8 DEC AL [00013] 8009 E80300 CALL SNDSB <800F> [00014] 800C EBF290 JMP SND <8000> [00015] ; [00016] 800F 50 SNDSB:PUSH AX [00017] 8010 BB3F80 MOV BX,SNDTBL [00018] 8013 02D8 ADD BL,AL [00019] 8015 8A2F MOV CH,[BX] [00020] 8017 B21A MOV DL,1A [00021] 8019 8AF5 SNDS1:MOV DH,CH [00022] 801B B0EF MOV AL,EF;sp out=H,DMAoff [00023] 801D E698 OUT 98,AL [00024] 801F B108 SNDS2:MOV CL,08 [00025] 8021 FEC9 SNDS22:DEC CL [00026] 8023 75FC JNZ SNDS22 <8021> [00027] 8025 FECE DEC DH [00028] 8027 75F6 JNZ SNDS2 <801F> [00029] 8029 8AF5 MOV DH,CH [00030] 802B B0CF MOV AL,CF;sp out=L,DMAoff [00031] 802D E698 OUT 98,AL [00032] 802F B108 SNDS3:MOV CL,08 [00033] 8031 FEC9 SNDS32:DEC CL [00034] 8033 75FC JNZ SNDS32 <8031> [00035] 8035 FECE DEC DH [00036] 8037 75F6 JNZ SNDS3 <802F> [00037] 8039 FECA DEC DL [00038] 803B 75DC JNZ SNDS1 <8019> [00039] 803D 58 POP AX [00040] 803E C3 RET [00041] ; [00042] ; SOUND TABLE [00043] 803F 7F SNDTBL:DB 7F;so4 [00044] 8040 77 DB 77;so#4 [00045] 8041 71 DB 71;ra4 [00046] 8042 6A DB 6A;ra#4 [00047] 8043 5F DB 5F;do5 [00048] 8044 59 DB 59;do#5 [00049] 8045 54 DB 54;re5 [00050] 8046 4F DB 4F;re#5 [00051] 8047 47 DB 47;fa5 [00052] 8048 43 DB 43;fa#5 [00053] 8049 3F DB 3F;so5 [00054] 804A 3B DB 3B;so#5 [00055] 804B 35 DB 35;ra#5 [00056] 804C 32 DB 32;si5 [00057] 804D 2F DB 2F;do6 [00058] 804E 2C DB 2C;do#6 [00059] 804F 25 DB 25;mi6 [00060] 8050 27 DB 27;re#6 [00061] 8051 2A DB 2A;re6 [00062] 8052 4B DB 4B;mi5 [00063] 8053 38 DB 38;ra5 [00064] 8054 64 DB 64;si4 [00065] 8055 23 DB 23;fa6 [00066] 8056 21 DB 21;fa#6 [00067] ;END KEY =0247 SND =8000 SNDS1 =8019 SNDS2 =801F SNDS22 =8021 SNDS3 =802F SNDS32 =8031 SNDSB =800F SNDTBL =803F |
SNDS2とSNDS3のところで10μsec幅のH、Lパルスを出力しているのですが(1周期は20μsec)、ここは計算ではうまく求まりません。
そのことについては[第57回]を参照願います。
ここは結局出力される音の高さを確認しながらカットアンドトライで繰り返しの回数を求めました。
アバウトですから正確な音の高さからは多少ずれていると思います。
妻に言わせると「微妙にずれているみたい」なのだそうですが、私はそんな耳は持っていませんので、ちゃんとド、レ、ミに聞こえます。
16ビットマイコンボードの製作[第98回]
2018.10.15upload
前へ
次へ
ホームページトップへ戻る