2023年12月31日日曜日

New City Hero @ j80/mac

はじめに 

という事で、せっかくお時間いただいて助けていただいたので、しっかり情報として残していきたいと思います。

まず、New City Heroの現在の入手方法については内藤さん御自身のアナウンスを御覧ください。無条件で入手できるわけではなく、 最初に配布していた頃の条件「動作可能な実機を所有している人」、または「PC-8001miniとパッケージ版を買ったけどダウンロードしそびれた人」への救済措置となっているので御注意を。後者の条件を今から揃えるのは難しいですが、前者はPCG互換ハードを自作するという道が残されており、この手のソフトに興味を持つ人にとっては比較的難易度の低い条件となってるかと思います。

この件は内藤さんが定期的にツイートしており、自分は比較的最近「大変言いにくいのですが、実は買ったまま積んでいて……」と白状して配布して頂きました。バージョンが最終版のv1.2.3ですが、これはビルドツールが変更になっただけで、コード的にはv1.2.2と同一だそうです。なので、v1.2.2の方も安心してこのブログを参考にできるはず。

事前準備

エミュレータでの動作に必要なROMの手配については、内藤さんのPC-8001開発環境整備/ハードウェア編を読んで実機を入手し、PC-8001開発環境整備/ソフトウェア編を参考に、TINY野郎さんのツールを使って読み出します。ビデオキャプチャ環境を用意するか、しっかり固定すればスマホでの撮影でも大丈夫そう。たぶん内藤さんのブログの時点からさらに更新されてるかな?付属のcmtは動作しますし、実機ではwavファイルから直接持ってけば大丈夫かと。あとプログラム名が変わっていて、読み込むには「cload"b2mv8」です。
ただ、フォントデータはCPUから見えないし、今から実機でPCGを……とか考えてる人なら、直接ROM引っこ抜いて読む方が手っ取り早くて楽って人は多そう(笑)今どき5,000円前後でROMライター買えるので、これを気に手を出すのもあり。

j80

j80は内藤さんのソフトウェア編にかかれている通り、HAL 8999さんのOut of STANDARD内にあるPC-8001のページにて配布されています。最新版のj80_r6_122のみが公開されており、内藤さんが元々検証していたバージョンとは違います。最初は動作せず、このバージョンの違いを疑ったのですが、濡れ衣でした。

ここれは解説例の少ないmacを例に手順と勘所を記録しておきます。

まずはインストール先を決めます。自分は~/opt/rpc/8001としました。以降ではこれを$(P8)と呼称して進めます。

$ cd $(P8)
$ mkdir -p app/res
$ cd app
$ lha x <ダウンロードしたパス>/j80_r6_122.lzh

lhaコマンドはbrewとかで入れるか、他の手段でlzhを展開するかしてください。mac使いでもこの手のをいじってる人なら何かしら環境を持ってるかと思います。

これで、以下のようなファイル構成になるはず。
$(P8)
  + app
    + j80_r6_122
    |  _j80.bat
    |  _j80.choice.bat
    |  _j80.setup.bat
    |  _j80.twins.bat
    |  + config
    |  + debug
    |  + display
    |  + doc
    |  j80.cfg
    |  j80.cmd
    |  j80.jar
    |  + keyboard
    |  pc-8001_test_cmu800.cfg
    |  pc-8001_test_hsync.cfg
    |  pc-8801_test_cmu800.cfg
    |  pc-8801_test_hsync.cfg
    |  + touchpanel
    |  + util
    + res
これをベースに設定ファイルの修正とROMの追加を行っていきます。

ROMの配置は、ベースとなるj80.cfgの修正を最小限にするために以下のようにします。
$(P8)
  + res
    + j80
    |  PC-8001.257073260.rom
    |  PC-8001.636.fon
この名前はデフォルトで有効になっているv1.1ROM向けの配置ですが、他のバージョンをこの名前で置いても問題ないと思いますし、気持ち悪ければ別ファイル名で置いて、cfgファイルを適切に修正すればOKです。

次にj80.cfgをベースにしたnch.cfgを作成します。ここでは設定差分だけ例に上げます。

$ diff j80.cfg nch.cfg|iconv -f sjis
340c340
<       DISK    ../res/j80/PC-8031-2.rom
---
> //    DISK    ../res/j80/PC-8031-2.rom
347c347
< //    ENHANCE 1        // 32K :「Full Dot Color PCG」改造なし
---
>       ENHANCE 1        // 32K :「Full Dot Color PCG」改造なし
そうそう、最近あまりお目にかからないSJISなので編集時は注意が必要。たぶんコメントだけだから壊しても大丈夫かとは思うけど、SJISはエスケープコードが怖いので、SJISのまま編集しつつ行末の日本語はいじらない、またはUTF-8なりに変換してから編集しましょう。

この設定で大切なのは2点で(そりゃ2箇所しか修正してないしね)
  1. DISKは無効化しましょう
  2. メインメモリの設定は32Kにしましょう
です。1に関してはROMがなければフォールバックで無効化されるみたいなので、無視しても大丈夫そうですが、後々足した時にトラブルの元になるので、覚えてるうちにコメントアウトしちゃいましょう。2は重要で、これを忘れるとテープから読み出し後にハングアップします。具体的には*G8001と表示されたところで止まる。自分は最初これを忘れてました。

この件に関しては、Wikipediaによれば
発売当初は搭載メモリ16Kモデルのみの販売であった。さらに16Kの増設が可能で、増設して購入するユーザが大半であったため、32Kモデルも後に販売された。
との事なので、実機で挑戦する際には搭載メモリは要注意。これとは別に更に8KBの拡張にも対応しているようですが、そっちは必須ではなさそう。M.K.さん販売のPSA基板にはNCH用とされた初代80向けの増設メモリー用端子が出てるんですが、ちょっと関係よく理解してないかも。要問合せになってるので聞いてみようかな。

これが出来たらあとは起動コマンドをshell script化するだけ。自分は$(P8)/j80_r67_122_nch.shとして以下のようなスクリプトを配置。以降はこいつに実効属性付けといて叩けば楽ちん&確実に起動。

#!/bin/sh
#

cd `dirname $0`/bin/j80_r6_122
echo OK | java -jar -Dsun.java2d.d3d=false \
-Dswing.boldMetal=false j80.jar nch.cfg

最初にスクリプトの起動名から相対なり絶対なりのパスを取得しておいて、展開したj80_r6_122のディレクトリに移動してます。あとはそこからの相対パスで設定ファイルのnch.cfgなり、その中で指定してるROMなりを読む感じ。

起動

この先もまぁ、昔のパソコンなのでそれなりに手間なので書いときます。

まずはPOWER ON、そしてPCG8100を有効化。

Okの後ろが化ければ正しく設定できた。

続けてテープを読ませるために指定して……

「mon」でモニタを起動して「L」で読み込み開始。エミュレータだと一瞬で読み込んで起動画面に。ここでもしメモリの設定を忘れてると以下のように「*G8001」と表示されて固まります。


という事で、macでも動いたよ、という報告とともに、自分がハマったポイントをまとめました。似たような道を通る人の参考になれば。

というわけで、自分は実機に向けてPSA向け部品手配に入ります。

参考情報

内藤さんのPC-8001関連のブログ一覧

ハードの準備から開発環境、技術詳細と幅広く丁寧に解説されていて流石です。


追記

起動時の自動電源ONとPCGの有効化も設定ファイルで指定できるそうです。

この設定、慣れてくると色々と便利そうです。引数でどの設定を使えるか選べるので、用途別にカスタマイズできますね。ちなみOPTIONはTAB区切りじゃないと認識しないようです。 

2023年12月20日水曜日

2023年何やった?

なんか新年早々忙しかった事しか覚えてなくて、良くないので来年から月ごとにメモしよう……と思ったけど、まずは今年をざらっとTwitterのログから俯瞰しとく。

お仕事

たまにはChromeのお仕事の宣伝もしとく。

MPArchっていうコアの部分のでかいデザイン変更をやりながら、FencedFramesとかPrerenderingが必要とする機能を作ってきて、それが落ち着いたのでPrerenderingをデスクトップ向けに出荷できる状態に調整する仕事(Chrome拡張のAPIの合意とか諸々)をやってたのが去年くらい?その後はAPIだけじゃなくChrome内部でPrerenderingを使うって仕事を推し進めていて、今はBookmarkBarとかNew Tab Pageから出来るようになってる。最近はこの辺りは実装は後輩に任せてるけど、Ray-Banさんとか国内外いくつかのパートナーさんが欲しがってた機能を突っ込んだりってのもやってた。

その後大きな話としてLinkPreviewって機能の導入を目指してあちこちのチームと調整してたのが今年一番大変だった仕事。Prerenderingの機能を有効活用しつつリンク先のページを確認するための機能。コアな部分は実装終わってて、あとはUI周りの調整。一応Canary/Devでお試し出来るので、どんなもんか確認してみて欲しい。

AI関連で集中開発やってた時期もあったんだけど、詳細は書けない気がするので割愛。

あと、入力は、帽険だ。

プライベートQ1

  • SUUMOさんに家のことを記事にしてもらった
  • サーバアップデートでしくって復旧作業
  • X68kの修理は別エントリにまとめてたので詳細は割愛
  • IONA-US v3基板の設計と海外先行出荷
  • IONA-SB設計と出荷
  • Mystic Warriorsのサントラ向けデジタル収録基板の設計、サウンドテスト開発
  • ガイアポリスのサウンドテスト開発
  • Ray'z Arcade Chronology向けのraycrisis基板調査
  • IONA-USでハンドル対応!
  • 民事裁判、被告として本人訴訟で一審で勝利
  • vint開発
  • Burnin' Rubberハーネス基板

プライベートQ2

  • IONA-US firmware v2シリーズ開発開始・公開
  • IONA-US/IONA-SB 高速化
  • IONA-US Lindberghの対応作業(主にハンドルとサイバースティック)
  • 究極タイガー基板修理(頓挫中……続きやらなきゃ……)
  • IONA-US ガンコン対応強化(タイムクライシスが頓挫中、基板壊した……)
  • DJターンテーブル追加、レコードわっしょい
  • MuseScore覚えて使うようになった
  • PHANTOM-06、セッションに向けて使い込み

プライベートQ3

  • セラムン・幽遊白書スタジオセッション
  • ハイパーネオジオ64の調査と改造(詳細未発表)
  • 民事裁判、被告として本人訴訟で二審で勝利

プライベートQ4

  • IONA-US マウス対応、タッチスクリーンも限定的に対応
  • IONA-US 高速化後のファームとexAの新型ファームに相性問題があったため、exAさんと調査・修正
  • IONA-US レイアウトページでWebUSB/WebHIDで入力チェックできるよう対応
  • Fusion360覚えて3Dプリントで68拡張カード脱着用プラを作ってみた
  • M5Stack Core2にCP/Mega88を移植してみたり、I2CでMoonshotと通信してみたり
  • パソコンミニMZと8001を他のRasPiやPine系、かつWindowシステム上で動く修正
  • Moonshot開発開始
  • 民事と同時に刑事でも争われてたけど不起訴で決着・勝利
  • ジムでトレーニング開始
  • 68Zサイバースティック対応パッチ
Q3は仕事がエグくてGitHub見ても草枯れてたので、ほんとこんなもんだったらしい。

ゲーム

ゼノクロとティアキンをクリアして満足です。あと超連射をやっと1周できるようになった。

他にはドラム教室通い続けてますってのと会社のメンバーで月イチくらいでスタジオれ練習してますってのと。あとはVRでDJイベントを月イチくらいで開催してフライヤーのデザインとかしたり、他のイベントにお呼ばれしてDJしたり。

あー、あとはあれだ!正月は長女が本来なら半年前に仕上がってるはずの中学伝統の論文制作が終わってなくて。先生も「もう、お父さん手伝って良いから、なんとか仕上げてください」って感じで。その時には第一稿もう上がってきててうちの子だけ空白。修正のタイミングで絶対に入れてくださいって、もう本当にえらい苦労したの、これだわ。
こういう逃げようと思ってたマネージメント業務から逃げ切れないの、この世は仮初めのトレーニング空間って可能性をより強く示唆するわ。

2023年2月6日月曜日

CPLDでシリアル扱うの難しいね、という話

この件について、反省文ですw 

もともとやろうとしてたのは、シリアル伝送の18bit PCMデータをI2Sに変換すること。んで、想定してた元PCMの周波数が8MHzのクロックが入ってるので分周して半端なサンプリングレートだろうと思っていた。そうなるとなるべく高い周波数で非同期で変換してやるしかないかな、という事で96kHzのI2Sで読み出すことを考えていた。

この際、ハードで実装するならFF打つ回数を限界まで減らさないと無理だと思っていたので、内部には18bit x 2chの36個のFFを用意して、元の信号で順次更新、I2Sで非同期に読みだし。元信号がMSBから出てくるし、倍速以上で読み出せば誤差はLPF通せばほぼ消えると思ってた。

この時の間違ってた想定は「MSBから更新してけば、どのタイミングで読み出しても更新中の値は更新前と更新後の値の間にあるだろう」で、これは完全な誤り。例えば16bitで考えると、0から-1へ更新が入る時は、MSBが入った瞬間に-32768へ値が飛び、徐々に大きなビットが落ちて-1へ近づく。なので、たまに大きなノイズが入る。

もう1つの誤算は元の信号が半端な周波数ではなかった事。きっちり48kHzで出ていたので96kHzで読み出すと、ノイズの載る位置が固定化されて、クロックドリフトでゆっくりノイズの載るビットがズレていく。これがTweetで見ていた現象でした。

最初はメタステーブルかと思って、入力側のクロックを一桁速い出力側のクロックで取り込んで2段くらいFF打ってから使ってみたんだけど関係なかった。

で、これを真面目に対処しようとすると、18bitのシフトレジスタで更新していって値が確定時に別の18bit FFに取り込み。で、これをI2Sから直接出すと、やっぱり出力中に値が変わっちゃうことがあるので、I2Sもフレームの最初のタイミングで18bit FFに丸々コピーして、そこから読み出し。結局3段のバッファが必要なんですね。ステレオだからバッファだけでFFが108個かな?EPM3064だとFFは64個しか無いので、一気に3倍になったFFを実装するのは無理で、結局2枚のチップに分けて入れました。I2Sの出力に6bitカウンタが必要だし、他にもタイミング作るのにいくつかFFが必要なので、分けてもギリギリでした。はぁ……材料不足つらいですね。

それと、Qiitaに雑なI2Sの理解として軽くメモ書きを残しました。

2023年1月30日月曜日

X68000 修理にて復活!

はじめに

X68Z ハッカーズエディションを試せる事になったので、それに先立ってずっと故障したままだったX68k EXPERTの修理をし、無事元気になったのでその報告です。

壊れた経緯は例にもれず電源です。ただ大学のサークルの部室に置き去りにしてたのが、煙を吹いて動かなくなったという連絡があって。それを回収してそのまま20年近く放置してたのかな?それ以来、ハードディスクも火を入れずにずっとしまい込んでた。

ちなみに他にcompact XVIというかredzoneも所有していて、あとはサンデーネットが閉じる時にもらったXVIを所有してますが、両方とも電源が理由で死んでました。XVIも電源修理であっさり直ってますが、特に新しい話題はないのでEXPERTの修理の話を発掘しやすいようにまとめとこうと思います。

まずは電源から

という事で、まずは電源交換の本スレがこちら。

BEEPさんで購入した、同人サークルさんがセットで用意してくれたPico PSU換装キット。今回は日和ってまずは確実に動く状態にしようと安全側に倒しました。キットがなくても12V、5V、-12Vを拝借できれば良いので、この手のがなくなっても最悪どうにでもなるのかな、と思いました。今なら修理方法も世の中に出回ってるし、ヤフオクで交換部品のセットを安くまとめてくれてる人もいるので、そういうのを利用すれば数千円くらいで直せるんじゃないかな?Pico PSUだと5Vの供給が足りないかもアドバイスもあったので、Phantomで強力なラズパイを使うとか、拡張ボードを挿してるなんて場合は電源を修理した方が良いのでしょうね。

エラーが発生しました。リセットして下さい。

電源は入ったものの最初みたメッセージはこれ。やっぱり何か壊れてる?

って事で、この時点で一番怪しいのはSRAMのデータが飛んでる事態。まぁ、長年放置してたわけで、当然バックアップの電池は死んでますね。SRAMの内容が壊れてるとブートデバイスの情報も消えてるので、結果としてさっきの画面に飛ぶのかな。なのでOpt.1を押してFDから強制起動を試すことで先に進めます。まぁ、普通はここでFDDが死んでて起動できない気もしますが。しまい込んでたと言っても、ずっとマンション内で空調の効いた仕事部屋に安置されてたので状態は良かったようです。

電池交換

続けて電池交換はこちら。EXPERTだと+側の2端子のうち1つはN/Cなので、パターンを見て繋がってるほうにハンダしてあげて下さい。使ったのはCR2450だけど3Vならなんでも良いのかな?

電池が入ればOpt.1でHumanなりを起動してswitch.xで設定してやればエラーは出なくなります。

テキストVRAMの交換

何事もなければこれで修理完了だったんでしょうけど、残念ながら他にも壊れてました。

こんな感じで画面の上の方に点線が現れます。これだけなら少しノイズがあるだけで我慢できますが、テキスト面で画面上方となると、スクロール等で画面中にコピーされまくります。特にテキストはピクセル単位じゃなくプレーン方式なので、特定のプレーンだけゴミが撒き散らされて。用途によってはパレットをうまく使ってマスク用プレーンにしてたりするんで文字がまったく見えなくなっちゃったりします。

という事で奮闘開始したのがこのスレ。

まずはメモリーテストでテキストVRAMでエラーするのを確認。M51C262相当品は新品入手は難しそうだったのでAliExpressでリサイクル品を探して発注。HM53461ZPを見つけて購入しました。ワードアクセスと平行してシフトしながらビット読み出しもできる感じのマルチポートなのかな?こういうタイプのメモリは初めてだったので、変換ボード組んで載せ替えるとかは避けました。

メモリが届いてからは実際に壊れてるチップの特定作業。XVIとかはサービスマニュアルが公式から公開されてるけどEXPERTにはないんですよね。ただまぁ、そこまで変わってる部分じゃないだろうって事でXVIの回路図は確認しました。それでテキストVRAMはこの4bitのチップを4つ並べて16bitにし、各チップのメモリ空間がちょうど1プレーン分ある事がわかります。なので、それをx4で4プレーン分載せて合計16枚でテキストVRAMを構成してる。シルクで書かれてるIC番号は当然XVIとは違うけど、まぁ同じような順番だよねっていう想像もできるので、若い番号からプレーンごとに並んでるんだろうな、という予想もできます。

実際に壊れた箇所は自分でテストプログラムを書いて詳細に調べました。$00e60e00 - $00e60fff にかけてbit 10-11の2bitがhighにならなくなってたので、最終プレーンでbit 8-11を担当してるチップを交換すれば良い事になります。プレーン内の並びは回路図の信号名で当たりをつけてLSB側から並んでると判断。という事で、16個中の15番目のメモリが怪しい。

VICONから配線を追うことができればEnableがどこに繋がってるかで並びは確定できるんですが、拡張スロットの下にあって調べられませんでした。拡張スロットって外せるんですかね?

そんなわけでメモリ交換はシュッ太郎の出番。ただ電源ピンはかなり苦戦します。昔は原因理解してなかったんだけど、これって当時の基板はthermal reliefとか考えてなかったからですよね。ベタで繋がってるんで熱が逃げちゃうから基板全体を温めるか火力を上げるか、みたいな。この辺はベテランの人のノウハウを知りたいところなんですが、自分はわりと細いドリルで掘りがち。今回もチップは抜けたけどGNDの穴は再び塞がっちゃって。グリグリやって穴を確保しました。

という事で、EXPERTは左からplane 1の3:0、7:4、11:8、15:12、plane 2の同じく、plane 3、4って順に並んでるので、もしテキストVRAMが壊れて交換が必要って人がいましたら参考まで。

ハードディスク

SxSIでSCSI読めてたはずなんですが、どうもsusieで認識しない。ハードディスクも怪しいし、68も怪しいし、加えてPhantomを載せてたから問題の切り分けが難しい。という事で、ハードディスクはXVIを直してそっちで救出しました。SCSIボードも持ってたはずなんだけど、誰かにあげた記憶もあって見つからず。本体にSCSIついてるXVIで面倒だけど確実にチェックする方法を選びました。

ハードディスクのサルベージに関してはPhantomさんが本当にスグレモノで。SDカード上に仮想ディスクを作ってくれるので、ハードディスクが無事認識したらmintで仮想ディスクに全部コピーしました。奇跡的にも全部読めたんですよ、もうびっくりです。吸い上げたディスクイメージはクラウドとバックアップストレージに入ったので、たぶんもう僕の命より堅牢。

吸い出し後はPhantomを今回修理した長年の相棒でもあるEXPERTに戻し本格的に再運用を開始しました。

SxSIはおそらく自作で追加したパリティ回路の74が壊れてるんじゃないかと予想。バスリセットとかは飛んでディスクは反応してるんですよね。パリティエラーでネゴれてない印象でした。