c4ij

C language for IchigoJam


c4ij は C 言語でプログラムを開発できます。IchigoJam BASIC で実行できるマシン語を出力します。

マシン語を直接作成するのは難しいですが、ライブラリを用いた C 言語の使用で BASIC に近い作成が可能です。

しかも出力はマシン語になるので、BASIC よりも高速な動作を期待できます。

 



ダウンロード・インストールなど

c4ij は GitHub で公開されています。ZIP Download するか、git clone して下さい。

 

IchigoJam/c4ij | GitHub

 

「GNU Embedded Toolchain for Arm」も必要です。

 

Downloads | GNU Arm Embedded Toolchain

 

Windows では make も必要です。

 

Make for Windows

 

2019年8月16日 commit より、Windows では .exe ファイル生成のためにビルドが必要になる場合があります。

「Visual Studio」もインストールして下さい。Visual Studio 2019 は Community が無料ダウンロードできます。

 

ダウンロード | Visual Studio 2019


main 関数へ渡されるパラメータ

次の形で渡されています。

 

__attribute__ ((section(".main")))

int main(int param, int ram, int rom, uint64_t (*divfunc)()) {

    :

}

 

それぞれ次の用途になっています。

  • param(R0)
    BASIC の USR 関数値 2 から渡される値
  • ram(R1)
    仮想メモリの先頭アドレス。PEEK などの 0 番地に該当しますが、実際に使用できるのは ram + 0x0700 以降となります。
  • rom(R2)
    キャラクタデータの先頭アドレス。PEEK などの 0 番地に該当します。rom ~ rom + 0x07ffh が有効です。
  • divfunc(R3)
    割り算ルーチンへのポインタ。 割り算はこのルーチンを用いると容量を節約できます。
    divfunc(割る数, 割られる数) で
    返し値は 64 ビットのうち上位 32 ビット(R1)が 余り、下位 32 ビット(R0)が 商 になります。

また return 値 が有効で、USR 関数の返し値となります。


ライブラリ std15.h

c4ij では IchigoJam BASIC 特有のライブラリ std15.h が入っています。

IchigoJam の領域が小さいため、標準 C ライブラリでは BASIC の空き容量に収まりません。
独自のライブラリで構成されています。

いずれも IchigoJam BASIC で用意された API を実行しているだけです。
API の対応は2019年8月16日の commit で IchigoJam BASIC 1.4.0b9 以降(正式版 1.4.0 以降)となっています。

  • uint32_t rnd(uint32_t n)
    0 以上・n 未満の乱数を返します。
  • uint32_t sin(uint32_t n)
    n 度の sin 値を 256 倍で返します。cos が存在しませんが。90 度ずらした値が cos になります。
  • void putc(uint32_t n)
    n のキャラクター 1 文字を出力します。キャラクターコード、または "文字" として具体的な文字を出力可能です。
  • void putnum(uint32_t n)
    符号付き 16 ビットの数値 n を出力します。
  • void putstr(const char* *p)
    ポインタ p にある文字列を表示します。0 までが文字列として有効です。
  • uint32_t inkey()
    入力されたコードを返します。BASIC の INKEY に同じです。
  • void cls()
    画面をクリアします。BASIC の CLS に同じです。
  • void locate(uint32_t x, uint32_t y)
    カーソルの位置を x,y へ移動します。BASIC の LOCATE に同じです。
  • uint32_t scr(uint32_t x, uint32_t y)
    座標 x,y にあるキャラクターのコードを返します。BASIC の SCR に同じです。
  • void pset(uint32_t x, uint32_t y)
    座標 z,y に仮想グラフィックの点を置きます。BASIC の PSET に同じです。
  • void scroll(uint32_t n)
    1 文字分スクロールします。n の値は BASIC の SCROLL に同じです。
  • void wait(uint32_t n)
    n/60 秒ウェイトを入れます。n=60 で約 1 秒です。BASIC の WAIT に同じです。
  • void out(uint32_t x, uint32_t y)
    ポート OUTx に値 y を設定します。BASIC の OUT x,y に同じです。
  • uint32_t in()
    IN ポートの値を得ます。BASIC の IN() に同じです。
  • void pwm(uint32_t x, uint32_t y, uint32_t z)
    アナログ出力を行います。BASIC の PWM に同じです。
  • uint32_t ana(uint32_t n)
    ポート INn のアナログ入力を得ます。BASIC の ANA に同じです。
  • void uputc(uint32_t n)
    シリアルへ送出を行います。
  • void memclear(uint8_t *dst, int len)
    番地 dst から長さ len バイトを 0 クリアします。
  • void memcpy(uint8_t *dst, const uint8_t *src, int len)
    番地 src から番地 dst へ len バイトコピーします。BASIC の COPY に同じです。
  • uint32_t flash1(uint32_t cmd, uint32_t startsector, uint32_t endsector)
    uint32_t flash2(uint32_t cmd, dst, const uint8_t *src, uint32_t len)
    flash_1・flash_2 はフォント・キーボード配列を変更するための API として使われています。
  • void ws_led(uint32_t countrepeat, const uint8_t* data, uint32_t gpiomask)
    フルカラー LED WS2812B の状態を変化します。BASIC の WS_LED 相当です。 
    2019年8月16日の commit で変更が入り、使いやすくなりました。
    gpiomask には出力ポート GPIO_OUT1・GPIO_OUT2・GPIO_OUT3・GPIO_OUT4・GPIO_LED が使用できます。
  • void enable_irq()
    割り込みを許可します。ビデオ画面上は表示になります。
  • void disable_irq()
    割り込みを禁止します。ビデオ画面上は非表示になります。

Makefile

Makefile を開き、編集します。

 

CSRC

.c ソースファイルを指定します。デフォルトは main.c になっています。

そのまま維持してビルドしたいファイルを main.c に変更しても良いでしょう。

 

BIN2BAS

make poke で使用します。IchigoJam BASIC への収納番地と行番号付加を設定します。

 

2019年8月16日の commit では Windows 実行ファイルが含まれていないので、ビルドが必要です。

Visual Studio 2019 をインストールし、bin2bas.c をビルドして bin2bas.exe を生成します。

Developer Command Prompot for VS 2019 または Developer Power Shell for VS 2019 を起動し、cl bin2bas.c とします。

ファイル bin2bas を削除するか、BIN2BAS 行の ./bin2bas./bin2bas.exe にして下さい。

  • BIN2BAS = ./bin2bas # default 0x700
    #700 より。キャラクターコードが入っている変更可能な領域(PCG)部分を使用します。
  • BIN2BAS = ./bin2bas --startaddress 2048 # 0x800 for expcg
    #800 より。配列・変数が入る領域を使用します。
  • BIN2BAS = ./bin2bas --nolineno --startaddress 3328 # 0xd00 for exchg
    #D00 より。プログラム領域を使用します。#C00~#CFF は空いているので、短いプログラムを入れる事が可能です。

IchigoCake BASIC のプログラム領域は #E00 からなので、修正を要します。
番地 #1000 に設定する場合、--startaddress の 10 進数表記は 4096 です。

 

LPC21ISP

make write で使用します。福野さんがオプション -sector を追加している lpc21isp が必要です。

ソースのみなので、ビルドが必要になります。README にコマンドがあります。
Windows は Developer Command Prompot for VS 2019 または Developer Power Shell for VS 2019 からビルドして下さい。

 

taisukef/lpc21isp | GitHub

 

lpc21isp はファームウェアの更新で使用するプログラムです。周辺機器/パソコンと接続/ファームウェア更新 を参照して下さい。

 

USBSERIAL

make write で使用します。シリアルのポートを指定します。
デフォルト /dev/tty.SLAB_USBtoUART は macOS での指定方法で、

Windows では例えば com3 と指定します。

 

その他

lpc21isp のところで失敗する場合、$(LPC21ISP) ではじまる行の 115200 を 57600 に変更して下さい。


make

CLI より make を実行します。
Windows 10 の場合は コマンド プロンプト または PowerShell、Git 使用時は Git Bash が使えますが、

コマンド プロンプト・PowerShell で失敗する場合は Git bash を使って下さい。

macOS は通常 ターミナル を使用します。

 

2019年8月16日 commit より make にオプションを付けるようになりました。

 

make poke

CSRC = main.c のままにしている場合、最終的に main.bas ができます。

画面上にもそのプログラム・ダイレクトコマンドが表示されています。これを IchigoJam へ転送する事で動作します。

中身は POKE と USR です。必要な場合は前後に BASIC のコマンドを追加できます。
最低でも POKE の後に USR の追記が必要です。最大 512 バイトになっています。

 

make write

この方法を用いると大容量で実行する事ができます。最大容量は 3k バイト(本体プログラム 0~3 の領域を使用)
または 7k バイト(毎回シリアルから転送して実行)です。本体のプログラムは破壊されますので、ご注意下さい。

この時 lpc21isp を使用し、シリアルで IchigoJam へ転送しますので、

IchigoJam を ISP モードにして(ISP-GND を接続して電源を入れる)シリアルを接続した状態で実行して下さい。

通常起動により、プログラムが自動実行されます。