最終更新時間:2017年11月07日 19時44分54秒

マイコン制御学習用プログラム言語の設計と実装

 はじめに

バスコンピは「ヒダピオ」の「簡易プログラミング編」で「マイコン制御学習」を行うために「簡単なBASICのプログラムを機械語にコンパイルするソフトウェア」です。

「もちろんインストール不要のソフトウェアとして」実装しました。

今は、「ヒダピオ」に同梱されています。

 使い方

アーカイブを展開すると「bascompi」フォルダが出てくるので、ヒダピオの「bin」フォルダに移動してください。「バスコンピ」ショートカットを作成するために、最初に1度だけ「mkshortcut.vbs」をダブルクリックしてください。

コンパイルの仕方は簡単で、ソースプログラムの名前が「bascompi.bas」なら「バスコンピ」ショートカットをダブルクリックするだけです。それ以外の名前ならば、「バスコンピ」ショートカットにドラッグ&ドロップします。このときは生成するファイル名が「bascom.hex」になるので注意してください。

出来たHEXファイルは「HAG_mini」でマイコンに書き込みます。

ヒダピオの新しい版では「コンパイル」ボタンが使えるかもしれません。

 文法

基本命令文

ddrB=
ヒダピオではプログラムの最初に必ず入出力の設定をします。
PortB=
書式 portB=出力値,時間(ミリ秒)

ポートBにデータを出力した後、指定した時間待ちます。

End
プログラムの終了。プログラムの最後で必ず実行させるようにしてください。

プログラム例

ddrB=255
PortB=1,300
PortB=2,300
End

繰り返し命令文

Do 〜 Loop
DoからLoopの間を繰り返します。Exit Doによって抜け出すことが出来ます。

プログラム例

ddrB=255
Do
  PortB=1,300
  PortB=2,300
Loop
End
Exit Do
Do 〜 Loopから抜け出します。
For 〜 Next (中級モード)
書式 For i=1 To 繰り返し回数

ForからNextの間を指定された回数だけ繰り返します。

プログラム例

ddrB=255
For i=1 To 3
  PortB=1,300
  PortB=2,300
Next i
End
portB=2^i,300 (中級モード)
変数jも使えます。
portB=2^(7-i),300 (中級モード)
変数jも使えます。

条件分岐命令文

If 〜 Else 〜 End If (上級モード)
書式

条件が成立するときはIfからElseの間にある文を実行します。そうでないときはElseからEnd Ifの間にある文を実行します

使用できる条件式

  • pinD.0=1
  • pinB=255
  • a=0

使用できる比較演算子

=,>,<

プログラム例

ddrB=255
Do
  If pinD.0=1 Then
    PortB=0,300
    PortB=255,300
  Else
    PortB=85,300
    PortB=170,300
  End If
Loop
End

変数 (上級モード)

変数としてa,i,j,k,wt1,wt2が使えます。型は16ビット符号付整数型ですが、符号なし数として扱われることもあります。また、ポートBへの出力は8ビットしかないことから上位8ビットの処理は省略されることがあります。

代入文 (上級モード)

変数に値を代入する代入文として次の形式のものが使えます。

  • a=0
  • a=i
  • a=a+1
  • a=a-1
  • a=255-a
  • a=a*2
  • a=2^a
  • a=int(a/2)
  • a=pinB
  • a=portB

(以下はj,kについても同様)

  • i=0
  • i=a
  • i=i+1
  • i=i-1
  • i=255-i
  • i=i*2
  • i=2^i
  • i=int(i/2)
  • i=pinB
  • i=portB

ポートBへの出力に変数が使えます。

  • portB=a,300

待ち時間の指定に変数が使えます。

  • wt1=300
  • portB=0,wt1
  • portB=a,wt2

サブルーチン

Sub (上級モード)
サブルーチンのラベルを指定します。

書式 Sub ラベル

Return (上級モード)
サブルーチンから戻ります。

書式 Return

Gosub (上級モード)
サブルーチンに制御を移します。

書式 Gosub ラベル

LCD制御命令

Cls (LCDモード)
画面に表示されている文字を全て消します。

書式 Cls

LCDを使うときは最初の表示の前に必ず実行してください。

Lcd (LCDモード)
LCDに指定された文字列を表示します。

書式 Lcd 文字列

文字列は""で括ります。

プログラム例

Cls
Lcd "BASCOMPI"
End
Cursor Off (LCDモード)
カーソルを非表示にします。
Cursor On (LCDモード)
カーソルを表示するようにします。
Display Off (LCDモード)
LCDを非表示にします。
Display On (LCDモード)
LCDを表示するようにします。カーソルは非表示にします。
Upperline (LCDモード)
上の行に表示します。
Lowerline (LCDモード)
下の行に表示します。
Shiftlcd Left (LCDモード)
表示されている文字列を左にずらします。
Shiftlcd Right (LCDモード)
表示されている文字列を右にずらします。
Locate (LCDモード)
表示位置を指定します。

書式 Locate 行,列

Waitms (LCDモード)
指定された時間待ちます(ミリ秒単位)。
書式 Waitms 時間
Deflcdchar (LCDモード)
指定された字形を指定された文字番号で登録します。
書式 Deflcdchar 文字番号,データ1,データ2,データ3,データ4,データ5,データ6,データ7,データ8指定できる文字番号は0から7までです。

Lcd chr() (LCDモード)
指定された文字番号に対応する文字をLCDに表示します。

書式 Lcd chr(文字番号)

Lcd 変数名 (LCDモード)
指定された変数の値をLCDに表示します。

書式 Lcd 変数名

Sound出力命令

Sound (Soundモード)
指定された周波数の音を指定された時間出力します。

書式 Sound 出力ポート,長さ,高さ

マイコンの動作周波数によって音の高さに指定する数値が変わります。

その他の命令1

ヒダピオの簡易プログラミングには出てきませんが電光掲示板(電子掲示板)や電子オルゴールの中で使っています。

Data
プログラム中にデータを置きます。
書式 Data データ1,データ2,...

Data文の前にはラベルを置いてください。

Read
Data文で置いたデータを変数に読み出します。

書式 Read 変数

Restore
データを読み出す位置を指定します。
書式 Restore ラベル

Read文で最初のデータを読み込む前には必ずRestore文を実行してください。

その他の命令2

電子オルゴールを実現するためにBASCOM-AVRとの互換性を高める目的で追加された命令です。しかし、BASCOM-AVRとの完全な互換性を目指すものではありません。また、現在の電子オルゴールではこれらの命令は使われていません。

a=Lookup(i,label)
指定されたデータ行から、指定された位置の数値データを変数に読み出します。
a="a"
変数に文字(のコード)を代入します。
If a="a" Then
変数と文字(のコード)を比較します。

その他の命令3

より一般的な応用が実現できるようにするために追加された命令です。

PortD=
ポートDにデータを出力します。
a=Getadc(0)
A/D変換された値を変数に読み出します。

参考 ELM - シンプルなA-Dコンバータ

BASCOM-AVRモード

バスコンピの文法ははヒダピオの簡易プログラミングで使用するBASIC言語に準拠しています。ヒダピオの簡易プログラミングで作成したプログラムをそのまま受理しAVRのアセンブリ言語へ翻訳します。

しかし、ヒダピオが「コンパイラへ」ボタンによって出力するのははBASCOM-AVRの文法に変換されたソースプログラムです。また、電光掲示板や電子オルゴールではBASCOM-AVR用のプログラムを出力します。これは、もともとヒダピオシステムがBASCOM-AVRを前提としているからです。

そこで、バスコンピはBASCOM-AVRのサブセットもコンパイルできるようにしてあります。

ヒダピオとBASCOM-AVRではポートBの論理が逆になっています。

ヒダピオシステムでは回路としては負論理ですが、中学生が対象ということもありヒダピオ上はLEDが'1'で点灯し、'0'で消灯するようなっています。

つまり、ヒダピオのBASIC言語としてコンパイルするときとBASCOM-AVRとしてコンパイルするときではポートBに出力するデータが反転しているのです。

バスコンピでは2つのモードを持っていてこれらを切り替えています。

モードを切り替えるには2つの方法があり、ひとつはコンパイラに対するオプションで指示する方法です。もうひとつは、プログラム中に以下の文があるとBASCOM-AVRモードに切り替わります。

  • $REGFILE
  • $CRYSTAL
  • CONFIG
  • DIM
$REGFILE
*.datファイルは読まずに、CPUの判別に使用しています。値として"ATtiny2313.DAT"と"m168Pdef.dat"が有効ですが、現在はATtint2313のみの対応となっています。
$CRYSTAL
クロックの値を読み取っています。値として1000000と12000000のみが有効です。
CONFIG
CONFIG PORTB、CONFIG PORTDは機能します。CONFIG LCDは単にスキップします。それ以外はスキップします。
DIM
宣言された情報は記号表に登録されますが、バスコンピには型がありませんので利用されません。例外として、電光掲示板ではRead文で変数にByte型のデータを読むところがあり、そこで記号表を参照しています。

 サンプルプログラム

LEDの点滅

小山先生の回路図を参考にして回路を組みます。メモ帳でBlink.bas(486)を作成し、そのファイルアイコンをバスコンピのショートカットにドラッグ&ドロップします。出来上がったbascom.hexをHAG_mini等でマイコンに書き込みます。

LEDの明滅

小山先生の回路図を参考にして回路を組みます。メモ帳でFade.bas(106)を作成し、そのファイルアイコンをバスコンピのショートカットにドラッグ&ドロップします。出来上がったbascom.hexをHAG_mini等でマイコンに書き込みます。尚、Fade.bas(106)は0.53以降のコンパイラでコンパイルすることができます。

Fade.bas

ledPin Alias PortB.3
brightness Alias OCR1A

Config ledPin=Output

TCCR1B=&h01
TCCR1A=&h81

Do
  For i=0 To 254
    brightness=i
    Waitms 2
  Next i
  For i=255 To 0 Step -1
    brightness=i
    Waitms 2
  Next i
Loop
End

スイッチでオンオフ制御

小山先生の回路図を参考にして回路を組みます。メモ帳でSw.bas(170)を作成し、そのファイルアイコンをバスコンピのショートカットにドラッグ&ドロップします。出来上がったbascom.hexをHAG_mini等でマイコンに書き込みます。尚、Sw.bas(170)は0.49以降のコンパイラでコンパイルすることができます。

Sw.bas

swPin Alias PinD.6
ledPin Alias PortB.3
Config ledPin=Output
Config swPin=Input
Const HIGH=1
Const LOW=0

Do
  If swPin=HIGH Then
    ledPin=HIGH
  Else
    ledPin=LOW
  End If
Loop

楽譜の演奏 1

小山先生の回路図を参考にして回路を組みます。メモ帳でPlaynote.bas(100)を作成し、そのファイルアイコンをバスコンピのショートカットにドラッグ&ドロップします。出来上がったbascom.hexをHAG_mini等でマイコンに書き込みます。尚、Playnote.bas(100)は0.54以降のコンパイラでコンパイルすることができます。

Playnote.bas

bellPin Alias PortB.3
freq Alias k
note Alias k

Const C=262%
Const D=294%
Const E=330%
Const F=349%
Const G=392%
Const A=440%
Const B=494%
Const c=523%
Const d=587%
Const e=659%
Const f=698%
Const g=784%
Const R=1%

Dim ocr As Long
Dim timer1_toggle_count As Long
Dim duration As Long

On COMPARE1A TIMER1_COMPA_vect

Config bellPin=Output

TCCR1A=0
TCCR1B=Bits(WGM12,CS10)
Enable Interrupts

Do
  Restore NOTES
  Do
    Read note
    If note=0 Then
      Exit Do
    Else
      If note=R Then
      Else
        Gosub tone
      End If
      Waitms 330
    End If
  Loop
  Waitms 2400
Loop
End

tone:
  ocr=_XTAL/freq
  ocr=Int(ocr/2)
  ocr=ocr-1
  If ocr>&hffff Then
    ocr=_XTAL/freq
    ocr=Int(ocr/2)
    ocr=ocr/64
    ocr=ocr-1
    TCCR1B=Bits(WGM12,CS11,CS10)
  Else
    TCCR1B=Bits(WGM12,CS10)
  End If
  timer1_toggle_count=freq*2
  timer1_toggle_count=timer1_toggle_count*300
  timer1_toggle_count=timer1_toggle_count/1000
  OCR1A=ocr
  TIMSK.OCIE1A=1
Return

TIMER1_COMPA_vect:
If timer1_toggle_count=0 Then
  TIMSK=0
  bellPin=0
Else
  PINB.3=1
  timer1_toggle_count=timer1_toggle_count-1
End If
Return

NOTES:
Data R,D,D,B,A,G,D,R, R,D,D,B,A,G,E,R, R,E,E,c,B,A,F,R, R,d,d,d,c,A,B,R
Data R,D,D,B,A,G,D,R, R,D,D,B,A,G,E,R, R,E,E,c,B,A,d,d, d,d,e,d,c,A,G,R, d,R
Data B,B,B,R, B,B,B,R, B,d,G,A,B,R,R,R, c,c,c,c,c,B,B,B, B,A,A,B,A,R, d,R
Data B,B,B,R, B,B,B,R, B,d,G,A,B,R,R,R, c,c,c,c,c,B,B,B, d,d,c,A,G,R, g,R,0%

カウントアップ

小山先生の回路図

を参考にして回路を組みます。メモ帳でCountup.bas(126)を作成し、そのファイルアイコンをバスコンピのショートカットにドラッグ&ドロップします。出来上がったbascom.hexをHAG_mini等でマイコンに書き込みます。

Countup.bas

Config PortB=252
Config PortD=64

For i=0 To 9
	a=Lookup(i,LED)
	PortD=a
	a=a*2
	a=a*2
	PortB=a,500
Next i
End

LED:
Data 63%,6%,91%,79%,102%,109%,125%,39%,127%,111%

アナログデジタル変換

小山先生の回路図

を参考にして回路を組みます。メモ帳でAdc.bas(123)を作成し、そのファイルアイコンをバスコンピのショートカットにドラッグ&ドロップします。出来上がったbascom.hexをHAG_mini等でマイコンに書き込みます。(2011.10.13追記)マイコンの動作周波数が1MHzのときにはコンデンサの静電容量を0.1μFにしてください。サンプルプログラム(Adc.bas(123))にあった動作周波数の指定は不要のため削除しました。

Adc.bas

Config PortB=252
Config PortD=64

Do
	a=Getadc(0)
	a=a/103
	a=Lookup(a,LED)
	PortD=a
	a=a*2
	a=a*2
	PortB=a
Loop
End

LED:
Data 63%,6%,91%,79%,102%,109%,125%,39%,127%,111%

サーボモータの制御

押しボタン信号機

小山先生の回路図を参考にして回路を組みます。メモ帳でSignal.bas(149)を作成し、そのファイルアイコンをバスコンピのショートカットにドラッグ&ドロップします。出来上がったbascom.hexをHAG_mini等でマイコンに書き込みます。尚、Signal.bas(149)は0.55以降のコンパイラでコンパイルすることができるようにする予定でます。

Signal.bas

RPin Alias PortB.7
YPin Alias PortB.6
GPin Alias PortB.5
RRPin Alias PortB.1
GGPin Alias PortB.0
swPin Alias PinD.6
Config PortB=&B11100011
Config swPin=Input
Const HIGH=1
Const LOW=0
Dim H As Integer
Dim L As Integer
Dim swMemo As Integer
Declare Sub carsig(g as integer,y as integer,r as integer)
Declare Sub mansig(r as integer,g as integer)
swMemo=LOW
H=HIGH
L=LOW
Call carsig(H,L,L)
Call mansig(H,L)
Do
  If swPin=HIGH Then
    If swMemo=LOW Then
      Waitms 4000
      Call carsig(L,H,L)
      Waitms 4000
      Call carsig(L,L,H)
      Call mansig(L,H)
      Waitms 16000
      For i=0 To 7
        Call mansig(L,H)
        Waitms 500
        Call mansig(L,L)
        Waitms 500
      Next i
      Call mansig(H,L)
      Waitms 4000
      Call carsig(H,L,L)
    End If
    swMemo=HIGH
  Else
    swMemo=LOW
  End If
Loop
End

Sub carsig
  GPin=g
  YPin=y
  RPin=r
  Return
End Sub

Sub mansig
  RRPin=r
  GGPin=g
  Return
End Sub

楽譜の演奏 2 (Midi楽器の制御)

小山先生の回路図を参考にして回路を組みます。メモ帳でMidi.bas(104)を作成し、そのファイルアイコンをバスコンピのショートカットにドラッグ&ドロップします。出来上がったbascom.hexをHAG_mini等でマイコンに書き込みます。尚、Midi.bas(104)は0.55以降のコンパイラでコンパイルすることができるようにする予定でます。

Midi.bas

$baud=31250
bellPin Alias PortD.3
note Alias k

Config bellPin=Output

Dim voice As Integer
Dim _H70 As Integer
Dim _H00 As Integer

Const C=60%
Const D=62%
Const E=64%
Const F=66%
Const G=67%
Const A=69%
Const B=71%
Const c=72%
Const d=74%
Const e=76%
Const f=78%
Const g=79%
Const Z=125%
Const z=126%
Const R=127%

Const HIGH=1
Const LOW=0

Declare Sub noteOn(data1 As Integer,data2 As Integer)

_H70=&H70
_H00=&H00

Do
  Print Chr(&HC0);Chr(voice);
  Restore NOTES
  For i=0 To 139
    Read note
    If note=Z Then
      bellPin=HIGH
    Else
      If note=z Then
        bellPin=LOW
      Else
        If note=R Then
          Waitms 300
        Else
          Call noteOn(note,_H70)
          Waitms 300
          Call noteOn(note,_H00)
        End If
      End If
    End If
  Next i
  Waitms 2400
  voice=voice+1
  If voice>16 Then
    voice=11
  End If
Loop
End
Sub noteOn
  Print Chr(&H90);Chr(data1);Chr(data2);
End Sub
NOTES:
Data R,D,D,B,A,G,D,R, R,D,D,B,A,G,E,R, R,E,E,c,B,A,F,R, R,d,d,d,c,A,B,R
Data R,D,D,B,A,G,D,R, R,D,D,B,A,G,E,R, R,E,E,c,B,A,d,d, d,d,e,d,c,A,G,R, d,R
Data Z,B,B,B,z,R, Z,B,B,B,z,R, B,d,G,A,B,R,R,R, c,c,c,c,c,B,B,B, B,A,A,B,A,R, d,R
Data Z,B,B,B,z,R, Z,B,B,B,z,R, B,d,G,A,B,R,R,R, c,c,c,c,c,B,B,B, d,d,c,A,G,R, Z,g,z,R

 おまけ:BASCOM-AVRをインストールせずに使う方法

拙作バスコンピができたのはインストールせずに使えるAVR用のBASICコンパイラが欲しいという要望に応えるためでした。実はBASCM-AVRにはbascomp.exeというコマンドラインからコンパイラを使うためのユーティリティが用意されています。MCS Electronics社のページからダウンロードできますがDEMOバージョンにも付属していて、BASCOM-AVRのインストールディレクトリの中にあります。バージョン2.0.5.0まではソース中に$REGFILEや$CRYSTALだけでなく$BAUDまで書かなければいけなかったのですが、最新のバージョン2.0.7.1からは、これらを書かなくても良くなりました。

必要なファイルのコピー

Windows XPでは通常「C:\Program Files\MCS Electronics\BASCOM-AVR」にインストールされます。ここから必要なファイルだけ取り出します。ATtiny2313用にコンパイルするために最低限必要なのは「BASC-AVR.DLL」、「bascomp.exe」、「ATtiny2313.DAT」、「LIB\mcs.lbx」、「LIB\Double_Trig.LBX」、「LIB\Double.LBX」、「LIB\FP_Trig.LBX」です。

バッチコマンドの作成

次のようなバッチファイルbascomp.bat(97)を作成します。

bascomp.bat

bascomp.exe %1 CHIP=31

ショートカットの作成

作成したバッチコマンドのショートカットを作成します。

コンパイル

作成したショートカットにソースファイルをドラッグ&ドロップするとコンパイルできます。エラーメッセージは、*.errファイルに出力されます。

 参考ページ

ヒダピオ

簡易プログラミングでの文法について

AWK

AWK本

GAWK for Windows



AWKによる言語処理系の実装

AVR

BASCOM-AVR

LCD関連

学習指導要領


教科書

その他の教材

(2011.9.8) 今頃気づきましたが小山先生のページに「バスコンピ」の文字がありました。

BASCOM?

高校生

 既知の問題

 改訂の履歴とファイルのダウンロード

注意! 0.36から0.43までは、Windows 7/Vistaで動作しない場合があります。

自己展開形式(.exe)のファイルとzipファイルの中身は全く同じものです。

2012.3.13 0.57

(1) [本体] PortB.x=0の形式が直接使えるようにした。

(2) [本体] CALL命令を使用せずにサブルーチンを呼び出す書式も使用できるようにした。

bascompi057.exe(87) bascompi057.zip(90)

2012.3.5 0.56

(1) [本体] 名前付き定数の2重定義チェックが間違っているのを直した。

(2) [本体] Data文中の定数式を加算以外も計算するようにした。ついでに再帰的に計算するようにした。循環参照は検出するようにしたつもり。

(3) [本体] 別名を使用したときにa=a+1のパターンが認識できなかったのを直した。

(4) [本体] Waitms文で名前付き定数が使えるようにした。

(5) [本体] 定数_XTALを設定するタイミングが間違っていたので直した。

(6) [本体] X=2^I、X=2^Jが処理されていなかったのを直した。

(7) [本体] Call文が正しく処理されていないのを直した。

(8) [vavrdisasm.exe] 同梱する逆アセンブラを最新のものにした。

bascompi056.exe(88) bascompi056.zip(89)

2012.2.1 0.55

(1) [本体] シリアル通信の出力に対応した。$BAUD、Print文、Printbin文が使えるようにした。入力は未だ出来ない。

(2) [本体] Call文でサブルーチンに引数を渡せるようにした。定義のためのDeclare Sub文、Sub〜End Sub文が使えるようにした。

(3) [本体] Dim文でString型の変数と1次元の配列が宣言できるようにした。SRAM上の領域も確保されるようにした。

(4) [本体] PortB.0=aのような書き方が出来るようにした。

(5) [本体] 配列要素への単純変数、配列変数および10進定数の代入が出来るようにした。(6) [本体] 代入文の右辺に16進定数と2進定数が使えるようにした。

(7) [本体] 代入文の右辺で配列の要素が使えるようにした。ただし、演算は出来ない。

(8) [本体] Data文の中で定数同士の加算が出来るようになった。

(9) [本体] ソースコードからデバッグ用のメッセージ出力やコメントアウトした不要な行を削除した。

bascompi055.exe(85) bascompi055.zip(83)

2012.1.6 0.54

(1) [本体] Bits/Nbits関数が使えるようにした。

(2) [本体] If文でLong型変数と定数の比較が行なえるようにした。

(3) [本体] 初期化ルーチンを生成するタイミングが間違っているのを直した。

(4) [本体] Long型変数のインクリメント/デクリメントができるようにした。

(5) [本体] If文で16進定数が使えるようにした。

(6) [本体] 16ビットの乗算ができるようにした。

(7) [本体] Data文でカンマの前後に空白があると記号定数が認識できないのを直した。

(8) [本体] If文で変数名にアンダースコアが使えないのを直した。

(9) [本体] If文での変数と0との比較を高速化した。

(10) [本体] If文で定数値に%が付いていても良いようにした。

bascompi054.exe(95) bascompi054.zip(92)

2011.12.28 0.53

(1) [本体] 宣言したLong型の変数に値を代入できるようにした。

(2) [本体] 32bitの除算ができるようにした。加算、減算、乗算についてはまだできない。

(3) [本体] 定数_XTALを定義しプログラム中で動作クロック数($Crystalで指定した値)を読み出せるようにした。

(4) [本体] HIGHW関数によりLong型変数の上位16bitを取り出すことができるようにした。

(5) [本体] $Baudでボーレートを設定できるようにした。シリアル通信はまだできない。

(6) [本体] Enable/Disable文で個別の割り込みを許可/禁止できるようにした。

(7) [本体] On 割り込み 文で割り込みベクタを設定できるようにした。

(8) [本体] On 割り込み文で指定したサブルーチンを割り込みルーチンとして認識しレジスタの退避と復帰を行うようにした。

(9) [本体] インラインアセンブラの開始と終了に$asmと$end asmが使えるようにした。

(10) [本体] Portb文で変数の値を代入する場合のコードを改善した。

(11) [本体] I/Oレジスタへの代入及び値の参照ができるようになった。

(12) [本体] &Hxxによる16進定数が使えるようにした。

(13) [本体] Stop TIMER0/COUNTER0/TIMER1/COUNTER1/WATCHDOG文により各デバイスを停止できるようにした。

(14) [本体] Start WATCHDOG文によりウォッチドッグタイマを起動できるようにした。

(15) [本体] 引数なしのStop文によりプログラムの停止が行なえるようにした。End文との違いは割り込みの禁止を行わないことである。

bascompi053.exe(85) bascompi053.zip(94)

2011.12.7 0.52

(1) [本体] LCDに変数の値を表示できるようにした。ただし、負の数には対応していない。

(2) [mkbachfile.vbs] アセンブルエラーが出たときは空のhexファイルを生成するようにした。

bascompi052.exe(92) bascompi052.zip(86)

2011.11.26 0.51

(1) [本体] 簡易プログラミングでSound文がコンパイルできなくなる間違いを直した。

bascompi051.exe(93) bascompi051.zip(93)

2011.11.22 0.50

(1) [本体] Enable Interrupts/Disable Interruptsで割り込みの許可と禁止が行えるようにした。

(2) [本体] ASM_TEXT/ASM_ENDでインラインアセンブラが使えるようにした。

(3) [Orgel.awk] 入力に対応した。

bascompi050.exe(94) bascompi050.zip(86)

2011.11.8 0.49

(1) [本体] If文でa>0とa<0の処理が間違っていたのを直した。

(2) [本体] Config Portd.0の処理が間違っていたのを直した。

(3) [本体] If文で文字比較の処理が間違っていたのを直した。

(4) [本体] If文で名前付定数が使えるようにした。

(5) [本体] Config pinB、Config pinB.0、Config pinD、Config pinD.0が使えるようにした。

bascompi049.exe(91) bascompi049.zip(87)

2011.11.7 0.48

(1) [本体] Constが使えるようにした。

(2) [本体] Aliasが使えるようにした。

(3) [本体] Locate文で予約されていない変数を使ったときの処理が間違っていたので直した。

(4) [本体] BASCOM-AVRモードで余計な初期化コードが出力されないようにした。

(5) [本体] ATmega168(P)に対応させた。ただし、テストは一切行っていない。

(6) [本体] Config PortXで以下の形式が使えるようにした。

  • Config PortB=Input
  • Config PortD=Output
  • Config PortX.0=Input
  • Config PortX.0=Output
  • Config PortX=&Bbbbbbbbb

(7) [本体] アセンブリ言語のオペランドで定数を0b00000000のように常に8桁になるようにした。

(8) [本体] (7)の変更によりオペランドが0のときに間違っていたのが直った。

(9) [本体] $regfileが正しく認識され無い場合があったのを直した。

(10) [本体] For文でStepが使えるようになった(ただし指定できるのは-63〜-1、1〜63の定数のみ)。

(11) [その他] 「m168def.inc」を添付した。

bascompi048.exe(91) bascompi048.zip(88)

2011.10.6 0.47

(1) [本体] ATtiny2313でa=getadc(0)によってA/D変換ができるようにした。

ChaN氏のページ

ELM - シンプルなA-Dコンバータ(http://elm-chan.org/docs/avr/avradc_j.html)

からコードを引用した。ただし、クロックが1MHzのときはあまりうまくは動かないようである。

(2) [本体] a=a*2 の処理が間違っていたのを直した。

(3) [本体] a=int(a/2) も間違っていたので直した。

(4) [本体] PortD=a ができるようにした。

bascompi047.exe(104) bascompi047.zip(105)

2011.9.22 0.46

(1) [本体] Display On/Off のコードが間違っていたのを直した。

bascompi046.exe(94) bascompi046.zip(84)

2011.9.15 0.45

(1) [本体] バージョンナンバーと日付以外は特に変更無し。

(2) [Orgel.awk] 12MHzに対応した。

(3) [Orgel.awk] 電子オルゴールのプログラムでないときは「bascompi_orz.bas」を出力しないようにした。

(4) [Orgel.awk] 各音符(休符)の前に30msの待ち時間を入れた。

bascompi045.exe(87) bascompi045.zip(90)

2011.9.13 0.44

(1) [本体] 再びWindows 7/Vistaで動作しなくなっていることが発覚したので対処をした。

(2) [本体] ラベルの処理に関して余計なメッセージが出ていたのを直した。

(3) [本体] Config PortB、Config PortDが処理されていなかったのを直した。

(4) [Orgel.awk] #,bの処理がやっぱりなされていなかったのを直した。

bascompi044.exe(92) bascompi044.zip(83)

2011.9.12 0.43

(1) [本体] Sound文のランタイムルーチンでループのラベル位置が間違っていたのを直した。これにより、テンポが遅くなったり、音程が低くなるのが改善したと思われる。

(2) [Orgel.awk] #,bの処理がなされていなかったのを直した。

bascompi043.exe(91) bascompi043.zip(88)

2011-9-8 0.42

(0) 0.41の日付が間違っていた。何か良い管理法は無いものか。

(1) [本体] Sound文の引数でカンマの前後に空白があっても良くなった。

(2) [本体] ラベルの扱いが間違っていたのを直した。「-」を含むラベルも使えるようになった。

(3) [Orgel.awk] 判定法が甘く、Sound文を含むプログラムを全て誤認していたのをSound文を含みかつData文を含んでいて、そのデータが全て電子オルゴールの音符データであるときに「電子オルゴール」のプログラムと看做すことにした。

bascompi042.exe(98) bascompi042.zip(82)

2011-9-7 0.41

(1) [本体] ソースを少し弄ったが、特に機能的な変更はない。

(2) [Orgel.awk] 電子オルゴールの出力したプログラムをバスコンピのプログラム「bascompi_orz.bas」に変換するスクリプト「Orgel.awk」を作成した。

(3) [mkbatchfile.vbs] 上の「Orgel.awk」のために大幅に書き換えた。

bascompi041.exe(86) bascompi041.zip(88)

2011-9-6 0.40

(0) 0.39の日付が間違っていた。

(1) Waitms文で変数が使えるようになった。

(2) CONFIG、$CRYSTALでもBASCOM-AVRモードになるようにした。

8LED点滅回路http://hidapio.jp/m8led.htm

にある、プログラム例の「ヒダピオ」、「BASCOM」の両方がコンパイルできるようになった。

(3) If文が壊れていたのを直した。

(4) 乗算ルーチン、除算ルーチンのコメントがコメントになっていなかったのを直した。

(5) 代入文の右辺にI、J、K、A以外の変数も使えるようになった。

(6) If文でI、J、K、A以外の変数も使えるようになった。

(7) Sound文で変数を使った場合のコード生成が間違っていたのを直した。

(8) 入力ファイルの名前が「bascompi*.bas」とき出力ファイル名を「bascompi.asm」にするようにした。

bascompi040.exe(98) bascompi040.zip(113)

2011-9-5 0.39

(1) 「ddrb 255」の記法を使えるようにした。

(2) Lcd Chr(0) ; "Hello" ; Chr(0)

chr関数と文字列定数をセミコロンで区切って並べられるようにした。セミコロンの前後に空白があっても良い。

(3) LCDdefchar文でカンマの前後に空白があっても良くなった。

(4) LCDdefchar文のコード生成が間違っていたのを直した。

(5) Locate文の引数でカンマの前後に空白があっても良くなった。

(6) BASCOM-AVRモードではNext文の変数を無視するようにした。

(7) Dim文でBASCOM-AVRモードになるようにした。

(8) For文で「=」の前後に空白があっても良くなった。

(9) LCD文で文字列定数の中にカナがあるとアセンブル時に警告がでるが実害はない。

これらによって、

AVRマイコンのプログラム(LCD編)http://hidapio.jp/program6.htm

にあるサンプルがコンパイルできるようになった。

bascompi039.exe(84) bascompi039.zip(104) 注意! If文が壊れています。

2011-9-2 0.38
  • Data &Hxx

一旦、バッファに記録し、ラベルを見つけるかプログラムの最後に到達したときに2バイト単位で.db擬似命令を出力する。これにより本来バイトであるデータがワードになってしまいコードが膨らんでいたのを防ぐことができる。ただし、偶数行の連続したData文の後ろにラベル文を置く必要があることに注意する。

  • Read a

Dim文で型情報を記録していたのを使うようにし、Read文で変数がByte型である場合は1バイトだけ読み出し変数の下位バイトに格納するようにした。

  • これらにより、電子掲示板の全てのパターンがコンパイルできるようになった。

bascompi038.exe(94) bascompi038.zip(87)

 履歴以前の古い版

exeファイルとzipファイルの中身は全く同じものです。上の方にあるもの程、新しい版です。

トップ 新規 編集 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン