tag:blogger.com,1999:blog-39921705773913624312024-03-18T12:00:39.835+09:00mobileFF's blogBlackBerry、UnihertzなどのQWERTYデバイス、ポケコンやPalm、ChromebookやUMPC、レトロPC(MSX/PC98等)などモバイル機器関連を中心に好き勝手な話題を扱います。基本的にはマイナー志向、ネタの鮮度は「今更誰得」レベルです、ごめんなさいw。その他、(精神的に無理のない範囲で)モバイル・チャイナフリーを意識して実践しています。mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.comBlogger744125tag:blogger.com,1999:blog-3992170577391362431.post-77040290810476045112024-01-22T00:31:00.002+09:002024-01-23T08:32:16.946+09:00DFPlayer mini互換機で「GD3200D」が使われているものはステレオ出力ができないっぽい<textarea border-style:dotted="border-style:dotted" class="markdown" disabled="disabled">先日Amazonから入手したDFPlayer mini互換機ですが、あるときふと「これ、ステレオ出力してなくね?」ということに気づきまして、いろいろと調べたり、自分の回路がおかしいんじゃないかとか、試行錯誤していました。
どうも、結論としては「GD3200D」というチップを使っている互換機は、DAC_L/Rともに同じ信号(モノラル)を出力する仕様らしいということになりました。
まず、Amazonの互換品のレビューを見ていたところ、こんなレビューがありまして。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRkUw_fL9JVsWLMAilXocYcC8IkOLTFaTQUanKb_6aYfo48meyKu_POVczW7eSyBkMxClhyphenhyphenlvNs0V0A-rBYDP1r6VxxACcld-GeakXHQG5IfYfZfGy9T2KBCPapm8mrF-eFo8c6sTAT4hTSWvFn67wemRNaA3XiazQpvLcpfk0wTqcsur7SKyJTRdVBVw5/s1432/Screenshot_20240119-032217~2.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="800" data-original-height="648" data-original-width="1432" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRkUw_fL9JVsWLMAilXocYcC8IkOLTFaTQUanKb_6aYfo48meyKu_POVczW7eSyBkMxClhyphenhyphenlvNs0V0A-rBYDP1r6VxxACcld-GeakXHQG5IfYfZfGy9T2KBCPapm8mrF-eFo8c6sTAT4hTSWvFn67wemRNaA3XiazQpvLcpfk0wTqcsur7SKyJTRdVBVw5/s400/Screenshot_20240119-032217~2.png"/></a></div>
あー、同じ現象の人いるんだーと思い、さらに使われているチップの型番を確認したところ、
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3mjbUX2rRS9n_b2L5Nht8GSJh84R91trS4R2YP_9iVP4VmOeK-Fwrtwtfpx_mQsTaOvxz4hSL90IDWmX46Y257AbpEZIvf75nigTuAYdMCZw0ULrV2jOA2oIxTfI8U5cy5i9X8dOtRJI_NYrFeaE0od6T-9JK27v-rCamKmIku76IUa-RfgsO6AGcqzuB/s1152/IMG_1696.HEIC" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="600" data-original-height="1152" data-original-width="1102" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3mjbUX2rRS9n_b2L5Nht8GSJh84R91trS4R2YP_9iVP4VmOeK-Fwrtwtfpx_mQsTaOvxz4hSL90IDWmX46Y257AbpEZIvf75nigTuAYdMCZw0ULrV2jOA2oIxTfI8U5cy5i9X8dOtRJI_NYrFeaE0od6T-9JK27v-rCamKmIku76IUa-RfgsO6AGcqzuB/s600/IMG_1696.HEIC"/></a></div>
と、レビューと一致する型番が書かれていました。
ただ、これをもって、ステレオ非対応と決めつけるのも、なんだかもやもやするので、何かしらステレオ、モノラルを切り替える設定手段はないものか?と調べてみたところ、「0x10」が「Volume Adjust」(チップによっては「Stereo Enhancer」とも書かれている)というコマンドになっていて、これで変わらないかな?と試してみましたが、全く効き目無し。
このあたりで、搭載チップ「GD3200D」のデータシートを見つけました。
原文が中国語なので、Google翻訳しながら読み進めたところ、どうもGD3200(末尾はA/B/Dがあるが、どれでも)というチップは「0x10」コマンドをそもそも実装していないということが判明ww
で、なんとなくデータシートを読み進めて、回路図なんかをボヤっと眺めていたら、ここで驚きの事実が!
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-c1In6M-DPvJ7TEn4BJQg4tU7Eudgq2dbEM492fR9VeUYYdhwz39s_J7nMkJwOqHqDHSnEv7U8Shab0E4TjIPmKsHaiIyaolzqbGgh0FnCdNr7ddCDhl2vC8qVa_BheTMqZPGOVsMzxxtsMaZ2ZFKMJg7hPt5R5F1JU-cukB9CC4ULsJgQBxn5e6JM2lb/s1600/Screenshot_20240119-032519~2.png" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" data-original-height="322" data-original-width="1432" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-c1In6M-DPvJ7TEn4BJQg4tU7Eudgq2dbEM492fR9VeUYYdhwz39s_J7nMkJwOqHqDHSnEv7U8Shab0E4TjIPmKsHaiIyaolzqbGgh0FnCdNr7ddCDhl2vC8qVa_BheTMqZPGOVsMzxxtsMaZ2ZFKMJg7hPt5R5F1JU-cukB9CC4ULsJgQBxn5e6JM2lb/s1600/Screenshot_20240119-032519~2.png"/></a></div>
チップから、DAC_LとDAC_Rが同じピンに出ている・・・
え?え?
そりゃ、もともとチップから出る信号がモノラル(左右同じ)じゃ、ステレオになるわけない・・・
ということで、回路図が正しければ、「GD3200D」というチップを使っている互換機は、DAC_L/Rともに同じ信号(モノラル)を出力する仕様らしいという結論に至りました。
DFPlayer miniは互換機が大量に出回っていますが、どのチップが載った互換機なのかは、事前にほとんど知りようがありません。なぜなら、ほとんどのAmazon出品の写真は、あたかもDFRobotの正規品かのように、正規品の写真を掲載しているからですww
一応、注意喚起の意味で中の人が購入したやつを晒します。
安いので、モノラルでも問題無しという用途には逆にいいかもしれませんが、ロットごとにチップが違うとかも普通にありそうなので、あくまで自己責任でお願いします。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQrI__u7wpguXhORWzYzd6_noohfsArPnvBGKyxeYZ0aDF_d0pef6Ks7RrIjlR_P-wFrSLbKxMp9ZtBWJ0gylTHtHcsqDINL3fAfmoVvtsR7lo0cavWuobmo3ssno9e0LJpwfQrR116aSsKrasXJW_3D3aFAckCHeaP9MAO2yG5e0Y-3B9C3NwVvuadb0E/s732/Screenshot_20240123-082507~2.png" style="display: block; padding: 1em 0; text-align: center; clear: left; float: left;"><img alt="" border="0" width="400" data-original-height="580" data-original-width="732" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQrI__u7wpguXhORWzYzd6_noohfsArPnvBGKyxeYZ0aDF_d0pef6Ks7RrIjlR_P-wFrSLbKxMp9ZtBWJ0gylTHtHcsqDINL3fAfmoVvtsR7lo0cavWuobmo3ssno9e0LJpwfQrR116aSsKrasXJW_3D3aFAckCHeaP9MAO2yG5e0Y-3B9C3NwVvuadb0E/s400/Screenshot_20240123-082507~2.png"/></a></div>
<a href="https://amzn.to/47NT0Mq">Aideepen 5個 Mini MP3プレーヤーDFPlayerオーディオモジュール、MP3 WAV WMAのを統合デコーダー、TF マイクロSDカード Uディスクをサポート 音声ボイス音楽プロセッサモジュール に対応</a>
互換品でステレオ出力が出ない~とお悩みの方に届いてほしいです、この情報。
現場からは以上です。
</textarea>
mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-88767744352473043982024-01-08T12:34:00.001+09:002024-01-08T12:35:42.449+09:00[今更誰得][ポケコン] カシオのポケコンPB-1000からMP3プレイヤー(DFPlayer Mini)を制御する #カシオ #ポケコン<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVqDqCHQXGIjplp8dc3pvfLd9GDCYUqufXr-St27KW942jYTXe8CFBWFloxxKAES7uZtX_H1iSJmX-k_0Ij8mN8iTOlMnpH8u95L2v1lW3dcLHn3ZzNdwszMjEP4M2Eyux6ij9_UNIr9heoOamGSw5kGKyImegRfzex5S95x2YWBVdhy3-FjTZiWvBv5T9/s2107/IMG_1676.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="1926" data-original-width="2107" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVqDqCHQXGIjplp8dc3pvfLd9GDCYUqufXr-St27KW942jYTXe8CFBWFloxxKAES7uZtX_H1iSJmX-k_0Ij8mN8iTOlMnpH8u95L2v1lW3dcLHn3ZzNdwszMjEP4M2Eyux6ij9_UNIr9heoOamGSw5kGKyImegRfzex5S95x2YWBVdhy3-FjTZiWvBv5T9/s400/IMG_1676.jpg"/></a></div><div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG03UyIPN0RRWEZbHBFeR1fdSs4yL4k0H7Gzj_Y_fNmdDAE7SLTMnib_LSs5Yv7nQ1Aw0mlcgFO3fEEBRGVxAMtRkPK7TWKkVA3vGmKTtmN8IeOeiQOCQq-smOjkNCGDFTB5Cq0ZrJhB2MdKhilnssL5LoPGJF9UgpQUOhyU5SahTGcnjmegWm_fC16bVA/s2235/IMG_1678.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="1648" data-original-width="2235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhG03UyIPN0RRWEZbHBFeR1fdSs4yL4k0H7Gzj_Y_fNmdDAE7SLTMnib_LSs5Yv7nQ1Aw0mlcgFO3fEEBRGVxAMtRkPK7TWKkVA3vGmKTtmN8IeOeiQOCQq-smOjkNCGDFTB5Cq0ZrJhB2MdKhilnssL5LoPGJF9UgpQUOhyU5SahTGcnjmegWm_fC16bVA/s400/IMG_1678.jpg"/></a></div>
<textarea border-style:dotted="border-style:dotted" class="markdown" disabled="disabled">
## DFPlayer MiniをPB-1000から制御したい
最近、DFPlayer MiniというMP3再生用のモジュールがあるのを知り、年末年始でいじってました。
このモジュール、何が良いかというと、操作コマンドをUARTで行えるので、制御のハードルが比較的低いことがあります。
これを、ポケコンとかMSX0とかのデバイスから制御できないか・・・?ということで、本記事はポケコンでの接続についてです。
## 接続の仕組み
PB-1000は単体ではRS-232C(いわゆるUART)通信はできませんが、オプションのFA-7/MD-100を接続するとRS-232C通信ができるようになります。
BASICでもおなじみの`OPEN`,`PRINT#`,`INPUT#`などでRS-232Cへの入出力が可能です。
取り急ぎ、クエリーコマンド(DFPlayer Mini側から応答を受け取るコマンド)の制御はちょっと難しそうなので、いったん、コマンド送信オンリーでやってみました。
制御コマンドの仕様等については、[こちら](https://github.com/DFRobot/DFRobotDFPlayerMini/tree/master/doc)にあるデータシートPDFを参考にしています。
通常のコマンドは、
```
7E,FF,06,[コマンド番号],00,[パラメータ上位],[パラメータ下位],EF
```
というフォーマットなので、これを種類に応じてひたすら`PRINT#`文でRS-232Cに出力していきます。
## 回路について
適当なユニバーサル基板をつかって、やっつけで配線してみました。
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHaPMj2pu6fUmX1a-UY0-ttBbuveMeUzbjmGM7pIby71XvCy-eP7p5CBTabcNDADdcg3ReRjeS7GNMUbaLttkS8G9703rLYYkzhpNWcX-mDOVeCSv5bTBGS3XOK2nI22TMRna-6-Orh31xj7R6PnE9zjnWW0iYozmoi4Ev9Tt_gpcjesrm5qvtCQwbxur3/s2235/IMG_1678.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="1648" data-original-width="2235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHaPMj2pu6fUmX1a-UY0-ttBbuveMeUzbjmGM7pIby71XvCy-eP7p5CBTabcNDADdcg3ReRjeS7GNMUbaLttkS8G9703rLYYkzhpNWcX-mDOVeCSv5bTBGS3XOK2nI22TMRna-6-Orh31xj7R6PnE9zjnWW0iYozmoi4Ev9Tt_gpcjesrm5qvtCQwbxur3/s400/IMG_1678.jpg"/></a></div>
- DSub25ピンコネクタは、ジェンダーチェンジャー(オス-オス)しかたまたま手元になかったので、それを使っています。
- 電源はPB-1000/FA-7側から取れるような気もするのですが、とりあえずADM3202とDFPlayerMiniが3.3V駆動なので、1.2Vの単4電池3本で電源共有して駆動しています。
- オペアンプは知識がほとんどゼロなので見様見真似でつけてみました。DFPlayerMiniはDAC出力があって、それをイヤホンに直接繋いでも聴くことは全然できるのですが、やっぱりオペアンプを通したほうが音は良くなるような気がするので、入れてみております。
- 写真ではイヤフォンジャックを左下に配置してしまったのですが、FA-7/MD-100のACアダプタープラグと干渉してしまうので、オペアンプと配置を入れ替えるなどしたほうが良いでしょう。写真ではピンソケットをイヤフォンジャックの下に入れ、持ち上げるようにして無理やり配置しています。
### 主な部品
- DSub25ピンコネクタ(オス)
- DCジャックDIP化キット(秋月電子)
- イヤフォンジャックDIP化キット(秋月電子)
- オペアンプ(AD8506)実装モジュール(秋月電子)
- RS232Cレベルコンバータ ADM3202
- DFPlayer Mini互換機
### 接続について
中の人は回路図が書けないので、主要な部品どうしの接続だけ記載しますね。
DSub25ピン←→ーADM3202
|DSub25ピン|←→|ADM3202|
| ------- | -- | ------ |
|2ピン(TX)|←→|13ピン(R1_IN)|
|3ピン(RX)|←→|14ピン(T1_OUT)|
ADM3202←→DFPlayer Mini
|ADM3202|←→|DFPlayer Mini|
| ------- | -- | ------ |
|12ピン(R1_OUT)|←→|2ピン(RX)|
|11ピン(T1_IN)|←→|3ピン(TX)|
DFPlayer Mini←→AD8506
|DFPlayer Mini|←→|AD8506|
| ------- | -- | ------ |
|4ピン(DAC_R)|←→|5ピン(B+)|
|5ピン(DAC_L)|←→|3ピン(A+)|
AD8506←→イヤフォンジャック
|AD8506|←→|イヤフォン|
| ------- | -- | ------ |
|1ピン(OUTA)|←→|L|
|7ピン(OUTB)|←→|R|
AD8506の抵抗器
|接続箇所|抵抗器|
| ------- | ------ |
|A+/B+への入力|:510Ω|
|OUTA〜A-/OUTB〜B-|:10kΩ|
|OUTA/OUTBからの出力|:1kΩ|
その他
- VCC/GNDは電源からよしなに接続してください。
- ADM3202のコンデンサは1μFのものを使いました。
## PB-1000の実装
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuu13d1amDd2Hz_hyphenhyphenzo3jFbr9vQV5ec9wgjnI5u6rf2OmR9QrE6aJxWhmAAfAjfLWR8r5MD2YtD_RaBXoY0WcnXowTvS_tQ8B4cpR_9K4CT2ou-WmDXDgxnCTnzWu93LLpOb4Rz-sMm1UxJvanrKzq0rBvcWHj2IQqcD0G2rDufpM7nWVFsFhXqI5YzY9G/s2799/IMG_1679_LCD.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="692" data-original-width="2799" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuu13d1amDd2Hz_hyphenhyphenzo3jFbr9vQV5ec9wgjnI5u6rf2OmR9QrE6aJxWhmAAfAjfLWR8r5MD2YtD_RaBXoY0WcnXowTvS_tQ8B4cpR_9K4CT2ou-WmDXDgxnCTnzWu93LLpOb4Rz-sMm1UxJvanrKzq0rBvcWHj2IQqcD0G2rDufpM7nWVFsFhXqI5YzY9G/s400/IMG_1679_LCD.jpg"/></a></div>
起動すると自動的に1曲目の演奏を開始します。
操作は以下のとおりです。
| キー操作 | 内容 |
| ------ | --- |
| P または \[PLAY\]タッチ | :再生 |
| スペースキー または \[PAUSE\]タッチ | :一時停止・再開 |
| \( または \[PREV\]タッチ | :前の曲へ |
| \) または \[NEXT\]タッチ | :次の曲へ |
| \+ | :ボリュームアップ |
| \- | :ボリュームダウン |
プログラムは以下のとおりです。
```BASIC
1 'DFPLAYER MINI CONTROLLER
1000 CLS
1010 TR=1:'TRACK NO
1020 VO=15:'VOLUME
1030 PF$=CHR$(&H7E)+CHR$(&HFF)+CHR$(&H06)
1040 ZR$=CHR$(&H00)
1050 SF$=CHR$(&HEF)
1060 ST=1:'STATUS 0:PAUSE 1:PLAY
1070 RT=0
1500 OPEN "COM0:7,N,8,1,N,N,N,N,N" FOR OUTPUT AS #1
2000 'INITIAL SETUP
2100 'RESET MODULE
2110 PRINT#1,PF$+CHR$(&H0C)+ZR$+ZR$+ZR$+SF$;
2120 FOR I=1 TO 300:NEXT I
2200 'VOLUME SET
2210 PRINT#1,PF$+CHR$(&H06)+ZR$+ZR$+CHR$(VO)+SF$;
2300 'PLAYBACK 1ST TRACK
2310 PRINT#1,PF$+CHR$(&H03)+ZR$+ZR$+CHR$(TR)+SF$;
3000 'TITLE
3010 LOCATE 0,0
3020 PRINT"-=< DFPlayer Mini Controller >=-";
3030 LOCATE 0,1
3040 PRINT"[ PLAY ][PAUSE ][ PREV ][ NEXT ]";
3100 'TRACK AND VOLUME
3110 LOCATE 0,3
3120 PRINT "TRACK:";TR;" VOLUME";VO;
3200 'ANIMATION
3205 IF ST=0 THEN 4000
3210 LOCATE RT+16,2
3220 PRINT " ";
3230 RT=RT+1:IF RT>15 THEN RT=0
3240 LOCATE RT+16,2
3250 PRINT ")";
4000 'SELECT OPERATION
4100 K$=INKEY$
4105 IF K$="" THEN 3100
4110 IF K$=CHR$(244) OR K$="P" THEN LOCATE 0,2:PRINT "PLAY ";:PRINT#1,PF$+CHR$(&H0D)+ZR$+ZR$+ZR$+SF$;:ST=1
4120 IF K$=CHR$(245) OR K$=" " THEN GOSUB 5000
4130 IF (K$=CHR$(246) OR K$="(") AND TR>1 THEN LOCATE 0,2:PRINT "PREV ";:PRINT#1,PF$+CHR$(&H02)+ZR$+ZR$+CHR$(TR)+SF$;:TR=TR-1
4140 IF K$=CHR$(247) OR K$=")" THEN LOCATE 0,2:PRINT "NEXT ";:PRINT#1,PF$+CHR$(&H01)+ZR$+ZR$+CHR$(TR)+SF$;:TR=TR+1
4150 IF K$="+" AND VO<30 THEN LOCATE 0,2:PRINT "VOLUP ";:PRINT#1,PF$+CHR$(&H04)+ZR$+ZR$+ZR$+SF$;:VO=VO+1
4160 IF K$="-" AND VO>0 THEN LOCATE 0,2:PRINT "VOLDN ";:PRINT#1,PF$+CHR$(&H05)+ZR$+ZR$+ZR$+SF$;:VO=VO-1
4200 GOTO 3100
5000 'PAUSE OPERATION
5100 IF ST=1 THEN LOCATE 0,2:PRINT "PAUSE ";:PRINT#1,PF$+CHR$(&H0E)+ZR$+ZR$+ZR$+SF$;:ST=0:RETURN
5110 IF ST=0 THEN LOCATE 0,2:PRINT "RESUME ";:PRINT#1,PF$+CHR$(&H0D)+ZR$+ZR$+ZR$+SF$;:ST=1:RETURN
5200 RETURN
```
ファイルはGitHubでも公開しています。
[https://github.com/MobileFF/msx0_sample/tree/main/I2C_to_UART](https://github.com/MobileFF/msx0_sample/tree/main/I2C_to_UART)
## おことわり
本記事で使用しているDFPlayer Miniは正規品ではなく互換品のため、プログラムで想定している挙動が、正規品とは異なっている可能性があります。あしからずご了承ください。
ちなみに中の人が入手した互換品は[Amazonで5個セット1,399円のもの](https://amzn.to/47r4oxP)です。
</textarea>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08HMQW367&linkId=0ef90fe1a473c9357aa1e0702189332b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08PTP6KKS&linkId=30753c5246cbe8c01f0d795b544f247f" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07MZSHDCQ&linkId=a2e696359015b7f1f36d8293d2eb9f18" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-79808248770267093312024-01-07T19:28:00.007+09:002024-01-08T01:09:49.950+09:00[MSX0] MSX0からUART接続のデバイスに通信する #MSX0<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtO5a0mUJ3nST65CDQlfWb0ajvrKjpNODIqwmmEUQJ_tA8Kk3XgdPWgI6SO5B5HyZ0ITwvV-obZbsS_lJ5oJZhXtseLCHujh-P7cDrrZ5fZZ15m5zKZla4qK-N4nBIAt5Xe48d4Av-0YOHuVm7EMc7QWtW5OHP3vKlsF9Sr0-YFKsA-GnvdazTqx2n8Hsi/s2863/IMG_20240107_065629.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="2041" data-original-width="2863" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtO5a0mUJ3nST65CDQlfWb0ajvrKjpNODIqwmmEUQJ_tA8Kk3XgdPWgI6SO5B5HyZ0ITwvV-obZbsS_lJ5oJZhXtseLCHujh-P7cDrrZ5fZZ15m5zKZla4qK-N4nBIAt5Xe48d4Av-0YOHuVm7EMc7QWtW5OHP3vKlsF9Sr0-YFKsA-GnvdazTqx2n8Hsi/s400/IMG_20240107_065629.jpg"/></a></div>
<textarea border-style:dotted="border-style:dotted" class="markdown" disabled="disabled">
## DFPlayer MiniをMSX0から制御したい
最近、DFPlayer MiniというMP3再生用のモジュールがあるのを知り、年末年始でいじってました。
このモジュール、何が良いかというと、操作コマンドをUARTで行えるので、制御のハードルが比較的低いことがあります。
これを、ポケコンとかMSX0とかのデバイスから制御できないか・・・?ということで、本記事はMSX0での接続についてです。
## 接続の仕組み
御存知の通り?MSX0は2024年1月現在、IoT BASIC/BIOSではUARTをサポートしていません。
外部との通信はWiFiかI2Cになります。
シリアルコンソールもあるといえばあるのですが、こちらはMSX0をリモートで操作するための仕組みなので、MSX0へのインプットとして使う手はあるものの、MSX0から外部へのデータ送信に使うには中の人にはちょっとハードルが高めではあります。
もちろん、WiFiという手もあるのですが、今回はとりあえずMSX0らしく?ということで、I2Cで送ったデータをUARTに流してもらうところを実装してみました。
変換エンジンには、Raspberry Pi Picoを利用しています。
仕掛けはとても単純で、
- まず、MSX0から「データ長(送信データのバイト数)」と「返却を受け取るかどうか(1=受け取る、それ以外=受け取らない)」を`CALL IOTPUT`で2バイト送信。
- その後、「データ本体」をまとめて`CALL IOTPUT`で送信。
- ラズパイpico側はそれらの指示に従い、所定のバイト数を受け取ったら、「データ本体」をUARTに送信。
- 「返却を受け取るかどうか」に1を指定したときは、続けてUARTからレスポンスを受け取り、I2C側に返却する。
- MSX0では`CALL IOTGET`でレスポンスを受信。
ざっくりいうと上記のような感じです。
下記ファイルはGitHubでも公開しています。
[https://github.com/MobileFF/msx0_sample/tree/main/I2C_to_UART](https://github.com/MobileFF/msx0_sample/tree/main/I2C_to_UART)
## MSX0側の実装
```BASIC
1 'SAVE"I2C_UART.BAS"
1000 'Init
1010 D$="3C"
1020 _IOTFIND("device/i2c_a",C)
1030 PRINT "IOTFIND:";C
1040 IF C=0 THEN 1200:'Not Found
1050 _IOTFIND("device/i2c_a",A$(0),C)
1060 PRINT "Slave Address : ";
1070 FOR I=0 TO C-1
1080 PRINT A$(I);" ";
1090 IF A$(I)=D$ THEN 1300:'Create Device Path
1100 NEXT I
1200 'Not Found
1210 PRINT "Device not found."
1220 END
1300 'Create Device Path
1310 N$="device/i2c_a/"+A$(I)
2000 'Main
2010 PRINT
2020 PRINT "---- DFPlayer Mini ----"
3000 'INIT
3010 PRINT "---- RESET ----"
3100 RESTORE 40000:'RESET
3120 GOSUB 20000:'RESET
3125 FOR I=0 TO 1000:NEXT I
3130 GOSUB 20000:'SET VOLUME
3140 GOSUB 20000:'REPEAT TRACK 1
3150 RESTORE 40300:'QUERY STATUS
3160 GOSUB 20000:'QUERY STATUS
3170 FOR I=0 TO 100:NEXT I
3180 GOTO 3150
9999 END
20000 'Write Multi Bytes
20100 READ LN
20110 READ NR
20120 PRINT "[";LN;",";NR;"]"
20200 T1$=CHR$(LN)+CHR$(NR)
20210 _IOTPUT(N$,T1$)
20300 T2$=""
20310 PRINT "[";
20320 FOR I=1 TO LN
20330 READ V$
20340 PRINT V$;",";
20350 T2$=T2$+CHR$(VAL("&H"+V$))
20360 NEXT I
20370 PRINT "]"
20380 _IOTPUT(N$,T2$)
20400 IF NR=0 THEN RETURN
20500 _IOTGET(N$,RP$)
20600 PRINT ">> ";
20610 IF LEN(RP$) = 0 THEN GOTO 20500
20620 FOR I=1 TO LEN(RP$)
20630 PRINT HEX$(ASC(MID$(RP$,I,1)));",";
20640 NEXT I
20650 PRINT
20999 RETURN
40000 'RESET
40010 DATA 8,0
40020 DATA 7E,FF,06,0C,00,00,00,EF
40100 'SET VOLUME
40110 DATA 8,0
40120 DATA 7E,FF,06,06,00,00,10,EF
40200 'REPEAT TRACK 1
40210 DATA 8,0
40220 DATA 7E,FF,06,08,00,00,01,EF
40300 'QUERY STATUS
40310 DATA 8,1
40320 DATA 7E,FF,06,42,00,00,00,EF
```
上記の仕掛けに基づき、データ送信サブルーチン(20000〜20999行)では、以下のように`DATA`文から2つのデータを読み込み、`_IOTPUT`で送信しています。
ここでは、`LN=8`および`NR=0`なので、\[8,0\]という2バイトを送信しています。
```BASIC
20100 READ LN
20110 READ NR
20200 T1$=CHR$(LN)+CHR$(NR)
20210 _IOTPUT(N$,T1$)
```
その後、さらに`DATA`文から以下のように指定バイト数分(変数`LN`で決定。ここでは8バイト)データを読み込んで変数`T2$`に追加していき、ループ終了後に`_IOTPUT`で`T2$`の内容(8バイト)を送信しています。
```BASIC
20300 T2$=""
20320 FOR I=1 TO LN
20330 READ V$
20350 T2$=T2$+CHR$(VAL("&H"+V$))
20360 NEXT I
20380 _IOTPUT(N$,T2$)
```
ただ一方的にデータを送り続けるだけで良ければ、先頭2バイト(\[8,0\])は不要で、データそのものをひたすら送るでも大丈夫なのですが、応答を取得できるようにするため、いったん送信がどこで終わるかを知る必要があるため、最初にバイト数を指定しています。
DATA文に記載の8バイトのデータはDFPLayer Miniを想定したものですが、制御コマンドの仕様等については、[こちら](https://github.com/DFRobot/DFRobotDFPlayerMini/tree/master/doc)にあるデータシートPDFを参考にしています。
## Raspberry Pi pico側の実装
Raspberry Pi picoの環境はMicroPythonを想定しています。ファイルは`main.py`と`i2c_slave.py`になります。
I2Cは0番、UARTは1番を使いますので、
- 0番ピン=I2C(0) SDA
- 1番ピン=I2C(0) SCL
- 6番ピン=UART(1) TX
- 7番ピン=UART(1) RX
につなぎます。
ラズパイpicoとDFPlayerMiniの間は、
|ラズパイpico| ←→ | DFPlayer Mini|
| ---------- | ---- | ----------- |
|6番ピン(TX)| ←→ | 2番ピン(RX)|
|7番ピン(RX)| ←→ | 3番ピン(TX)|
となります。
\[main.py\]
```Python
from i2c_slave import I2C_slave
import time
from machine import UART,Pin
# I2C設定 (I2C識別ID 0or1, SDA, SCL)
i2c = I2C_slave(0,sda=0,scl=1,slaveAddress=0x3C)
# UART初期設定(UART番号,クロックレート,TXピン:GP4/6Pin,RXピン:GP5/7Pin)
uart = UART(1,baudrate=9600,tx = Pin(4),rx = Pin(5))
while True:
length = i2c.get()
need_resp = i2c.get()
print("length {0}/ need_resp {1}".format(length,need_resp))
payload = bytearray(length)
for i in range(length):
payload[i] = i2c.get()
print("{0}:{1}".format(i,hex(payload[i])))
print(payload)
uart.write(payload)
uart.flush()
while (uart.txdone()==False):
pass
time.sleep(0.01)
if need_resp == 1:
response = bytearray()
waitCount = 0
while True:
resp = uart.read(1)
if resp == None:
waitCount += 1
if waitCount>10000:
break
else:
response.append(resp[0])
print(response)
while i2c.anyRead()==False:
pass
for d in response:
i2c.put(d)
```
以下のI2Cスレーブ動作用のクラスは、
[Use Pico as an I2C slave? - Raspberry Pi Forums](https://forums.raspberrypi.com/viewtopic.php?t=302978)
に掲載されていたコードを拝借しています。作者の方に深く感謝いたします。
\[i2c_slave.py\]
```Python
from machine import mem32,Pin
class I2C_slave:
I2C0_BASE = 0x40044000
I2C1_BASE = 0x40048000
IO_BANK0_BASE = 0x40014000
mem_rw = 0x0000
mem_xor = 0x1000
mem_set = 0x2000
mem_clr = 0x3000
IC_CON = 0
IC_TAR = 4
IC_SAR = 8
IC_DATA_CMD = 0x10
IC_RAW_INTR_STAT = 0x34
IC_RX_TL = 0x38
IC_TX_TL = 0x3C
IC_CLR_INTR = 0x40
IC_CLR_RD_REQ = 0x50
IC_CLR_TX_ABRT = 0x54
IC_ENABLE = 0x6c
IC_STATUS = 0x70
def write_reg(self, reg, data, method=0):
mem32[ self.i2c_base | method | reg] = data
def set_reg(self, reg, data):
self.write_reg(reg, data, method=self.mem_set)
def clr_reg(self, reg, data):
self.write_reg(reg, data, method=self.mem_clr)
def __init__(self, i2cID = 0, sda=0, scl=1, slaveAddress=0x41):
self.scl = scl
self.sda = sda
self.slaveAddress = slaveAddress
self.i2c_ID = i2cID
if self.i2c_ID == 0:
self.i2c_base = self.I2C0_BASE
else:
self.i2c_base = self.I2C1_BASE
# 1 Disable DW_apb_i2c
self.clr_reg(self.IC_ENABLE, 1)
# 2 set slave address
# clr bit 0 to 9
# set slave address
self.clr_reg(self.IC_SAR, 0x1ff)
self.set_reg(self.IC_SAR, self.slaveAddress &0x1ff)
# 3 write IC_CON 7 bit, enable in slave-only
self.clr_reg(self.IC_CON, 0b01001001)
# set SDA PIN
mem32[ self.IO_BANK0_BASE | self.mem_clr | ( 4 + 8 * self.sda) ] = 0x1f
mem32[ self.IO_BANK0_BASE | self.mem_set | ( 4 + 8 * self.sda) ] = 3
# set SLA PIN
mem32[ self.IO_BANK0_BASE | self.mem_clr | ( 4 + 8 * self.scl) ] = 0x1f
mem32[ self.IO_BANK0_BASE | self.mem_set | ( 4 + 8 * self.scl) ] = 3
# 4 enable i2c
self.set_reg(self.IC_ENABLE, 1)
def anyRead(self):
status = mem32[ self.i2c_base | self.IC_RAW_INTR_STAT] & 0x20
if status :
return True
return False
def put(self, data):
# reset flag
self.clr_reg(self.IC_CLR_TX_ABRT,1)
status = mem32[ self.i2c_base | self.IC_CLR_RD_REQ]
mem32[ self.i2c_base | self.IC_DATA_CMD] = data & 0xff
def any(self):
# get IC_STATUS
status = mem32[ self.i2c_base | self.IC_STATUS]
# check RFNE receive fifio not empty
if (status & 8) :
return True
return False
def get(self):
while not self.any():
pass
return mem32[ self.i2c_base | self.IC_DATA_CMD] & 0xff
if __name__ == "__main__":
import utime
from machine import mem32
from i2cSlave import i2c_slave
s_i2c = i2c_slave(0,sda=0,scl=1,slaveAddress=0x41)
counter =1
try:
while True:
if s_i2c.any():
print(s_i2c.get())
if s_i2c.anyRead():
counter = counter + 1
s_i2c.put(counter & 0xff)
except KeyboardInterrupt:
pass
```
## おことわり
本記事で使用しているDFPlayer Miniは正規品ではなく互換品のため、プログラムで想定している挙動が、正規品とは異なっている可能性があります。あしからずご了承ください。
ちなみに中の人が入手した互換品は[Amazonで5個セット1,399円のもの](https://amzn.to/47r4oxP)です。
</textarea>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08HMQW367&linkId=0ef90fe1a473c9357aa1e0702189332b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08PTP6KKS&linkId=30753c5246cbe8c01f0d795b544f247f" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07MZSHDCQ&linkId=a2e696359015b7f1f36d8293d2eb9f18" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-45105509727252930232023-12-31T21:00:00.001+09:002023-12-31T21:00:00.260+09:00[雑記] 2023年 当ブログ的 ゆくモバイルくるモバイル<textarea border-style:dotted="border-style:dotted" class="markdown" disabled="disabled">
<!-- ここに Markdown 記法で記述するとプレビュー時に変換される -->
今年も何とか年内に書けましたのでアップいたします。
## <買ったもの>
### Amazon Fire HD8(2022)
モバイル関係(スマートフォン、タブレット)で購入したものがまさかのFireタブレットだけという事態w
プライムデーで8000円くらいでした。
FireHD8については、少し前のモデルも持っていましたが、ベースのAndroidのバージョンが古く、アプリがまともにインストールできないので、買い替えと相成りました。
やっぱり所詮は廉価モデルなので、動作は相変わらずのもっさり状態ですが、何しろもとが安いので、ラフな使い方も気兼ねなくできてしまいます。
中の人はお風呂端末として使っています。
(特にFireHD8には防水機能は搭載されていないため、通常はそのような使い方は絶対NGです)
### MSX0 Stack
MSX0というIoT対応を強化してM5Stack Core2上でエミュレーションされたMSXプラットフォームです。
今年の後半はこれにドはまりして、あれやこれやとプログラムを作っては楽しんでおりました。
IoTをBASICプログラムでできるというのが、なかなかに新鮮でした。
第2弾製品群のクラファンも実施中ですが、ちょっとこちらの達成は雲行きが怪しい感じが漂ってきています。
以上2製品です。今年は買ってないですね~
## <契約・解約・プラン変更した回線>
- 新規契約・解約なし
そのため、回線状況は昨年同様です。
- IIJmio(1,600円~)
- mineo(700円)
- DMM Mobile(1,689円)
- hi-ho WiMAX2+(2,968円)
今年は端末も回線も動き少なく、ある意味安定していた1年でした。
## <所感>
昨年はQWERTYデバイスとしてはTitan Slimがあり、もちろん、Titan Pocket/初代Titanもあるなかで、SurfaceDuoを買ってしまい、そこから先は基本的にSurfaceDuo1本で使っているという感じです。
2画面スマフォにそれほどまでにハマるとは思っていなかったので、それこそ2021年くらいまでは、来年のQWERTYデバイスはどうするか?ということが話題の中心だったわけですが、これがSurfaceDuoの購入でリセットされてしまい、新しいデバイスへの購入意欲がだいぶ下がってしまったところがあります。
MSX0の登場、入手によって、モバイルというよりはIoT関係にちょっと本格的にはまりつつあるので、2024年はIoT+MSXで遊ぶのが中心になるのか、はたまた別のスマートフォンが登場してそちらに傾倒するのか・・・
ポケコン活動も、若干MSX0に押され気味ではありますが、ぽつぽつと続けていこうと思います。
来年もよろしくお願いいたします。
</textarea>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08HMQW367&linkId=0ef90fe1a473c9357aa1e0702189332b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08PTP6KKS&linkId=30753c5246cbe8c01f0d795b544f247f" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07MZSHDCQ&linkId=a2e696359015b7f1f36d8293d2eb9f18" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-91207752269687150702023-12-29T13:10:00.003+09:002024-01-06T14:10:37.435+09:00[MSX0][実験] 32KBのROMイメージをRAMにロードして起動するプログラムをCプログラム(Z88DK)で作成してみる #MSX #MSX0<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtXJkO116vSHJm16ItjpK0lWL568Vr3iGYMxtNBVTuJwQEJabHQAIK1TcJeI-oAkTidZO7owkIK8JLQEKkdmQHCetOZjiZvkzR6KebuvdpW9GyaA4jntLQEFDA3j93kmUiCiYwdczUndz1Nnxtf4bzcOyZnZmROZOyLfSlRPfOPZa0zU4M-mRrgsOx9yi8/s2007/IMG_20231225_185739.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="1586" data-original-width="2007" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtXJkO116vSHJm16ItjpK0lWL568Vr3iGYMxtNBVTuJwQEJabHQAIK1TcJeI-oAkTidZO7owkIK8JLQEKkdmQHCetOZjiZvkzR6KebuvdpW9GyaA4jntLQEFDA3j93kmUiCiYwdczUndz1Nnxtf4bzcOyZnZmROZOyLfSlRPfOPZa0zU4M-mRrgsOx9yi8/s400/IMG_20231225_185739.jpg"/></a></div>
<textarea border-style:dotted="border-style:dotted" class="markdown" disabled="disabled">
## 能書き
MSX実機やMSX0のBASICモードにおいて、ディスクに保存されている32KBのROMイメージファイルをRAMにロードしてリセットし、そのRAM領域をROMカートリッジとして認識させ、ゲームソフトなどを起動するための手順です。
本エントリの内容はあくまで個人的に実験したいからやっているものであり、MSX-DOS環境が使える場合、SofaRunなどすでに同種のソフトは存在しており、そちらを使うほうが32KB以外のサイズのROMイメージにも対応しており、簡単便利かつ確実かと思われますので、あしからずご了承ください。
## ROMイメージをRAMにロードしてROMカートリッジとして認識させるには
先日、16KBのROMイメージをロードする手順について記事にしましたが、32KBのROMは、基本的にページ1とページ2を利用しています。
ページ1はBASICモードではBASIC ROMとして割り当たっているため、マシン語実行中にENASLT BIOSでページ1をRAMが割り当たっているスロットに切り替え、そこにROMの内容を書き込んでいました。
しかしながら、ページ2はBASICモードで通常利用されている領域になるため、BASICモードからプログラムを実行する場合には注意が必要です。
まず、ROMイメージをロードするプログラム自体をページ2に置くことはできませんので、HIMEM(マシン語領域の開始番地)をページ3(C000H)以降にした上で、作成するプログラムの格納位置もC000H以降にする必要があります。
Z88DKでBSAVE形式のファイルを作る場合に、格納開始位置(いわゆるアセンブラのORGで指定するアドレス)を変更する場合は、-zorgというオプションを付けてコンパイルします。詳しくは弊ブログ記事をご参考に。
__\[MSX\] Z88DKでBSAVE形式のファイルを作る場合に格納アドレスを変更するには #MSX #Z88DK__<br>
[https://mobileff.blogspot.com/2023/12/msx-z88dkbsave-msx-z88dk.html](https://mobileff.blogspot.com/2023/12/msx-z88dkbsave-msx-z88dk.html)
また、FCBやDMAバッファ(ディスクファイルのアクセス状況を管理する領域と、ディスク内容を読み書きするのに使うバッファ領域)を、16KB ROMのロードでは特に何も考えずmalloc()関数でやっていましたが、これだと、ページ2にメモリを確保してしまうようで、うまく動作できない(FCBやDMAの領域がROMイメージで上書きされてしまうから)ため、決め打ちでそれぞれFCBはE000H、DMAはE000H+37と指定します。FCBが36バイトなので、DMAはその直後に指定しています。
MSX/MSX2では、転送が終わったらソフトリセットしてしまえばよいのですが、MSX2+の場合、リセット後のブートシーケンス内でRAMを初期化してしまうため、転送後に、ROMイメージの先頭から3バイト目(4002H)以降に記載の2バイトがINIT(初期処理としてジャンプする先の番地)になっていますので、ROMイメージロード後に、BIOSコールのCALSLTを使ってROMイメージの入っているRAMのINITへインタースロットコールします。
## 手順
MSXのBIOS(ENASLT)を使うと、メモリ空間上の特定のページを、任意のスロットのページに切り替えることができます。
ただし、ページ0については、BASICモードでは各種BIOSの内容が格納されている領域のため、ENASLTではページ0を別のスロットのものに切り替えることはできません。
32KBのROMカートリッジは、たいていページ1〜2に割り当てられていることが多いので、ページ1〜2にロードします。
手順の概略は次のとおりです。
- `CLEAR 100,&HC400` のようにCLEAR文を実行して、ページ3にマシン語領域を確保する
- マシン語実行後はBASIC関係ないじゃんって思うところですが、これをちゃんとやらないとBLOAD"xxx",Rしたあと普通に暴走します
- 現状のスロット構成を読み込んで、変数に格納しておく
- ページ1にRAMが格納されているスロットを特定する
- BIOSで調べる方法もあると思われますが、この記事では手動で指定させています。
- ENASLTをコールし、ページ1をRAMの格納されているスロットに切り替える
- ページ2はBASICモードでは最初からRAMに割り当たっているので、ENASLTはしなくても大丈夫です。
- ディスクから1024バイト読み込む
- LDIRを使って、読み込んだ内容が格納されているメモリ領域を、ページ1〜2のメモリに転送する
- 次の1024バイトをディスクから読み込み、以下同様に繰り返す
- 全部ロードし終わったら、ROMイメージの先頭から3〜4バイト目に書かれたアドレス(INIT)を読み取る
- INITが0でない場合は、INITのアドレスにインタースロットコールする
- INITが0の場合は、0000H番地にジャンプ(ソフトリセット)
## ソースコード
GitHubにアップしていますので、そちらをご覧ください。
[https://github.com/MobileFF/msx0_sample/tree/main/ROMLOAD](https://github.com/MobileFF/msx0_sample/tree/main/ROMLOAD)
## 注意点
MSX2+以降では、ブートシーケンス中に、RAMの内容をクリアする処理が追加されています。そのため、ROMイメージロード後にソフトリセットしてROMイメージを起動させることはできません。
MSXのROMイメージにおいては、先頭から3バイト目(4002H)以降に記載の2バイトがINIT(初期処理としてジャンプする先の番地)になっていますので、ROMイメージロード後にスロット構成を元に戻さずに、直接INITの示す番地にジャンプするか、BIOSコールのCALSLTを使ってROMイメージの入っているRAMのINITへインタースロットコールすれば、MSX2+以降でも起動が可能なようです。
</textarea>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08HMQW367&linkId=0ef90fe1a473c9357aa1e0702189332b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08PTP6KKS&linkId=30753c5246cbe8c01f0d795b544f247f" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07MZSHDCQ&linkId=a2e696359015b7f1f36d8293d2eb9f18" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-60351875551358758492023-12-25T21:27:00.002+09:002023-12-25T21:27:31.028+09:00[MSX] Z88DKでBSAVE形式のファイルを作る場合に格納アドレスを変更するには #MSX #Z88DK<textarea border-style:dotted="border-style:dotted" class="markdown" disabled="disabled">
<!-- ここに Markdown 記法で記述するとプレビュー時に変換される -->
## Z88DKでBSAVE形式のファイルを作るには
Z88DKではコンパイル時にSubtypeを指定することで、様々なシーンに対応したバイナリを作ることができます。
`subtype=disk`と指定すると、通常のバイナリに加えて、BSAVE形式のバイナリも作ってくれます。BSAVE形式はファイルの先頭に識別用のコード1バイト(FEH)、開始アドレス、終了アドレス、実行開始アドレス各2バイトの計7バイトのヘッダがつくのが特徴です。
## BSAVE形式の格納アドレスを変更するには
デフォルトでは、BSAVE形式の開始アドレスは`9C40H`とみなしてバイナリが作られますが、これを任意のアドレスに変更するには、`-zorg`というオプションを指定します。ちなみに、アドレスを16進表記とする場合は、"0x"というプレフィックスをつける必要があります。
```
zcc +msx -create-app hello.c mymsx.c -subtype=disk -o $1.bin -DAMALLOC -lm -zorg 0xc400
```
のように指定すると、先頭番地がC400HのBSAVE形式のバイナリを作成してくれます。
実行時には、HIMEMの位置を変更してマシン語領域を確保した後に、BLOADコマンドでロードして実行します。
Z88DKでコンパイルすると、BSAVE形式のファイルは拡張子が`.MSX`となります。
```
CLEAR 100,&HC400
BLOAD"FOOBAR.MSX",R
```
</textarea>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08HMQW367&linkId=0ef90fe1a473c9357aa1e0702189332b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08PTP6KKS&linkId=30753c5246cbe8c01f0d795b544f247f" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07MZSHDCQ&linkId=a2e696359015b7f1f36d8293d2eb9f18" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-5072445681593874132023-12-23T13:05:00.003+09:002023-12-23T23:58:00.336+09:00[MSX0][実験] 16KBのROMイメージをRAMにロードして起動するプログラムをCプログラム(Z88DK)で作成してみる #MSX #MSX0<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlOeJ92q-5V6BDhPb7SQhBRet8-NT-jfLh5iK80UEmfZbTOcLNcrXWWKDk_d1_K7XNogJHuswM3RLZWEXNvwx_d0JuTmQdluKHJO70_BRhV4TQ7d0QIe0PUwnv_5ZB6A3PBUywtyiUGmdXrLKFoPyO1cdmCcK1so5e4K9GGWuVk1zjWPHTgExU3KS1ho7_/s2124/IMG_20231223_230025.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="400" data-original-height="1710" data-original-width="2124" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlOeJ92q-5V6BDhPb7SQhBRet8-NT-jfLh5iK80UEmfZbTOcLNcrXWWKDk_d1_K7XNogJHuswM3RLZWEXNvwx_d0JuTmQdluKHJO70_BRhV4TQ7d0QIe0PUwnv_5ZB6A3PBUywtyiUGmdXrLKFoPyO1cdmCcK1so5e4K9GGWuVk1zjWPHTgExU3KS1ho7_/s400/IMG_20231223_230025.jpg"/></a></div>
<textarea border-style:dotted="border-style:dotted" class="markdown" disabled="disabled">
<!-- ここに Markdown 記法で記述するとプレビュー時に変換される -->
<!--
- [能書き](#能書き)
- [ROMイメージをRAMにロードしてROMカートリッジとして認識させるには](#ROMイメージをRAMにロードしてROMカートリッジとして認識させるには)
- [手順](#手順)
- [ソースコード](#ソースコード)
- [注意点](#注意点)
-->
## 能書き
MSX実機やMSX0のBASICモードにおいて、ディスクに保存されている16KBのROMイメージファイルをRAMにロードしてリセットし、そのRAM領域をROMカートリッジとして認識させ、ゲームソフトなどを起動するための手順です。
本エントリの内容はあくまで個人的に実験したいからやっているものであり、MSX-DOS環境が使える場合、SofaRunなどすでに同種のソフトは存在しており、そちらを使うほうが16KB以外のサイズのROMイメージにも対応しており、簡単便利かつ確実かと思われますので、あしからずご了承ください。
## ROMイメージをRAMにロードしてROMカートリッジとして認識させるには
MSXでRAMを64KB搭載している場合、BASICモードではページ0〜3のうち、ページ0〜1はBASIC ROMとして使われている(ROMのあるスロットが選択されてCPUから見える状態になっている)ので、ページ0と1に割り当てられているRAMは特に使われていない状態です。
このうち、ページ1に割りあたっているRAMに16KBのROMイメージの内容を転送し、ソフトリセット(0000H番地へのジャンプ)をすることによって、MSXのブートシーケンス内で、RAMに書かれた内容があたかもROMカートリッジの内容のように認識され、ROMカートリッジを挿したのと同じような状態でソフトを起動させることができます。
## 手順
MSXのBIOS(ENASLT)を使うと、メモリ空間上の特定のページを、任意のスロットのページに切り替えることができます。
ただし、ページ0については、BASICモードでは各種BIOSの内容が格納されている領域のため、ENASLTではページ0を別のスロットのものに切り替えることはできません。
16KBのROMカートリッジは、たいていページ1に割り当てられていることが多いので、ページ1にロードします。
手順の概略は次のとおりです。
- 現状のスロット構成を読み込んで、変数に格納しておく
- ページ1にRAMが格納されているスロットを特定する
- BIOSで調べる方法もあると思われますが、この記事では手動で指定させています。
- ENASLTをコールし、ページ1をRAMの格納されているスロットに切り替える
- ディスクから1024バイト読み込む
- LDIRを使って、読み込んだ内容が格納されているメモリ領域を、ページ1のメモリに転送する
- 次の1024バイトをディスクから読み込み、以下同様に繰り返す
- 全部ロードし終わったら、ROMイメージの先頭から3〜4バイト目に書かれたアドレス(INIT)を読み取る
- INITが0でない場合は、INITのアドレスにインタースロットコールする
- INITが0の場合は、0000H番地にジャンプ(ソフトリセット)
## ソースコード
GitHubにアップしていますので、そちらをご覧ください。
[https://github.com/MobileFF/msx0_sample/tree/main/ROMLOAD](https://github.com/MobileFF/msx0_sample/tree/main/ROMLOAD)
## 注意点
MSX2+以降では、ブートシーケンス中に、RAMの内容をクリアする処理が追加されています。そのため、ソフトリセットしてROMイメージを起動させることはできません。
MSXのROMイメージにおいては、先頭から3バイト目(4002H)以降に記載の2バイトがINIT(初期処理としてジャンプする先の番地)になっていますので、ROMイメージロード後にスロット構成を元に戻さずに、直接INITの示す番地にジャンプするか、BIOSコールのCALSLTを使ってROMイメージの入っているRAMのINITへインタースロットコールすれば、MSX2+以降でも起動が可能なようです。一部のROMで試しましたが、問題なく起動できましたので、上記の起動手順もそのように修正しました。
</textarea>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08HMQW367&linkId=0ef90fe1a473c9357aa1e0702189332b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08PTP6KKS&linkId=30753c5246cbe8c01f0d795b544f247f" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07MZSHDCQ&linkId=a2e696359015b7f1f36d8293d2eb9f18" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-70644957067957197402023-12-23T12:03:00.000+09:002023-12-23T12:03:36.953+09:00[MSX] Z88DKでC言語プログラムからBIOSを呼び出す #MSX #MSX0<textarea border-style:dotted="border-style:dotted" class="markdown" disabled="disabled">
<!-- ここに Markdown 記法で記述するとプレビュー時に変換される -->
- [Z88DKでC言語プログラムからBIOSを呼び出す方法](#Z88DKでC言語プログラムからBIOSを呼び出す方法)
- [アセンブラのソースをCソース内に記述する](#アセンブラのソースをCソース内に記述する)
- [関数内でアセンブラソースを書く](#関数内でアセンブラソースを書く)
- [関数の引数をアセンブラと連携する](#関数の引数をアセンブラと連携する)
- [関数の戻り値をアセンブラと連携する](#関数の戻り値をアセンブラと連携する)
- [その他](#その他)
- [利用例](#利用例)
## Z88DKでC言語プログラムからBIOSを呼び出す方法
Z88DKではC言語内にアセンブラのソースを書くことができ、C言語の関数・戻り値と連動させることもできます。
Z88DK自体のインストールは、別エントリを参照ください。
__[MSX] Z88DKを使ってC言語でマシン語プログラムをつくる #MSX #MSX0__<br>
[https://mobileff.blogspot.com/2023/12/msx-z88dkc-msx-msx0.html](https://mobileff.blogspot.com/2023/12/msx-z88dkc-msx-msx0.html)
## アセンブラのソースをCソース内に記述する
C言語ソース内に`#asm`〜`#endasm`で囲った内部にはアセンブラのソースを書くことができます。
EQUなどの定数定義は、ソースコードの先頭に書いておけば、以後は関数内でも参照することが可能です。
アセンブラの記法はZASMのものがそのまま使えるような印象です。
__定数定義の例__
```asm
#asm
WRSLT EQU 0014H ;MAIN-ROM BIOS CALL WRSLT
CALSLT EQU 001CH ;MAIN-ROM BIOS CALL CALSLT
ENASLT EQU 0024H ;MAIN-ROM BIOS CALL ENASLT
CHGET EQU 009FH ;MAIN-ROM BIOS CALL CHGET
CHPUT EQU 00A2H ;MAIN-ROM BIOS CALL CHPUT
CLS EQU 00C3H ;MAIN-ROM BIOS CALL CLS
EXPTBL EQU 0FCC1H ; EXPTBL
SYSTEMCALL EQU 0F37DH ; DISK-BASIC SYSTEM CALL
CREATE_FILE EQU 016H ;
SET_DMA EQU 01AH ;
OPEN_FILE EQU 00FH ;
RND_WRITE EQU 026H ;
RND_READ EQU 027H ;
CLOSE_FILE EQU 010H ;
#endasm
```
### 関数内でアセンブラソースを書く
関数内でアセンブラを実行する場合、関数定義内で`#asm`〜`#endasm`で囲みます。
```asm
void msx_cls() {
#asm
CALL CLS ; BIOS(CLS)をコール(定数CLSはEQUで定義済みの前提)
RET ; リターン
#endasm
}
```
### 関数の引数をアセンブラと連携する
関数の引数は、以下のようにして任意のレジスタに格納して使うことができます。
```c
void msx_chput(char c) {
#asm
LD IX, 2 ; SPに加算したい値をIXにロード
ADD IX, SP ; IXにSPの値を加算(SP+2をIXに代入)
LD A, (IX) ; (IX)のメモリ内容をAレジスタにロード
CALL CHPUT ; BIOS(CHPUT)をコール(定数CHPUTはEQUで定義済みの前提)
RET
#endasm
}
```
スタックポインタSPの2バイト後ろから引数の内容が格納されていきます。
ただし、引数が複数あるときは、引数順と逆順に格納されていくので、取り出しかたに注意が必要です。
```c
void msx_ldir_mem2dma(char* dma_buffer,unsigned short int record_size,unsigned short int read_address) {
#asm
; 関数に渡された引数の値を取り出し
LD IX, 2
ADD IX, SP
LD D, (IX+5) ; 引数 dma_bufferの上位バイト
LD E, (IX+4) ; 引数 dma_bufferの下位バイト
LD B, (IX+3) ; 引数 record_sizeの上位バイト
LD C, (IX+2) ; 引数 record_sizeの下位バイト
LD H, (IX+1) ; 引数 read_addressの上位バイト
LD L, (IX) ; 引数 read_addressの下位バイト
LDIR
#endasm
}
```
このように最後の引数を`(IX)`とし、前の引数は`(IX+1)`、`(IX+2)`・・・のように指定して格納していきます。
### 関数の戻り値をアセンブラと連携する
戻り値については、int固定のようで、リターン直前にHLレジスタに格納された値が戻り値となります。
BIOSコールの場合は結果がAレジスタ(1バイト)で得られるものも多いですが、その場合はHレジスタに0をロードし、LレジスタにAレジスタをロードしておくと良いと思います。
```c
char msx_chget() {
#asm
CALL CHGET
LD H,0x00
LD L,A
RET
#endasm
}
```
### その他
関数内でアセンブラソースとCソースを混在させることも可能とは思いますが、関数内のアセンブラと関数内のCプログラムで値を連携する方法は調べていないのでよくわかりません。
## 利用例
上記に出てきたような関数を作って、テキスト表示と文字入力をMSX BIOSコールで作ってみると以下のようになります。
mymsx.h
```
void msx_chput(char c);
void msx_chput_CRLF();
void msx_cls();
void msx_print(char[] str);
void msx_println(char[] str);
char msx_chget();
char* msx_input();
char* msx_input_line_headless();
char* msx_input_with_prompt(char[] prompt);
```
mymsx.c
```
#include <stdlib.h>
#include "mymsx.h"
#asm
CHGET EQU 009FH ;MAIN-ROM BIOS CALL CHGET
CHPUT EQU 00A2H ;MAIN-ROM BIOS CALL CHPUT
CLS EQU 00C3H ;MAIN-ROM BIOS CALL CLS
#endasm
char* input_buffer = NULL;
void msx_chput(char c) {
#asm
LD IX, 2
ADD IX, SP
LD A, (IX)
CALL CHPUT
RET
#endasm
}
void msx_chput_CRLF() {
msx_chput(0x0D);
msx_chput(0x0A);
}
void msx_cls() {
#asm
CALL CLS
RET
#endasm
}
void msx_print(char[] str) {
for(int i=0;i<256;i++) {
if(str[i]==0) {
return;
}
msx_chput(str[i]);
}
}
void msx_println(char[] str) {
msx_print(str);
msx_chput_CRLF();
}
// 1文字入力
char msx_chget() {
#asm
CALL CHGET
LD H,0x00
LD L,A
RET
#endasm
}
// 1行入力
char* msx_input() {
msx_chput('?');
if (input_buffer == NULL) {
input_buffer = (char*)malloc(sizeof(char)*256);
}
for(int i=0;i<256;i++) {
input_buffer[i]=0;
}
int index=0;
while(index<256) {
char s = msx_chget();
if (s==0x0D) {
msx_chput_CRLF();
input_buffer[index]=0;
return input_buffer;
}
if (s==0x08 && index>0) {
index--;
}
input_buffer[index++]=s;
msx_chput(s);
}
return input_buffer;
}
// 1行入力
char* msx_input_line_headless() {
if (input_buffer == NULL) {
input_buffer = (char*)malloc(sizeof(char)*256);
}
for(int i=0;i<256;i++) {
input_buffer[i]=0;
}
int index=0;
while(index<256) {
char s = msx_chget();
if (s==0x0D) {
input_buffer[index]=0;
return input_buffer;
}
input_buffer[index++]=s;
}
return input_buffer;
}
char* msx_input_with_prompt(char[] prompt) {
msx_print(prompt);
return msx_input();
// return prompt;
}
```
hello.c
```c
#include <stdlib.h>
#include "mymsx.h"
void main() {
msx_println("Hello!MSX0!");
char* str = msx_input_with_prompt("INPUT TEXT=");
msx_print(str);
}
```
コンパイルは、以下のようなコマンドを使います。
```shell
zcc +msx -create-app hello.c mymsx.c -subtype=disk -o hello.bin -DAMALLOC -lm
```
コンパイル後に、作成された`hello.msx`をMSX本体に転送します。
Disk BASICでは、
```BASIC
bload "hello.msx",r
```
でプログラムを実行できます。
※`hello.bin`というファイルも生成されていますが、こちらはBSAVE形式ではないため、BASICで直接呼び出すことはできませんのでご注意ください。
</textarea>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08HMQW367&linkId=0ef90fe1a473c9357aa1e0702189332b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08PTP6KKS&linkId=30753c5246cbe8c01f0d795b544f247f" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07MZSHDCQ&linkId=a2e696359015b7f1f36d8293d2eb9f18" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-3349716746597946142023-12-23T03:19:00.001+09:002024-01-02T11:43:31.453+09:00[MSX] Z88DKを使ってC言語でマシン語プログラムをつくる #MSX #MSX0<textarea border-style:dotted="border-style:dotted" class="markdown" disabled="disabled">
<!-- ここに Markdown 記法で記述するとプレビュー時に変換される -->
- [MSX用のマシン語プログラムをC言語で作れるZ88DK](#msx用のマシン語プログラムをc言語で作れるz88dk)
- [Chromebook上でZ88DKを導入する](#chromebook上でz88dkを導入する)
- [コンパイルのコマンド](#コンパイルのコマンド)
## MSX用のマシン語プログラムをC言語で作れるZ88DK
MSXでのプログラムは基本的にBASICでしか書けなかった中の人ですが、カシオのポケコンPB-1000でちょっとだけアセンブラを覚え、MSXでもスロット操作とかでBIOSを使わないといけないようなものだけ、ちょっとだけ書いてはいます。
でもやっぱりアセンブラは中の人にはレベルが高すぎて、書くのがきついです。
BASICで全部かけるのが一番ですが、上記に書いたようにやっぱりBIOS直接呼ばないといけない処理なんかもあるし・・・
と思っていたところで、Z88DKという、C言語のプログラムをZ80CPU用のマシン語にコンパイルしてくれる環境があるというのを知りまして。
ちなみに、SHARPのポケコンPC-G850シリーズもZ80搭載なので、ポケコン用のマシン語プログラムも作れたりします。
## Chromebook上でZ88DKを導入する
最近なんとなくChromebookを使っている中の人なので、Z88DKをChromebookに導入してみることにしました。
ちなみに主に使っているのは↓の機種ですが、最近、古くなったCore i5のノートPCにChromeOS Flexを入れたら快適すぎたので、そちらに浮気しております。CZ1はさすがにパフォーマンス的にきつすぎてw
> __\[Chromebook\] ASUS Chromebook Detachable CZ1が30,000円を切っていたので買ってみた #chromebook__
> [https://mobileff.blogspot.com/2022/04/chromebook-asus-chromebook-detachable.html](https://mobileff.blogspot.com/2022/04/chromebook-asus-chromebook-detachable.html)
Chromebookはたいてい、Linux環境のインストールができますので、Linux環境をまずはインストールします。
あとは、Linux用に導入手順を書いてくださっている方がいるので、その方のページを参考に導入します。
> __Z88DK を使って MSX のゲームをつくるための環境構築メモ__
> [https://maple4estry.netlify.app/z88dk-msx/](https://maple4estry.netlify.app/z88dk-msx/)
中の人の環境では、`./build.sh`を実行する前に、以下のコマンドを追加で実行するとうまくいくようでした。
```
sudo apt-get install libxml2-dev libxml2-doc
```
(追記) ChromeOS Flexで試したときは、以下のコマンドも追加で実行する必要がありました。
```
sudo apt-get install libgmp-dev
sudo apt-get install g++
cd /usr/include
sudo ln -s libxml2/libxml .
sudo apt-get install pkg-config
```
## コンパイルのコマンド
たとえば、以下の3つのソースコードをコンパイルするとします。
hello.c
```c
#include <stdlib.h>
#include "mymsx.h"
void main() {
msx_println("Hello!MSX0!");
}
```
mymsx.h
```c
void msx_chput(char c);
void msx_chput_CRLF();
void msx_print(char[] str);
void msx_println(char[] str);
```
mymsx.c
```c
#include <stdlib.h>
#include "mymsx.h"
#asm
CHPUT EQU 00A2H ;MAIN-ROM BIOS CALL CHPUT
#endasm
void msx_chput(char c) {
#asm
LD IX, 2
ADD IX, SP
LD A, (IX)
CALL CHPUT
RET
#endasm
}
void msx_chput_CRLF() {
msx_chput(0x0D);
msx_chput(0x0A);
}
void msx_print(char[] str) {
for(int i=0;i<256;i++) {
if(str[i]==0) {
return;
}
msx_chput(str[i]);
}
}
void msx_println(char[] str) {
msx_print(str);
msx_chput_CRLF();
}
```
コンパイルのコマンドは以下のようになります。
```shell
zcc +msx -create-app hello.c mymsx.c -subtype=disk -o hello.bin -DAMALLOC -lm
```
オプションについては、中の人の理解ですが、
- `+msx`
- MSX用のバイナリを作るときにつける
- `-create-app`
- 実行用のバイナリを作るときにつける
- `-subtype=disk`
- DiskBASIC上で実行できる形式でコンパイルしたいときにつける。たとえば、BSAVE形式のバイナリを作るときなど。
- `-DAMALLOC`
- プログラム内でmalloc()関数を使うときに必要なオプション
- `-lm`
- プログラム内でmath.hの数学関数を使うときに必要なオプション
という感じです。特に、BASICから実行するBSAVE形式のバイナリにしたいときに重要なのが`-subtype=disk`で、これを指定すると、コンパイル結果のバイナリは、`hello.bin`以外に`hello.msx`というファイルが作成され、これがBSAVE形式(専用のヘッダが付加される)になりますので、MSXからは、
```BASIC
bload "hello.msx",r
```
とコマンドを打てば実行できるようになります。
ちなみに、作成したバイナリをMSX0に転送したい場合は、有志各位の優れたツールもありますので、そちらを使っていただくか、拙作のserbinsvもよろしければ使ってみてください。
> __\[MSX0\] シリアルコンソール経由でファイル転送するプログラム #MSX #MSX0__
> [https://mobileff.blogspot.com/2023/12/msx0.html](https://mobileff.blogspot.com/2023/12/msx0.html)
とりあえず現場からは以上です。
</textarea>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08HMQW367&linkId=0ef90fe1a473c9357aa1e0702189332b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08PTP6KKS&linkId=30753c5246cbe8c01f0d795b544f247f" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07MZSHDCQ&linkId=a2e696359015b7f1f36d8293d2eb9f18" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-45278123638874300402023-12-19T00:05:00.005+09:002023-12-21T00:02:56.485+09:00[MSX0] シリアルコンソール経由でファイル転送するプログラム #MSX #MSX0<textarea border-style:dotted="border-style:dotted" class="markdown" disabled="disabled">
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIRM5VyggXwR1gfAhtTMRumgVzF0fwINc_z6iah7QxZl2JPgMgx2I_u-KplQhL3sgXVavQw9cgHmPrdFDjih81JGwSsmuDsIPDXJ9ITyXFAyIpLYn-Tc8MYWlaUA9jYrla20pAuOVQMk1KjFE6bQlUzZvBOYtxuhwk26j-_Svrlj9XPt-2cPKpp1SJMzKf/s3840/IMG_20231219_012640~4.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="400" data-original-height="3840" data-original-width="2693" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIRM5VyggXwR1gfAhtTMRumgVzF0fwINc_z6iah7QxZl2JPgMgx2I_u-KplQhL3sgXVavQw9cgHmPrdFDjih81JGwSsmuDsIPDXJ9ITyXFAyIpLYn-Tc8MYWlaUA9jYrla20pAuOVQMk1KjFE6bQlUzZvBOYtxuhwk26j-_Svrlj9XPt-2cPKpp1SJMzKf/s400/IMG_20231219_012640~4.jpg"/></a></div>
<!-- ここに Markdown 記法で記述するとプレビュー時に変換される -->
- [能書き](#能書き)
- [ファイル群の説明](#ファイル群の説明)
- [linuxフォルダ](#linuxフォルダ)
- [MSXフォルダ](#msxフォルダ)
- [利用手順](#利用手順)
- [MSX側の準備](#msx側の準備)
- [Linux側の操作](#linux側の操作)
- [その他](#その他)
## 能書き
PCからMSX0にシリアルコンソール経由でファイル転送するプログラム群です。
PC側はChromebookのLinux環境を想定していますが、正直、Linuxなら多分なんでも大丈夫なんではないかと思います。PC側のプログラムはPythonとodコマンドを利用していますので、それらがなければインストールしておいていただければ動くと思います。Windowsでもodコマンド相当のものがあれば動かせると思いますが検証していません。
シリアルポートのデバイスファイルが `/dev/ttyACM0` に割り当たっていることを想定したコードになっていますので、環境によって異なる場合は変更してお使いください。
PCとMSX0はシリアルコンソールが利用できる必要があるため、USBで接続しておく必要があります。
MSX側の受信プログラムはZ88DKを使ってC言語で書いております。プログラムのビルドにはZ88DK環境が必要です。
MSX側の実行環境はDiskBASICになります。ディスクアクセスにファンクションコールを使っていますが、DiskBASICとMSX-DOSではファンクションコールの実行アドレスが異なるため、そのままではMSX-DOSでは実行できません。ソースコードの一部とビルドオプションを変えればいけると思われますが未確認です。
肝心の転送速度は、1KBあたり10秒くらいかかってしまい、はっきり言って遅いです。
あくまで、こんなこともできるんだなというサンプルとしてご参考になりましたら幸いです。
数キロバイトとかの小さいプログラムの転送であれば、コマンド一発でCプログラムのビルドと転送、MSX0側での保存までできるので、それなりに便利に使えると思います。自分は使ってます。
転送用のテキストファイルの内容を使うと、コピーペーストのひと手間ふた手間はかかりますが、WebMSXなどへのファイル転送にも応用できます。
## ファイル群の説明
- linuxフォルダ
- PC(Linux環境)上に配置します。パスの通ったフォルダに配置してください。置かれているサンプルコードは、`~/bin`へ配置し、`~/bin`にパスが通っていることを前提としているものがありますので、ご注意ください。
- MSXフォルダ
- MSX側に配置する受信プログラムのソースコードや実行ファイル、また受信プログラムをMSX0側で生成するためのテキストファイルなどが含まれています。
### linuxフォルダ
|ファイル名 | 説明 |
|-------|--------|
|build.sh|Cソースコードファイル名(拡張子なし)を指定するとCプログラムをビルドし、転送用のBASICプログラムソースコード+αを生成|
|buildsend.sh|build.sh実行後に、MSX0にバイナリを転送する|
|printBinAsBasic.py|転送用ではなく、MSX0のシリアルコンソールにコピペする用のテキストファイル(BASICプログラムとその前後で実行したいコマンドが含まれる)を生成するプログラム|
|printBinAsBasic.sh|printBinAsBasic.py実行のシェル。対象のファイル名を指定して利用する。|
|crebin.bas.txt|上記のprintBinAsBasicで出力に利用されるテキストファイル。|
|serialSendBin.py|MSX0のシリアルコンソール経由でデータ送信するプログラム。プログラム内で受信プログラムを実行するため、あらかじめ受信プログラムをMSX0側に入れておく必要あり。|
|serialSendBin.sh|上記のserialSendBin.py実行のシェル。対象のファイル名を指定して利用する。|
|serPri.py|上記Pythonファイルでインポートされるファイル|
|conPri.py|上記Pythonファイルでインポートされるファイル|
### MSXフォルダ
|ファイル名 | 説明 |
|-------|--------|
|serbinsv.c|受信プログラムの本体|
|serbinsv.msx|受信プログラムの実行バイナリ|
|serbinsv.msx.bas|受信プログラムを最初にMSX0に格納するためのBASICプログラム|
|mymsx.c/mymsx.h|主にMSX BIOSを実行するための共通ユーティリティ|
## 利用手順
### MSX側の準備
- PCとMSX0をUSBケーブルで接続します
- `telnet` 等で `serbinsv.msx.bas` の内容をコピーペーストします
- MSX0側にBASICプログラムが入力、実行されます。
- `serbinsv.msx saved.` と表示されると転送プログラム(`serbinsv.msx`)がディスクに保存完了しています。
### Linux側の操作
- 何かしらのバイナリファイルをMSX0に転送したいとき
- `serialSendBin.sh [転送したいファイル名]`
- Cプログラムをビルドしたいとき
- `build.sh [Cソースファイル名(拡張子なしで指定)]`
- Cプログラムをビルドし、ビルド結果のバイナリファイルをMSX0に転送したいとき
- `buildsend.sh [Cソースファイル名(拡張子なしで指定)]`
- 何かしらのバイナリファイルをMSX0にコピペして生成するためのBASICプログラムを作成したいとき
- `printBinAsBasic.sh [バイナリファイル名]`
## その他
- `serbinsv.msx` はBSAVE形式なので、単独で `bload"serbinsv.msx",r`で実行することも可能です。
以上
</textarea>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08HMQW367&linkId=0ef90fe1a473c9357aa1e0702189332b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08PTP6KKS&linkId=30753c5246cbe8c01f0d795b544f247f" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07MZSHDCQ&linkId=a2e696359015b7f1f36d8293d2eb9f18" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>
mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-81030455524916331282023-12-08T00:08:00.003+09:002023-12-08T00:08:21.571+09:00[MSX0] 非公式?なIOT命令について調べてみた #MSX0<p>風の噂に、IoT BASICには未定義命令(未実装命令?)があるらしいと聞き、調べてみました。</p><p><br /></p><h2 style="text-align: left;">CALL IOTSEND</h2><p>あくまで中の人の読解による解釈なので間違ってるかもしれませんが、CALL IOTSENDは以下のような挙動になっているようです。</p><p></p><ol style="text-align: left;"><li>I/Oポート8に対してコマンド0xAA,0x02を送信</li><li>第一引数の文字列長をI/Oポート8に送信</li><li>第一引数の文字列の内容をI/Oポート8に送信</li><li>第二引数の文字列長をI/Oポート8に送信</li><li>第二引数の文字列の内容をI/Oポート8に送信</li><li>終わり</li></ol><p></p><p>で、何をするかなんですが。</p><p>最初に送信するコマンドと思われる0xAA,0x02が何をするものなのかは、MSX0側のファームウェアの処理に依存しています。なので、現時点では不明なのです。</p><p><br /></p><h2 style="text-align: left;">ファイルデバイス名「IOT:」</h2><p>OPEN文で指定するファイルデバイス名に「IOT:」というのが追加されています。</p><p>ただ、おそらくこのファイルデバイス名は完全に未完になっているようで、中の人が読んだ限りでは、シーケンシャル出力の処理(PRINT#文など)は、「ノード"host/name"に対するIOTPUT相当の処理(I/Oポート8への出力)しかしていないっぽいかんじです。</p><p>といって、</p><p>OPEN "IOT:" FOR OUTPUT AS #1</p><p>PRINT #1,"msx0-12345"</p><p>のように書いてもDevice I/O Errorになってしまって、なんだかうまくいきません。</p><p>実は、ROM内の"host/name"というデバイス名の近くには”net/s0/com/send"という文字列が見受けられますが、使われている形跡がなく、実際のMSX0にもそのようなノードパスは存在しません。</p><p>将来的には、このノードパスを使って、何かしらのアクセスができるようにしたいのかもしれません。付属のサンプルコードの解説にも、OPEN文でTCP/IP通信ができるようにする?とかの記述も見受けられたので、アップデートでの対応が予定されているのかもしれません。</p><p>期待して待ちましょう・・・</p><p><br /></p><p><br /></p>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08HMQW367&linkId=0ef90fe1a473c9357aa1e0702189332b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08PTP6KKS&linkId=30753c5246cbe8c01f0d795b544f247f" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07MZSHDCQ&linkId=a2e696359015b7f1f36d8293d2eb9f18" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-83993409802117961832023-12-06T20:20:00.003+09:002023-12-07T00:15:49.194+09:00[MSX0] MSX0 Stackに内蔵されているRTCをIoT BASICから利用する #MSX #MSX0 #M5Stack<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidNMvyx4Jw6NvQGSX03fUGS0pnTsMDlK9SnB46yEpCKJKALdUdQhsb1ZHQO52EoIjwGNec2CF4X9mvr0OOxhUZRbqwb7xM5MJPdKCNrNR5d9Sdn4N3nuySnuyu_q537bKMaMYf06PXl55Rbih8RoobvdTaPuZzPaPQ7PIu1Kt0oomOGembuseGc7EaHO7G/s918/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%20(857).png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="715" data-original-width="918" height="249" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidNMvyx4Jw6NvQGSX03fUGS0pnTsMDlK9SnB46yEpCKJKALdUdQhsb1ZHQO52EoIjwGNec2CF4X9mvr0OOxhUZRbqwb7xM5MJPdKCNrNR5d9Sdn4N3nuySnuyu_q537bKMaMYf06PXl55Rbih8RoobvdTaPuZzPaPQ7PIu1Kt0oomOGembuseGc7EaHO7G/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%20(857).png" width="320" /></a></div><br /><p>MSX0 StackのベースとなっているM5 Stackは、BM8563というRTC(Real Time Clock)を内蔵しています。</p><p>MSX規格ではMSX2から時計を内蔵するようになり、時刻管理ができるようになりましたので、MSX0をMSX2以上のモードで動かせば、BM8563に時刻が書き込まれて利用される(GET TIME/GET DATEで取得する時刻として使える)のかなと思ってしまいそうですが、実はそうではありません。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBSTZBR290mx5rv0eEte_4lbOb764FEGbei_V_lFaM5Qds1DDRqJDpNqnUpYs5ob7Dzs9DGShjd13BK_Boy-IDjwdIxzGjIc02lXOcVDswaC29_oKT39sX6x5jgH7cjn_1OBkOjfwevCJfiGyq-6dM6XC64U4EmT6eDgxEECl_R17qMjq9X4wLUX6T6SAz/s2382/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-12-06%20002958.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="750" data-original-width="2382" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBSTZBR290mx5rv0eEte_4lbOb764FEGbei_V_lFaM5Qds1DDRqJDpNqnUpYs5ob7Dzs9DGShjd13BK_Boy-IDjwdIxzGjIc02lXOcVDswaC29_oKT39sX6x5jgH7cjn_1OBkOjfwevCJfiGyq-6dM6XC64U4EmT6eDgxEECl_R17qMjq9X4wLUX6T6SAz/w640-h202/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-12-06%20002958.png" width="640" /></a></div><div><br /></div>このとおりで、MSX0は現状、時刻の保持にBM8563は使っていないのです。<div><br /></div><div>ということは、BM8563はMSX0の通常機能には影響せずに独立して好きな用途に使うことができるということなのです。</div><div><br /></div><div>BM8563は、IoT BASICではノードパス「"device/i2c_i/51"」でアクセスすることができます。</div><div><br /></div><div>デバイスを初期化するには、00H,00H,01H,00H,0DH,00Hの順に値を送ります。</div><div><br /></div><div>初期化後に、02Hに続いて、年、月、曜日、日、時、分、秒の順に値を送ります。</div><div><br /></div><div>詳しくは、データシートなどをご覧いただきたいのですが、年については、1900年からの差分を記録しますが、2000年以降については、月の値のbit6(上から2桁目)を1にすると、2000年からの差分とみなされます。</div><div><br /></div><div>曜日は0=日、1=月・・・です。</div><div><br /></div><div>月以外の数値データについては、上位4ビットが10の位、下位4ビットが1の位になります。</div><div><br /></div><div>で、MSX0本体の時計とは別に日時を管理できるようになって、じゃあどうするのって話ではあるのですが、MSX Origin Timeというのを勝手に考えてその時間を記録することにしました。MSX Origin TimeとはMSX企画が発表された1983年6月16日0時0分0秒からの差分時間になりますww</div><div><br /></div><div>MSX Origin Timeを記録するほうのBASICプログラムはこちら。</div><div><br /></div>
<!--https://cdnjs.com/libraries/highlight.js-->
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/styles/a11y-dark.min.css" rel="stylesheet"></link>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
<pre class="prettyprint"><code>1 'SAVE"SETMSXOT.BAS"
100 'Init
110 N0$="device/i2c_i"
120 BM$="51"
130 NP$=N0$+"/"+BM$
1000 'Find I2C Devices
1100 PRINT "BM8563(RTC) ";
1110 _IOTFIND(N0$,C)
1120 IF C=0 THEN PRINT "Not Found.":END
1200 _IOTFIND(N0$,A$(0),C)
1210 FOR I=0 TO C-1
1220 IF A$(I)=BM$ THEN PRINT "Found.":GOTO 2000
1230 NEXT I
1900 PRINT "Not Found.":END
2000 'BM8563 Initialize
2100 _IOTPUT(NP$,CHR$(&H0)+CHR$(&H0))
2110 _IOTPUT(NP$,CHR$(&H1)+CHR$(&H0))
2120 _IOTPUT(NP$,CHR$(&HD)+CHR$(&H0))
3000 YE=1983 :'Year
3010 MO=6 :'Month
3020 DW=4 :'Thursday
3030 DA=16 :'Date
3040 HO=0 :'Hour
3050 MI=0 :'Minute
3060 SE=0 :'Second
3100 GET DATE MD$
3110 GET TIME MT$
3200 Y1 = VAL("20"+MID$(MD$,1,2))-YE
3210 M2 = VAL(MID$(MD$,4,2))-MO+1
3230 IF M2<0 3240="" 3250="" 3260="" 3270="" 3280="" 3290="" 4100="" 4110="" 4130="" 4140="" 4195="" 4200="" 4210="" 4220="" b4="" ct="" d3="0" d4="30+D4:M2=M2-1:IF" dt="" ear="" h5="VAL(MID$(MT$,1,2))" hex="" if="" m2="" m6="VAL(MID$(MT$,4,2))" onth="" print="" s7="VAL(MID$(MT$,7,2))" then="" v="">=10 THEN B4$="1":M2=M2-10
4230 DT$=CHR$(VAL("&B"+CT$+"00"+B4$+"0000")+M2)+DT$
4235 PRINT HEX$(ASC(DT$))
4300 'Day of Week
4310 DT$=CHR$(D3)+DT$
4335 PRINT HEX$(ASC(DT$))
4400 'Date
4410 V$=STR$(D4):V$=RIGHT$(V$,LEN(V$)-1)
4420 DT$=CHR$(VAL("&H"+V$))+DT$
4435 PRINT HEX$(ASC(DT$))
4600 'Hour
4610 V$=STR$(H5):V$=RIGHT$(V$,LEN(V$)-1)
4620 DT$=CHR$(VAL("&H"+V$))+DT$
4630 PRINT HEX$(ASC(DT$))
4700 'Minute
4710 V$=STR$(M6):V$=RIGHT$(V$,LEN(V$)-1)
4720 DT$=CHR$(VAL("&H"+V$))+DT$
4735 PRINTHEX$(ASC(DT$))
4800 'Second
4810 V$=STR$(S7):V$=RIGHT$(V$,LEN(V$)-1)
4820 DT$=CHR$(VAL("&H"+V$))+DT$
4835 PRINT HEX$(ASC(DT$))
4900 FOR I=1 TO 7
4910 PRINT RIGHT$("0"+HEX$(ASC(MID$(DT$,I,1))),2);" ";
4920 NEXT I
4930 PRINT
5000 'Set Date
5010 PRINT "RTC Set To ";Y1;"/";M2;"/";D4;" ";H5;":";M6;":";S7;"..."
5100 _IOTPUT(NP$,CHR$(&H2)+DT$)</0></code></pre>
<div><div><br /></div><div>そして、通常の時計とMSX Origin Timeを表示するプログラムがこちらです。</div><div><br /></div>
<pre class="prettyprint"><code>1 'SAVE"MSXOTCLK.BAS"
100 'Init
110 N0$="device/i2c_i"
120 BM$="51"
130 NP$=N0$+"/"+BM$
200 FOR I=0 TO 6
210 READ DW$(I)
220 NEXT I
230 DATA Sun,Mon,Tue,Wed,Thu,Fri,Sat
500 SCREEN 1
1000 'Find I2C Devices
1100 PRINT "BM8563(RTC) ";
1110 _IOTFIND(N0$,C)
1120 IF C=0 THEN PRINT "Not Found.":END
1200 _IOTFIND(N0$,A$(0),C)
1210 FOR I=0 TO C-1
1220 IF A$(I)=BM$ THEN PRINT "Found.":GOTO 2000
1230 NEXT I
1900 PRINT "Not Found.":END
2000 'BM8563 Initialize
2100 _IOTPUT(NP$,CHR$(&H0)+CHR$(&H0))
2110 _IOTPUT(NP$,CHR$(&H1)+CHR$(&H0))
2120 _IOTPUT(NP$,CHR$(&HD)+CHR$(&H0))
2200 CLS
3000 'Get Date and Time From BM8563(RTC)
3100 GET DATE DM$
3110 GET TIME TM$
3200 FOR I=1 TO 7
3210 _IOTPUT(NP$,CHR$(I+1)):_IOTGET(NP$,D$)
3220 BX=ASC(D$)
3230 IF I=1 THEN BX=BX AND &H7F :'Second
3240 IF I=2 THEN BX=BX AND &H7F :'Minute
3250 IF I=3 THEN BX=BX AND &H3F :'Hour
3260 IF I=4 THEN BX=BX AND &H3F :'Date
3270 IF I=5 THEN BX=BX AND &H7 :'Day of Week
3280 IF I=6 THEN CF=BX AND &H80 : BX=BX AND &H1F :'Month
3300 IF CF<>0 THEN CT=2000 ELSE CT=1900
3400 BC$ = RIGHT$("0"+HEX$(BX),2)
3410 B = VAL("&H"+LEFT$(BC$,1))*10+VAL("&H"+RIGHT$(BC$,1))
3420 'IF I=7 THEN B=B+CT
3430 DT(I-1)=B
3450 'PRINT RIGHT$("0"+HEX$(ASC(D$)),2);" ";
3500 NEXT I
3510 'PRINT
4000 'Output MSX Origin time and Current Time
4100 LOCATE 2,7
4110 PRINT "MSX Origin Time is..."
4200 LOCATE 2,8
4210 PRINT USING "##/##/## ##:##:##";DT(6),DT(5),DT(3),DT(2),DT(1),DT(0)
4310 LOCATE 2,11
4320 PRINT "Current Time is..."
4400 LOCATE 2,12
4410 PRINT DM$;" ";TM$
5000 IF INKEY$="" THEN 3000</code></pre>
<div><br /></div><div>ちなみに、MSX Origin Timeの求め方(1983/6/16 00:00:00との差分の求め方)は、あくまでネタなので正確性などは気にしないでくださいww</div><div><br /></div><div>ソースは<a href="https://github.com/MobileFF/msx0_sample/tree/main/RTC_sample">GitHub</a>にも載せました。</div><div><br /></div><div><br /></div><div><p><br /></p></div></div>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08HMQW367&linkId=0ef90fe1a473c9357aa1e0702189332b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08PTP6KKS&linkId=30753c5246cbe8c01f0d795b544f247f" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07MZSHDCQ&linkId=a2e696359015b7f1f36d8293d2eb9f18" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-19415457447750177722023-12-05T00:26:00.001+09:002023-12-05T00:33:35.210+09:00[MSX0] MSX0単体でWebAPIアクセスし日本語の情報を取得する #MSX0<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2WEcSXKAuSUOMOJsRqXQwCCU6AdlsAQwcvYNd6M-SaC9-toK8-axS1ofP44qoe0D9cjtYFte5yHqh2W8OCxWffg7RtU43xC1sU0b6CTFI-kVYzlxe-i25MDevK2IByi1OkdBGc1ra9sHmkY2tcOGXJYnL4OoNc8aHsKLDlcyn4vne4TJlXe9VuJz_49gE/s3217/IMG_20231204_223259.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="3217" data-original-width="1862" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2WEcSXKAuSUOMOJsRqXQwCCU6AdlsAQwcvYNd6M-SaC9-toK8-axS1ofP44qoe0D9cjtYFte5yHqh2W8OCxWffg7RtU43xC1sU0b6CTFI-kVYzlxe-i25MDevK2IByi1OkdBGc1ra9sHmkY2tcOGXJYnL4OoNc8aHsKLDlcyn4vne4TJlXe9VuJz_49gE/s320/IMG_20231204_223259.jpg" width="185" /></a></div><p>以前に</p><p><b>mobileFF's blog: MSX0でWebAPIへのHTTP通信を試してみた #MSX #MSX0 #Arduino</b><br /><a href="https://mobileff.blogspot.com/2023/09/msx0webapihttp-msx-msx0-arduino.html">https://mobileff.blogspot.com/2023/09/msx0webapihttp-msx-msx0-arduino.html</a></p><p>という内容を投稿しましたが、これはUTF8→SJIS変換とJSONのパースをどちらも外部にあるArduinoで肩代わりしてくれて、MSX0からはほとんど単にCALL IOTPUT、CALL IOTGETしているだけというものでした。</p><p>その後、<a href="https://github.com/IKATEN-X">IKATEN</a>氏がMSX0単体でのUTF8→SJIS変換ソリューション(<a href="https://github.com/IKATEN-X/DecodeUTF8toSJIS_forMSX">DecodeUTF8toSJIS_forMSX</a>)を発表され、その変換サンプルテキストの解説の中で言及されていた<a href="https://github.com/ricbit">ricbit</a>氏の<a href="https://github.com/ricbit/msxjson">MSX JSON Parser</a>というのを知り、これらを組み合わせれば超他力本願ですがMSX0単体でもWebAPIから日本語の情報が取れる、取れるぞ・・・!と週末頑張ってみました。</p><p>IKATEN氏のUTF8→SJIS変換のサンプルプログラムは、単体でUTF8エンコードのテキストファイルをディスクから読み取り、SJISに変換して表示してくれるものですが、プログラムに組み込むにあたり、サブルーチン化したかったので一部改変しました。またファイルディスクリプタはBASICプログラム内で他のファイルを使うことも想定し、UTF8SJIS.txtは余裕を見て大きめの番号(#5)でオープンしています。</p><p>文字列変数TX$に変換させたいUTF8文字列を入れ、GOSUB 60000で変換ルーチンを呼び出します。そうすると文字列変数SJ$にSJIS変換された結果の文字列が入ってきますので、あとはSJ$を煮るなり焼くなりPRINTするなりします。</p><p>MSX JSON Parserは最初からBASICから呼ばれることを想定した設計になっているので、リファレンスに従い素直に利用できました。</p><p>パーサーの本体はjson.binという1KB未満のバイナリファイルで、デフォルトではD000Hに配置、実行されてUSR関数をUSR0〜2まで作ります。</p><p>受信したJSONはメモリ上の任意の場所に書き込んでおく必要があります。今回は大きさを鑑みて4KB未満だろうと判断しC000Hから配置しています。</p><p>あとは受信したJSONをPOKE文でC000H以降に書き込むのですが、CALL IOTGETで受信する内容はHTTPレスポンスを16バイトずつ分割したものなので、どこからJSON(HTTPボディ)がスタートするのかを判別しなければいけません。今回は超手抜きサンプルなのでIOTGETした応答の中に"{"が含まれていたら書き込みをスタートするようにしています。</p><p>ソースコードは以下ですが、<a href="https://github.com/MobileFF/msx0_sample/tree/main/WebAPI_sample">GitHub</a>にもあげましたのでご参考に〜</p>
<!--https://cdnjs.com/libraries/highlight.js-->
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/styles/a11y-dark.min.css" rel="stylesheet"></link>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
<pre class="prettyprint"><code>1 'SAVE"POSTAL3.BAS"
1000 'initialize
1010 _KANJI
1020 CLEAR 1000,&HBFFF
1030 MAXFILES=5
1040 NL$=CHR$(13)+CHR$(10)
1100 'load JSON.BIN
1110 BLOAD "JSON.BIN",R
1120 DEFINT A-Z
1130 JS = &HC000 : 'JSON Document
1140 OF = 0 : 'OFFSET
2000 'user setting
2010 SV$="zipcloud.ibsnet.co.jp"
2020 PA$="msx/me/if/NET0/" : 'path
3000 'connect
3010 _IOTPUT(PA$+ "conf/addr",SV$)
3020 _IOTPUT(PA$+ "conf/port",80)
3030 _IOTPUT(PA$+ "connect",1)
3500 'check connect status
3510 FOR I=0 TO 100:NEXT
3520 _IOTGET(PA$+ "connect",S)
3530 IF S<>1 THEN PRINT "connect fail":GOTO 9000
4000 'input postal code
4010 INPUT "POSTAL CODE=";P$
5000 'create message
5010 SM$(0)="GET /api/search?zipcode="+P$+" HTTP/1.1"+NL$
5020 SM$(1)="Host: "+SV$+NL$
5030 SM$(2)="Content-Type: application/json"+NL$
5040 SM$(3)=""+NL$
6000 'send message
6010 'PRINT NL$+"---- Send Message ----"
6020 I=0
6030 IF SM$(I)="" THEN 7000
6040 'PRINT SM$(I);
6050 _IOTPUT(PA$+ "msg",SM$(I))
6060 I=I+1
6070 GOTO 6030
7000 'receive message -> store in memory
7010 _IOTGET(PA$+"msg",RM$):IF RM$="" THEN 7010
7020 'PRINT NL$+"---- Receive Message ----"
7030 ER=0:FL=0
7040 FOR J=0 TO 100
7050 IF RM$="" THEN 8000 :'ER=ER+1:GOTO 7200
7060 IF ER=2 THEN 8000
7070 IS=INSTR(RM$,"{")
7080 IF IS<>0 AND FL=0 THEN FL=1:RM$=MID$(RM$,IS)
7090 IF FL=0 THEN 7200
7100 FOR K=1 TO LEN(RM$)
7110 POKE JS+OF,ASC(MID$(RM$,K,1))
7120 OF=OF+1
7130 NEXT K
7200 _IOTGET(PA$+ "msg",RM$)
7210 FOR I=0 TO 100:NEXT I
7300 NEXT J
8000 'Parse JSON Initialize
8010 S=USR(JS)
8020 IF S=0 THEN PRINT "Not a Valid JSON.":GOTO 9000
8030 PRINT "---- Address ----"
8100 'address1
8110 TX$=USR2("&results#0&address1")
8120 GOSUB 60000
8130 PRINT SJ$;
8200 'address2
8210 TX$=USR2("&results#0&address2")
8220 GOSUB 60000
8230 PRINT SJ$;
8300 'address3
8310 TX$=USR2("&results#0&address3")
8320 GOSUB 60000
8330 PRINT SJ$;
9000 'disconnet
9010 _IOTPUT(PA$+ "connect",0)
9020 _IOTINIT()
9999 END
60000 'UTF8 to SJIS subroutine
60010 '(Original Code is Designed by IKATEN san.Modified by MobileFF)
60100 OPEN"utf8sjis.txt" AS #5 LEN=4
60110 FIELD #5,2 AS KJ$
60120 SJ$=""
60200 '----- MAIN LOOP
60210 FOR P=1 TO LEN(TX$)
60220 CK$=MID$(TX$,P,1):CK=ASC(CK$)
60300 '----- 1 byte charactor
60310 IF CK<128 224="" 2="" 60400="" 60410="" 60620="" and="" bytes="" charactor="" if="" sj="" then="">192 THEN 60510 ELSE P=P+1:GOTO 60620
60500 '----- 3 bytes charactor
60510 IF (CK AND 240)<>224 THEN 60610 ELSE P1=(CK AND 15)*16
60520 IF P=255 THEN 60700:P=0
60530 P=P+1:CK=ASC(MID$(TX$,P,1)):P2=(CK AND 60)/4:P3=(CK AND 3)*64
60540 IF P=255 THEN 60700:P=0
60550 P=P+1:CK=ASC(MID$(TX$,P,1)):P4=(CK AND 63)
60560 GET #5,(P1+P2)*256+P3+P4:SJ$=SJ$+KJ$:GOTO 60620
60600 '----- 4 bytes charactor
60610 IF (CK AND 248)=240 THEN P=P+3
60620 NEXT P
60700 '--------- END OF FILE
60710 CLOSE #5
60720 RETURN</128></code></pre>
<p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08HMQW367&linkId=0ef90fe1a473c9357aa1e0702189332b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08PTP6KKS&linkId=30753c5246cbe8c01f0d795b544f247f" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07MZSHDCQ&linkId=a2e696359015b7f1f36d8293d2eb9f18" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-53392822995666310272023-10-08T18:18:00.006+09:002023-10-08T18:58:50.236+09:00[MSX0][Arduino] YMF825BoardをMSX0で制御してドレミファソを鳴らす #MSX #MSX0 #Arduino #YMF825<div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGLplY4Zua7wGbA9YE4YTzQIa6o4CfuoAB1P9mXEbqbLALK87xAtfsgsuIzy1TRpPs8wqZdQ2ZSbNEkDHlYhzWejwh6L0B0zfSMi7UxQNAyrthDrmXQWMPdsOOJ_KJ8B7Xk5QN06wB9sUvx4sx8BeDiMrGdhfWt7TvybdcjV9qeb3p1gowBhYnyXDSbUbB/s3053/IMG_20231008_174511.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2536" data-original-width="3053" height="333" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGLplY4Zua7wGbA9YE4YTzQIa6o4CfuoAB1P9mXEbqbLALK87xAtfsgsuIzy1TRpPs8wqZdQ2ZSbNEkDHlYhzWejwh6L0B0zfSMi7UxQNAyrthDrmXQWMPdsOOJ_KJ8B7Xk5QN06wB9sUvx4sx8BeDiMrGdhfWt7TvybdcjV9qeb3p1gowBhYnyXDSbUbB/w400-h333/IMG_20231008_174511.jpg" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div></div><p>過去にポケコンを使ってYMF825Boardでドレミファソを鳴らすというのをやっておりましたが、今回はMSX0でやってみたいと思います。</p><p>ポケコンの場合は、IOピンを直接制御してSPIのなんちゃって送信を行いましたが、MSX0は現状SPI通信はIoT BASICではサポートされていないため、例によってArduinoに仲介させて、MSX0からI2Cで演奏データを書き出し、ArduinoがSPI通信に変換してYMF825Boardに送るという方式をとります。</p><p>演奏データやアルゴリズムについては、</p><p><a href="https://github.com/hasebems/YMF825_sample">https://github.com/hasebems/YMF825_sample</a><br /><br />にあるサンプルコードを参考にさせていただきました。</p><p><br /></p><h2 style="text-align: left;">仲介役Arduinoの実装</h2><p>おなじみMSX0で出来ない件を縁の下で支えるArduinoの実装です。</p><p>I2Cでマスタからデータを受信すると、バッファにため込み、予定のバイト数を受信したらSPIスレーブにデータを送信します。</p><p>YMF825では一回の命令を複数バイト一度に送るケースがあるため、1バイト受け取るごとにSPIに送信、とはしていません。</p><p>また、ここで注意したいのは、ArduinoのI2Cデータの受信バッファは32バイトであるということです。32バイト以上のデータを受け取りそのまま継続しようとするとスレーブデバイスとしてはハングアップのような状態になります。(エラー処理をちゃんと書けば回避できるかもしれないのですが試していないです)</p><p>そのため、I2Cマスター(MSX0)からは、いったん命令のバイト数を送信し、続けて命令をそのバイト数分送るようにしています。I2Cスレーブでも、まず最初の1バイトは命令のバイト数として受信し、次から命令のバイト数分をバッファ配列に溜めるようにしています。</p><p><br /></p>
<!--https://cdnjs.com/libraries/highlight.js-->
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/styles/a11y-dark.min.css" rel="stylesheet"></link>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
<pre class="prettyprint"><code>#include "Wire.h"
int i2c_slave_addr = 0x08;
#include <SPI.h>
unsigned char buf[256];
unsigned int data_length = 0;
unsigned int bufpos = 0;
boolean command = true;
void setup(){
Serial.begin(115200);
Serial.println("I2C to SPI(YMF825)");
for(int i=0;i<256;i++) {
buf[i] = 0xff;
}
delay(500);
Wire.begin(i2c_slave_addr);
Wire.onReceive(dataReceive);
Wire.onRequest(requestEvent);
SPI.begin();
digitalWrite(SS,HIGH);
// YMF825 Reset
pinMode(9,OUTPUT);
digitalWrite(9,LOW);
delay(100);
digitalWrite(9,HIGH);
delay(100);
}
void loop(){
}
// I2C data receive from master
void dataReceive(int number) {
if (Wire.available()) {
if (command) {
data_length = Wire.read();
command=false;
Serial.println("length:"+String(data_length));
Serial.print("(");
} else {
buf[bufpos] = Wire.read();
Serial.print(String(buf[bufpos])+" ");
bufpos++;
if (bufpos==data_length) {
sendToSPI(buf,data_length);
command=true;
bufpos=0;
Serial.println(")");
}
}
}
}
// Send data to SPI slave
int sendToSPI(unsigned char* val,int number) {
Serial.print(">"+String(number));
Serial.print("[");
for(int i=0;i<number;i++) {
Serial.print(String(val[i],HEX)+" ");
}
Serial.print("]");
digitalWrite(SS,LOW);
SPI.transfer(val,number);
digitalWrite(SS,HIGH);
Serial.println();
return 0;
}
// I2C data send to master
void requestEvent() {
}</code></pre>
<p><br /></p><h2 style="text-align: left;">MSX0の実装</h2><p>MSX0は通常のI2C通信で、あまり特別なことをしていません。</p><p>MSX0のIoT BASICでのI2C通信の基本的なことについては、別記事にまとめていますのでご覧ください。</p><p></p><div style="text-align: left;"><span data-offset-key="bm9kn-0-0" style="background-color: white; color: #0f1419; font-family: "Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif; white-space-collapse: preserve;"><span data-text="true">mobileFF's blog: MSX0でI2C通信を試してみた </span></span><span style="background-color: white; color: #1d9bf0; font-family: "Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif; white-space-collapse: preserve;"><span data-offset-key="bm9kn-1-0">#MSX</span></span><span data-offset-key="bm9kn-2-0" style="background-color: white; color: #0f1419; font-family: "Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif; white-space-collapse: preserve;"><span data-text="true"> </span></span><span style="background-color: white; color: #1d9bf0; font-family: "Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif; white-space-collapse: preserve;"><span data-offset-key="bm9kn-3-0">#MSX0</span></span><span data-offset-key="bm9kn-4-0" style="background-color: white; color: #0f1419; font-family: "Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif; white-space-collapse: preserve;"><span data-text="true"> </span></span><span style="background-color: white; font-family: "Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif; white-space-collapse: preserve;"><span data-offset-key="bm9kn-5-0"><span style="color: #1d9bf0;">#Arduino</span><span style="color: #0f1419; font-size: 20px;">
</span></span></span></div><span style="background-color: white; color: #1d9bf0; font-family: "Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif; white-space-collapse: preserve;"><span data-offset-key="bm9kn-7-0"><a href="https://mobileff.blogspot.com/2023/09/msx0i2c-msx-msx0-arduino.html">https://mobileff.blogspot.com/2023/09/msx0i2c-msx-msx0-arduino.html</a></span></span><p></p><p><br /></p><p>演奏データはDATA文で書かれています。これをREAD文で読み、_IOTPUT()でひたすら書き出すという感じなのですが、今回のプログラム(YMF825へのデータ送信)では</p><p></p><ul style="text-align: left;"><li>2バイトずつ送信するケース(行20000~)</li><li>36バイト送信するケース(行21000~)</li><li>2バイト送信で2バイト目だけDATA文を使わないで任意の値を指定するケース(行22000~)</li></ul><p></p><p>の3パターンがあるため、それぞれにサブルーチンを作ってそこに飛ばすようにしています。そのため少しプログラムが複雑に見えると思いますが、飛び先などの行番号にコメントを入れているので、参考になれば幸いです。</p>
<pre class="prettyprint"><code>1 'SAVE"YMF825-2.BAS"
1000 'Init
1010 D$="08"
1020 _IOTFIND("device/i2c_a",C)
1030 PRINT "IOTFIND:";C
1040 IF C=0 THEN 1200:'Not Found
1050 _IOTFIND("device/i2c_a",A$(0),C)
1060 PRINT "Slave Address : ";
1070 FOR I=0 TO C-1
1080 PRINT A$(I);" ";
1090 IF A$(I)=D$ THEN 1300:'Create Device Path
1100 NEXT I
1200 'Not Found
1210 PRINT "Device not found."
1220 END
1300 'Create Device Path
1310 N$="device/i2c_a/"+A$(I)
2000 'Main
2010 PRINT
2020 PRINT "---- YMF825 ----"
3000 'INIT
3010 PRINT "---- INIT ----"
3100 RESTORE 40000:'INITDB
3120 FOR I=1 TO 18
3130 GOSUB 20000:'WRITE
3140 NEXT I
4000 'TONE
4010 PRINT "---- TONE ----"
4100 RESTORE 41000:'TONEDB
4110 GOSUB 20000:'Write Word
4120 GOSUB 20000:'Write Word
4130 GOSUB 21000:'Write Multi Bytes
5000 'CHANNEL
5010 PRINT "---- CHANNEL ----"
5100 RESTORE 42000:'CHANNELDB
5110 FOR I=1 TO 5
5120 GOSUB 20000:'Write Word
5130 NEXT I
6000 'LOOP
6010 PRINT "---- LOOP ----"
6100 KA=&H14
6110 KD=&H65
6120 GOSUB 30000:'Loop SubRoutine
6200 KA=&H1C
6210 KD=&H11
6220 GOSUB 30000:'Loop SubRoutine
6300 KA=&H1C
6310 KD=&H42
6320 GOSUB 30000:'Loop SubRoutine
6400 KA=&H1C
6410 KD=&H5D
6420 GOSUB 30000:'Loop SubRoutine
6500 KA=&H24
6510 KD=&H17
6520 GOSUB 30000:'Loop SubRoutine
6600 PRINT "----- LOOP END ----"
6610 GOTO 6000:'LOOP
20000 'Write Word
20100 _IOTPUT(N$,CHR$(2))
20110 READ V1$
20120 _IOTPUT(N$,CHR$(VAL("&H"+V1$)))
20130 READ V2$
20140 _IOTPUT(N$,CHR$(VAL("&H"+V2$)))
20150 PRINT "["+V1$+V2$+"]"
20200 RETURN
21000 'Write Multi Bytes
21100 READ CN
21110 _IOTPUT(N$,CHR$(CN))
21120 PRINT "[";
21230 FOR IM=1 TO CN
21240 READ V$
21250 PRINT V$;
21260 _IOTPUT(N$,CHR$(VAL("&H"+V$)))
21270 NEXT IM
21280 PRINT "]"
21300 RETURN
22000 'Write Custom Word
22100 _IOTPUT(N$,CHR$(2))
22110 _IOTPUT(N$,CHR$(VAL("&H"+V$ )))
22120 _IOTPUT(N$,CHR$(VAL("&H"+V2$)))
22200 RETURN
30000 'Loop SubRoutine
30100 GOSUB 31000:'KEYON
30110 FOR I=0 TO 320:NEXT I:'WAIT
30120 GOSUB 32000:'KEYOFF
30130 FOR I=0 TO 130:NEXT I:'WAIT
30140 RETURN
31000 'KEYON
31010 PRINT "---- KEYON ----"
31100 RESTORE 50000:'KEYONDB
31110 GOSUB 20000:'Write Word
31120 GOSUB 20000:'Write Word
31130 READ V$
31140 V2$=HEX$(KA)
31150 GOSUB 22000:'Write Custom Word
31160 READ V$
31170 V2$=HEX$(KD)
31180 GOSUB 22000:'Write Custom Word
31190 GOSUB 20000:'Write Word
31200 RETURN
32000 'KEYOFF
32010 PRINT "---- KEYOFF ----"
32100 RESTORE 51000:'KEYOFFDB
32110 GOSUB 20000:'Write Word
32120 RETURN
40000 'INITDB
40010 DATA 1D,00,02,0E
40020 DATA 00,01,01,00,1A,A3
40030 DATA 1A,00
40040 DATA 02,04
40050 DATA 02,00,19,F0,1B,3F,14,00,03,01,08,F6
40060 DATA 08,00,09,F8,0A,00,17,40,18,00
41000 'TONEDB
41010 DATA 08,F6
41020 DATA 08,00
41030 DATA 36,07,81,01,85,00,7F,F4,BB,00,10,40,00,AF,A0,0E,03,10,40,00,2F,F3,9B,00,20,41,00,AF,A0,0E,01,10,40,80,03,81,80
42000 'CHANNELDB
42010 DATA 0F,30
42020 DATA 10,71
42030 DATA 11,00
42040 DATA 12,08
42050 DATA 13,00
50000 'KEYDB
50010 DATA 0B,00
50020 DATA 0C,54
50030 DATA 0D
50040 DATA 0E
50050 DATA 0F,40
51000 'KEYOFFDB
51010 DATA 0F,00
</code></pre>
<p><br /></p><h2 style="text-align: left;">MSX0とArduino、YMF825Boardの接続</h2><p>今回は、Arduino(3.3V)とYMF825Board(5V)の電源をMSX0から共有してみようと思います。</p><p>とりあえず、仲介役のArduino Mini Proとは別に、Arduino UNOを用意します。</p><p>MSX0のPORT Aの[5V]と[GND]をArduino UNOの[VIN]と[GND]に繋ぎます。</p><p><u><b>MSX0(PORTA) ←→ Arduino UNO</b><br /></u>[5V] ←→ [VIN]<br />[GND] ←→ [GND](どれでもOK)</p><p>すると、Arduino UNOの電源が入りますので、そこから[5V]をYMF825Boardに、[3.3V]をArduino Mini Proに繋ぎます。</p><p><b><u>Arduino UNO ←→ YMF825 Board</u><br /></b>[5V] ←→ [5V]<br />[GND](どれでもOK) ←→ [GND]</p><p><b><u>Arduino UNO ←→ Arduino Pro Mini</u></b><br />[3.3V] ←→ [VCC]<br />[GND](どれでもOK) ←→ [GND](どれでもOK)</p><p><br /></p><p>次にMSX0とArduino Pro Mini、Arduino Pro MiniとYMF825Boardを接続します。</p><p><b><u>MSX0(PORTA) ←→ Arduino Pro Mini</u></b><br />[SDA] ←→ [A4]<br />[SCK] ←→ [A5]<br /><br /></p><p><b><u>Arduino Pro Mini ←→ YMF825Board</u></b><br />[D10] ←→ [SS]<br />[D11] ←→ [MOSI]<br />[D12] ←→ [MISO]<br />[D13] ←→ [SCK]<br />[D9] ←→ [RST_N]</p><p><br />中の人はYMF825の仕様のことが全然わからないので、オリジナルの音色やメロディとかが作れず、参考にしたサンプルコードの通りに、ドレミファソと鳴らすだけになっておりますが、ひとまず動きました、という感じです。</p><p>現場からは以上です。</p><p><br /></p>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07MZSHDCQ&linkId=a2e696359015b7f1f36d8293d2eb9f18" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-20132345214804693222023-10-03T23:56:00.000+09:002023-10-03T23:56:56.176+09:00[MSX0][Arduino] シリアル通信で受け取った内容をI2Cで読み出す #msx #msx0 #arduino #カシオ #ポケコン<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEcJA1XT-VdRzXl6GowJg6E5F8LyIjItLia6rJEkAas5x7TxUVCWzcyT-0oFKIFqrlPpntiAEfOiDGlsldAuzG7FnFKgRpV0I_sSeX0zlt0F8L7DNGROIhEyvQzuk8zsrlkfhy9x7GRgZU5_Zu9yJpUGPV_D5v4RS-2MsoNx9SvydGdHMIgYVyJcmorJCc/s3701/IMG_20230930_020102.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2546" data-original-width="3701" height="275" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEcJA1XT-VdRzXl6GowJg6E5F8LyIjItLia6rJEkAas5x7TxUVCWzcyT-0oFKIFqrlPpntiAEfOiDGlsldAuzG7FnFKgRpV0I_sSeX0zlt0F8L7DNGROIhEyvQzuk8zsrlkfhy9x7GRgZU5_Zu9yJpUGPV_D5v4RS-2MsoNx9SvydGdHMIgYVyJcmorJCc/w400-h275/IMG_20230930_020102.jpg" width="400" /></a></div><br /><p>このところ、MSX0でいろいろ遊んでいる中の人ですが、中の人といえばいわゆる「ポケコンバカ」でもあり、MSX0とのIoTの輪にポケコンを加える余地はないものかと常々考えておりました。</p><p>しかしながら、中の人がターゲットにしているポケコン(PB-1000)で可能な外部通信手段といえば、RS−232Cのシリアル通信、あとは中の人が超適当な実装でアウトプットだけ実現したなんちゃってSPI通信くらいしかありません。</p><p>一方、MSX0は今のところIoT BASICでは I2C、HTTP(ソケット通信)、PWMによるアナログ入出力しか情報を外部デバイスから入出力する手段を持っていないため、何かしらで相互の通信手段を変換、吸収する手段がなければやりとりはできません。</p><p><br /></p><h2 style="text-align: left;">Arduinoでシリアル通信の受信とI2Cスレーブを行う</h2><p></p><p>そこで、WebAPI通信のときと同じく、Arduinoに両者の仲介をしてもらいます。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3itRxuElQtaOokJjzbU5e48NuV2MxSmLx5f2QamHvb5e9YubrAZB5pLuB8xAv4ox4aqaXT-ft5F2BF6I1A_YvQb_rCVaKySyTYhyphenhypheny0_JTvxnuJOHc7kPr_aORCaw38n1fthHp4N-eNJi3eSDzg_2k0ae8uJ_z5aA1MbKwIOowuuvkp4TaclOuP4BBRBi5/s1552/%E5%90%8D%E7%A7%B0%E6%9C%AA%E8%A8%AD%E5%AE%9A%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%20(5)-3.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1068" data-original-width="1552" height="440" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3itRxuElQtaOokJjzbU5e48NuV2MxSmLx5f2QamHvb5e9YubrAZB5pLuB8xAv4ox4aqaXT-ft5F2BF6I1A_YvQb_rCVaKySyTYhyphenhypheny0_JTvxnuJOHc7kPr_aORCaw38n1fthHp4N-eNJi3eSDzg_2k0ae8uJ_z5aA1MbKwIOowuuvkp4TaclOuP4BBRBi5/w640-h440/%E5%90%8D%E7%A7%B0%E6%9C%AA%E8%A8%AD%E5%AE%9A%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%20(5)-3.jpg" width="640" /></a></div><br /><p>ちなみにArduino Mini Proと接続しているST7735(1.8inch TFT Display)は本件の目的とは直接関係ないのですが、直近でいろいろ試していた流れで、そのまま使ってしまっています。なくても全く支障はありません。</p><p>Arduinoは「UARTでシリアル通信を受信」「I2C SlaveとしてMasterからの要求に応じてデータ送信」の2つの役目を持っています。</p><p>まずいったんはシリアル通信の受信を待ち受けて受信し、受信が完了したあとにI2C Masterからの要求があったら、16バイトずつまとめて受信内容を返信しています。</p>
<!--https://cdnjs.com/libraries/highlight.js-->
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/styles/a11y-dark.min.css" rel="stylesheet"></link>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
<pre class="prettyprint"><code>#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3); // RX,TXの割り当て
char buf[512];
int receive_buf_pos = 0;
int send_buf_pos = 0;
int max_pos = 0;
volatile boolean received = false;
#include "Wire.h"
int i2c_slave_addr = 0x08;
void setup(){
Serial.begin(115200);
mySerial.begin(9600); // ソフトウェアシリアル通信の開始(ボーレート9600bps)
pinMode(2,INPUT);
pinMode(3,OUTPUT);
for(int i=0;i<sizeof(buf);i++) {
buf[i] = 0xff;
}
delay(500);
Wire.begin(i2c_slave_addr);
Wire.onReceive(dataReceive);
Wire.onRequest(requestEvent);
}
void eof() {
max_pos = receive_buf_pos-1;
Serial.println("receive_buf_pos = "+String(receive_buf_pos));
Serial.println("max_pos = "+String(max_pos));
send_buf_pos = 0;
receive_buf_pos = 0;
received = true;
Serial.println("\n----EOF----");
}
void loop(){
boolean started=false;
while(mySerial.available()>0){
started=true;
if (receive_buf_pos == 0 && received == false) {
Serial.println("---- receive start ----");
}
int val = mySerial.read(); // 受信したデータを読み込む
if (val == 0x1A) {
eof();
break;
} else {
Serial.write(val);
Serial.println("["+String(mySerial.available())+"]");
buf[receive_buf_pos] = val;
receive_buf_pos++;
if (receive_buf_pos == sizeof(buf)) {
Serial.println("\n---- buffer full ----");
eof();
break;
}
}
}
int timeout = 0;
while(started && mySerial.available()<=0 && received==false && send_buf_pos == 0) {
if (timeout>15) {
Serial.println("Timeout.");
eof();
started = false;
break;
}
Serial.println("(delay 100ms["+String(timeout)+"])");
delay(100);
timeout++;
}
delay(100);
}
void dataReceive(int number) {
}
void requestEvent() {
if (received && send_buf_pos <= max_pos) {
for(int i=0;i<16;i++) {
if (send_buf_pos>max_pos) {
Wire.write(0);
} else {
Wire.write(buf[send_buf_pos]);
Serial.write(buf[send_buf_pos]);
send_buf_pos++;
}
}
}
if (send_buf_pos >= max_pos) {
received = false;
send_buf_pos = 0;
}
}</code></pre>
<div><br /></div><h2 style="text-align: left;">MSX0側の実装</h2>
<div>MSX0側の実装は比較的単純で、簡単に言えば_IOTGET()で応答があるまでひたすら待ち、応答があったらPRINT文で画面に表示。これだけ、というかんじです。</div><div><br /></div>
<pre class="prettyprint"><code>1 'SAVE"I2CARECV.BAS"
1000 'Init
1010 _IOTFIND("device/i2c_a",C)
1020 PRINT "IoT Nodes:";C
1030 IF C=0 THEN PRINT "Device not found.":END
1040 _IOTFIND("device/i2c_a",A$(0),C)
1100 N$="device/i2c_a/"+A$(0)
1110 PRINT "Node item: "+N$
2000 'Main loop
2010 PRINT "---- I2C receive ----"
2500 _IOTGET(N$,S$)
2510 IF S$="" THEN PRINT ".";:GOTO 2500
2520 IF ASC(S$)=0 THEN 2500
2530 PRINT S$;
2990 GOTO 2500</code></pre><div><br /></div><h2 style="text-align: left;">PB-1000(ポケコン)側の実装</h2><div>ポケコン側の実装もごく簡単で、送り出したい文字列内容を PRINT #文でシリアルポートに書き出すだけです。</div><div><br /></div>
<pre class="prettyprint"><code>1000 OPEN "COM0:7,N,8,1,N,N,N,B,N" FOR OUTPUT AS #1
2000 FOR I=0 TO 19
2010 PRINT I;":CASIO PB-1000!"
2020 PRINT #1,STR$(I);":CASIO PB-1000!"
2030 NEXT I
3000 PRINT #1,CHR$(&H1A)
3010 CLOSE #1
</code></pre><br />これで、PB-1000側からシリアルで送り出した文字列が、I2C通信でMSX0に送られるようになります。
<div><br /></div><div>現場からは以上です。</div><div><br /></div><div><br /></div><div><br /></div>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07MZSHDCQ&linkId=a2e696359015b7f1f36d8293d2eb9f18" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-33863445238931849492023-10-03T00:04:00.001+09:002023-10-03T00:04:27.818+09:00[MSX0][PB-1000][ESP8266] カシオのポケコンPB-1000からMSX0を操作する #msx #msx0 #arduino #ESP8266 #カシオ #ポケコン<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMvamyAVtKhZVxDpMseHHsTivcEhlWPjKKKmmSnLq1F39AIt8rJoHR7sVWnGX56drkys0mwhSCDFQ2xRGoi-JlLxAx6oDrUTM2x9w43IznAtvwTmSy7b1GQaSiEDRrygqIAwaZj4pMny2584ZNqwT9e3LssOS3go2NMIvvlvfGrMnTG27YbuPyDyVFswSj/s3311/IMG_20231002_000016.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2637" data-original-width="3311" height="510" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMvamyAVtKhZVxDpMseHHsTivcEhlWPjKKKmmSnLq1F39AIt8rJoHR7sVWnGX56drkys0mwhSCDFQ2xRGoi-JlLxAx6oDrUTM2x9w43IznAtvwTmSy7b1GQaSiEDRrygqIAwaZj4pMny2584ZNqwT9e3LssOS3go2NMIvvlvfGrMnTG27YbuPyDyVFswSj/w640-h510/IMG_20231002_000016.jpg" width="640" /></a></div><br /><p></p><p>前回のエントリにあるとおり、PB-1000からシリアル通信で送った文字列がMSX0で受信できるようになり、PB-1000とMSX0の通信にも一定の目処が立ってきました。</p><p>ここで、ちょっとネタに走ろうと思い、こんなソリューションを作ってみました。</p><p><br /></p><h2 style="text-align: left;">PB-1000をMSX0にシリアルコンソール接続して、PB-1000からMSX0を自在に制御する!</h2><p>写真にもある通り、PB-1000から入力したコマンドが、そのままMSX0上で実行されていることがわかります。</p><p>これだけ見ると、PB-1000とMSX0でどんな実装をしているのか?と思われそうですが、実はPB-1000もMSX0もほとんど何もしていません(自作のプログラムを動かす、という意味では)。</p><p>実現手段は以下のとおりです。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6ovUURlcTC-4lO9JqZtaMgjDRRy3NvHjmK5W5W9c5YgAd9uzbu-GS9SEYJKMVESxBOOurKr7cYK6f3dkOIEHeFFdipZARFM4u1LhEQkMT7GstIBClALkIuYXSX8PijtJ6F7qXByY9xLvjxSKKBFkERbe3lgO9Aa42J-q7kI68wZSwkl95NvJ00M6t-2mO/s1668/IMG_1559.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1065" data-original-width="1668" height="408" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6ovUURlcTC-4lO9JqZtaMgjDRRy3NvHjmK5W5W9c5YgAd9uzbu-GS9SEYJKMVESxBOOurKr7cYK6f3dkOIEHeFFdipZARFM4u1LhEQkMT7GstIBClALkIuYXSX8PijtJ6F7qXByY9xLvjxSKKBFkERbe3lgO9Aa42J-q7kI68wZSwkl95NvJ00M6t-2mO/w640-h408/IMG_1559.jpg" width="640" /></a></div><br /><p>またしても、PB-1000とMSX0の間を仲介するArduino(ESP8266)が頑張ってくれているのです。</p><p>MSX0で頑張ってIoTプログラムを書くぞと息巻いていたつもりが、いつの間にかArduinoのコードをたくさん書いているような気がしてきましたが、まあ、そういうときもあるということでww</p><p><br /></p><h2 style="text-align: left;">MSX0が内蔵するリモートコンソールサーバ</h2><p>MSX0はほとんど何もしていませんと書きましたが、それはあくまでも自作のプログラムを動かすという意味では、ということであって、実際はそうではありません。</p><p>MSX0は、内部にデフォルトでリモートコンソール用のサーバが動作しており、IPアドレスとポート番号を指定し、外部からソケット通信で文字列を送り付けますと、受け付けた内容をMSX0への入力として反映してもらえます。</p><p><br /></p><h2 style="text-align: left;">Arduino(ESP8266)の実装</h2><p>つまり、Arduino(ESP8266)では、</p><p></p><ul style="text-align: left;"><li>UARTでのデータ送信を待ち受けて受け付ける</li><li>受信が完了したら、MSX0にソケット通信で受信した文字列を送り込む</li><li>新たにUARTから通信があれば再度情報を取得し、再びMSX0に文字列を送り込む</li></ul><div>というような処理をひたすら頑張ってしています。</div><div><br /></div><div>こう書いてしまうと割合単純な処理のようにも見えますが、前回、Arduino Mini Proで行ったソフトウェアシリアル通信と、ESP8266で行うソフトウェアシリアル通信はライブラリが少し異なっていて、なかなかUARTの受信がうまく行かずハマってしまいました。</div><div><br /></div><p></p>
<!--https://cdnjs.com/libraries/highlight.js-->
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/styles/a11y-dark.min.css" rel="stylesheet"></link>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
<pre class="prettyprint"><code>#include <SoftwareSerial.h>
char buf[512];
int receive_buf_pos = 0;
int send_buf_pos = 0;
int max_pos = 0;
volatile boolean received = false;
#include <arduino.h>
#include <esp8266wifi.h>
#include <esp8266wifimulti.h>
#include "secrets.h"
#define HOSTNAME "webserver"
ESP8266WiFiMulti WiFiMulti;
WiFiClient client;
#ifndef D5
#if defined(ESP8266)
#define D8 (15)
#define D5 (14)
#define D7 (13)
#define D6 (12)
#define RX (3)
#define TX (1)
#elif defined(ESP32)
#define D8 (5)
#define D5 (18)
#define D7 (23)
#define D6 (19)
#define RX (3)
#define TX (1)
#endif
#endif
#ifdef ESP32
#define BAUD_RATE 9600
#else
#define BAUD_RATE 9600
#endif
EspSoftwareSerial::UART mySerial;
void setup(){
delay(3000);
Serial.begin(9600);
Serial.println("UART receive and SEND to MSX0 RemoteConsole");
mySerial.begin(9600,EspSoftwareSerial::SWSERIAL_8N1,D7,D8,false);
if(!mySerial) {
Serial.println("Invalid EspSoftwareSerial pin configuration, check config");
while(1) {
delay(1000);
}
}
Serial.println("EspSoftwareSerial pin configuration is valid.");
for(int i=0;i<sizeof(buf);i++) {
buf[i] = 0xff;
}
if (strlen(ssid) == 0) {
WiFi.begin();
} else {
WiFi.begin(ssid, passPhrase);
}
WiFi.setHostname(HOSTNAME);
Serial.printf("Connect to WiFi...\n");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.printf(".");
}
Serial.printf("connected.\n");
client.connect(IPAddress(192,168,1,227),2223);
}
void eof() {
max_pos = receive_buf_pos-1;
Serial.println("receive_buf_pos = "+String(receive_buf_pos));
Serial.println("max_pos = "+String(max_pos));
send_buf_pos = 0;
while(mySerial.available()>0){
int val = mySerial.read();
buf[receive_buf_pos] = val;
receive_buf_pos++;
}
for(int i=0;i<receive_buf_pos-1;i++) {
Serial.print("["+String(buf[i],HEX)+"]");
}
Serial.println();
receive_buf_pos = 0;
received = true;
Serial.println("\n----EOF----");
}
void loop(){
while(mySerial.available()>0){
if (receive_buf_pos == 0 && received == false) {
Serial.println("---- receive start ----");
Serial.println("serial buffer is "+String(mySerial.available())+" bytes.");
}
int val = mySerial.read();
if (val == 0x1A) {
eof();
break;
} else {
Serial.write(val);
buf[receive_buf_pos] = val;
receive_buf_pos++;
if (receive_buf_pos == sizeof(buf)) {
Serial.println("\n---- buffer full ----");
eof();
break;
}
}
}
if (received) {
Serial.println("---- Socket Send Start ----");
WiFi.mode(WIFI_STA);
if ((WiFiMulti.run() == WL_CONNECTED)) {
for(int i=0;i<max_pos;i++) {
client.write(buf[i]);
Serial.write(buf[i]);
}
Serial.println("["+String(max_pos-1)+"]");
Serial.println("---- Socket Send Complete ----");
received = false;
delay(1000);
} else {
Serial.println("WiFiMulti is not connected...");
}
}
delay(100);
}</code></pre><div><br /></div><h2 style="text-align: left;">
PB-1000側の実装</h2><div>PB-1000側の実装は前回のエントリとほとんど同じようなもので、INPUT文で受け付けた入力を、PRINT#文でCOM0(RS-232C)に出力しているのみの、至極単純なコードです。</div><div><br /></div>
<pre class="prettyprint"><code>1000 OPEN "COM0:7,N,8,1,N,N,N,B,N" FOR OUTPUT AS #1
2000 PRINT "MSX0>";
2010 INPUT C$
2015 IF C$="" THEN 2000
2020 PRINT #1,C$
3000 PRINT #1,CHR$(&H1A)
3010 GOTO 2000</code></pre>
<div><br /></div><div>また、PB-1000とMSXで共通に実行できるレベルの互換性のあるプログラムであれば、この仕組みを使ってPB-1000上で作ったBASICプログラムをリモートコンソール経由でMSX0に直接入力させ、実行させてしまうことも可能になります。</div><div><br /></div><div>というのも、PB-1000は標準で内蔵しているメニューから、BASICプログラムを選択し、[save]→[RS232C]と選択すると、そのBASICプログラムを中間コードではなくテキストデータとしてシリアル出力してもらえます。</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkHjn-lkUTElFA0-YltfDKWSPHLaSaS2SKAlh9tomVZ3OiCl1__irVMvRFCkV-g_bk0lTxVNOK9Tvi3Sz6cg-d46nVi-hwpWUq29mbdnArlsIzzkjaO2VF9fGgZeg6jAK-Fk6khoOZ8wnHVt_MAmZyPIdBn_ta7vsyKKq92EmQEz6uEoxnZkwex5GT5BQm/s2609/IMG_20231002_235039.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1012" data-original-width="2609" height="155" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkHjn-lkUTElFA0-YltfDKWSPHLaSaS2SKAlh9tomVZ3OiCl1__irVMvRFCkV-g_bk0lTxVNOK9Tvi3Sz6cg-d46nVi-hwpWUq29mbdnArlsIzzkjaO2VF9fGgZeg6jAK-Fk6khoOZ8wnHVt_MAmZyPIdBn_ta7vsyKKq92EmQEz6uEoxnZkwex5GT5BQm/w400-h155/IMG_20231002_235039.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">[save]をタッチ<br /></td></tr></tbody></table><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzH1kqTSnV4zymvUvlE1a-ooa0IqvNyM4QNu-mNVrIYkeRpEG6NEt-hiw2PbFnTtGVe1fHD0WZyOLcu-5vR-IXZDfLgkAzx857HLFScZPZzhHssNcvIW2Vn18rta0TbWm4T3_HPnFTywpL1b5N1FPuj51agiPxD8EzFOs77mQ5fA-tR2jVYCG5Qp0iy3wd/s2606/IMG_20231002_235111.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="997" data-original-width="2606" height="153" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzH1kqTSnV4zymvUvlE1a-ooa0IqvNyM4QNu-mNVrIYkeRpEG6NEt-hiw2PbFnTtGVe1fHD0WZyOLcu-5vR-IXZDfLgkAzx857HLFScZPZzhHssNcvIW2Vn18rta0TbWm4T3_HPnFTywpL1b5N1FPuj51agiPxD8EzFOs77mQ5fA-tR2jVYCG5Qp0iy3wd/w400-h153/IMG_20231002_235111.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">[RS232C]をタッチ</td></tr></tbody></table><br /><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR9tyWd4DIKUDW6F2knKMajKV4CnAFGbUH52nTvQ3jleS5OgOXzkutHw7jGhADa4vw525JUQOS-m9hzbIjqAwjD2QfDd9vh-9zgGFl9RQNEEFMdoRbLsrXWzuWSGmkd2hgH7FNPs1wWeFDAkViUIaK1w8VZevWBwLzwPcZTrC2QK93F_qPElEzuUC76H8N/s2704/IMG_20231002_235126.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1105" data-original-width="2704" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR9tyWd4DIKUDW6F2knKMajKV4CnAFGbUH52nTvQ3jleS5OgOXzkutHw7jGhADa4vw525JUQOS-m9hzbIjqAwjD2QfDd9vh-9zgGFl9RQNEEFMdoRbLsrXWzuWSGmkd2hgH7FNPs1wWeFDAkViUIaK1w8VZevWBwLzwPcZTrC2QK93F_qPElEzuUC76H8N/w400-h164/IMG_20231002_235126.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ボーレート等を設定し[Enter]押下で送信</td></tr></tbody></table><div><br /></div><div>ただし、PB-1000はこの[save]→[RS232C]の一連の操作によるテキストデータ送信においては、終了時にEOF(0x1A)を送信しない仕様になっているらしく、これについては別途でEOFだけ送出するプログラムを作っておき、送信後にそのプログラムを実行して解決します。</div>
<pre class="prettyprint"><code>1000 OPEN "COM0:7,N,8,1,N,N,N,B,N" FOR OUTPUT AS #1
1010 PRINT #1,CHR$(&H1A)
1020 CLOSE #1</code></pre>
<div><br /></div><div>※ EOFなしでシリアル通信が途絶したときの対応方法については、別エントリにてまとめる予定です。</div><div><br /></div><h2 style="text-align: left;">ネタ・・・なんですけどねw</h2><div>まあ、それだけといえばそれだけなのですが、</div><div><ul style="text-align: left;"><li>MSX0</li><li>PB-1000(+FA-7/MD-100)</li><li>ESP8266</li></ul></div><div>のそれぞれの実機を持っていらっしゃる方には、ぜひ試してみてもらいたいです。</div><div><br /></div><div>なんだかんだいって、昭和のポケコンPB-1000から、令和に蘇ったMSX0に対して、直接の有線接続をせずに、自由に命令をくだせてしまうのは、なんとも言えず楽しい気分が味わえます。</div><div><br /></div><div>中の人がこんなテンションの投稿をしてしまうのも頷けるのではないでしょうかw</div><div><br /></div>
<iframe allowfullscreen="allowfullscreen" class="mastodon-embed" src="https://fedibird.com/@mobileff/111160441429525012/embed" style="border: 0; max-width: 100%;" width="400"></iframe><script async="async" src="https://fedibird.com/embed.js"></script>
<div><br /></div><div><br /></div><div>試すにあたって残る問題があるとすれば、上記の3パターンの組み合わせで機器を保有している人がどのくらいの人数いるかということなんですが・・・w</div><div><br /></div><div>ちなみにここまでの内容を読んでいただくと分かる通り、クライアント(MSX0に命令を下す側)のマシンはPB-1000でなくても、UART通信ができるポケコン、パソコン等ならなんでも利用することが可能です。ぜひ、ご自身のお気に入りの機種をクライアントにしてみてくださいw</div><div><br /></div><div>現場からは以上です。</div><div><br /></div><div><br /></div>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07MZSHDCQ&linkId=a2e696359015b7f1f36d8293d2eb9f18" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-278857424522797352023-09-25T20:48:00.004+09:002023-09-25T23:36:52.038+09:00MSX0でWebAPIへのHTTP通信を試してみた #MSX #MSX0 #Arduino<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifCm8esu9aykuZVwKvKmt8C-lBKhexjvIEF-mgV1lp1ZpIS29pLoQY8sqFjXkuuqTwZfASmPgPSqTn00m2AnSOt9TX04te7yr4YAXplXVCMQpShQZ8W9JfnJh1-7HyXh4wlQ9Z8JKHqWbqOFksn6n0nxGbsisJIxubXeOWsHsoqMDrB_xdWQMdAsu7drWR/s3048/IMG_1558.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1313" data-original-width="3048" height="277" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifCm8esu9aykuZVwKvKmt8C-lBKhexjvIEF-mgV1lp1ZpIS29pLoQY8sqFjXkuuqTwZfASmPgPSqTn00m2AnSOt9TX04te7yr4YAXplXVCMQpShQZ8W9JfnJh1-7HyXh4wlQ9Z8JKHqWbqOFksn6n0nxGbsisJIxubXeOWsHsoqMDrB_xdWQMdAsu7drWR/w640-h277/IMG_1558.jpg" width="640" /></a></div><br /><p>前回の投稿ではMSX0でI2C通信を試してみましたが、</p><div style="text-align: left;"><b><span data-offset-key="9ikmo-0-0" face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #0f1419; white-space-collapse: preserve;"><span data-text="true">mobileFF's blog: MSX0でI2C通信を試してみた </span></span><span face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #1d9bf0; white-space-collapse: preserve;"><span data-offset-key="9ikmo-1-0">#MSX</span></span><span data-offset-key="9ikmo-2-0" face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #0f1419; white-space-collapse: preserve;"><span data-text="true"> </span></span><span face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #1d9bf0; white-space-collapse: preserve;"><span data-offset-key="9ikmo-3-0">#MSX0</span></span><span data-offset-key="9ikmo-4-0" face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #0f1419; white-space-collapse: preserve;"><span data-text="true"> </span></span><span face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #1d9bf0; white-space-collapse: preserve;"><span data-offset-key="9ikmo-5-0">#Arduino</span></span></b></div><div style="text-align: left;"><span face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #1d9bf0; white-space-collapse: preserve;"><span data-offset-key="9ikmo-7-0"><a href="https://mobileff.blogspot.com/2023/09/msx0i2c-msx-msx0-arduino.html">https://mobileff.blogspot.com/2023/09/msx0i2c-msx-msx0-arduino.html</a></span></span><span data-offset-key="9ikmo-8-0" face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #0f1419; white-space-collapse: preserve;"><span data-text="true"> </span></span></div><p><br />添付されているサンプルコードにはインターネット上のサーバに対するHTTP通信を行うものもあります。</p><p>HTTP通信ができると、遊べることの幅がかなり広がるし通信も無線になるので柔軟性も増すように思えたので、こちらも試してみました。</p><p>MSX0側は、添付のサンプルコードを書き換えながら作りました。サンプルコード、チュートリアル大事。</p><p>構成図?概念図?はこんな感じです。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQjs7FheUPBEnnA7BcQyw-mq1W7Pcppdnn4AOra_O3xi_LS1sz9RSb5ZX-va-r7-E14jnrZ9wjbGyvLvOnhmREJKbONyI_9QVXcQNoJ9x8lUph8apOOwpXycgAttuZ1UvvKR7-MWCHouTcGRuU-2aovB_21eYSv1_KoGnYqu0ZdKQ0uYLrOfv3x43uFQtU/s1666/IMG_1557.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1041" data-original-width="1666" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQjs7FheUPBEnnA7BcQyw-mq1W7Pcppdnn4AOra_O3xi_LS1sz9RSb5ZX-va-r7-E14jnrZ9wjbGyvLvOnhmREJKbONyI_9QVXcQNoJ9x8lUph8apOOwpXycgAttuZ1UvvKR7-MWCHouTcGRuU-2aovB_21eYSv1_KoGnYqu0ZdKQ0uYLrOfv3x43uFQtU/w640-h400/IMG_1557.jpg" width="640" /></a></div><p><br /></p><h2 style="text-align: left;">時空を超えたMSX0のちょっと面倒な問題</h2><p>サンプルとしてぱっと思いついたのが、郵便番号から住所を取得するようなWeb APIへのアクセスだったのですが、ここに一つ、時空を超えてしまったMSXならではの問題が。</p><p>今どき、Web系のあらゆるサービスの文字エンコーディングは「UTF-8(Unicode)」というのを使っているわけですが、MSXのアーキテクチャが作られた当時はまだUnicodeなんて影も形もありませんでした。いやもしかすると理論的にはあったのかもしれませんが、当時の日本のパソコンで実装しているものなど皆無で、みなすべからく「シフトJISコード」で全角文字を表現していました。</p><p>そのため、どこかしらでUTF-8コードをシフトJISコードに変換してもらわねばならない、という問題があります。</p><p>また、もう一つは、MSX0単体でも解決できないわけではありませんが、WebAPIから返却されてくるレスポンスの内容は「JSON」という形式で書かれているものがほとんどで、ここから目的のデータを取り出すのが、若干面倒という問題があります。</p><p><br /></p><h2 style="text-align: left;">Arduino(ESP8266)でカスタムなWebサーバを作る</h2><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-NeRS8sE2pRVcv28JPkeaC69HXeelNlP2y4f6uNpMKhJ9vdblSpA0OLK2AlrFftFjyG7fcuzgaGUVsWGP-DapmnCTw_XNw_gYPwZ_BDRc-a4IHRSRI2D7HfUCpp8K2gX6MqzvKElPN8mRO9gEaMPwvNAmDJCUKWx8u7d5sfBZmdwSnY-89zfIPgGLWeg8/s1496/WeMosD1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1080" data-original-width="1496" height="289" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-NeRS8sE2pRVcv28JPkeaC69HXeelNlP2y4f6uNpMKhJ9vdblSpA0OLK2AlrFftFjyG7fcuzgaGUVsWGP-DapmnCTw_XNw_gYPwZ_BDRc-a4IHRSRI2D7HfUCpp8K2gX6MqzvKElPN8mRO9gEaMPwvNAmDJCUKWx8u7d5sfBZmdwSnY-89zfIPgGLWeg8/w400-h289/WeMosD1.png" width="400" /></a></div><br /><p>ということで、上記2つを別の誰かにやらせようと思ったとき、手元にWiFi内蔵のArduino(ESP8266)があることを思い出しました。オークションでクーポン使って安く買えるので、特に何の気もなしに買っておいたものでした。</p><p>全くもって、今回のような使い方を予見していたわけではありませんw</p><p>このArduinoに</p><p></p><ul style="text-align: left;"><li>MSX0の代理でWebAPIサーバにリクエストを出してもらう</li><li>サーバからのレスポンス(JSON)から抜粋して応答として必要な最低限の内容に整理</li><li>レスポンスの内容がUTF-8になっているのをシフトJISの文字列に変換してMSX0側に返却</li></ul><div>という機能を持たせます。</div><div><br /></div><div>Arduino(ESP8266)のカスタムなWebサーバとしての機能や、HTTPクライアントとしての機能については、ESP8266用のライブラリをインストールした際にサンプルのスケッチがあるのでそれを参考にしました。ESP8266のArduinoをセットアップする方法はこちらなどを参考にしました。</div><div><br /></div><div><span data-offset-key="8osbf-0-0" face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #0f1419; white-space-collapse: preserve;"><span data-text="true"><b>Arduino用 ESP8266モジュールを使う</b>
</span></span><span face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #1d9bf0; white-space-collapse: preserve;"><span data-offset-key="8osbf-1-0"><a href="http://7ujm.net/micro/arduino_esp8266.html">http://7ujm.net/micro/arduino_esp8266.html</a></span></span><span data-offset-key="8osbf-2-0" face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #0f1419; white-space-collapse: preserve;"><span data-text="true"> </span></span></div><div><br /></div><p></p><p>問題の「UTF-8→シフトJISへのエンコーディング変換」ですが、こちらもすでに対応するライブラリをArduino用に作ってくださっている方がいらっしゃるので、ありがたく使わせていただきました。</p><div style="text-align: left;"><span data-offset-key="fsd35-0-0" face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; white-space-collapse: preserve;"><span data-text="true"><span style="color: #0f1419;"><b>UTF-8 文字列から Shift_JIS へ変換する WROOM(ESP8266)用 Arduino IDE ライブラリを作ってみました | mgo-tec電子工作</b><br /></span></span></span><span face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #1d9bf0; white-space-collapse: preserve;"><span data-offset-key="fsd35-1-0"><a href="https://www.mgo-tec.com/blog-entry-utf8-sjis-wroom-arduino-lib.html">https://www.mgo-tec.com/blog-entry-utf8-sjis-wroom-arduino-lib.html</a></span></span><span data-offset-key="fsd35-2-0" face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #0f1419; white-space-collapse: preserve;"><span data-text="true"> </span></span></div><p><br /></p><p>さらに、JSONを取り扱うためのArduino用のライブラリもあるので、それも利用して、JSONのレスポンスから住所情報を組み合わせて、単純なテキストデータとしてMSX0側に返却します。<br /><br /></p><p><span data-offset-key="505bj-0-0" face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; white-space-collapse: preserve;"><span data-text="true"><span style="color: #0f1419;"><b>【M5StickC Plus/Arduino】Arduinoでjsonを扱う - ソースに絡まるエスカルゴ</b>
</span></span></span><span face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #1d9bf0; white-space-collapse: preserve;"><span data-offset-key="505bj-1-0"><a href="https://rikoubou.hatenablog.com/entry/2021/04/16/162258">https://rikoubou.hatenablog.com/entry/2021/04/16/162258</a></span></span><span data-offset-key="505bj-2-0" face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #0f1419; white-space-collapse: preserve;"><span data-text="true"> </span></span></p><p><br /></p><p>これらを使って作ったカスタムWebサーバのソースがこちら。</p><p><br /></p>
<!--https://cdnjs.com/libraries/highlight.js-->
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/styles/a11y-dark.min.css" rel="stylesheet"></link>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
<pre class="prettyprint"><code>#include <Arduino.h>
#include <ESP8266WebServer.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <uri/UriBraces.h>
#include "secrets.h" // add WLAN Credentials in here.
// name of the server. You reach it using http://webserver
#define HOSTNAME "webserver"
// local time zone definition (Berlin)
#define TIMEZONE "CET-1CEST,M3.5.0,M10.5.0/3"
// need a WebServer for http access on port 80.
ESP8266WebServer server(80);
ESP8266WiFiMulti WiFiMulti;
#include <UTF8toSJIS.h>
const char* UTF8SJIS_file = "/Utf8Sjis.tbl"; //SPIFFSファイルシステムで予めこのファイルをアップロードしておくこと
UTF8toSJIS u8ts;
#include <ArduinoJson.h>
// ===== Simple functions used to answer simple GET requests =====
void handlePostalProxy() {
WiFi.mode(WIFI_STA);
// wait for WiFi connection
if ((WiFiMulti.run() == WL_CONNECTED)) {
WiFiClient client;
HTTPClient http;
Serial.print("[HTTP] begin...\n");
// パスパラメータの取得
String code = server.pathArg(0);
// 送信先URL(パラメータ含む)の指定
if (http.begin(client, "http://zipcloud.ibsnet.co.jp/api/search?zipcode="+code)) {
Serial.print("[HTTP] GET...\n");
// start connection and send HTTP header
int httpCode = http.GET();
// httpCode will be negative on error
if (httpCode > 0) {
// HTTP header has been send and Server response header has been handled
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String payload = http.getString();
Serial.println(payload);
// WebAPIサーバから返されたレスポンスボディの内容をもとにJSONドキュメントを生成
DynamicJsonDocument doc(512);
deserializeJson(doc, payload);
String utf8resp = "address=";
utf8resp += (String)doc["results"][0]["address1"];
utf8resp += (String)doc["results"][0]["address2"];
utf8resp += (String)doc["results"][0]["address3"];
Serial.println(utf8resp);
// UTF-8の文字列(utf8resp)をSJIS(sj_txt)に変換
uint8_t sj_txt[utf8resp.length()];
uint16_t sj_length;
u8ts.UTF8_to_SJIS_str_cnv(UTF8SJIS_file, utf8resp, sj_txt, &sj_length);
// unit8_t型の配列はsendContent_P()メソッドに渡せないので、char型配列に変換
char resp[sj_length];
for(int i=0;i<sj_length;i++) {
resp[i] = sj_txt[i];
}
// MSX0(HTTPクライアント)側にレスポンスを返却
server.setContentLength(sj_length);
// レスポンスコードとMIMEタイプ/エンコーディングのみ指定
server.send(200, "text/plain;charset=Shift_JIS","");
// レスポンスボディ(SJIS文字列)を返却
server.sendContent_P(resp,sj_length);
}
} else {
Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
server.send(200, "text/plain; charset=Shift_JIS", "ERROR!");
}
http.end();
} else {
Serial.println("[HTTP] Unable to connect");
}
}
}
void setup(void) {
delay(3000); // wait for serial monitor to start completely.
// Use Serial port for some trace information from the example
Serial.begin(9600);
Serial.printf("Starting WebServer...\n");
if (strlen(ssid) == 0) {
WiFi.begin();
} else {
WiFi.begin(ssid, passPhrase);
}
// allow to address the device by the given name e.g. http://webserver
WiFi.setHostname(HOSTNAME);
Serial.printf("Connect to WiFi...\n");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.printf(".");
}
Serial.printf("connected.\n");
// Ask for the current time using NTP request builtin into ESP firmware.
Serial.printf("Setup ntp...\n");
configTime(TIMEZONE, "pool.ntp.org");
Serial.printf("Register service handlers...\n");
// 「/zipcode/郵便番号」というURLでGETリクエストを受信したらhandlePostalProxyメソッドを実行
server.on(UriBraces("/zipcode/{}"), HTTP_GET, handlePostalProxy);
// enable CORS header in webserver results
server.enableCORS(true);
// enable ETAG header in webserver results from serveStatic handler
server.enableETag(true);
// handle cases when file is not found
server.onNotFound([]() {
// standard not found in browser.
server.send(404, "text/html", "404 Not Found");
});
server.begin();
Serial.printf("hostname=%s\n", WiFi.getHostname());
//Serial.printf("ip=%s\n",WiFi.localIP());
Serial.printf("ip addr=%s\n", WiFi.localIP().toString().c_str());
}
void loop(void) {
server.handleClient();
}</code></pre>
<p><br /></p><p>WebサーバとHTTPクライアントの両方の役割を兼任するので若干ややこしいです。</p><p>そして、結構はまってしまったのがSJIS形式に変換した後のコンテンツを返却するところです。上記にリンクしたライブラリでUTF-8文字列をSJISに変換すること自体は簡単にできたのですが、いざ、それをArduinoのWebサーバから返そうとすると、なぜか同じ文字列が2回繰り返し送信されてしまったりして、最初うまく行きませんでした。</p><p>ESP8266WebServerクラスには、レスポンスを送信するメソッドとしてsend()メソッドと、sendContent_P()メソッドというのがあるのですが、後者のメソッドですと送信するバイト数が限定できるので、こちらを使って実際のバイト数きっちりしか送り出さないようにしています。</p><p><br /></p><h2>MSX0でHTTPクライアントを作る</h2><div>サーバ側が整いましたのでいよいよMSX0側にHTTPクライアントを実装します。</div><div><br /></div><div>ざっくりいうとステップは以下です。</div><div><br /></div><div><ol style="text-align: left;"><li>[1000~2030] 初期設定等 </li><li>[3000~4000] Webサーバに接続</li><li>[4000~5000] 検索したい郵便番号を入力</li><li>[5000~7000] HTTPリクエストを送信</li><li>[7000~7500] レスポンスを受信し、レスポンスを1つの文字列に連結していく</li><li>[7500~8000] 特定のキーワード("address=")が含まれる箇所を特定しそこから後ろにある文字列だけを表示</li><li>[8000~] 切断処理</li></ol><div><br /></div><div>リストはこんな感じです。いろいろ試行錯誤はありましたが動いてみるとシンプルなコードです。</div><div><br /></div>
<pre class="prettyprint"><code>1 'SAVE"POSTAL2.BAS"
1000 'initialize
1010 _KANJI
1020 CLEAR 800
1030 NL$=CHR$(13)+CHR$(10)
2000 'user setting
2010 SV$="192.168.1.228"
2020 PA$="msx/me/if/NET0/" 'path
2030 KY$="address="
3000 'connect
3010 _IOTPUT(PA$+ "conf/addr",SV$)
3020 _IOTPUT(PA$+ "conf/port",80)
3030 _IOTPUT(PA$+ "connect",1)
3500 'check connect status
3510 FOR I=0 TO 100:NEXT
3520 _IOTGET(PA$+ "connect",S)
3530 IF S<>1 THEN PRINT "connect fail":GOTO 8000
4000 'input postal code
4010 PRINT "POSTAL CODE=";
4020 INPUT P$
5000 'create message
5010 SM$(0)="GET /zipcode/"+P$+" HTTP/1.1"+NL$
5020 SM$(1)="Host: "+SV$+NL$
5030 SM$(2)="Content-Type: application/json"+NL$
5040 SM$(3)=""+NL$
6000 'send message
6010 PRINT NL$+"---- Send Message ----"
6020 I=0
6030 IF SM$(I)="" THEN 7000
6040 PRINT SM$(I);
6050 _IOTPUT(PA$+ "msg",SM$(I))
6060 I=I+1
6070 GOTO 6030
7000 'receive message
7010 _IOTGET(PA$+"msg",RM$):IF RM$="" THEN 7010
7020 PRINT NL$+"---- Receive Message ----"
7030 RS$="":ER=0
7040 FOR J=0 TO 15
7050 IF RM$<>"" THEN RS$=RS$+RM$:ER=0
7060 IF RM$="" THEN ER=ER+1:IF ER=2 THEN 7500
7070 _IOTGET(PA$+ "msg",RM$)
7080 FOR I=0 TO 100:NEXT I
7090 NEXT J
7500 P = INSTR(RS$,KY$)
7510 IF P<>0 THEN PRINT MID$(RS$,P+LEN(KY$))
8000 'disconnet
8010 _IOTPUT(PA$+ "connect",0)
8020 _IOTINIT()
8030 END</code></pre>
<div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir2jONzWa6_q0hzPkje9BqatdCgvi88yJGW1lB90Wsa30XFzwZ7qr-sbgOLZSwnIWmwyYbat9WRHXh2lhYy53KkBJ45HQg1F3gaOiJ51ko8QEhGCMFgn0dvNQcR6a4uitpn1RYMszofF2pQaWHlVQ7EuKhzV8FWi8d6AH3BdJcXwmwR0a-VAh_aHxsZZPR/s1150/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-09-25%20010730.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="895" data-original-width="1150" height="249" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir2jONzWa6_q0hzPkje9BqatdCgvi88yJGW1lB90Wsa30XFzwZ7qr-sbgOLZSwnIWmwyYbat9WRHXh2lhYy53KkBJ45HQg1F3gaOiJ51ko8QEhGCMFgn0dvNQcR6a4uitpn1RYMszofF2pQaWHlVQ7EuKhzV8FWi8d6AH3BdJcXwmwR0a-VAh_aHxsZZPR/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-09-25%20010730.png" width="320" /></a></div><br /><div><br /></div><div><br /></div><div>これで、住所を入力するMSXアプリケーションで住所入力が楽になりましたね・・・って、果たしてそんなアプリがどれだけあるというのかw</div><div><br /></div><div>現場からは以上です。</div><div><br /></div></div><div><br /></div><div><br /></div><div><br /></div>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07MZSHDCQ&linkId=a2e696359015b7f1f36d8293d2eb9f18" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-83074854739039892542023-09-17T22:38:00.004+09:002023-10-08T20:19:49.844+09:00MSX0でI2C通信を試してみた #MSX #MSX0 #Arduino<p>※本記事に掲載のソースは、<a href="https://github.com/MobileFF/msx0_sample/tree/main/I2C_sample">GitHubにも公開しております</a>。<br /></p><p>MSX0といえばIoT BASIC(IoT関連機能の拡張命令を追加した拡張BASIC)ということで、IoTっぽいことをやってみようと思ったのですが、温湿度センサーとか持っていないので、まずは疎通確認的なのできないかなあということで。</p><p>I2C通信については、添付のディスクイメージ(SAMPLE.DSKファイル)にI2C.BASというサンプルコードが入っているので、それをベースにサンプルコードよりもより単純な通信を試してみました。</p><p>通信というからには通信相手も必要です。</p><p>I2Cはマスター・スレーブでの主従関係を持つ通信になるのですが、MSX0側をマスターとみなすと考えますと、スレーブになる通信相手が必要です。</p><p>こういう時は、何と言ってもお手軽さが群を抜いているのがArduinoですね。</p><p>文献がネットにたくさんあるので、すぐにサンプルを持ってきて試すことができます。</p><p>ということで、まずは、マスター(MSX0)側からスレーブ(Arduino)側へ一方的に値を送信するパターンです。</p><p><br /></p><h2 style="text-align: left;">スレーブ(受信側)の準備</h2><p>スレーブ(Arduino)側のコードについては、ネットを調べるといろいろとサンプルコードが出てきます。中の人は、こちらの記事を参考に作ってみました。というか、お手本ほとんどそのままです。</p><p><span data-offset-key="5v215-0-0" face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #0f1419; white-space-collapse: preserve;"><span data-text="true"><b>Arduino初心者編:I2C通信によるArduino間のデータ送受信 | STEMSHIP
</b></span></span><span face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #1d9bf0; white-space-collapse: preserve;"><span data-offset-key="5v215-1-0"><a href="https://stemship.com/arduino-beginner-i2c/">https://stemship.com/arduino-beginner-i2c/</a></span></span><span data-offset-key="5v215-2-0" face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #0f1419; white-space-collapse: preserve;"><span data-text="true"> </span></span></p><p><br />このページを参考に作ったスレーブ側の待ち受けプログラムです。</p><p>動作としては、マスターからのデータ送信を待ち受け、データを受け取ったらシリアルコンソールに表示するというだけの単純なもの・・・などと偉そうに言っておりますが、上記の記事のおかげで短時間で完成することができました。ありがとうございます。</p><p><br /></p>
<!--https://cdnjs.com/libraries/highlight.js-->
<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/styles/a11y-dark.min.css" rel="stylesheet"></link>
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.15.10/highlight.min.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
<pre class="prettyprint"><code>#include "Wire.h"
volatile byte receiveValue = 0;
volatile boolean received = false;
void setup() {
Wire.begin(8);
Wire.onReceive(dataReceive);
Serial.begin(9600);
Serial.println("I2C slave.");
}
void loop() {
if (received) {
Serial.println(receiveValue);
received = false;
}
}
void dataReceive(int number) {
if(Wire.available()) {
receiveValue = Wire.read();
received = true;
}
}</code></pre>
<p><br /></p><p>ちなみに、Wire.begin(8);で指定している引数8は、スレーブのデバイスIDの指定と思われます。特に決まりみたいなものはないと思うのですが、今回はこのスレーブのデバイスIDを8としました。</p><p><span style="font-size: x-small;">[追記] ちなみにスレーブのデバイスIDは何でも良いわけではなく、予約されている番号などもあるので、注意が必要です。</span></p><p>また、Wire.onReceive()で指定しているリスナー関数 dataReceiveには引数としてint型のnumberを受け取るようになっていますが、このnumberはマスターから送信されるデータのバイト数になります。なので、本来は関数内のWire.read()はnumberの数分だけ繰り返し受け取る必要がありますが、今回は1バイト送信決め打ちにしているので無視しています。</p><p><br /></p><p>続いていよいよMSX0側です。</p><p><br /></p><h2 style="text-align: left;">マスター側(MSX0側)の準備</h2><div>MSX0側では、IoT BASICでI2C通信をプログラミングします。サンプルプログラムとして添付されていたI2C.BASをベースに、処理を単純化したものです。</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW8oqnXWT5kiTaolJD4DKZOFJruTK78X1KGclmgtObzQrRcS1YtUoTQ5ghsrkWUFnOd8zb2TML0K1UrnKoR5u9z6mP9pxW1a6eOr56x6iH9OF32HPDM0brTpvaqumkXJvfX-HIp01zWGBrXAydxJBFKXUBMM0L0cLLhNoolepPADpL0n47Zb3ATmciG35S/s1150/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-09-16%20233626.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="890" data-original-width="1150" height="496" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW8oqnXWT5kiTaolJD4DKZOFJruTK78X1KGclmgtObzQrRcS1YtUoTQ5ghsrkWUFnOd8zb2TML0K1UrnKoR5u9z6mP9pxW1a6eOr56x6iH9OF32HPDM0brTpvaqumkXJvfX-HIp01zWGBrXAydxJBFKXUBMM0L0cLLhNoolepPADpL0n47Zb3ATmciG35S/w640-h496/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-09-16%20233626.png" width="640" /></a></div><br /><div>※今よく見たら、120行目のDEFINT Dは変数自体を使っていないので不要な気がしますね。失礼しました。</div><div><br /></div><div>130行目の
<pre class="prettyprint"><code>_IOTFIND("device/i2c_a",C)</code></pre>
で、おそらくI2Cスレーブデバイスの個数が変数Cに格納されて返されるのではないかと思います。マニュアルでは「対象のノードが持つアイテムの個数を取得します」とあるので、I2Cの場合はスレーブの数なのではないかと思われます。引数に指定している"device/i2c_a"は、デバイスのノードパスで、アクセスしたいデバイスに応じて変化します。ちなみに、"i2c_a"と「A」がついているのは、PORT Aを示しているものと思われます。</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv2Ef1qS8TikknkPie4UjUeMnOFenkW2YARddMuqIu5e_etPvaLPXrPWBrcsRHK3WWIt-yWOldL_4HkgR3Ewla-hVAFqVrzXiFlWX9x81aZe6wyBamUG7u-k7pGSIta2GLA_tve3faePMpVx1IJ4AP0L81JQ780kbZaeKmUQXJ_j8bbTgL2_utym8Nsp2I/s2898/IMG_20230917_204935~2.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1269" data-original-width="2898" height="175" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv2Ef1qS8TikknkPie4UjUeMnOFenkW2YARddMuqIu5e_etPvaLPXrPWBrcsRHK3WWIt-yWOldL_4HkgR3Ewla-hVAFqVrzXiFlWX9x81aZe6wyBamUG7u-k7pGSIta2GLA_tve3faePMpVx1IJ4AP0L81JQ780kbZaeKmUQXJ_j8bbTgL2_utym8Nsp2I/w400-h175/IMG_20230917_204935~2.jpg" width="400" /></a></div><br /><div><br /></div><div>ちなみに上記のプログラムでは、ここは常に1が返ってきます。MSX0から1個のスレーブにしか繋いでいないためと思われます。Cが0でない場合はスレーブが存在するとして次へ進みます。</div><div><br /></div><div>150行目を実行するのは、I2Cスレーブが存在することが確認できた場合なので、今度はデバイスIDを含めて取得するために、
<pre class="prettyprint"><code>_IOTFIND("device/i2c_a",A$(0),C)</code></pre>
<span style="background-color: white;">のように配列変数を指定すると、アイテム名(I2Cの場合はスレーブのデバイスID)が配列としてA$に格納されます。変数Cにはおそらく先ほどと同じくスレーブデバイスの数が返されると思われます。</span></div><div><span style="background-color: white;"><br /></span></div><div><span style="background-color: white;">これを調べて、期待されるデバイスID(ここでは、スレーブのデバイスIDである"08"のこと)に等しいものが配列A$に含まれていれば、次の処理に進みます。</span></div><div><span style="background-color: white;"> ※ 返されるアイテム名はゼロサプレスされていないので、比較照合の際は注意が必要</span></div><div><span style="background-color: white; font-size: x-small;"><br /></span></div><div><span style="background-color: white;"><span style="font-size: x-small;">[追記] 正直、I2Cハブなどを使っていなくて、1つのスレーブしか繋いでいなければ、1個めのIDをそのまま無条件に採用しても良いと思われますが、間違って違うデバイスを繋いだときのことを考慮するとチェックするに越したことはないのでしょうね</span></span></div><div><br /></div><div>デバイスIDが確定したら、ノードパスにデバイスIDを追加します。180行目の
<pre class="prettyprint"><code>N$="device/i2c_a/"+A$(I)</code></pre>
<span style="background-color: white;">の箇所です。</span></div><div><br /></div><div><br /></div><div>マスターからスレーブに送信したい情報がある場合は、
<pre class="prettyprint"><code>_IOTPUT(ノードパス,送信したい値)</code></pre>
<span style="background-color: white;">と指定します。8bitの情報を送りたい場合は、CHR$(送りたい値)のように文字列として指定するようです。複数バイト一挙に送りたい場合は、CHR$(nn)を連結して複数文字の文字列とすればよいようです。</span></div><div><span style="background-color: white;"><br /></span></div><h2 style="text-align: left;"><span style="background-color: white;">MSX0とArduinoを接続</span></h2><p style="text-align: left;"><span style="background-color: white;">MSX0のPORT Aは、向かって左から「SCL(クロック信号)」「SDA(データ)」「VCC」「GND」となっています。電源も含めてArduino側に供給することもできると思われるのですが、中の人はGroveコネクタ(M5StackのPORTに繋ぐ用の4ピンケーブル)を持っていないくて手持ちのジャンプワイヤーで繋いでいるのですが、これだとワイヤの幅が足りず3本までしか繋げないっぽいので、とりあえずArduino側の電源は別で取ることにします。(Groveケーブルはポチったので、届いたらまた試してみます)</span></p><p style="text-align: left;"><span style="background-color: white;">それと、MSX0のマニュアルに「</span><b><u style="background-color: #ffa400;">MSX0貸出機ではPORTAのI2CとFaccsを同時に利用することはできないため、Facesを外してください。BattryBotomを本体に装着してPORTAのI2Cを利用することは可能です。</u></b>」という記載があったので、ここでも、FacesからはMSX0本体は取り外してBatteryBottomを付けています。</p><p style="text-align: left;"><br /></p><div style="text-align: justify;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv2Ef1qS8TikknkPie4UjUeMnOFenkW2YARddMuqIu5e_etPvaLPXrPWBrcsRHK3WWIt-yWOldL_4HkgR3Ewla-hVAFqVrzXiFlWX9x81aZe6wyBamUG7u-k7pGSIta2GLA_tve3faePMpVx1IJ4AP0L81JQ780kbZaeKmUQXJ_j8bbTgL2_utym8Nsp2I/s2898/IMG_20230917_204935~2.jpg" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="1269" data-original-width="2898" height="175" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv2Ef1qS8TikknkPie4UjUeMnOFenkW2YARddMuqIu5e_etPvaLPXrPWBrcsRHK3WWIt-yWOldL_4HkgR3Ewla-hVAFqVrzXiFlWX9x81aZe6wyBamUG7u-k7pGSIta2GLA_tve3faePMpVx1IJ4AP0L81JQ780kbZaeKmUQXJ_j8bbTgL2_utym8Nsp2I/w400-h175/IMG_20230917_204935~2.jpg" width="400" /></a></div><div><br /></div><div><br /></div><div>Arduino側なんですが、ひとつ気になるポイントとして、中の人が良く使っているArduino Unoは通常5V駆動ですが、M5Stack(のマイコンであるESP32)は3.3V駆動のようで、電圧レベルの異なる機器をそんなにひょいひょい繋いじゃっていいの?問題があるようです。</div><div><br /></div><div>この件について考察されている下記の記事を読む限り、繋いだ途端に破損・・・ということはないようですが(中の人も最初はArduino Unoで繋いで動かしましたが無事でした)、なんとなく心配は心配なので、可能であれば3.3V駆動のArduinoに繋ぐのが無難なのかもしれません。</div><div><br /><br /></div><div><span data-offset-key="1slm3-0-0" face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #0f1419; white-space-collapse: preserve;"><span data-text="true"><b>M5StackのI2C信号の電圧|くりばた</b>
</span></span><span face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #1d9bf0; white-space-collapse: preserve;"><span data-offset-key="1slm3-1-0"><a href="https://note.com/kuribata/n/n0c46035cc5e0">https://note.com/kuribata/n/n0c46035cc5e0</a></span></span><span data-offset-key="1slm3-2-0" face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #0f1419; white-space-collapse: preserve;"><span data-text="true"> </span></span></div><div><br /></div><div><br /></div><div>中の人はたまたま偶然にもArduino Pro Mini互換機で3.3V駆動の物を所有していたので、以後はそちらで動かしてみることにします。</div><div><br /></div><div>Arduino(UnoもProMiniも共通)では、I2C用のポートは、以下のようになっています。</div><div><br /></div><div>[ピン] Arduino ←→ MSX0</div><div>[SDA] A4 ←→ PORT Aの左から2番目のピン</div><div>[SCL] A5 ←→ PORT Aの一番左のピン</div><div><br /></div><div>GNDはArduino側に専用のポートがあるのでそこにそのままMSX0のPORT AのGNDを繋ぎます。</div><div><br /></div><div>繋いだ様子はこんな感じです。</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwgzamBCZTS42pCy6TQJ6QscmvdyHMyFvDFxPwfO5GvbLrFYyFqAuK3RuP3jyJDB0Da7QSzYhsQPvVa0d419Nf0Opnbtu-Cd1RjQagkTrTw_X9rRHaWglodd8Avmx4Yh6YxaWZXx7TcTEAg-hjRfWMy8VdFSfRtLld4T7fRtHpDZbDms2w6Y1dgEzr9Ov3/s3257/IMG_20230917_085142.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2343" data-original-width="3257" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwgzamBCZTS42pCy6TQJ6QscmvdyHMyFvDFxPwfO5GvbLrFYyFqAuK3RuP3jyJDB0Da7QSzYhsQPvVa0d419Nf0Opnbtu-Cd1RjQagkTrTw_X9rRHaWglodd8Avmx4Yh6YxaWZXx7TcTEAg-hjRfWMy8VdFSfRtLld4T7fRtHpDZbDms2w6Y1dgEzr9Ov3/w400-h288/IMG_20230917_085142.jpg" width="400" /></a></div><br /><div><br /></div><div>左下にArduino Uno互換機がいるのは、Arduino Pro Miniへの3.3V電源共有のためと、PC上でシリアルモニタの様子を確認するために、Arduino UnoのUSB←→シリアル変換機能を間借りするためで、直接MSX0と繋がっているのは、右下のArduino Pro Mini互換機です。</div><div><br /></div><div>Arduino Pro MiniはUSB接続の手段を単独で持っていないので、こんな風に少々工夫が必要なのですが、以下のページが大変参考になりました。</div><div><br /></div><div><b><span data-offset-key="aipm2-0-0" face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #0f1419; white-space-collapse: preserve;"><span data-text="true">Arduino UnoやNanoを使いArduino Pro Miniにスケッチを書き込む方法! | ぶらり</span></span><span face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; white-space-collapse: preserve;"><span data-offset-key="aipm2-1-0">@web</span></span></b><span data-offset-key="aipm2-2-0" face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #0f1419; white-space-collapse: preserve;"><span data-text="true"><b>走り書き</b> </span></span></div><div><span face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #1d9bf0; white-space-collapse: preserve;"><span data-offset-key="aipm2-3-0"><a href="https://burariweb.info/electronic-work/arduino-promini-uno-sketch-writing.html">https://burariweb.info/electronic-work/arduino-promini-uno-sketch-writing.html</a></span></span><span data-offset-key="aipm2-4-0" face=""Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif" style="background-color: white; color: #0f1419; white-space-collapse: preserve;"><span data-text="true"> </span></span></div><div><br /></div><div><span style="font-size: x-small;">[追記] 秋月電子で販売されている <span style="background-color: white; font-family: Merriweather, Georgia, serif;">AE-UM232R とかがあればそちらを使うほうが簡単便利でおすすめです。</span></span></div><div><span style="font-size: x-small;"><span style="background-color: white; font-family: Merriweather, Georgia, serif;"><br /></span></span></div><h2 style="text-align: left;">スレーブから値を受け取れるようにする</h2><div>MSX0のI2C利用例では温湿度センサーの値を受け取ったりしていますが、当然ながらマスターから一方的に値を送るだけでなく、スレーブからも値を受け取りたいことはあるでしょう。</div><div><br /></div><div>ということでスレーブからも値を送れるようにしてみます。</div><div><br /></div><div>I2Cではスレーブ側から何の前触れもなく値を送り付けるということはないらしく(あったとしてもマスター側で受け取れない?)、あくまでマスター側からリクエストされたら値を送り返す、という仕組みになっているようです。</div><div><br /></div><div>スレーブ側(Arduino)では、<span style="background-color: #fcff01; font-weight: bold;">Wire.onRequest(リスナー関数名);</span><span style="background-color: white;">という関数で、マスター側から値を送るようリクエストを受けたときに実行したい関数を設定できます。</span></div><div><span style="background-color: white;"><br /></span></div><div><span style="background-color: white;">リスナー関数内では、直前にマスターから受け取った値を9から減算したものをマスターに</span><b style="background-color: #fcff01;">Wire.write(9-receiveValue);</b><span style="background-color: white;">で送信しています。</span></div><div><span style="background-color: white;"><br /></span></div><div>これらを組み入れたスケッチは以下のようになります。</div><div><br /></div><div><br /></div><div><br /></div>
<pre class="prettyprint"><code>#include "Wire.h"
volatile byte receiveValue = 0;
volatile boolean received = false;
void setup() {
Wire.begin(8);
Wire.onReceive(dataReceive);
Wire.onRequest(requestEvent);
Serial.begin(9600);
Serial.println("I2C slave.");
}
void loop() {
if (received) {
Serial.println(receiveValue);
received = false;
}
}
// numberは送信されてくるバイト数
void dataReceive(int number) {
if(Wire.available()) {
receiveValue = Wire.read();
received = true;
}
}
void requestEvent() {
Wire.write(9-receiveValue);
}</code></pre><div><br /></div><p style="text-align: left;">次に、MSX0側ですが、_IOTPUT()を実行した直後に、_IOTGET()を使ってスレーブからの送信値を受け取ります。<b style="background-color: #fcff01;">_IOTGET(ノードパス,受け取りたい値)</b>という感じに指定ができます。</p><p style="text-align: left;">リストはこんな感じです。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEim63oGEUTMdPPc361I8WzW0qVLt1ap7vtUaRTyhoEyiXck_pTqTy5n2B92tqmB9hwupiPQC66QuHHMPC7xELd-h-ukLXkuxUv6ddefnWVzJuzAN0pO4ZYYLO1xFBpbH-ZViZ3jTrA0oIXfRrSb_zVWa7BpfeTTI2gN0yw7_T5g5WTh4-flY4hu95dQAtB0/s1150/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-09-17%20221623.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="895" data-original-width="1150" height="498" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEim63oGEUTMdPPc361I8WzW0qVLt1ap7vtUaRTyhoEyiXck_pTqTy5n2B92tqmB9hwupiPQC66QuHHMPC7xELd-h-ukLXkuxUv6ddefnWVzJuzAN0pO4ZYYLO1xFBpbH-ZViZ3jTrA0oIXfRrSb_zVWa7BpfeTTI2gN0yw7_T5g5WTh4-flY4hu95dQAtB0/w640-h498/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-09-17%20221623.png" width="640" /></a></div><br /><p style="text-align: left;">実行結果のスクリーンショットです。</p><p style="text-align: left;">Arduino側ではマスター(MSX0)から送信されてきた値(0,1,2,3・・・9)が表示されているのに対して、MSX0側ではスレーブから送信されてきた「9-マスターからの送信値」→ 9,8,7・・・0が表示されていることが分かり、正しくスレーブからの値を受け取れているらしいことがわかります。</p><p style="text-align: left;"><span style="font-size: x-small;">[追記] ちなみに、_IOTGET()で得られる値なのですが、上記リストではASC(S$)として1バイト分のデータだけを取り出していますが、どうも実際には_IOTGET()で返却される文字列は16バイト固定のようです。ASC()関数は文字列の先頭1文字目のアスキーコードを返す仕様なので、上記のコードではあたかもスレーブから1バイトだけ受け取っているように見えていますが、実際には後ろの15文字は捨てていることになります。実際、スレーブからは1バイトしか返信していないので、実際上の問題はないのですが。</span></p><p style="text-align: left;"><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmOaV8SGxMC3ahYYrQUpP2zvL28NHU3jQXKAZExV4ee9YqKrfqQKg3_rYFx9n9H1Bz68ysxK9Ca2D8-F2KWKNgXXJKMAZY7llBgEhn55gOTB41crNhvHa-WmyApGG_cVONmyG5dIIuAkoQYT49KPcAOoZUwPDJ7iVzLy0Bt-qq72tFmtnVGEw3i0z_6KwE/s2552/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-09-17%20222451.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="892" data-original-width="2552" height="224" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmOaV8SGxMC3ahYYrQUpP2zvL28NHU3jQXKAZExV4ee9YqKrfqQKg3_rYFx9n9H1Bz68ysxK9Ca2D8-F2KWKNgXXJKMAZY7llBgEhn55gOTB41crNhvHa-WmyApGG_cVONmyG5dIIuAkoQYT49KPcAOoZUwPDJ7iVzLy0Bt-qq72tFmtnVGEw3i0z_6KwE/w640-h224/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-09-17%20222451.png" width="640" /></a></div><br /><p style="text-align: left;">なにぶんにも、中の人は電子工作、電子回路については全くの素人なので、いろいろと間違いもあるかと思います。</p><p style="text-align: left;">Arduinoは互換機含め様々入手経路があり、価格も安価なものがたくさんありますが、MSX0については、2023年9月時点で破損すると、基本的には一般販売開始を待たなければいけなくなりますので、この記事の内容を試される場合はくれぐれも自己責任でお願いいたします。</p><p style="text-align: left;">また何か間違いを発見された場合は、ブログのコメントかTwitter等でご指摘いただけましたら幸いです。</p><p style="text-align: left;"><br /><br /></p><div><br /></div>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07MZSHDCQ&linkId=a2e696359015b7f1f36d8293d2eb9f18" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-56518513440616482182023-09-17T01:00:00.001+09:002023-09-17T01:00:28.576+09:00MSX0が着弾 #MSX #MSX0<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYmLUobR01bl4Jc_EpYt6WFAVMntiMFHmfu50pK4GbRMDvWLD3amRwlDHkR24XIZOUYGgTDK6Ew82f87M35Y1B2oWdT4cdJwe8cUnFR1c5RtrkFfiDtR65OZ1kZk_eUmoWwUh1GXmrUTkgFD02B1x2qceWJf4Qx21qN8N6baPOeGldhXDOxRs6AvqhuI4N/s3191/IMG_20230917_000440.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2282" data-original-width="3191" height="229" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiYmLUobR01bl4Jc_EpYt6WFAVMntiMFHmfu50pK4GbRMDvWLD3amRwlDHkR24XIZOUYGgTDK6Ew82f87M35Y1B2oWdT4cdJwe8cUnFR1c5RtrkFfiDtR65OZ1kZk_eUmoWwUh1GXmrUTkgFD02B1x2qceWJf4Qx21qN8N6baPOeGldhXDOxRs6AvqhuI4N/s320/IMG_20230917_000440.jpg" width="320" /></a></div><br /><p>クラファンでバックしていたMSX0(PLAN A)が着弾いたしました。</p><p>バックした当初は、MSXが復活するだけでお腹一杯、IoTって何それおいしいの?ぶっちゃけMSX存続のためにお布施はするけど、そんなに使わないかもな・・・状態だったような気もするのですが、なぜだかそれからポケコンでSPI通信してみたり、ArduinoのYM2151シールドを一生懸命作ってみたりとか、期せずしてIoTにすこーしだけ足を踏み入れていた矢先に着弾したのも、なんというか運命的と言いますか(大袈裟)。</p><p><br /></p><h2 style="text-align: left;">使い始めるには</h2><p style="text-align: left;">正直、中の人はM5Stackはなんとなく聞いたことはあるけど、使ったことがない状態で着弾しましたので、箱開けて取り出しても、まずどれが電源ボタンなんだというところから始まり、起動したけど上下スワイプでなぜか2つMSXが起動したりとか・・・?とあたふたしてしまいました。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLoWeLPpb0ORyz_Mysod_BVAeatTWMdfDuloT_SijaISpxgUfdheUIfns7pwkoGxjdc8XydFYNme8W3_O12J-prn8wK1VY79ERhwpb_faz8gH4VFJRCYp8QqvqoBWUxj8pFCpDLhcG_VI5yPYaFId2WcsvuZCeZRVP9HjnOtQlm30AWc7b9Qaq-dymQNZS/s1645/IMG_20230917_000440.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1645" data-original-width="891" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLoWeLPpb0ORyz_Mysod_BVAeatTWMdfDuloT_SijaISpxgUfdheUIfns7pwkoGxjdc8XydFYNme8W3_O12J-prn8wK1VY79ERhwpb_faz8gH4VFJRCYp8QqvqoBWUxj8pFCpDLhcG_VI5yPYaFId2WcsvuZCeZRVP9HjnOtQlm30AWc7b9Qaq-dymQNZS/s320/IMG_20230917_000440.png" width="173" /></a></div><br /><p style="text-align: left;">まずは、西さんが頑張って仕込んでくださったmicroSDをPCで開き、「1_MSX0Stack利用方法.pdf」を開きましょう。これを読み進めればだいたいの使い始めの操作はわかります。</p><p style="text-align: left;"><br /></p><h2 style="text-align: left;">各パーツの使い方</h2><p style="text-align: left;">Facesという土台になるパーツ(本体=画面の付いたCore2やキーボードを繋いでいるやつ)はねじ止めでCore2やKBを固定しているので、まずそれを外します。</p><p style="text-align: left;">電気的な接続は2列のピンヘッダでしているので、ねじを外しただけでは急にバラバラにはなりません。ピンヘッダ、コネクタを軽くグイグイっと持ち上げれば外れます。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9BdRX_Y1MRwdN7ZhFDqAu5FdKFL-4Wv9L-x5aMJX9v7r9cEJc59EXXOkedKkDziwUolX0a3Jg36YPboXbNc44Y3W8-WFHU2STazqwooMpwuzjCEGegwjJw0Sd5ttraJPXNsc46nqOPSti-Ytg26YXfF34Pf_jSvVFXWdx3CeeWBULF5Y259wyD7MWoq7A/s2970/IMG_20230917_003235.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2661" data-original-width="2970" height="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9BdRX_Y1MRwdN7ZhFDqAu5FdKFL-4Wv9L-x5aMJX9v7r9cEJc59EXXOkedKkDziwUolX0a3Jg36YPboXbNc44Y3W8-WFHU2STazqwooMpwuzjCEGegwjJw0Sd5ttraJPXNsc46nqOPSti-Ytg26YXfF34Pf_jSvVFXWdx3CeeWBULF5Y259wyD7MWoq7A/s320/IMG_20230917_003235.jpg" width="320" /></a></div><br /><p style="text-align: left;">これら以外のパーツも初めてなのでよく使い方が分からなかったのですが、</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsvN7ZKTh8RLy0tZz7VOXdtgq1Fjb1X9CnSMqaJuEhupFouZL2wLdc5YRIuUx6Zp8_vaQ71is9RD4DQ546vcn5UzxRBnp4p0Ajn_mwYr_-eIS-crtbioe_-uTE7aakFn6xcHGOaSwEYLSt_0rWdvsEM08LpmtAZ4eoKre4MbIPjp0hxWUtqTiCMvuP9acF/s1280/IMG_20230917_000443.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1280" data-original-width="1043" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsvN7ZKTh8RLy0tZz7VOXdtgq1Fjb1X9CnSMqaJuEhupFouZL2wLdc5YRIuUx6Zp8_vaQ71is9RD4DQ546vcn5UzxRBnp4p0Ajn_mwYr_-eIS-crtbioe_-uTE7aakFn6xcHGOaSwEYLSt_0rWdvsEM08LpmtAZ4eoKre4MbIPjp0hxWUtqTiCMvuP9acF/s320/IMG_20230917_000443.png" width="261" /></a></div><p style="text-align: left;">これは充電台なんでしょうか。USBケーブルを挿してMSX0を載せると充電されます。磁石がついているので、ピタッとくっついて充電するのがいい感じです。</p><p style="text-align: left;">通常のM5StackであればPC側からプログラムを流し込むのにも使えるのかもしれませんが、MSX0の場合はそういう使い方はしなさそうなので、充電台としての役割が主になるのかもしれません。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_GJj30fAwBqq85j7CWeQpFofVJpBGpB8yYKS2LILXGqjieLUHZCIxOxmIwxG8Qb3mmO9V8FPxGhBvhJ46LMTI-ZKErdBC4ZUPHzRtb3Zd2l9aiRMXTENLy99LGFggpEL7dECltDKaA_NalDraoccSZc6IiyXwQZRMajIrYraF5Yetm4zU2mDs-U-dwaCE/s820/IMG_20230917_000442.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="790" data-original-width="820" height="308" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_GJj30fAwBqq85j7CWeQpFofVJpBGpB8yYKS2LILXGqjieLUHZCIxOxmIwxG8Qb3mmO9V8FPxGhBvhJ46LMTI-ZKErdBC4ZUPHzRtb3Zd2l9aiRMXTENLy99LGFggpEL7dECltDKaA_NalDraoccSZc6IiyXwQZRMajIrYraF5Yetm4zU2mDs-U-dwaCE/s320/IMG_20230917_000442.png" width="320" /></a></div><br /><p style="text-align: left;">この充電池むき出しのパーツは、Battery Bottomというもので、その名の通りバッテリーの電源を供給するパーツのようです。キーボードを付けずにコンパクトに使う場合はこちらの出番ということになるみたいです。ちなみにこのパーツにもさっきの充電台は対応しているので、充電するためにいちいちUSBを抜き差しする手間はなくて済みます。また、現状MSX0では直接使えないかもしれないですがM5 StackのPORT B/PORT Cの端子も付いています。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJe1l--BMDMvpHXjO_8vDoN8UwvIukwAPqBqTu9kV61wZ4EenfbzgHE3a9VzQw3hxg9mqjvjBaWabMCDWzALc8kL8LoJJkKuAb1x-FYM78aSS_k1ddazImmI-oX56QbVZLAo_kDQvPrA7gkqURLMSwqi6dXEVdBCaGtqbdzbgAFLRltW3TUfC7-WDvx2Vo/s946/IMG_20230917_000441.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="930" data-original-width="946" height="315" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJe1l--BMDMvpHXjO_8vDoN8UwvIukwAPqBqTu9kV61wZ4EenfbzgHE3a9VzQw3hxg9mqjvjBaWabMCDWzALc8kL8LoJJkKuAb1x-FYM78aSS_k1ddazImmI-oX56QbVZLAo_kDQvPrA7gkqURLMSwqi6dXEVdBCaGtqbdzbgAFLRltW3TUfC7-WDvx2Vo/s320/IMG_20230917_000441.png" width="320" /></a></div><p style="text-align: left;">コントローラのパーツは説明不要ですね。キーボードと取り換えて使えますが、まだ実は試してはいないです。とはいえ、添付しているザナックをこのコントローラでクリアするというのは、おそらく地獄の苦行過ぎるのではないかという気もしておりますがw</p><p style="text-align: left;"><br /></p><h2 style="text-align: left;">2つのMSX0</h2><p style="text-align: left;">最初、よくわからなかったのが、画面を上下スワイプすると2つのMSXが別々に起動することでした。これは、どうも1つ目のMSXがメインで、2つ目のMSXはあくまでも本体設定用のメニューを出したりとか、サブ的に使わせることが目的のようです。メニューもMSX BASICで書かれていて、ほとんどの本体設定項目はIoT BASICからいじれるようなので、メニューは頑張れば独自にいろいろ拡張したものが作れるようです。</p><p style="text-align: left;">今、中の人は何も思いついていませんが、もしかするとこのデュアルMSXを使って何か面白いことをさせる達人が現れるかもしれないですね。</p><p style="text-align: left;"><br /></p><h2 style="text-align: left;">Windows用のリモデソフトは便利でマスト</h2><p style="text-align: left;">往年のポケコンがそうであったように、MSX0も時代を経て当時とは比べ物にならないほど身軽な体になり、どこにでも持ち出してMSX BASICでプログラミングができるようになってしまいました。</p><p style="text-align: left;">というとロマンがあるように思えますが、ただいかんせんMSX0は小さすぎます。</p><p style="text-align: left;">キーボードもちゃんとはしていますが、本格的にタイピングできるようなものでもないので、そうなるとやはりPCでプログラムを作って、MSX0に転送して・・・みたいなスタイルを考えることになると思います。</p><p style="text-align: left;">その場合には、添付している専用のリモートデスクトップソフトを使うと良いと思います。</p><p style="text-align: left;">これを使うと、PCの画面やキーボードを使ってMSX0で直接プログラムを作ることができ、転送の手間もありません。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju9ISNeZYBAkejXg7pNq0SlPO8NO7ZG0lKC5vkxiEJAb_bbp4PrUOLfwfbJmK3u8yauF9u8ZB_-Jy68zMnixogWbSEcxDYha1ebGYqUneUmwLvx0z7XAZOWi7EWp8CFoNjf2yfO13pqYm5xOLY5h0ucl55adm_0LPIYH-CGoKt7OV0piifT64ybKJ9No_c/s2548/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-09-16%20234013.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="892" data-original-width="2548" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju9ISNeZYBAkejXg7pNq0SlPO8NO7ZG0lKC5vkxiEJAb_bbp4PrUOLfwfbJmK3u8yauF9u8ZB_-Jy68zMnixogWbSEcxDYha1ebGYqUneUmwLvx0z7XAZOWi7EWp8CFoNjf2yfO13pqYm5xOLY5h0ucl55adm_0LPIYH-CGoKt7OV0piifT64ybKJ9No_c/w400-h140/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-09-16%20234013.png" width="400" /></a></div><br /><p style="text-align: left;">これは次の記事で紹介する予定のものですが、PCの画面上にMSXの画面がそのまま表示されていると思います。倍率も選べるので、3倍くらいにして表示すれば文字も大きく見え快適にプログラミングできるんじゃないかと思います。</p><p style="text-align: left;"><br /></p><p style="text-align: left;">とりあえず現場からは以上です。</p><p style="text-align: left;"><br /></p>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-71481610702965992522023-08-01T19:54:00.001+09:002023-08-01T19:54:33.596+09:00[Chromebook] 以前買ったKB着脱式のChromebookを閲覧専用タブレットとしてセッティングしてみる<p>先日、プライムデーで新調したFireHD8(2022)を閲覧系タブレットに仕立てるという記事を書きましたが、</p><p><b>プライムデーで買った8,980円のAmazon FireHD8(2022)を閲覧系タブレットとして使う</b><br /><a href="https://mobileff.blogspot.com/2023/07/amazon-firehd82022.html">https://mobileff.blogspot.com/2023/07/amazon-firehd82022.html</a></p><p><br /></p><p>タブレットになるという意味では、よく考えてみると、去年の春に買ったChromebookがありまして。</p><h3 class="post-title entry-title" style="background-color: white; color: #212121; font-family: Ubuntu, sans-serif; font-feature-settings: normal; font-kerning: auto; font-optical-sizing: auto; font-stretch: normal; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variation-settings: normal; line-height: normal; margin: 0px;"><span style="font-size: small;">[Chromebook] ASUS Chromebook Detachable CZ1が30,000円を切っていたので買ってみた #chromebook<br /></span><div style="text-align: left;"><span style="font-weight: normal;"><span style="font-size: small;"><a href="https://mobileff.blogspot.com/2022/04/chromebook-asus-chromebook-detachable.html">https://mobileff.blogspot.com/2022/04/chromebook-asus-chromebook-detachable.html</a></span></span></div><div style="text-align: left;"><span style="font-weight: normal;"><br /></span></div><div style="text-align: left;"><span style="font-size: small;"><span style="font-weight: 400;">非力系のChromebookではありますが、さすがにFireHD8よりは性能が良いはずなので、こいつに同じ環境を入れたらどうなるか、実験してみることにしました。</span></span></div><div style="text-align: left;"><span style="font-size: small;"><span style="font-weight: 400;"><br /></span></span></div><div style="text-align: left;"><span style="font-size: small;"><span style="font-weight: 400;"><br /></span></span></div></h3><h2>YouTube ReVanced</h2><div style="text-align: left;"><span style="font-size: small;"><span style="font-weight: 400;">Chromebookは標準でGooglePlayを搭載していますが、YouTube RevancedはGooglePlayからはインストールできないので、APKをダウンロードしてインストールしてみます。</span></span></div><div style="text-align: left;"><span style="font-size: small;"><span style="font-weight: 400;"><br /></span></span></div><div style="text-align: left;"><span style="font-size: small;"><span style="font-weight: 400;">しかしながら、FireHD8のときは個別に許可を与えればインストールできた野良APKはChromebookではそのままインストールすることができません。</span></span></div><div style="text-align: left;"><span style="font-size: small;"><span style="font-weight: 400;"><br /></span></span></div><div style="text-align: left;">Chromebookで野良APKをインストールするためには、ChromebookをDeveloper Modeというモードに変更する必要があります。</div><div style="text-align: left;"><br /></div><div style="text-align: left;">ChromeOSの更新設定で「Stable」「Beta」「Dev」というチャンネル設定がありますが、これのことではありません。</div><div style="text-align: left;"><br /></div><div style="text-align: left;">さらに、CZ1はキーボード着脱式で起動後にキーボードを認識する仕様のため、普通に検索して出てくる方法ではDeveloper Modeの設定には入れません。</div><div style="text-align: left;"><br /></div><div style="text-align: left;">そういった機種向けの設定方法(電源投入時に押すキーが違う+それ以降の設定手順)は、以下のWebサイトにわかりやすくまとまっているので、こちらをご覧になってみてください。</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><b>IdeaPad Duet ChromebookをRecovery Mode, Developer Modeを有効にする</b></div><div style="text-align: left;"><a href="https://www.rootlinks.net/2021/03/16/ideapad-duet-chromebook%E3%82%92recovery-mode-developer-mode%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B/">https://www.rootlinks.net/2021/03/16/ideapad-duet-chromebook%E3%82%92recovery-mode-developer-mode%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B/</a></div><div style="text-align: left;"><br /></div><div style="text-align: left;">どうでもいいですが、このDeveloper Modeに入る際に鳴るビープ音がとてもうるさいので、真夜中に作業する際には注意しましょう。</div><div style="text-align: left;"><br /></div><div style="text-align: left;">Developer Modeに入れれば、無事に野良APKもインストールできます。</div><div style="text-align: left;"><br /></div><div style="text-align: left;">キビキビ!っていうほどではないですが、それなりに動いてくれます。</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><h2 style="text-align: left;">Brave</h2><div style="text-align: left;">次はアドブロック系のブラウザ、Braveをインストールします。</div><div style="text-align: left;">BraveはGooglePlayでも提供されているので、インストールはごく簡単です。</div><div style="text-align: left;"><br /></div><div style="text-align: left;">ちなみに、なんとChromeOSでもBraveをデフォルトのブラウザに設定できてしまいますw</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><h2 style="text-align: left;">その他のアプリ</h2><div style="text-align: left;">Amazon Prime Video、AbemaTV、ColorNote、PushBulletあたりもGooglePlayから普通にインストールします。</div><div style="text-align: left;"><br /></div><div style="text-align: left;">アドブロックアプリのAdguardもDeveloper Modeに入っていれば、野良APKでダウンロードできます。初期設定が通常のAndroidを前提にしているので、ちょっと戸惑う部分もありますが、一応設定はできているようです。</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><h2>使い勝手は?</h2><div>今回の試みは、一般的なChromeOSタブレットには結構有効な方法じゃないかと思うのですが、中の人が対象としたCZ1は、画面サイズが大きく、カバー込みのタブレットの重量がそれなりにあるので、ソファやベッドでごろ寝しながら使うというには、重さとフットプリント的にちょっと厳しい感はあるかもしれません。</div><div><br /></div><div>2in1で比較的薄くて軽い機種があれば、割とお勧めできるかなと思いました。</div><div><br /></div><div>現場からは以上です。</div></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-75056129180504056002023-07-23T09:00:00.003+09:002023-07-23T19:08:34.545+09:00Unihertz Titan PocketでZonePane(ぞーぺん)を動かすときのハマりポイント #ZonePane #Mastodon #TitanPocketMastodonには既に投稿済みですが、備忘のためにブログにも。
<br />
<br />今年に入ってTwitterがマスク傘下になって荒れに荒れており、サードパーティクライアントが締め出され、広告も減り、わけもわからずアカウントが凍結されまくり、と、徐々に安住できるような状況でなくなりつつあるので、中の人はTwitterの代替としてはMastodonを中心に使っていこうかなと思っていたりします。
<br />
<br />Twitterのときから愛用(といってもレジストはしていないのですがスミマセン)しているクライアントアプリでTwitPaneというアプリがあるのですが、このTwitPaneの作者さんがZonePane(ぞーぺん)というMastodon/Misskey対応のクライアントアプリを精力的に開発してくださっています。
<br />
<br />中の人はTwitPaneの使い勝手は素晴らしいと思っているので、当然、MastodonもZonePaneで利用しておりまして、手持ちのあらゆる端末にインストールしているのですが、何故か、Titan Pocketでだけ、動かないのです。具体的には、起動しかかって、強制終了してしまうような状況です。
<br />
<br />全然原因分からずで、しばらくは諦めだったのですが、なんのきっかけだったか、たぶん、エラー時のログを採取した際になんとなく当たりをつけたんだったと思うんですが、動作しない原因が分かり、解消できたのでその方法を記録しておきます。
<br />
<br />実はZonePaneが起動しなかったのはTitan Pocketの独自機能「スマートアシスト」の「アプリ制限」によるものでした。アプリ制限とはバッテリー消費やメモリ消費を抑えたりするために、アプリケーションごとに動作の制限をAndroidシステム側から積極的に行うことが出来る機能です。
<br /><br />ZonePaneについては、中の人はDeployGateから入手、アップデートをすることにしているのですが、このDeployGateに対してTitan Pocket側からのアプリ制限がかかっていると、ZonePaneが起動しないということがわかりました。
<br />
<br />なので、DeployGateに対するアプリ制限を「制限なし」に変更しました。
<br />
<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEPE6Nff7wekBD4unoBPLkhrdE5ij99BDKocpyLW6lst-9Zl4jtUYmQkqiYQ93pbnB4OTpMf7zle1vpoiOvV7D82kHQ-ouRhJxGdFhInrQRrhuDpH6KtgwjjO2CiSrmNMITv0wyHz-v5gtixrQRzaHPoedLShPsdiXVfkUnWQSajcSSr2ycmR1ZEQ1X8sG/s720/b8d58c5e6051d2b8.png" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="720" data-original-width="716" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEPE6Nff7wekBD4unoBPLkhrdE5ij99BDKocpyLW6lst-9Zl4jtUYmQkqiYQ93pbnB4OTpMf7zle1vpoiOvV7D82kHQ-ouRhJxGdFhInrQRrhuDpH6KtgwjjO2CiSrmNMITv0wyHz-v5gtixrQRzaHPoedLShPsdiXVfkUnWQSajcSSr2ycmR1ZEQ1X8sG/s320/b8d58c5e6051d2b8.png" width="318" /></a><br /><br />これで、TitanPocketでもZonePaneが動作し、快適なMastodonライフが送れるようになりました。<div><br /></div><div>※ただし、そもそも、GooglePlay経由で普通にインストールしているとこの問題は起きない可能性があります。 </div><div>
<br />現場からは以上です。<div><br /></div><div><br />
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>
<div><br /></div></div></div>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-18942780565168655642023-07-22T22:14:00.002+09:002023-07-22T22:14:33.898+09:00Unihertz Titan Pocketのバッテリーを交換してみた #Unihertz #TitanPocketUnihertz Titanシリーズを愛用している中の人ですが、Unihertzは故障等の際の交換用のパーツを通販しているなかなか珍しいメーカーです。<div><br /></div><div><b>mobileFF's blog: Unihertz Self Repair Programで自分で修理用パーツを取り寄せられるようになった話</b><br /><a href="https://mobileff.blogspot.com/2022/10/unihertz-self-repair-program.html">https://mobileff.blogspot.com/2022/10/unihertz-self-repair-program.html</a><br /><div><br /></div><div><br /></div><div>昨年末、Unihertz Titan(初代)についてはすでに交換していたりします。</div><div><br /></div><div><b>mobileFF's blog: Unihertz Titan(初代)のバッテリーを交換してみた #UnihertzTitan<br /></b> <a href="https://mobileff.blogspot.com/2022/12/unihertz-titan-unihertztitan.html">https://mobileff.blogspot.com/2022/12/unihertz-titan-unihertztitan.html</a></div><div><br /></div><div><br /></div><div>Titan Pocketについては問題なく使えていた(と思っていた)のですが、最近メインで使っていたSurface Duo(初代)がシステムアップデートのトラブルで再起動頻発するようになり、一時的にメイン端末をTitan Pocketに戻すことにしようとした、ということがありました。
<br />
<br />メイン端末を変更するとなると、SIMカードも入れ替えないといけません。
<br />Titan Pocketは純正のケース(カバー)に包まれているのですが、このケースを外した瞬間に、重大な事象が発生していることに気付かされました。
<br />
<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI-YJl8UvnZEPg5v8SAFT7EXnKAsJ5nBSeKQLYn96uFGggbv3dDp3gzHdMReDaavql0mOvhaPBVX3PaSF2kmFMO5FgwljhjEc-0QSs3x0Pfds3vJza-KOyLU0gBUoJqeHyrEnegOBy9tAOnXNwnE0VGUs_i0HF3XtT_dg2I9wnYJDuUHZ9LiULcmwNlQlD/s900/_YYQygQF.jpeg" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="523" data-original-width="900" height="233" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI-YJl8UvnZEPg5v8SAFT7EXnKAsJ5nBSeKQLYn96uFGggbv3dDp3gzHdMReDaavql0mOvhaPBVX3PaSF2kmFMO5FgwljhjEc-0QSs3x0Pfds3vJza-KOyLU0gBUoJqeHyrEnegOBy9tAOnXNwnE0VGUs_i0HF3XtT_dg2I9wnYJDuUHZ9LiULcmwNlQlD/w400-h233/_YYQygQF.jpeg" width="400" /></a><br /><br />Titan Pocketもバッテリーが膨張している・・・
<br />
<br />膨張のせいで、背面のX形のカバーが浮き上がってしまい、外れてしまっています。
<br />
<br />これはまずい!ということで、Titan PocketのバッテリーもUnihertzから購入し交換することにしました。
<br />
<br />Unihertzは日本国内にも発送拠点を持っているらしく?そこに在庫があれば、もっと早かったんだろうと思うのですが、残念ながら本国からの発送になってしまったため、注文から到着までは3週間ちょっとという感じでした。
<br />
<br />ということで到着したので、いざ交換となるのですが、TitanPocketは初代Titanと違って固定用の金属の土台的なものがセットになっているのが印象的でした。
<br />
<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8uYkRdFnwM3FAX_y__Ork8zuR0LfPWoC94SBKg-tgSpSMkHfpitqDTp6Fim1nVMoOZurTz9JJcgGPtGkhCQ94Y-xg4DzupMi_4Fw6d7AhYFyLRTg_h_Lt6PSTxkoAIJl_9JuGlfWf6-j6JVz9rlyevswhPdDPaxrObJjiQPIp4Y0CcmW-_sok-5_o61M1/s2665/06d3e3b3e4ba684a.jpeg" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="2665" data-original-width="2524" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8uYkRdFnwM3FAX_y__Ork8zuR0LfPWoC94SBKg-tgSpSMkHfpitqDTp6Fim1nVMoOZurTz9JJcgGPtGkhCQ94Y-xg4DzupMi_4Fw6d7AhYFyLRTg_h_Lt6PSTxkoAIJl_9JuGlfWf6-j6JVz9rlyevswhPdDPaxrObJjiQPIp4Y0CcmW-_sok-5_o61M1/w379-h400/06d3e3b3e4ba684a.jpeg" width="379" /></a><br /><br />交換の手順はごくごく簡単で、まず背面の4つのネジを外します。 </div><div>外装部分のネジは全て星形(プラス・マイナスではない)ので、それ用のドライバーを用意する必要があります。
<br />
<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYvBzHyrOWDzrKyNbMcAacHaGl_ieq_gKzdGx9H7Ce7K_OpggvKmnAnT1hZSJVNU5mHUkMVX-nmgXZ1Bo8Q61MYKn-oaGVwb9fcTzGtv2jYpl2Cwj133IVCXBCbYsWnwH2-TH1IavOIz4I4pqOQzDlmxaR5U9lJnWFk2fYDrpbGse6CJpcBV49evDdusZ-/s2100/IMG_1421.HEIC" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="1575" data-original-width="2100" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYvBzHyrOWDzrKyNbMcAacHaGl_ieq_gKzdGx9H7Ce7K_OpggvKmnAnT1hZSJVNU5mHUkMVX-nmgXZ1Bo8Q61MYKn-oaGVwb9fcTzGtv2jYpl2Cwj133IVCXBCbYsWnwH2-TH1IavOIz4I4pqOQzDlmxaR5U9lJnWFk2fYDrpbGse6CJpcBV49evDdusZ-/w400-h300/IMG_1421.HEIC" width="400" /></a><br /><br />中の人は、アマゾンでこんなドライバーセットを買ったのですが、かなり重宝します。おすすめです。
<br />
<br />
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe>
<br />
<br />ということで4つのネジを外し、背面の裏蓋の切れ目のところに爪をかけて慎重に殻割りします。完全に主観ですが、Titan Pocketの裏蓋は比較的外しやすいかなと思います。
<br />
<br />裏蓋を外すといきなりバッテリーがお出ましになりますが、バッテリーを外すには、さらに内部のパーツを一つ外さなくてはなりません。
<br />
<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjBm1hwL7bj8H1-wuSXvGeryBRTpEdOugIxd7D3eI6p5VV1rN2VD2yHiTEQsTnp96nTBOIzjNObGun85bZ_Z9PPDPnEvjxY3DCLeNgaZblQ_Sfbo68AIeotyZFKR9kZVX_3dkn148Lg3dJ5OFvoBxp9LkQI2VscUybBj1fF8vWc9WqTtpFJs87ojoP2kk3/s2325/IMG_1422.HEIC" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="1423" data-original-width="2325" height="245" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjBm1hwL7bj8H1-wuSXvGeryBRTpEdOugIxd7D3eI6p5VV1rN2VD2yHiTEQsTnp96nTBOIzjNObGun85bZ_Z9PPDPnEvjxY3DCLeNgaZblQ_Sfbo68AIeotyZFKR9kZVX_3dkn148Lg3dJ5OFvoBxp9LkQI2VscUybBj1fF8vWc9WqTtpFJs87ojoP2kk3/w400-h245/IMG_1422.HEIC" width="400" /></a><br /><br />上の写真に赤丸したところのネジ3箇所を外します。外装部のネジは星形ですが、内部の部品のネジはプラスでした。また、この3カ所のうちの1カ所は、分解改造してないことのチェックのためなのか、シールのようなもので塞いでありますので、剥がしてネジを外してください。</div><div>
<br />このパーツを外すと、バッテリーと本体を接続しているコネクタが見えますので、</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWTA6E5HiEY5_pklL51Nq0tbaf63CRsyj9uiI72EPXXFV_0XcCU9WPi5Z8xsYy1lb5VIkJ6fDN70oFIVgC5dW0GZrSHzOnIhJ9zOJOJdioSxwhzTsovYFDNBeevQGZ79HXQbubTaEGkmr7ghCTjEAyKeKBSHdKo35B3V4J6hCNp7p4OHjqItfPmNU8xfN2/s2245/IMG_1423.HEIC" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1473" data-original-width="2245" height="263" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWTA6E5HiEY5_pklL51Nq0tbaf63CRsyj9uiI72EPXXFV_0XcCU9WPi5Z8xsYy1lb5VIkJ6fDN70oFIVgC5dW0GZrSHzOnIhJ9zOJOJdioSxwhzTsovYFDNBeevQGZ79HXQbubTaEGkmr7ghCTjEAyKeKBSHdKo35B3V4J6hCNp7p4OHjqItfPmNU8xfN2/w400-h263/IMG_1423.HEIC" width="400" /></a></div><br /><div>これを外し、右側を少し持ち上げるとバッテリー全体が外れます。</div><div>
<br />あとは、新しいバッテリーを取り付け、逆の順番にパーツをつけて蓋をしてネジを締めれば完了です。
<br />
<br />かなり簡単あっさりです。
<br />これで、我らがTitan Pocketの寿命が延びました。
<br />これからもどんどん使っていきます!</div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><br /></div>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B096PHZQ2M&linkId=ab392f1b6026b2d27c6e620b03374472" style="height: 240px; width: 120px;"></iframe> mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-40654680524595908982023-07-16T00:14:00.006+09:002023-07-16T17:11:11.398+09:00 プライムデーで買った8,980円のAmazon FireHD8(2022)を閲覧系タブレットとして使う<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpQ1a2DNUUZR-kuOC0AXgavJ74LktM3Av_HbIFNqTBvi-flo-VzNYxSVcMiM-fwVJ_et8G2df7Z9VRPKhrHVosryCKKhhpaueJELYscz_q9-jT4fMLoC3_J6MmbXLzyxdcplbxChKDdISw2tmE314hvJt8U0CVXIaApw6a-Q4gxXCl_5HMm-2qPRm75oEW/s1280/Screenshot_20230715-234045_115216.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1280" data-original-width="800" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhpQ1a2DNUUZR-kuOC0AXgavJ74LktM3Av_HbIFNqTBvi-flo-VzNYxSVcMiM-fwVJ_et8G2df7Z9VRPKhrHVosryCKKhhpaueJELYscz_q9-jT4fMLoC3_J6MmbXLzyxdcplbxChKDdISw2tmE314hvJt8U0CVXIaApw6a-Q4gxXCl_5HMm-2qPRm75oEW/s320/Screenshot_20230715-234045_115216.png" width="200" /></a></div><br /><p>プライムデーで買ってみたAmazon FireHD8(2022)。</p><p>
<br />
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
</p><p><br /></p><p>スペックが残念なのは知っていましたが、以前に買った2017verでもYouTubeの閲覧くらいはできるので、動画とかの閲覧に限ればそれなりに使える手応えはありました。</p><p>じゃあ買い替えなくていいじゃんとなるんですが、なんで買い替えたかといえば、OSバージョンの古さ。</p><p>FireHD8(2017)のOSはFireOS5。今は違うのですが、当時はFireOSのバージョン番号=Androidのバージョン番号だったので、Android5.x相当とかなり古いです。</p><p>BlackBerryOS10のAndroidランタイムが4.4相当だったのと比べればまだマシとは言うものの、対応しているアプリはかなり限られます。閲覧系でニーズの高いアドブロック系のアプリがほとんど入りません。</p><p>閲覧専用に仕立てるのに、広告ストレスを許容するのはなあ…ということで、OSバージョンを上げたいがために2022を買ったというわけです。</p><p>FireHD8(2022)のFireOS8はAndroid11相当なので、大体のアプリはGooglePlay以外の入手経路でよければインストールできます。</p><p>まずはYouTube Revancedを入れます。こちらは公式サイトから。</p><p><b>YouTube Revanced</b><br /><a href="https://revanced.io/youtube/">https://revanced.io/youtube/</a></p><p><br /></p><p>次はブラウザですが、アドブロック系で強いのはBraveかなと思います。</p><p>Braveは基本GooglePlayからのインストールですが、APKを探してインストールします。</p><p>もちろん自己責任ですが、中の人はAPKPureというサイトを使っていて、専用のストアアプリも入れてしまいました。BraveもAPKPureからインストールします。</p><p><b>APKPure</b><br /><a href="https://m.apkpure.com/jp/">https://m.apkpure.com/jp/</a></p><p><br /></p><p>Braveに関しては専用のアカウントを作らなくてもQRコードで同期するとブックマークを複数端末、PC間で共有できるので結構便利です。アカウント不要というのが個人的には評価ポイントです。</p><p>Amazon系のサービスは、もちろん最初からアプリが入っていますのでインストール、セットアップは不要です。</p><p>AbemaTV、InstagramあたりのメジャーアプリはAmazon AppStoreにあるのでそこからインストールします。</p><p>さらに、通信レベルで広告をブロックするAdGuardもインストール。こちらは公式サイトからapkを直接ダウンロードしてインストールします。</p><p><b>AdGuard<br /></b><a href="https://adguard.com/ja/welcome.html">https://adguard.com/ja/welcome.html</a></p><p>その他、閲覧系ではないですがちょっとしたテキスト、メモの共有にColorNoteを入れました。Googleアカウントでログインすれば、こちらも複数端末でメモを共有できます。</p><p>実はBraveの同期をする際、何故かQRコードがFireで認識せず、認証テキストを入れる羽目になったので、そのためにColorNoteを入れたというところがあります。</p><p>本来はその手の用途だと中の人的にはPushBulletを使いたいところなのですが、GooglePlay開発者サービスが必須なので、いったん見送り。まあゴニョればGooglePlay入れれるのは知っているのですが、あえて使わない方向で揃えてみたく。</p><p>これで、大体の動画閲覧系用途は広告にあまりお目にかからずに楽しむことができるようになりました。</p><p>ちなみに、Brave+AdGuardの組み合わせは結構強力なので、サービスによってはアプリより、Webでみたほうが快適な場合もあります。</p><p>たぶん、AbemaとかはWebのほうが広告カットされて快適かもです。Abemaはアプリじゃないとフルスクリーンにできなかったりいろいろ制約はありますが、そこを許容できるならアリかも。中の人はアプリ使うまで途中で広告入るの知らなかったですというくらいには、バッチリブロックしてくれますw</p><p>FireHD8のスペックは基本低いですから、ちょっと負荷をかけるとすぐくたびれてしまいます。動画を見ながらオンスクリーンにして他のアプリを使おうとかすると、すぐに動作緩慢になるので、欲張っていろんなことをさせようとしない心がけが肝心です。</p><p>現場からは以上です。</p>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09BG5KL34&linkId=8c0c3c7fe264910a774777b9cb58ca39" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-55696239471504004802023-07-06T23:24:00.004+09:002023-07-16T13:49:02.661+09:00[今更誰得] Dynabook EZ486でブログ記事を書いてみるテスト<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEpNXVgfGW0hoKBGAXnUThNLIKaFCljsvYLTKt1aSX059KHUc6Z7gJ_m5k-6M9daKNphVJiByLAGrgTphwhOwST6PhxXobv5usEdEkf_Wc6mM5j51M785bXvLrvYIlVdhn9bml2B8MTMFliOF1cy0Rd1ekuNNywpZU0fvYcm2N9nGSm633Euc7QJVyX29S/s3840/IMG_20230702_015236.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="2880" data-original-width="3840" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEpNXVgfGW0hoKBGAXnUThNLIKaFCljsvYLTKt1aSX059KHUc6Z7gJ_m5k-6M9daKNphVJiByLAGrgTphwhOwST6PhxXobv5usEdEkf_Wc6mM5j51M785bXvLrvYIlVdhn9bml2B8MTMFliOF1cy0Rd1ekuNNywpZU0fvYcm2N9nGSm633Euc7QJVyX29S/w640-h480/IMG_20230702_015236.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ホントに実機で打ってますよ</td></tr></tbody></table><p><br /></p><p>せっかくDynabookEZ486を入手したので、内蔵の一太郎dashでブログ記事を書いてみるテスト。ちなみに、DynabookといえばATOK搭載でおなじみだが、当時は「ブログ」というものが当然まだ存在していないので、ブログと書いても変換候補に出てこない。</p><p>考えてみると、この環境はポメラと似た感じではあるが、残念ながらDynabookにはWiFiはおろか有線LANポートも付いていない。PC側にデータを渡すとなると、シリアル通信か外部メディアを使う必要がある。</p><p>幸いこのDynabookEZ486にはすでにGOTEKが取付済みなので、USBメディアでの受け渡しは可能である。</p><p>さらに、今動かしているDynabookEZ486は液晶も辛うじて生きてはいるのだが、10分くらい使っているうちに真っ暗になってしまうので、外部CRTへVGA接続して使っている。</p><p>液晶画面はモノクロだから仕方ないとして、CRTに繋いでもこんな感じのモノクロ画面である。DOSのソフトだからそういうものなのか?とも思えるが、FILMTNやSEは普通にカラーで表示されるので、単純にノートPC仕様なのかもしれない。</p><p>入手してこれといった使い道があるわけではないのだが、当時、ROMでDOSやアプリケーションソフトを内蔵していて、起動が早く、価格もまあ当時としては比較的入手しやすい価格帯だったこの機種は一度使ってみたかった、という感じでヤフオクで落札したので、手に入っただけで何となく満足してしまっている。</p><p>ここまで書いてきて、ファイルの保存方法がよくわからないことに気づく。</p><p>一太郎はESCキーでメニューが出るんだな・・・</p><p><br /></p>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B00FVRAN5E&linkId=33155bd8128d098771e461d4ed6f8aab" style="height: 240px; width: 120px;"></iframe>
mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0tag:blogger.com,1999:blog-3992170577391362431.post-34206694084164000922023-05-13T22:12:00.003+09:002023-05-13T22:12:27.016+09:00[PB-1000] MD-100互換ストレージを入手! #CASIO #ポケコン<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXouKS83lhZvHNK7WTK9sRBUnKUsK1-sdoy7pqPUGXKAlZxXXwurN6NcBpX6jhoM82qSWLQ1TtyZ7bGY58igqFT6WZJq8OiJYZhK7MeHlQAdnd60IGPE0opCI4qTt_Nw2_Iq1dOe0_TwN1WkavVxHUoUvIpe9ptC3q4YzTWaVSW5qhLygNDKMyq54O9Q/s2516/IMG_1337.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1607" data-original-width="2516" height="204" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXouKS83lhZvHNK7WTK9sRBUnKUsK1-sdoy7pqPUGXKAlZxXXwurN6NcBpX6jhoM82qSWLQ1TtyZ7bGY58igqFT6WZJq8OiJYZhK7MeHlQAdnd60IGPE0opCI4qTt_Nw2_Iq1dOe0_TwN1WkavVxHUoUvIpe9ptC3q4YzTWaVSW5qhLygNDKMyq54O9Q/s320/IMG_1337.jpg" width="320" /></a></div><br /><p>実は随分前に入手済みだったのですが、記事にしていなくてすいません案件です。</p><p>ポケコンの液晶交換や周辺機器開発でつとに有名な ぽよこまだんな先生の手による「<a href="https://booth.pm/ja/items/4000994">CASIO ポケコン用 外部ストレージモジュール(MD-100A相当IF版)</a>」を去年の秋くらいに購入いたしました。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY2SXAw9JLvz2wwHKfjw53LnYZJRKcaFj7NmFzo_fNl70nnGCNWRDfdU1xN1eteIUQ99xkV8vCdgy93QJ2LKC_ntevQSezyIBSrPjmFMrovCIzST-fv23-T9SzHWs9BkORADQR3f31cCCM6V89P0lSN4-jqdzIZMl3nure8x7BtQZeigIyP-vL5cXOHw/s1590/IMG_1336.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1590" data-original-width="1414" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY2SXAw9JLvz2wwHKfjw53LnYZJRKcaFj7NmFzo_fNl70nnGCNWRDfdU1xN1eteIUQ99xkV8vCdgy93QJ2LKC_ntevQSezyIBSrPjmFMrovCIzST-fv23-T9SzHWs9BkORADQR3f31cCCM6V89P0lSN4-jqdzIZMl3nure8x7BtQZeigIyP-vL5cXOHw/s320/IMG_1336.jpg" width="285" /></a></div><br /><p>あまりにも普通に使えすぎて記事にすることがないw っていうくらい良いものです。</p><p>FDD機能の代替のみとは言え、MD-100自体とのフットプリントの差がエグいです。技術の進歩を如実に思い知らされますね。</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEityDlp6lOq2FUzybrCuCD8QaZU4ZqErEsq1D9TNDX5Q8qBgWBnAkeJZdVh97WwifuiGAZgJ4TgKlu0pxKC5wbWxu445PnOO-vJx0dzueosylPhC3_dr761eYdsf2Zla0s1231MyP3gp4rAljW1a1wANOzrc2X1ZZ_69F9lYHRKnmxyh2O292Sd1VDnBA/s3259/IMG_1338.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2335" data-original-width="3259" height="229" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEityDlp6lOq2FUzybrCuCD8QaZU4ZqErEsq1D9TNDX5Q8qBgWBnAkeJZdVh97WwifuiGAZgJ4TgKlu0pxKC5wbWxu445PnOO-vJx0dzueosylPhC3_dr761eYdsf2Zla0s1231MyP3gp4rAljW1a1wANOzrc2X1ZZ_69F9lYHRKnmxyh2O292Sd1VDnBA/s320/IMG_1338.jpg" width="320" /></a></div><br /><p>先日、MD-100のFDDをGOTEKに置き換える実験をしましたが、</p><p><br /></p><p><span data-offset-key="12f6p-0-0" style="background-color: white; color: #0f1419; font-family: "Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif; white-space: pre-wrap;"><span data-text="true"><b>mobileFF's blog: [今更誰得] CASIO PB-1000用外付けFDDのMD-100をGOTEKに付け替えて動かしてみた #カシオ #ポケコン</b>
</span></span><span style="background-color: white; color: #1d9bf0; font-family: "Segoe UI", Meiryo, system-ui, -apple-system, BlinkMacSystemFont, sans-serif; white-space: pre-wrap;"><span data-offset-key="12f6p-1-0"><a href="https://mobileff.blogspot.com/2023/03/casio-pb-1000fddmd-100gotek.html">https://mobileff.blogspot.com/2023/03/casio-pb-1000fddmd-100gotek.html</a></span></span></p><p><br /></p><p>これとてフットプリントはMD-100そのままですので、はっきり言ってこちらの互換ストレージを入手するほうが取り回し含めて全然便利です。</p><p><br /></p><p>強いて言えばストレージのバックアップをどうするかくらいです。GOTEKの場合はUSBのFDDイメージをバックアップしやすいというのはあるかもしれませんが、そのくらいですね。</p><p>ただ、フットプリントは小さいものの、ストレージ機能単体なので、これを使って、既存のプログラム(PCなどに保存している)をストレージに入れる場合、</p><p></p><ol style="text-align: left;"><li>PB-1000をFA-7/MD-100に装着</li><li>PC→PB-1000へプログラムをRS-232Cで転送</li><li>PB-1000に互換ストレージを付け替える</li><li>互換ストレージへ保存</li></ol><p></p><p>と、ちょっとだけ手数がかかります。</p><p>・・・とかなんとか思っていましたら、ぽよこま先生には別の作品が!</p><p><br /></p><p><b>CASIO PB-1000/AI-1000/PB-2000C用USBシリアル変換モジュール(FA-7相当IF版)</b><br /><a href="https://ac-shop.booth.pm/items/4701646">https://ac-shop.booth.pm/items/4701646</a></p><p><br /></p><p>これを使えば、付け替えも簡単になりますね!</p><p>さらに、もっともっと簡単にするには・・・両モジュールを統合した、プリンタ端子以外MD-100互換モジュールを、ぜひ開発していただいてですねww</p><p>言うは易しでホントすいません。</p><p>現場からは以上です。</p><p><br /></p><p><br /></p><p><br /></p>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XP6ZFML&linkId=e7ac7f94f2f175c16a860aad953b35de" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09799VTBL&linkId=a1e468f5c3a19ab6f77d3b354f3cbec4" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B01FTZKVWM&linkId=f5e42e0094b1064663676e35bc5eb9e5" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09TJ6G5KV&linkId=c9dac7ceac23e35a6bc8825516a801eb" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B09J4TPZDD&linkId=5336dc62bef247b91a664b4cca2b68db" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0B5DP53D9&linkId=30c34e6ae333978e4c977190e62315e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0841HHLT9&linkId=988f87605a5ad9219cca8f9ab1a8f35b" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B08GXTHNZQ&linkId=a93ee57051e43201f82b169fbb459450" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B0722J415P&linkId=012434aa8937c658854fbd1a9cafac06" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B06XVQCQ9J&linkId=b4b189e9b36c420f65c29fc98eabb1e2" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07Y9SSNCS&linkId=5b69c65fa482c677ff9f95bd06579047" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" sandbox="allow-popups allow-scripts allow-modals allow-forms allow-same-origin" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B07QZJYYDM&linkId=b5d79fd2d357925223253098b602eb00" style="height: 240px; width: 120px;"></iframe>
<iframe frameborder="0" marginheight="0" marginwidth="0" scrolling="no" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=mobileff-22&language=ja_JP&o=9&p=8&l=as4&m=amazon&f=ifr&ref=as_ss_li_til&asins=B00FVRAN5E&linkId=33155bd8128d098771e461d4ed6f8aab" style="height: 240px; width: 120px;"></iframe>
mobileFFhttp://www.blogger.com/profile/15594400448424175944noreply@blogger.com0