問題タブ [z80]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
math - Z80 のオーバーフロー フラグとキャリー フラグ
Z80 コアにオペコードの ADD A,r セットを実装する準備が整いました。キャリー フラグとオーバーフロー フラグについて少し混乱がありましたが、それが正しいことを確認するためにコミュニティに投稿したかったのです。
基本的に、私が見る限り、Z80 の ALU は符号付き/符号なし操作を気にせず、ビットを追加するだけです。これは、2 つの 8 ビット値が加算され、加算の結果が 9 ビット値になる場合、キャリー フラグが設定されることを意味します。これには、-20 (11101100) と -40 (11011000) などの 2 つの負の 2 の補数を加算することが含まれます。結果は -60 (11000100) ですが、結果は実際には 9 ビット値 1 1100 0100 になります。 2 つの負の 2 の補数値を加算すると、オーバーフロー条件がない場合でもキャリー フラグが常に設定されます。
次に、この命令のオーバーフローを検出するために、両方のオペランドのビット 7 を XOR し、結果が 10000000 の場合、オーバーフローは絶対にありません。結果が 00000000 の場合、次のようにオーバーフローが発生する可能性があります。符号は同じなので、どちらかのオペランドのビット 7 との加算結果のビット 7 を XOR します。この結果が 10000000 の場合、オーバーフローが発生し、P/V オーバーフロー フラグを設定します。私もここにいるの?
このような複雑な質問で申し訳ありませんが、私は正しいと確信していますが、このロジックに基づいて無数の指示を続ける前に知っておく必要があります. どうもありがとう。
math - Z80DAA命令
この一見マイナーな質問についてお詫びしますが、どこにも答えが見つからないようです-Z80エミュレーターにDAA命令を実装するところですが、Zilogマニュアルで、調整を目的としていることに気付きました。 2進化10進演算用のアキュムレータ。命令は、加算または減算命令の直後に実行されることを意図していると書かれています。
私の質問は次のとおりです。
- 別の命令の後に実行するとどうなりますか?
- どの命令がそれに先行したかをどうやって知るのですか?
- Nフラグがあることに気づきましたが、これは確かに前の命令が加算または減算命令であったことを明確に示すものではありませんか?
- 前の命令に関係なく、DAAテーブルに設定された条件に基づいて、とにかくアキュムレータを変更するだけですか?
interrupt - Zilog Z80 - 割り込みモード 1 (IM 1 命令) の使用方法
Z80でIM1割り込みモードを使いたいです。
割り込みモードでは、1 プロセッサはメモリ内の 38h アドレスにジャンプし (そうですか?)、割り込みを続行します。コードでこれを指定するにはどうすればよいですか? 私は以下について読みました:
defs [,] ds [,] この疑似命令は、バイトのブロックをコード セグメントに挿入します。
サンプルソースコードが必要です。
敬具
ラファウ R.
math - DAA命令のハーフキャリー/ハーフボローフラグ
これを私の2番目のZ80DAA質問にしたことをお詫びします-私はこの命令をほぼ実装しましたが、私が確信していないことが1つあります-この命令によってHフラグが設定されていますか?Z80のマニュアルには「指示を参照」と書かれていますが、DAAの実行後ではなく、DAAの前のフラグについてのみ言及されています。
私は次のようにフラグを設定しました:
結果が負の場合はSが設定されます(0x80&結果は0x80に等しい)結果がゼロの場合はZが設定されますH(したがってこの質問はわかりません)P / Vは結果のパリティに設定されます(偶数の場合は1、奇数の場合は0)N元のアキュムレータ値の上位ニブルが変更された場合、Cが設定されます。
これ以外は、私が期待するように指示が実行されているようです:-)誰かが私のためにこれを片付けてくれることを願っています、どうもありがとう。
io - Z80での文書化されていない16ビットI/Oアドレス指定
Z80のZilogデータシートから、I / O(INおよびOUT)グループの命令では、さまざまなレジスタの内容がアドレスバスの上位8ビット(命令に応じて)に配置されることがよくあります。理論的に接続された最大256のデバイスの1つを選択する下位8ビット。
私の質問は、これらの上位8ビットでこれを行うことのポイントは何ですか?一部のマシンは、デコードの複雑さの軽減に関連してこれを使用していることを知っていますが、それらは何かに真剣に使用されていますか?Z80が提案するとおりに命令を実装したいのですが、この動作は非標準であるため、実装する意味がわかりません。この動作は文書化されていないものとして説明されているので、たとえば「セガマスターシステム」ではこれを回避できますか?どうもありがとう。
よろしく、フィルポッター
fetch - Z80メモリリフレッシュレジスタ
別の無害なZ80の質問でもう一度:-)エミュレータコアが現在構造化されている方法で、オペコードバイトがメモリからフェッチされるたびにメモリリフレッシュレジスタの下位7ビットをインクリメントしています-これは、マルチバイト命令の場合などです。 DDまたはFDを開始するものとして、レジスタを2回インクリメントしています。またはRLC(IX + d)などの命令のインスタンスでは3回(opcode1-opcode2-d-opcode3に配置されているため)。
これは正しいです?よくわかりません-Z80のマニュアルでは、CPDR(2バイト命令)が2回インクリメントすると記載されているため、これについては少し不明確ですが、「メモリリフレッシュレジスタ」セクションでは、各命令フェッチ後にインクリメントすると記載されています。J80(これについてはよくわからないのでチェックしたエミュレーター)は、命令の最初のオペコードバイトの後でのみインクリメントすることに気づきました。
どちらが正しい?いずれにせよそれほど重要ではないと思いますが、知っておくといいでしょう:-)ありがとうございます。
よろしく、フィルポッター
emulation - ゲームボーイ:「ハーフキャリー」とは何ですか?
ゲームボーイZ80CPUにはハーフキャリーフラグがあり、いつ設定/クリアするかについて多くの情報を見つけることができないようです。
私がこれまでに理解していることは、8ビットの加算、減算、シフト、または回転操作(およびおそらく他の操作)が結果のビット4に設定し(?)、DAA命令がこれを何らかの方法で設定/使用することです。私がよくわからないのは、16ビット命令がそれにどのように影響するか、そして特定のレジスタの使用によって影響を受けるかどうかです。
assembly - Z80Asm-16進数文字列の作成方法
電卓で16進数でコーディングすることを好みます。オペコードとそうでないものは知っていますが、レジスタHLに文字列「hello」を作成する方法がわかりません。手伝ってもらえますか?私はそれをグーグルで検索しましたが、ほとんどの人がそれを処理するコンパイラを使用しているため、答えを見つけるのは難しいです。しかし、私はこれを困難でやりがいのある方法でやりたいと思っています。しかし、16進数でそれを行う最も効率的な方法が必要です。
私は試した....
[ここにコード]C9-戻る[ここに文字列]
...しかし、LDには相対データを取得する方法がないようです。そのため、C9以降のアドレスの場所を取得することさえできません。任意のヒント?
c - Zilog Z80 OP コードの実装
私は現在、古き良きゲームボーイ用のエミュレーターを開発していますが、いくつかの基本的な操作コードを実装する方法を理解する上でいくつかの問題に直面しています。
現在、AND 演算を実装しています。最初のいくつか (0xA0 -> 0xA3; 0xA6 & 0xA7) は非常に単純ですが、レジスタ H、L の AND 演算は少し異なります。
z80 のドキュメントは、次のリンクからダウンロードできます: um0080.pdf (172 ページ)
ここに、私が何を意味するか (疑似コードを使用) と基本的に何をするかを示すいくつかの例を示します。
AND A,H (ビットシフトに注意)
AND A,L (ビットマスキングに注意)
私はすべてのビット操作を知っており、それらが何をするかを知っていますが、なぜそのようにする必要があるのか 理解できないようです. 私にはいくつかの理論があります (間違っていたら訂正してください :-)):
私がすでに理解していることは、レジスタ H と L は基本的に 16 ビット レジスタであるレジスタ HL であるということです。CPU/バスは 8 ビット操作しか処理できないため、分割する必要があります。または、より論理的な提案: 唯一のレジスタであるため、H と L の値はレジスタでマスクされ、単に互いに分離する必要があります (上位/下位ニブル?)。
背景知識(これらすべてが内部でどのように機能するか)を知りたいので、誰かがこれをより明確にしてくれれば、深く感謝します。
arm - HP から TI への電卓リンク... アセンブリ プログラミングあり/なしで可能ですか?
私は HP50g と TI84 電卓を持っていて、それらをリンクする可能性に興味があり、数値/文字列/データを送信するプログラムを作成しました。どちらも USB 経由でリンクできますが、TI は独自の特別なプロトコルを使用し、HP は Xmodem/kermit を使用します。私が間違っていなければ、 HPのマニュアルには生データを送信するコマンドが表示されていないようです。また、TI にもネットワーク経由でバイトを送信するコマンドがあるとは思えません。このようなプログラムを作成するには、HPGCC またはアセンブリが唯一の方法でしょうか?