アカウント名:
パスワード:
V25,V35はレジスタバンクが8つぐらいあったような
裏レジスタが使えたのはSHARPのセカンドソースと互換品のみ。
# MZ80系ならSP-1020で画面クリアして# 「ネ木1ネ木4→コ」「GOTO $DOOO」# でSAVEってのも懐かしい
裏レジスタじゃなくて拡張レジスタの方だっけ?ixhとかixlとか…
うろ覚えですが、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に切り替え、その次のオペコードは、そのまま通常の解釈実行部でそのまま処理するような単純な設計になっていたのでしょう。
友達の友達がARMのアセンブラを今やってるらしいんですが、その辺いまだにやらないといけないらしくて大変だ、って言ってました。
あと、レジスタが少なくて本気で困ったのは6502ですね。16bitレジスタないしorz6800はアキミュレータが2本と16bitインデックスもあるし、スタックも16bitでしたし。なんてことも言ってました。又聞きな上にアセンブラが判らないのでさっぱりですorz
>メインメモリの先頭256バイトが6502のレジスタです。>CPU内部の『レジスタ』はレジスタアクセス用のインデックスです。実際そうでしょ?当時出荷されていた8bitCPU(i8080,M6800,MCS6502)で唯一メモリ関節アドレッシングがあったのが何よりそれを物語ると思いますよというかゼロページ(16ビットアドレスの上位8ビットをページと表記してた)使わないとポインタ作れないアーキテクチャなんだものむしろ6502で涙が出るのはスタックが1ページだけって事の方が制限でかいような(スタックポインタが8ビットなんだよね)
#そんなこと言ったらTMS9990とか9995はレジスタ持っていない事になっちゃうじゃないか!
> これは「スタックを使うな」という設計者の意思表示だと思ってました。
ソース失念で非常に怪しいのですが(でも6502の設計者の発言だった)
リソースの制限上、16bit加算器を載せられなかったから
というのが理由だそうです。おしなべて6502の設計は実装最優先ですね。
http://homepage.mac.com/jorgechamorro/a2things/6502.jpg [mac.com]
68系に慣れてると80系で裏レジスタを使う必要自体そんなに感じなかった気がします。裏レジスタとの二重化が煩雑過ぎて手癖的にスタックやメモリ格納を多用してしまう。で、PUSHU/PUSHSだとX,Yのインデックス参照よりも余計に1クロック(だったよな?)喰う場合があるのでスタックポインタとインデックスレジスタで同じアドレスへの読み書きを読み書きするバイト数に応じて巧みに使い分けていた記憶があります。
で、もっと悲惨な事例というのはありまして、某国産4bitマイコンで複数周期のタイマ割り込みを頻繁にかけてマルチタスクもどきにしないと拙い仕様の機器を作る羽目になったことがあって、こいつが4bitアキュムレータ一個と128ワードのメモリしか持たないものだから(インデックスレジスタすらない、メモリ間接アクセスはある)、高速にアクセスできる0ページ($00-$0F番地)をレジスタ代わりにして番地ごとに役割を割り当てて$10番地以降のメモリへのアクセスやI/O処理をなんとかこなしました(^^;
この手のノウハウというのはCPUに近い泥臭い部分をやる以上は消えないと思いますよ。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
最初のバージョンは常に打ち捨てられる。
68系は (スコア:2)
80系は裏レジを使いこなす。
のがコツなんて古すぎて、誰もわからないか。
Re:68系は (スコア:2, おもしろおかしい)
アマチュアは今でも癖のあるアーキテクチャのPICマイコン(8bit品)一辺倒で,姑息なコーディング・テクニックを競い合っている
Re: (スコア:0)
Re:68系は (スコア:1, すばらしい洞察)
Re:68系は (スコア:3, おもしろおかしい)
Re:68系は (スコア:2)
V25,V35はレジスタバンクが8つぐらいあったような
Re:68系は (スコア:1)
Re: (スコア:0)
裏レジスタが使えたのはSHARPのセカンドソースと互換品のみ。
# MZ80系ならSP-1020で画面クリアして
# 「ネ木1ネ木4→コ」「GOTO $DOOO」
# でSAVEってのも懐かしい
Re:68系は (スコア:1)
一応、http://ja.wikipedia.org/wiki/Z80 を張っておきます。
Re: (スコア:0)
裏レジスタじゃなくて拡張レジスタの方だっけ?ixhとかixlとか…
Re:68系は (スコア:1)
純正でもeZ80やZ280だとちゃんと使えるようになってますが。
Re:68系は (スコア:1)
うろ覚えですが、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に切り替え、
その次のオペコードは、そのまま通常の解釈実行部でそのまま処理するような
単純な設計になっていたのでしょう。
Re:68系は (スコア:1)
DD DD FD DD FD xx はどうなんでしょう? FD xx と一緒ですかね?
DD ED xxはどうなんでしょう?
このあたりは実験したことがないです。
Best regards, でぃーすけ
Re: (スコア:0)
同じテクニックを古いミニコンの資料でちらっと見た覚えがあります。
8086のプリフィックスバイトも同じような実装じゃないかな?
Re:68系は (スコア:1)
友達の友達がARMのアセンブラを今やってるらしいんですが、その辺いまだにやらないといけないらしくて大変だ、って言ってました。
あと、レジスタが少なくて本気で困ったのは6502ですね。16bitレジスタないしorz
6800はアキミュレータが2本と16bitインデックスもあるし、スタックも16bitでしたし。
なんてことも言ってました。又聞きな上にアセンブラが判らないのでさっぱりですorz
Re:68系は (スコア:1)
CPU内部の『レジスタ』はレジスタアクセス用のインデックスです。
# そう考えないとやってられません。
notice : I ignore an anonymous contribution.
Re: (スコア:0)
>メインメモリの先頭256バイトが6502のレジスタです。
>CPU内部の『レジスタ』はレジスタアクセス用のインデックスです。
実際そうでしょ?
当時出荷されていた8bitCPU(i8080,M6800,MCS6502)で唯一メモリ関節アドレッシングがあったのが何よりそれを物語ると思いますよ
というかゼロページ(16ビットアドレスの上位8ビットをページと表記してた)使わないとポインタ作れないアーキテクチャなんだもの
むしろ6502で涙が出るのはスタックが1ページだけって事の方が制限でかいような(スタックポインタが8ビットなんだよね)
#そんなこと言ったらTMS9990とか9995はレジスタ持っていない事になっちゃうじゃないか!
Re:68系は (スコア:1)
これに対する返答ですので。
|むしろ6502で涙が出るのはスタックが1ページだけって事の方が制限でかいような
これは「スタックを使うな」という設計者の意思表示だと思ってました。
実際、プログラムの大半が表引きとジャンプになりますので、スタックは消費しなかったような…(もう記憶が薄れてる)
notice : I ignore an anonymous contribution.
Re:68系は (スコア:2, 参考になる)
> これは「スタックを使うな」という設計者の意思表示だと思ってました。
ソース失念で非常に怪しいのですが(でも6502の設計者の発言だった)
リソースの制限上、16bit加算器を載せられなかったから
というのが理由だそうです。
おしなべて6502の設計は実装最優先ですね。
http://homepage.mac.com/jorgechamorro/a2things/6502.jpg [mac.com]
逆に不滅のテクニックでは?(Re:68系は (スコア:1)
68系に慣れてると80系で裏レジスタを使う必要自体そんなに感じなかった気がします。裏レジスタとの二重化が煩雑過ぎて手癖的にスタックやメモリ格納を多用してしまう。
で、PUSHU/PUSHSだとX,Yのインデックス参照よりも余計に1クロック(だったよな?)喰う場合があるのでスタックポインタとインデックスレジスタで同じアドレスへの読み書きを読み書きするバイト数に応じて巧みに使い分けていた記憶があります。
で、もっと悲惨な事例というのはありまして、某国産4bitマイコンで複数周期のタイマ割り込みを頻繁にかけてマルチタスクもどきにしないと拙い仕様の機器を作る羽目になったことがあって、こいつが4bitアキュムレータ一個と128ワードのメモリしか持たないものだから(インデックスレジスタすらない、メモリ間接アクセスはある)、高速にアクセスできる0ページ($00-$0F番地)をレジスタ代わりにして番地ごとに役割を割り当てて$10番地以降のメモリへのアクセスやI/O処理をなんとかこなしました(^^;
この手のノウハウというのはCPUに近い泥臭い部分をやる以上は消えないと思いますよ。
Re: (スコア:0)
6809って本当に直交性がありませんよね。命令エンコードも違うし。
あんな6800に無理な拡張をしたガラクタを究極の8bitと有り難がる連中の神経がわかりません。
Re: (スコア:0)
これを読めば、あなたの6809を見る目は、変るかもしれません。
Re: (スコア:0)
Re:68系は (スコア:1)
そう言えば、1ループの中にEXX命令が奇数個入ったZ80のプログラムを平気で書いていたなぁ。
Best regards, でぃーすけ
Re: (スコア:0)
push ax, pop bxみたく
Re: (スコア:0)