59

私はこの好奇心を25年間持っており、そのトリックを理解したいと思っています。

コモドール64では、国境は6569VICによって対処できませんでした。カーソルが移動した中央の領域にピクセルを描画するだけで済みました。境界線は常に均一でしたが、正しく覚えていれば、ポーク53280、colorで色を変更できます。

それでも、完全にアドレス可能であるかのように、境界線がグラフィックで特徴づけられたゲームのイントロをはっきりと覚えています。私はそれがどのように機能するかを理解しようとしましたが、要点に到達しませんでした。伝説によると、それはスプライトの巧妙な使用であり、状況によっては境界線に描画される可能性がありますが、それが都市伝説であるかどうかはわかりません。

編集:提供されたリンクの1つからこれを読んでください

スプライトは垂直ラスターライン全体に多重化されました(8つ以上のスプライト、場合によっては最大120のスプライト)。GroupCrestが2007年5月にKrestage3をリリースするまで、1つのラスターラインに表示できるスプライトは8つまでであるという一般的な認識がありましたが、新しいY座標を割り当てると、画面のさらに下に再表示されました。

これは悪です....ラスターを打ち負かし、そこに到達する前にスプライトを再配置します...

4

9 に答える 9

44

まず、境界領域またはビデオ バンクの最後のバイト (通常は $3fff) から読み取られる繰り返し 8 ビット パターン (幅 8 ピクセル) にスプライトのみを表示できます。これらのスプライトまたは 8 ビット パターンは、VIC チップをだまして境界線を「表示しない」ようにした場合にのみ表示されることに注意してください。下記参照。

ボーダーはスプライトよりも優先度が高いため、通常、スプライトがボーダー領域に描画されると、ボーダーがスプライトを覆います。ちょっとした VIC チップの策略で、境界線をオフにすることができます。

上下の縁取りは簡単にオフにできます (後で説明します)。側面の縁取りは非常に重要なタイミングでオフになります。

最初に、VIC チップが c64 でどのように機能するかについて少し説明します。

VIC チップは、画面を左上から右上に描画し、次に 1 行下に描画し、再び左から右に画面全体が描画されるまで描画します。この再描画を毎秒 50 回 (PAL ユニットの場合) または毎秒 60 回 (NTSC ユニットの場合) 実行します。

任意の時点でのラスタの垂直位置を含む 8 ビットの VIC レジスタがあります。$d012. 実際には 255 を超える可能な位置があるため、9 番目のビットはビット 7 (最上位ビット) またはレジスタ $d011 に格納されます。したがって、いつでもこれらのレジスタを読み取って、ラスターの垂直位置を見つけることができます。ラスターの x 位置を読み取るために使用できるレジスタがありません。

VIC チップのもう 1 つの優れた機能は、ハードウェア スクロールを使用する際の問題を修正するために使用されました。基本的な垂直スクロールは、ハードウェア レジスタを使用して画面を 0 ~ 7 ピクセル垂直に移動することで実現されました。制限 (スクロールの方向に応じて 0 または 7) に達したら、各文字ブロック (8x8 ピクセル) を 1 ブロック垂直に移動し、新しいデータを描画して上部 (または方向に応じて下部) に表示します。これは非常にうまく機能しますが、8 ピクセルのスクロールごとにデータが画面に「ポップ」表示される点が異なります。これを解決するには、レジスタ $d011 のビット 3 をクリアすることで、境界領域を垂直方向に 8 ピクセル拡大することができます。これを 24 列モードと呼びます。デフォルトでは、画面は 8x8 ピクセル文字の 25 行に設定されていました。24 行モードでは、文字を一番下の行に描画することはできますが、それらは境界線によって隠されるだけです。

したがって、上下の境界線をオフにする秘訣は次のとおりです。

1) 画面を 25 行モードに設定します

2) ラスターが $f2 と $fa の間の垂直位置 (24 行モードと 25 行モードの両方で境界線が始まる場所の間の 8 ピクセル) に到達するのを待ちます。

3) 画面を 24 行モードに設定します...境界線の垂直方向の開始点を現在のラスター位置の上に移動します

4) 垂直ラスター位置 ($fa) の後まで待機します。

5) 各フレームを繰り返す

ステップ 3) は、VIC チップをだまして、境界線の描画が既に開始されていると思わせるため、描画を開始しません。出来上がり、上下の境界線が開いています。

サイド ボーダーに関しては、異なるレジスタで同じことを行うことができますが、ラスターの水平方向の移動は垂直方向の移動よりもはるかに速いため、タイミングをより厳密にする必要があります。また、ジッタと呼ばれる考慮すべき別の問題があります。< ここでは説明しません。その問題の詳細な説明については、Web で「Stable Raster C64」を検索してください。

于 2009-11-19T03:56:20.027 に答える
9

Krestage 3 が行ったこと (質問で述べたように) が異なることに注意してください。

トリックの 1 つのレベルは、「紙」 (作業領域の四角形、境界内のもの) の下部がちょうど描画されているときに境界線をいじることです。これにより、上下の境界にスプライトを配置できます。

より高いレベルは、上記の JohnD の回答で説明されているように、紙の右端、すべてのラスター ラインでそれを台無しにすることです。これにより、左右の境界にスプライトを配置できます。

これでは、1 行に 8 つ以上のスプライトを配置できません。それがまさにクレスト魔法。

VIC チップの最良のリソース (私が知っている) は、 Christian Bauer による「The MOS 6567/6569 video controller (VIC-II) and its application in the Commodore 64」であり、有用な補遺は「The memory accesses of the Marko Mäkelä によるMOS 6569 VIC-II および MOS 8566 VIC-IIe ビデオ インターフェイス コントローラ。
警告: これらは多少技術的なものであり、VIC エフェクトを自分でプログラムした後で理解しやすくなる場合があります。

リンクが切れた場合は、タイトルで記事をグーグル検索してください。それらは際限なく複製されます.

于 2009-11-21T00:03:07.553 に答える
5

簡単な BASIC プログラムで上下の境界線を開くことができます。

    1 poke56334,0:poke53266,212:poke53265,27:poke16383,0
    2 h=53265:i=53273:h1=19:h2=27:i1=1
    3 pokei,i1:waiti,i1:pokeh,h1:pokeh,h2:goto3
于 2011-09-11T13:39:21.747 に答える
4

ここで暗闇の中で突き刺すつもりです(自分でこれを行ったことはありません)。ウィキペディアでこれを見つけました。

c64demo セクションでは、次のように説明されています。

MOS テクノロジー VIC-II チップに関連する文書化されていない副作用が主な原因で、不可能と考えられていた効果がデモで達成されました。VIC トリックの例:

言及されたハックの1つは次のとおりです。

スプライト スクローラーが境界に配置されました。画面の周囲に境界線を描画しないようにハードウェアをだまして、スプライトをこの領域に移動して表示することができました。

もちろん、質問の興味深い部分は、それがどのように行われたかです。ソースコードを含むデモデータベースを調べて、ハックを使用するデモを探すことをお勧めします。

于 2009-11-17T17:06:54.140 に答える
2

「それは53280でした、DUDE」を印刷します。

于 2009-11-17T16:59:04.037 に答える
2

私が理解していることから、これはスプライトでのみ可能です。

スプライトは境界領域にあることが許可され、境界は上に描画されます。いくつかの策略によって、境界線を取り除くことができます。

于 2009-11-17T17:00:36.337 に答える
1

ボーダー内のグラフィックス: スプライトまたは $3FFF 効果を使用する (実際にはスプライトではありません)。詳細に入るには、ここで利用できるよりもはるかに多くのスペースと時間が必要です。

于 2010-12-27T04:11:27.590 に答える
1

また、スプライトを基本的にボーダー化することもできます: BASIC Sprites in Border

iirc、ビデオ チップを混乱させて 26 行目のテキストを描画する方法もありました。

于 2014-05-23T22:26:12.257 に答える