2017-03-05 26 views
0

バブルソートをz80アセンブリ用に書きましたが、代替レジスタを使用する必要があることがわかりました。しかし、推奨される構文(B ')はうまく動作せず、エラーが発生します。これらのレジスタはどのように使用できますか?代替レジスタを使用するZ80アセンブリ

+3

ええと、それは40年ですが、このような質問については[レトロコンピューティングサイト](http://retrocomputing.stackexchange.com)を検討してください。それらは直接アドレス指定できません。 EXX命令を使用してスワップを強制する必要があります。プライマリは高速IRQサービスコードに役立ちますが、一般的なプログラミングではあまり役に立ちません。レジスタが足りなくなった場合は、メモリに値を格納する必要があります。スタックが最適な場所です。 –

+0

ありがとうございますが、これは私の大学のプロジェクトのためのものです。このような古いものに対処しなければなりません。 –

+0

http://stackoverflow.com/jp/documentation/assembly/4802/registers/16904/zilog-z80-registers#t=201703051314568071355(私が書いた非常に少数の記事のうちの1つで、Z80を例として使用していました) – Ped7g

答えて

4

シャドウレジスタを直接使用する方法はありません。
代わりにシャドウレジスタに通常のレジスタを交換するためのinstruction EXXがあります。あなたは、割り込みハンドラ外シャドウレジスタを使用する予定がある場合

disable interruptsシャドーレジスタを使用しての期間
ダークサイドに自分をしなければならない与えます。

例:お使いのシステムは、割り込みハンドラ中で影のREGSを使用している場合

di   ;disable interrupts 
exx   ;exchange registers BC,DE,HL with BC',DE',and HL' 
ld b,8  ;do stuff with the shadow registers 
.... 
exx   ;put the normal registers in charge 
ei   ;re-enable interrupts 

のみ適用されます。
が無効に割り込み、またはお使いのシステムで長い計算をしないでください警告

は、外部入力割り込みハンドラ・プロセスに反応することはできません。

AF:AF 'のシャドウレジスタもあります。
あなたはそうのように、このアクセス:ex自体のフラグに影響を与えませんが、ex af,af'はフラグがその影に登録し交換すること

ex af,af' ;exchange af with its shadow register. 

注意。詳細情報については

は、以下を参照してください。http://z80-heaven.wikidot.com/instructions-set

注意をbubble sortはアルゴリズムとして吸うと、それは禁止されるべきこと。
代わりにinsertion sortを実装してください。

は、あなたが長い処理を行う行う場合、あなたはシャドウレジスタを使用することはできませんし、pushpopを使用して代わりにスタックを使用しなければなりませんスタックルーク
を使用してください。

ld b,8    ;normal processing 
push bc    ;save bc for later 
ld b,9    ;extended processing 
... do stuff with bc 
pop bc    ;throw away the extended bc and restore the old bc. 

...いいえ。もう一つの...がある。
スタックがあなたのためにカットしない場合は、ldを使用して値をメモリに保存する必要があります。

ld b,8    ;do stuff with bc 
ld (1000),bc   ;store bc for later 
ld b,9    ;do other stuff 
..... 
ld (1002),bc   ;store the extended bc 
ld bc,(1000)   ;restore the saved bc 
....     ;continue processing. 

メモリを直接扱うことについての素敵な点は、値を捨てる必要がないことです。欠点はスタックよりも少し遅く実行されることです。

+1

割込みを無効にする必要があるのは、割込みハンドラがシャドウレジスタを使用する場合だけです。たとえば、ZX Spectrumでは、ROMからのデフォルトのIM 1ハンドラはシャドウレジスタを使用せず、 'DI 'なしで自由に使うことができます。また、複雑な作業を行う場合は、通常、自分のIM 2ハンドラで終了します。したがって、割り込みによって使用されるレジスタを完全に制御できます。さらに、VSYNCと同期していて、フレームごとに実行時間が安定しているコードがある場合は、どのパートで正常なIRQを取得できないのかを知ることができます。 DIは過大評価されています。 ;) – Ped7g

+0

メモリの保存について... Z80では、 'ld(next_load + 1)、bc'' next_load:ld bc、12345'のような自己修正コードを使用していました。コードはすでにその値のメモリを予約していました)、 'bc/de'レジスタの値を2倍早くロードします。しかし、このようなテクニックは、ソースコードの可読性の理由から強く推奨されていません。Z80でうまく動作すると言います(現代のCPUではなく、場合によってはパフォーマンス上のペナルティが発生します。書き込みが遅すぎる場合は正しく動作します)。 – Ped7g

関連する問題