アドベンチャーゲーム

ZORK1を攻略しました。 tms9918.hatenablog.com

ソースコードもあります。 github.com

Vezzaを使ってZORK1やColossal Cave AdventureをMSXで遊ぶことが出来ます。CP/M版ZORK1.DATはZ3ファイルのようです。 gitlab.com

zmachine-multilingualを使って、CP/M版ZORK1を日本語で遊ぶことが出来ます。 github.com

$ cat ZORK1.DAT > zork1.z3
$ sbcl --script run-zork.lisp
Loaded: translations-ja.lisp
Loaded user file: translations-ja.lisp
Language: Japanese (日本語)
Bilingual mode: enabled
Translations loaded: 169
Auto-save: enabled
Loaded Z-machine version 3 story file
  Dynamic memory: 0 - 2E53
  High memory: 4E37 - 14C00
  Initial PC: 4F05

ZORK I: The Great Underground Empire
Copyright (c) 1981, 1982, 1983 Infocom, Inc. All rights reserved.
ZORK is a registered trademark of Infocom, Inc.
Revision 88 / Serial number 840726

West of House
You are standing in an open field west of a white house, with a boarded front door.
There is a small mailbox here.

家の西側
あなたは白い家の西側の開けた野原に立っています。正面のドアは板で塞がれています。
ここに小さな郵便受けがあります。
>

Colossal Cave Adventureを攻略しました。 tms9918.hatenablog.com

zmachine-multilingualを使ってColossal Cave Adventureも日本語で遊ぶことが出来ます。 microheaven.com

$ sbcl --script run-advent.lisp
Loaded: translations-ja.lisp
Loaded user file: translations-ja.lisp
Language: Japanese (日本語)
Bilingual mode: enabled
Translations loaded: 169
Auto-save: enabled
DeepL API configured.
Loaded Z-machine version 3 story file
  Dynamic memory: 0 - 35AA
  High memory: 4E7E - 13400
  Initial PC: 4E7F

Welcome to Adventure!
(Please type HELP for instructions and information.)

ADVENTURE
The Interactive Original
By Will Crowther (1976) and Don Woods (1977)
Reconstructed in three steps by:
Donald Ekman, David M. Baggett (1993) and Graham Nelson (1994)
PunyInform version: Fredrik Ramsberg (2024)
[In memoriam Stephen Bishop (1820?-1857): GN]

Release 9 / Serial number 260512 / Inform v6.45 PunyInform v6.6

At End Of Road
You are standing at the end of a road before a small brick building. Around you is a forest. A small stream flows out of the building and down a gully.

アドベンチャーへようこそ!
(操作方法や情報については、「HELP」と入力してください。)
アドベンチャー
インタラクティブ・オリジナル
ウィル・クロウザー(1976年)およびドン・ウッズ(1977年)作
3段階に分けて再構築:
ドナルド・エクマン、デビッド・M・バゲット(1993年)、グラハム・ネルソン (1994年)
PunyInform版:フレドリック・ラムスバーグ(2024年)
[スティーブン・ビショップ(1820?–1857)を追悼して:GN]
リリース 9 / シリアル番号 260512 / Inform v6.45 PunyInform v6.6
道の果てで
あなたは道の突き当たり、小さなレンガ造りの建物の前に立っています。周囲は森に囲まれています。建物から小さな小川が流れ出し、谷間へと下っています。
>

Fortran版をPDP-11で遊ぶことが出来ます。 trmm.net

Fortran版のADVENT.DATをPythonで遊ぶことが出来ます。 github.com

Fortran版の一番古いものはこちらのようです。 github.com

Fortran版のソースコードを読むのもいいですし、ZIL版のソースコードを読むのもいいですね。 zilf.io

SEGA GENESIS COLLECTIONを解析してみた!

米国版PS2ソフトになります。 www.amazon.com

ここらへんを参考にして解析してみる。

github.com

例えばTac/Scanであれば、TACSCAN.SRを展開してTACSCAN.ROMを生成します。

$ python xsr.py TACSCAN.SR
files: 22
./ic_TACSCAN.IA 0 11856
./ic_TACSCAN.PNG 12288 31859
./TACSCAN.ROM 45056 45056
./TacScanS18.wav 90112 24750
./TacScanS1C.wav 116736 45830
./TacScanS20.wav 163840 16766
./TacScanS28.wav 182272 24278
./TacScanS2C.wav 206848 45830
./TacScanS31.wav 253952 64206
./TacScanS32.wav 319488 67772
./TacScanS33.wav 389120 73858
./TacScanS34.wav 464896 69918
./TacScanS35.wav 536576 71846
./TacScanS36.wav 610304 74070
./TacScanS37.wav 686080 74970
./TacScanS37A.wav 761856 61740
./TacScanS48.wav 825344 7874
./TacScanS50.wav 833536 5036
./TacScanS51.wav 839680 2528
./TacScanS54.wav 843776 83748
./TacScanS60.wav 927744 17030
./TacScanS6C.wav 946176 37510

CRCを調べて切り出します。 https://github.com/mamedev/mame/blob/master/src/mame/sega/segag80v.cpp

ROM_START( tacscan )
    ROM_REGION( 0xc000, "maincpu", 0 )
    ROM_LOAD( "1711a.cpu-u25",  0x0000, 0x0800, CRC(0da13158) SHA1(256c5441a4841441501c9b7bcf09e0e99e8dd671) )
    ROM_LOAD( "1670c.prom-u1",  0x0800, 0x0800, CRC(98de6fd5) SHA1(f22c215d7558e00366fec5092abb51c670468f8c) )
    ROM_LOAD( "1671a.prom-u2",  0x1000, 0x0800, CRC(dc400074) SHA1(70093ef56e0784173a06da1ac781bb9d8c4e7fc5) )
    ROM_LOAD( "1672a.prom-u3",  0x1800, 0x0800, CRC(2caf6f7e) SHA1(200119260f78bb1c5389707b3ceedfbc1ae43549) )
    ROM_LOAD( "1673a.prom-u4",  0x2000, 0x0800, CRC(1495ce3d) SHA1(3189f8061961d90a52339c855c06e81f4537fb2b) )
    ROM_LOAD( "1674a.prom-u5",  0x2800, 0x0800, CRC(ab7fc5d9) SHA1(b2d9241d83d175ead4da36d7311a41a5f972e06a) )
    ROM_LOAD( "1675a.prom-u6",  0x3000, 0x0800, CRC(cf5e5016) SHA1(78a3f1e4a905515330d4737ac38576ac6e0d8611) )
    ROM_LOAD( "1676a.prom-u7",  0x3800, 0x0800, CRC(b61a3ab3) SHA1(0f4ef5c7fe299ad20fa4637260282a733f1cf461) )
    ROM_LOAD( "1677a.prom-u8",  0x4000, 0x0800, CRC(bc0273b1) SHA1(8e8d8830f17b9fa6d45d98108ca02d90c29de574) )
    ROM_LOAD( "1678b.prom-u9",  0x4800, 0x0800, CRC(7894da98) SHA1(2de7c121ad847e51a10cb1b81aec84cc44a3d04c) )
    ROM_LOAD( "1679a.prom-u10", 0x5000, 0x0800, CRC(db865654) SHA1(db4d5675b53ff2bbaf70090fd064e98862f4ad33) )
    ROM_LOAD( "1680a.prom-u11", 0x5800, 0x0800, CRC(2c2454de) SHA1(74101806439c9faeba88ffe573fa4f93ffa0ba3c) )
    ROM_LOAD( "1681a.prom-u12", 0x6000, 0x0800, CRC(77028885) SHA1(bc981620ebbfbe4e32b3b4d00504475634454c57) )
    ROM_LOAD( "1682a.prom-u13", 0x6800, 0x0800, CRC(babe5cf1) SHA1(26219b7a26f818fee2fe579ec6fb0b16c6bf056f) )
    ROM_LOAD( "1683a.prom-u14", 0x7000, 0x0800, CRC(1b98b618) SHA1(19854cb2741ba37c11ae6d429fa6c17ff930f5e5) )
    ROM_LOAD( "1684a.prom-u15", 0x7800, 0x0800, CRC(cb3ded3b) SHA1(f1e886f4f71b0f6f2c11fb8b4921c3452fc9b2c0) )
    ROM_LOAD( "1685a.prom-u16", 0x8000, 0x0800, CRC(43016a79) SHA1(ee22c1fe0c8df90d9215175104f8a796c3d2aed3) )
    ROM_LOAD( "1686a.prom-u17", 0x8800, 0x0800, CRC(a4397772) SHA1(cadc95b869f5bf5dba7f03dfe5ae64a50899cced) )
    ROM_LOAD( "1687a.prom-u18", 0x9000, 0x0800, CRC(002f3bc4) SHA1(7f3795a05d5651c90cdcd4d00c46d05178b433ea) )
    ROM_LOAD( "1688a.prom-u19", 0x9800, 0x0800, CRC(0326d87a) SHA1(3a5ea4526db417b9e00b24b019c1c6016773c9e7) )
    ROM_LOAD( "1709a.prom-u20", 0xa000, 0x0800, CRC(f35ed1ec) SHA1(dce95a862af0c6b67fb76b99fee0523d53b7551c) )
    ROM_LOAD( "1710a.prom-u21", 0xa800, 0x0800, CRC(6203be22) SHA1(89731c7c88d0125a11368d707f566eb53c783266) )

    ROM_REGION( 0x0420, "proms", 0 )
    ROM_LOAD( "s-c.xyt-u39",    0x0000, 0x0400, CRC(56484d19) SHA1(61f43126fdcfc230638ed47085ae037a098e6781) )  // sine table
    ROM_LOAD( "pr-82.cpu-u15",  0x0400, 0x0020, CRC(c609b79e) SHA1(49dbcbb607079a182d7eb396c0da097166ea91c9) )  // CPU board addressing
ROM_END

PROM以外はCRC32が一致しました!

$ ./crc
Usage: crc filename crc32 size [addr]
$ ./crc TACSCAN.ROM 0da13158 800
crc32=0da13158,size=0800
crc32=0da13158,addr=0000-07ff
$ ./crc TACSCAN.ROM 98de6fd5 800
crc32=98de6fd5,size=0800
crc32=98de6fd5,addr=0800-0fff
$ ./crc TACSCAN.ROM dc400074 800
crc32=dc400074,size=0800
crc32=dc400074,addr=1000-17ff
$ ./crc TACSCAN.ROM 2caf6f7e 800
crc32=2caf6f7e,size=0800
crc32=2caf6f7e,addr=1800-1fff
$ ./crc TACSCAN.ROM 1495ce3d 800
crc32=1495ce3d,size=0800
crc32=1495ce3d,addr=2000-27ff
$ ./crc TACSCAN.ROM ab7fc5d9 800
crc32=ab7fc5d9,size=0800
crc32=ab7fc5d9,addr=2800-2fff
$ ./crc TACSCAN.ROM cf5e5016 800
crc32=cf5e5016,size=0800
crc32=cf5e5016,addr=3000-37ff
$ ./crc TACSCAN.ROM b61a3ab3 800
crc32=b61a3ab3,size=0800
crc32=b61a3ab3,addr=3800-3fff
$ ./crc TACSCAN.ROM bc0273b1 800
crc32=bc0273b1,size=0800
crc32=bc0273b1,addr=4000-47ff
$ ./crc TACSCAN.ROM 7894da98 800
crc32=7894da98,size=0800
crc32=7894da98,addr=4800-4fff
$ ./crc TACSCAN.ROM db865654 800
crc32=db865654,size=0800
crc32=db865654,addr=5000-57ff
$ ./crc TACSCAN.ROM 2c2454de 800
crc32=2c2454de,size=0800
crc32=2c2454de,addr=5800-5fff
$ ./crc TACSCAN.ROM 77028885 800
crc32=77028885,size=0800
crc32=77028885,addr=6000-67ff
$ ./crc TACSCAN.ROM babe5cf1 800
crc32=babe5cf1,size=0800
crc32=babe5cf1,addr=6800-6fff
$ ./crc TACSCAN.ROM 1b98b618 800
crc32=1b98b618,size=0800
crc32=1b98b618,addr=7000-77ff
$ ./crc TACSCAN.ROM cb3ded3b 800
crc32=cb3ded3b,size=0800
crc32=cb3ded3b,addr=7800-7fff
$ ./crc TACSCAN.ROM 43016a79 800
crc32=43016a79,size=0800
crc32=43016a79,addr=8000-87ff
$ ./crc TACSCAN.ROM a4397772 800
crc32=a4397772,size=0800
crc32=a4397772,addr=8800-8fff
$ ./crc TACSCAN.ROM 002f3bc4 800
crc32=002f3bc4,size=0800
crc32=002f3bc4,addr=9000-97ff
$ ./crc TACSCAN.ROM 0326d87a 800
crc32=0326d87a,size=0800
crc32=0326d87a,addr=9800-9fff
$ ./crc TACSCAN.ROM f35ed1ec 800
crc32=f35ed1ec,size=0800
crc32=f35ed1ec,addr=a000-a7ff
$ ./crc TACSCAN.ROM 6203be22 800
crc32=6203be22,size=0800
crc32=6203be22,addr=a800-afff
$ ./crc TACSCAN.ROM 56484d19 400
crc32=56484d19,size=0400
$ ./crc TACSCAN.ROM c609b79e 20
crc32=c609b79e,size=0020

リネームしたものをtacscan.zipにまとめて、mame/roms配下に置いて起動してみます。

>mame.exe tacscan
s-c.xyt-u39 NOT FOUND (tried in tacscan)
pr-82.cpu-u15 NOT FOUND (tried in tacscan)
Fatal error: Required files are missing, the machine cannot be run.

最近のMAMEではROMが不足しているようですが、古いMAME(mame070b.zip)ではPROMは不要です。

Atari 50を解析してみた

Atari 50がセールのようです! store.steampowered.com

ここらへんを参考にして解析してみる。 github.com

>cowabunga64.exe -k atari assets.pie assets.zip

例えばMAJOR HAVOCであれば、assets.zipを解凍してroms/arcade/MajorHavoc.romです。

CRCを調べて切り出します。 https://github.com/mamedev/mame/blob/master/src/mame/atari/mhavoc.cpp

/*************************************
 *
 *  ROM definitions
 *
 *************************************/

/*
 * Notes:
 * the R3 roms are supported as "mhavoc", the R2 roms (with a bug in gameplay)
 * are supported as "mhavoc2".
 * "Return to Vax" - Jess Askey's souped up version (errors on self test)
 * are supported as "mhavocrv".
 * Prototype is supported as "mhavocp"
 * Alpha one is a single-board prototype
 */

ROM_START( mhavoc )
    // Alpha Processor ROMs
    // Vector Generator ROM
    ROM_REGION( 0x2000, "vectorrom", 0 )
    ROM_LOAD( "136025.210",   0x0000, 0x2000, CRC(c67284ca) SHA1(d9adad80c266d36429444f483cac4ebcf1fec7b8) )

    // Program ROM
    ROM_REGION( 0x18000, "alpha", 0 )
    ROM_LOAD( "136025.216",   0x08000, 0x4000, CRC(522a9cc0) SHA1(bbd75e01c45220e1c87bd1e013cf2c2fb9f376b2) )
    ROM_LOAD( "136025.217",   0x0c000, 0x4000, CRC(ea3d6877) SHA1(27823c1b546c073b37ff11a8cb25312ea71673c2) )

    // Paged Program ROM
    ROM_LOAD( "136025.215",   0x10000, 0x4000, CRC(a4d380ca) SHA1(c3cdc76054be2f904b1fb6f28c3c027eba5c3a70) ) // page 0+1
    ROM_LOAD( "136025.318",   0x14000, 0x4000, CRC(ba935067) SHA1(05ad81e7a1982b9d8fddb48502546f48b5dc21b7) ) // page 2+3

    // Paged Vector Generator ROM
    ROM_REGION( 0x8000, "avg", 0 )
    ROM_LOAD( "136025.106",   0x0000, 0x4000, CRC(2ca83c76) SHA1(cc1adca32f70af30c4590e9fd6b056b051ccdb38) ) // page 0+1
    ROM_LOAD( "136025.107",   0x4000, 0x4000, CRC(5f81c5f3) SHA1(be4055727a2d4536e37ec20150deffdb5af5b01f) ) // page 2+3

    // Gamma Processor ROM
    ROM_REGION( 0x4000, "gamma", 0 )
    ROM_LOAD( "136025.108",   0x0000, 0x4000, CRC(93faf210) SHA1(7744368a1d520f986d1c4246113a7e24fcdd6d04) ) // mirrored to c000-ffff for reset+interrupt vectors

    // AVG PROM
    ROM_REGION( 0x100, "avg:prom", 0 )
    ROM_LOAD( "136002-125.6c",0x0000, 0x0100, CRC(5903af03) SHA1(24bc0366f394ad0ec486919212e38be0f08d0239) )
ROM_END

AVG PROM以外はCRC32が一致しました!

$ ./crc
Usage: crc filename crc32 size [addr]
$ ./crc MajorHavoc.rom 522a9cc0 4000
crc32=522a9cc0,size=4000
crc32=522a9cc0,addr=0000-3fff
$ ./crc MajorHavoc.rom ea3d6877 4000
crc32=ea3d6877,size=4000
crc32=ea3d6877,addr=4000-7fff
$ ./crc MajorHavoc.rom a4d380ca 4000
crc32=a4d380ca,size=4000
crc32=a4d380ca,addr=8000-bfff
$ ./crc MajorHavoc.rom ba935067 4000
crc32=ba935067,size=4000
crc32=ba935067,addr=c000-ffff
$ ./crc MajorHavoc.rom 2ca83c76 4000
crc32=2ca83c76,size=4000
crc32=2ca83c76,addr=16000-19fff
$ ./crc MajorHavoc.rom 5f81c5f3 4000
crc32=5f81c5f3,size=4000
crc32=5f81c5f3,addr=1a000-1dfff
$ ./crc MajorHavoc.rom 93faf210 4000
crc32=93faf210,size=4000
crc32=93faf210,addr=10000-13fff
$ ./crc MajorHavoc.rom 5903af03 100
crc32=5903af03,size=0100

リネームしたものをmhavoc.zipにまとめて、mame/roms配下に置いて起動してみます。

>mame.exe mhavoc
136002-125.6c NOT FOUND (tried in mhavoc)
Fatal error: Required files are missing, the machine cannot be run.

最近のMAMEではROMが不足※しているようですが、古いMAME(mame070b.zip)ではAVG PROMは不要です。 www.mamedev.org

※QuantumにAVG PROMが含まれていました。roms/quantum/quantum.avg_promです。MAJOR HAVOCとも共通になります。

Amazonデータレコーダーの使い方

セールでうっかり購入したAmazonデータレコーダーを攻略しました。

www.amazon.co.jp

まずはTAPE部分ですが、CLOADは50%くらいしか成功しないし、CSAVEは100%失敗する。よってデータレコーダーの置き換えにはならない。

つぎにUSB部分ですが、CLOADは音量MAXに合わせてWAVファイルを準備する事で100%成功する。CSAVEは録音したWAVファイルをPCで加工する必要がある。

SDカードをFATまたはFAT32でフォーマットします。例えばPC-6001Vで遊べるSPY PANIC(SPY.P6T)があったとします。これをBASIC部分(SPY1.P6)とマシン語部分(SPY2.P6)のベタファイルに分割して、p6towav.exeでWAVファイルにします。

>p6towav.exe SPY1.P6 SPY1.WAV
>p6towav.exe -f io SPY2.P6 SPY2.WAV

つぎにffmpeg.exeでフォーマットや音量MAXに合わせてレベルを調整します。

>ffmpeg -i SPY1.WAV -ac 2 -ar 32000 -af volume=0.3 -c:a adpcm_ms SPY01.WAV
>ffmpeg -i SPY2.WAV -ac 2 -ar 32000 -af volume=0.3 -c:a adpcm_ms SPY02.WAV

AmazonデータレコーダーのPLAY/REC/REMOTEをPC-6001本体とつなぎますが、PLAYは分岐させてMONITOR用のスピーカーにつなぎます。

PC-6001本体でCLOADすれば、SPY01.WAVが再生されます。BASIC部分をRUNすると、マシン語ロードのタイミングで、SPY01.WAVの最後の部分がふたたび再生されますので、次の曲ボタンでSPY02.WAVを再生します。

REMOTE端子で曲がループしてしまう問題があるので、PLAY/RECだけをPC-6001本体とつなぐのもありだと思いました。

PC-6001FでRAM&RAMカートリッジ

PC-6001FではPC-6001/PC-6001 mk2/PC-6601にも対応しています

sbeach.seesaa.net

手持ちのモニタで表示が右寄りなのを直したい。以下の704を784に修正

VGAOUT.vhd

  vga_hs_i <=  '0' when (LCDMODE = '0' and  784 <= hcntrd and hcntrd <  800) else
                '0' when (LCDMODE = '1' and    0 <= hcntrd and hcntrd <    4) else
                '1';

64KB RAM&RAMカートリッジ相当の機能を実装したい

INTWAITGEN.vhd

-- I/O port F0H-F8H
    process (CLK16M,RSTN)
    begin
        if (rstn = '0') then
            port_f0_reg <= "01110001";
            port_f1_reg <= "11011101";
--         port_f2_reg <= "01010000";
            port_f2_reg <= "01010101";
            port_f3_reg <= "11000010";
            port_f4_reg <= "00000000";
            port_f5_reg <= "00000000";
            port_f6_reg <= "00000011";
            port_f7_reg <= "00000110";
            port_f8_reg <= "11000011";
        elsif (CLK16M'event and CLK16M = '1') then
--         if (MK2MODE = '1' and A(7 downto 4) = "1111") then
            if (A(7 downto 4) = "1111") then
                if (IORQN = '0' and WRN = '0') then
                    case a_low is
                        when "0000" => port_f0_reg <= DI;
                        when "0001" => port_f1_reg <= DI;
                        when "0010" => port_f2_reg <= DI;
                        when "0011" => port_f3_reg <= DI;
                        when "0100" => port_f4_reg <= DI;
                        when "0101" => port_f5_reg <= DI;
                        when "0110" => port_f6_reg <= DI;
                        when "0111" => port_f7_reg <= DI;
                        when "1000" => port_f8_reg <= DI;
                        when others => null;
                    end case;
                end if;
            end if;
        end if;
    end process;

:

    DO_PORT_F0H <= RAMDI       when (a_low = "1101" and EXKANJIENB = '1') else
                    RAMDI       when (a_low = "1110" and EXKANJIENB = '1') else
--                 "11111111"  when (MK2MODE = '0') else
                    port_f0_reg when (a_low = "0000") else
                    port_f1_reg when (a_low = "0001") else
                    port_f2_reg when (a_low = "0010") else
                    port_f3_reg when (a_low = "0011") else
                    port_f4_reg when (a_low = "0100") else
                    port_f5_reg when (a_low = "0101") else
                    port_f6_reg when (a_low = "0110") else
                    port_f7_reg when (a_low = "0111") else
                    port_f8_reg when (a_low = "1000") else
                    "11111111";

PC6001.vhd

-- main ram and SDRAM control
    sdram_add <=
        sd_rdad                                when (sd_sdenb = '1') else
        "010" & "1010" & vdg_cga               when (mk2p66m = '0' and busackn = '0' and vdg_cgenbn = '0') else
        "000" & "1" & (not vramsw2) & vdg_a    when (mk2p66m = '0' and busackn = '0' and vdg_cgenbn = '1') else
        "11" & exkanjiadd                      when (mk2p66m = '0' and exkanjiaddenb = '1') else
-- 【修正】初代機モード: チップセレクト信号(intramcsn/extramcsn)によるバンク切り替えを有効化
        "000" & cpu_a_f2                       when (mk2p66m = '0' and intramcsn = '0') else -- ポートF0hで内蔵RAM指定時
        "001" & cpu_a_f2                       when (mk2p66m = '0' and extramcsn = '0') else -- ポートF0hで外部RAM指定時             
        "010" & "1010" & cpu_a_f2(11 downto 0) when (mk2p66m = '0' and cgswn = '0' and cpu_a_f2(15 downto 13) = "011") else
        "000" & "1"    & cpu_a_f2(14 downto 0) when (mk2p66m = '0' and cpu_a_f2(15) = '1') else
        "010" & "00"   & cpu_a_f2(13 downto 0) when (mk2p66m = '0' and cpu_a_f2(15 downto 14) = "00") else
        "010" & "11"   & cpu_a_f2(13 downto 0) when (mk2p66m = '0' and cpu_a_f2(15 downto 14) = "01") else
        "000" & crtc_a                         when (mk2p66m = '1' and busackn = '0' and crtc_cgrd = '0') else
        "011" & "10"  & crtc_a(13 downto 0)    when (mk2p66m = '1' and busackn = '0' and crtc_cgrd = '1') else
        "11" & exkanjiadd                      when (mk2p66m = '1' and exkanjiaddenb = '1') else
        "011" & "100"  & cpu_a_f2(12 downto 0) when (mk2p66m = '1' and memc_cgromcsn = '0' and charmode = '0') else
        "011" & "101"  & cpu_a_f2(12 downto 0) when (mk2p66m = '1' and memc_cgromcsn = '0' and charmode = '1') else
        "011" & "0"    & cpu_a_f2(14 downto 0) when (mk2p66m = '1' and basicromcsn = '0') else
        "011" & "11"   & cpu_a_f2(13 downto 0) when (mk2p66m = '1' and vo_knromcsn = '0' and vo_knsel = '0') else
        "100" & "0" & kanjisel & cpu_a_f2(13 downto 0) when (mk2p66m = '1' and vo_knromcsn = '0' and vo_knsel = '1') else
        "010" & "110"  & cpu_a_f2(12 downto 0) when (mk2p66m = '1' and slot2romcsn = '0') else
        "010" & "111"  & cpu_a_f2(12 downto 0) when (mk2p66m = '1' and slot3romcsn = '0') else
        "000" & cpu_a_f2                       when (mk2p66m = '1' and intramcsn = '0') else
        "001" & cpu_a_f2                       when (mk2p66m = '1' and extramcsn = '0') else
        (others => '0');

    sdram_rdn <=
        (vdg_rdn and vdg_cgrdn) when (mk2p66m = '0' and busackn = '0') else
        crtc_rdn                when (mk2p66m = '1' and busackn = '0') else
        '0'                     when (exkanjiaddenb = '1') else
        memrdn                  when (mk2p66m = '0') else
        memc_rdn                when (mk2p66m = '1') else
        '1';

    sdram_wrn <=
        sd_sdwrn when (sd_sdenb = '1') else
        '1'      when (busackn = '0') else
-- 【修正】初代機モード: チップセレクト信号に基づいて書き込みを許可
        memwrn   when (mk2p66m = '0' and (intramcsn = '0' or extramcsn = '0')) else -- ポートF2hで書き込み許可時       
        memwrn   when (mk2p66m = '0' and mem16k  = '1' and cpu_a_f2(15 downto 14) = "11") else
        memwrn   when (mk2p66m = '0' and mem16k  = '0' and cpu_a_f2(15) = '1') else
        memc_wrn when (mk2p66m = '1') else
        '1';

ぴゅう太の拡張スロットにRAM&ROMカートリッジをつないでみる その8

ぴゅう太mk3カートリッジスロットに、8KB RAM(HM62256) と 32KB ROM(W27C512)をつなぐ方法を考えてみました。

8KB RAM(C000-DFFF)、32KB ROM(4000-BFFF)でしょうか。

Address  A0 A1 A2 | /CE  RAM  /CE2 A14 A13 ROM
>0000    0  0  0  |  1         1   -   -
>2000    0  0  1  |  1         1   -   -
>4000    0  1  0  |  1         0   1   0  >0000
>6000    0  1  1  |  1         0   0   0  >2000
>8000    1  0  0  |  1         0   0   0  >4000
>A000    1  0  1  |  1         0   0   1  >6000
>C000    1  1  0  |  0  >4000  1   -   -
>E000    1  1  1  |  1         1   -   -

PYUTA8KRAM.EQN

;
; PYUTA8KRAM.EQN - PYUTA3 RAM&ROM CARTRIDGE
;

TITLE PYUTA3 RAM&ROM CARTRIDGE
PATTERN A
REVISION 1.0
AUTHOR TANAM1972
COMPANY PARALLEL COMPUTER INC
DATE 6/21/26

CHIP PYUTA3 GAL22V10

NC A2 A1 A0 NC NC NC NC NC NC NC GND
NC CE_n CE2_n SELEXM A14 A13 NC NC NC NC NC VCC

EQUATIONS

CE_n = /A0 + /A1 + A2

CE2_n =A0 * A1 + /A0 * /A1

SELEXM = /A0 * A1 + /A1 * A0 + /A2 * A0 + /A2 * A1

A14 = A0

A13 = A2

初代ぴゅう太の拡張スロットを使わずにRAM&ROMカートリッジをつないでみる

初代ぴゅう太のカートリッジスロットに、16KB RAMと 24KB ROMをつなぐ方法を考えてみました。

本来はゲームアダプタが必要なのですが、未接続ピンに拡張スロットから信号を配線して、カートリッジ側で対応してみました。

そもそもぴゅう太とぴゅう太mk2/Jrでは、カートリッジスロットのピンアサインが異なるため、8KB/16KBのカートリッジしか互換性がありません。

ぴゅう太+ゲームアダプタ/mk2/Jr用RAM&ROMカートリッジでは、27ピンにA1、6ピンにSELEXM、31ピンにA0、32ピンに/WEとなっています。

初代ぴゅう太本体の改造方法ですが、カートリッジスロットの未接続4ピンにA1、6ピンにSELEXM、33ピンにA0を結線します。これをmk3カートリッジスロットとします。

この改造をしたぴゅう太mk3カートリッジスロット専用RAM&ROMカートリッジでは、4ピンにA1、6ピンにSELEXM、31ピンに/WE、33ピンにA0とします。