エピ27 MZ80のディスプレイに書いたプログラム
***
エピ27 MZ80のディスプレイに書いたプログラム
***
ディスプレイコードを D000h〜 番地に書込むと対応する文字が画面に表示されます。MZ80のハードウェアはそうなっているのです。
D000h〜D3FFh 番地には2114というRAMが2個あります。1個で 1024 x4ビットで、2個で 1024 バイトです。回路図を見ると、このRAMを繰り返し読み出してフォントデータが入っているROMを参照してビデオ信号を作ってます。
D000h〜D3FFh 番地は、その1バイトが画面上の1文字と対応する特殊なメモリです。
ですが。CPUからはメモリとして普通に読み書きできるのです。書込みだけではなくて読出しもできる。つまり。D000h〜 番地に機械語のプログラムを書き込んで、そこにジャンプしたら、...実行できるのです。
画面にデータを書き込むのは、...GETL の1行入力中ならキーボードから入力できる。つまりプログラムを書ける? これは!
今回はそんな話です。
***
マイコン老人会の方にはお馴染みのフレーズ「ネ木1ネ木4→」とは、画面に書いた機械語なのです(...、個人の妄想です。宜しくお願い致します)。
内容はROMルーチンの 0021h と 0024h をコールするものです。
プログラムを LOAD した直後ならROMワークエリアの 10F0h〜116Fh には値が残っていて、これを流用して 0021h と 0024h をコールすればプログラムを SAVE できる、と言う次第です。
ググると実際の使い方の指南や、更に詳しい解説をするページが見つかります。中でも「シャープ博物館」と言う名のサイトの「画面に直接マシン語を書く?」という記事はお薦めです(参考文献の[W02])。「ネ木1ネ木4」が生まれた経緯が説明されていて。更には機械語入力ツールを画面に書いています。
ディスプレイコードでZ80の機械語を書く人がいるとは。格好良い!
*
*
*
月刊アスキーの1980年8月号に掲載された読者投稿「あっとおどろく(?)プログラム」がこの話の始まりでした。
この時に示されたのは次の 35 文字です(注:画面では1行で入力します)。
編集部は「簡単な暗号です。是非解き明かして下さい」とコメントしています。
宜しい。ならば戦争、...ではなくて逆アセンブルしましょう。
MZ80のディスプレイコードとZ80の機械語を知っていれば簡単な作業です。紙面の写真から文字を判別するのが一番難しいかもね。投稿者と編集部の補足を頼りに推測したけど、...。多分合っていると思いますが違ってたらゴメンね。
D000: 2178D0 : LD HL,D078h
D003: 1600 : LD D,00h
D005: 0E10 : LD C,10h
D007: 0610 : LD B,10h
D009: 7A : LD A,D
D00A: 77 : LD (HL),A
D00B: 23 : INC HL
D00C: 23 : INC HL
D00D: 14 : INC D
D00E: 05 : DEC B
D00F: AF : XOR A
D010: B8 : CP B
D011: C209D0 : JP NZ,D009h
D014: C5 : PUSH BC
D015: 010800 : LD BC,0008h
D018: 09 : ADD HL,BC
D019: C1 : POP BC
D01A: 0D : DEC C
D01B: AF : XOR A
D01C: B9 : CP C
D01D: C207D0 : JP NZ,D007h
D020: C38200 : JP 0082h
あ〜〜、なるほどですね。コードを整理してBASIC風に書き直すと、
10 HL=D078h : D=00h
20 FOR C = 16 TO 1 STEP -1
30 FOR B = 16 TO 1 STEP -1
40 [HL]=D : HL=HL+2 : D=D+1
50 NEXT B
60 HL=HL+8
70 NEXT C
80 JP 0082h
[HL] に D を転送するのが目的。
D は 00h〜FFh と変化。HL は D078h = D000h+40*3 から +2 増を 16 回した後 +8 する。つまり 2*16+8 = 40 増える。これを 16 回繰り返す。
つまり、画面の4行目から16x16で全ディスプレイコードを表示するのです。
全国の素朴なマイコン少年たち(中高生だよ)がこの 35 文字を入力して、GOTO$D000 したら...。吃驚するのが目に浮びます。きっとすごく楽しい体験だよ。
*
夏休みとかにね。自分で組み立てた鉱石ラジオのイヤホンから聞こえる音声とか。何でもよいので。お父様はお子様に原始的な体験を沢山させてあげて下さいな。ブラックボックスてんこ盛りなデジタル体験の前にね。
*
*
*
「ネ木1ネ木4」の起源となった月刊アスキー1980年11月号の読者投稿は、8月号を見て投稿したものですって。
それから、アスキー編集部は「→」を「アッチヤジルシ」と呼び、「スペース」も略さずに詠唱してます。詠唱は大切ね。
*
「ネ木1ネ木4」を逆アセンブルすると(...「→」はカーソル制御文字、「_」はスペース)、
ネ :AF :XOR A
木1_ :D42100 :CALL NC,0021h
ネ :AF :XOR A
木4_ :D42400 :CALL NC,0024h
→__ :C30000 :JP 0000h
です。うーん。読者投稿のより洗練されてます。当時のパソコン雑誌の編集部はマニアの巣窟だからな。燃え上がったのかも。
でもこれが最適かなと考えていたら、
Q__ :110000 :LD DE,0000h
金 :D5 :PUSH DE
┣4 :1E24 :LD E,24h
金 :D5 :PUSH DE
→1_ :C32100 :JP 0021h
というコードを思い付きました。
ネ木1_ネ木4_→__
Q__金┣4金→1_
1バイト短くできたよ。スペースもカウントするとだけど。
*
けど。「Q金┣4金→1」か。...。
「ネ木1ネ木4→」の方がゴロが良くて覚え易くてキー入力も良さそう。
ゴロが良いのはポイントですよね。「ネ木1 ネ木4」の別解として、DCh (CALL C,nm) を使い、C のセットを 37h (scf) で行なうと、「┃円1_┃円4_→__」になります。タテエンイチ,タテエンヨン,...。ちょっとしょんぼりする。そもタテ線が難しい。
キー入力もね。「┃」もだけど。C のクリアを BFh (cp A) で行なうと「ー」(カナの長音)なんだけど、マイナスとかグラフィック文字の横長と紛らわしくて減点。
「ネ」(AFh, xor A) は分かり易いのです。「テ」(97h, sub A) も良いかもだけどさ。うーむ。
*
ググっていたら「ネ木1_ネ木4_→コ_」というコード?を見つけました。「コ」はカタカナのコで、ディスプレイコードは 82h です。
最後の命令を
→コ_ :C38200 :JP 0082h
として、セーブ終了後にSP1002のメインループに戻すのです。0000h に行って初期化から始めても特に困らないと思いますけど、メインループに戻った方がスマートかな。ちょっとした改良ですね。
これに倣うと、
Qコ_金┣4金→1_ (キュウ,コキン,ト,ヨンキン,イッテ,イチ)
ど、どうかな? 少しゴロが良くなってなくない?
*
**
***
間違いの指摘とか疑問とか、ご意見・ご感想とかありましたら、どうぞ感想欄に!
***
2026.5.1 微推敲
2026.5.2 微推敲
2026.5.3 微推敲。連日かよ
2026.5.8 エピタイ修正




