Sidebordersprites auf Badlines!

Es gibt 10 Antworten in diesem Thema, welches 1.401 mal aufgerufen wurde. Der letzte Beitrag (31. Dezember 2008 um 14:52) ist von Mnemonic.

  • So jetzt endlich mal keine neue dumme Frage, sondern mal ein Ergebnis.
    Das Timing wird ja ganz schön kritisch, wenn man Textbildschirm und Sprites im Seitenborder anzeigen will.
    Hab mir dann mal von Bitte melde dich an, um diesen Link zu sehen. die Inspiration mit JSR Sprüngen geholt - und siehe da, nach ein bisschen herumgeschraube ging's.

    Bitte melde dich an, um diesen Anhang zu sehen.

    Das Prinzip funktioniert so: X Register wird mit Wert $00, Y Register mit Wert $c8 geladen. Border kann so fix mit STX $d016; STY $d016 geöffnet werden. Und anstatt jetzt eine irre Schleife zu basteln, schickt man im IRQ durch JSR Aufrufe den C64 an unterschiedliche Stellen einer NOP/BIT $EA Wüste, welche manchmal durch eben jene STX/STY Klammotte unterbrochen wird.

    Das Ganze ist ne echt fragile Angelegenheit. Bloß beim Versuch einfach mal noch hier und da drei NOPs durch zwei BIT $EA zu ersetzen, brachte direkt das ganze Timing wieder durcheinander.

    Trotzdem freue ich mich wie ein Schneekönig :)

  • Und hier das Ganze nochmal in 50 fps. Hatte die Spritebewegungsroutine einfach an den Bottomborder-Öffnen IRQ gehangen - so wurde das wohl hin und wieder etwas zu lang ?!? - mh... so ganz raffe ich diesen fps Kram noch nicht. Vom unteren Sideborder bis zum Screenanfang sieht es immer so "weit" aus... und doch scheint so wenig Rasterzeit dazwischen zu sein...

  • Ich hab zwar mit dem Raster-krims-krams nur wenig am Hut weil ich mir gut vorstellen kann wie knifflig das ist, aber mir gefällts. :thumbsup:

  • weil ich mir gut vorstellen kann wie knifflig das ist

    Ich frag mich vorallem, ob man das tatsächlich viel eleganter lösen kann. Im IRQ-Kurs der MD64 wird das ja ausgeklammert und auch sonst findet man im Netz meistens nur Routinen für Sprites und Sideborder offnen im unteren Border oder MIT Badline-Unterdrückung. Schon alleine das Umschalten frisst ja mindestens 8 Zyklen, dann bleiben noch 13 Zyklen in einer Badline drauf und dann kommen noch die Sprites dazu.

    D.h. ich habe dann zwischen normaler Line und Badline den wahnsinnigen Raum von 3 Zyklen, die ich mit exakt einem BIT $EA fülle.

    Code
    stx $d016	; +4 				
    sty $d016	; +4 		
    bit $ea
    stx $d016
    sty $d016
  • alles schon sehr schön.
    aber nur als hinweis (damit du dich nicht irgendwann beim zyklenzählen sehr wunderst).
    in der badline hast du tendenziell nur 20 zyklen (es sei denn, tu triffst mit einm schreibzugriff genau den beginn der badline bzw. spritefetch).

    z.b. in deiner jetztigen routine verbrauchen die 3 sprites pro zeile 9 zyklen.
    dein stx + sty verbraucht nochmals 8 zyklen...und dann hast du eben noch 3 zyklen übrig.
    wenn du 4 sprites verwenden willst, dann klappt das auch noch, allerdings NICHT mit den ersten 4 sprites (das gibt konflikte mit dem ende der badline, dem beginn der spritefetches für das erste sprite und dem schreibzugriff auf $d016).
    Dafür solltest du einfach die hinteren 4 sprites nehmen...das geht.
    das wären dann 11 zyklen für die sprites...und wenn du dann sty + stx nehmen würdest, müsstest du noch ne verzögerung von 1 zyklus machen.
    dafür gibts aber keinen befehl...minimum ist 2 zyklen...
    also... einfach ein sta d016,x nehmen.... der braucht dann 5 zyklen...und schon pasts... (das musst du natürlich nicht jede zeile machen... nur einmal bei der badline).

    ...aber das kriegst du auch schon noch hin :)

  • damit du dich nicht irgendwann beim zyklenzählen sehr wunderst

    Na, da habe ich mich bereits gewundert... bzw. da war der IRQ-Artikel aus der MD schon recht hilfreich, weil da öfters die Rede von X-Kommairgendwas Zyklen die Rede war.

    Zitat

    allerdings NICHT mit den ersten 4 sprites

    Jau, sowas habe ich mir dann auch gedacht, nachdem ich mit Verwendung von Sprite 0 schon nicht hingekommen bin. Hab dann durch zu Hilfe nahme des VIC-Artikels gesehen, dass Sprite 0 genau in den Zyklen gefetcht wird, die ich brauche, bzw. treffen will...

    Hab vorher stundenlang mit Sprite 0 rumprobiert und mich immer gewundert, warum zwischen einem NOP und einem BIT $EA als Verzögerung immer so ein "großer" Abstand war...

  • also... einfach ein sta d016,x nehmen....
    ...aber das kriegst du auch schon noch hin :)

    Jau, super. 4 Sprites läuft auch. Danke für den Tipp.
    Für die meisten ist es ein häßliches Stück - für mich ein bahnbrechender Erfolg:
    Bitte melde dich an, um diesen Link zu sehen.

    ;)

  • Mir gefällts,
    auch der Sound. :D
    Beim zurückscrollen der "Zahl" (?) im Plasma gibt es aber manchmal "Ausfransungen" in den linken Boarder,ist das so gewollt ?

  • Beim zurückscrollen der "Zahl" (?) im Plasma gibt es aber manchmal "Ausfransungen" in den linken Boarder,ist das so gewollt ?

    Eigentlich nein. Ich hab in Vice 2.1, HOXS 1.0.5.25 und am C64C getestet. Mehr habe ich hier nicht zur Verfügung. Je nachdem, wie weit man in den Border hineinkommt gab's da schonmal ein Flackern - aber das habe ich eigentlich wegbekommen ... Naja, vielleicht waren die Augen nach der ganzen Hängerei vorm Screen und den paar Bieren letzte Nacht auch nicht mehr die besten... :bia

  • Respekt!!!

    Das sieht mal echt stylisch aus, coole Idee!

    Hab' mir auch mal das Beispiel für's Plasma runtergeladen, ich werd' das die Tage auch mal probieren, aber mit Chars... bin ja auch ein kleiner Plasma-Fan. :juhu:

    Weiter so!

    Gruß und guten Rutsch,

    der Mnemonic

    Alle alphabetisch angeordnet einem in Satz sein sollten Worte.