- grüß Euch,
ich habe versucht in BASIC einen eigenen Zeichensatz zu erstellen.Ich habe das mit READA$ versucht.
Im DATA Abschnitt steht dann so etwas:
300 DATA "...##..."
310 DATA "..####--"
320 DATA ".##..##."
330 DATA ".##..##."
340 DATA ".######."
350 DATA ".##..##."
360 DATA ".##..##."
370 DATA "........"über
IF MID$(A$,K+1,1) ="#" then byte=byte+2^K
werden die Rauten in Zahlen umgewandelt.
Alle Zeichen sind jedoch spiegelverkehrt. Kann sich jemand denken warum ?
Hatte keine Fehlermeldung. Zeichensatz startet bei $3800
Mit POKE53272,30 lässt er sich darstellen. Nur Seitenverkehrt - seltsam.
Hallo Besucher, der Thread wurde 2,9k mal aufgerufen und enthält 16 Antworten
letzter Beitrag von Strider am
Eigener Zeichensatz
- Strider
- Erledigt
-
-
IF MID$(A$,K+1,1) ="#" then byte=byte+2^K
K zählt sicherlich mit 1 los, oder? Der Wert 1 (nicht die Position 1) ist der ganz rechts. 2 hoch K kommt dann zu einem inversen Ergebnis.
Arndt
-
8-K statt K+1 beim MID$
-
FOR I= 0 TO 7
READ A$
BYTE=0
FOR K = 0 TO 7
IF MID$(A$,K+1,1) ="#" then byte=byte+2^K
NEXT K
POKE 14336+I+C*8,BYTE
NEXT I
POKE 53272,30So steht es im Listing.
-
Vielen Dank.
Stimmt habe das K+1 in 8-k geändert und schon ist alles richtig.
Yeah. Das ging schnell.
-
Dir ist schon klar, dass das maximal langsam ist?
Auf dem C64 empfiehlt es sich immer, so viel wie möglich vorzuberechnen. Rechnungen zur Laufzeit, die sowieso immer das gleiche Ergebnis haben, sind Verschwendung wertvoller Rechenzeit. Der Rechner ist einfach vergleichsweise langsam, und der BASIC-Interpreter ist nochmal ganz besonders langsam -- das beste was man in BASIC (ohne Maschinencode-Tricks) machen kann, ist zumindest die fertigen Byte-Werte in DATA-Zeilen packen und direkt POKEn
-
ganz zu schweigen vom platzverbrauch, gebe ich zrs1 vollkommenrecht.
64bytes vs ~24bytes pro char.
-
64bytes vs 8bytes pro char.
Nitpick: Die Rechnung stimmt in beiden Fällen nicht -- die Relation aber schon, also passt die Aussage qualitativ
Der hier gezeigte Code braucht 8 mal [8 (die "bits") + 3 (token und quotes) + 5 (overhead pro BASIC Zeile)], also ganze 128 Bytes für ein einziges Zeichen.
Mit vorberechneten DATA Werten dürfte man im Mittel mit 3,6*8 (für die Zahlen und Kommas) + 3 (token und platz für die BASIC-Zeile, bei zwei Zeichen pro Zeile) = gut 30 Bytes für ein Zeichen rechnen.Also ja, Platzverschwendung ist es auch. 8 Bytes pro Zeichen ginge aber nur, wenn die Daten direkt binär vorliegen und nicht in BASIC-Zeilen codiert.
-
wollte das nur deulich machen was man damit verschwendet, deine rechnung ist natuerlich praezieser.
unterschreib ich einfach mal -
Ich habe das Listing nun geändert und daraus einen kleinen Char Editor gemacht und aus dem Rest des
Programms die Empfehlung wahr genommen den Zeichensatz über Zahlenwerte (DATA 24,24,126,126,24,24,24,24)
einzulesen.Spart wirklich Zeit.
Im folgenden Listing setze ich die Bits als Raute und das Programm gibt mir die DATA Werte die ich mir notiere ohne selber rechnen zu müssen.
Jene Werte trage ich dann ins Programm ein.100 REM **RASTER**
110 DATA "...##..."
120 DATA "...##..."
130 DATA ".######."
140 DATA ".######."
150 DATA "...##..."
160 DATA "...##..."
170 DATA "...##..."
180 DATA "...##..."
190 REM **********
200 RESTORE:CLR:PRINTCHR$(147)
210 PRINTTAB(20)"{DOWN 8x}"
220 REM **** SCHLEIFE BYTE ****
230 FOR I = 0 TO 7:READA$
240 REM **** SCHLEIFE BIT ****
250 FOR K = 0 TO 7
260 REM **** ABFRAGE BIT ****
270 IFMID$(A$,8-K,1) = "#" THEN B=B+2^K
280 NEXT K
290 PRINTTAB(14)A$;:PRINT"{RIGHT}";:PRINTRIGHT$(STR$(b),3)
300 B=0:NEXTI -
Ich hab mal wieder eine Anfängerfrage.
Ich stelle gerade einen eigenen Zeichensatz für ein Spiel her.
Der Zeichensatz beginnt ab $3800Zunächst habe ich nach dem Einlesen der DATA Werte durch
einen ganz normalen PRINT Befehl die veränderten Zeichen
zur Kontrolle darstellen lassen.Nun wollte ich die Zeichen nicht mehr durch PRINT sondern durch die Schleife:
FOR Z = 0 TO 127
POKE 1024+Z,Z
NEXT Zdie Zeichen darstellen lassen.
Funktionierte natürlich nicht. Ich hatte gelesen das sich der Bildschirmspeicher
verändert wenn der Zeichensatz z.B.: ab $3800 beginnt.Laut C64-wiki soll der Befehl
POKE53272,(PEEK(53272)AND15) OR 224
https://www.c64-wiki.de/wiki/Bildschirmspeicher
Den Speicher verändern.
Aber am Screen passiert nach wie vor nichts.
Normalerweise müßte ich doch anstatt für:
POKE1024,1
dann mit
POKE14336,1
arbeiten, oder nicht ?
-
Laut C64-wiki soll der Befehl
POKE53272,(PEEK(53272)AND15) OR 224
c64-wiki.de/wiki/Bildschirmspeicher
Den Speicher verändern.
Aber am Screen passiert nach wie vor nichts.
Wenn man diesen POKE direkt nach dem Start eingibt, verändert sich der Screen durchaus. Evtl. funktioniert das in Deinem Programm deshalb nicht, weil direkt dahinter der POKE ausgeführt wird, welcher die Adresse des Zeichensatzes setzt - das ist ja exakt das gleiche Register, und wenn Du da POKE53272,{Konstante} statt der AND/OR-Gymnastik machst, wird die vorige Änderung überschrieben.
Wenn Du genau weißt, wo der Bildschirm und wo der Zeichensatz liegen soll, dann berechne den richtigen Wert für das Register und beschreib es mit einem Poke. -
Hier ist das Listing ohne DATA Abschnitt.
Vielleicht steht etwas darin was völlig falsch ist. -
Hat sich erledigt.
Ich hab das Listing etwas verändert:
FOR Z = 0 TO 127
POKE 1024+Z,Z:POKE55296+Z,15
NEXT ZUnd damit waren die Zeichen nun zu sehen.
-
Zeile 620 setzt den Zeichensatz-Zeiger auf Adresse $3800.
Zeile 630 setzt den Bildschirm-Zeiger auf Adresse $3800.
Willst Du da jetzt den Zeichensatz oder doch den Bildschirm plazieren?
Zeile 2110 setzt den Bildschirm zurück auf $0400 und den Zeichensatz auf $3800. -
Hi
Hier habe ich in Post 14 ein kleine Basicprogramm geschrieben wo man den Speicherbank 3 aktiviert.
Die kann man ganz leicht dann auf deine bedürfnisse anpassen.
Link zum Thema:
Laden eines externen PRG ZeichensatzesDabei ist auch ein kleine Anleidung wie man die richtigen Werte ermittelt in englischer Fassung.
So ich hoffe es hilft dir bei deinen Basicprogramm.Gruß
-
Danke für die Hinweise. Habe früher mal den C64 hauptsächlich in Basic programmiert und vieles vergessen und verstehe die Zusammenhänge nicht mehr so gut. Ich werde gleich nach der Arbeit mich ans Listing setzen und bearbeiten.