ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
当記事は2009年11月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 |
2011.7.4 前へ 次へ 目次へ戻る ホームページトップへ戻る |
☆整数BASICコンパイラ ND80ZVには浮動小数点計算のできるBASIC機能が搭載されていて、パソコンとUSB接続した環境で使うことができます。 ND80ZVに搭載されているBASICはインタプリタですが、それとは別にND80ZVには整数BASICコンパイラも附属しています。 |
[第83回]
●整数BASICコンパイラ(SBASIC)の続きです
今回も前回に続いてSBASICについてのお話です。
前回はI/Oポートにパルスを出力する簡単なプログラムを、機械語(マシン語)、Z80BASICインタプリタ、そしてSBASICコンパイラでそれぞれ作って、実行した結果をオシロスコープで見てみました。
一番短い幅のパルスを出力する、といった意味合いのプログラムでしたから、それはそれなりに意味のあるプログラムですけれど、余りに簡単すぎました。
とにかくOUT文とGOTO文しかありませんから、これではBASICのありがたみもちょっと実感できそうにありません。
そこで今回はもう少し、といっても本当に少しだけなのですが、長いプログラムを作って、前回と同じようにオシロスコープで見て比較してみたいと思います。
前回と同じように、まずはZ80BASICです。
10 OUT $83,$80 20 A%=100 30 B%=0 40 OUT $80,0 50 B%=B%+1:IF B%<=A% GOTO 50 60 B%=0 70 OUT $80,1 80 B%=B%+1:IF B%<=A% GOTO 80 90 GOTO 30 |
;ASMTEST2 10.8.17 ORG $8050 VAP=$F440 VBP=$F442 ; LD A,80 OUT (83),A LOOP0:OUT (80),A LD DE,(VBP) LOOP1:LD HL,(VAP) OR A INC DE SBC HL,DE JP NZ,LOOP1 INC A JP LOOP0 |
Z80アセンブラ(ZASM.COM)でアセンブルして機械語(マシン語)のバイナリファイルを作成します。
Z80BASICを起動して、バイナリファイルをロードします。
NEWコマンドはBASICプログラムを格納する開始アドレスを指定するコマンドです。
Z80BASICが起動した直後は、BASICプログラムの格納開始アドレスは8004になります。
今回は機械語のプログラムを8050から実行開始するように書きましたから、そのプログラムのロードするエリアを確保するために、NEW,8100を実行しています。
BASICのメインプログラムはA%とB%の値を定義して、機械語サブルーチンコール命令USR()を実行するだけのプログラムです。
USR()命令の()の中には機械語サブルーチンのエントリアドレス(スタートするアドレス)を指定します。
実行結果です。
100回の加算(インクリメント)と比較(減算)とジャンプ命令の実行時間は0.8msecほどです。
そして、次はSBASICです。
'SBASIC TEST2 10/8/17 ORG=$8004 OUT $83,$80 *LOOP:B%=0 OUT $80,0 *LOOP1:B%=B%+1:IF B%<=A% GOTO *LOOP1 B%=0 OUT $80,1 *LOOP2:B%=B%+1:IF B%<=A% GOTO *LOOP2 GOTO *LOOP |
8004 218300 LD HL,$0083 8007 4D LD C,L 8008 218000 LD HL,$0080 800B ED69 OUT (C),L 800D 210000 LD HL,$0000 8010 2242F4 LD ($F442),HL 8013 218000 LD HL,$0080 8016 4D LD C,L 8017 210000 LD HL,$0000 801A ED69 OUT (C),L 801C 2A42F4 LD HL,($F442) 801F E5 PUSH HL 8020 210100 LD HL,$0001 8023 D1 POP DE 8024 CD643E CALL $3E64 8027 2242F4 LD ($F442),HL 802A 2A42F4 LD HL,($F442) 802D E5 PUSH HL 802E 2A40F4 LD HL,($F440) 8031 D1 POP DE 8032 B7 OR A 8033 ED52 SBC HL,DE 8035 CB7C BIT 7,H 8037 210100 LD HL,$0001 803A 2803 JR Z,03 803C 2D DEC L 803D 1802 JR 02 803F 7D LD A,L 8040 B7 OR A 8041 C21C80 JP NZ,$801C 8044 210000 LD HL,$0000 8047 2242F4 LD ($F442),HL 804A 218000 LD HL,$0080 804D 4D LD C,L 804E 210100 LD HL,$0001 8051 ED69 OUT (C),L 8053 2A42F4 LD HL,($F442) 8056 E5 PUSH HL 8057 210100 LD HL,$0001 805A D1 POP DE 805B CD643E CALL $3E64 805E 2242F4 LD ($F442),HL 8061 2A42F4 LD HL,($F442) 8064 E5 PUSH HL 8065 2A40F4 LD HL,($F440) 8068 D1 POP DE 8069 B7 OR A 806A ED52 SBC HL,DE 806C CB7C BIT 7,H 806E 210100 LD HL,$0001 8071 2803 JR Z,03 8073 2D DEC L 8074 1802 JR 02 8076 7D LD A,L 8077 B7 OR A 8078 C25380 JP NZ,$8053 807B C30D80 JP $800D 807E C9 RET |
0000 'SBASIC TEST2 10/8/17 0000 ORG=$8004 8004 OUT $83,$80 800D *LOOP:800D B%=0 8013 OUT $80,0 801C *LOOP1:801C B%=B%+1:802A IF B%<=A% GOTO *LOOP1 8044 B%=0 804A OUT $80,1 8053 *LOOP2:8053 B%=B%+1:8061 IF B%<=A% GOTO *LOOP2 807B GOTO *LOOP 807E |