電子趣味の部屋

電子系のガジェットやアプリ開発等の趣味の話題を書いてます

ティル・ナ・ノーグの話

オークションでMSX版のティル・ナ・ノーグを入手しました。

マニュアルもあり、ディスクも問題なく使用でき、送料を合わせても2,000円以下なのでお買い得だったと思います。

ティル・ナ・ノーグはシナリオジェネレータ搭載で無限(10億通り?)のシナリオが楽しめるRPGです。 とは言っても目的は魔王を討伐したり、姫を助けたりと数個しかないのですがね。マップやサブイベントがランダムに組み合わされて世界が作られます。

このティル・ナ・ノーグですが、PC98版発売当時に雑誌で見てすごくやりたいと思ってましたが、MSX版を発売したときは一番パソコンをやってなかった時期で特に買うことはありませんでした。 のちにPC-9801BXの時代にすでに発売から5年ほど経ってたPC98版をTAKERUで買ったのが初めてでした。 当時は律義に1で育てたパーティで2をしてました。

その後Widows版がリメイクで発売されたときに久ぶりに遊んで、結局1~5まで全て発売のたびに購入しました。(たしかWindows版には2は無かったような)

しばらくしてPSP版で5(悠久の仁)が発売したときは携帯機ということもあり、結構やりこんでました。 PS VITA発売後はこれで遊ぶために、さらにダウンロード版も購入し、これは今でもたまに遊んでます。

ProjectEGGではPC98版の1と2とPC88版を購入しました。PC98版の1は今やるとまだイベントとかが本当に少なくてただの作業になるので、すぐに飽きてしまいます。だからと言って2を新規にやるとレベルが20から始まるのが嫌なんですよね。PC88版は2のシステムでレベル1から遊べるので何回か遊んでいます。

今回購入したMSX版はPC88版の移植版で前から欲しいと思ってました。 通常はシナリオ作成に30分かかりますが、MSX turboRではディスク2を入れて起動すると高速モードになり、半分の15分ですみます。

Windows版以降のレビューではシナリオの薄さやシステムの古さでそんなに評価は良くないですが、昔から遊んでる人は十分楽しめる内容だと思います。シナリオが薄い分サクサク進めて何回も遊びたくなる部分もあると思います。

今でもやってると言いましたが、最近は数時間遊んでは飽きて、しばらく間を開けたらまたやりたくなって、やり始めるたびにシナリオを作って初めからやるので、全然エンディングを見てませんが、不思議と数か月毎に遊びたくなります。

ドラクエはオンラインの10以外は全てエンディングまで見て、1~3は色んな機種でクリアまで遊んで、さらにiPhoneで1~8まで全てクリアしてますが、遊んだ総時間はドラクエより多いかもしれません。

シナリオが単純な分気軽に遊べるので、興味がある方はぜひ遊んでみてください。

ティル・ナ・ノーグ ~悠久の仁~ - PSP

ティル・ナ・ノーグ ~悠久の仁~ - PSP

  • 発売日: 2009/04/29
  • メディア: Video Game
ティル・ナ・ノーグ ~悠久の仁~

ティル・ナ・ノーグ ~悠久の仁~

  • 発売日: 2009/04/29
  • メディア: Video Game

FPGAで遊ぶ 基本編

今回は比較的入手しやすいDE0-CV 開発キットを使用して解説します。
これは INTEL (ALTERA) のFPGAのCyclone Vを搭載した入門用FPGA開発キットで、ボタンやVGA出力等の豊富なI/Oが初めから搭載されています。

ハードウェア記述言語はVerilog HDLを使用します。
今回は機種依存の書き方はしないので、基本的にXILINXや他のFPGAでもそのまま使用できます。
INTEL (ALTERA) のFPGAは開発環境としてQuartusを使用します。ここではQuartusの使用方法やピンの配置方法は説明をしません。

単純な回路の例

まずはVerilog HDLのソース

module sample01(LED, KEY);

    input [3:0] KEY;
    output [3:0] LED;
	 
    assign LED[3] = KEY[3];
    assign LED[2] = KEY[2];
    assign LED[1] = KEY[1];
    assign LED[0] = KEY[0];

endmodule

このソースの意味はKEYを入力に設定、LEDを出力に設定、KEYとLEDをそれぞれ接続しています。

ソフトウェアのプログラム言語に慣れていると「LED[3] = KEY[3]」を実行した後に「LED[2] = KEY[2]」が実行されてるように思いがちですが、このソースの場合はLEDとKEYをそれぞれ論理的に配線をして、リアルタイムに電気が流れます。

DE0-CVの場合のピン配置を下の様に設定してください。

Node Name Location
KEY[3] PIN_M6
KEY[2] PIN_M7
KEY[1] PIN_W9
KEY[0] PIN_U7
LED[3] PIN_Y3
LED[2] PIN_W2
LED[1] PIN_AA1
LED[0] PIN_AA2

これをDE0-CVで実行した場合は4個のLEDが点灯されていて、タクトスイッチを押すと対応するLEDが消えると思います。
タクトスイッチを押してLEDが消えるのは、タクトスイッチがプルアップされているからです。普段は電気が流れていて、ボタンを押すと電気がGNDに流れるのでOFFになります。

ソフトウェアで処理する場合はクロック等を上から順番にトリガーにしてタクトスイッチの状態を順番にLEDに渡すようなイメージですが、ハードウェアで処理する場合は単なる配線なので常に同時に電気が流れてリアルタイムで同時に処理ができます。例えばGPU等の様にソフトウェアで処理できることもあえて専用のハードを使う意味が分かりますね。

YAMAHA MU2000

前にMU1000を持っていることを書きましたが、スマートメディアがあれば単体でMIDIを演奏できるのに憧れて、MU2000を入手してしまいました。

MU1000入手当時は少し安いからと思って選んだのですが、実はずっとモヤモヤしてました。
オークションで15,000円程です。MU1000はそのままオークションに放出して10,000円程で落札されました。手数料と送料を考慮すると8,000円くらいの差額でした。
メディアプレイヤー機能とサンプリング機能が追加されている以外はMU1000を同じです。

MU1000の時と同様にExtended Editionにアップグレードしたので、GSモード時にはGSマークが表示されます。
Windows10 64bitでもMU2000 Extended Edition R1 アップデータ for Windowsでアップデートできました。(自己責任でお願いします。)

MU2000

パート数:64
最大同時発音数:128
音色数:1396
ドラムセット:58
エフェクト:リバーブ18タイプ、コーラス20タイプ、バリエーション97タイプ、インサーション1〜4各97タイプ、EQ4タイプ

作りながら覚える 3日で作曲入門

作りながら覚える 3日で作曲入門

低価格FPGA開発ボード ALTERA Cyclone IV

型番不明。
複数のショップやブランドで同じボードが売られています。
Aliexpressで低価格なFPGA開発ボードを見つけたので買ってみました。

ダウンロードケーブルも付属して、送料込みで3,300円くらいです。

6272LEのCyclone IV (EP4CE6E22C8N)搭載で、8MBのSDRAMVGAPS/2他色々ありLE数の関係でMSXは無理ですが、簡単な実験や遊びはできそうです。
ダウンロードケーブルはUSBブラスター互換なので、色々使えそうです。

ネットで仕様書が見つからなく、売り主に連絡したら送ってくれました。

自分のメモも兼ねてピン番号を書いておきます。

RESET button 25
FPGA_CLK 23

Keys

KEY1 88
KEY2 89
KEY3 90
KEY4 91

Buzzer

beep 110

Dial switch

ckey1 88
ckey2 89
ckey3 90
ckey4 91

LED

led1 84
led2 85
led3 86
led4 87

UART

UART_TXD 114
UART_RXD 115

IIC

SCL 112
SDA 113
I2C_SCL 99
I2C_SDA 98

PS2

PS_CLOCK 119
PS_DATA 120

IR

IR 100

VGA

VGA_HSYNC 101
VGA_VSYNC 103
VGA_B 104
VGA_G 105
VGA_R 106

LCD 1602 12864

LCD1 RS 141
LCD2 RW 138
LCD3 E 143
LCD4 D0 142
LCD5 D1 1
LCD6 D2 144
LCD7 D3 3
LCD8 D4 2
LCD9 D5 10
LCD10 D6 7
LCD11 D7 11

Digital tube

DIG1 133
DIG2 135
DIG3 136
DIG4 137
SEG0 128
SEG1 121
SEG2 125
SEG3 129
SEG4 132
SEG5 126
SEG6 124
SEG7 127

SDRAM

S DQ0 28
S DQ1 30
S DQ2 31
S DQ3 32
S DQ4 33
S DQ5 34
S DQ6 38
S DQ7 39
S DQ8 54
S DQ9 53
S DQ10 52
S DQ11 51
S DQ12 50
S DQ13 49
S DQ14 46
S DQ15 44
S A0 76
S A1 77
S A2 80
S A3 83
S A4 68
S A5 67
S A6 66
S A7 65
S A8 64
S A9 60
S A10 75
S A11 59
SD BS0 73
SD BS1 74
SD LDQM 42
SD UDQM 55
SD CKE 58
SD CLK 43
SD CS 72
SD RAS 71
SD CAS 70
SD WE 69

MSX パーフェクトカタログ買いました

パーフェクトカタログシリーズは全て持ってるのですが、一番待ち望んだものが発売されました。
MSXパーフェクトカタログです。

ゲーム機のゲームは他にもカタログ的な書籍はあったのですが、MSXは初めてではないでしょうか?

ハードとソフト両方が全部掲載しており、非常に満足できる内容です。

MSXパーフェクトカタログ (G-MOOK)

MSXパーフェクトカタログ (G-MOOK)

  • 発売日: 2020/05/28
  • メディア: ムック

Wio Terminalで軽く遊んでみました Wi-fi編

発売されて人気のあるWio Terminalで遊んでみました。
M5Stackがあれば良いと思ってたのですが、結構話題になっているようでつい買ってしまいました。

自分用のメモも兼ねて、Wi-fiに接続するサンプルを書きます。

Wi-fiのコントローラはESP32と違いSoCとは別にRealtek RTL8720が使用されています。
まずはRTL8720のファームウェアのアップデートとArduinoのライブラリの追加をします。

手順は公式サイトを参照してください
Wio Terminal Network Overview
https://wiki.seeedstudio.com/Wio-Terminal-Network-Overview/

Wi-fiに接続するサンプル
#include "AtWiFi.h"
#include "TFT_eSPI.h"

const char* ssid = "(WI-fiアクセスポイントのSSID)";
const char* password =  "(WI-fiアクセスポイントのパスワード)";

TFT_eSPI tft = TFT_eSPI();

void setup() {

  WiFi.mode(WIFI_STA);  // ステーション(子機)モードに設定

  tft.begin();
  tft.setRotation(1);
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.fillScreen(TFT_BLACK);
  tft.setTextSize(2);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    tft.setCursor(10, 10);
    tft.printf("Connecting to WiFi...");
  }

  tft.printf(" OK");
  tft.setCursor(10, 30);
  tft.println(WiFi.localIP());

  WiFi.disconnect();
}

void loop() {

}

実行結果
f:id:uosoft:20200526144753j:plain

M5Stackで軽く遊んでみました 時計編

今回はM5Stackで遊んでみました。
これも前にM5StickCと一緒に買って積みハードになっていました。

サンプルスケッチを簡単にまとめただけですが、自分用のメモも兼ねてシンプルなソースを書きました。

Wi-fi経由でNTPサーバから時間を取得して日時を表示するまでのサンプルです。


#include <time.h>
#include <M5Stack.h>
#include <WiFi.h>

const char* ssid       = "(Wi-fiアクセスポイントのSSID)";  
const char* password   = "(Wi-fiアクセスポイントのパスワード)";

// NTPサーバのURL
const char* ntpServer =  "ntp.jst.mfeed.ad.jp";
//  GMT+9(日本時間)
const long  gmtOffset_sec = 9 * 3600;
// サマータイム時差(無し)
const int   daylightOffset_sec = 0;

void setup() {
  M5.begin();
  
  M5.Lcd.clear(TFT_BLACK);
  M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);
  M5.Lcd.setTextSize(4);

  WiFi.begin(ssid, password);

  // 500ms*120回なので、1分でタイムアウト
  for (int i = 0; i < 120 && WiFi.status() != WL_CONNECTED; i++) {
    delay(500);
  }
  if (WiFi.status() != WL_CONNECTED) {
    // Wifi接続エラー
  }

  if (WiFi.status() == WL_CONNECTED) {
    configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
    struct tm t;
    if (!getLocalTime(&t)) {
      // NTPサーバ接続エラー
    }
  }
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);

}

void loop() {
  struct tm t;
  if (getLocalTime(&t)) {
    M5.Lcd.setCursor(0, 0);
    M5.Lcd.printf("%04d/%02d/%02d", (1900 + t.tm_year), t.tm_mon, t.tm_mday);
    M5.Lcd.setCursor(0, 40);
    M5.Lcd.printf("%02d:%02d:%02d", t.tm_hour, t.tm_min, t.tm_sec);
  }
  
  delay(100);

}

みんなのM5Stack入門

みんなのM5Stack入門