Ja, du hast deine Sprites verschoben. Halt mal nach dem Compilieren die Maus über die Label, dann siehst du due Speicheradresse. Du müßtest die Spritepointer korrigieren...
Ps: Ein besserer Platz für Sprites und Charset ist meist ab $d000
Du bist in Begriff, Forum64 zu verlassen, um auf die folgende Adresse weitergeleitet zu werden:
Bitte beachte, dass wir für den Inhalt der Zielseite nicht verantwortlich sind und unsere Datenschutzbestimmungen dort keine Anwendung finden.
letzter Beitrag von Acorn am
Ja, du hast deine Sprites verschoben. Halt mal nach dem Compilieren die Maus über die Label, dann siehst du due Speicheradresse. Du müßtest die Spritepointer korrigieren...
Ps: Ein besserer Platz für Sprites und Charset ist meist ab $d000
Danke, hat geklappt!!
Ps: Ein besserer Platz für Sprites und Charset ist meist ab $d000
Also den Charset ab $c000 habe ich hinbekommen aber ab $d000 raff ich nicht.
gibt es da irgendwo eine genaue Erkärung wie das funktionieren soll?
Über $d000-$ffff wird ja der I/O Bereich und Kernal geblendet. Für den VIC aber nicht, der liest stets das RAM darunter. Daher kann man da prima seine Bitmapdaten hinwerfen, zB so:
Den Screen bei $cc00 (bis an $d00 ran), die Sprites dann ab $d000-$dfff und den Zeichensatz ab $e000. Das liegt dann alles in der obersten Video-Bank. Und man hat viel Platz für den eigentlichen Code.
Allerdings muss man die Bitmapdaten erstmal "unter" den Bereich ab $d000 bekommen/kopieren. Aber das macht zB Exomizer schon automatsch beim Entpacken.
Allerdings muss man die Bitmapdaten erstmal "unter" den Bereich ab $d000 bekommen/kopieren. Aber das macht zB Exomizer schon automatsch beim Entpacken.
Und wie macht man sowas ohne "Exomizer"?
Verstehe ich nicht. Ich Programiere ja mit c64 Studio, wie bekomme ich da jeztz alles nach $d000?
Ich glaube ich bin da komplett auf den Holzweg ohje
Sinngemäß wie hier: https://www.c64-wiki.de/wiki/Zeichen#Zeichenprogrammierung
Nur schreibenderweise.
öhhh...
ich bin schon über 10 Jahre raus...
SEI
LDA#34
STA 01
Verschieberoutine von $XXXX nach $D000
LDA#37
STA 01
CLI
RTS
ja soweit bin ich auch gekommen.
Nur ich raffe es einfach nicht wie ich die einzelnen Adressen so schalten muss das mir der Zeichensatz auch angezeigt wird der bei $d000 liegt.
Das mit der Bank verschieben vic sieht nur 16k und, und ,und....
Das will mir einfach nicht in den Schädel
ahso....
Dafür müsste ich nen Buch vom Boden kramen.
Denke bis ich das gefunden habe wird hier jemand schneller sein um dir das zu erklären.
Wenn nicht mach ich das gerne, musst dich aber paar Tage gedulden. Ich hab früher paar Digi-Demos so programmiert. Zumindest mit Zeichensatz in dem Bereich und Code ab $E000 oder so.
Zu lange her
Müsste Buch gucken...
wie ich die einzelnen Adressen so schalten muss das mir der Zeichensatz auch angezeigt wird der bei $d000 liegt. Das mit der Bank verschieben
Bringt dich diese Auflistung weiter?
ja soweit bin ich auch gekommen.
Nur ich raffe es einfach nicht wie ich die einzelnen Adressen so schalten muss das mir der Zeichensatz auch angezeigt wird der bei $d000 liegt.
Das mit der Bank verschieben vic sieht nur 16k und, und ,und....
Das will mir einfach nicht in den Schädel
Dann probier mal, ob Du so ein Gefühl dafür bekommst:
For I = 0 to 255: Poke 53272,I: Poke198,0: Wait 198,1: Next: Poke 53272,20
Per Space-Taste kannst Du zusehen, wie da Zeichensatz- und Bildschirmspeicher durchgeschaltet werden. Die unteren 4 Bits schalten den Zeichensatz durch, die oberen 4 Bits den Bildschirmspeicher.
Dann gehe in einen Monitor f 3c00 4000 aa, und dann wiederhole das Ganze.
Der 16. Bildschirmspeicher (#15) ist nun einheitlich gefüllt, und der 8. Zeichensatz (#7) zeigt ein Streifenmuster.
Damit kannst Du zumindest die unterste 16K-Bank (von $0000 bis §3fff) durchschalten.
Zusammen mit der Beschreibung des Registers 53272 sollte das ein Gefühl geben, wie die Werte berechnet werden.
Bildschirmadressen müssen durch 1024 teilbar sein, Zeichensatzadressen durch 2048.
Bildschirm ab 8192 ($2000)? 8192/1024=8
Zeichensatz ab 2048 ($0800)? 2048/1024=2
Die 8 und die 2 binär geschrieben: 1000 0010 (=130 dezimal). Und das kommt in das Register.
Für die anderen 16K-Bänke muss zusätzlich 56576 beschrieben werden.
3= Bank 0 ($0000), 2= Bank 1 ($4000), 1 = Bank 2 ($8000), 0 = Bank 3 ($c000)
Die Rechnung ist die Gleiche, die Adresse der Bank muss halt abgezogen werden.
Zeichensatz $d000:
1) $d000-$c000=$1000
2) $1000 / 1024 = 4
Bildschirm muss auch noch irgendwo zwischen $c000 und $ffff liegen.
Neue Frage:
Ich habe den Bildschirmspeicher auf $cc00 (Vic bank3) und ein Sprites auf $d000, wie lautet dann der Pointer für das Sprite?
Die Rechnung geht wie folgt:
(Adresse_des_Sprites - Adresse_der_VIC-Bank) / 64 = Wert für den Pointer
Also konkret:
$d000 - $c000 = $1000 (4096 dez)
$1000 / 64 = 64 = Wert für den Pointer
Die Pointer selbst befinden sich - wie immer - am Ende des Bildschirmspeichers.
Die Pointer sind im Teil des screens der nicht angeziegt wird, also nach 40x25=1000 bytes und zwar direkt am Ende:
plus $03F8-$03FF.
Der Pointer ist in Einheiten von 64 Bytes IN DER VIDEO BANK angeben (auch wenn 1 Sprite nur 63 Byte Daten hat).
Liegt Deine VIC Bank bei $c000 (wovon man hier dann doch ausgehen kann) ist der Pointer
($d000-$c000)/$40 = $1000/$40 = $40 (was man im Kopf erkennt weil 64*64=4096 sind)
Edit:
UPS, Klar, Danke MJ
plus $07F8-$07FF
Du meintest "plus $03f8-$03ff".
also $cc00+07f8 = $d3f8
lda #$40
sta $d3f8
richtig so?
Nicht richtig so!
Zitat von M.JDu meintest "plus $03f8-$03ff".
So ist`s richtig
Bis auf den Fehler um $400 richtig (siehe oben).
Wenn Du es korrigierst spielt es keine Rolle, bei Schreibzugriff nach I/O unter $dxxx musst Du ansonsten das setup von $01 beachten.
Ja, danke für den Tip!
Hat jetzt alles soweit geklappt wie ich es wollte