<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>キーストローブ &#8211; EXPERTGIG</title>
	<atom:link href="https://expertgig.jp/tag/%e3%82%ad%e3%83%bc%e3%82%b9%e3%83%88%e3%83%ad%e3%83%bc%e3%83%96/feed/" rel="self" type="application/rss+xml" />
	<link>https://expertgig.jp</link>
	<description>工場IoT に特化したシステム開発</description>
	<lastBuildDate>Fri, 20 Jun 2025 22:24:50 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>Raspi Zero 2W ベアメタル開発 9 (キー入力の基礎知識 編)</title>
		<link>https://expertgig.jp/2025/06/21/raspi-zero-2w-%e3%83%99%e3%82%a2%e3%83%a1%e3%82%bf%e3%83%ab-10-%e3%82%ad%e3%83%bc%e5%85%a5%e5%8a%9b%e3%81%ae%e5%9f%ba%e7%a4%8e%e7%9f%a5%e8%ad%98-%e7%b7%a8/</link>
					<comments>https://expertgig.jp/2025/06/21/raspi-zero-2w-%e3%83%99%e3%82%a2%e3%83%a1%e3%82%bf%e3%83%ab-10-%e3%82%ad%e3%83%bc%e5%85%a5%e5%8a%9b%e3%81%ae%e5%9f%ba%e7%a4%8e%e7%9f%a5%e8%ad%98-%e7%b7%a8/#respond</comments>
		
		<dc:creator><![CDATA[Ariyuki Tano]]></dc:creator>
		<pubDate>Fri, 20 Jun 2025 17:22:06 +0000</pubDate>
				<category><![CDATA[マイコン]]></category>
		<category><![CDATA[情報発信基地]]></category>
		<category><![CDATA[KEYSTROBE]]></category>
		<category><![CDATA[MZ-80]]></category>
		<category><![CDATA[Raspi Zero 2W]]></category>
		<category><![CDATA[Ultibo]]></category>
		<category><![CDATA[Z80]]></category>
		<category><![CDATA[キーストローブ]]></category>
		<category><![CDATA[キーマトリクス]]></category>
		<guid isPermaLink="false">https://expertgig.jp/?p=6098</guid>

					<description><![CDATA[MZ80K のキーボードの実装を進めていきたいと思う。 キーボードの実装に当たっては、MZ80K がマップドI/O方式について理解する必要がある。 今、この瞬間に押されてるキーボードは何か? あのキーボードは押されている [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>MZ80K のキーボードの実装を進めていきたいと思う。</p>



<p>キーボードの実装に当たっては、MZ80K がマップドI/O方式について理解する必要がある。</p>



<p>今、この瞬間に押されてるキーボードは何か? あのキーボードは押されているのか押されていないのか? リアルタイムなゲームを作るうえでは欠かせない情報である。MZ80KのBASICでは、キーの状態をリアルタイムに検知する機能はない。</p>



<p>MZ80KのBASIC ( SP-5030等) の場合、INKEY$ でキー入力が発生するまで、ループして押された瞬間を検知することはできるが、今どんな状態かを知ることができない。しかしマシン語を使えば、簡単である。<br>メモリの $E000 と $E001 に接続された Intel 8255 ( Programmable Peripheral Interface ) PPI の対して、操作を行えばいいのである。</p>



<p>具体的には、メモリの$E000 の 上位4ビットは常に1111B として、下位4ビットには下図の知りたいキーがある場所のKEYSTROBE番号をセットして、$E0001 のDATAビットの状態をしらべれば良い。 MZ700やMZ1500のキーマトリクスはネットでもちらほら散見するが、今となっては MZ80Kのキーマトリクスの情報が無いと思われるので、ここに情報を公開しておこう。だれかの役に立つかもしれないので。</p>



<figure class="wp-block-image size-large is-resized"><img fetchpriority="high" decoding="async" width="1024" height="669" src="https://expertgig.jp/wp/wp-content/uploads/2025/06/image-16-1024x669.png" alt="" class="wp-image-6099" style="width:715px;height:auto" srcset="https://expertgig.jp/wp/wp-content/uploads/2025/06/image-16-1024x669.png 1024w, https://expertgig.jp/wp/wp-content/uploads/2025/06/image-16-300x196.png 300w, https://expertgig.jp/wp/wp-content/uploads/2025/06/image-16-768x501.png 768w, https://expertgig.jp/wp/wp-content/uploads/2025/06/image-16.png 1438w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>例えば、【V】キーが押されているかどうか知りたかったら、$E000 に F7h (11110111B) をセットして、$E000 の値が FDh (1111 1101B) ならば、Vキーがおされているということになる。</p>



<p>Z80のマシン語だとこんな感じ。BITの状態を調べて条件分岐。</p>



<pre class="wp-block-code"><code class="">LD ($E000),$F7<br>LD A,($E001) <br>BIT 2,A<br>JP Z,V_KEY_PRESSED</code></pre>



<p>もしくは、AND (論理積) を使って明示的に下記のようにするのも良い。</p>



<pre class="wp-block-code"><code class="">LD ($E000),$F7<br>LD A,($E001) <br>AND %00000100     ; Bit2だけマスク（0b00000100）<br>JP Z,V_KEY_PRESSED</code></pre>



<p>鋭い人であれば、これが複数キーの状態も検知できそうだと気づくだろう。つまり同時押しも検知できるのである。</p>



<p>ただし、キーマトリクスの回路の弱点として、ある特定のパターンで3つ以上のキーを押すと回路のショートルートができ、違うキーが押された誤検知するという現象があり、ゴーストキーと呼ばれています。 </p>



<h2 class="wp-block-heading">エミュレータでどのように組み込むか</h2>



<p>エミュレータでは、マップされたI/O $E000～$E008 のメモリに対して読み書きがあったら、上記処理をすれば良い。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://expertgig.jp/2025/06/21/raspi-zero-2w-%e3%83%99%e3%82%a2%e3%83%a1%e3%82%bf%e3%83%ab-10-%e3%82%ad%e3%83%bc%e5%85%a5%e5%8a%9b%e3%81%ae%e5%9f%ba%e7%a4%8e%e7%9f%a5%e8%ad%98-%e7%b7%a8/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
