Yeah!!
Nach harter Arbeit habe ich es jetzt geschafft, den Wobble einzubauen. Sieht echt schon sehr toll aus ![]()
Bitte mal anschauen!
Bitte melde dich an, um diesen Anhang zu sehen.
Es gibt 60 Antworten in diesem Thema, welches 14.533 mal aufgerufen wurde. Der letzte Beitrag (
Yeah!!
Nach harter Arbeit habe ich es jetzt geschafft, den Wobble einzubauen. Sieht echt schon sehr toll aus ![]()
Bitte mal anschauen!
Bitte melde dich an, um diesen Anhang zu sehen.
ja..sieht ganz gut....
kritik?
vielleicht etwas grösser? bei mir hackelt es etwas, ist das auch so bei dir? bzw. soll das so sein?
was ist das für ein symbol, bzw. text unten rechts am logo? ich kann es bei bestem willen nicht erkennen.
ansonnsten super arbeit... ich würde es nicht so schön hinbekommen, aber ich werde es mal probieren...
![]()
186 Blocks sind allerdings etwas viel dafür ![]()
Der Bitte melde dich an, um diesen Link zu sehen. macht das ganze deutlich kürzer.
Sind ja enorm grosse 0-Bereiche im Binary.
Also wenn Du es als intro verwenden moechtest, hilft es vermutlich, dass etwas zu straffen. Entweder "blind" per z.B. exomizer oder pucrunch oder auch selbst die bitmaps dahin schieben wo man sie spaeter braucht, bzw enger zusammen alles. Dann verbraucht es auch beim Laufen weniger RAM.
Aber chic ist's ![]()
danke
ich mach's etwas kleiner. momentan liegen die ganzen daten alle noch recht weit auseinander, das stimmt.
Zitatvielleicht etwas grösser? bei mir hackelt es etwas, ist das auch so bei dir? bzw. soll das so sein?
was ist das für ein symbol, bzw. text unten rechts am logo? ich kann es bei bestem willen nicht erkennen.
das einfaden hakelt, weil die fadetabelle noch nicht ganz sauber ist. und das symbol unten rechts ist eine miniatur meines nicknames =p
wo ich schon so motiviert bin fehlt noch ein dycp basierter scroller. irgendwelche tips dazu?
und etwas mucke bräuchte ich auch mal... aber diese c64-tracker haben mich bis jetzt abgeschreckt ![]()
noch eine kleine bemerkung zu dem wobbler.
der ist in der letzten zeile nicht ganz sauber.
da steht das rechte drittel der letzten logozeile still.
komisch. das raster hatte ich eigentlich stabil. und ich kann den fehler hier gar nicht sehen. kannst du davon irgendwie einen screenshot machen und einkreisen? ![]()
Zumindest in vice sieht man's deutlich.
Die Zeile bleibt rechts stehen.
Also entweder eine kurze Luecke wie auf dem Bild oder eben ein paar Pixel Ueberlapp...
ah jetzt seh ichs auch. danke!
so habs mal gefixt ![]()
Das sieht doch schon mal super aus! Weiter so! ![]()
wo ich schon so motiviert bin fehlt noch ein dycp basierter scroller. irgendwelche tips dazu?
naja... tipps dazu hätten hier sicher eine menge leute.
viel interessanter fände ich es, wenn du zunächst mal erzählst, was du denkst wie das funktioniert, und wie du es umsetzen würdest.
(selber gedanken machen bringt meiner meinung nach immer mehr, als alles nur blind nachzumachen).
...und dann kommen die tipps stück für stück hinzu ![]()
naja einigermaßen weiss ich wie es funktioniert aber auch nicht wirklich. ich denke dass das ganze gerade wegen des y-scrollings über 2 chars je scroll-lauflänge gelöst werden muss. sprich man hat zwei chars übereinander, die man anzeigt und in so einer einheit wird ein char in y-richtung hochgescrollt, da man ja YSCROLL des VIC nicht wirklich dafür nutzen kann. innerhalb der borders würde ich es dann per sprites lösen. ich hätte eine double-irq service routine, die hingeht und versucht die chars umpositionieren. in x-richtung linear, in y-richtung per sinetable.
oder auch das ganze per sprites, indem man versucht, multiplexing einigermaßen gescheit getimed anzuwenden ...
die sachen die ich bis jetzt gelesen habe (in der 64er und auf cevi-hacking) haben mir zwar weitergeholfen aber der sourcecode ist noch nicht ganz verständlich für mich. insbesondere frag ich mich, wie man dann mehrere DYCPs innerhalb einer raster-ISR erzeugt. bei einer crest und auch chorus demo habe ich gesehen, dass wirklich viele dycps angezeigt werden.
wenn ich nochmal drüber nachdenke, wäre das viel zu langsam. ich habe jetzt in einem artikel gelesen dass man einen zeichensatz als fake-screen verwendet. indem man die zeichen @ bis e, f - k, etc. pro spalte unterbringt, hat man die möglichkeit, durch normales lineares kopieren in den zeichenram ein zeichen in einer spalte auf eine bestimmte y-position zu setzen. das ist cool
und werde ich jetzt auch erstmal ausprobieren ....
ja, dass ist zumind. die variante, die ich zum anfang empfehlen würde.
man sollte sich jedoch auch gleich gedanken darüber machen, wie man den charset (also der, wo die ausgangsbuchstaben drin sind) ablegt, damit man ihn schnell und einfach auslesen kann. Denn so wie normalweise ein charset die buchstaben ablegt, ist nicht sehr effeltiv.
(also nicht das A von $2008-200f, das B von $2010-$2017, usw.... sondern, das A auf $2001, 2101, 2201, ...je nach höhe, und dann das B auf $2002, 2102, 2202, ...)
Danke erstmal soweit. Ich habe jetzt auch einen DYCP gebaut, mit Smooth Scrolling und X-Richtung und einer Sinusbewegung mit eigenem Font. War echt viel Arbeit ![]()
Aber, jetzt flackert alles und ich vermute dass ich während der DYCP Routine zuviel Rasterzeit verbrauche. Gibt es neben den üblichen Optimierungstechniken wie Speed-Code noch Möglichkeiten, das zu vermeiden. Ich habe es bis jetzt so gemacht, dass ich 4 IRQs verwende:
Soweit ich gesehen habe, nutzt der DYCP doch recht viel Rasterzeit. Knapp 5 Rasterzeilen pro Spalte, was wirklich zuviel ist. Meiner Berechnung nach müsste ich das auf 1/3 optimieren.
Daher meine Frage: Was wird in der Praxis gemacht? Optimiert, bis der Arzt kommt? Oder gibt es für einen DYCP noch ganz andere Methoden? Oder können hier Double-Buffering Methoden abhelfen? Oder sollten gewisse Sachen nur in jedem 2. Frame gemacht werden?
Ich hoffe auf Hilfe
![]()
Daher meine Frage: Was wird in der Praxis gemacht? Optimiert, bis der Arzt kommt? Oder gibt es für einen DYCP noch ganz andere Methoden? Oder können hier Double-Buffering Methoden abhelfen? Oder sollten gewisse Sachen nur in jedem 2. Frame gemacht werden?Ich hoffe auf Hilfe
![]()
Yo... Optimieren heisst das Zauberwort, wobei Speedcode - also ohne Schleifen - schon einiges bringt. Wenn das Grundkonzept allerdings schon nicht gut ist, hilft das auch nicht viel.
Da müsstest du uns den Code schon zeigen, damit man da genaueres sagen kann.
Es gibt auch viele Möglichkeiten einen DYCP zu machen. Bei einem kann man da auch wunderbar einen vordefinierten Charset verwenden, der alle möglichen Positionen der Buchstand enthält. So muss man "nur noch" die entsprechenden 2 Chars pro Spalte auf den Bildschirm schreiben (anstelle von meist 5 Charsetzeilen).
Ach...und da sind wir bei einem weiteren Punkt. Wie hoch ist dein Charset? Wenn er 7 oder 8 Pixel hoch ist, braucht das natürlich mehr Zeit als ein 5 Pixel hoher Charset.
Double-Buffering hilft, wenn der Bereich in dem der DYCP dargestellt wird auch für die Berechnung gebraucht wird. Ansonsten wird dadurch nix schneller/besser.
Jeden 2. Frame? NEIN! Pfui, Aus! Bloss nicht dran denken....
Ich hoffe du kommst damit zurecht. Da sind viele Sachen aus der libc64.asm drin, die aber selbsterklärend sein sollten. Optimiert habe ich eigentlich noch nicht viel, da ich auch bis jetzt noch nicht weiss ob das Grundkonzept gut ist. Den DYCP mache ich so (Spalte für Spalte):
Ich finde aber ich habe das ziemlich komplex gemacht, weil ich viel auf Selfmod setze und kein durch den Loop durchlaufendes X oder Y-Register habe mit dem in der Routine arbeite.
Naja, ist sicher auch viel Praxiserfahrung die mir fehlt ![]()
!to "ancients.prg", cbm
!source "libc64.asm"
raster_calcdycp = $00
raster_logo = $58
raster_dycp = $b8
fade_w = zp01
tech_c = zp02
dycp_scrolltext = $7400 ; Text, der gescrolled werden soll
dycp_worktext = $7600 ; Kopie des Scrolltexts als Workcopy
dycp_charset= $3800 ; Unser Charset, in den der DYCP kopiert wird
dycp_sine = $7a00 ; Tabelle mit Sinus-Werten für Y-Bewegung
dycp_sineold= $7b00 ; Tabelle mit den aktuell genutzen Sinus-Werte
dycp_font = $5300 ; DYCP-Font
dycp_cmaplo = $7000 ; Charmap lo-Bytes (dycp_charset + char * 8)
dycp_cmaphi = $7100 ; Charmap hi-Bytes (dycp_charset + char * 8)
dycp_p1a = zp11 ; ZP-Pointer auf
dycp_p1b = zp12 ; DYCP-Charset
dycp_cur = zp03 ; Variable für aktuelle Spalte
dycp_cs = zp04 ; Aktuelle Position im Sinus
dycp_hi = zp05 ; Speicher für Hi-Byte (wird in dycp_buildmap genutzt)
dycp_textpos= zp06 ; Aktuelle Position im Text
dycp_scrpos = zp07 ; Scrollposition
; Backupspeicher für Register während ISR-Ausführung
irqstore_a = zp08
irqstore_x = zp09
irqstore_y = zp10
logo_char = $2000
logo_scr = $6000
logo_col = $6400
; Basic-Starter
* = $0800
+core_set_basicstart 3, 2, 7, 6, 8 ; Entspricht SYS 32768 zum Start bei RUN
; Logo ( Char-RAM )
* = logo_char
!binary "ancients_logo.prg", 0x1100, 2
; Logo ( Screen-RAM )
* = logo_scr
!binary "ancients_logo.prg", 0x03e8, 0x1f40 + 2
; Logo ( Color-RAM )
* = logo_col
!binary "ancients_logo.prg", 0x03e8, 0x1f40 + 0x03e8 + 2
; Badlinetabelle
* = $5000
[...]
; Sinustabelle
* = $5100
[...]
* = $5200
[...]
* = dycp_font
!binary "ancients_font.64c", $400, 2
* = dycp_scrolltext
!scr "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ancients@pledge@inc", $31, "@presents@a@first intro "
!scr "ancients@pledge@inc", $31, "presents",$ff
; Fade-Tabelle
* = $9000
!source "ancients_fadetable.asm"
; ---------------------------------------------------------------------------
; Entrypoint Intro
; ---------------------------------------------------------------------------
* = $8000
sei
jsr kernal_clrscr
+gfx_init mode_mcbitmap
+gfx_setbgcol 0, color_black
+gfx_setbordercol color_black
+gfx_setmem $0400, $2000
; Alle CIA-Interrupt ausschalten
+cia_disable_irqs
; Kernel abschalten und IRQs registrieren
+core_disable_kernal
+core_setnmi nmi
+core_setirq isr_calcdycp
; Vars initialisieren
lda #0
sta tech_c
lda #0
sta dycp_cs
lda #7
sta dycp_scrpos
; DYCP initialisieren
jsr dycp_copytext
jsr dycp_maskscr
jsr dycp_buildmap
jsr dycp_clrchr
; IRQ - Start
; Flags resetten
clv
clc
; Raster-IRQ initialisieren
+gfx_set_raster_position raster_calcdycp
+gfx_ack_rasterirq
+gfx_enable_rasterirq
; Und los gehts!
cli
; Einfaden
!set .fadeadr = $9800
!do while .fadeadr >= $9000 {
+gfx_fade2 $0400, $6000, $d800, $6400, .fadeadr
lda #$30
jsr waitm
!set .fadeadr = .fadeadr - $0100
}
; Auf Tastendruck warten
wobble lda #$00
sta $dc00
lda $dc01
cmp #$ff
beq wobble
; Ausfaden
!do while .fadeadr < $9800 {
!set .fadeadr = .fadeadr + $0100
+gfx_fade2 $0400, $6000, $d800, $6400, .fadeadr
lda #$30
jsr waitm
}
loop jmp loop
; ----------------------------------------------------------------------------
; DYCP-Chartabelle aufbauen (Buchstaben-index -> Adresse)
; ----------------------------------------------------------------------------
dycp_buildmap ; 256 Zeichen iterieren
lda #>dycp_font
sta dycp_hi
ldx #$00
dbm1 ; Index nehmen und mit 8 multiplizieren
txa
asl
asl
asl
; Falls überlaufen, erhöhen wir das Hi-Byte
bcc dbm2
; Hi-Byte erhöhen
inc dycp_hi
dbm2 ; Lo-Byte speichern
sta dycp_cmaplo, x
; Hi-byte speichern
lda dycp_hi
sta dycp_cmaphi, x
; Solange bis alle 256 Chars abgearbeitet sind
inx
bne dbm1
rts
; ----------------------------------------------------------------------------
; DYCP-Charset löschen
; ----------------------------------------------------------------------------
dycp_clrchr ; Ziel-Adresse resetten
ldx #>dycp_charset
stx dcc1+2
; Wir löschen 256 Chars + 8-Byte pro char = 2048 Byte, also $2000 bis $2800
ldy #08 ; 8 * 256 bytes
lda #0
dcc2 tax
dcc1 sta dycp_charset, x
inx
bne dcc1
inc dcc1+2 ; $20 von 20 um 1 erhöhen
dey
bne dcc2
rts
; ---------------------------------------------------------------------------
; Bildschirm mit spaltenbasierter DYCP-maske aufbauen
; ----------------------------------------------------------------------------
dycp_maskscr; 6 * 40 Zeilen = 240 Zeichen
lda #6
sta zp01
lda #0
tay
dms1 ; Zähler für X
ldx #40
dms2
sta $06d0, y
iny
clc
adc #6
; Zeilenende erreicht?
dex
bne dms2
sec
sbc #40*6-1
dec zp01
bne dms1
rts
; ---------------------------------------------------------------------------
; IRQ-Sektion
; ---------------------------------------------------------------------------
* = $c000
; ---------------------------------------------------------------------------
; NMI
; ---------------------------------------------------------------------------
nmi rti
; ---------------------------------------------------------------------------
; ISR: Raster-Stabilisierung
; ---------------------------------------------------------------------------
isr_stable ; Register retten, da das das Kernel-ROM nicht mehr für uns macht
+core_storeregs irqstore_a, irqstore_x, irqstore_y
; Neuen IRQ setzen
+core_setirq isr_logo
; Rasterzeile setzen, die den Raster-Compare IRQ auslöst
+gfx_ack_rasterirq
; Stack retten, um ihn im 2. Interrupt wiederzuverwenden
tsx
cli
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
; ---------------------------------------------------------------------------
; ISR: Logo + TechTech
; ---------------------------------------------------------------------------
isr_logo
; ------------------------------------ 63 Zyklen für Synchronisation mit
; ------------------------------------ Raster "in X-Richtung"
txs ; 2
ldx #$08; 2
xsync dex ; 2
bne xsync ; 3
+core_wait_cycles 3 ; 3
; 2 + 2 + (9 * 5) + 3 = 52
lda vic_raster ; 4 - Ist zwischen den beiden Statements
cmp vic_raster ; 4 - die Rasterzeile gleich geblieben?
beq stabled; 3
; 52 + 4 + 4 + 3 = 63
stabled ; ------------------------------------ STABILISIERT
line lda $5100, x
ldy $5000, x
ysync dey
bne ysync
; Tech-Tech
+core_wait_cycles 2
eor #16 ; MCM nicht vergessen =) 2
sta $d016 ; 4
inx
; 24 Zeilen
cpx #$38
bne line
; XSCROLL resetten
lda #19
sta $d016
; Neuen Sine-Table Ausschnitt kopieren
inc tech_c
ldx #00
ldy tech_c
nextsine lda $5200, y
sta $5100, x
inx
iny
cpx #$38
bne nextsine
; Wieder IRQ-Vektor auf 1. IRQ zurücksetzen
+core_setirq isr_dycp
+gfx_set_raster_position raster_dycp
+gfx_ack_rasterirq
+core_restoreregs irqstore_a, irqstore_x, irqstore_y
rti
; ---------------------------------------------------------------------------
; ISR: DYCP-Calcer
; ---------------------------------------------------------------------------
isr_calcdycp+core_storeregs irqstore_a, irqstore_x, irqstore_y
; X-Scroll erhöhen
lda dycp_scrpos
sta vic_cr2
; Adresse des Charsets in Zeropage speichern und späteren indirekten Adressierung
ldx #<dycp_charset
ldy #>dycp_charset
stx dycp_p1a
sty dycp_p1b
; Startadresse für DYCP-Backup resetten
lda #0
sta sinepos_old+1
sta del_old+1
; Startadresse des Sinus auf neuen Wert setzen
lda dycp_cs
sec
sbc #4
sta dycp_cs
sta sinepos+1
; 40 Spalten haben wir vor uns
lda #40
sta dycp_cur
; Buchstaben zähler
lda #0
sta dycp_textpos
nextcol ; Altes Char löschen
ldx #8
lda #0 ; Mit 0 füllen
del_old ldy dycp_sineold ; Y-Pos holen ; Durch Self-mod beeinflusst!
nextdel sta (dycp_p1a), y
iny
dex
bne nextdel
inc del_old+1
; Adresse auf Char holen und auf nextline schreiben (Self-Mod!)
ldx dycp_textpos
ldy dycp_worktext, x
lda dycp_cmaplo, y
sta nextline+1
lda dycp_cmaphi, y
sta nextline+2
; Sinus-Wert holen und merken
sinepos ldy dycp_sine ; Durch Self-mod beeinflusst!
sinepos_old sty dycp_sineold ; Durch Self-mod beeinflusst!
; Char kopieren
ldx #0
nextline lda $ffff, x ; Durch Self-mod beeinflusst!
sta (dycp_p1a), y
iny
inx
cpx #8
bne nextline
; Sinuswert aktualisieren (Self-Mod!)
lda sinepos+1
clc
adc #8
sta sinepos+1
; Adresse in Tabelle mit alten Sinuswerten erhöhen (Self-Mod!)
inc sinepos_old+1
; Pointer 6 Zeichen (48-Byte) weiterbewegen
lda dycp_p1a
clc
adc #48
sta dycp_p1a
; Das HSB nur um eins erhöhen, wenn Carry-Set
bcc cont
inc dycp_p1b
cont ; Nächste Spalte
inc dycp_textpos
dec dycp_cur
bne nextcol
; X-Scroll dekrementieren
dec dycp_scrpos
bpl cont2
ldx #0
textcopy lda dycp_worktext+1, x
cmp #$ff
bne textcont
cpx #0
bne textcont
; Letztes Zeichen ist erreicht (ff = Steuercode für Ende des Strings)
jsr dycp_copytext
jmp xscroll
textcont sta dycp_worktext, x
inx
bne textcopy
xscroll ; X-Scroll resetten
lda #7
sta dycp_scrpos
cont2
+gfx_setmem $0400, $2000
+gfx_init mode_mcbitmap
+core_setirq isr_stable
+gfx_set_raster_position raster_logo
+gfx_ack_rasterirq
+core_restoreregs irqstore_a, irqstore_x, irqstore_y
rti
; ---------------------------------------------------------------------------
; ISR: DYCP
; ---------------------------------------------------------------------------
isr_dycp +core_storeregs irqstore_a, irqstore_x, irqstore_y
+gfx_init mode_text
+gfx_setmem $0400, $3800
+core_setirq isr_calcdycp
+gfx_set_raster_position raster_calcdycp
+gfx_ack_rasterirq
+core_restoreregs irqstore_a, irqstore_x, irqstore_y
rti
Alles anzeigen
P.S. an Forum-Admin: Syntax-Highlighting für 6502/ACME Code wäre nicht schlecht ![]()
hui... da gibts natürlich ne menge was man verbessern kann...
VORWEG AN ALLE:
Ein Scroller (mit eingerücktem Sideborder - wie man es normalerweise macht) braucht bloss 39 Chars.
Der 40. Char ganz rechts ist NIE zu sehen. Denn der Bildschirm wird ja auf 38 Chars breite verkleinert,
und der Screen kann per $D016 nur nach rechts geschoben werden (max 7 Pixel) und NICHT nach links!!!
Das spart auch schon mal Rasterzeit, wenn man den 40. Char einfach wegläst (auch bein normalen, nicht DYCP, Scrollern)
vorallem solltest du wie schon erwähnt den charset anders ablegen, damit du die charschreibroutine in etwa folgendermassen machen kannst.
(Charset also z.B. nach $2000 und den DYCP Block-Charset auf $3000)
Aktueller Buchstabe in X
Y-Sinus Wert des Buchstaben in Y
und dann:
lda 2000,x
sta (dycp_p1a),y
iny
lda 2100,x
sta (dycp_p1a),y
iny
lda 2200,x
sta (dycp_p1a),y
iny
lda 2300,x
sta (dycp_p1a),y
iny
lda 2400,x
sta (dycp_p1a),y
iny
lda 2500,x
sta (dycp_p1a),y
iny
lda 2600,x
sta (dycp_p1a),y
iny
lda 2700,x
sta (dycp_p1a),y
so kannst du den code noch in einer schleife für die 39 Spalten machen
und wenn du die Schleife aufdröselst dann etwas so:
lda 2000,x
sta 3000,y
lda 2100x
sta 3001,y
.
.
.
und für die nächste spalte:
lda 2000,x
sta 3030,y
lda 2100,x
sta 3031,x
.
.
.
das bringt ne MENGE!!!
...und genauso fürs löschen.
ldaBitte melde dich an, um diesen Link zu sehen.
sta 3000,y
sta 3001,y
sta 3002,y
.....