東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

別館: 茶ネタなら
恵比寿亭茗茶楼

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

むかしばなし

ネタ元 → おねだり (o^^o)

僕のオフィスの引き出しには昔々のメモリやらチップやら、
何の役にも立たんゲジゲジが隅っこで眠ってます。
なんか捨てるに捨てられなくて。

こんなのが眠ってました → Intel 2716
一個で2KBのROMです。
背中に開いた窓から紫外線を当ててしばらくするとデータが消えて0xFFになります。
紫外線を当てるごとにチップの余命がぢわぢわと減っていきます。
最初はほんの数分で消去できるんですけど、消去/書き込みを何度も繰り返すうち、
だんだんと消去にかかる時間が伸び、しまいにちっとも消えてくれなくなるです。
物覚えが悪くなるんじゃなくて、物忘れが悪くなるんですな♪
※ 書き込みはROM-writerてゆーのあるです。

ヒマだったもんで、実験室の備品借りて昔々の2716のナカミを読み出してみました。
16進でダンプを取ると、00 00 00 って三連の0x00がしょっちゅう出てきます。

その昔、僕はZ80のアセンブラで仕事してました。8bit-CPU Z80の命令語では
00 は NOP : なにもしない って命令です。 プログラムとしてはまったくのムダ。
また、Z80での goto 命令は C3 ## ## です。
## ## にはジャンプ先のアドレスが入ります。
同様に call 命令は CD ## ##

つまりね、2716に入ってた三連の0x00は"パッチをあてるため"だったのね。
3バイト空いてればそこに goto/call 命令を埋め込むことができるワケよ。
昔のシステムにはこんなROMに機械語詰め込んだやつをいくつもボード
に挿してお客さんとこに納めてたの。
バグ抜きやら改造/改良に伴ってルーチンのアドレスがズレるとたくさんの
ROMを全部交換せにゃならんくなる。
なのでアドレスをズラさんようにパッチをあてていぢくるんですな。

投稿日時 : 2008年5月30日 11:31

コメントを追加

# re: むかしばなし 2008/05/30 11:40 774RR

> 3バイト空いてればそこに goto/call 命令を埋め込むことができるワケよ。
ソースコードレベルで埋め込むことが出来る、と要補足

UVEPROM は消去しなくても 1 であるビットを 0 に書き換えることができる
(0 を 1 に書き換えることは出来なくて、そのためには消去するしかない)
ため、俺たちの場合はむしろ逆方向に使ってますな
0x00 のデータはもう変化させようが無いので。

いかに数命令を無効化することでバグを取る
=バグっている機能をまるごと無効化にする
かをバイナリーレベルで検討するとかやってます^Hした

# re: むかしばなし 2008/05/30 11:50 ゆーち

はげしくなつかしす。(゜∀゜)

プチ量産品をしぶとくロムライトしながら、右手にはんだごて持ってました。(w

# re: むかしばなし 2008/05/30 12:15 アキラ

全然関係ないですけど、昨日なにかご用でしたか?

# re: むかしばなし 2008/05/30 12:16 oki

> CD XX XX
さっぱりわからなかったけど、
BASIC の MON コマンドを思い出しちゃった…。

# re: むかしばなし 2008/05/30 12:53 ぽぴ王子

>>774RRさん
UVEPROM は 1 を 0 に変えることはできるけど、0 を 1 には変えられないと。
ということは、その場合は 0xFF で埋めちゃったりするんでしょうか。
0xFF だと NOP じゃないからアレか…。0xFF って何かあったっけ?

僕も新人の頃はゆーちさんのように、プログラマで出向してたはずなのに
なぜか紫外線でロム消去をやらされたり、クリーンルーム内で半田ごてを
握る会とかやらされたりしてました。

Z80とROMと言えば、ダイヤル回数規制が導入された当時のモデムがDSPと
制御用のZ80という組み合わせのものがあって、ROMを吸い出して中身は
勝手知ったるZ80なのでゴリゴリ書き換えて規制を回避わーなにをする
やめr(ry

NO CARRIER

# re: むかしばなし 2008/05/30 13:00 よねけん

なるほどなるほど。詳しくは知らないのですが、C#/VBのエディットコンティニュでもこういうことやってますね。
DebugビルドのMSILにはエディットコンティニュ用にnopがたくさん入っております。

# re: むかしばなし 2008/05/30 13:03 επιστημη

詳しくはぴんくまで > アキラたん

> 0xFF って何かあったっけ?

RST 38H だな確か。CALL 0038H と等価じゃないっけ。

# re: むかしばなし 2008/05/30 13:21 774RR

ってか UVEPROM が手元に戻ってきたなら消しちゃえばいいので
ビットレベルパッチは OTP (OneTime Programmable) マイコンで使ってました
(=窓が無いので一度書いたら二度と消せないマイコン)

書き込み済みマイコンにバグが発見されちゃったとき
call xxxxH を NOP*3 に置換 (CD xx xx → 00 00 00) して
バグっている機能を丸ごと削除とかとか

関数丸ごと差し替えられるよう出荷直前のソースコードレベルであらかじめ
関数の入口と出口に FF FF FF を埋めとくとかもしてたっす。
RST 38H が実質 NOP になるよう 38H ハンドラは RET のみ。

今はフラッシュマイコンなので何も気にせず書き換えまくってたりして・・・

# re: むかしばなし 2008/05/30 13:27 επιστημη

あー、そだそだ思い出した。
0038H に 0C9H 入れとけば即RETurnだから
FF を"ちょびっと遅いNOP"にできる。
FF ならパッチが当たるのよね♪

# re: むかしばなし 2008/05/30 17:09 安藤@大分

3E 00 とするよりも、
AF とする方が短い時間で済むとかありませんでしたっけ…

# re: むかしばなし 2008/05/30 18:01 επιστημη

3E 00 : LD A, 0 : 7clock-cycle
AF : XOR A : 4clock-cycle
うん、確かに速い(が、フラグが変化してまう)

# アンチョコ:「Z-80の使い方」横田英一 1981 オーム社

# 語れない。 2008/05/30 22:54 AQUA's .NET 奮闘記

語れない。

# re: むかしばなし 2008/05/31 0:26 黒龍

懐かしいw
友人に頼まれてごにょごにょしてた時はもっぱらCD XX XXを00 00 00とかにしてたわけですが。
難しいゲームのHPのSubを無しにしたりとかやってた口です。いやーなつかしい。

# re: むかしばなし 2008/05/31 0:34 えムナウ

2716は懐かしいですね。
その前は1702Aとか2708でしたね。
1702Aは白いのに金線でかっこよかったんですけどね。
雑誌でブローチを作ろうってネタもありましたよ。
2708とか2716はカッコ悪くてがっかりしました。

# re: むかしばなし 2008/05/31 0:38 えムナウ

>3E 00 とするよりも、
>AF とする方が短い時間で済むとかありませんでしたっけ…

21 3E AF とコーディングして3か所入口を作っておいて、
Zフラグ・A-REG・HーREGをチェックして分岐かけたりして、
バイト数を減らす工夫もありました。

# re: むかしばなし 2008/05/31 8:41 一読者

懐かしいですねぇ、Z80
自分もその昔、どこぞのゲーム屋で使ってました。

タイトル  
名前  
URL
コメント