パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

もうやらなくていい昔のコーディングテクニックあれこれ」記事へのコメント

  • by NOBAX (21937) on 2009年05月04日 13時10分 (#1558968)
    レジスタが少なかったので、スタックに放り込んでおいて、飛び先でPOPして使う。
    80系は裏レジを使いこなす。
    のがコツなんて古すぎて、誰もわからないか。
    • Re:68系は (スコア:2, おもしろおかしい)

      by Anonymous Coward on 2009年05月04日 13時15分 (#1558976)
      今はもっとひどい
      アマチュアは今でも癖のあるアーキテクチャのPICマイコン(8bit品)一辺倒で,姑息なコーディング・テクニックを競い合っている
      親コメント
      • by Anonymous Coward
        どの辺が一時しのぎ?
    • Re:68系は (スコア:1, すばらしい洞察)

      by Anonymous Coward on 2009年05月04日 15時37分 (#1559043)
      80系なんて言うな。裏が使えたのはZ80だけだろ。
      親コメント
      • Re:68系は (スコア:3, おもしろおかしい)

        by Anonymous Coward on 2009年05月04日 15時42分 (#1559052)
        R800の事も忘れないで…やはり忘れてください
        親コメント
      • by Anonymous Coward

        裏レジスタが使えたのはSHARPのセカンドソースと互換品のみ。

        # MZ80系ならSP-1020で画面クリアして
        # 「ネ木1ネ木4→コ」「GOTO $DOOO」
        # でSAVEってのも懐かしい

        • by komakisakio (33768) on 2009年05月04日 20時17分 (#1559184)
          いや、Zilog純正のZ80で使えますけど。ひょっとして8080では使えないって話をしてます?

          一応、http://ja.wikipedia.org/wiki/Z80 を張っておきます。
          親コメント
          • by Anonymous Coward

            裏レジスタじゃなくて拡張レジスタの方だっけ?ixhとかixlとか…

            • by komakisakio (33768) on 2009年05月06日 15時36分 (#1559998)
              IX, IYを8bit単位に分割する(IXH, IXL, IYH, IYL)命令なら、互換品でしかサポートされなかったと思います。
              純正でもeZ80やZ280だとちゃんと使えるようになってますが。
              親コメント
              • by taka2 (14791) on 2009年05月06日 16時15分 (#1560013) ホームページ 日記

                うろ覚えですが、Zilog本家では仕様に明記されていなかっただけで、
                Zilog純正Z80でもIXH/IXLなどは使えました。

                Z80 では、HL レジスタに対して処理を行うオペコード XX に対し、
                DD XX で、HLの代わりに IX に対する処理
                FD XX で、HLの代わりに IY に対する処理
                になってました。(ただし、(HL) に対する命令の場合は、(IX+d)になるので、オペランドが一つ増える)

                で、本来の命令セット仕様上は IX は16bitレジスタで、8bit単位で処理する命令は無かったのですが、
                HレジスタやLレジスタに対する命令の前にDD/FDを付けてやれば、IXやIYを8bit単位で処理できました。

                さらに言うと、
                HLレジスタが無関係なオペコードの前に DD/FDを付けても、元のオペコードの命令をそのまま実行してましたし、
                「 DD DD XX 」って感じで DD プレフィックスを複数回重ねても動作しました。

                DD/FDというオペコードは、IX/IYに対する命令専用で、それ以外の目的には使われてなかったので、
                DD/FDは一時的にHLレジスタをIX/IYに切り替え、
                その次のオペコードは、そのまま通常の解釈実行部でそのまま処理するような
                単純な設計になっていたのでしょう。

                親コメント
              • by Deasuke (34806) on 2009年05月06日 19時59分 (#1560069) 日記
                はい、そうですね。そこまでは私もやったことがあります。さらに無関係な位置にEDを挟んでも(私の実験した範囲では)EDを無視して処理しました。(コピープロテクトチェッカーはdisassembler避けに(?)こういう変な命令を使っていた覚えがあります)。
                DD DD FD DD FD xx はどうなんでしょう? FD xx と一緒ですかね?
                DD ED xxはどうなんでしょう?
                このあたりは実験したことがないです。
                --
                Best regards, でぃーすけ
                親コメント
              • by Anonymous Coward
                Z80のDDやEDバイトなどは、それ自身がCPUの内部状態を変更する1つの命令と考えると、実装に近いかと思います。
                同じテクニックを古いミニコンの資料でちらっと見た覚えがあります。
                8086のプリフィックスバイトも同じような実装じゃないかな?
    • by mari-nyan (35774) on 2009年05月04日 20時43分 (#1559200) 日記

      友達の友達がARMのアセンブラを今やってるらしいんですが、その辺いまだにやらないといけないらしくて大変だ、って言ってました。

      あと、レジスタが少なくて本気で困ったのは6502ですね。16bitレジスタないしorz
      6800はアキミュレータが2本と16bitインデックスもあるし、スタックも16bitでしたし。
      なんてことも言ってました。又聞きな上にアセンブラが判らないのでさっぱりですorz

      親コメント
      • by Dobon (7495) on 2009年05月04日 22時30分 (#1559249) 日記
        メインメモリの先頭256バイトが6502のレジスタです。
        CPU内部の『レジスタ』はレジスタアクセス用のインデックスです。

        # そう考えないとやってられません。
        --
        notice : I ignore an anonymous contribution.
        親コメント
        • by Anonymous Coward

          >メインメモリの先頭256バイトが6502のレジスタです。
          >CPU内部の『レジスタ』はレジスタアクセス用のインデックスです。
          実際そうでしょ?
          当時出荷されていた8bitCPU(i8080,M6800,MCS6502)で唯一メモリ関節アドレッシングがあったのが何よりそれを物語ると思いますよ
          というかゼロページ(16ビットアドレスの上位8ビットをページと表記してた)使わないとポインタ作れないアーキテクチャなんだもの
          むしろ6502で涙が出るのはスタックが1ページだけって事の方が制限でかいような(スタックポインタが8ビットなんだよね)

          #そんなこと言ったらTMS9990とか9995はレジスタ持っていない事になっちゃうじゃないか!

          • by Dobon (7495) on 2009年05月04日 23時02分 (#1559264) 日記
            |あと、レジスタが少なくて本気で困ったのは6502ですね。16bitレジスタないしorz
            これに対する返答ですので。

            |むしろ6502で涙が出るのはスタックが1ページだけって事の方が制限でかいような
            これは「スタックを使うな」という設計者の意思表示だと思ってました。
            実際、プログラムの大半が表引きとジャンプになりますので、スタックは消費しなかったような…(もう記憶が薄れてる)
            --
            notice : I ignore an anonymous contribution.
            親コメント
    • 68系に慣れてると80系で裏レジスタを使う必要自体そんなに感じなかった気がします。裏レジスタとの二重化が煩雑過ぎて手癖的にスタックやメモリ格納を多用してしまう。
      で、PUSHU/PUSHSだとX,Yのインデックス参照よりも余計に1クロック(だったよな?)喰う場合があるのでスタックポインタとインデックスレジスタで同じアドレスへの読み書きを読み書きするバイト数に応じて巧みに使い分けていた記憶があります。

      で、もっと悲惨な事例というのはありまして、某国産4bitマイコンで複数周期のタイマ割り込みを頻繁にかけてマルチタスクもどきにしないと拙い仕様の機器を作る羽目になったことがあって、こいつが4bitアキュムレータ一個と128ワードのメモリしか持たないものだから(インデックスレジスタすらない、メモリ間接アクセスはある)、高速にアクセスできる0ページ($00-$0F番地)をレジスタ代わりにして番地ごとに役割を割り当てて$10番地以降のメモリへのアクセスやI/O処理をなんとかこなしました(^^;

      この手のノウハウというのはCPUに近い泥臭い部分をやる以上は消えないと思いますよ。

      親コメント
      • by Anonymous Coward
        > で、PUSHU/PUSHSだとX,Yのインデックス参照よりも余計に1クロック(だったよな?)喰う場合があるのでスタックポインタとインデックスレジスタで同じアドレスへの読み書きを読み書きするバイト数に応じて巧みに使い分けていた記憶があります。

        6809って本当に直交性がありませんよね。命令エンコードも違うし。
        あんな6800に無理な拡張をしたガラクタを究極の8bitと有り難がる連中の神経がわかりません。
        • by Anonymous Coward
          http://tlindner.macmess.org/wp-content/uploads/2006/09/byte_6809_articles.pdf
          これを読めば、あなたの6809を見る目は、変るかもしれません。
          • by Anonymous Coward
            それは読んでいますが、その上での感想が「モトローラは教条主義的だが詰めが甘い」です。
    • by Deasuke (34806) on 2009年05月06日 19時51分 (#1560067) 日記
      >裏レジを使いこなす。
      そう言えば、1ループの中にEXX命令が奇数個入ったZ80のプログラムを平気で書いていたなぁ。
      --
      Best regards, でぃーすけ
      親コメント
    • by Anonymous Coward
      コード節約でレジスタ入れ替えの時に使ってたっけ
      push ax, pop bxみたく
      • by Anonymous Coward
        入れ替えになってない

最初のバージョンは常に打ち捨てられる。

処理中...