ボクにもわかるIchigoJam用マイコンボード

[OLED メニューへ戻る]

I2C OLED の接続方法

超簡単!で、美しい!

高速・横画面表示 VIDEO 3モード

 以下のプログラムは「あらしテニスゲーム(原作=すがやみつる氏)」をもとにOLED版V3へ移植しました。権利についても、ご注意ください。
 gsb800を実行するとビデオ出力によるテレビ画面が拡大表示(VIDEO 3モード)になります。テレビ表示用に確保されていたメモリの一部を使うことが出来るようになり、そこへ画像データやマシン語コードを保持するようにしました。
 このため、gsb800実行時に配列変数を一時的に使用しますが、初期化後はCLV命令で解放することが可能です。forループ用の[98]以外の配列変数は、アプリケーションプログラム側で自由に使えます。
 なお、プログラムの編集を行いたいときなどに、通常の表示に戻すにはVIDEO 1を実行してください。

プログラムC1 横画面 [VIDEO 3]対応(ドライバ部 404 Bytes)
' I2C OLED Example C1 Arashi Tennis for IchigoJam

' Mitsuru Sugaya (Original)
' https://www.m-sugaya.jp/basic/tennis_game.htm

' Shiro Saito (IchigoJam Version)
' https://d.hatena.ne.jp/shiro0922/20150824/1440425034

' Wataru KUNINO (OLED Version)

' I2C OLED Binary Driver [V3] for IchigoJam :' https://bokunimo.net/ichigojam/oled.html
' CC BY (c) 2017 Ruria Amanagi, Wataru KUNINO, and Shiro Saito
' Special thanks to Fukuno-san, Ono-san, and all members in IchigoJam-FAN.

new
10 ?"Arashi":cls:clv:gsb 800
20 P=5:X=RND(10)+1:Y=0:D=1:E=1
100 '
110 IF BTN(LEFT) GSB 380
120 IF BTN(RIGHT) GSB 420
130 LC P,7:?" ===== ";
140 LC 0,7:?"="::LC 15,7:?"=";
150 GSB 900
160 '
170 U=X+D:V=Y+E
180 IF U=0 OR U=15 THEN D=-D:GOTO 160
190 IF V=-1 THEN E=1:GOTO 160
200 S=SCR(U,V)
210 IF S=#3D GSB 460:GOTO 160
220 LC X,Y:?" ";
230 LC U,V:?"@";
240 X=U:Y=V
250 IF Y<8 GOTO 100
260 '
270 BEEP 30,60:WAIT 60
300 LC 1,3:?"GAME OVER P=";T
310 GSB 900:LC 0,8:END
380 '
390 P=P-1
400 IF P<0 THEN P=0
410 RTN
420 '
430 P=P+1
440 IF P>9 THEN P=9
450 RTN
460 '
470 BEEP 10
480 T=T+1
490 LC 0,0:?T;
500 E=-1
510 RTN

800 let[0],#4000,#B5F0,#1840,#230B,#21B,#18C9,#4694,#2410
810 let[8],#7803,#DB,#18D2,#2708,#2507,#5D56,#40FE,#415B,#3D01,#D2FA
820 let[18],#700B,#3101,#3F01,#D1F5,#3001,#4662,#3C01,#D1ED,#BDF0
830 let[90],#D5AE,#8D80,#2014,#A100,#DAC8,#8112,#D9CF,#DBF1,#A440,#AFA6
840 ifi2cw(60,#800,1,#8B4,20)E
850 video3:copy#A00,#800,62
900 for[98]=0to7:ifusr(#A02,#900+[98]*16)&0|i2cw(60,#A01,1,#B00,128)E
910 next:rtn


メモリ・マップ(参考情報・入力不要)
' #800[0] 〜#801   2 bytes OLED 命令用    ⇒ 再利用可
' #802[1] 〜#835  52 bytes マシン語       ⇒ 再利用可
' #836[27]〜#8B3 126 bytes (空き)
' #8B4[90]〜#8C7  20 bytes OLED 初期化用  ⇒ 再利用可
' #8C4[98]〜#8C5   2 bytes for ループ用 変数
' #8C6[99]〜#8CB   6 bytes 予備

' #900〜#9BF     192 bytes VRAM 16x12 (VIDEO 3モード)
' #9C0〜#9FF      64 bytes 未使用
' #A00〜#A01       2 bytes OLED 命令用
' #A02〜#A35      52 bytes マシン語
' #A36〜#A7F      74 bytes 空き
' #A80〜#AFF     128 bytes 空き
' #B00〜#B7F     128 bytes OLED 転送用メモリ

※OLED用ドライバ部分以外の著作権は、原作者(すがやみつる氏)および、斎藤史郎(IchigoJam-FAN)が保有します。



高速・横画面表示・PCG対応版 VIDEO 3モード

 スロットゲームです。実行すると、グー、チョキ、パーのアイコンがスクロールし、BTNを押すと止まります。ドライバ部が428バイト、PCGキャラクタ部が352バイト、ゲーム部は242バイト、合計1022バイト(空き2バイト)と限られた容量の中で、作成したのでスロットの結果の判定はありません。

プログラムC2 横画面 [VIDEO 3] [PCG]対応(ドライバ部 428 Bytes)
' I2C OLED Example C2 SLOTS GAME
' CC BY (c) 2017 Wataru KUNINO

' I2C OLED Binary Driver [V3][PCG] for IchigoJam :' https://bokunimo.net/ichigojam/oled.html
' CC BY (c) 2017 Ruria Amanagi, Wataru KUNINO, and Shiro Saito
' Special thanks to Fukuno-san, Ono-san, and all members in IchigoJam-FAN.

new
10 gsb800:gsb50
11 forI=1TO3:D=C+RND(3)*4:gsb50
12 lcI*3+1,8:?CHR$(D);CHR$(D+1);
13 lcI*3+1,9:?CHR$(D+2);CHR$(D+3);
14 next:scroll0:gsb900:gsb50:scroll0:gsb900
15 if!BTN()goto11
16 end
50 forJ=0to3:lcJ*3+3,2:?" ";:lcJ*3+3,4:?"|";:next:rtn
70 A=#F8:B=#F0:C=63
71 poke#700,0,0,0,0,0,0,13,31,0,0,0,0,0,0,#B0,A
72 poke#710,31,31,C,C,C,31,15,0,A,A,A,A,A,A,B,0
73 poke#720,3,51,51,59,27,27,31,31,0,0,0,0,0,0,#B0,A
74 poke#730,31,C,C,C,C,31,15,0,A,A,A,A,A,A,B,0
75 poke#740,3,51,51,51,27,27,#9F,#DF,96,96,96,98,#66,#EE,#FC,#FC
76 poke#750,#FF,#FF,#7F,C,31,15,15,0,A,A,A,A,A,B,B,0
77 C=#E0:rtn

800 let[0],#4000,#B5F0,#1840,#468E,#4694,#230B,539,#18C9,#2410,#4665,#7803
810 let[11],#2BE0,#D300,#4675,#DB,#18EA,#2708,#2507,#5D56,#40FE,#415B
820 let[21],#3D01,#D2FA,#700B,#3101,#3F01,#D1F5,#3001,#3C01,#D1EA,#BDF0
830 let[90],#D5AE,#8D80,#2014,#A100,#DAC8,#8112,#D9CF,#DBF1,#A440,#AFA6
840 ifi2cw(60,#800,1,#8B4,20)E
850 video3:copy#A00,#800,70
900 for[98]=0to7:ifusr(#A02,#900+[98]*16)&0|i2cw(60,#A01,1,#B00,128)E
910 next:rtn


メモリ・マップ(参考情報・入力不要)
' #800[0] 〜#801   2 bytes OLED 命令用    ⇒ 再利用可
' #802[1] 〜#83D  60 bytes マシン語       ⇒ 再利用可
' #83E[31]〜#8B3 118 bytes (空き)
' #8B4[90]〜#8C7  20 bytes OLED 初期化用  ⇒ 再利用可
' #8C4[98]〜#8C5   2 bytes for ループ用 変数
' #8C6[99]〜#8CB   6 bytes 予備

' #900〜#9BF     192 bytes VRAM 16x12 (VIDEO 3モード)
' #9C0〜#9FF      64 bytes 未使用
' #A00〜#A01       2 bytes OLED 命令用
' #A02〜#A3D      60 bytes マシン語
' #A3E〜#A7F      66 bytes 空き
' #A80〜#AFF     128 bytes 空き
' #B00〜#B7F     128 bytes OLED 転送用メモリ

マシン語部のアセンブラ ASM15 表記(参考情報・入力不要)
' I2C OLED ASM15 Binary Module (c) 2017 Ruria Amanagi

    PUSH {LR,R4,R5,R6,R7}

    R0=R0+R1                ' R0=VRAMアドレス
    R14=R1                  ' R14= RAM
    R12=R2                  ' R12= ROM

    R3=#B
    R3=R3<<8
    R1=R1+R3                ' R1+=#B00 保存先
    R4=16                   ' R4=ループ数/文字数
@LOOP
    R5=R12                  ' 固定フォント用
    R3=[R0]                 ' R3=取得キャラクタ
    R3-#E0                  ' E0未満でキャリーF
'   if !C goto @SKIP
    data w #d300
    R5=R14                  ' PCG用オフセット
@SKIP
    R3=R3<<3                ' R3*=8
    R2=R5+R3                ' R3=該当フォント
    R7=8                    ' R7=LOOP2:ループ数px横
@LOOP2
    R5=7                    ' R5=参照ビット位置px縦
@LOOP1
    R6=[R2+R5]              ' R6=フォント+ビット位置
    R6>>=R7                 ' ドット横の参照位置
'   adc(R3,R3)
    data w #415b
    R5-=1                   ' R5=参照位置px縦を上に
'   if C goto @LOOP1        ' C解除まで繰り返す
    data w #d2fa

    [R1]=R3                 ' 保存先へ書き込み
    R1+=1
    R7-=1
    IF !0 GOTO @LOOP2

    R0+=1
    R4-=1
    IF !0 GOTO @LOOP

    POP {PC,R4,R5,R6,R7}
※Ruria Amanagiのご厚意で公開していただいたASM15のソースリスト(コメントを追記して掲載させていただきました)

IchigoJam メインメニューへ戻るページの先頭へ戻る