Hallo Besucher, der Thread wurde 1,2k mal aufgerufen und enthält 9 Antworten

letzter Beitrag von Hucky am

5 Sprites bei offenem Rahmen und gleichzeitiger Zeichendarstellung ?

  • Mahlzeit....

    Mir schwirrt das seit über 30 Rahren durch den Kopf.

    Es ist ja kein grösseres Geheimnis den Seitenrahmen mittels DEC $D016, INC $D016 an entsprechender Stelle zu öffnen um die oberen vier Sprites im Rahmen nebeneinander darstellen zu können.

    Auf einer Party Ende '89, oder '90 hab ich wen kennengelernt der behauptet hat 5 Sprites darstellen zu können.

    Er wollte mir nicht sagen wie er das gemacht hat.

    Ist das möglich, wenn ja wie, oder war es nur BLA, BLA ?

  • Hucky

    Hat den Titel des Themas von „5 Sprites bei offenem Rahmen und Grafikdarstellung ein ?“ zu „5 Sprites bei offenem Rahmen und gleichzeitiger Zeichendarstellung ?“ geändert.
  • Viellecht kann man entweder den DEC oder den INC ersetzen durch STA/STX/STY. Dann gewinnt man 2 Taktzyklen, das ist ein Sprite.

    Für die Badline bastel ich bei VIER Sprites schon mit STA, STA,X und STY rum 🙄

  • 4 Sprites bei offenem Sideborder und normalen Badlines dürften das Maximum sein.


    Wenn man generell mit irgendwas weiterkommt, sind es gerade die RMW-Opcodes, da die CPU beim DMA-Request des VIC noch eventuelle Schreibzyklen des aktuellen Befehls beenden darf, und die RMW-Opcodes enden auf zwei Schreibzyklen.

    Da passen dann eventuell mehr Befehle in die freien Bereiche, aber eigentlich in diesem Fall auch nur, wenn man Sprite 0 benutzt. Da geht dann nur INC $D016 o.ä., um den Border aufzumachen.


    Das Intro dieses Diskmags hat zwei Char-Rows (ca. 16 Pixel) hohe Scroller und 5 Sprites bei offenem Sideborder. Da ist ganz links im Rand keine Lücke.

    Der Trick ist, die Badlines loszuwerden. Das wird da per Linecrunching erreicht, wobei immer nur die letzte Pixelzeile der Chars dargestellt wird, und diese mit Umschaltung der Charsets jede Zeile gewechselt wird.

    Macht ein ziemlich wirres Speicherlayout. :)

  • Ich erinnere mich auch, dass damals 5 Sprites irgendwie im Gespräch waren... Das war die Zeit, als auch die ganzen $d011-Effekte aufkamen und mir unklar war, was da eigentlich passiert und ob es das TIming ändert.


    - Ich bin sicher, dass ich es mit 4 Sprites 4567 gemacht habe.

    - Bin mir auch (ziemlich) sicher, dass es nicht mit 34567 ging.

    - Ich erinnere mich auch, dass meine ersten Versuche mit Sprite 0 anfingen und gescheitert waren.

    - Und dass es mit INC/DEC oder STA ABY geht. Wichtig war halt ein Befehl mit einem internen Takt, um die 3 Takte Lesesperre des VIC zu umgehen und die passende Stelle zu treffen.


    Woran ich mich nicht mehr erinnere:

    - War auch ein 5 Zyklen-Befehl in Badlines nötig, wenn gar keine Sprites eingeschaltet sind?

    - Gingen andere Sprites in Badlines überhaupt nicht, weil die passende Stelle unerreichbar war?

    - Oder ging es schon mit einzelnen anderen Sprites, und es fehlten dann nur die Zyklen, um den Rahmen in der nächsten Zeile rechtzeitig wieder einzuschalten?


    Wenn ich richtig rechne, dann müssten in einer Badline mit 5 Sprites 50 Takte verbraucht, 6 fürs Lesen gesperrt und 7 Takte übrig sein.

    Das dürfte den Optimismus erklären, dass es mit 5 Sprites gehen müsste und nur das Timing kompliziert ist.


    Wenn ich mir das heute nochmal antun wollte:
    - Erstmal testen welche Befehle mit 0 Sprites möglich sind.

    - Dann, ob es mit einzelnen anderen Sprites geht.

    - Checken, ob das Problem mit 5 Sprites in der Badline oder der Zeile danach liegt. Spitzfindig kann man ja sagen, dass 5 Sprites + Badline + Border gehen...

    - Gucken, ob es einen illegalen mit 2 verschiedenen Schreibzyklen gibt.

    - Gucken, ob sich $d011 erzwungene Badlines mit Sideborder kombinieren lassen. Ich denke zwar nicht, aber das ist alles lange her.

  • hmmmm.....

    ich hab in Erinnerung, dass es nur mit Sprite 5678 funktioniert 🤔🤷‍♂️

    Aktuell bin ich zu doof nur zwei Sprites darzustellen 🙈

    Muss mal ne alte Intro von mir sezieren - hatte mal vier dargestellt, jeweils zwei untereinander.

    Alles so langer her 😢

    Hatte damals sogar ne Intro mit einem Logo mit Sprites im oberen und seitlichen Rahmen zusammen mit FLD-Effekt gecodet.

    Ich weiß nur noch dass das coden mehr als Scheiße war 🙄

    für jede Y-Position musste ich das Timing für die No-Border Speites anpassen. 🙈

  • Wenn man generell mit irgendwas weiterkommt, sind es gerade die RMW-Opcodes, da die CPU beim DMA-Request des VIC noch eventuelle Schreibzyklen des aktuellen Befehls beenden darf, und die RMW-Opcodes enden auf zwei Schreibzyklen.

    Da passen dann eventuell mehr Befehle in die freien Bereiche, aber eigentlich in diesem Fall auch nur, wenn man Sprite 0 benutzt. Da geht dann nur INC $D016 o.ä., um den Border aufzumachen.

    Bei INC $D016 etc. kennt man ja beim ersten mal nicht den Inhalt der entsprechenden Register.

    Nach ein paar mal ergibt sich aber doch eine bestimmte Sequenz an Werten, je aus READ und

    für WRITE. Kann man diese Sequenzen nicht in einfache Codeschnippsel giesen und so auf

    RMW verzichten? Im Idealfall erhält man nur WRITE-Zugriffe?

  • Bei INC $D016 etc. kennt man ja beim ersten mal nicht den Inhalt der entsprechenden Register.

    Wird im Init oder der vorigen Zeile präpariert.

    Nach ein paar mal ergibt sich aber doch eine bestimmte Sequenz an Werten, je aus READ und

    für WRITE. Kann man diese Sequenzen nicht in einfache Codeschnippsel giesen und so auf

    RMW verzichten? Im Idealfall erhält man nur WRITE-Zugriffe?

    Nicht ganz klar, was Du meinst. Das RMW ist dafür da, eben noch ein (vs. LDA usw.) bis zwei (vs. STA usw.) weitere Zyklen rauszukitzeln.

    Lesezugriffe hat man immer, schon um Opcodes und deren Operanden zu lesen.