2025年3月9日日曜日

PC-G850とg800とApple Silicon

ポケコンPC-G850を手に入れたついでに、そのエミュレータであるg800をApple Siliconなmacでコンパイルしたので、そのメモ。

基本的にはbrew環境のSDL2を使ってコンパイルしただけで、手直しはほんのちょっとです。brewだけインストール済みって人はbrew install sdl2だけしてもらえたらって感じ。

コードで直さなきゃいけないのは以下の点だけ。基本的には古のUNIXの修正で良くやるやつで、stri*系とmemi*系をstrcase*系に直す、MAX_PATHをPATH_MAXに直す(今どきそれで良いのか?ってのは別の話)、足りてないincludeと標準関数名との衝突を避けるリネームをするだけ。

あとはmakeで警告などは出るものの、最後まで通りました。

diff --git a/basic.c b/basic.c

index 9764b01..0860a6e 100644

--- a/basic.c

+++ b/basic.c

@@ -671,7 +671,7 @@ static int encodeNumDms(uint8 *num, const uint8 *str, int dms)

        } else

                sign = 0x00;

 

-       if(strnicmp((const char *)p, "&H", 2) == 0) { /* 16<90>i<95>\<8B>L */

+       if(strncasecmp((const char *)p, "&H", 2) == 0) { /* 16<90>i<95>\<8B>L */^M

                int i;

                uint32 x = 0;

                uint8 dec[8 + 1], *q;

@@ -3213,7 +3213,7 @@ uint8 *skipBlank(const uint8 **p)

 */

 int peekSymbol(const uint8 **p, const uint8 *symbol)

 {

-       return memicmp(*p, symbol, strlen(symbol)) == 0;

+       return strncasecmp(*p, symbol, strlen(symbol)) == 0;^M

 }

 #define peekSymbol(p, symbol)  peekSymbol(p, (const uint8 *)(symbol))

 

@@ -5468,7 +5468,7 @@ static int staErase(struct Basic *bas, const uint8 **p)

 */

 static int staFiles(struct Basic *bas, const uint8 **p)

 {

-       char path[MAX_PATH] = "";

+       char path[PATH_MAX] = "";^M

        uint8 ch;

 

        if(!isTerm(p))

@@ -5614,7 +5614,7 @@ static int staGoto(struct Basic *bas, const uint8 **p)

 

 /*

 */

-static void pause(struct Basic *bas)

+static void pause800(struct Basic *bas)^M

 {

        if(*pauseWhenPrint & 0x04)

                while(getKeycode() != GKEY_RETURN)

@@ -5688,7 +5688,7 @@ static int staGprint(struct Basic *bas, const uint8 **p)

                        return ERR_10;

        }

 

-       pause(bas);

+       pause800(bas);^M

        return ERR_OK_NEXT;

 }

 

@@ -6552,7 +6552,7 @@ static int staOpen(struct Basic *bas, const uint8 **p)

 {

        int err, fileno = 1, mode = 0;

        uint8 *filename;

-       char path[MAX_PATH];

+       char path[PATH_MAX];^M

 

        if((err = fetchStr(bas, &filename, p)) < 0)

                return err;

@@ -6967,7 +6967,7 @@ static int staPrint(struct Basic *bas, const uint8 **p)

 

        if(isTerm(p)) {

                *noWrap = 0x00;

-               pause(bas);

+               pause800(bas);^M

                return ERR_OK_NEXT;

        }

 

@@ -7050,7 +7050,7 @@ static int staPrint(struct Basic *bas, const uint8 **p)

                        return ERR_10;

        }

 

-       pause(bas);

+       pause800(bas);^M

        return ERR_OK_NEXT;

 }

 

@@ -8028,7 +8028,7 @@ static int getKeywordFromName(int *code, const uint8 *name)

                        }

 

        /* RESERVED<82><A9>? */

-       if(strnicmp((const char *)name, "RESERVED", 8) != 0)

+       if(strncasecmp((const char *)name, "RESERVED", 8) != 0)^M

                return ERR_OK;

        for(p = name + 8; *p == ' '; p++)

                ;

diff --git a/iocs.c b/iocs.c

index 3cb47d1..6e1ed54 100644

--- a/iocs.c

+++ b/iocs.c

@@ -1516,13 +1516,13 @@ uint8 getChrcode(int cursor)

 

                        /* <83><8D><81>[<83>}<8E><9A><81>E<83>J<83>i<95>ϊ<B7><83>e<81>[<83>u<83><8B><82><A9><82><8D>????<EA><92>v<82><B7><82><EA><82>΃L<83><85><81>[<82>ɓ<FC><82><EA><82><E9> */

                        for(r = table; r->roman != NULL; r++)

-                               if(memicmp(roman, r->roman, strlen(roman)) == 0) {

+                               if(strncasecmp(roman, r->roman, strlen(roman)) == 0) {^M

                                        if(strlen(roman) == strlen(r->roman)) {

                                                strcpy(queue, r->kana);

 

                                                if(memory[0x7901] & 0x08) {

                                                        for(d = dai_sho; d->dai != NULL; d++)

-                                                               if(stricmp(queue, d->dai) == 0)

+                                                               if(strcasecmp(queue, d->dai) == 0)^M

                                                                        strcpy(queue, d->sho);

                                                        memory[0x7901] &= ~0x08;

                                                }

diff --git a/menu.c b/menu.c

index 9f84189..1dc1642 100644

--- a/menu.c

+++ b/menu.c

@@ -14,6 +14,7 @@

 #      include <unistd.h>

 #      include <sys/types.h>

 #      include <sys/stat.h>

+#      include <dirent.h>^M

 #endif

 #include "g800.h"


2025年2月15日土曜日

X68000 Zのキーボードまとめ

X68000 ZのEAKのキーボード、色々と曰く付きだったんだけど、Z2祭りにより気持ちが高まったので、少し調べてみたのでまとめ。

調べたキーボードは

  • Hackers Edition
  • Early Access Kit
  • Product Edition
基板に書かれたバージョンは全部同じで「V1 20220823」でした。ただ、Hackers Editionだけは2つ基板に違いがあります。
  1. X68000 Zのシルク印刷がない
  2. 制御マイコン付近のR0(153)が存在しない
R0はVCC-GND間に15kΩを刺してるようです。これ、Hackers Editionでなんらかの問題に気づいて、電源ノイズが問題だと思って入れた対策かな……

そして、Early Access KitとProduct Editionの違いは、電解コンデンサの容量。Hackers EditionとEarly Access Kitは220uF、Product Editionではこれが10uFに差し替えられてる。220はUSBにはでかすぎ。刺した瞬間にコンデンサにチャージするための突入電流が大きくて、ネゴシエーション前に許された電流上限を越えて切断されてるんでしょう。実際、自分はHackers Editionをいろんな環境で使ってきてるけど、Product Edition以外でもわりと挙動は怪しくなりがちでした。

今までコミュニティでは2つの対処方法があったようで、1つはGOROmanさんのコンデンサを10uFに交換する方法、もう1つはVbusに10Ωを直列に挿す方法。後者は電圧降下0.2V程度なので許容範囲との報告だったんですが、自分が以前計測した感じだと全てのLEDが点灯すると40mAくらいまで電流値が上がるので、その時はおそらく0.4Vくらいの電圧降下となり少し不安ありです。GOROmanさんの方は大正解なんですが、もしかしたら立場上あまりハッキリ言えなかったりするかもしれないので、変わってここで大暴露。10uFに交換するのが、Product Edition化改造としては正しい方法です。おそらく公式の修理も同じ対応かと思います。

まとめると

EditionX68000 ZシルクR0電解コンデンサ
Hackers Editionなしなし220uF
Early Access Kitありあり220uF
Product Editionありあり10uF

となります。

さて、実際の作業方法です。

まず裏面の下側の3つのゴムを剥がして、隠しネジを見つけます。この3つの隠しネジと上段の穴の中にある3つのネジ。この計6個のネジを外すことでキーボードが御開帳となります。ゴムはピンセットで引っ掛けてはずせば、そんなにダメージ与えず元に戻せる形ではずせます。中央がちょっと各ネジっぽくなってるけど、ここはシール剥がさなくて大丈夫。罠です。

ネジが外れたら開いていくのですが、爪で止められているのでスマホを開く道具とか使って開きましょう。手前側からが開けやすいです。ぶっちゃけこのキーボードに限っては爪折れても問題ないのでバシッと。ただ、無理に力加えるとカバー全体がバキッといくかもしれないので、全体が歪まないよう気をつけつつ。

蓋を外したら次はこれ。写真の通りキーキャップを外してください。下にネジがあるのがこの5つのキーキャップです。見えるネジを全て外す事で基板が下面ケースから外れます。

キーキャップ外す時は道具揃えた方が安心です。自分は過去にキャップ外そうとして貴重なレトロマシンの軸をへし折ったことが何度も……こういうやつ↓買っときましょう。ほんと便利なんで。

そして最後に電解コンデンサの交換。

中央付近に電解コンデンサ、そのすぐ下にC5、R0と見えるかと思います。コンデンサはたぶんスルーホールじゃないと思うので、片足ずつハンダ小手で温めて引っ張れば簡単に外れます。それかペンチでバッサリ切り落とすのも全然あり。(2/15訂正:綺麗にハンダを剥がして確認した方の情報によるとスルーホールのようです。外しにくい時は足が抜けるよう上方に垂直に引っ張ってみて下さい。)

という感じで、作業としてはわりと簡単だけど、キーボード分解する時にケース傷つけたりとか、それなりの事は起きうるので、自分で作業する場合は自己責任で。慣れてない人は条件(前回のクラファンでEAK、今回のクラファンでZ2購入)を満たしてれば無償で直してくれるみたいなので、無理せず頼んじゃった方が良いと思います。一日たりとも手放せない or 魔改造大好きって人はこの方法でやっとけば、とりあえず電気的にはオマ環にはなりにくいのでないかと。