Klein anfangen: ESI-artiges Cracktro in ASM nachcoden


  • TheRyk
  • 4431 Aufrufe 84 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ja, entschuldige die thumbe Frage, den Menupunkt kannte ich, wusste bloß bisher nicht recht, wo man diese virtuellen Cartridges herkriegt. Danke für den Link! Vielleicht stochere ich ja jetzt nicht mehr ganz so im Nebel bzgl. Speicherverwaltung :)
    Es sind keine anzeigbaren Aktivitäten vorhanden.
  • Hi!

    Beim Musik-Rippen haben mir inzwischen Colt Seavers und Chuck Norris (fragt nicht) geholfen. Zumal ersterer (zu Recht) an dem Song hing, finde ich das hochanständig von ihm. Außerdem war das Ziel des Freds ja möglichst ein 1:1-Nachbilden des Demomaker-Loaders als ASM-Intro, das so sinnvoll im Speicher liegt, dass man es gut verlinken kann. Ich danke für alle Bemühungen von Lobber in Sachen Daglish-Rippen, vielleicht habe ich ja trotzdem was dabei gelernt/raffe es doch noch ;)

    Dem Verlinken selbst möchte ich mich später widmen, zunächst will ich einen Scrolltext integrieren. Dazu muss ich mich erstmal ein wenig schlauer machen.

    Zur Beruhigung schonmal den aktuellen Code und ein das Cracktro/Packtro.

    Quellcode

    1. !to "cracktro.prg"
    2. *= $2000
    3. !bin "flandertm.prg",,2 ; Koala-Bild nach $2000 laden
    4. *= $0cf6
    5. !bin "Humpa3.bin"; Musik nach laden
    6. *= $0804 ;also später sys 2052, musste sein, weil BASIC-Interpreter bei $0801 mit dem SEI nicht klar kommt
    7. lda #$00
    8. sta $d020 ; POKE53280,a
    9. sta $d021 ; POKE53281,a
    10. tax
    11. .koala:
    12. lda $3f40,x ; FARBEN IN BILDSCHIRM RAM
    13. sta $0400,x
    14. lda $4040,x
    15. sta $0500,x
    16. lda $4140,x
    17. sta $0600,x
    18. lda $4240,x
    19. sta $0700,x
    20. lda $4328,x ; FARBEN IN FARB-RAM
    21. sta $d800,x
    22. lda $4428,x
    23. sta $d900,x
    24. lda $4528,x
    25. sta $da00,x
    26. lda $4628,x
    27. sta $db00,x
    28. dex
    29. bne .koala
    30. lda #$3b ; BITMAP
    31. ldx #$18 ; MULTI-COLOR
    32. ldy #$18 ; SCREEN $0400, BITMAP $2000
    33. sta $d011
    34. stx $d016
    35. sty $d018
    36. jsr $0cf6
    37. sei
    38. .loop
    39. lda #$80
    40. cmp $d012
    41. bne *-3
    42. jsr $0d0b
    43. jmp .loop
    Alles anzeigen
    Dateien
    • cracktro.prg

      (16,14 kB, 8 mal heruntergeladen, zuletzt: )
    • backtro.asm

      (1,06 kB, 6 mal heruntergeladen, zuletzt: )
    • packtro.prg

      (5,14 kB, 10 mal heruntergeladen, zuletzt: )
    • Humpa3.bin

      (3,61 kB, 10 mal heruntergeladen, zuletzt: )
    Es sind keine anzeigbaren Aktivitäten vorhanden.
  • Versuche gerade duch die Codebase-Beispiele vom guten Monte Carlos/BCC für Scrolling durchzusteigen... Eieiei... schöner Kram, direkt gleich was zum Angeben (bidirektionaler 1X1). Habe es auch für Relaunch-Syntax übersetzt. Läuft einwandfrei. Aber verstehen tu ich diesen Code noch lange nicht... :nixwiss: Vielleicht 'ne Nr. zu hart für den Start...

    Hat nicht mal jemand für Checknixe wie mich einen Tipp, wo ich einen Quelltext für simplen ein-direktionalen 1X1 mit Standard-Charset ohne Schnickschnack finde? So haben die ersten ESI-Intros ja schließlich noch ausgesehen (C= Chars weiß auf schwarz von rechts nach links). Erste Übung für mich könnte dann ja sein, das Ganze von Zeile 0 in Zeile 24 zu verlegen...

    PS: Jaaa, SuFu, ich weiß, aber die Board-Suche ist wirklich ziemlich zickig und Google/Codebase gibt mir zwar 'ne Menge Treffer, aber I still haven't found what I'm lookin' for (jedenfalls nicht so einfach, wie ich es mir wünsche)
    Es sind keine anzeigbaren Aktivitäten vorhanden.
  • Für die Scrollerroutine in meinem Musikdemo-Programm hab ich den hier als Vorlage genommen und selbst nach Bedürfnissen abgewandelt:

    youtube.com/watch?v=R8uFrdn_uZQ

    Klar, ist immer etwas doof, was aus einem Video abzutippen, aber der Code ist recht elegant und imo auch sehr gut nachzuvollziehen, sprich leicht auch seinen eigenen Vorstellungen anzupassen. Ich habs ja auch geschafft ;).

    Gruß
    hobbycoder
  • hobbycoder schrieb:

    ...
    Klar, ist immer etwas doof, was aus einem Video abzutippen, aber der Code ist recht elegant und imo auch sehr gut nachzuvollziehen, sprich leicht auch seinen eigenen Vorstellungen anzupassen. Ich habs ja auch geschafft ;).

    Gruß
    hobbycoder
    Nunja, warum einfach, wenn es auch kompliziert geht. Aber Danke, besser als nix und auch um einiges besser als ein siebenteiliges Youtube, um irgendwas in C64-ASM zu coden (kein Witz, habe ich auch schon Treffer gehabt, waren IIRC >6 Teile á 10 Minuten).

    Damit müsste ich was anfangen können. :winke:

    EDIT/PS: Immerhin schon mal softscroll. Hard-scroll geht ja auch in Basic recht "flüssig" bis ruckelig. Also wenn schon ASM, auf jeden Fall eine gute Wahl, obwohl ich nicht mehr weiß, wie das bei ESI am Anfang war.
    Es sind keine anzeigbaren Aktivitäten vorhanden.
  • Scrollendes Etwas... Fragen

    Okelidokeli, ca. 1 h später läuft das Teil mehr oder weniger. Ein Heidenspaß, dass sich der Ersteller des Videos in seinem Video auch noch Tippfehler geleistet hat, die er erst später korrigiert, da kommt Freude auf, schließlich hat man mit den eigenen Tippfehlern ja nicht genug zu tun.

    Hier also mal der Code mit Anmerkungen, was ich verstehe und was nicht.

    Quellcode

    1. !to "scrolll.prg"
    2. *=$1000
    3. sei; interrupts stoppen
    4. lda #$00
    5. sta $d020
    6. sta $d021; border & screen schwarz
    7. lda #$01
    8. sta $0286; da erkennt der versierte Basic-Mensch doch gleich die Schriftfarbe, sie sei Weiß
    9. jsr $e544; etwas mit dem Zeichensatz... Groß/Kleinschreibung? nicht gewollt, Zeile macht aber noch was anderes, nur was?
    10. lda #$00; Hmh...
    11. sta $dc0d
    12. lda $dc0d
    13. lda #$01
    14. sta $d01a
    15. lda #<irq
    16. ldx #>irq
    17. sta $0314
    18. stx $0315
    19. cli ; interrupts wieder erlaubt
    20. jmp *
    21. irq
    22. asl $d019
    23. lda #$35
    24. cmp $d012
    25. bne *-3
    26. lda $35
    27. sta $d016
    28. lda #$16
    29. sta $d018
    30. lda #$50
    31. cmp $d012
    32. bne *-3
    33. lda #$c8
    34. sta $d016
    35. jsr hardscroll
    36. jmp $ea81
    37. hardscroll
    38. lda $35
    39. sec
    40. sbc #$01
    41. and #$07
    42. sta $35
    43. bcc soft
    44. rts
    45. soft
    46. lda $3000 ; oho, hier finden wir den Zugriff auf die Speicheradresse, ab der wir den Text ablegen
    47. cmp #$ff
    48. beq endscroll
    49. sta $0427
    50. ldx #$00
    51. loop
    52. lda $0401,x
    53. sta $0400,x
    54. inx
    55. cpx #$27
    56. bne loop
    57. inc soft+1
    58. bne sk2
    59. inc soft+2
    60. sk2
    61. rts
    62. endscroll
    63. lda #$00
    64. ldx #$30
    65. sta soft+1
    66. stx soft+2
    67. rts
    68. *=$3000 ; Es wird losgetextet. Auf diese und die folgenden 2 Zeilen bin ich "besonders stolz", da ich sie mir selbst zusammenreimen durfte/konnte :)
    69. !tx " HALLO FORUM !!! "; Hallo Welt ist so abgedroschen
    70. !byte $00 ; Textende
    Alles anzeigen
    Fragen:
    1. Doofer Zeichensatz (Groß/Klein) Da muss irgendwo etwas DEZIMAL um ca. 128 verschoben werden... aber wo...
    2. @@@@@ statt Leerzeichen --> selbes Problem? Oder muss ich da irgendwas in den $3000ern mit Nullen füllen?
    3. Speicherbelegungstechnisch passt das natürlich noch nicht so super zum Rest. Vorschläge?
    4. Ich muss noch finden, wo die Y-Position des Scrolltextes liegt, um das Ganze von Zeile 0/1 in Zeile 24/25 zu verlegen.
    Dateien
    • scrolll.prg

      (8,21 kB, 7 mal heruntergeladen, zuletzt: )
    Es sind keine anzeigbaren Aktivitäten vorhanden.
  • Okay, 1 Problem selbst gesehen/ 1 neues geschaffen

    Natürlich nicht

    !byte $00
    sondern
    !byte $FF

    Dann gibt es keine @@@, sondern einen Neustart des Textes,
    ist klar, weil ja mit CMP nach $FF gesucht wird und nicht nach $00 :rotwerd:
    Frage 2. ist also erledigt

    Neuer Pfusch: Dafür ruckelt das Teil aber jetzt nach dem Textende immer einmal recht kräftig... :(
    Das ist doch sicher vermeidbar... EDIT: natürlich z.B. durch 40XLeerzeichen am Textende, aber sicher auch eleganter, oder?
    Es sind keine anzeigbaren Aktivitäten vorhanden.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von TheRyk ()

  • Hallo Ryk,

    $e544 ist ne Rom-Routine, die den Bildschirm löscht und das komplette Farb-Ram auf die Farbe in $0286 setzt.

    Wenn ich das richtig verstanden habe, willst du nur Großschreibung, oder wie? Dann kannst du Codezeilen 31/32 entfernen, die setzen nur ne andere Char-Bank. Ansonsten hilft auch ein !ct scr im ACME, um C64-Screencodes zu verwenden und nicht ASCII, damit das vom Zeichensatz her passt.

    Die Y-Position findest du in den Rasterwerten in den Zeilen 25 und 33, die den Scrollbereich eingrenzen, und natürlich an der Position des Textes im Bildschirmspeicher (Zeilen 55 und 59/60).

    Um das Rucken zu beheben, musst du zusätzlich nach dem Rücksetzen des Zählers auf $3000 auch noch den Rest der Zeile um 1 ganzen Character verschieben.


    Gruß
    hobbycoder
  • Vielen Dank Euch allen.

    Heute sind die Fortschritte mal wieder besonders bescheiden ausgefallen.

    Quellcode

    1. !to "scrolll.prg"
    2. *=$1000
    3. sei; interrupts stoppen
    4. lda #$00
    5. sta $d020
    6. sta $d021 ; border & screen schwarz
    7. lda #$01
    8. sta $0286 ; Schriftfarbe Weiß
    9. jsr $e544 ; die böse Zeile
    10. lda #$00 ;
    11. sta $dc0d
    12. lda $dc0d
    13. lda #$01
    14. sta $d01a
    15. lda #<irq
    16. ldx #>irq
    17. sta $0314
    18. stx $0315
    19. cli ; interrupts wieder erlaubt
    20. jmp *
    21. irq
    22. asl $d3d9
    23. lda #$35
    24. cmp $d012
    25. bne *-3
    26. lda $35
    27. sta $d016
    28. ; lda #$16
    29. ; sta $d018
    30. lda #$50 ;?
    31. cmp $d012
    32. bne *-3
    33. lda #$c8
    34. sta $d016
    35. jsr hardscroll
    36. jmp $ea81
    37. hardscroll
    38. lda $35
    39. sec
    40. sbc #$01
    41. and #$07
    42. sta $35
    43. bcc soft
    44. rts
    45. soft
    46. lda $3000 ;Speicheradresse, ab der wir den Text ablegen
    47. cmp #$ff
    48. beq endscroll
    49. sta $07E7
    50. ldx #$00
    51. loop
    52. lda $0BC2,x
    53. sta $0BC1,x
    54. inx
    55. cpx #$27
    56. bne loop
    57. inc soft+1
    58. bne sk2
    59. inc soft+2
    60. sk2
    61. rts
    62. endscroll
    63. lda #$00
    64. ldx #$30
    65. sta soft+1
    66. stx soft+2
    67. rts
    68. *=$3000 ; Es wird losgetextet. :)
    69. !ct scr
    70. !tx " hallo forum "; Hallo Welt ist so abgedroschen
    71. !byte $FF ; Textende
    Alles anzeigen
    Okay:
    a) die ungewollte Charbank-Knipserei ist mit ; entschärft.
    b) Gefahr e544 erkannt, aber noch nicht gebannt. Ich habe CLRSCR-Schleifen als Source gefunden, weiß aber noch nicht wann/wie ich diese Schleifen aufrufen darf/sollte.
    c) Das Verlegen um dezimal 960 (24 Zeilen runter) hat generell geklappt. Dafür ruckelt das Teil jetzt noch mehr :( Was muss in Zeile 33 stehen? Hilft das gegen das lahme Geruckel?
    d) Verbindung mit Ton/Grafik muss warten. Ideen (sowohl über Programmstruktur als auch über Speicherverwaltung) werden gern entgegen genommen.

    N8i N8i :zzz:
    Es sind keine anzeigbaren Aktivitäten vorhanden.
  • Hallo Ryk,

    dein Text ruckelt, weil immer noch "oben" gescrollt wird (Rasterzeilen $35 bis $50), dein Text jetzt aber unten in der letzten Bildschirmzeile steht, wenn ich das richtig verstanden habe. Somit werden nur immer ganze Chars verschoben, was natürlich sehr hart und kantig aussieht. Um den Softscroll 24 Zeilen nach unten zu schieben, ändere mal die Codezeile 25 in LDA #$E3 und die Codezeile 33 (wie du schon erkannt hast) in LDA #$FF. Das verschiebt den Softscroll mit $d016 ungefähr auf die Textzeilen 22 bis kurz nach 24, sollte also klappen.

    Gruß
    hobbycoder
  • Danke, Hobbycoder!

    Softscroll geht nun auch in Zeile 24/25 bis auf den Ruckler beim Textende.

    Wie ich die Zeile verschieben muss, um das auszustellen, habe ich noch nicht ganz gerafft. Heißt das, ich sollte statt 40er Breite lieber 39/38er Breite für den Scroll nehmen?
    Es sind keine anzeigbaren Aktivitäten vorhanden.
  • CLRSCR z.B. so:

    Quellcode

    1. ldx #250
    2. loop
    3. lda #$20
    4. sta $0400+250*0-1,x
    5. sta $0400+250*1-1,x
    6. sta $0400+250*2-1,x
    7. sta $0400+250*3-1,x
    8. lda #$01
    9. sta $d800+250*0-1,x
    10. sta $d800+250*1-1,x
    11. sta $d800+250*2-1,x
    12. sta $d800+250*3-1,x
    13. dex
    14. bne loop
    Alles anzeigen


    Zudem ungleich schneller als jsr $e544
  • Geil! Danke Enthusi, mit der CLRSCR passt das wunderbar. Ich rufe sie mittels ldx #250 und jsr an der Stelle auf, an der sonst das jsr $e544 stand. Später werde ich die CLRSCR-Loop wohl modifzieren müssen, weil ich ja nach dem Aufruf des Koalas nur ganz unten was löschen will/muss (wenn das überhaupt nötig ist, denn unten ist ein ganzer Teil Schwarz) für den 1X1-Scroll.

    Arbeite momentan noch an der Schmalerwerdung zwecks Ruckelvermeidung.
    Es sind keine anzeigbaren Aktivitäten vorhanden.
  • Ruckelei/Scrollbreite 38 bzw. 39

    Ich meine eigentlich, es müsste jetzt soweit Scrollbreite 39 haben. Aber es ruckelt immer noch.
    Erkennt jemand den Fehler?

    Quellcode

    1. !to "scrolll.prg"
    2. *=$1000
    3. sei; interrupts stoppen
    4. lda #$01
    5. sta $d020 ;border mal weiß zur Veranschaulichung
    6. lda #$00
    7. sta $d021 ;screen schwarz
    8. lda #$01
    9. sta $0286 ; Schriftfarbe weiß
    10. ldx #250
    11. jsr clrscr
    12. lda #$00
    13. sta $dc0d
    14. lda $dc0d
    15. lda #$01
    16. sta $d01a
    17. lda #<irq
    18. ldx #>irq
    19. sta $0314
    20. stx $0315
    21. cli ; interrupts wieder erlaubt
    22. jmp *
    23. irq
    24. asl $d019 +961
    25. lda #$E3
    26. cmp $d012
    27. bne *-3
    28. lda $35
    29. sta $d016
    30. ; lda #$16 ; optional: Chars Groß/Klein
    31. ; sta $d018
    32. lda #$ff
    33. cmp $d012
    34. bne *-3
    35. lda #$c8
    36. sta $d016
    37. jsr hardscroll
    38. jmp $ea81
    39. clrscr
    40. lda #$20
    41. sta $0400+250*0-1,x
    42. sta $0400+250*1-1,x
    43. sta $0400+250*2-1,x
    44. sta $0400+250*3-1,x
    45. lda #$01
    46. sta $d800+250*0-1,x
    47. sta $d800+250*1-1,x
    48. sta $d800+250*2-1,x
    49. sta $d800+250*3-1,x
    50. dex
    51. bne clrscr
    52. hardscroll
    53. lda $35
    54. sec
    55. sbc #$01
    56. and #$07
    57. sta $35
    58. bcc soft
    59. rts
    60. soft
    61. lda $3000 ; Zugriff auf im Speicher abgelegten Text , siehe unten
    62. cmp #$ff
    63. beq endscroll
    64. sta $0427 +961
    65. ldx #$00
    66. loop
    67. lda $0401+961,x
    68. sta $0400+961,x
    69. inx
    70. cpx #$27
    71. bne loop
    72. inc soft+1
    73. bne sk2
    74. inc soft+2
    75. sk2
    76. rts
    77. endscroll
    78. lda #$00
    79. ldx #$30
    80. sta soft+1
    81. stx soft+2
    82. rts
    83. *=$3000 ; Es wird losgetextet.
    84. !ct scr
    85. !tx " hallo forum "
    86. !byte $FF ; Textende
    Alles anzeigen
    Es sind keine anzeigbaren Aktivitäten vorhanden.
  • Was mir gerade so auffällt sind zeilen 14 & 15

    lda #00
    sta dc0d

    ist ziemlich sinnlos um den Timer-Interrupt abzuschalten. Nimm lieber lda #$01 oder gleich lda #$7f in Zeile 14.

    Geek Erklärung:

    Durch Schreiben von Bit #7 legst du bei dem Register fest, ob du Interruptquellen an- oder abschalten willst. 0=abschalten, 1=einschalten (IMHO vernünftig).

    Durch Schreiben Bits #6-0 legst du fest, welche Quellen du an- oder abschalten willst, wobei eine 1 in dem betreffenden Bit ein An- oder Abschalten bewirkt, je nachdem ob Bit #7 1 oder 0 ist.

    Um auf Verdacht erstmal alles abzuschalten daher: lda #127/#$7f (= #%01111111 in Binär).

    Und in Zeile 27 "asl $d019 +961" würd ich das +961 wegmachen, das ergibt irgendwie auch keinen Sinn :)