Commodore 64 で画面境界線に描画する
-
20-09-2019 - |
質問
わかりました。私は25年来の好奇心を持っており、そのトリックを理解したいと思っているので、閉鎖されないことを願っています。
コモドール 64 では、国境は 6569 VIC でアドレス指定できませんでした。できることは、カーソルが移動する中央領域にピクセルを描画することだけでした。私の記憶が正しければ、境界線は常に均一でしたが、poke 53280,color で色を変更できました。
それにもかかわらず、境界線が完全にアドレス指定可能であるかのようにグラフィックスで特徴づけられていたゲームのイントロをはっきりと覚えています。それがどのように機能するかを理解しようとしましたが、要点までは到達しませんでした。伝説によれば、これはスプライトを巧みに利用したもので、状況によっては境界線に描画される可能性があると言われていますが、それが都市伝説であるかどうかはわかりません。
編集:提供されたリンクの 1 つからこれを読んでください
スプライトは、垂直ラスターライン全体に多重化されました(8つのスプライトを超え、時には最大120のスプライト)。グループCrestが2007年5月にKrestage 3をリリースするまで、1つのラスターラインに8つ以下のスプライトが表示されないという一般的な認識がありましたが、新しいY座標を割り当てると画面のさらに下に再び現れました。
これは邪悪だ……。ラスターをビートし、そこに到達する前にスプライトの位置を変更します...
解決
まずのみスプライトは、境界領域又は通常$ 3FFF、ビデオバンクの最後のバイトから読み出され繰り返す8ビットパターン(8つのピクセル幅)で表示することができます。あなたが国境を「表示しない」にVICチップをだましたときにのみ、これらのスプライトまたは8ビット・パターンを見ることができます。下記を参照してください。
境界はスプライトよりも高い優先度を持っているので、スプライトの境界領域に描画されたときに、通常の境界は、スプライトを覆っています。 VICチップトリックのビットを使用すると、国境をオフにすることができます。
あなたは(私は以下を説明します)非常に簡単に上部と下部の境界線をオフにすることができ、そしてサイドは非常に重要なタイミングでオフに接し。
VICチップがC64にどのように機能するかについての情報を最初に少します。
VICチップは、行下、画面全体が描画されるまで、再び右に左から、右上に左上から画面を描画します。それは、これは(NTSC単位)を50回秒(PALの単位)または60回第二再描画行います。
任意の時点でのラスタの垂直位置を含む8ビットのVICレジスタがあります。 $のD012。実際にそこに255以上の可能な位置があるので、9番目のビットは、ビット7(最上位ビット)に保存されているか、$ D011を登録しています。だから、任意の時点で、あなたはこれらのレジスタを読み、ラスタの垂直方向の位置を知ることができます。ラスタのx位置を読むために使用可能なレジスタがありません。
VICチップのもう一つのクールな機能は、ハードウェアスクロールを使用するときに問題を解決するために使用されました。基本的な垂直方向のスクロールは0-7ピクセル垂直に画面を移動させるためにハードウェア・レジスタを使用することによって達成されました。あなたは(スクロールの方向に応じて0または7)限界に達したら、縦に各文字ブロック(8×8画素)一つのブロックを移動し、上(または下によっては方向)に表示される新しいデータを引きます。これは、あなたのスクロールごとに8個のピクセルが画面上にデータ「ポップ」を参照してくださいすることを除いて、非常によく動作します。これを解決するには、境界領域は、レジスタ$ D011にビット3をクリアすることにより、垂直方向に8つのピクセルによって成長させることができます。これは、24行モードと呼ばれます。デフォルトでは画面は8×8ピクセルの文字の25行に設定しました。 24行モードでは、あなたがまだ一番下の行に文字を描くことができ、彼らはただの国境によって隠されてしまう。
だから、上部と下部の境界線をオフにトリックがあるに
1)画面に25行モードを設定
2)$ F2と$ FA(境界24行モードと25行モードの両方で始まるとの間の8つの画素)との間の垂直方向の位置に到達するラスター待つ。
3)現在のラスタ位置の上方境界の垂直スタートを移動... 24行モードに画面を
4)垂直ラスタ位置の後まで待って($ FA)
5)を繰り返し、各フレーム
ステップ3)トリックVICチップ、それはそれを描く開始したことがないので、それはすでに、境界線を描き始めたことを考えるに。ほら、上部と下部の境界線は開いてます。
側の境界あなたは異なるレジスタに同じことを行うことができますが、ラスタの水平移動が上下移動、その後多くの高速ですとタイミングが非常にタイトにする必要があるについて。そして、ジッタと呼ばれる考慮すべきもう一つの問題があります。 <-which私はここで説明しません。その問題の深さで、について説明するための「安定したラスターC64」のためのWebを検索します。
他のヒント
Krestage 3が行ったこと(質問で述べたように)は異なることに注意してください。
トリックの 1 つのレベルは、「紙」 (作業領域の長方形、境界線の内側のもの) の底部が描画されているときに境界線をいじることです。これにより、上下の境界線にスプライトを配置できるようになります。
より高いレベルは、すべて上記の JohnD の回答で説明されているように、すべてのラスター ラインで紙の右端でそれをいじることです。これにより、左右の境界線にスプライトを配置できるようになります。
いずれの方法でも、1 行に 8 個を超えるスプライトを含めることはできません。それはまさにクレストマジックです。
VIC チップ用の (私が知っている) 断然最良のリソースは次のとおりです。 「MOS 6567/6569 ビデオ コントローラー (VIC-II) と Commodore 64 でのそのアプリケーション」 Christian Bauer によるもので、役立つ付録は次のとおりです。 「MOS 6569 VIC-II および MOS 8566 VIC-IIe ビデオ インターフェイス コントローラーのメモリ アクセス」 マルコ・マケラ著。
警告講師:これらはやや技術的であり、VIC エフェクトを自分でプログラムした後では、理解しやすくなるかもしれません。
リンクが切れた場合は、タイトルで記事を検索してください。記事は際限なく複製されます。
あなたは簡単な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
Imはここに暗闇の中で刺しを取るつもりは(この自分自身を行ってhaventは)。私は、ウィキペディア上でこれを見つけます。
:ということを説明する c64demoセクション
エフェクトは不可能と考えられていました
主に起因して、デモで達成
関連する文書化されていない副作用
MOS技術VIC-IIチップ
のnoreferrer"> デモデータベースの中で見ていることをお勧めハックます。
PRINT "ITは、DUDE 53280ました。"
私が理解から、これはスプライトのためにのみ可能です。
スプライトは、境界領域にあることが許可されている、との国境は、オーバートップ描かれます。いくつかの策略を通じ、国境を除去することができる。
国境でのグラフィックス:スプライトOR(実際にはスプライトですべてではありません)$ 3FFF効果を使用してどちらか。詳細に入るためには、私はここに利用できる持っているよりはるかに多くの空間と時間を必要とします。
はIIRC、それはテキストの26行を描くこと、また、そのビデオチップを混乱させるためにいくつかの方法がありました。