はじめに
皆さんこんにちは。最近、MSX0を入手したので、昔触れたMSX BASICを思い出しながら、再学習しながらプログラミングをしています。
MSX0ですが、ありがたいことにIP ReachableでTeraTeamで接続して作業できるんですよね。Windows端末上でプログラム組んで、コピペでMSX0に流し込んで、runして動作確認。小規模のプログラム開発はこの方法で捗りそうですね。
とはいえ、ズボラな私はもうちょっと楽したくて、画像等々のバイナリファイルもWindows端末からコピペできると理想的ではと思い、勉強の題材にとまずはbase64のデコーダを作ってみました。
(現状ある程度実装が進んでいる状況から報告しておくと、転送速度が芳しくなく、SDカード抜き出してファイル転送したほうがおそらく早いことが見えてきています…)
デコーダ実装
以下実装コードです。
10 DIM I$, O$, B$
20 INPUT "Please input the text using base64:"; I$
30 GOSUB 100'CALL Base64 decoder (I$:Input Text, O$:Output Text, B$:Base64 table)
40 PRINT "Result:"; O$
50 END
100 'Base64 decoder (I$:Input Text, O$:Output Text, B$:Base64 table)
110 DIM B(4), OB(3)
120 DIM T$, C$
130 LET O$ = ""
140 LET B$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
150 FOR I = 1 TO LEN(I$) STEP 4
160 T$ = MID$(I$, I, 4)
170 EP = 4
180 IF I + 4 > LEN(I$) THEN IF INSTR(T$, "=") > 0 THEN EP = INSTR(T$, "=") - 1
190 FOR J = 1 TO 4
200 B(J) = 0
210 NEXT J
220 FOR J = 1 TO EP
230 B(J) = INSTR(B$, MID$(T$, J, 1)) - 1
240 NEXT J
250 OB(1) = B(1) * 4 + B(2) \ 16
260 OB(2) = (B(2) AND 15) * 16 + B(3) \ 4
270 OB(3) = (B(3) AND 3) * 64 + B(4)
280 FOR J = 1 TO 3
290 O$ = O$ + CHR$(OB(J))
300 NEXT J
310 NEXT I
320 LET O$ = LEFT$(O$, LEN(O$) - (LEN(T$) = 2) - (LEN(T$) = 1))
330 RETURN
実行結果
実行結果はTeraTeamの出力結果を採用しています。残念ながらMSX上はUNICODEは表示されませんので。
run
Please input the text using base64:? 5pys5pel44Gv5pm05aSp44Gq44KK
Result:本日は晴天なり
Ok
MSX0上の表示は以下のようになります。なにがなにやらですね。
MSX-BASICあれこれ
MSX-BASICの書籍を読み切れてないせいか、まだまだ疑問点多いですね。勉強せねば。
・配列の初期化、効率的な方法ないですかね
・シフト演算子は、、無いですよね
・FORループを途中で抜けるときは、GOTOとかで飛ばしちゃってよいものか
現場からは以上です!