HC-20のメンテナンスその4

f:id:PocketGriffon:20210802215452j:plain

前回はRS-232Cっぽいケーブルを接続して、シリアル経由でセーブしようとしたらAbortが出てしまうところで終了した。

 

ケーブルは即席でテストをしていて、手元にあった「それっぽいモノ」を使っただけなので、それで繋がったらラッキーだったかも?

 

手持ちのケーブルを紹介してみたい。

f:id:PocketGriffon:20210802220519j:plain

↑ケーブル#714。

おそらくプリンターと繋げるケーブルで、クロスケーブルと思われる。

DIN側がHC-20、25ピン側がプリンタに繋げるみたいだ。25ピンのソケットを持つパソコン(PC-8201やTANDY200)と接続すれば繋がるのかも知れない。

今は直接Macと繋げる方法がないので、今回は使え無さそう。

 

f:id:PocketGriffon:20210802221059j:plain

↑未知のケーブル。

上記の#714がクロスケーブルだと思うので、こっちはストレートケーブルかなぁ…とか思ってるけど真相は不明。これがちゃんと動けばMacとも繋げられそうだったのだが、試してみたけどダメだった(T-T)

 

修理メンテナンスしたHC-20では、外部ハードを動かそうとすると画面に「CHARGE BATTERY!」と表示され、Abortしてしまう現象が必ず出ていた。作ったバッテリーの問題なのか本体側の問題なのか、原因追求は進んでいない(T-T)

 

手持ちにある、動くHC-20数台で試してみたところ、HX-20(海外版HC-20)ならばエラーが出ない事が分かった。なんと、テープドライブもプリンターもノーメンテで動いてしまった!

できれば日本語版HC-20であれこれやってみたかったけれども、動かないのならば仕方がない。HX-20を使う事を考えてみる。

 

まずはともあれ通信が出来るかどうかテストを続ける。

結局、手持ちのケーブルではうまく通信が出来なかったので、自作してみる流れに。

 

f:id:PocketGriffon:20210802222035j:plain

上がHC-40、下がHC-20のRS-232C端子だ。

まさかの大きさが違う(T-T)

HC-40とHC-80はコネクタサイズ、ピン配置共に同じで共有する事が出来る。そんな状況だったので、てっきりHC-20でも共有で使えると思っていたのだが、HC-20には通用しなかった(T-T)

 

以前、FP-200でRS-232Cケーブルを作ろうとした時に手に入れていたDIN8ピンソケットがあるので、今回はこれを利用してみる。

f:id:PocketGriffon:20210802223343j:plainf:id:PocketGriffon:20210802223407j:plainf:id:PocketGriffon:20210802223427j:plain

L字の形をしていて、そのまま挿すとケーブルが上を向く。

背中側に余裕のない配置で利用すると便利そうだ!(^^)

 

f:id:PocketGriffon:20210802225609j:plain

シリアル←→USB変換には、いつも使ってるコレを使う。
レトロパソコン使ってると通信機器を自前で準備する機会も多いので、まとめて何個も手に入れてあった。ちなみに今うちには(コレを含めて)4つある(^^;;

 

DIN8ピンのそれぞれの配置は付属のマニュアル(OPERATION MANUAL)に記載がある。

f:id:PocketGriffon:20210802222727j:plain

これなんだけど……左右対象のコネクタの場合、この図は「差し込む側から見た図」なのか「差し込む側の背中側から見た図」なのか、区別が付かない(T-T) 

多分……外側から見えてる(コネクタを手で持った時に見えている)状態でのピン配置なんだろうな…と想像をしてるけど、それであってる??

たまにこういう図を見ている時に「E」という文字がある図もあるんだけど、何か意味があるんだろうか…わからぬ(T-T)

 

なんとなく配線を間違える事も想定して、今回はブレッドボード上で接続をしてみる。

f:id:PocketGriffon:20210802225935j:plain

こんな感じでケーブルをDIN側にはんだづけして、ブレッドボードでピンを刺し直しながら実験する事にした。

 

f:id:PocketGriffon:20210802230218j:plain

↑こんな感じ。

通信速度は1200bpsくらいを想定しているので、ブレッドボード上でも問題ないだろうなーと思ってる!根拠ないけど(^-^;;

 

よーしコレで準備は万全!!

……と思ってテストしてみたんだけど、やっぱりどーしても繋がらない(T-T)

なんとなくだけどHX-20側からデータが出てる感じがしない。

そしてHX-20がたまに不安定だ。

液晶の表示もどんどん暗くなってきてしまった…。

これまたコンデンサ???

 

とにかく通信がうまく行かなかったらHC-20でやろうと思っていた事は破綻する(T-T)

なんとしても動いて欲しいんだけど…orz

どなたかHC-20で通信環境を構築している方がいたら、ヒントもらえると嬉しいです!

 

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

HC-20のメンテナンスその3

今回はHC-20本体のコンデンサを交換してみる!

実はHC-20を全分解&コンデンサ交換するのは初めてだったりする。

 

f:id:PocketGriffon:20210802114431j:plain

今回コンデンサを交換する事になったHC-20さん。

見た目はかなりキレイな本体で。コンデンサ交換して起動しなくなったら泣く(T-T)

 

f:id:PocketGriffon:20210802114529j:plain

これがキーボードと液晶ユニットの側を取り外した状態。

液晶に繋がるケーブルと、キーボード?に繋がるケーブルの合計3つがある。

フラットケーブルは外すのも取り付けるのも緊張する…(TT)

同時にバッテリーのコネクタも抜いておこう。

 

f:id:PocketGriffon:20210802114720j:plain

プリンターユニットと絶縁の紙?を取り外したのがこの状態。

てっきり部品がどどーんと載った基板が出てくるのかと思ったら、主な部品は裏側についてるらしい。

 

f:id:PocketGriffon:20210802114846j:plain

これがメイン基板を取り外してひっくり返したところ。

1982年に発売されたとは思えないほど部品が洗礼されてる気がする…。すごいね!

 

f:id:PocketGriffon:20210802115012j:plain

EPSONのマシンには、それぞれ固有のコード名がついてるみたい。

HC-20はMOSU、HC-40はPINE、HC-80はMAPLEらしい(^-^)

なんとなく美味しそうな名前なので、MOSUというのも食べ物???

 

コンデンサは全部で13個ついている。

ひとつだけ疑問なコンデンサが……。

f:id:PocketGriffon:20210802115300j:plain

63v 100μFのコンデンサ

63ボルト???

今まで扱ったことがないコンデンサだ。

というか、こんな電圧あったんだ??

今の時代にはないかも知れないから、100vで代用なのかなぁ…

100v 100μF?? なんかすごいアンバランスさを感じる。

今まで50vの電圧は見たことがあったけれども、みんな10μF以下の容量だった。

それが100μFなんて、なんとなくおかしい。なんの理論もないけど直感だw

そうして何度も見ていくうちに、違和感に気がついた。

そうか!これは63vじゃなくて、6.3vなのか(^^;;;

小数点の位置がちょっとずれていたので気が付かなかったけど、6.3vだと解釈すればなーんとなく納得出来た(^^;;

というわけで、出来上がったコンデンサリストは以下の通り。 

C1 16v 10μF
C2 16v 10μF
C3 16v 10μF
C4 16v 10μF
C5 16v 10μF
C6 16v 10μF
C8 16v 33μF
C7 16v 33μF
C9 16v 47μF
C10 16v 47μF
C11 16v 47μF
C12 16v 47μF
C13 6.3v 100μF

 

種類でまとめるとこんな感じだ。

16v 10μF   6個
16v 33μF   2個
16v 47μF   4個
6.3v 100μF  1個

 

もしかしたら今後も本体のコンデンサ交換が必要かも…と思っていたので、先日の買い物で一緒にコンデンサを購入してきた。合計で5台分くらいの数を手に入れたので、今後も修理出来るぞ!(やるとは言ってないw

 

あと、この基板ですごいと思ったこと!

f:id:PocketGriffon:20210802115933j:plain

基板の裏に部品番号や形が印刷されている!

これはとても便利だ!

いつもならコンデンサを手で触りながら、大雑把な意味を把握しながら足を探す…という工程が必要なのだが、この基板だったり安心して「抜くべき足はこれ」とわかる。

EPSON、すごいなぁ!

他のHCシリーズもこうだっけ??

ハンダ面もキレイだから、これは交換が楽ちんだね!!

 

f:id:PocketGriffon:20210802120214j:plain

全部のコンデンサを取り外しーの…

f:id:PocketGriffon:20210802120240j:plain

キレイに取り付けが出来た!

HC-20のコンデンサでちょっと意識しないとイケナイのが高さだ。

さっきも書いた通り、実装面が裏になっているので、背の高いコンデンサだと頭がつっかえてしまう。

 

f:id:PocketGriffon:20210802120643j:plain

元々ついていたコンデンサの高さが7.6mmくらいだったので、それ以下にしておけば安心だ。私は7.4mmと書かれていたコンデンサを手に入れた。

 

そして元通りに組み立てて、電源ON!

カセットドライブのアクセスをしてみたところ……

f:id:PocketGriffon:20210801224536j:plain

……orz

症状が全く変わらない(T-T)

これは…バッテリーがダメなのか、本体がダメなのか…。

うーん、切り分けが出来ないなぁ…。

 

プリンタに対してLLISTとしても、同じように「CHARGE BATTERY! 」になってしまう。

こりゃ困ったね(T_T)

 

とりあえずRS-232C経由でセーブ・ロードが出来さえすれば良いので、この問題は後回しにしようかと思う。

それっぽいRS-232Cケーブルを繋げて、試しにセーブ。

f:id:PocketGriffon:20210802121038j:plain

あ!!!!!!

 

……これはヤバい、企画倒れになる可能性が見えてきちゃった…(T-T)

ヤバい、ヤバいよ!!!

 

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

HC-20のメンテナンスその2

f:id:PocketGriffon:20210801205456j:plain

 

今回はHC-20のマイクロカセットドライブをメンテナンスしてみる!

プログラムを組む流れでマイクロカセットを使うシチュエーションは多くないと思うが、せっかくなので完璧なHC-20になったら嬉しいという事情だけでメンテする!(^^;

 

f:id:PocketGriffon:20210801205607j:plain

HC-20のマイクロカセットドライブは、こんな感じに本体から分離する事が出来る。この状態で使える…わけではないが、カセットドライブが外れた部分に別のモジュールを取り付けて、機能を追加する事が出来るのだ。HC-40にも同じ機構があったので、このブログでは見覚えがあると思う。

 

f:id:PocketGriffon:20210801205834j:plain

……はっきり言ってカセットは修理の気が向かない(-_-;;

私はカセットデッキなどの「メカメカしい構造」が大の苦手で、分解するのも元に戻すのもタダでは済まない気がしてならない(^^;;

#そんな事情があってMZ-2500の修理には手が出しづらい。

 

f:id:PocketGriffon:20210801210255j:plainf:id:PocketGriffon:20210801210313j:plain

ほら、なんとなくメカメカしい構造が見えてきた…(T-T)

マジ苦手なんだよなあ……なんて思っていたら……

f:id:PocketGriffon:20210801210413j:plain

ぽろっと部品が落ちてきた!!!!

これなに!?どこにあったの??(ToT)

まだ見てない場所と部品が出てくるとパニックになっちゃう!!

こういう不意に外れてしまう部品がホントに苦手……

奥の方を見てみたが、すぐには分からないので次に進む…。

 

f:id:PocketGriffon:20210801221537j:plainf:id:PocketGriffon:20210801221558j:plain

コンデンサが3つついていた。裏返してみると、はんだされてる部分が変になってる…。これは交換必須だね…(T-T)

 16v 10μF

 50v 2.2μF

 6.3v 47μF

残念ながら手持ちの在庫が無かったので急遽買い物へ。

高さ制限があるので、背が低いコンデンサを探す事になった。

 

基板が見えたことから、ゴムベルトも見えるようになった。

f:id:PocketGriffon:20210801222042j:plain

これがマイクロカセットドライブの全容。ゴムベルトの裏側がカセット本体だ。今回はそこまでバラさなくてもゴムベルトが露出した。とは言っても、あと4つくらいネジを外さないとベルトは取り外しができ無さそうだけど。

 

f:id:PocketGriffon:20210801222200j:plain

ゴムベルトを触ってみると、固まってるというか弾力がないというか。試しに手でモーターを回してみるけど、ゴムベルトが滑って全く機能していない。うーん…これはダメだね。

f:id:PocketGriffon:20210801222419j:plain

ゴムベルトを取り外してみると、なんとそのままの形が残った!(^^;;

しかもついてる時には「平ベルト」だと思ってたんだけど、取り外してみたら「角ベルト」だった!ぴろーんと伸び切っちゃってたって事ね…。

この状態でサイズを測るのは簡単じゃない……。うーん……Φ50〜55くらいの…太さ0.75の角ベルト…かな??

f:id:PocketGriffon:20210801223045j:plain

狙ったサイズが無かったので近しいものを購入してきた。

これを取り付けてみたんだけど……あら残念。ちょっと経が大きかったようで、回転させるとゴムベルトが"よれて"しまう。これは高速で回転させたら外れはしないかもだけど回転ムラが出そう。ダメだ(T-T)

 

f:id:PocketGriffon:20210801223411j:plain

仕方がないので、手持ちのゴムベルトの中から適当に探してみる事に。

最初からこっちのゴムベルトを使わなかったのは、ちゃんとしたサイズを知っておきたかったからだ。なんとなく分かった気がするので、今回は妥協(^^;

 

結局、経はもう少し小さく(Φ45くらい?)、太さももう少し細いものを装着した。ゴムベルトは、カセットドライブのかなり深いところにあるので、やり直しがとっても面倒だ!

できれば一発で決めたい!

 

f:id:PocketGriffon:20210801223751j:plainf:id:PocketGriffon:20210801223814j:plain

気になっていたコンデンサも無事に交換完了!

 

ところで……さっきふいに落ちてしまった部品の「あるべき場所」が分かった!

f:id:PocketGriffon:20210801224310j:plain

中央に縦に2つの穴があって、片方の部品がハマってない。どうやらここから外れたみたい。試しにもうひとつの部品を外そうとしたが、固くて外せなかった。本来は固定されているのが正解なのかな…(謎

 

元通りに組み立てて動作確認をしてみよう。

BASICから「WIND」とすればテープの巻き戻りがされるらしい。

f:id:PocketGriffon:20210801224536j:plain

一瞬、画面に「CHARGE BATTRY!」と表示されて、Abortとなってしまった!

何度かやってみたけれども、モーターが動く様子はない。うーん…配線を間違えたのかな??

 

試しにプリンターを動かしてみようとしてLLISTとしてみたが、こちらも症状は全く同じく「CHARGE BATTERY!」からの「Abort」となった。

ACアダプタを外して同じことをしてみると、液晶がチラチラする。

 

うむむ…これはもしかしたら本体のコンデンサを交換する必要があるのかも??

今動いてるマシンのコンデンサを交換するのって勇気いるんだけどな…(T-T)

 

今回はカセットドライブ修理失敗ということで!

修理の失敗については書いてないだけで、今までも成功の3倍以上はある。

まだ修理していない場所があるというだけでも「もしかしたら直るかも?」と思えるので気持ちは楽だ!(そうでも思わないと気が萎えるw)

 

きっと「その3」に続く!(^-^)

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

 

 

 

 

HC-20のメンテナンスその1

AI-1000の作業もいったん落ち着いたし、今度はHC-20で何かをしてみたい!

そのために安心して使う事のできる本体を確保するためにメンテナンスする!

 

ウチにはEPSON系のマシンがそれなりの種類ある。

HC-20から始まり、HC-40、HC-45、HC-88、海外版のHX-20、PX-8、そして98シリーズも4〜5台あると思うので、10台以上ありそうな予感(正確に分からない)。

 

そして今回の主役は、みんな大好きHC-20!

f:id:PocketGriffon:20210731232520j:plain

2年近く前に手に入れたっきり、何のメンテナンスも出来てなかった。いつかプログラム組んだりしちゃうぜ…と思いつつ、そのタイミングを待っていた感じだ。

 

HC-20は内蔵バッテリーが空の状態では起動しないらしい。長時間充電しなくても大丈夫、10分程度ACアダプタに接続をしてバッテリーを充電、それから電源ONすれば起動する。

それでも起動しない場合は、おそらくバッテリーまたは本体側に問題がある。

 

f:id:PocketGriffon:20210731234020j:plain

液晶パネルもビネガーシンドロームになってなく、とてもきれいな状態だ。

起動した時の画面に、1、2の数字だけでなく3以降も化けた文字がダラダラと表示されてしまう場合は、CTRL+@でリセットしてやると直る(事が多い)。

 

バッテリーの交換

HC-20のオペレーションマニュアルを見ると、内蔵バッテリーの寿命は3年らしい!

f:id:PocketGriffon:20210731235900j:plain

もう30年以上も経っているはずなので、とっくに寿命ですね…。

というわけで、コレを新品に交換をする。

新品と言っても今の時代にHC-20のバッテリーが手に入るわけではないので、同じ仕様のものを新たに作ることになる。

f:id:PocketGriffon:20210731235139j:plain

↑HC-20を分解すると、液晶のすぐ裏付近に赤いバッテリーが鎮座ましましている。

特に液漏れとかはしていないようだけど、赤の色が少しくすんでるのが気になる…。

試しに15分くらい充電してみて、電圧を測ってみた。

f:id:PocketGriffon:20210801000301j:plain

すごい!まだ使えるかも知れない!

ニッカドバッテリーって完全放電した後でも充電が出来る事が多いし、ホントすごい!

でもこの電池をフル充電する勇気もないので、やっぱり交換する事にしよう。

 

今回使うバッテリーはコレ↓

f:id:PocketGriffon:20210801000928j:plain

 

f:id:PocketGriffon:20210801001227j:plain

1.2V 2200mAhの電池を4つで4.8V 8800mAh。

オリジナルバッテリーは1100mAhで充電に8時間掛かるらしいので、8800mAhの容量になったら単純計算で64時間掛かる??(T-T)←あながち冗談ではない

 

f:id:PocketGriffon:20210801002709j:plainf:id:PocketGriffon:20210801002859j:plain

 バッテリーが入っていた場所に交換する予定の電池を入れてみると……かなりギリギリのサイズ!

これは…工夫して作らないと厳しいかも!

 

いつもの通り、使える部品は使う方針でやっていく。

まず電源コネクタは代わりを持ってないので、オリジナルバッテリーから外して使う。

f:id:PocketGriffon:20210801003853j:plain

線の長さもギリギリだったので、できるだけ根本から切断した。

そして先端に端子をはんだづけする。

f:id:PocketGriffon:20210801004014j:plain

f:id:PocketGriffon:20210801004036j:plain

 

そして今回もスポット溶接器を使う。

f:id:PocketGriffon:20210801004204j:plain

これはAmazonで7500円くらいで売ってたものを使ってる。

説明書がついてなくて「どうやって使うの?」って悩んだが、ONボタンを押しっぱなしで電源ON、その後ONを押した回数でパワーが変わるらしい。どれが良いか何度か試してみたが、4が良い感じ。

f:id:PocketGriffon:20210801004634j:plain

こんな感じで溶接する!今回はとてもキレイに仕上がった!(^-^)

 

バッテリー全体を収縮チューブで押さえつけたいところだけど、ちょうどよい大きさが手元に無かったので、今回もテープで固定してみた。

f:id:PocketGriffon:20210801004831j:plain

電圧も定格以上出ているし。良い感じだね(^^)

 

f:id:PocketGriffon:20210801004914j:plain

本体にセットしてみたら、なんとギリギリすぎて入らなかった!!

仕方なく巻いてたテープを減らしてみたり、ミリ単位以下の攻防を繰り返してようやく収まった!

これで組み立てて動作確認をしてみる。

 

f:id:PocketGriffon:20210801005124j:plain

よし!無事にバッテリーだけで使うことが出来るようになった!

充電は慎重に行いたいので、最初のうちは目が届く範囲で行っていく(ACアダプタ繋げたまま外出とかしないよ!)。

 

この先はマイクロカセットの様子を見ていこうと思う。

プリンターは使わないと思うので優先度は低いかな…動いたらラッキーくらいな感じで(^^)

 

今回はここまで!

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

CASIO AI-1000を使ってみる!その13

f:id:PocketGriffon:20210731083059j:plain

約10日間に渡ってAI-1000を触り続けてきたけれど、一旦キリにしようと思ってる!

形がカッコよくて大好きで、でも全く使ったことがなくてミステリアスだったAI-1000が、この10日間でものすごく身近に感じるようになった!(^-^)

 

HD61700も触ったことがなかったけれども、良い経験になった!

思った通りの素直さと柔軟さを兼ね揃えたCPUで、アドレッシングがもう少し強かったら良かったかもなぁ…と思うことはあったけれども、妙な制限で悩むことは無かった(^^)

 

この先にもいくつかやってみたい事があったけれども、AI-1000というよりはHD61700でやりたい事でもあったので、AI-1000としては一旦キリにしようと思う!

「実はこんな事を考えてました」的な話を書きつつ終わりにしたい。

#書いた後に読み直してみたら、イイワケ大会になってた!w

 

HD61700エミュレータ

このブログを読んでくださってる方々ならば「ああ、やっぱりね」と思われるかと思うけど、ワリと真剣にエミュレータ書こうと思ってましたw ここにAI-1000とかPB-1000と書かない辺りに事情がある(^^)

 

プログラムを本体へ送り込む前にロジックの確認をしてみたかったり、実行速度を測ったりするために使おうと考えて作ろうと思ってた。

そういう意味では画面が表示される必要は何もないし、むしろ出なくて良い。あくまでもCPUの動作確認という感じだ。

 

次に書く「やりたい事」とも絡んでいたため、順番に作業していくつもりだった。

いかんせん、作るのに時間が掛かりそう(2〜3日の作業が無理そう)なので、気力が続かない恐れがあって「今じゃないかも」と考えたのだ。

 

8080→HD61700コンバータ

実はこちらが本命!

8080CPUのバイナリをHD61700で動くように、マシン語コンバータを作ろうかなーと思っていた。これのメリットは、8080で動くCコンパイラなどが活用できるようになる事だ。

 

単純な「バイナリのコンバータ」をイメージしていたのだが、実現に向けて深く考え始めてみると、実は結構厄介だな…と分かった。

f:id:PocketGriffon:20210731084356j:plain

↑こんな資料も作っていた。

これは「8080のコードをHD61700に割り当てるとこんな感じ?」というイメージを書いたものだ。まだ一度もHD61700でコーディングをしていない時期(逆アセンブラが完成していない頃?)に書いたものなので、割り当てられた命令が適切ではないのかも知れない。スタックフレームについては後回しになっていたので、この表では何も考慮されてない(^^;

 

これを作ってる最中に「あれ?HD61700にはキャリーを含む加減算命令がなくね?」と気がついたのだ。同時にサインフラグの存在がない事も気になった。8080のライブラリはこれら2つのフラグをかなり活用して作られているので、対応は必須と思われた。

 

これらフラグの情報を組み立てるために、HD61700側のコードが冗長になりそうだと分かった事、フラグがすぐに参照されるわけではないので(ありがちなのはフラグ変化後、ロードやリターンしたのちにフラグ参照とか)プログラムの状態遷移管理が必要になる事、コードサイズの長大化に伴いテストが大変になりそうな事などから、実機よりもエミュレータが必要だと判断していた。

 

これも単純なコンバータでなくなった瞬間から、開発にはとても時間が掛かりそうな予想がされたため、今じゃないだろうな…と思って開発を断念した。

 

なにかのコンパイラ

コンパイラ作ってみたいなーと思っていた。ここはやっぱりCコンパイラ

 

HD61700の特徴(レジスタがたくさんあって直交性の高いアーキテクチャ)を活かすためには、レジスタ割り当てが必須と思う。単純なスタックマシンのVMとはワケが違う規模のものになりそうなので、これも簡単じゃないなぁ…と思った。

この辺りはコンパイラに精通されている方であれば容易に想像がつくと思う。

 

じゃあBASICコンパイラとかは?…とも思ったが、実は私はBASICのコンパイラを作ったことがない!(^-^;; 過去に一度も作ったことがないものは調査その他に時間がかかりすぎる(^^)

 

実機で実行するコンパイラならば中間言語をたどっていくタイプのコンパイラが作れそうなので、BNF解析は必要ないなーとか思いつつも、今度は逆に「HD61700でコンパイラ書くの?!」って躊躇してしまった(^^;

 

ディスクを活かした何か

f:id:PocketGriffon:20210731091246j:plain

f:id:PocketGriffon:20210731091311j:plain

せっかくMD-100を所有しているので、ディスクを活かした何かを作ってみたいなぁ…と思っている。その「何か」が何なのかが分かってないのが一番の問題(^^;;

MD-100 emulatorも手元にあるので、こちらも活用していきたい。

 

上記のどれもがAI-1000に特化したものではなく、PB-1000でも活用できそうな話題だ!

きっと近いうちにPB-1000でも何かをやると思うので、そちらと絡めながら取り組めたらいいな…と思う!

 

ところで…PB-1000やAI-1000の動作クロックっていくつなんでしょ?

エミュレータ作ろうと思った時にサイクル数はわかるけど動作速度がわかんないよ…と思った!(^^;;

ご存じの方はぜひコメントまたはTwitterで教えてくださると嬉しいです!

 

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

次は何のマシン触りましょうかね!

f:id:PocketGriffon:20210731092930j:plain

 

CASIO AI-1000を使ってみる!その12

f:id:PocketGriffon:20210730215035j:plain

解析環境と開発環境が整ってきたので、少しまとまったプログラムを作ってみる事にした!

とは言ってもせいぜい半日頑張ったら作れる範囲に留めたい…。

おじさんは集中すると寿命が縮まっちゃうんだよ!(T-T)

 

というわけでいつものパターンで、絵をドット単位に動かす事をやってみた!

とりあえず動いた動画をTwitterに投稿したので見て欲しい。

 

前回のブログで、麻雀牌を表示するプログラムを掲載した。

あのプログラムは縦方向の表示位置は8ドット単位しか指定が出来ない。これはAI-1000のVRAM構造に由来する制限だ。縦8ドット=1バイトの構造となっているため、バイト境界以外に絵を表示しようとすると、それなりに面倒なコードを組まないといけない。

 

過去にHC-88やPC-8201などで同じことをしているが、どれも面倒なコードを組むことで実現していた。

HC-88でプログラミング! その10 - レトロパソコンであそぼう!

↑6301CPUで挑戦した

HC-40でプログラム開発してみた その3 - レトロパソコンであそぼう!

Z80でのドット単位描画

 

 今回もこのパズルのようなプログラムを組んでみよう!

 

ドットをずらす方法を検討

一番コアとなる処理は画像データをシフトするところだと思う。ここの構造がきっちりと決まると、その周りのコードはワリと流れで組んでいけるw

基本的な考え方は「縦16ドットのデータをレジスタに載せておき、必要回数分をシフトしながらはみ出たドットを別のレジスタで拾う」だ。

そのため、レジスタが多いマシンでは意外にも簡単に実装が出来る。

 

HD61700はレジスタが超豊富にあるので、アルゴリズムにこまる事は何もなかった!

メインレジスタに16ドット分のデータを入れておき、bidwでシフト、はみ出たビットをrodで拾う。

    bidw $0

    rod $2

これで(AI-1000の場合は)1ドット下にずれる。

これを最大7回繰り返す事ですべての位置に描画する事が可能になる。

あとはすでに描画されている絵と合成するために、VRAMのデータとマスクパターンでANDして、ORで書き込む。この辺りは1980年代からの有名な手法なので聞き覚えがあるはずだ。

 

動画を見てくださった方はわかると思うが、それなりの速度で動いてる。あれはリアルタイムに画像データをずらしながら表示している。高速化も全くしていないので、HD61700に慣れた人が最適化をすれば、倍以上の速度になるんだと思う。

 

f:id:PocketGriffon:20210730225956j:plain

当たり前だけど、最初から一発で完成するプログラムが書けるわけではない。でも私の場合は、まずはバグありでも構わないから一通り組み立ててしまう。その後、機能を絞って(例えばX=0、Y=1、牌=0のようにY以外は特殊な事をしないとか)確実な部分を1つずつ組み上げていく手法で進めている。

 

上の写真は、ようやくドットをずらした状態で表示が出来るようになったところ。ちゃんと下にある牌と重ね合わせも出来るようになっている。

 

重ね合わせ処理を入れた副産物として、背景を入れる事も出来た。これは上手に背景と重ね合わせてるというよりは、背景でVRAMを消去、その上に牌を描いているだけだ。

 

HD61700で気がついたことトカ

初めてHD61700でプログラムを組んでみたが、いくつか気がついたことがあったのでご紹介してみたい。多分、HD61700に慣れた方ならば「そこでハマる?」って思うのかもw

 

キャリーを含む加算は?

キャリーフラグを含む加減算命令が無いような気がする…。Z80風で言うところの「ADC/SBC」命令が存在しないっぽい。今回のプログラムで困る事は無かったが、Z80に慣れた人がHD61700を使うと面食らうかも。

同じくサインフラグも無いので要注意。

 

インデックスレジスタの加算

IXレジスタを加算する方法、例えば8を加算する時は…

   gre ix,$0

   ldw $2,8

   adw $0,$2

   pre ix,$0

というように書いていたが、以下の方法を使うと楽ちんだと気がついた。

   ldi $0,(ix+7)

$0にはダミーの読み込みが入るが、それ以外のレジスタは壊さない。

 

PUSH/POPのワナ

2バイトのPUSH/POPは注意が必要だ。

例えば、$0と$1を16ビットデータとしてPUSH/POPする時には以下のように書くらしい。

   phuw $1 ← PUSH

   ppuw $0 ← POP

そう、指定するレジスタ番号が違うのだ!これはわかる前もハマり、理解した後も何度もハマってしまった!ワタシ的には鬼門の命令に認定(^^;;

 

ブロック転送のレジスタ

これも何度書いても慣れていないんだけど、bup命令でのレジスタの設定。

なんとなく「転送元アドレス、転送先アドレス、転送バイト数」と指定したいところだけど、HD61700の場合は「転送元先頭アドレス、転送元の最終アドレス、転送先アドレス」と指定する。慣れの問題だろうけれどもクセがあるなと感じた命令(^^;;

 

 

HD61700のプログラムを組み初めて2日でここまで作れたのは、やはり先に逆アセンブラなどを作って命令そのものに慣れ親しめた事が大きいと思う。どんな命令があったのか、おぼろげに覚えてるからね!(それでも4ビットシフト命令の事は忘れてたけど汗)

 

AI-1000でのプログラム挑戦も、私の中ではそろそろ終わりに近づいてきた!

あと2つほどやってみたいことがあるけれども、時間がかかる事なのでどうしようかなーと悩み中(コンパイラじゃないよ!)

 

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

 

CASIO AI-1000を使ってみる!その11

突然、動作が不安定に!!

先日から活用を始めたHD61700クロスアセンブラ(hd61)、とっても便利に使ってる!!

実は私が開発してた逆アセンブラは(後になって気がついたけど)KC形式で出力するようになっているため、クロスアセンブラと親和性が高い。その気になればhd61でアセンブルする事ができるソースも出せる気がしてる(今のところ予定なし)。

 

使い勝手の良い開発環境が作れたので、動作確認もたいしてせずにホイホイとコーディングをしていったんだけど…ある時を堺にAI-1000へ送り込んでも動かなくなってしまった!

実行するとAI-1000が完全ハングアップしたり電源が落ちちゃったり、不安定を超えた安定の不動作!

 

原因を絞り込むためプログラムをどんどん削っていくが、もはや何をしても動かない状態になってしまった!こんな不安定は初めて!!

うーん、こうなってくると本体側の問題なのかも知れないなぁ…と思い、本体の電池を交換したりFA-7をまるごと交換してみたりとやってみるが、何をしても安定した不動作。

 

1時間以上格闘していたと思うけれども、理由がさっぱり分からなくて途方に暮れた!

そして自分が何をしたのかを思い出しつつ(こういうのは先にやれ)、行き着いた先がQuickLoaderのBASICプログラムだった!

 

実はロードするアドレスやサイズなどを表示するコードを、BASICで1行追加してたのだ。

それ自体は問題なく動いていたのだけど、どうやらコイツが悪さをしてるらしい。

でもQuickLoaderってDEFCHR$で変更されるメモリ領域を利用してるんだから、表示が問題になることはないはず…DEFCHR$した文字も表示してないよ???

 

…と思って、改めてQuickLoaderの仕組みを調べてみたら…(^^;;;;

あ、これはビットマップ領域(例の&H0201〜)にプログラムを転送し、そこでマシン語プログラムを動かしてたのね!!!

 

……書いてる意味がおわかりいただけるだろうか?(^-^;;

つまりマシン語プログラムを格納してあった領域を、私が文字表示なんていう余計なモノを入れてしまったばかりに、その領域を破壊してたのだ!そして壊れたデータが入ったアドレスにマシン語コールをしてハングアップする…という事だった!

内容を理解せずに余計な事をしてはいけないんだな…とキモも命じた(T-T)

 

グラフィックを表示するよ!

適当な幾何学的な模様じゃなく、豆腐じゃなく、なにか意味のある絵を表示してみたい!

いつも困るのが、適当なグラフィックデータを持ち合わせていないこと(T-T)

しかもモノクロのデータとなるとPC-8001(PCG)とかMZ-80Bとか、そういう機種のデータを流用する事になる。

 

今回も、以前PC-8201やPC-1600Kでも表示していた麻雀牌を表示させてみるよ!

手持ちのデータがホント少ないのよ(T-T)

困ったことにグラフィックのデータ形式が上記2機種とは異なっているため、元データからのコンバータを書かねばならない。この辺りはもう何度も何度も書いているのでサクっと変換しよう。そういう汎用コンバータを作ってもいいかもな…と思ったw

 

f:id:PocketGriffon:20210730065645j:plain

こんな感じにアセンブラ形式で出力してやれば、そのままhd61でinclude出来る。

そういえばhd61はバイナリファイルもinclude(incbin)出来る。この機能、他のアセンブラでも使ったことがあるけれども、ものすごく便利!全アセンブラで対応して欲しいw

 

そして実際の描画プログラムをこのブログの最後に載せてみる。プログラムを載せるのは、プログラマとしての威厳を損ねる可能性も秘めてる(そこまで?!)のでドキドキするが、CPU初心者のうちは良いだろうw

 

乗算命令の無いCPUの場合、どうしても座標計算に時間とコードサイズが掛かる。特に今回は横方向が192なので少々面倒。テーブル化しちゃった方がいいのかもなぁ…。

 

今は縦方向が8の倍数でしか描画出来ないけど、ドット単位に描画出来るようにしてみたいね…。これは近々やってみよう(^^)

 

シリアルから転送した後の話

そういえば前回のブログで「シリアルから転送したコードを実行できるようにするまで面倒」という話を書いた。そしたら!Jun Amano氏から的確なアドバイスが!!

BASICでLOADすれば良い

!!!なんと!!

AI-1000のメニューが便利すぎて基本的な事を忘れてたYO!!(ToT)

いっつも超マニアックなマシンばかり触っているので、教えてくれる方の存在が本当に助かります!ありがとうございます!!

 

さっそくBASICで「LOAD"COM0:」としてロード、そのままRUN!

超快適になった!!

プログラムが安定してきたら、QuickLoaderの最後にマシン語の実行まで付けたらさらに便利かも!

とっても開発しやすくなりました!(^o^)/

 

おっさんの主張

f:id:PocketGriffon:20210730080050j:plain

作業してて目が疲れてくると、↑オーバーレイシートに赤文字で書かれている文字が読めなくなりませんか?? そして気がつくと疲れて無くても読めなかったりしませんか?(T-T)

 

仕方ないので、おっさんは虫めがね(若者っぽくルーペなんて言わない)を手元に置いて、必要になったら使ってますぞ。

 

もひとつ。SHARP系のポケコンに慣れてると、画面クリアの感覚でmenuボタン押しちゃう! 

 

ところで…半分与太話…

HD61700のアーキテクチャを見た瞬間から思ってる事なんですが……これって絶対にコンパイラを意識したCPUだよね…?(^^;;

直交性の高いレジスタ構成、スタックフレームの作りやすさなどなど…。

 

当然世の中には便利な言語やコンパイラがあるんだろうと思って検索してみたけれども、どうにも見つからない…。もしかして……存在しない??? 需要がないのか、開発者がいなかったのか、その両方なのか分からないけれど、ぱっと探した範囲では見つからなかった。

 

無ければ作ってみたいなぁ…とか思いつつも、コンパイラの開発なんてそんな簡単じゃない(^^; しかも簡単に作ろうとしたらスタックマシンという、HD61700の特徴を全く活かせないものになってしまう。ちゃんとレジスタ割り当てまでしようとしたら中間層も作らないといけない気がするし…なんて思うと、動くようになるまでにどのくらい掛かっちゃうんだろ??

誰か言語系の得意な方、作ってみませんか?(他力本願マン)

 

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

 

麻雀牌描画プログラム

f:id:PocketGriffon:20210730070542j:plain