Це відео не доступне.
Перепрошуємо.
Welche Zeichenpositionierung ist die schnellste auf dem C64
Вставка
- Опубліковано 6 сер 2024
- Es steht ein neuer Benchmark an und zwar teste ich in diesem Video, welche der drei folgenden Möglichkeiten der Positionierung von Zeichen auf dem C64 Bildschirm am schnellsten sind:
- Direktes POKE in den Bildschirmspeicher
- Cursorpositionierung mittels POKE und Systemroutine
- PRINT mit Steuerzeichen
Dem ganzen liegt ein X/Y Koordinatensystem zu Grunde, ich werden im Laufe des Videos aber auch andere Möglichkeiten testen.
Viel Spaß!
===== Supporte mich und meinen Kanal!
Kanalmitgliedschaft: / @c64
Meine Kaffeekasse: streamelements.com/n3rdroom/tip
Der N3rdroom Shop: shop.n3rdroom.de
===== Inhalt dieses Videos
0:00 Möglichkeiten der Positionierung von Zeichen
0:31 Direktes Poken in den Bildschirmspeicher
2:22 Cursorpositionierung mit POKE und SYS58732
5:48 PRINT mit Cursor Steuerzeichen
9:17 Verschiedene Varianten und Optimierungen
viel Spaß!
===== Links zu weiteren Inhalten
Web: www.n3rdroom.de
Discord: / discord
Twitch: twitch.n3rdroom.de
Instagram: / n3rdroom
TikTok: / n3rdroom
Facebook: / n3rdroom
#C64 #Commodore #C64Studio #Commodore64 #programmieren
6:40 Ich habe hier einen Fehler gemacht und ein Steuerzeichen für die X-Positionierung zu wenig in den String gepackt. Das führt später zu dem Ausgabefehler... 😅🙈
Die PRINT-Version kannst du effizienter gestalten:
1. Das Home-Zeichen muss natürlich das erste Zeichen der PX$-Zeichenkette sein, heißt natürlich auch, dass die erste Spalte dann 1 ist.
2. Mehrere Ausgaben in einer einzelnen PRINT-Anweisungen sollten nicht durch unnötige Zeichen wie + oder ; verlangsamt werden, direkt hintereinander schreiben.
3. Das letzte Zeichen einer PRINT-Anweisung sollte ein ; sein, sonst wird noch eine Zeilenumbruch ausgeführt, was Zeit benötigt.
4. Spar dir PX$ sondern nutze TAB(X) zur direkten Positionierung
Resultat: 49 Jiffys bei 60 Durchgängen und x=15, y=6 statt deinen 70. PRINTLEFT$(PY$,Y)TAB(X)"B"; und PY$="{home}.."
Beim Poken in den Bildschirmspeicher musst du natürlich noch berücksichtigen, dass du die Zeit verdoppelst, wenn du auch die Farbe setzen musst, außerdem bist du auf ein einzelnes Zeichen beschränkt.
Du kannst kein Zeichen an die letzte Bildschirmposition printen, da dann ein automastischer Zeilenvorschub stattfindet.
PRINT Ausgabe in C64 BASIC optimieren #c64 #retro #programmieren
Basic auf dem C64. hab ich ja schon ewig nicht mehr gesehen.
Und jetzt das ganze mal in Assembler.
Wenn du hinter den Printbefehl in Zeile 320 und Zeile 420 ein ";" packst, so müsste dies schneller gehen, weil der Basic-Interpreter dann kein "Enter" auführen muss.
Wirklich schneller scheint es so nicht zu laufen, ich nehme an, weil der Interpreter dann das ; als zusätzliches Zeichen interpretieren muss. 🤔
ua-cam.com/users/shortshU2L07fcgUw
Mutmaßlich noch schneller geht es, wenn man die Bildschirmadresse gleich in Assembler ausrechnet. Ich hab das mal in SMON gemacht. Die Syntax lautet: SYS 49152, X, Y, CODE
Da man im Assembler nicht direkt die Y-Koordinate mit 40 multiplizieren kann rechne ich stattdessen die Bildschirmposition so aus: P = 32*Y + 8*Y + X + 1024
Quellcode:
jsr aefd ; Komma einlesen
jsr b79e ; Bytewert einlesen (steht im X-Register)
stx fb ; X-Koordinate zwischenspeichern
; Bildschirmposition berechnen
jsr aefd
jsr b79e ; Y-Koordinate einlesen
lda #00
sta fd
txa
asl
asl
asl
tay ; Y-Koordinate * 2 * 2 * 2 im Y-Register sichern
asl
rol fd ; etwaigen Übertrag im High-Byte sichern
asl
rol fd
sta fc ; FC/FD hat nun das Ergebnis aus Y-Koordinate * 32
tya ; Vorherige Sicherung zurückholen ...
clc
adc fc ; ... und aufaddieren
sta fc
lda fd
adc #04 ; 1024 aufaddieren
sta fd
jsr aefd
jsr b79e ; Bildschirmcode einlesen
txa
ldy fb ; X-Koordinate wieder auslesen
sta (fc),y ; Code in den Bildschirm schreiben
rts
Ein klein wenig schneller kriegt man es so hin (man spart damit den Overhead des SYS Befehls):
POKECY,Y:PRINT:POKECX,X:PRINT"A";
Ich war aber noch erstaunt, wie langsam die TAB() Funktion ist. Der zusätzliche Poke ist schneller als ein PRINTTAB(X)"A";
So ein kleines Kindheitstrauma von mir: mich würde interessieren, wie man das richtige Timing für left/right borderless hinbekommt.
Oben/Unten ist durch den vertical blanking IRQ ja recht simpel gewesen, aber ich habe mich damals sehr schwer getan, den Rand links und rechts zu entfernen.
Klar - habe ich heute den Assembler Code nicht mehr zur Hand, kann mich aber gut erinnern wie ich versucht habe, das Timing mit einer Anzahl NOP's zu treffen.
Das funktionierte in meinem Fall leider nur teilweise und fransig. Stellenweise war der Rand weg, stellenweise nicht.
Vielleicht hat hier jemand einen Source oder einen kleinen Technik-Guide wie der Trick funktioniert - damit ich heute mit dem Thema abschließen kann xD ;)
Da kann ich Dir leider nicht weiterhelfen, bin was solche Techniken angeht ein totaler Anfänger. 😅
integer variablen verwenden, also cx%, cy% und cp%, usw, dann fällt die fließkomma wandlung zur laufzeit weg
Aber nur wenn man sie als Feldvariable nutzt. Ob das dann aber unbedingt noch schneller wäre müsste man mal testen. Ich hab mal in einer Schleife Integer Variablen getestet. Das lief sogar unterm Strich langsamer, da das % Zeichen mit interpretiert werden musste. 🤔
@@C64 next try: anfangsvektor der feldvariablen auf 1024 setzen und das indexing für dich arbeiten lassen