9999年12月31日金曜日

当ブログにおける注意点

全般的な注意点

Basically, all articles are written in Japanese, but please feel free to ask me to translate or explain it via Twitter, etc. At GitHub, I'm using English usually.

本ブログは個人の意見を発信する場となっています。ここで記述された情報、意見は所属する組織とは一切関係ありません。

また、記述された情報を利用する事で発生した問題についても当方では一切責任は負えません。自己責任でお願いします。

コメントの見落としが多いというか、ほとんどチェックしてなかったので、何かあればTwitter等のソーシャルメディアで突いてもらえれば捕まるかと思います。

電子工作・アーケード基板系の記事について


趣味で書いてる記事のため、わりと軽い感じで書いてたりはしますが、当方一応は電子工学学士、情報理工学修士です。元LSIの論理設計者でもあり、現役のソフトウェアエンジニアでもあります。適当にやってるようで実は難しい・あるいは危険を伴う事もあるので、専門的な知識、記事の理解なしに見よう見真似で試すのはやめて下さい。ソフトと違って不可逆な失敗のリスクはいたるところに転がっています。最悪、命を脅かすような事故にも繋がりますのでご留意下さい。不明な点はTwitter等で気軽に話しかけてもらえればアドバイスできる事もあるかもしれません。


ソフトウェア系の記事について


ソフトウェアに関しても低レイヤーの情報は一歩操作を誤るとデバイスの文鎮化、データの消失など重大な被害に繋がります。こちらも十分な知識なく、記事を鵜呑みにして実行するのはやめて下さい。


際どい技術情報について


特にメーカー保証の終了した基板の修理などは、修理・調査の過程で本来開示されていなかった技術情報、あるいは守秘義務によって守られるべき技術情報を偶発的に知ることが多々あります。調べた事は可能な限り共有しあう文化で育ってきたため、自分で調べた事は積極的に発信しています。その際、関係各所には配慮するなり、不利益がないよう考えてはいますが、所詮こちらの立場しか見えておらず、権利者からみたら不都合があるかもしれません。その際には連絡頂ければ直ちに双方にとって良い状況になるよう対処したいと考えています。よろしくお願いします。権利を持たない方からの警告等は対応いたしかねますが、個人的に妥当と思える場合には対処します。例えば権利は昔在籍した会社が所有するが、実際にその製品に関わっていた、といった人からの連絡などは間違いなく配慮します。

2024年2月29日木曜日

X68000でBlueSCSIを使ってみる

修理したSASIポートでSxSIの力を借りてBlueSCSIを繋いでみました。BlueSCSIにはパリティを無効化する設定があり、もともとX68000+SxSIで動くという報告があったので、それの追試験と、容量の限界に対する詳しい情報についてです。

まずSxSIですが、はうさんのch30_omakeの最新版をこちらから頂き、SRAM常駐させてます。

Phantom搭載機なのでfull版を入れてます。これでSASIポートに繋がったSCSIデバイスからbootできるようになりますし、SxSIのドライバなどをconfig.sysに登録しなくてもSASIポート版SCSI IOCSが利用できる状態でbootします。この状態だと起動時にSCSI IOCSが見えるからデバイスドライバはhumanのやつが利用されるのかな?

ちなみにSCSI 0番からはbootできませんでした。デバイス名も取得できず名前が一覧に出ませんでした。本来SxSIでは番号を空けずに0番から受けてく事が推奨されているので、0番が使えないのは030_omakeの制限なのかもしれません。この点については詳しく調べずに0版はDynaPortをアサインしてしまいました。これについては今回は触れませんが、SCSIに繋がるWIFIポートになります。READ/WRITEしたものがイーサーネットに出入りするので、将来的にはNeptune互換で使えるようドライバを書きたいです。

で、今回詳しく記録に残すのはハードディスクやファイルシステムの容量関係の話。SxSIやSCSIで利用できる最大サイズやファイルシステムの限界の話です。

SCSI IOCSの仕様的にはブロックサイズ256B/512B/1024Bがサポートされているようです。指定可能な論理アドレスサイズ×ブロックサイズでアクセス可能なHDDの範囲が決まるので、一番大きな1024Bを設定するのが良いです。BlueSCSIではファイル名で指定するのでHD1_1024.HDAみたいなファイル名になります。

またSCSIではREAD6/WRITE6/SEEK6という21bitアドレス指定のコマンドグループと、READ10/WRITE10/SEEK10という32bitアドレス指定のコマンドグループがあります。これらはSCSI IOCSではREAD/WRITE/SEEKとREADEXT/WRITEEXT/SEEKEXTとしてAPI化されているようです。動作をみた感じではアクセスする範囲に応じて必要ならEXT系を利用して*10の方のコマンドが出てきており、32bitフルにアクセスできるのではないかと思います。つまり4GB x 1024Bなので4TBまではSCSI的にはアクセス可能。

一方でファイルシステム上の制限もあります。HumanはFAT16を採用しているため、クラスタアドレスは16bitで指定できる範囲に限られます。4GBの仮想HDDに対してformatコマンドを使って最大サイズのパーティションを確保したところ、クラスタサイズは65535Bでフォーマットされました。つまりは4GBフルに使えてます。また同じイメージをSxSIのscsiformatでフォーマットしたらクラスタサイズは倍の128KBになり、これも正しく使えているため、おそらく4GB以上のディスクでもクラスタサイズが適切に大きくなって扱える可能性が高いです。軽く確認した範囲では16GBを超えると認識時にセクタサイズが大きすぎると言われてリセットになります。これも厳密には16381MBが限界だったと思います。ただ、4GBが32bitで表現できる限界なので、これを超えるとアプリケーションレベルで色々なところに弊害が出てきます。例えばディスク空き容量なんかは正しく表示できなくなります。よって、安全に使うなら4GB(MB指定だと4095MB)で使うのが無難なのかなぁ、と思います。

あと実機上での利用では関係ないですが、BlueSCSIのイメージをDiskExplorerを使ってWindowsから読み書きしようとした場合、scsiformatでフォーマットしたイメージはパラメータを調整しても読めませんでした。SCSI搭載機でformatを使って初期化したイメージはプリセットで読めているので、scsiformatは避けるのが無難かもしれません。原因は深く追っていないので、倍になったクラスタサイズのせいかもしれず、別のサイズのイメージだったら違う結果になるかもしれません。またDiskExplorerも古いソフトなので32bitの4GB制約があるかもしれないので、イメージからのデータ読み書きには4GB以下のイメージを使うのが無難でしょう。

2024年2月28日水曜日

X68000 EXPERT SASIポートの修理

昨年にX68000 修理にて復活!という投稿をしました。

電源をATX電源化、電池はケース化したうえで交換、VRAMが1つ故障していたので交換したところまでが修理の内容でした。ハードディスクはXVIを使って吸い出したもののEXPERTのSASIポートではうまく動作しないままでした。今回はその残るSASIポートの修理についてのメモです。

SASIポート周りについてはOutside X68000付属の初代機の回路図が参考になります。各ポートの制御はIX0909というカスタムチップが1つ鎮座しており、ソフトに見えるレジスタはおそらくその中に入っています。SASIはハードでは制御らしい制御はなく、このカスタムがレジスタアクセスに応じて直接SASIバスの信号を出し入れし、その外にある回路はバッファ程度なので、壊れるとしたらカスタムかバッファに使われているロジックIC、後者なら交換で簡単に直せるはずです。

初代機とEXPERTではカスタムチップの型番とピン配置が少し違います。ロジックICも使っているピンが違ったりはするのですが、基本的には同じ構成です。データバスは74LS642で出し受けしており、双方向バッファの方向は外から入ってくるI/Oで決まりますが、開放時は出力方向になっています。制御信号のうち入力は74LS19がシュミットトリガーで受け、出力は74LS38でオープンコレクタ。すべての信号がロジックの内側は5V、外側は約3Vで動いており、抵抗で分圧したうえでpull-upされてます。

場所的には底面基板に各種IOやFM音源がいます。CPU側のメイン基板から来てるケーブルにバスが全部載っており、電源側の基板からは電源と各ポートの入出力が繋がってます。Sと書かれた2本線がサウンド出力で内蔵スピーカーに向かっているようです。

投稿でカスタムと642の場所を説明してますが、さらに38は642の右に2つ並んでる38のうち左側のものがSASIとカスタムの間にあるやつです。今回は642にあたりを付けて交換しましたが、制御がおかしい場合にはこの38を交換する必要があるかもしれません。他にはアレイ抵抗が壊れてショートしていないかなども注意した方が良いと思いますが、底面基板なので電源入れて直接電圧を確認するのは難しいです。もし怪しいと思ったら、外に出てるSASIポートの電圧で確認するのが良いと思います。

データバスに関してはソフトでレジスタ叩いて出力の変化を見るのが良いかもしれません。

カスタムは出力中でもピンの電位を読み出せるようです。つまり、書いた後に読んだ値が実際にカスタムと642の間のデータバスの電位になります。ここで値がおかしいようなら642が外向きになっていなかったり、バッファが死んで常にGNDやVCCに張り付いているような状況が疑われます。一部張り付いているなら642を、全部張り付いてるなら38から入ってるI/Oを疑うのが良いかもしれません。またこの値は反転した形でSASIのデータバスに出ますから、ポートの電圧を測る事で642経由で期待通りの信号が出てるか確認できます。bitの値が0なら約3V、1なら約0Vですね。

今回は交換するまでは良かったんですが、交換時にソケット化したせいでICの位置が高くなってしまいシールドに接触するという大失態を侵しました。場所的にまさにシールドが出っ張っている位置なので要注意です。C1とか81あたりしか書けなかったら同じことをやらかしてる可能性大(笑)

という事でSASIポートが直ったのでSxSIを使ってBlueSCSIを接続するわけですが、それはまた別のエントリで詳しく書こうと思います。

ちなみにSASIのバスを3Vで駆動しているけど、これは何もバスが3V論理だという事ではないようです。SCSIの仕様書をみると5Vも許容範囲ですし、EXPERTや初代の回路的にも5Vを受けられるように設計されてます。3Vでpull-upしているのはターミネーターの推奨値だからかな?初代機の抵抗値はSCSIリファレンスの分圧でターミネートする時の推奨値でした。EXPERTはもう少し小さい値で近い比率で分圧してたように思います(具体的な数字はメモしてなくて忘れてしまった)。

2024年1月12日金曜日

PC-9801RAにBlueSCSIを繋いでみた記録

年末年始、集めたまま火を入れてない物の中で、特に興味の高いものを整理してました。PC-9801RAもその中の一つ。8001もそうでしたが、NECのパソコンはほとんど触れずに来ていて、大学の時に譲ってもらったPC-486で(いや、それはNECじゃない……)少し曲を作ったりはしてたんですが、身内の手違いで破棄されてしまって(良くあるような悪い話ではない……はずです)。詳しい資料や当時の情報を持っていないので手探りで環境構築してます。

その中でも今となっては厄介なのがハードディスクの整備。とりあえず今から物理ドライブ使うのはデータ消失が怖いし、ネットワークないマシンだとデータのやり取りも大変。という事で、変換器使った何かを考えていたのですが、9801系で有名どころと思われる変換番長が半導体不足で在庫がない状況だったので、せっかくだから少し冒険。オープンソースなら最悪どうにでもなるだろって事でBlueSCSIを選びました。設計データまで公開されてるので自分で基板から作っても良いのですが、最初からそれだと問題切り分けが大変です。国内ではヤフオクで完成品を公式に扱ってる人がいるので、そちらをあたってみる事にしました。自分はmac用のDB25直差し用を購入してます。というのも、自分も元macユーザーで将来はそっちでも使いたいってのと、当時使ってたDB25 to アンフェノールハーフピッチのケーブルが手元に残っているのと、さらにDB25のオスメス変換器が安く売っていたのと。接続は

98本体(アンフェノールハーフメス)⇔ケーブル(アンフェノールハーフオス→DB25オス)⇔変換器(DB25メス→DB25メス)⇔BlueSCSI(DB25オス)

こんな感じ。手持ちが違う人は違うやつ選んだ方が良いかもしれません。

んでBlueSCSIなんですが、なんと元はたんぼ(TNB製作所)さんが作ったArdSCSinoだそうで。Arduinoで動いていたものがARM(STM32)に移植されArdSCSino-stm32となり、そこから派生してBlueSCSIが出てきたようです。現行のv2はSTM32から更にターゲットを変えて、Raspberry Pi Picoで動いてます。さらに最近ではPico Wを使うことでWIFI機能を使い、SCSIバス上に仮想ネットワークカードを繋げられるようです。この機能はホスト側でドライバを書く必要があるので、現状では開発者がメインターゲットにしてるMacintoshのみの機能かな、と思います。が、ゆくゆくは国産レトロ機でもドライバが出てくると面白そうです。

開発者が主にMacintoshユーザーなので、その他の環境への対応がどうなったのか心配なところでもあるのですが、対応してるSCSIコマンドは他のプロジェクトより多そうなので、最悪ちょっとコードいじればなんとかなりそうな感じがありますし、互換性リストではX68000なんかも入ってます。標準SCSIインタフェースでも動くし、旧機種のSASIでもSxSIを使えば本体改造なしで動きそうです(サンプルではパリティを無効にする設定が入ってます)。

で、詳しい経緯に興味ある人はこちらの一連のポストを見てもらうとして、とりあえず無事に動作したので設定をまとめようと思います。

98だとSCSI I/Fも大量に出てると思うのですが、自分が成功したのはIF-92Bになります。が、98固有の問題は内包してるので、他のボードでも状況は似たような感じじゃないかと思います。NEC純正はベンダー設定が必要かも。

[SCSI]
; Debug=1
; Vendor=NEC
System="Generic"
Quirks=0
DisableROMDrive=1
SectorsPerTrack=8
HeadsPerCylinder=32

この中で必須だと思われるのは最後の2つです。この辺りは98固有の事情に関係してるようで、SCSI BIOSのアドレス指定がLBAではなくCHSになっている事に起因するかと思います。これらの情報はNEC純正ではSCSI非標準の問い合わせで得るようですが、サードパーティー製や後期純正だと内部的にこれら8/32の値を想定して変換を行うようです。SCSI BIOSが純粋に全部の変換を行いLBAでディスクにアクセスしてるなら設定不要で動いても良さそうなのですが、少なくともIF-92Bではここを違う値にするとFORMAT.EXEが0除算で落ちるようになります。

また設定以外にディスクイメージも必要ですが、注意点としては

  • セクタサイズは512バイトにする事
  • イメージサイズは8×32×512の倍数にする事
  • 大きすぎると認識されないのでインタフェースの限界にあったサイズにする事
を満たす必要があります。セクタサイズはファイル名に埋め込むようになっているので注意が必要です(設定でBlockSizeを書いても良いかもしれませんが試してません)。この辺りはソースコード見れたので調査がはかどりました。やっぱりオープンソース選んで正解。

% dd if=/dev/zero of=HD0_512.hda bs=131072 count=4096

自分はこんな感じで作りました。Linuxやmacなら同様に、WindowsならWSL使えば同様にできるし、中身空で良いので他にも色々と方法はあるかと思います。

ちなみにcount=4096はIF-92B v1.10の限界っぽいです。サイズとしては512MBですね。1GBまで認識はするようなのですが、領域確保できるのが512Bまででした。巷では1.01や1.20も出回っているので、それぞれ限界は違うかと思います。1.20だと2GBまでいけるって話も見かけます。BIOSパッチ当てられれば良いんだけど、ここはホームグラウンドじゃないから、ひとまずこれで様子見です。

ちなみにボード自体もDIPSWがサウンドボードとぶつかっていて変更したり、画面に何も出ない設定になっていたり、そもそもコンデンサもげて挙動自体が怪しかったり……がスタート地点だったので、色々とリスト減らした上でなんとか正解にたどり着けた感じでした。

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の理解として軽くメモ書きを残しました。