Vectrexコンピューターの256バイトのイントロ「スプリング」

Chaos Constructionsのために何かを書くという決定は、いつものように突然起こった(主に最後の瞬間まで、それが今年行われるかどうかは明らかではなかったため)。 そのため、Tinyのイントロコンテスト(プラットフォームは256バイト)で働く以上のことを書く時間はありませんでした。 Vectrexの下で数年前に書いたので、次のプラットフォームを研究するよりもアセンブラ6809を思い出す方が簡単だったので、これもプラットフォームの選択を決定しました。



(特に)デモシーンで気に入っているのは、仕事を始めたときに何が得られるかわからないということです。 正確に何を書くべきかといういくつかのアイデアの中で、特にこれは確実ではありませんでした。 エミュレータと実際のVectrexのイメージがあまりにも異なっていたため、2つは破棄されました。各アセンブリの後、これらすべてをROMエミュレータにアップロードし、Vectrexに貼り付けて、何が起こったのかを確認してください。



私は3番目のアイデアを実装し始めましたが、すでにプロセスの中で、256バイトで美しくそれを行うことは非常に難しいことがわかりました。 しかし、その過程で、何かがそこに過剰になり、春に似ていました。 最終的に、私はこのアイデアを開発しました:







Vectrexのプログラミング方法についてはここでは説明しません。これについては既に記事で詳しく説明しました。 このコンピューターの画像出力の原理は、他のほとんどのものとは根本的に異なることだけを言及します-それはベクトルです。 さらに、一部の予約では、直線だけでなく曲線も表示できます(実際、これを利用しました)。



良いデモの重要な兆候は、私の意見では、作業が記述されているプラ​​ットフォームの利点を使用することです。 ほとんどすべてのコンピューターには強みがあります-ハードウェアスクロールを使用するものもあれば、多数のスプライトをサポートするものもあれば、強力なプロセッサーを使用するものもあります。 この場合、他のコンピューターで行われるように曲線の各点の座標を計算するのではなく、ハードウェアの方法で、バネの「回転」を描くことができました:チャネルY(垂直)のDACの電圧を上げて、短い等間隔で電圧を変更しますチャンネルX(水平)のDACで、正弦波に類似した曲線をもたらします。 さらに、後続の各「スプリング」の振幅は異なり、したがって、それらは異なる幅(「直径」)を持ちます。



明らかに、スプリングは圧縮する必要があります。そうでなければ、どのようなスプリングですか? 「圧縮」は、垂直電圧変動によって提供されます。 より正確には、ビームがスプリングを引き始めたポイント(下)とスプリングが終了したポイント(上)の電圧の差を変えることによって。



ただし、この差の単純な増減だけでは逃げられません。このような状況のスプリングでは、現在の伸びに応じて異なる圧縮率が自然です。 そして、ここでは計算なしで行うことはできません... 6809プロセッサにはサインを計算するコマンドがなく、256バイトのイントロのサインプレートが大きすぎて贅沢ではないことは明らかです。 幸いなことに、Vectrex ROMのソースコードを掘り下げてみると、fc6dでこの場合に最適なプレートが見つかりました。



RTRIGS FCB 0,25,50,74 SINE TABLE- 16 ANGLES/QUADRANT FCB 98,121,142,162 VALUES REPRESENT SINE*256 FCB 181,198,213,226 FCB 237,245,251,255 FCB 255,255,251,245 FCB 237,226,213,198 FCB 181,162,142,121 FCB 98,74,50,25
      
      





実行する必要がある唯一のことは、値を希望するスケールにし、右に2シフトして4で割ることです。



 lsra lsra
      
      





その結果、ばねは非常に自然に圧縮され、同時に同じ法律に従って加速/減速しながら上昇/下降します。



さて、次の問題-誰が1つの場所で1つのスプリングジャンプを気にしますか? コンポーネントを獲得したり、いいねを獲得したりすることはできません。スプリングは次々にジャンプする必要があります。

水平移動の場合、すべてがシンプルだとしましょう。 DACのチャンネルXの電圧を均等に変更するだけで十分です。すべてが自然に発生します。オーバーフローが発生する画面を残したまま(-127の場合)、画面の反対側にスプリングが自動的に表示されます(+127)。 ジャンプの同期により状況はより複雑になります-野生生物では、スプリングは追いつくことができず、常にジャンプの一部が同期していません。



いつでもスプリングの状態はサインテーブルから選択された値によって完全に決定されるため、スプリングごとにこの値を個別に保存するのが論理的です。 このビジネスを保存するRAMのアドレスを選択します。 ただし、最初に、このプレートを初期値で初期化する必要があります。 そして誰もではなく、行列に何らかの秩序があるように。 ROMに数バイトを予約してから、RAMにコピーします。



 springs equ $C890 ; index in sine table for each spring ... ldu #springstmp ldx #springs lda #(3*3) jsr Move_Mem_a ; A - byte count, U - source, X - destination ... springstmp: db 15, 20, 25
      
      





ご覧のとおり、この喜びはすべて、3つの一致するバイトが連続するBIOSのアドレスを見つけるだけで、完全に捨てることが非常に簡単です。 最初は、3つのスプリングで管理できるとは思っていなかったため、削除する時間がなく、意味がありませんでした(とにかくすべてが256バイトになりました)。



サインプレートは小さいので、標準のVectrexのフレームごとのサイクルの各反復で次の値をとると、スプリングは非常にすばやくジャンプします。 したがって、すべての反復ではなく次の値をプレートから取得します(もちろん、それぞれに描画します。そうしないと、ちらつきます)。



 ldb ,x ;   b        ( ,    x) ... lda frames_c bita #$03 bne skipinc ;  incb ;      skipinc: stb ,x+ ;    b ,  .      x  
      
      





美しさのために、ばねの先端に明るい発光ドットを追加します-ビームをオフにする前に、そこにわずかに保持します:



 ldb #$40 ; end dot brightness (20-30 is ok for release) repeat_dot: decb bne repeat_dot clr <VIA_shift_reg ; Blank beam in VIA shift register
      
      





以下に「アース」線を描画します(ところで、線はBIOSを介して描画されるため、最大スケールを設定する必要があります。曲線の場合、スケールを設定する必要はありません。完全に「手動」で描画するためです)。



 lda #$ff ;   sta <VIA_t1_cnt_lo ldd #(-60*256+(-54)) ; Y,X.       jsr Moveto_d ldd #(0*256+(127)) ; Y,X      jsr Draw_Line_d
      
      





多くのスペースも以下の碑文を取ります。 それで、私は自分の名前を略称とサイズの表示に制限することにしました。 しかし、別の理由がありました。 事実、多くの点で、Vectrexの回路の類似した性質により、具体的な歪みはその具体的なインスタンスに固有のものです。 具体的には、2つのことで表現されます。



1. BIOSライン出力中(点線のベクトル、ビットマップシンボルはそこでシミュレートされます)、ラインの長さが長くなると傾き始めます。したがって、10文字を超えると何かを解析するのがすでに困難になります。



2.高さが減少すると、スプリングは左に反り始めます。 これは「それほど構想された」ものではありません-これはVectrexの特定のインスタンスの問題です。 他の2台の車のオーナーに、イントロが彼とどのように見えるか写真を撮ってもらいました。 違いが重要であることに気付くのは簡単です:







256バイトのイントロのサウンドは非常にまれですが、そのような機会があれば、それを使用しないのは罪です。



BIOS Vectrexは優れています-原始的な曲を演奏するための単純なルーチンだけでなく、メロディーのいくつかのサンプル(それぞれ10バイトまたは2バイト)も保存します。 大規模なデモでは、これはもちろん使用できませんが、256バイトのイントロは素晴らしい「ケーキのチェリー」です。



 ldu #$fe38 jsr Init_Music_chk ; Initialize the music ... ;  , : jsr Do_Sound
      
      





最終的に、コードは完璧からはほど遠いものになったと言わざるを得ません。アセンブラ6809が非常に強力で快適であることを考えると、少し恥ずかしく思います。そのため、私の以前のVideopacでの作業では、非常に不快なIntel 8048がプログラミングに使用されていました)。 6809のプログラミングの経験があれば、現在の255バイトを180-200に減らすのは非常に簡単だと思います。



16ビットのレジスタを含む多数のレジスタは、神経とバイトを大幅に節約します。 ただし、同時に、レジスタの1つずつの増加/減少は、a、b、およびdに対してのみであることに興味があります。 ただし、インデックス(およびu)については、通常のプログラミング中にlda、u +などのコマンドの一部として1つずつ増加することに注意してください。 これらのレジスタではaddも機能しません。 ただし、解決方法はあります。 leau N、uという形式のコマンドを使用して、任意のバイト数で増減できます。






All Articles