MSX0にコンソール経由でファイルを送信

## はじめに
皆さん、こんにちは。
前回、以下の記事で、MSX-BASICでbase64デコードを実装しました。
今回はここから少し応用して、MSX0にコンソール経由でファイルを送信しようと思います。

https://qiita.com/enu7/items/64a82098a38ec5ff77fa

今回やることの流れを以下にまとめました。
1.MSX0にコンソール接続し、base64デコーダを起動
2.送信対象ファイルをbase64エンコードする
3.コンソールからエンコードテキストをbase64デコーダに入力(コピペ)
4.MSX0上でデコードされたファイルを確認

先に報告しておきますと、現状３がかなり力技で、スマートな方法を模索中です。

## デコーダ実装
まずは実装です。前回の実装は、標準入力でテキストを受け、デコードして標準出力する作りにしていましたが、今回は入力を1行受け付け→デコードしファイル出力するをループする実装に変更しています。
```bbcbasic
10 DIM F$, I$, O$, B$, T$, C$, B(4), OB(3):CLEAR 10000
20 LET F$ = "OUTPUT.BIN"
30 OPEN F$ FOR OUTPUT AS #1
40 CLOSE #1
50 INPUT "Please input the text using base64:"; I$
60 IF I$="`" THEN END
70 GOSUB 100 'CALL Base64 decoder (I$:Input Text, O$:Output Text, B$:Base64 table)
80 GOSUB 1000'CALL SAVE(O$:decoded text)
90 GOTO 50
100 'Base64 decoder (I$:Input Text, O$:Output Text, B$:Base64 table)
110 LET O$ = ""
120 LET B$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
130 FOR I = 1 TO LEN(I$) STEP 4
140   T$ = MID$(I$, I, 4)
150   EP=4
160   IF I + 4 > LEN(I$) THEN IF INSTR(T$, "=") > 0 THEN EP = INSTR(T$, "=") - 1
170   FOR J = 1 TO 4
180     B(J) = 0
190   NEXT J
200   FOR J = 1 TO EP
210     B(J) = INSTR(B$, MID$(T$, J, 1)) - 1
220   NEXT J
230   OB(1) = B(1) * 4 + B(2) \ 16
240   OB(2) = (B(2) AND 15) * 16 + B(3) \ 4
250   OB(3) = (B(3) AND 3) * 64 + B(4)
260   FOR J = 1 TO 3
270     O$ = O$ + CHR$(OB(J))
280   NEXT J
290 NEXT I
300 LET O$ = LEFT$(O$, LEN(O$) - (LEN(T$) = 2) - (LEN(T$) = 1))
310 RETURN
1000 'SAVE APPEND(O$:decoded text)
1010 OPEN F$ FOR APPEND AS #1
1020 FOR I = 0 TO LEN(O$)
1030   PRINT #1, MID$(O$, I+1, 1);
1040 NEXT I
1190 CLOSE #1
1200 RETURN

```
## 実行結果
では、簡単に試してみましょう。「`」入力で待ち受けを抜けます。
```
run
Please input the text using base64:? 5pys5pel44Gv5pm05aSp44Gq44KK
Please input the text using base64:? `
Ok
files
A:\
ACCEL   .BAS ANALOG_G.BAS
DHT_KNJ .BAS I2C     .BAS
INFO    .BAS PERFORMC.BAS
RCONSOLE.BAS SEND2NET.BAS
TOUCH_G .BAS TREE    .BAS
WIFILVL .BAS OUTPUT  .BIN
Ok
```
OUTPUT.BINが出力されました。出力されてファイルが正しいかを確認したいところなんですが、MSX-BASICでファイルを出力するコマンド…。思い当たりません。無ければ、作るしかありませんね。
```bbcbasic
10 INPUT "表示するファイル名を入力してください:"; F$
20 OPEN F$ FOR INPUT AS #1
30 FOR I = 1 TO 9999
40   LINE INPUT#1, LI$
50   PRINT LI$
60   IF EOF(1) THEN 90
70 NEXT I
80 CLOSE #1
90 END
```

```
run
表示するファイル名を入力してください:? OUTPUT.BIN
本日は晴天なり
Ok
```
無事、デコードできました。さて、それでは本題です。

## 1.MSX0にコンソール接続し、base64デコーダを起動

MSX0のコンソール接続はシリアルコンソール、リモートコンソール、リモートコントロールパネルの3種類が提供されています。そのうち、コピペできるのは、前段の2つで、文字列送信に最適なのは、レスポンスの早い有線接続のシリアルコンソールです。
MSX0をUSBでPCと接続し、COMポートから接続しましょう。(詳細はマニュアルを見てくださいませ)
デコーダーのプログラムを起動し、以下の待ち受け状態にしましょう。
```
run
Please input the text using base64:? 
```

## 2.送信対象ファイルをbase64エンコードする

さて、送信対象です。画像ファイルを送信したいと思います。
MSXのSCREEN5のBSAVE形式のファイルを用意します。Myna Nazoware様の以下のサイトで作成しました。

https://nazo.main.jp/prog/retropc/gcmsx.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106997/e958e187-d995-621e-05c7-7b1def712a85.png)
Qiitanかわいい…
「BSAVE形式でダウンロード」を押下し、任意のファイルで保存してください。サンプルでは"msx_20231015151621687.SC5"で保存しました。

さて、Windows上でbase64エンコードするコマンドですが、PowerShellを利用して簡単にできるようですが、WSLのbase64が使い慣れてますし先々パイプライン処理も試したいしということで、WSLのbase64を使用しました。

```bash
$ base64 msx_20231015151621687.SC5
/gAAn3YAAP///////////////+zMwiIqqqqqqqqqIiIiIszMzMzMzMzMzCIiIiIiIiIiIiIiIiIi
IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiLMzMzMzMzMzMzCIiIiqqqqqqqqoiIizM7/////
////////////////////////////////////////////7MzCIiqqqqqqqqqqIiIiIszMzMzMzMwi
IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiLMzMzMzMzMwiIiIiqq
qqqqqqqiIiLMzv/////////////////////////////////////////////////jzMIiKqqqqqqq
qqqqoiIiIszMzMzMIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi
IiIszMzMzMIiIiKqqqqqqqqqqqoiLMzO////////////////////////////////////////////
/////+PMwiIqqqqqqqqqqqqqIiIiIizMIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi
（後略)
```

## 3.コンソールからエンコードテキストをbase64デコーダに入力(コピペ)
あとは、MSX0上のbase64デコーダにエンコードテキストをコピペするだけです。全部選択して、張り付けましょう！いや、ちょっと待って。
```
run
Please input the text using base64:? /gAAn3YAAP///////////////+zMwiIqqqqqqqqqIiIiIszMzMzMzMzMzCIiIiIiIiIiIiIiIiIi
Please input the text using base64:? IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiLMzMzMzMzMzMzCIiIiqqqqqqqqoiIizM7/////
■
```
動かなくなってしまいました。一度に送り付けるとバッファでも溢れてしまうのかもしれません（要確認）。
仕方ないので1行1行入力しましょう。
```
run
Please input the text using base64:? /gAAn3YAAP///////////////+zMwiIqqqqqqqqqIiIiIszMzMzMzMzMzCIiIiIiIiIiIiIiIiIi
Please input the text using base64:? IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiLMzMzMzMzMzMzCIiIiqqqqqqqqoiIizM7/////
Please input the text using base64:? ////////////////////////////////////////////7MzCIiqqqqqqqqqqIiIiIszMzMzMzMwi
Please input the text using base64:? IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiLMzMzMzMzMwiIiIiqq
Please input the text using base64:? qqqqqqqiIiLMzv/////////////////////////////////////////////////jzMIiKqqqqqqq
Please input the text using base64:?
(もうちょっと続く)
```
が、400行くらいで力尽きました。。

## 4.MSX0上でデコードされたファイルを確認
Myna Nazoware様の画像変換(Image Converter)サイトで公開されている画像表示プログラムを利用します。ファイル名を出力したバイナリファイルの名前に変更しましょう。サンプルではOUTPUT.BINにしています。
```bbcbasic
10 SCREEN 5
20 CLS
30 VDP(9)=VDP(9) OR &H22:REM NO USE TRANSPARENT COLOR & SPRITE OFF
40 'VDP(10)=VDP(10) OR &H80:REM Y=212
50 BLOAD "OUTPUT.BIN",S
60 COLOR=RESTORE
70 IF INKEY$="" THEN 70
80 END
```
実行した結果が以下です。
![無題の動画 ‐ Clipchampで作成 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106997/004b8fb6-610b-63fb-22fc-cac2331b014e.gif)
一瞬ですが、表示されました！

## 振り返り
base64エンコードしたテキストを全量張り付けができなかった時点で負け確定でしたね。1行ずつのコピペに1時間ほどかけ心が折れました。コンソール通信の仕様を把握して、プログラムの改善を図りたいところです。

現場からは以上です！