SHARP PC-1350でプログラミング その5

f:id:PocketGriffon:20201221000317j:plain

近しい人が他界して、気持ち的に時間的にプログラム出来る状態では無かった。

そんな事情のため、レトロ関連もしばらくお休みしてました。

ようやく少し落ち着いてきたので、再開しようと思う。

 

さて、前回まででデバッガがある程度動くようにまでなった。

この先は…SC61860のプログラミングを…していく予定!

…だったので、必要という建前のモト、アセンブラを作ったw

 

結局作っちゃったアセンブラ

まぁ作るだろうなと思っていたし、読んでる皆さんも思っていたと思うけれども、やっぱり作っちゃったSC61860アセンブラ

作る前からなんとなく分かっていたけれども、アセンブラというかコンバータというか。

難しい解析が必要ないのは良いね!

これほどまで「ニーモニック=バイナリコード」が直結してるCPUも珍しい。

 

Z80の場合、ロード命令は「LD」であり、これだけでは何の命令なのか分からない。

ちゃんと命令コードを調べるためには、「LD A」まで調べて、初めて命令コードが3Ehだと分かる。

これに対してSC61860は、例えば「LIA」とくれば命令コードが$02と決まる。その後ろに1バイトのオペランドを付けてやれば命令が完成する。

アセンブラを作る上で難しいとか複雑とかいう事がさっぱり無いのだ(^^;;

 

そんな安直な構造の中で、ちょっとだけ実装が面倒だったのがCASE1、CASE2命令。これはもう独自の書き方をするようにしてしまった。他の諸先輩方が開発したアセンブラを、あろうことか何も参考にせず好きに作ってしまった(-_-;

シャープのマニュアルでは「CASE1、CASE2」となっていたが、別の本では「SET、CASE」になっていた。これは…どっちが主流なんだろ?気持ち的には「SWITCH、CASE」に変えてしまいたいが、さすがにニーモニックを変更するワケにもいかないw

 

f:id:PocketGriffon:20201221002820j:plain
上は開発中に出力したリストだ。

プログラムは実験コードがたくさん含まれている。プログラムっぽいところは「RS-232Cから1バイト受信」のコードをそのまま書いてる。私が作ったモノでは無いw

まぁこんな感じでアセンブルは出来るようになった。

アセンブラの記述自体は6301アセンブラと良く似ている。

ラベルは先頭に'_'が付けばローカルラベルだ。

今回はロケーションカウンタもちゃんと入れたw

当たり前だが、オペランドの部分には「VRAM+5*WIDTH+10」のような計算式を入れられる。

 

HELLO WORLDを作ってみる!

やっと…ようやくSC61860のプログラムを書いてみるところまで来た!

ここにくるまでに作ったモノは…

・逆アセンブラ

アセンブラ

エミュレータ

・デバッガ

…と、なんとなくフルセット作った気がする!

さぞかしSC61860は見慣れただろう……と思うでしょ??

それが…いざHello Worldを作ろうとしたら、

コードが全く思い浮かばない!!

Hello World」の文字列をスクリーンバッファへコピーして、VRAM表示をしてやれば画面に出るはず…なのだが、メモリコピーの手法がアタマに出て来ないw

やっぱり…エミュレータ作ってもSC61860のプログラムは作れるようにならなかったのだw

f:id:PocketGriffon:20201221002855j:plain

※このプログラムは未完成…というか何もありません↑

 

というわけで、今回はここまで。

次回までにHello Worldのプログラムを完成させ、デバッガで動かしてみるよ!

少し時間が掛かるかも知れないけど、気長に待っていて欲しい(^^)

 

 ではまた次回!(^-^)ノ

SHARP PC-1350でプログラミング その4

f:id:PocketGriffon:20201210225807j:plain

このところプライベートでいろいろあって、なかなか作業に集中出来ない。

少しずつでも進めておかないと、作ってるプログラムの構造を忘れるw

そんな事情もあり、最近のペースダウンは激しい。

今回は途中経過として書き記しておこうと思う。

 

PC-1350デバッガ

機能として「デバッガ」と呼んで良いんだろうか…と思いつつも、プロジェクト名をDebuggerにしてるのでそう呼んでしまいたいw

f:id:PocketGriffon:20201210230336p:plain

なんと全てテキストベースな画面となっているw

ウィンドウプログラムが出来ないとかではないが、テキストでいーじゃん…という気持ちから自分の開発しやすさを選んでしまった。

ANSI準拠のC言語cursesライブラリで作られているので、おそらくWindowsLinuxでも動くはずだ。CPUのエンディアンに依存している部分がほんの一部あるので、CPUによってはそこだけ変更が必要だけど。

途中、何度も「無理せずC#で書けば良かった」と後悔したシチュエーションがあったが、無理矢理Cのまま。次回書くチャンスがあればC#にする(^^;

 

画面上部がPC-1350のLCD表示そのもの、右下が(外部)メモリダンプ、その下が内部RAM。

真ん中にレジスタ関連が表示されていて、左下がコンソールとなっている。

対話式のコマンド入力デバッガだ。

 

f:id:PocketGriffon:20201210230930p:plain

↑コンソールで「D8000」とすれば、外部メモリダンプの表示が切り替わる。

 

f:id:PocketGriffon:20201210231032p:plain

↑逆アセンブル、トレース実行なども可能だ。

アセンブラはコメントをつけてしまった。どーしてもSC61860のニーモニックが覚えられず、それっぽいコメントを書くことで理解するようになってしまった。こうなるともう書かない限りはニーモニック覚えられないね…。

 

ちょいと面白い機能としては、実機へのキー入力を入れてみた。

f:id:PocketGriffon:20201210231253p:plain

コンソールで["](ダブルクオート)の後ろに文字列を書くことで、それがそのままPC-1350のキー入力として入れられるようにした。

f:id:PocketGriffon:20201210231439p:plain

RUN MODEで[RUN]すれば実行する事も可能だ。

 

f:id:PocketGriffon:20201210231520p:plain

実行終了後のテキストバッファを見ることも出来る。

 

もちろん、先日まで頑張って入れてた疑似RS-232Cも使えるため、ホストマシンでBASICのテキストを書き、それをこのデバッガにロードした後に実行、なんて芸当も出来る。

必要な機能がまだまだ入っていないが、この先は使いながら充実させていくのが良さそう。

ブレークポイントやライトブレークなどは必須になるだろうな…。

 

諦めたことなど

構想段階にはあったけれども諦めた機能もいくつかある。

その代表格が「前の状態に戻す」という機能。V20エミュレータには入っているのだが、実は実装上の問題がありメモリをバカ食いする事が分かった。分かってはいたけれども想像以上だった(^^;;

SC61860の場合、メインメモリに加えて内部メモリの保存も必要となる。それにレジスタ1セットなどを考えると、1回命令を実行するたびに64バイトくらいの保存が必要だ。

SC61860の実行速度は768KHzらしい。そして1命令の実行ステートは平均して4くらいだろうか。そう考えると、1秒間に768000/4=192000命令、1命令に64バイトのデータ保存となると、実に1秒間で12,288,000バイト(11.72MB)の容量が必要となる。10秒保存したら117MBだ。ちょっとやり過ぎ感がある(T-T)

限られたシチュエーションで使うためだけに入れるのはアリかも知れないが、それよりはステートセーブ(この状態を保存)をいくつか用意するだけでも似た効果はあるだろう…と思った。

 

この先は…

とりあえず入れておきたいのは、「指定した関数の処理時間を計る」機能だ。

やっぱりプログラマとしては実行時間は気にしていきたい。いちいち数えるのは面倒なので、デバッガでちょちょっと数えられる機能を入れておきたい。

 

あとはアセンブラと含めた開発環境の構築だろうか。

アセンブラで出力したシンボル情報を読めたりしたら立派なデバッグ環境となる!

そこまでやってようやくプログラムを組もうかな…って気になれると思う!

 

ちなみにこれだけ作ってもPC-1350の事、あんまり理解できてないw

ブラックボックスだらけだ!

ちょっとペース落ちるけれども、もう少し作っていくからね!

 

ではまた次回!(^-^)ノ

SHARP PC-1350でプログラミング その3

f:id:PocketGriffon:20201205221738j:plain

エミュレータにプログラムを流し込みたい!

PC-1350でのプログラミング…と言いつつ、なぜかエミュレータの開発日記になっているが、まぁそこは置いておいて欲しい。

近い将来、ちゃんとSC61860でプログラム組むから……きっと!(^^;

 

エミュレータを作ってる目的は、自作する予定があるプログラムの開発効率を上げたいからだ。なるべく楽ちんに作りたい。プログラマは自分がラクするために苦労をする生き物なのだ!(^^;;

BASICプログラムにしてもマシン語プログラムにしても、普段から慣れたエディタが使えるメリットは計り知れないし、シリアルで通信してるとトライアンドエラーの時間だってバカにならない。こっちはロードしてる時間分だけ寿命が縮むんだよ!(全員そう)

どうあってもエミュレータへプログラムを流し込む事を実現しなくては!!

 

エミュレータとして動いているPC-1350に、自分で作ったプログラムを流し込むとしたら、どんな方法があるだろうか?実にたくさんありすぎて選択に悩むが、それぞれに一長一短がある。

いくつかの例をそれぞれ見ていってみよう。

 1、直接メモリに値を書き込んで実行させる

2、疑似カセットテープからデータを流し込む

3、疑似シリアル(RS-232C)からデータを流し込む

 

1、直接メモリに値を書き込んで実行させる

 一番てっとり早いのはコレだ。マシン語コードをメモリに読み込ませ、PC(プログラムカウンタ)の値を設定してエミュレータを駆動してやれば良い。

この方法は、エミュレータ開発時に良くやる。ホントに良くやるw

面倒な手続きが必要なく、かつ即座に結果が見られる利点がある。

逆に問題となるのが、実機で実行した時とはいろんな場所のメモリ内容が違ってしまう事だ。実機で「LOAD→RUN」した時とは明らかにメモリの内容が食い違う。これが厄介な問題を引き起こす事も多いので、出来るだけ合わせておきたいのだ。

あとBASICのプログラムは中間言語の形式に変換しなければならないのでだいぶ面倒だ。

 

2、疑似カセットテープからデータを流し込む

2番目のカセットからの読み込みについては、今回はあまり検討しなかった。まずカセットを擬似的に実装するメリットは、CLOADMでマシン語データを直接読み込める点だ。PC-1350の場合、外部とマシン語データを直接やりとり出来るのは、このCLOADM、CSAVEMだけ…だと思われる。

 

逆に私的なデメリットとしては、カセットへの出力フォーマットが全く分からない事だ。資料を探してみたがどうも見つからない。アスキーデータとして出力しているのか、それとも中間言語のまま出力しているのかも分からない。おそらく中間言語のままだろう…推測。

だとすると、外部でテキストを中間言語のバイナリに変換するツールが必要になるのかも知れない…上のメモリ直書きと同じ問題をはらんでいる。コレはさすがにホネが折れそうで、手軽に出来る感じがしない(T-T)

 

3、疑似シリアル(RS-232C)からデータを流し込む

 そして今回は3番目の擬似的なRS-232Cを介してプログラムをエミュレータ内部に流し込む方法にチャレンジしてみた。以下、詳しく書いていきたい。

 

擬似的なシリアル通信

RS-232Cで通信出来るパソコンは、ほぼ例外なく「RS-232Cから1バイト受信する」という関数が用意されている。PC-1350でも$F22A(ROMのバージョンが$FFF0=3の場合。$FFF0=203では$EE27)というアドレスにそのルーチンがある事が分かっている。

これは「シャープポケットコンピュータ 機械語マニュアル」に書かれていた。

f:id:PocketGriffon:20201205225128j:plain

こういう有用な情報をメーカーが出してくれるのは本当にありがたい(^-^)

ひとつ補足をすると、この関数の戻り値(受信したデータ)が入っているのは、本に書いてあるBレジスタでは無く、Aレジスタだw

 

やりたいことの皮算用としてはこんな感じのイメージだ。

・読み込ませたいファイルは、エミュレータ実行時に引数として渡しておく

・「1バイト受信」の関数を改造し、ファイルから読んだデータを1バイトずつ渡す

・PC-1350はまんまと騙されてファイルをメモリに書き込んでいく

 

特にBASICのプログラムは、アスキー形式のままPC-1350に渡すことが出来る上に、PC-1350が内部で中間言語に変換してくれるサービスまでしてくれるので一石二鳥だ。

 

エミュレータに特殊な事をさせたい場合、普段はSC61860の命令をエミューレーションしているところに、何かしらの方法で制御を奪う必要がある。これもいくつかの方法が存在するが、今回はSC61860の命令を新設する事で実現した。

f:id:PocketGriffon:20201205230121j:plain

今回は$CFのコードを独自に拡張をした。「1バイト受信」関数の先頭に$CFを埋めておき、必要なレジスタや状態を真似た上でエミュレータにデータを返してやれば良い。
書くと簡単だが、実際にやってみても大して難しい話ではない(^-^)

 

さぁ、じゃあ実際にやってみよう!

f:id:PocketGriffon:20201205231305j:plain

…LOADって表示されてから先に進まなくなっちゃた…。うーん…通信に必要な初期化はBASIC ROMが事前にやってくれるはずで、エミュレータとしては何も考えなくて良いはずなんだけどなぁ…ぐぬぬ

この先を調べようと思ったら……そう、「1バイト受信する」プログラムの解析が必要だ。

解析しなくても行けちゃわないかと思ったけど甘かった(T-T)

 

割り込みを使わないシリアル通信

この↑の言葉で、いろんな事情を想像出来る人は結構な経験者だ(^^;

ここでシリアル通信とは何かを語るつもりはないので簡素に言うと、少ない信号線を頼りに1ビットずつ送られてくるデータを組み立てるようなプログラムになる。

聞き慣れた「ボーレート、パリティ、ストップビット」などの言葉が、プログラム中にコードとして出てくるのを読み解かねばならない。

 

まずはエミュレータをちょろっと改造して、逆アセンブラを作ってみた。画面で見ているだけでは厳しかったので、プリントアウトして書き込みをしながら解析を進めていった。

f:id:PocketGriffon:20201205232222j:plain

殴り書きなので小さい写真でw

情報として必要なのは、「どこで1バイトの結果を得ているのか」「その時のレジスタの値は?」「メモリの値は?」等々だ。これらを上手に組み立ててPC-1350を騙さねばならない。

 

まずプログラムを大雑把に追い掛けていき、ビット長の確定、スタートビットのチェック、1バイト取り込み、ストップビット判定、パリティチェックなどを洗い出した。この辺りは標準のRS-232Cという事で、基本に忠実に作られていた助かったww

 

しかしまぁすごいプログラムだ!クリティカルな場所では1ステートの戦いとなっている。こっちの分岐でこのステートだからこっちの分岐ではNOPが何個入る…や、おそらく分岐でのステートを計算した上での無駄分岐とか、最適化がされているので読み解くのが簡単ではない!

普段、FIFOバッファと割り込みのあるマシンばかり触っていたので苦労が少なかったが、それらがない状態で通信しようとするとこうなるのか…と先駆者の苦労を垣間見た!

関数のサイズ的には300バイトくらいの大きさなんだけど、その道のプロがガチガチに最適化した300バイトなので解析する方も大変だ!

 

ようやく手当てする箇所がわかり、プログラムを組み込むことに。アセンブラも用意していないので、基本はハンドアセンブラだ。でも大したサイズじゃないので大丈夫(^^)

さあ実行してみよう!

f:id:PocketGriffon:20201205233225j:plain

…あ!!…これはとても厄介な状態!(T-T)

エミュレータで一番怖いのは「それっぽく動いちゃうけどなんか違う」ってヤツだ。今回のERROR 4 というのは「ラインナンバーがない」というエラーだ。データの受信に失敗しているのかと思ってモニタリングしてみたが、データはきちんと読んでいる。だけどダメ。

こりゃ…相当厄介だぞ(T-T)

 

ちなみに送り込んでるBASICプログラムはこんな感じ。

f:id:PocketGriffon:20201205233708j:plain

なんのたわいもない、数行のBASICプログラムだ。

これの行番号が無いとおっしゃりたいのですね、PC-1350さまは(T-T)

さぁこれをデバッグしないといかんぞ。

 

試してみたところ、1行のプログラムだったら問題無く読み込める事が分かった。実行する事も出来るので、アスキー中間言語変換部分はちゃんと動いてると思って良いだろう。

 10 WAIT 0

はOKだけど、

 10 WAIT 0

 20 PRINT "HELLO"

はダメなのだ。

この2つの違いといえば、改行コードが入ってるかどうかの違いだ。

問題はそこにあるに違いない…と思い探していくが、どうしても問題が「そこ」にたどり着けない。ここにきてエミュレータが出力する数十メガバイトの逆アセンブルリストとダンプリストと格闘するハメになった。現象が絞りきれない分、逆アセンブラを見る範囲のリストも長くなる。

 

PC-1350は受信バッファが256バイト用意されている。アドレスとしては$6D00固定であり、これはプログラムにハードコーディングされているため動かせない。実際には専用で用意されているのではなく、通信時のみ別の意図で使われていた領域を間借り(破壊)するのだ。ロード出来る1行のサイズが256バイトに制限されているのは、こういった事情によるものだ。

 

分かってきた事としては、受信バッファの先頭4バイトにゴミデータが入るらしい…という事だった。1行目は問題がなく、2行目の先頭に入るのだ。

そしてそのゴミデータを、BASICの中間言語変換プログラムが読み込んで「行番号がない」というエラーになる…というプロセスだった。

 

問題は「なぜゴミデータが入ってしまうのか」だ。

そもそもエミュレータが完全に動いているわけではないので、もしかしたら実装した命令の解釈が間違っていてメモリ破壊が起きているのかも知れない。逆アセンブラの出力を信用して良いのか?レジスタとメモリの割り付けは本当に正しいのか?…などなど…自分で作ってるがゆえに疑うべきところが無限に見つかるw

こうなってくると記憶すら疑わしくなってきて「あれ?CRって$0Aだっけ?$0Dだっけ?」と基礎的なところまで調べ直すハメになったww

 

そして逆アセンブラリストと格闘する事数時間、ようやく分かった驚愕の事実!

なんと!「1バイトを受信する関数」の、途中のアドレスから飛び込む場合がある事が判明!

ちょっとー!プログラムのお作法としてどうなのコレは?(T-T)

関数の途中から飛び込まれる事を想定していなかったので、レジスタの値やメモリの内容が食い違っていておかしな動作をしていた…というのがバグの原因だった。

これは……さすがに分からない!!(^^;;;

 

結局、最初に考えた「1バイトを受信する関数」の改造法を考え直す必要があり、再度あのコテコテに最適化されたプログラムと格闘するハメになった。難しいのは、途中から飛び込まれるアドレスはずらせないので、その部分は活かしたままで改造する必要がある事だ。ちょっとしたパズルが必要となった(T-T)

その部分を改良し、一通りデバッグを済ませた状態がコレ。

f:id:PocketGriffon:20201206001003j:plainf:id:PocketGriffon:20201206001023j:plain

↑流し込んだプログラムをLISTしたところ

f:id:PocketGriffon:20201206001132j:plainf:id:PocketGriffon:20201206001150j:plain

↑実行してみたところ
当然だが、実機とエミュレータとでは1ドットも変わらぬ同じ結果となる(^^)

 

やっとここまで動いたー!

ちなみにここまでBASICを転送する話に終始していたが、マシン語データはどーするのさ…という疑問が残ったかも知れない。

マシン語のデータは、いきなりメモリに書き込んでやりCALL アドレスとすれば良いのだ。BASICと違い、マシン語は変換も入らなければ下準備もいらない。ちょっと乱暴に扱ってやるくらいが丁度良いのだ!(^-^)

 

ところで…初めてSC61860のコードを解析する事になったのがシリアル通信プログラムだった…これはこれで酷くない??…と自分でも思ってしまうのだが…(^^;;;

 

さてさて、ようやくプログラムも動くようになってきたので自作プログラムを…とはまだまだならない。この先も充実させたい事がいくつかあって、そちらを先にやろうと思う!

もう少し「環境オタク」の大暴走にお付き合いくださいませw

 

ではまた次回!(^-^)ノ

SHARP PC-1350でプログラミング その2

f:id:PocketGriffon:20201203153358j:plain

エミュレータ開発状況

「PC-1350でプログラミングをしてみたい!」

…というピュアな気持ちから始めている開発環境作りの一環としてのエミュレータ

段々と動き始めましたw

↑上の画面は、起動直後に「MODE」キーを(擬似的に内部で)押してプログラムモードに切り替えたところ。

 

f:id:PocketGriffon:20201203153617j:plain

↑プログラムを入力してLISTをしたところ。

実際にキーを打ち込んでるワケじゃないw

プログラムでは文字列を用意し、それを適宜I/Oポートの状態に変換しながら出力している。PC-1350のBASIC ROMがI/Oポートを読み取り、エミュレータ内部に取り込まれていく…という感じ。

上のBASICプログラムは↓こんな感じでプログラムに直書きされている。

f:id:PocketGriffon:20201203154339j:plain

見て分かるとおり、やっつけな感じがすごいw

「a」は内部的にMODEキーに変換され、「b」はENTERだw

PC-1350(というかほとんどのBASIC)は、行番号付きの文字列が入力されると、それを内部コード(中間コード)に変換をしてメモリに配置する。そのため、ENTERが押されたあとは忙しい事が多く、次のキーデータを入れるまでの「間」が必要となる。そんな辺りも試してみてはタイミングを手作業で調整していってる。

 

f:id:PocketGriffon:20201203154804j:plain

実行するとこんな感じ(^^)

 

f:id:PocketGriffon:20201203154858j:plain

ちなみにメモリはフル実装としたw

白状しちゃうと、メモリ容量はプログラム的に何もしていない。

でもCE-202M(16KB)があると認識されているので、おそらくメモリに書いて読んでとやってみて、実際にデータが書き込めたらメモリがある…と判断しているのかな…

そのうちちゃんと調べてみようと思う。

 

せっかくのPC-1350なので、グラフィックスにも挑戦してみたい!

ということでこんなプログラムを書いてみたw

f:id:PocketGriffon:20201203155121j:plain

f:id:PocketGriffon:20201203155224j:plain

同じプログラムを実機で実行すると、約9秒掛かるけれども、エミュレータなら一瞬だ。

 

この先の予定

なぜこのエミュレータを作っているのかといえば、この先の開発をラクにするために他ならない。エミュレータで既存の何かを動かそうという気持ちはないが、きっと普通に動く(^^;

 

最終的に目指している開発環境は、ホストマシンで開発→シリアルで実機に送り込み実行だ。もちろんそのまま実機を利用して開発をしても良いけれども、老い先短いおっさんとしては、出来るだけラクをしたい気持ちが強いw 若い時みたいなパワーは出せないよ!(ToT)

 

開発中のエミュレータの、シリアルとファイルを繋げてやり(言葉にすると簡単だけどw)、実機と同じような感じでプログラムを読み込ませ、実行出来る準備を整える。そうすれば実機で動いているのと(基本は)変わらないはずだ。

 

あとはアセンブラをどうするか…。

エミュレータを作ってみて(内部では逆アセンブラも動いてる)分かってきたが、アセンブラコードとしてはとても素直なモノのようだ。カッコがあったり無かったりしてアドレッシングが変わってしまうような事もない。先日開発した6301用のアセンブラをちょろっと改造すれば、半日も掛からずに作れてしまいそう…うむむどうしようw(これは作りそうな予感)

 

ここまで作ってみて気が付いたが、まだ1行もSC61860のコードを書いてないw

実際にそのCPUでプログラムを作ったことが無かったとしても、エミュレータは問題なく作れるって事だ(^^;;

 

ではまた次回!(^^)ノ

SHARP PC-1350でプログラミング その1

f:id:PocketGriffon:20201130231837j:plain

手強いぞ!SC61860!!

PC-1350のCPUであるSC61860、想像以上に苦戦してる!!(T-T)

以前から書籍を眺めながら「理解するのに大変そうなアーキテクチャだなぁ…」と思っていたのだが…実際にやり始めたら、その認識すら甘かった事に気づかされた!!

当時SC61860使っていた方々、本当に良く理解&覚えられましたね!!!

このCPU覚えたら、他のCPUなんて怖くないわって思った(^^;;

CISC色の非常に強いCPU、嫌いじゃ無いなーw

CPUのアーキテクチャを云々言えるほどの身分ではありませぬが、思ったことをつらつらと。

 

ニーモニックが直感的じゃない

命令のニーモニックを見て「これはロード」「これは演算」ってパッとわかりにくくて苦労してる。

例えば「STP」、想像では「Pレジスタをどこかにストア」なんだけど、実際には「Aレジスタの内容をPレジスタに代入」。

「IXL」は「XレジスタをインクリメントしてDPレジスタへ代入し、そのDPの示すアドレスの外部RAMから1バイトをAレジスタにロード」。

ひとつずつ覚えていくしかないんだろうけれども、パッとどんな命令があったのか忘れるw 機能を思い出したとしてもニーモニックに結びつかない。これがプログラミングする時には結構キツい(T-T)

 

Qレジスタが壊れる?

命令によってはQレジスタが破壊されるモノがある。どれが破壊されてどれが破壊されないのかを覚えておかないと、Qレジスタを使える範囲が分からない。

そもそも命令実行時に、関係の無いレジスタが破壊されるのってアリなの?(T-T)

 

バイナリはビッグエンディアンだけどスタックにはリトルエンディアン

これはちょっと自信なさげだけれども、そうっぽい。

例えばLIDPのバイナリは「$10 $12 $34」でDPレジスタに$1234が入る。だけどPC=$1234をスタックにプッシュ(CALLなど)すると、メモリには「$34 $12」の順で書かれる。

私の思い違いだろうか……汗

 

シフト命令でZフラグが不定

シフト命令を実行した後、答えがゼロになってもZフラグに反映されない。私の中に「8bit CPUで8bitの演算をした時にはフラグが変化する」という固定概念があったおかげでハマりまくった(T-T)

 

他にも気になった事としては、DIDL(DPレジスタの下位バイトへのロード)はあるのに、上位へのロードが無い、とか、MVWDとMVBDの違いはWord/Byteではなくて、参照するのがIレジスタかJレジスタの違い…などなど。

各命令に特記事項が多くて、ご老体の脳みそでは覚えられない…(^^;;

 

習うよりも慣れろ!!!

どのCPUでもそうだけど、とにかく書いていくしかないんだよね…そして目と脳みそを通じてニーモニックに慣れていくしかない!

というわけで!

f:id:PocketGriffon:20201130230139p:plainf:id:PocketGriffon:20201130230201j:plain

PC-1350エミュレータを作ってみた!!

 

「ワンパターンだなお前!」とか言うなかれ!(ToT)

やっぱりCPUそのものの動きを書いてみる事が、ニーモニックはどうあれ内部処理は理解できるはずだ。実際、相当深いところまで理解できた気がする(そうでなければ動かない)。

その上で気が付いた事がいくつもあった…という事だ。

 

現状ではようやく画面に「RUN MODE」と表示されプロンプトが出たところ。VRAMを可視化する外部ツールでようやく動作を確認した。動いてるというよりは「やっと動いた」感じ(^^; まだ実装していない命令も多いので、これからまだまだ苦労せねばならないw

 

ROMの吸い出し

最初は単純に逆アセンブラを作ってみようと思っていたのだが、資料を見れば見るほど苦労しそうだったので、エミュレータを作った方が理解が出来るだろう…と思ったのだ。

で、エミュレータを作るためには、どうしてもPC-1350のROMが必要だ。

 

PC-1350は$0000〜$1FFFに内部ROM(CPU内部にあるらしいROM)、$8000〜$FFFFに外部ROMがある。

 

このうち、外部ROMはBASICからでも簡単に読める。そこでPEEK(アドレス)で読んだデータを、RS-232C経由でホストへ送るプログラムを書いた。転送速度よりも正確さを大事にしたため、データ転送が重くなり、32KBを転送するのに2時間以上も掛かったw

 

そして鬼門の内部ROM。こちらはBASICから読めない(読んでも0が返ってくる)。理由はさっぱり分からないがそういうものらしい。…というわけで、ネットで調べてみると別の機種用だったが目的が果たせそうな情報があった。それをPC-1350用に改造+上記のBASICプログラムにてホストへ転送する事が出来た。

ROMを吸い出すだけで、丸1日掛かったよ…orz

 

今回の目的は…

本来の目的は、SC61860でプログラムをする事であり、エミュレータを作る事じゃないw マジメにちゃんと作ってみたいと思っているので、そのための環境整備だと思って欲しい!

遠回りかも知れないが、私にはこういうやり方の方が性にあってる(^^;;

さすがにアセンブラまで作ったりはしないだろうけれども……汗

 

また中間報告入れていきます!

ではまた次回!(^-^)ノ

SHARP PC-1350の通信環境を整える!

f:id:PocketGriffon:20201127152454j:plain

せっかくPC-1350を復活させたので、プログラムしてみようって気になってきた!

以前は挫折してしまったポケコンCPU「SC61860」のマシン語プログラミングにも挑戦してみたい。その後、「SC62015」(PC-E500シリーズのCPU)にステップアップして行けたら…と思う。

同じように若き日に辛酸をなめた方がいたら、一緒にチャレンジしてみよう!

大丈夫、私もSC61860は初めての初心者だ(^-^)

 

PC-1350本体で気にするところは?

気にするも何もPC-1350は1種類しかないやん?

私もそう思っていたんだけど、どうやらROMにバージョン違いがあるらしい。

メモリの&FFF0(ROM)の内容が&CEならばバージョン1、&03ならばバージョン2との事。

どちらの方がたくさん出回ってるのかは分からないが、うちにある3台のPC-1350のうち、2台はバージョン1、1台がバージョン2だった。

ならば…新しいであろうバージョン2で作っておいた方がいいのかも?

f:id:PocketGriffon:20201127155248j:plain

ただ、うちにあるバージョン2は液晶の左側がちょっと残念な状態だ。

まぁ文字を読むのは困らないので、これを気にせず使おうと思う!

貴重なマシンだからね!(落として割ったけどTT)←Twitter参照

 

あと気になるのはRAM容量。

PC-1350は標準でRAMが8KB載っている。

今回はマシン語であれこれしてみたいと思っているが、マシン語データを直接ロード出来ないマシンなので、いったんはBASICとして送り込む必要がある(あるよね?)。

そのため、少しメモリには余裕を持たせたい。

 

ウチにあるPC-1350には以下メモリが取り付けられている。

f:id:PocketGriffon:20201127161329j:plainf:id:PocketGriffon:20201127161403j:plainf:id:PocketGriffon:20201127161301j:plain

  CE-201M(8KB)

  CE-202M(16KB)

  CE-203M(32KB)

前回のブログにも書いたが、PC-1350は拡張メモリを16KBまでしか受け付けない。そのためCE-203M(32KB)はオーバースペックだ。半分は無駄となっている。もったいない(T-T)

 

そしてもうひとつ不思議な事。

それは…CE-201M(8KB)を装着すると、なぜか16KB増設される…。おかしいな…と思って何度もリセットしたり、メモリの書き替えテストしてみたりしてみたのですが、どれも正常値…。

見た目は普通のカードなんですが、もしかしたら改造されているのかも??

面白いので、当面はコレ(CE-201M)を使ってみようと思う!

 

通信環境は?

PC-1350の通信アダプタは、実はPC-E500と互換性がある。

これは、過去にPC-E500用のアダプタを自作してた時、たまたま気が付いたw

f:id:PocketGriffon:20201127165441j:plain

右が試作1号の「通信イチロー」、左が試作2号の「通信ジロー」だw

通信ジローでPC-E500と通信が出来るようになったが、通信速度が上がらなかった。今思えば、プルダウン抵抗というものが足りないのかも知れないが、当時(2年くらい前?)はそんなこと全く気が付かなかった。

この通信ジロー、PC-E500では上手に通信が出来なかったが、PC-1350では問題なく通信出来ていた。そんなもん??

 

その後、安定した通信環境が欲しくて、高松製作所のアダプタを購入した。

f:id:PocketGriffon:20201127170005j:plainf:id:PocketGriffon:20201127170028j:plain

いかにも「3Dプリンターで出しました〜」ってアダプタが良いです(^-^)

もちろん通信の安定性はバッチリ!

今回はこっちを使って通信環境作ろうと思う。

 

通信してみるよ!

PC-1350とホストマシン(私はMac使い)を実際に繋げてみる。

PC-1350側はホントに繋げるだけの単純めーかい。

f:id:PocketGriffon:20201127170921j:plain

さすがのベストフィット!

通信ケーブルが上向きに付けられるのがホントに助かってます。

多くのケーブルは横に出てしまうため、横方向にスペースが必要になって意外に大変!

 

Mac側はUSBで繋げるが、問題はソフトかと思う。

私はPCG-LinkMacを利用させてもらっています。

kyoshiaki.sakura.ne.jp

主にPC-G850を想定して作られているようですが、シリアル通信なら基本なんでもイケます。

私はPC-G850はもちろん、PC-1600K、PC-8201、HC-40、HC-88、そして今回のPC-1350でも利用する。マシンによってソフトを変えるのなんて覚えられないよ(T-T)

テキストファイルでもバイナリファイルでも送信出来るので、とっても便利だ!

 

…で、PC-1350で通信ってどうやるの???

まさにここから(^^;;;

他のマシンではLOAD命令のあとにディスクリプション、通信環境などを書いてやるパターンが多いんだけど、PC-1350もそうなんだっけっかな?←過去に一度やってる

そして不幸にもPC-1350のBASICをマニュアルを持ち合わせていない。

仕方ないのでPC-1360のマニュアルを参照してみる。

どうやら…先にOPEN、その後にLOADらしい。

 OPEN "1200,N,8,1,A,L,&1A" [RET]

 LOAD [RET]

(1200bps、ノンパリティ、データ長8ビット、ストップビット1ビット、ASCII、区切りコード(CRLF)、終了コード)

f:id:PocketGriffon:20201127174051p:plain

PCG-LinkMac側の設定は↑こんな感じ。

これで問題なく送受信出来るようになった。

ちゃんとフロー制御が効くようで、ノーウェイト送信してもPC-1350側が受け取ってくれる。1200bpsは遅いけれども、それでも手打ちするのに比べたら楽ちんだ!(^^)

 

あと便利だなーと思ったのは、実は上に書いたOPENのオプションは、デフォルト時の設定そのものなのだ。長々と書かなくても「OPEN[リターン]LOAD[リターン]」でロードが出来てしまう。これは便利!ファンクションキーを持たないポケコンでは重要な事だと思う(^^)

 

よーし、これでプログラムのロードセーブが出来るようになった。

これから少しずつ使って行ってみようと思う。

多分、SHARPポケコンに慣れている方ならば「なにを今さら」な情報が満載になると思うが、そこは生暖かく見守ってもらえれば…と思う(^^;;

 

ではまた次回!(^-^)ノ

ポタコン?! SHARP PC-1350

f:id:PocketGriffon:20201127013624j:plain

私が初めて手に入れたポケコンSHARPのPC-1350の思い出話をば(^^)

 

パソコンを触り始めた当時はヒトんちのPC-8001を中心に触っていて、他のマシンの事はほとんど知らない(というよりは知識と情報収集が追いつかない)状態だった。

そんな時、知り合いが突然(ホントに突然!多分、衝動買いw)、PC-2001という「手で持ち歩けるサイズ」のパソコンを手に入れてきた。

f:id:PocketGriffon:20201127015850j:plain

雑誌に広告が出て数日後に買ってきた気がするので、私もホンモノを見るのがそこで初めて!初めて見るモバイル系のマシンに大興奮!!

触らせてもらって、N-BASICととても良く似た文法を持つBASICに感動。こんな小さなマシンでも同じようなプログラムが動いちゃうんだ…と感心した覚えがある。

思えば私のモバイル人生はここから始まってる気がする。

 

その後、何年か後だが衝撃的にポケコンを手に入れる事になる。もうね…見た瞬間に惚れ込んでしまい、理屈とかどうでもいいからこのマシンが欲しい!と思ってしまった。

それがSHARPから発売されたばかりのPC-1350。

雑誌で写真を見た翌日にパソコンショップへ行った。当時は雑誌で掲載された頃には店頭に並んでいる事が普通の情報速度だったのだ。今は在庫が無いと言われたけど、この展示品でいいから売ってくれ!と詰め寄り、それを安めにゲットしたw

同時に増設メモリも欲しかったが、そこまでの予算がない。当面は増設なしで行くしかないか…と諦めた。

 

PC-1350とPC-2001のサイズ感はこんな感じ。

f:id:PocketGriffon:20201127021217j:plain

ふた回りくらい違うかも知れない。

重さの違いも相当なモノだ。

 

PC-1350の液晶の上には「PORTABLE COMPUTER PC-1350」と印刷されてる。ポケコンというよりはポタコンなのだ!

 

手に入れたPC-1350の使い方

PC-1350を手に入れてからというもの、生活の中心にPC-1350がある…と言っても過言では無いくらいの使い込み方をした。

標準メモリのPC-1350自体にはRAMディスクなどもなく、メモリ中に1つのプログラムしか覚えていられなかった。データレコーダーとカセットテープでピーガーやった覚えはあるが、それまで持ち歩いていた記憶が無いので、おそらく何か短いプログラムを入れてただけなんだと思う。

思いつくとプログラムを入れては実行させるという生活を長く続けたw

 

そんな生活をしているとPC-1350の電池がすぐに無くなってしまう。本体の駆動電池は、ボタン電池CR2032が2つの構成なのだが、当時は100円ショップなども無く、ボタン電池は基本高かった。何度か交換した後に「このままでは電池で破産する!」と気が付いたw

 

増設メモリを付けていなかったので、裏ぶたを外して電池の端子にセロテープか何かで線を取り付け、確か単1電池か単2電池のボックスを繋げるようにした!めっちゃ持ち運びしづらくなってしまったが、電池は死ぬほどもつようになった(^^;; このおかげで持ち運び期間が終了したw

 

せっかく新しいコンピュータを手に入れたのだから、マシン語を覚えたい!

そう思って、参考になりそうな本を買ってきた。

f:id:PocketGriffon:20201127022903j:plain

ウチにある当時買った本なのだが、今の時代に帯付きは非常に珍しいと思う。

なぜこんな綺麗に残ってるのかと言えば、当時の私はマシン語が全く理解出来ず、読む機会が本当に少なかったのだw

レジスタがメモリにある…みたいな構造の意味が分からず、早々に1度目の挫折をした!

 

その後、何度無くチャレンジしているのだが、今の今まで大きめなプログラムを作ったことが無い。せっかくなので挑戦してみたいと思ってる!

 

最近になって増設メモリを手に入れた。

f:id:PocketGriffon:20201127023901j:plain

増設してから気が付いたのだが、PC-1350は16KBまでしかメモリ増設が出来なかったらしい。MEMしても32KB増えている感じはしない(T-T)

f:id:PocketGriffon:20201127024043j:plain

しまったー…とは思ったが、後の祭り。このまま使い続けます(^^;

 

ポケコン道!

その後、PC-1246S→PC-E200→PC-E500→PB-1000などポケコンを渡り歩いたが、デザイン的に一番好きなのはPC-1350系!なんとなく色合いが好きというか。SHARPの銀色ポケコンに洗脳されたひとりなので、やっぱりこの雰囲気が好きw

f:id:PocketGriffon:20201127025010j:plain

せっかく今の時代に動くマシンを所有しているので、何か作ってみたい(^^)

段階的に作っていきましょうかね!

作ると言っても環境作って実機で動かして満足しちゃうのかも知れませんがw

 

今回はオチもなにもなく終了!

ではまた次回!(^-^)ノ