Hallo Besucher, der Thread wurde 17k mal aufgerufen und enthält 84 Antworten

letzter Beitrag von sauhund am

Klein anfangen: ESI-artiges Cracktro in ASM nachcoden

  • Wie kann man eigentlich am elegantesten die ollen Nop's aus meinem Code herausbekommen ?

    Ich ersetz meinen NOP/BIT $EA Wust immer irgendwann durch kleine Timingschleifen.
    Wenn ich mich nicht verrechnet habe: LDX #a, DEX, BNE *-3 verbraten 5*a-1 Zyklen.


    Naja, am besten ist natürlich, wenn man noch Code hat, den man dazwischen packen kann.


    EDIT: Hab mich natürlich verrechnet: 5*a+1 Zyklen.

  • TheRyk:


    Wenn $d012 bei RZ $ff ist, ist der Scroller schon wieder vorbei. Du musst vorher (ab $e3) umschalten.


    RZ $00
    .
    . Vielleicht noch Rest von Musikroutine?!? (ist aber egal)
    .
    RZ $33
    .
    . Multicolorbild
    .
    .
    RZ $e3 (im Rasterirq auf normalen Textmodus schalten und meinetwegen untere Bitverschiebung $d016)
    .
    . Textscroller
    .
    .
    RZ $ff (im Rasterirq wieder auf Multicolormodus schalten)
    .
    . Hardscrollroutine
    .
    . Musikroutine
    .
    .
    und wieder von oben


    Nicht vergessen Zwischen unterem Border und oberem Border ist ne Menge Platz für Routinen - Denn wir haben ja mehr als $ff Rasterzeilen ($d012 + 1 Bit von $d011).

  • Auch wenn's peinlich sein mag, habe ich vieles der Ratschläge wohl noch nicht gerafft.


    INC und DEC $d020 (oder sauhund's vorschlag) lässt sich natürlich leicht machen
    und führt je nach Einsatzort zu Effekten im Border,
    das war nicht unbedingt unerwartet.
    Bislang stehe ich aber wie der Ochs vor dem Berg und frage mich
    "was mache ich mit dem, was mir angezeigt wird?"
    Gut, wenn im Ergebnis der Rahmen lokal im Takt blinkt,
    könnte es sein, dass man sich in der IRQ gerade in der Musik-Routine befindet.
    Wenn der Border unentwegt komplett flackert,
    macht mich das nicht schlauer, ich weiß nur, dass die IRQ mit gewisser Geschwindigkeit läuft.
    Wenn beim Einsatz von D020 um die Text-Modus-Routine herum nur ein Strichlein unter dem noch immer maroden Scroll herumblinkt, ist das wohl auch kein gutes Zeichen.
    <-- heißt DAS, ich bin rasterzeilentechnisch am falschen Ort (schon zu weit, evtl. gar $FF bzw.letzte Rasterzeile), wie Spider anmerkt?
    Wenn auch das Screen flackert, hat man wohl total daneben gehauen.
    Aber das Herumprobieren führte bisher noch zu keiner unmittelbar verwertbaren Erkenntnis.
    Muss ich Verzögerungen einbauen (wo/wie), um womöglich schlauer zu werden?


    @Spider: das hier leuchtete mir ein:

    Zitat

    Wenn $d012 bei RZ $ff ist, ist der Scroller schon wieder vorbei. Du musst vorher (ab $e3) umschalten.


    Ich schalte unterhalb des Scrolltextes um, was blöd ist <-- (soll mir das vielleicht ein weißer Strich durch INC/DEC unterhalb des Scrollers sagen, s.o. ?)


    Ich muss mich wohl über die Grundlagen noch mal etwas genauer belesen, um Euren Ratschlägen wirklich folgen zu können.

  • Nimm Dir doch einfach dies hier zu Hilfe als "grobe Orientierung":
    http://ebspso.dnsalias.org/c64…/C64/Vic/html/dsec34.html


    D.h. Du teilst den Bildschirm einfach nach dem Rasterstrahl ein. Die X-Koordinate ist dabei für Dich noch nicht relevant (die braucht man erst, wenn man richtig krasse Effekte machen will).
    Die paar Veränderungen von $d020 zeigen Dir also an, an welcher Stelle sich gerade der Rasterstrahl befindet. Wenn der Rahmen irgendwo flackert ist das meist die Musikroutine, da diese sehr unterschiedliche sogenannte Rasterzeit braucht. Deswegen packt man die normalerweise irgendwo hin, wo sonst nicht viel passiert. Das kann der untere/obere Border sein, wenn man da nichts machen will, sprich: den nicht öffnen will oder so. Kann man aber in Deinem Beispiel auch getrost in die Rasterzeilen packen, wo Dein Multicolorbild angezeigt wird (denn eine Musikroutine ändert eben nicht die Grafikregister).


    In Deinem Fall ist vorallem wichtig, dass Textmode rechtzeitig angeschaltet wird, so dass spätestens die Rasterzeile in welcher der Scroller sich befindet im Textmode ist und spätestens irgendwo oben kurz vor Ende des Borders auf Multicolor zurückgeschaltet wird.


    Den Softscroller packt man zusätzlich in den IRQ, damit dieser konstant einmal pro Frame ausgeführt wird, bzw. Hardscroll eben in dem Frame, wenn kein Softscroll stattfindet. Hardscroll braucht auch etwas mehr Rasterzeit als Softscroll und wenn Du die $d020 Spielchen machst, dann wird auch hier immer etwas Flackern auftreten.

  • boah.... das ist ja von vorne bis hinten ein grosser murks :D (ist nicht böse gemeint).
    da ist ja fast nix richtig.


    1. setze (wie sauhund schon vorher geschrieben hatte) eine STARTZEILE für den IRQ im init. mit LDA #$xx STA $D012.
    Im moment startet der zunächst einfach so in der defaultzeiel (#$37)... aber auch nicht wirklich wegen weiterer bugs.
    für dein beispiel am besten auf #$e2 oder #$e3


    2. wenn du das hast, dann brauchst du den wait zu begin von irq auf zeile #e3 nicht. Schlieslich machst du ja deswegen ein IRQ !!!
    also weg damit (höchsten eine kleine verzögerungsschleife um das setzen von $d016 zu verschieben).


    3. das lda#ff cmp$d012 macht ja garnix, da der BNE fehlt...
    und das lda #80 cmp $d012 bne *-8 ist die wurzen noch mehr übels ;)
    denn das wartet ja bis über den begin des nächsten irqs (der ja nicht gesetzt auf default #$37 steht) uah...
    also WEG DAMIT!!!


    4. was brauchst du wirklich?
    zu beginn von irq solltest du $d016 setzen (wie du es scho machst) und $d011 und $d018 auf die scrolltext werte setzen.
    also TEXTMODUS in $d011 und den richtigen Screen+char in $d018 (vermutlich #$16, da der scroll auf $07c0 liegt und der gross/klein char verwendet werden soll)
    dann solltest du wirklich mal auf zeile #ff warten (den bne *-3 aber nicht vergessen). also bis nach der darstellung des scrollers.
    Dann kannst du schon wieder auf den BITMAPMODUS in $d011 und richtigen Screen in $d018 für das bild umschalten. $d016 nicht vergessen (multicolor und still stehend).
    nun kann du ohne weitere $d012 waits einfach alles weitere (scrollroutine und music) aufrufen.


    PS: die labels softund hardscroll sind ja wohl gerade falschrum gewählt, denn bei hardscroll wird ja der "weiche" d016 wert gemacht und bei soft wird der scroller "hard" gescrollt. klar, dadurch dass du die label entsprechend aufrufst, wird alles richtig abgearbeitet, nur ist die bezeichnung falsch (und für leute die das nachvollziehen wollen etwas verwirrend).

  • 1. setze (wie sauhund schon vorher geschrieben hatte) eine STARTZEILE für den IRQ im init. mit LDA #$xx STA $D012.
    Im moment startet der zunächst einfach so in der defaultzeiel (#$37)... aber auch nicht wirklich wegen weiterer bugs.

    Das schlimme ist, dass dieser Murks in ziemlichen vielen alten Büchern genau "falsch" vorgemacht wird (mal abgesehen von einigen alten Demos, wo das ebenso gehandhabt wird), dass es echt eine Weile braucht, bis man rafft, dass das absoluter Bullshit ist.

  • Roland: Auch Dir danke ich, die Kritik stecke ich weg. Kann mir schon ausmalen, dass das für erfahrene Leute wie ein einziger Haufen Mist aussieht. Liegt aber z.T. auch an schlechten Tuts, aus denen ich eben auch Schleifennamen übernommen habe, die mir nicht helfen und andere verwirren. Davon, dass es kaum bis keine kommentierten Codeschnipsel gibt, will ich jetzt gar nicht anfangen. Da bleibt eben nur Learning bei Doing und manchmal macht man dabei eben Boing bzw. Pfusch =)


    Nochmals Danke für alle Hilfen. Zieh ich mir vor dem nächsten Anlauf alles mal genauer rein und werde dann auch Rolands Hinweis beherzigen, $D020 feste Werte für einzelne Aktionen zuzuweisen, um mehr davon zu haben/durchzublicken.


    Bleibt weiter geduldig mit mir. Tschakka und so... :)

  • Besser kleiner Durchbruch als großer Dammbruch oder gar schlimmer Durchfall! Ganz so Shice ist der Kot jetzt jedenfalls nicht mehr. :freude


    Auch wenn ich mir erstmal wieder wie ein Wurm vorkam, weil ich trotz Eurer Hilfen irgendwie nur Bahnhof verstanden habe und viele Tage weiter gepfuscht, gelesen, gegoogelt, Codebase&Co durchforstet, sogar den Input64-ASM-Kurs nochmal gelesen habe, um Wissenslücken zu schließen, fehlte mir der Durchblick. Das kommt eben dabei raus, wenn man sich einfach hier und da was klaut und es zusammen bastelt, ohne wirklich alles ausreichend nachzuvollziehen. War kurz davor, von vorn zu beginnen oder die Sache mit dem Assembler doch lieber anderen zu überlassen. Doch nachdem ich den kompletten gestrigen Tag Fehler für Fehler gejagt habe, Heureka! Die Tipps von Roland, also demjenigen, der am härtesten mit meinem Pfusch ins Gericht gegangen ist, haben letztlich wirklich am meisten geholfen. Nochmals Danke an ihn und alle anderen, die bereit waren (und hoffentlich bleiben), mir und anderen ASM-Anfängern zu helfen.


    Auch wenn es mir also viel schwerer fiel als gedacht: Immerhin habe ich jetzt folgendes geschafft:
    - Koala anzeigen und GLEICHZEITIG:
    - Softscroll mit C= Standard-Charset (und zwar hier ganz bewusst; wie man Charsets macht, weiß ich, wie man sie in einem Scroll verwendet, lerne wohl selbst ich Pfeife für spätere Projekte auch noch) laufen lassen
    - Die unteren Zeilen des Bildes löschen, damit der Scrolltext sie nicht verhunzt (mehr oder weniger von Richard's Goldfisch-Demo geklaut UND verstanden)
    - Musik abspielen (damit habe ich mich am Anfang ein paar Abende abgequält, im Nachhinein ist das gut gewesen, denn im Vergleich zum Rest war es geradezu kinderleicht, also gar kein schlechter Einstieg)
    - Viel (aber sicher noch nicht allen) Mist über Bord geworfen, der eigentlich nicht wirklich was gemacht hat (z.B. war meine Schriftfarbenänderung nur aus purem Zufall pseudo-erfolgreich, wie sich beim Ändern der Parameter herausgestellt hat, mittlerweile habe ich rausgefunden, wie das wirklich geht)
    - Hoffentlich bisschen lesbarer gemacht durch Tausch der Bezeichnungen von Hart und Soft



    Woran hapert es jetzt noch?
    - Fehler
    :

    Nach dem notwendigen Verlegen des Textinhaltes von $3000 auf $5000 (beißt sich sonst momentan mit dem Koala im Speicher) erkennt die hart-Routine leider das Ende meines Textes $FF nicht mehr. Das ist wirklich blöd und mir ein Rätsel. Wenn man ohne Koala einfach mal nur um 1 Byte verlegt auf $3001, dann findet er das Ende genau eine Textstelle zu spät und gibt mir vor dem Sprung in endscroll noch ein "@", also ein Nullbyte, bei $3002 gibt er mir "@@" usw. Bei $5000 gibt er mir viele dieser Nullbytes und zwischendurch etwas Garbage. Warum ist das nur so...? Wäre dankbar, wenn sich das einer mal anschaut (unterer Teil vom Code) und mir einen heißen Tipp gibt.
    - nächster Schritt: Irgendwo eine GET-Routine (Space-Tastendruck-Abfrage) in ASM einbauen. Das traue ich mir zu, zumal das ja so ähnlich im Input-Kurs dran kam. :)
    - übernächster Schritt: Speicherbelegung optimieren mit dem Ziel, ein möglichst kleines Intro zu haben, dass eher im "niederen" Speicher liegt. Ich habe davon zwar mal was gehört und weiß ein paar Stellen zum nachschlagen, werde aber sicher Hilfe brauchen.
    - Finale: Das Intro und das Game linken. Dafür müsste man letzteres wahrscheinlich nochmal in höhere Gefilde legen. Auch dabei helft ihr mir hoffenlich.



    Fazit: Vor Weihnachten wird's wohl noch was :sleeping:


    Freue mich weiterhin über Kritik/Anregungen/Hilfe! :winke:

  • Das sieht ja schon mal ganz gut aus :zustimm:
    Vielleicht kann ich etwas zur 'Space-Taste' beitragen:


    Das geht am einfachsten über die Anzahl der Zeichen im Tastaturpuffer $c6 ( dez.198 ) .
    Einfach ein

    Code
    1. lda $c6
    2. cmp #0
    3. beq weiter
    4. jmp ende


    Das fragt allerdings nur ab, ob überhaupt irgendwas gedrückt wurde und funktioniert auch nur bei eingeschaltetem Basic-ROM.
    Eleganter ist es da schon, die CIA direkt abzufragen mit z.B.:

    Code
    1. lda #$ef ; Space Taste in Keyboard-Matrix
    2. cmp $dc01 ; gedrückt ?
    3. bne mainloop ; Nein
    4. jmp ende ; sonst Ende


    :winke:

  • Danke Feuertonne, verständlich und übersichtlich. Das sollte hinzukriegen sein.


    Was anderes:
    In den ESI-Intros gibt es diesen (nach meinem verklärten 80er Jahre Oldschool-Geschmack) stylischen Bildaufbau Rasterzeile für Rasterzeile. In "meiner" Koala-Routine (so oder so ähnlich von Codebase) baut sich das Bild ja momentan anders auf. Die Gradik selbst (ohne Farben) ist einfach mal *Zack* da und die Farben bauen sich von verschiedenen Positionen aus rückwärts auf, wie man erkennt, wenn man die Koalaschleife etwas verlangsamt (z.B. durch lda #$00
    sta $d012 am Anfang und cmp $d012 bne *-3 am Ende vor dex). Wenn ich wenigstens ein bisschen was gerafft habe, müssten es wegen des dex ja 256 Schritte sein (von 255 bis 0 rückwärts). Erster Schritt Richtung ESI wäre also schon mal INX statt DEX, denn ich will ja von oben aus das Bild aufbauen. Hmh. Und dann müssten natürlich die 256er Blöcke stückweise/nacheinander abgearbeitet werden statt parallel in der gleichen Schleife.


    Bin ich auf dem richtigen Weg?
    Was muss ich ggf. noch beachten?
    Oder muss ich einen ganz anderen Weg gehen?
    Immerhin sieht das ziemlich smooth aus bei ESI.

    Bei mir dagegen findet das keineswegs Rasterzeile für Rasterzeile, sondern eben Screen Block für Screenblock statt, wie vielleicht folgende Aufnahme verdeutlicht:


    Ich weiß, das ist jetzt kein dringendes Problem, aber fragen kostet nix und mich interessiert's! :)

  • Das wäre imho am einfachsten mit zwei Rasterinterrupts zu machen:


    - du schaltest erstmal in der Vorbereitungsroutine auf einen illegalen VIC-Modus, der nur n schwarzen Screen anzeigt (gleichzeitig Multicolor- und Extended Color-Modus einschalten macht das glaub ich).


    - dann brauchst du 2 Rasterinterrupts: der erste schaltet vor der ersten Bildschirmzeile den VIC-Modus zurück auf den legalen Multicolor Bitmap Mode, der zweite schaltet nach der letzten Bildzeile, die angezeigt werden soll, zurück auf den illegalen Modus.


    - diesen zweiten Interrupt lässt du dann langsam nach unten bis zur letzten Koala-Bildzeile wandern.


    Aber ich würde da zumindest noch ne Möglichkeit einbauen den Effekt abzukürzen, die meisten Leute die ich kenne sind immer recht froh, wenn sie ein Intro zügig wegklicken können :)

  • Etwas "komplizierter" als der Vorschlag von Colt Seavers wäre es, die Bitmapdaten zunächst irgendwo anders im Speicher abzulegen und dann nach und nach in den Bereich der angezeigt wird zu kopieren. Würde ich aber bei so einem Crackintro nicht machen, weil da noch mehr Speicher flöten geht. Kann man aber mal im Hinterkopf behalten, wenn man mal sowas wie ne Picshow machen will o.ä... Denn mit der Umkopiermethode kann man das Bild ja noch auf viele weitere Arten aufbauen, als einfach nur von oben nach unten.

  • Das wäre imho am einfachsten mit zwei Rasterinterrupts zu machen:


    - du schaltest erstmal in der Vorbereitungsroutine auf einen illegalen VIC-Modus, der nur n schwarzen Screen anzeigt (gleichzeitig Multicolor- und Extended Color-Modus einschalten macht das glaub ich).
    - dann brauchst du 2 Rasterinterrupts: der erste schaltet vor der ersten Bildschirmzeile den VIC-Modus zurück auf den legalen Multicolor Bitmap Mode, der zweite schaltet nach der letzten Bildzeile, die angezeigt werden soll, zurück auf den illegalen Modus.

    Da brat mir einer 'n Storch - Na, wenn's weiter nix ist ;) Klingt für mich erstmal kryptisch, und da sagt man immer "Assembler ist keine Alchemie" (je tiefer ich in die Materie vordringe, desto mehr zweifle ich diese Aussage an, fühle mich von Tag zu Tag mehr dem Glauben verfallen, auch Gold herstellen zu können, wenn man diese Sprache beherrschen kann) Aber illegal klingt irgendwie cool! :)

    Zitat


    - diesen zweiten Interrupt lässt du dann langsam nach unten bis zur letzten Koala-Bildzeile wandern.

    Das leuchtet irgendwie ein.

    Zitat

    Aber ich würde da zumindest noch ne Möglichkeit einbauen den Effekt abzukürzen, die meisten Leute die ich kenne sind immer recht froh, wenn sie ein Intro zügig wegklicken können :)

    Ach, was die Leute immer wollen ;) http://www.youtube.com/watch?v=AMP7HagU5IM&feature=related


    @Spider: Hmh, ja, klingt sehr interessant zu wissen/irgendwann zu können. :freude

  • [OFFTOPIC]@Mods: Bitte ghs Post und diesen absägen und in den "ESI-Cracktro nachcoden"-Bereich verschieben.


    Danke der Nachfrage, mein Bester! Und danke auch für die Blumen, fand Deine Freds auch interessant und lehrreich und ermutigend.


    Ich lese bei Dir auch mit und teste, wann immer ich Zeit finde.


    Viel fehlt eigentlich nicht mehr: nur noch der Tastendruck und eben das Verlinken bzw. Speicherplatz des eigentlichen Cracks so modifizieren, dass Platz ist für das Intro.


    Und einiges an wenig funktionalem, daher entbehrlichen Spielkram wollte ich noch machen, muss aber auch nicht sein, wenn es einer Fertigstellung 2009 im Wege steht.


    Hatte in letzter Zeit wenig bis gar keine Zeit zu coden leider.[/OFFTOPIC]

  • Ist das hier nun eine Umsetzung des etwas komoplizierteren Bildaufbaus, wie Spider ihn vorschlägt?
    Beispiel Bildaufbau Helikopterjad
    Oder ist das sogar eine noch einfachere Fassung?
    Ist natürlich nicht so schön smooth Rasterzeile für Rasterzeile wie bei ESI (dafür müsste man dann wohl die von Colt angesprochenen Anzeige-Modi-Wechsel durchführen), also eher "rough".
    Aber das sollte ich doch eigentlich durch leichte Modifikation der Bildaufbau-Routine hinkriegen könne oder?
    Kommentarer? Vorschläge, wo ich ggf. ansetzen könnte?