メニュー 使い方&ダウンロード G4CBASICサンプル コード展示室 G4CBASIC文法 利用規約 更新履歴 リンク
G4CBASIC = GMC-4マイコン専用ちびBASICについて

大人の科学マガジンVol.24の付録の4ビットマイコン(GMC−4)と電子ブロックのFXマイコン専用のBASICコンパイラを提供しています。
商品画像    大人の科学マガジン (24) (4ビットマイコン) (Gakken Mook) /大人の科学マガジン編集部 
 ISBN:4056054711 : 発売日 2009/07/01 : 学習研究社 ムック  
 
新品:\2,500(2009/07/17 PM20:32)  

学研のサイト
http://otonanokagaku.net/magazine/vol24/index.html

たかが4ビットマイコンにコンパイラは大げさですが、私自身のコンパイラを作る勉強にもなるので作らせていただきました。
アセンブラが不慣れな人にもマイコンの面白さを味わってもらいたいのと、このコンパイラが出力したアセンブラコードを元にアセンブラへの理解を深めてほしいな〜とも思っています。※ ぜひ、お試しください。

同じ様な事を考えて同時期にCコンパイラを発表されたterusさん共々がんばりたいと思いますので、よろしくお願いします。
http://terus.jp/engineering/gmc4cc/

コマンドプロンプトでのコンパイルの画面
g4cbasic.png

使い方

1.ダウンロード
Windows環境のコマンドプロンプトで使います。
まず、G4CBASICをダウンロードしてください。
G4CBASIC最新版をダウンロード Ver0.404 (2009/08/10)

古いバージョンも残しておきます。
G4CBASICVer0.103をダウンロード  (2009/07/23)
G4CBASICVer0.206をダウンロード  (2009/07/30)
G4CBASICVer0.304をダウンロード  (2009/08/04)


2.解凍
ダウンロードしたzipファイルは解凍してください。
お勧め解凍ソフト→http://park8.wakwak.com/~app/Lhaca/
解凍すると以下のファイルが格納されています。
ファイル名 説明
G4CBASIC.exe BASICコンパイラです。このソフトでコンパイルします。
gmc4ccsampe.bas gmc4cc用のサンプルをG4CBASIC用に書き換えたものです。
sample.bas G4CBASICのサンプルコードです。
program1〜10.bas 大人の科学Vol24のサンプルのBASIC移植版です。
一応全て移植しました。
readme.html 簡単な説明のドキュメントです。
command.bat コンパイル作業のためのコマンドプロンプトを起動します。
解凍したファイルはフォルダごとCドライブやDドライブのルートなど分かりやすいところに変えたほうが良いでしょう。
そのときフォルダ名は"G4CBASIC"と名前を変更をお勧めします。

3.コンパイルの仕方
(1) command.batをダブルクリックしてコマンドプロンプト起動します。

D:\G4CBASIC>cmd
Microsoft Windows [Version 6.0.6001]
Copyright (c) 2006 Microsoft Corporation.  All rights reserved.

D:\G4CBASIC>


(2) 早速、G4CBASICを起動してみましょう。
G4CBASIC.exeと入力します。

D:\G4CBASIC>G4CBASIC.exe
GMC4ちびBASIC(G4CBASIC) Version 0.304
option :
G4CBASIC <file>.bas [-On] [-STEPLIST] [-FXP] [-ASMc]
   -On                最適化する。nは最適化レベル0から2
   -STEPLIST or -SL   マシン語を1ステップずつ表示する
   -STEPLIST2 or -SL2 マシン語を1ステップずつ表示する。タイプ2。
   -LIST2 or -L2      マシン語をタイプ2で表示する。
   -FXP or -F         fxpファイル出力
   -ASM or -A         アセンブラ・ソースファイル出力
   -ASMc or -Ac       同上。ただしコメント開始がcの文字となります

 コンパイルするファイル名を指定しなかったのでオプションが表示されました。
 オプションを説明します。
オプション 説明
-On 最適化するレベルを指定します。nは最適化レベルの0(最低)から2(最高)です。
省略時は-O2とみなされます。
-STEPLIST or -SL GMC-4への入力を楽にするため、マシン語を1ステップずつ表示します。
次のステップの表示はキーボードの何らかのキーを押してください。
-STEPLIST2 or -SL2 上記と同様にマシン語を1ステップずつ表示します。
表示形式は命令毎に一行にまとめて表示されるタイプです。お好みでお使いください。

タイプ1は、こんな感じ。
□□□□□□□(00) [ 8 ]  TIA 0          line(11) FOR A=0 TO 6
□□□□□□■(01) [ 0 ]
□□□□□■□(02) [ A ]  TIY 0
□□□□□■■(03) [ 0 ]
□□□□■□□(04) [ 4 ]  AM


タイプ2だとこんな感じ。
□□□□□□□(00) [ 8 0   ] TIA 0           line(11) FOR A=0 TO 6
□□□□□■□(02) [ A 0   ] TIY 0
□□□□■□□(04) [ 4     ] AM

-LIST2 or -L2 表示が命令毎に一行にまとめて表示されるタイプ2で表示します。ステップごとに停止はしません。
-FXP or -F fxpファイル出力をします。FX-マイコン シミュレータでロードして実行できます。
-ASM or -A
-ASMc or -Ac
アセンブラコードのファイルを出力します。
アセンブラがYasuhoさんのほぼ「 GMC-4 アセンブラ 」専用になりました
みけCATさんのアセンブラもOKになりました。
cはコメントの先頭文字を変えられます。省略時は';'

(3) サンプルをコンパイルしてみましょう。
G4CBASIC.exe sample.basと入力します。

D:\G4CBASIC>G4CBASIC.exe sample.bas
GMC4ちびBASIC(G4CBASIC) Version 0.304
option :
 file=sample.bas

文法チェック正常終了
中間コード化終了
最適化終了

-- コンパイル結果 --
address2進(16進)   code   source          comment
-6-5-4-3-2-1-0-------------------------------------------------
                   LABEL0:
□□□□□□□(00) [ 8 ]  TIA 0          line(11) FOR A=0 TO 6
□□□□□□■(01) [ 0 ]
□□□□□■□(02) [ A ]  TIY 0
□□□□□■■(03) [ 0 ]
□□□□■□□(04) [ 4 ] AM

これでサンプルがコンパイルされました。
表示されているコードを順番にGMC-4に入力すればプログラムを実行できます。

[コードの見方]
□□□□□□□(00) [ 8 ]  TIA 0
↑2進のアドレス。□がLED消灯。■がLED点灯。
□□□□□□□(00) [ 8 ]  TIA 0
                       ↑16進のアドレス。
□□□□□□□(00) [ 8 ]  TIA 0
                ↑16進の命令コード。これをGMC-4に入力。
□□□□□□□(00) [ 8 ]  TIA 0
                                   ↑命令のニーモニックコード。
(4) LIST2オプション指定をしてみる。
G4CBASIC.exe sample.bas -L2と入力します。

D:\G4CBASIC>G4CBASIC.exe sample.bas -L2
GMC4ちびBASIC(G4CBASIC) Version 0.304
option : -LIST2:リストタイプ2
 file=sample.bas

文法チェック正常終了
中間コード化終了
最適化終了

-- コンパイル結果 --
address2進(16進)   code      source          comment
-6-5-4-3-2-1-0--------------------------------------------------------
                   LABEL0:
□□□□□□□(00) [ 8 0   ] TIA 0           line(11) FOR A=0 TO 6
□□□□□■□(02) [ A 0   ] TIY 0
□□□□■□□(04) [ 4     ]AM

これでサンプルがLIST2オプション指定でコンパイルされました。
表示されているコードを順番にGMC-4に入力すればプログラムを実行できます。

[タイプ2のコードの見方]
□□□□□□□(00) [ 8 0   ] TIA 0
  ↑2進のアドレス。□がLED消灯。■がLED点灯。
□□□□□□□(00) [ 8 0   ] TIA 0
                        ↑16進のアドレス。
□□□□□□□(00) [ 8 0   ] TIA 0 
                ↑16進の命令コード。これをGMC-4に入力します。JUMPで最大3コードまで表示されます。
□□□□□□□(00) [ 8 0   ] TIA 0
                                     ↑命令のニーモニックコード。


4.自分で作ったソースをコンパイルしてみましょう。
自分のソースコードを作成します。
エディタはメモ帳でもかまいませんが、エディターソフト(秀丸やxyzzy等)などを使うと便利です。
http://www.vector.co.jp/vpack/pickup/win/writing/edit/index.html
sample.bas等を参考に自分のコードを作ってみてください。
出来上がったら名前を付けて保存します。「xxxx.bas」
コンパイルは先ほどと同じく、
G4CBASIC.exe xxxx.bas
です。

以上説明を終わります。

※サポートや要望がある場合。
サポート掲示板をお使いください。



G4CBASICのサンプル

sampe.basのソースコードです。

REM *************************************************
REM GMC-4(FX)マイコン専用クロスコンパイラちびBASIC
REM サンプルコード sample.bas
REM コンパイルの仕方
REM G4CBASIC sample.bas
REM *************************************************

REM * 無限ループ
DO
 REM * LEDを0から6まで順に点灯。
 FOR A=0 TO 6
  REM * LED点灯
  LED_ON(A)
  REM * 0.1秒待つ。
  TIMER(8)
  REM * LED消灯
  LED_OFF(A)
 NEXT
UNTIL FALSE


これをコンパイルすると次の機械語コードが出力されます。Ver0.103の場合。

GMC4ちびBASIC(G4CBASIC) Version 0.103
option : file=sample.bas

文法チェック正常終了
中間コード化終了
最適化終了

-- コンパイル結果 --
address2進(16進)   code source          comment
                   LABEL0:
□□□□□□□(00)  8   TIA 0           line(11) FOR A=0 TO 6
□□□□□□■(01)  0                  
□□□□□■□(02)  A   TIY 0          
□□□□□■■(03)  0                  
□□□□■□□(04)  4   AM             
                   LABEL2:
□□□□■□■(05)  A   TIY 0           line(13) LED_ON(A)
□□□□■■□(06)  0                  
□□□□■■■(07)  5   MA             
□□□■□□□(08)  3   CY             
□□□■□□■(09)  E   CAL SETR       
□□□■□■□(0A)  1                  
□□□■□■■(0B)  8   TIA 8           line(15) TIMER(8)
□□□■■□□(0C)  8                  
□□□■■□■(0D)  E   CAL TIMR       
□□□■■■□(0E)  C                  
□□□■■■■(0F)  E   CAL RSTR        line(17) LED_OFF(A)
□□■□□□□(10)  2                  
□□■□□□■(11)  A   TIY 0           line(11) FOR A=0 TO 6
□□■□□■□(12)  0                  
□□■□□■■(13)  5   MA             
□□■□■□□(14)  9   AIA 1          
□□■□■□■(15)  1                  
□□■□■■□(16)  4   AM             
□□■□■■■(17)  C   CIA 7           line(18) NEXT
□□■■□□□(18)  7                  
□□■■□□■(19)  F   JUMP LABEL2    
□□■■□■□(1A)  0                  
□□■■□■■(1B)  5                  
□□■■■□□(1C)  F   JUMP LABEL0     line(19) UNTIL FALSE
□□■■■□■(1D)  0                  
□□■■■■□(1E)  0                  
-- ここまで --
Code Address(00-1E) Program Size(31word)
コンパイル終了


※ コンパイラと同梱で、サンプルのソースコードを多数添えていますので、参考にしてください。

G4CBASICのコード展示室

今までブログ等で発表ソースコードをまとめた展示室を別に用意しました。
ソースコードのダウンロードも出来ますので、ご利用ください。

 コード展示室に行く


G4CBASICの文法

完全に構造化されたBASIC文法ですので行番号はありません。
あと多少BASICの文法から逸脱している部分があります(笑)。すっかりC言語に染まったのが原因ですがご了承ください。

データメモリの割り当てについて 

 Ver0.200からデータメモリを動的に割り当てる仕組みに変わりました。
必要に応じて割り当てられるので必ずその領域があるわけではありません。

データメモリ(50から5F番地)に
割り当てられる領域
領域の説明
プログラム領域 プログラムが4F番地までに収まらなかった場合に使われます。
プログラムがデータ領域を侵食しますので、使る領域が減りますので注意してください。
配列 DIM文でARRAY[n]のnのサイズ分領域が取られます。
RND2配列 DIM文でRND2[n]のnのサイズ分領域が取られます。
RND2関数専用の領域です。
変数 使われた変数の数だけ領域が取られます。


空き領域です。空き領域が足らなくなるとコンパイルエラーになります。
式計算ワークメモリ 式計算時に使うワークメモリが自動的に割り当てられます。
どれだけ使うかは式の複雑さによります。
LED_DISP変数 LED_DISPを使うと自動的に割り当てられます。

式に関係する文法 

 <変数> AからZaからzで始まる英数字文字列。先頭文字で変数を判断するので2文字目以降は単なるコメントです。Aとaは同じ変数と見なされます。
  例:Ascii=1とace=1は同じ変数への代入とみなされます。

 <配列> ARRAY[添え字]で配列が使えます。配列領域のサイズはDIM文で割り当ててください。
  例:ARRAY[1]= 1とかB= ARRAY[C]とか。
  (注)現状、代入の左辺の場合に添え字に式が使えず数値のみです。後で詳しく書きますがGMC-4の機械語の制約です。

 <単項演算子> NEG:ビット反転 SFT:右シフト
  例:NEG AとかSFT Bと書きます。

 <2項演算子>  +と-だけです。掛け算と割り算はありません。
  例:A+1やA+Cなど。

 <条件演算子> >(大きい) >=(以上) !=(等しくない) = (等しい)< =(以下) <(小さい)の6つです。
  例:A>BやA!=Bなど。

 <数値> 10進数:-15〜-1、0〜15です。ただし、-1と15は同じ値です。 16進数:#0〜#F 2進数 :#b0000〜#b1111

 <式> 変数や配列と単項演算子と2項演算子を組み合わせた物です。
  例:ARRAY[C]+B+1やSFT (A+B)など。

 
<条件式> 式と式を条件演算子と組み合わせて使います。
  例:ARRAY[C]>(B+1)や(A+1)!=Cなど。

基本文に関係する文法 
基本的に1行に1文で書いてください。エラーになります。
※<CR>は改行のマークです。

 <REM文>  コメントを書く場合に使います。基本文の後ろにも書けます。
  例:REM これはコメントです。

 <DIM文> 配列を宣言します。作れる配列は2種類で、ARRAY配列とRND2配列のみです。
  例:DIMで2種類の配列を宣言しています。
 DIM ARRAY[3]
 DIM RND2[3]

 <DATA文>  データを定義する場合に使います。
  書き方は2種類で配列の初期データと変数の初期データを定義できます。 
  ただし、初期データですのでプログラム実行後は書き換わってしますから注意してください。
   例:DATA で変数A,B,Cの初期値と配列の初期値を設定。
 DIM ARRAY[3]
 DATA
 0,#C,#D REM 配列の初期値
 DATA A=3,B=2,C=#b0101 REM 変数の初期値

 <代入文>  <変数>or<配列>=<式>で計算結果を変数や配列に代入します。
  例:ARRAY[1]=CやB=A+1など。

 <FOR文>FORループ文です。 STEPは省略可能。
  FOR <代入文> TO <式> [STEP <値>]               
     複数の文
   NEXT
   例:Aが0から6の間ループします。 
 FOR A=0 TO 6
  PRINT A
 B=B+A
 NEXT
  ※Ver0.205からダウンカウントでループが可能になりました。初期値よりTOの値が小さいとダウンカウントします。
  例:Aが6から0の間ループします。即値でTOの値がFORの値より小さい場合に限ります。
 FOR A=6 TO 0
  PRINT A
 B=B+A
 NEXT
  ※Ver0.304からSTEPでループの刻みを変更できます。STEPはマイナス値も可能です。
  例:Aが0、2、4、6とループします。 終了値がSTEPと合わないと無限ループになりますので注意してください。
  FOR A=0 TO 5 STEP 2は無限ループです。
 FOR A=0 TOSTEP 2
  PRINT A
 B=B+A
 NEXT

 <FORLOOP文>FORLOOP文です。シンプルで機械語的にコンパクトなループが出来ます。
  FORLOOP <値>                
     複数の文
   NEXT
   例:4回ループします。ループ回数は参照できないので使う用途は限られます。  
 FORLOOP  4
  RND(A)
  PRINTA
 NEXT

 <DO文> 条件が成立するまでループします。
  DO               
     複数の文
   UNTIL  <条件式>
  例:Aが0になるまでループ ※ 特殊条件としてUNITL FALSE と書くと無限ループします。
A=6
DO
 PRINT A
 A=A-1
UNTIL A=0

 <WHILE文> 条件が真の間ループします。
   WHILE <条件式>               
     複数の文
   WEND
  例:Aが0より大きければループ ※ 特殊条件としてWHILE TRUE と書くと無限ループします。
A=6
WHILE A>0
 PRINT A
 A=A-1
WEND

 <IF文> IF文で条件分岐します。ELSEは省略可能。
   IF <条件式> THEN               
     複数の文
   ELSE               
     複数の文
   ENDIF
  例:Aが0ならTHENそれ以外はELSEを実行。
IF A= 0 THEN
 PRINT A 
ELSE
 A=A-1 
ENDIF

 <SELECT文> SELECT文で条件分岐します。CASEとDEFAULT文は省略可能。
   SELECT <式>               
   CASE <値>
    複数の文
   CASE <値>
    複数の文
   DEFAULT               
    複数の文
   SEND
CASEはいくつあってもかまいませんが、DEFAULTは最後にひとつだけにしてください。
  例:Aが0ならCASEそれ以外はDEFAULTを実行。
SELECT A
CASE 0
 PRINT A  
DEFAULT
 A=A-1 
SEND

 <BREAK文> ループを1レベル強制的に抜けます。
  例:Aが2になったらループを抜ける。
A=6
DO
 PRINT A
 A=A-1
 IF A = 2 THEN
  BREAK
 ENDIF
UNTIL FALSE

  <CONTINUE文>
 処理を中断してループの条件判断に戻ります。
  例:Aが2のときだけ処理をスキップする。LEDには、0,1,3,4,5と表示されます。
FOR A=0 TO 5
 IF A=2 THEN
  CONTINUE
 ENDIF
 PRINT A
 TIMER(5)
NEXT

 <END文>
 プログラムを終了します(実際にはその場で無限ループ)。
  例:Aが2になったら終了します。
A=6
DO
 PRINT A
 A=A-1
 IF A = 2 THEN
  END
 ENDIF
UNTIL FALSE

 <GOTO文> GOTO <ラベル>と書きます。
 指定ラベルの箇所にジャンプします。プログラムの流れを変えるときに使用します。
  例:入力が3ならエラーを出して終了。GOTO文に書くラベルの記述は必ずコロン":"で終わってください。
DO
 INPUTA
 IF A = 2 THEN
  GOTO ERROR:
 ENDIF
UNTIL FALSE
ERROR:
SOUND(ERRS)
 <GOTOラベル> GOTO文でジャンプするポイントを示すラベルです。
 AからZaからzで始まる英数字文字列で最後はコロン":"で終わってください。
 先頭文字でラベル名を判断するので2文字目以降は単なるコメントです。
 なので、"A:"と"a:"は同じラベルと見なされます。


GMC−4専用命令文 
マイコン専用の命令で、LEDやサウンド制御、キー入力などを行います。

 <PRINT文> 計算結果を数字LEDに表示します。PRINT <式>
  例:A+1を表示。PRINT A+1

 <INPUT文> キーボードから数値を受け取ります。このINPUT文はキーを押すまで待ちます。INPUT <変数>or<配列>
  例:ARRAY[2]にキーの値を入れる。INPUT ARRAY[2]

 <WAIT_KEYOFF文> キーボードのキーを離すのを待ちます。連続でINPUT文を使いたい場合は必ず間に入れてください。
INPUT A
WAIT_KEYOFF()
I
NPUT B

 <IFINPUT文> IF文と基本的に同じですが、キー入力されたときのみTHENを実行します。それとINPUTと違い入力を待ちません。
  IFINPUT <変数>or<配列>or省略  THEN<CR> 文<CR>....  [ ELSE<CR> 文<CR>....  ] ENDIF<CR>
  例:キー入力時のみPRINTする。

IFINPUT A THEN
 PRINT A 
ENDIF
  例:キー入力時のみSOUND(SHORT)がなる。キー値は保存しない。
IFINPUT  THEN
 SOUND(SHORT) 
ENDIF
 
 <PRINT_OFF文> 数字LEDの表示を消します。再び表示はPRINT文を使ってください。

  例:PRINT_OFF

 <LED_ON文> LED_ON(式)の式の値で0〜6の2進LEDをONにします。
  例:1番の2進LEDをON。LED_ON(1)

 <LED_OFF文> LED_OFF(式)の式の値で0〜6の2進LEDをOFFにします。 
  例:2番の2進LEDをOFF。LED_OFF(2)

 <LED_DISP文> 7つの2進LEDを同時に制御します。
     書き方は2種類で1.LED_DISP(式1,式2)か2.LED_DISP()です。
  1.の場合は式1で上位3ビット、式2で下位4ビットのLEDを制御します。
  2.の場合は専用の変数L1L2でそれぞれ上位と下位のLEDを制御できます。
  例:LEDの5,3,2をONにします。
REM その1
LED_DISP(#2,#C) 
REM その2
L1=#2
L2=#C 
LED_DISP()

 <SOUND文> サウンドを鳴らします。SOUND(式)なら式の値が1〜14のそれぞれに対応する音階の音がなります。
  その他にSOUND(ENDS)、SOUND(ERRS)、SOUND(SHORT)、SOUND(LONG) が使えます。
  例:ドの音を鳴らす。 SOUND(3)
  例:エンド音を鳴らす。SOUND(ENDS)
  例:エラー音を鳴らす。SOUND(ERRS)
  例:短い音を鳴らす。 SOUND(SHORT)
  例:長い音を鳴らす。SOUND(LONG)

 <TIMER文> 指定時間だけ処理を待ちます。TIMER(式) の(式の値+1)×0.1秒です。
  例:0.2秒処理を待つ。TIMER (1)


GMC−4専用特殊命令文 
GMC4用の特殊処理を行う命令です。

 <SFT2文> 2つの変数をまとめて右シフトします。SFT2(変数1,変数2)
  例:A=#5でB=#5の場合で、A=#2でB=#AとなりLEDの5,3,1が点灯します。
A=#5
B=#5
SFT2(A,B)
LED_DISP(A,B) 

 <ADDO関数> 桁上がりをサポートする加算関数です。ADDO(式1,式2,変数)。式1+式2が桁上がりしたら変数を+1します。関数の戻り値は式1+式2です。
  例:A=15でB=0の場合。A=ADDO(A,1,B)とするとA=0でB=1となりますので、LEDの0のみ点灯します。
A=15
B=0
A=ADDO(A,1,B)
LED_DISP(A,B)

 <RND文>精度の低い乱数を生成します。RND(変数)。変数にランダムな0〜#Fが代入されますが、精度が悪く周期性がばれやすいです。
  例:変数Aに乱数を代入して表示
RND(A)
PRINT A

 <RND2関数> 精度の高い乱数を生成します。RND2()。
    配列を使って乱数を生成する問題があるのと機械語として大きなコードなのが問題です。
  その分、RND()よりも高精度の乱数を生成できます。使う配列数は3以上を指定してください。
  例:M=RND2()で乱数を生成します。
DIM RND2[3]
M=RND2()

 <RND2A関数> RND2関数のARRAY配列専用です。
    この関数を呼び出す毎にARRAY配列に乱数が格納されていきますます。
  使う配列の数+α回呼び出すと乱数が良い感じになります。
 例:4個のARRAY配列に対してRND2A()で乱数を生成します。
DIM ARRAY[4] REM 乱数格納用。2以上を指定
DIM RND2[1] REM 乱数管理用。1を指定。
FORLOOP 7 REM 乱数生成のため7回ループします。
 RND2A() REM ARRAY配列に乱数を格納。
NEXT

 <MEM関数> 任意のアドレス(0〜F)を参照出来る関数ですが、現状はパラメータに$Yrしか指定できません。
$Yr = 0
M=MEM($Yr)

 <ADDR関数> MEM関数と組み合わせて使います。変数のアドレスを求める関数です。
  ADDR(変数名)とかADDR(ARRAY[0])とか書きます。
 例:ARRAY配列の添え字1の内容をM変数に代入します。 LEDに表示されるのは3です。
DIM ARRAY[3]
DATA 1,3,5 
$Yr = ADDR(ARRAY[1])
M=MEM($Yr)
PRINTM 



危険なレジスタ変数$Arと$Yr 

CPUのレジスタを直接操作する変数です。
$ArがAレジスタ、$YrがYレジスタを直接操作しますので、レジスタを十分理解した上で使わないと思わぬ誤動作を招きます。
基本的に変数と扱いは同じですが、かなり制約があります。
[制約$Arの使えるパターン]
FOR $Ar = 式 TO 数値 〜 NEXT
INPUT $Ar
IFINPUT $Ar THEN
PRINT $Ar
SOUND($Ar)
TIMER($Ar)
変数 or $Ar = $Ar
変数 or $Ar = $Ar + (数値 or 変数)
変数 or $Ar = (数値 or 変数) + $Ar
変数 or $Ar = $Ar - (数値 or 変数)
変数 or $Ar = (数値 or 変数) - $Ar
変数 or $Ar = NEG $Ar
変数 or $Ar = SFT $Ar
$Ar = 式
条件式 $Ar = (数値 or 変数 or 式)
条件式 (数値 or 変数) = $Ar
条件式 $Ar != (数値 or 変数 or 式)
条件式 (数値 or 変数) != $Ar
※ 赤字は追加されたパターン
※ 変数に代入するとその後は$Arが使えなくなります。
 あるいは、$Arを変更する命令を使っても同様です。
 $Ar = $Yrはできません。

[制約$Yrの使えるパターン]
$Yr = $Ar
FOR $Yr = 式 TO 数値 〜 NEXT
LED_ON($Yr)
LED_OFF($Yr)
$Yr = 式
$Yr = 数値
$Yr = $Yr + 数値
$Yr = 数値 + $Yr
Yr = $Yr - 数値
条件式 $Yr = 数値  or 数値 = $Yr
条件式 $Yr != 数値 or 数値 != $Yr


※今のところの制約
・残念ながらサブルーチンがありません。かなり無理するので作る予定なしです。GMC-4の限界かな。
・代入文で左辺が配列の場合に添え字に式が使えません。色々考えましたが、GMC−4の機械語では命令コストが大きすぎます。
※ 50番地以降に置いた命令を書き換える以外の方法をご存知の方はご一報ください


※今後の予定
・基本的な作業
は完了。次に予定しているか未定ながら野望のある作業は以下のとおり。
 ・何時になるか分からないですが、アセンブラでマクロ的に書くユーザー組み込み関数を検討中。
 ・広域的な最適化。文脈判断でレジスタか変数かを自動的に決める最適化など高度な最適化。
 ・更にちまちまと最適化。

利用規約

G4CBASICはフリーソフトです。
利用時の規約については、
利用規約をお読みください。

更新履歴

日付 バージョン 変更内容
2009/07/15 0.011 初公開。とりあえず公開したけど最適化もまだまだバージョン。
2009/07/17 0.021 バグだけ修正バージョン。一部条件式最適化。
2009/07/18 0.030 条件式バグ修正。
行コメント可能にしました。
60番地を超えたらエラーとしました。
マシン語のステップ表示を可能にしました。
2009/07/18 0.031 コメント中に命令文を含むとエラーになるのを修正。
2009/07/19 0.052 ・即値の場合に徹底的に最適化。
・変数処理に関して最適化。
・=条件式の最適化。
・FOR文の最適化。
・大人の科学のサンプル・プログラム対応のための特殊命令追加。
2009/07/23  0.103 ・条件式の<や>の特定パターンの最適化。
・特定パターンのコードの最適化を色々と。
・エラーメッセージをすべて日本語で分かりやすくしてみました。
・乱数を追加。高精度と低精度の2種類です。
・大人の科学のサンプル・プログラムの7〜10を追加。全部クリアしました!
・IFINPUTでキーの値を保存しない条件を追加。
・DATA文を追加。読み出しはARRAY[]で。変数の初期化も出来ます。

※シミュレート機能を未サポートにします。新機能に対応できないためです。
2009/07/29 0.205 ・ARRAY配列宣言専用のDIM文を追加。
・RND2の書き方が変わりました。DIM文でRND2専用の配列を宣言します。
・配列や変数のメモリアドレスが可変になりました。
・変数がA-Zまで使えるようになりましたが、個数は制限があります。
・LED_DISP()のパラメータなしの書き方を追加。L1,L2変数でLEDを制御します。
・DATA文の書き方がかわりました。変数の初期値を宣言できます。
・アセンブラがYasuhoさんの「GMC-4 アセンブラ」対応になりました。
http://www.geocities.jp/yasuho68k/gmc4/index.html
・2進数を追加しました。
・分かり辛かったFOR〜NEXTやDO〜UNTILの対応間違いの警告をするようにしました。
・FOR〜NEXT ダウンカウントが可能になりました。
・レジスタを直接扱うデンジャラスな特殊変数$Arと$Yrを追加しました。

※ 赤い字の変更は前のソースコードのままではエラーになりますのでサンプルなどを参考に変更願います。
2009/07/30 0.206 ・FORのダウンカウントのバグを修正。
2009/08/04 0.304  ・FOR〜NEXT に STEPを追加しました。STEPで刻み幅を変えれます。
・FOR文の最適化を強化。
・マイナスの数値を追加。
・条件式の最適化を強化。
・WHILE〜WEND文を追加。
・SELCET CASE文を追加。
・-SL2や-L2でリストタイプ2で表示。
・変数名は小文字でもOK!
  ただし、Test test t T はすべて同じ変数となります。
・$Arの使える場面を強化。特定の加算減算で使えるようにしました。
2009/08/10 0.404 ・FORLOOP文を追加しました。ループはしたいがループ変数はいらない場合に使います。
・COUTINUE文を追加しました。
・GOTO文とラベルを追加しました。
・RND2A()を追加しました。ARRAY配列に乱数を格納します。
・WAIT_KEYOFF()関数を追加しました。
・MEM()関数を追加。任意のアドレスを参照できます。
・ADDR()関数を追加。変数のアドレスを得ます。まともに使えるのはFOR文だけ?
・メモリの割り当てについて更に情報を詳細化しました。
・メモリオーバー時のエラーメッセージを分かりやすく修正しました。
・ADDO関係で代入文を最適化しました。
・STEPLIST時にCTRL-Cでキャンセル可能にしました。
・さらに最適化を少々。


リンク

・GMC-4用のCコンパイラを公開されているterusさんのサイトです。
http://terus.jp/engineering/gmc4cc/

・GMC-4(FXマイコン)用のシミュレータを公開されているkocharinさんのページ。
http://homepage2.nifty.com/kocha_web/

・学研 大人の科学マガジン Vol.24 4ビットマイコン GMC-4 @ wiki
http://www15.atwiki.jp/gmc4/

・Yasuhoさんの「GMC-4 アセンブラ」です。
http://www.geocities.jp/yasuho68k/gmc4/index.html

・(2012/08/14追加) みけCATさんのWEBサイトでアセンブルが出来るGMC-4アセンブラです。
http://mikecat.6.ql.bz/jstool/gmc4asm/