Hallo, guten Tag.
Weil die Handhabung der Pixelgrafik für mich zu schwer ist möchte ich es mit ASCII-Zeichen versuchen in Mode 1.
Es wäre nett wenn du mir bitte die ersten Schritte beibringen könntest.
Ich möchte ASCII-Zeichen zb. mit 4 Tasten bewegen W/S/Q/E in Mode 1. Die Bewegung der ASCII soll im Hintergrund sein und dann nach vorne bringen.
Also ein Grafikbild in den Hintergrund laden ( das kann ich).
Auf diesen Grafikbild die ASCII bringen und dann alles nach vorne zum anschauen.
Die Einfärbung der ASCII in Mode 1 ist mir nicht so bekannt.
Wie werden neue ASCII-Zeichen erstellt für Mode 1.
Wo kann man die Zeichen Speichern bitte.
Dnke.
Zum Erstellen und Speichern neuer Zeichensätze empfehle ich FutureTex (http://futureos.cpc-live.com/files/FutureTex.zip), den Text-Editor für FutureOS. Der Zeichensatz-Teil ist 100% fertiggestellt (bin aber für Ideen und Anregungen offen). Damit kannst Du alle 256 Zeichen eines Zeichensatzes beliebig verändern.
Hier ein Video findet man auf meinem Youtube-Kanal 'realTFM'. Es ist der 4. Video der Playlists 'FutureTex'. Leider habe ich Probleme hier den Link zu posten.
Bei der Zeichenausgabe in MODE 1 gibt es drei Punkte zu beachten:
1. Für jede PEN gibt es eine eigene Text-Ausgabe-Funktion. Allerdings kann er PEN durch Steuerzeichen gewechselt werden.
Hier einige der OS Funktionen zur Zeichenausgabe:
TER_GB EQU &CDF6 / Ausgabe von Text mit Beachtung von Steuerzeichen!
TER_BB EQU &CD4C / PEN 2
TER_GG EQU &CE80 / PEN 1
TER_RR EQU &CF2A / PEN 3
STR_GB EQU &CAC6 / Ausgabe von Text, alle 256 Zeichen werden dargestellt
STR_BB EQU &CA1C / PEN 2
STR_GG EQU &CB50 / PEN 1
STR_RR EQU &CBFA / PEN 3
PRI0GB EQU &C73B / Ausgabe eines einzelnen Zeichens in PEN 1/2 Mischfarbe
PRI0BB EQU &C7B3 / PEN 2
PRI0GG EQU &C84B / PEN 1
PRI0RR EQU &C8E3 / PEN 3
Genaueres bitte der Dokumentation entnehmen!
2. Mit den Steuerzeichen kann man so einiges anfangen. Da lohnt es sich im Handbuch unter 'Funktionen der Steuerzeichen in Mode 1' nachzulesen. Steuerzeichen sind für folgendes gut: Cursorpositon setzen, Bildschirm löschen, PEN wechsel, den RAM oder ROM Zeichensatz (ab &3800, bis &3FFF) selektieren, Zeichenketten (horizontal oder vertikal) ausgeben etc.
3. Den PENs Farbe zuzuweisen geschieht wie üblich durch einen simplen OUT Befehl. Z.B. LD BC,&7F54 : OUT (C),C
Hallo vielen Dank für die Hilfe.
Werde mich damit beschäftigen.
Danke.
Wenn Du tatsächlich mit FutureTex einen eigenen Zeichensatz erstellst, dann kannst Du den für eigene Programme nutzen. Dazu lädst Du den Zeichensatz an Adresse &3800.
Dazu kannst Du die Routine zum Bilder-Landen nach &C000 umbauen. Start-Adresse von &C000 auf &3800 verlegen. Bei Problemen kann ich hier auch eine Zeichensatz-Lade-Routine einstellen, sind nur ein paar Zeilen.
Hallo danke für die Hilfe.
Ich möchte einen Zeichensatz vom C64 laden der hat 4096 Byte , char.bin
Wievel Platz ist denn bitte im ZeichenGenerator ?
Danke.
Also der Zeichensatz liegt beim CPC von &3800 bis &3FFF im unteren ROM - oder eben im RAM.
Das sind 2 KB, also 2048 Bytes, denn jedes Zeichen hat 8 Bytes (8x8 Punkt Matrix).
Wenn der c64 Zeichensatz 4096 Bytes hat, dann könnte da noch was anderes drin sein. Vielleicht ist auch die Datei einfach so lang. Du kannst es trotzdem mal probieren mit FutureTex zu laden. Sollte funktionieren.
Mit FutureTex kannst Du den c64 Zeichensatz laden. Ungewünschte Zeichen kannst Du beim Menüpunkt 'Zeichensatz <e>ditieren' mit Taste e (rEstore) aus dem ROM in den RAM Zeichensatz kopieren.
Wenn es nicht klappt, dann häng die Datei hier ins Forum, werde versuchen sie dann umzuwandeln - für CPC.
Das ist beim C64 normal.
Er hat 2 Zeichensätze.
Ich jann auch diese trennen mit je 2048 Byte.
Danke.
Ah, interessant. Klar, da kann man beide Zeichensätze verwenden. (Natürlich immer nur einen zu einer Zeit).
p.s.: FutureTex läd alles bis zu 4 KB und nimmt die ersten 2 KB als Zeichensatz.
EDIT: Hab mir die zwei c64 Zeichensätze mal angesehen, also die Hälfte ist 'normal', die andere Hälfte ist 'invertiert'. Am Ende sind es auch 256 Zeichen - und das ganze dann nochmals invertiert.
Beim CPC kann man ja die Zeichen sowieso invertieren. :smiley027: Deshalb reicht auch ein Zeichensatz. :)
Eigenen Zeichensatz einschalten = Unteres RAM einschalten (siehe OS-LIB)
Zeichensatz laden, geht wie Bild laden, nur die Zieladresse muss auf &3800 gesetzt werden.
Ich habe auf 8 Buchstaben erweitert mit "0" dahinter.
LBI DB &00,"CPC-DEU0CS8" ;User-Nummer + Name + Extension
Die CS8 werden nicht geladen im eigenen Program.
CPC-DEU0.CS8
Kannst du bitte das Format umwandeln in ein lauffähiges Format?
--------------------
LD A,(REG_PC+1) ;A = Quell-Medium von dem das Hauptprogramm gestartet wurde
ld a,0 ;In diesem Beispiel wird das Medium = Laufwerk A gesetzt #########
;Im fertigen Programm muss diese Zeile ^ entfernt werden #########
LD (MEDIUM),A ;Sichere Quell-Medium A..O (0-14) des zu ladenden Bildes
LD DE,LBI ;Zeiger auf Namen des Bildes
CALL LABI ;Bild laden
LBI DB &00,"CPC-DEU0CS8" ;User-Nummer + Name + Extension
MEDIUM DB &00
LABI
LD A,&02
LD (REG08_4),A ;Laden in Hauptspeicher
LD HL,&3800
LD (REG16_3),HL ;Ziel-Adresse &3800 = Video RAM
LD A,(MEDIUM) ;Quell-Medium
LD IX,LADE_N
CALL ROM_A2C ;Lade Bild
INC A
JR NZ,LB_ERR ;A<>&FF --> Fehler beim Laden!
LD BC,&FA7E
LD A,(MO_ST)
OUT (C),A ;Laufwerks-Motoren ausschalten
LD A,&FF
RET ;A = &FF --> Bild wurde erfolgreich geladen!
;Fehler beim Laden
LB_ERR
LD BC,&FA7E
LD A,(MO_ST)
OUT (C),A
XOR A
RET
Wie kann ich bitte meinen eigenen Zeichensatz ascii.bin
umstellen in ein ladefähige Datei damit diese bitte geladen wird.
Danke.
Du kannst die Datei direkt laden, da muss nichts umgestellt werden.
Nimm einfach den Code um ein Bild an &C000 zu laden und ändere die Zieladresse von &C000 auf &3800.
Wenn Du einen Text ausgibst, dann bitte am Anfang das Steuerzeichen &01 nutzen, das stellt auf RAM Zeichensatz um.
Der Text könnte das so aussehen:
DB &01,"Bespieltext mir RAM Zeichen",&00
Das &00 Byte am Textende ist die Endmarkierung
Hallo, danke für die Hilfe.
Es kommt keine Fehlermeldung beim laden.
Der Text erscheint nicht auf den Screen im Mode 1
----------------------------------
ORG &8000
; mode 1
LD A,(RAMCHAR)
SET 0,A
RES 1,A
LD (RAMCHAR),A
LD B,&7F
OUT (C),A
LD A,(REG_PC+1) ;A = Quell-Medium von dem das Hauptprogramm gestartet wurde
ld a,0 ;In diesem Beispiel wird das Medium = Laufwerk A gesetzt #########
LD (MEDIUM),A ;Sichere Quell-Medium A..O (0-14) des zu ladenden Bildes
LD IX,LESC
CALL ROM_A2C
LD HL,S80X25
CALL ROM_A
LD BC,&7F02 ;INK 2
OUT (C),C
LD A,&4a
OUT (C),A
LD (INK_2),A ;INK 2 color &40-&5F
call ramchar
LD A,(REG_PC+1) ;A = Quell-Medium von dem das Hauptprogramm gestartet wurde
ld a,0 ;In diesem Beispiel wird das Medium = Laufwerk A gesetzt #########
;Im fertigen Programm muss diese Zeile ^ entfernt werden #########
LD (MEDIUM),A ;Sichere Quell-Medium A..O (0-14) des zu ladenden Bildes
LD DE,LBI ;Zeiger auf Namen
CALL LABI
LD HL,10 * 80 + &C000-1+10
LD (C_POS),HL
LD BC,8
LD HL,TXT ;Pointer to text, that shall be shown on screen
CALL STR_BB ;PRINT text on screen
LD HL,WATA
CALL ROM_C ;Auf Tastendruck warten
LD HL,TUR_E
JP ROM_D ;Ins Desktop zurück springen
;Text
TXT DB &01,"Beispieltext mit RAM Zeichen",&00
LBI DB &00,"CPC-DEUCS8" ;User-Nummer + Name + Extension
MEDIUM DB &00
LABI
LD A,&02
LD (REG08_4),A ;Laden in Hauptspeicher
LD HL,&3800
LD (REG16_3),HL ;Ziel-Adresse &3800 = Video RAM
LD A,(MEDIUM) ;Quell-Medium
LD IX,LADE_N
CALL ROM_A2C ;Lade Bild
INC A
JR NZ,LB_ERR ;A<>&FF --> Fehler beim Laden!
LD BC,&FA7E
LD A,(MO_ST)
OUT (C),A ;Laufwerks-Motoren ausschalten
LD A,&FF
RET ;A = &FF --> Bild wurde erfolgreich geladen!
;Fehler beim Laden
LB_ERR
LD BC,&FA7E
LD A,(MO_ST)
OUT (C),A
XOR A
RET
;Switch ROM char set on = lower RAM on
romchar:
LD A,(RAMCHAR) ;actual RAM/ROM state
RES 2,A
LD (RAMCHAR),A ;set L-RAM on
LD B,&7F
OUT (C),A
ret
;Switch ROM char set off = lower ROM off
ramchar:
LD A,(RAMCHAR) ;actual RAM/ROM state
SET 2,A
LD (RAMCHAR),A ;set L-ROM off
LD B,&7F
OUT (C),A
ret
AKT_RAM EQU &B84C
F_MOVE EQU &C0C8
LADE_N EQU &FD5C
REG_PC EQU &B8DA ;RAM
REG08_4 EQU &B8E0
REG16_3 EQU &B8EA
MO_ST EQU &B97F
STR_BB EQU &CA1C
C_POS EQU &B848
WATA EQU &FD38
TUR_E EQU &FE9D
RAMCHAR EQU &B847
LESC EQU &C017
ROM_A2C EQU &FF2A
OSRON_A EQU &FF22
OSRON_B EQU &FF58
OSRON_C EQU &FF8E
OSRON_D EQU &FFD6
ROM_A EQU &FF00
ROM_C EQU &FF0C
ROM_D EQU &FF12
ROM_D2A EQU &FFBA
S64X32 EQU &D5A8
S80X25 EQU &D60E
BORDER EQU &BB91
INK_0 EQU &BB92
INK_1 EQU &BB93
INK_2 EQU &BB94
INK_3 EQU &BB95
TER_GB EQU &CDF6
TER_BB EQU &CD4C
TER_GG EQU &CE80
TER_RR EQU &CF2A
TERM_2 EQU &D48C
TERM_2D EQU &D2F7
TERM_2I EQU &D358
TERM_2K EQU &D3C0
TERM_2U EQU &D42
------------------------------
Hier habe ich mal 1024 Byte in den RAM geladen mit dem Wert $81.
Der Text erscheint als Wert $81 , also dieses funktioniert.
9 Buchstaben lasse ich ausgeben.
--------------------------------------------------
ORG &8000
; mode 1
LD A,(RAMCHAR)
SET 0,A
RES 1,A
LD (RAMCHAR),A
LD B,&7F
OUT (C),A
LD IX,LESC
CALL ROM_A2C
LD HL,S80X25
CALL ROM_A
LD BC,&7F02 ;INK 2
OUT (C),C
LD A,&4a
OUT (C),A
LD (INK_2),A ;INK 2 color &40-&5F
call ramchar
LD HL,10 * 80 + &C000-1+10
LD (C_POS),HL
LD BC,1024
LD D,&81
;1024 Bytes werden
;mit dem Byte &81 gefüllt.
LD HL,&3800 ;Füllen ab Adresse &3800
LD IX,F_FILL8
CALL ROM_A2C
LD BC,10
LD HL,TXT ;Pointer to text, that shall be shown on screen
CALL STR_BB ;PRINT text on screen
LD HL,WATA
CALL ROM_C ;Auf Tastendruck warten
LD HL,TUR_E
JP ROM_D ;Ins Desktop zurück springen
;Text
TXT DB &01,"Beispieltext mit RAM Zeichen",&00
;Switch ROM char set on = lower RAM on
romchar:
LD A,(RAMCHAR) ;actual RAM/ROM state
RES 2,A
LD (RAMCHAR),A ;set L-RAM on
LD B,&7F
OUT (C),A
ret
;Switch ROM char set off = lower ROM off
ramchar:
LD A,(RAMCHAR) ;actual RAM/ROM state
SET 2,A
LD (RAMCHAR),A ;set L-ROM off
LD B,&7F
OUT (C),A
ret
F_FILL8 EQU &C01E
F_FILL6 EQU &C01F
AKT_RAM EQU &B84C
F_MOVE EQU &C0C8
LADE_N EQU &FD5C
REG_PC EQU &B8DA ;RAM
REG08_4 EQU &B8E0
REG16_3 EQU &B8EA
MO_ST EQU &B97F
STR_BB EQU &CA1C
C_POS EQU &B848
WATA EQU &FD38
TUR_E EQU &FE9D
RAMCHAR EQU &B847
LESC EQU &C017
ROM_A2C EQU &FF2A
OSRON_A EQU &FF22
OSRON_B EQU &FF58
OSRON_C EQU &FF8E
OSRON_D EQU &FFD6
ROM_A EQU &FF00
ROM_C EQU &FF0C
ROM_D EQU &FF12
ROM_D2A EQU &FFBA
S64X32 EQU &D5A8
S80X25 EQU &D60E
BORDER EQU &BB91
INK_0 EQU &BB92
INK_1 EQU &BB93
INK_2 EQU &BB94
INK_3 EQU &BB95
TER_GB EQU &CDF6
TER_BB EQU &CD4C
TER_GG EQU &CE80
TER_RR EQU &CF2A
TERM_2 EQU &D48C
TERM_2D EQU &D2F7
TERM_2I EQU &D358
TERM_2K EQU &D3C0
TERM_2U EQU &D42
-------------------------------------
Hier ist der Zeichensatz ins RAM mit den Befehl : LD IX,INRZ
CALL ROM_A2C
Habe dann bis 528 Byte &ff aufgefüllt , das "A" erscheint dann nicht.
-------------------------------------
ORG &8000
; mode 1
LD A,(RAMCHAR)
SET 0,A
RES 1,A
LD (RAMCHAR),A
LD B,&7F
OUT (C),A
LD IX,LESC
CALL ROM_A2C
LD HL,S80X25
CALL ROM_A
LD BC,&7F02 ;INK 2
OUT (C),C
LD A,&4a
OUT (C),A
LD (INK_2),A ;INK 2 color &40-&5F
LD IX,INRZ
CALL ROM_A2C
call ramchar
LD HL,10 * 80 + &C000-1+10
LD (C_POS),HL
LD BC,528
LD D,&ff
;1024 Bytes werden
;mit dem Byte &ff gefüllt.
LD HL,&3800 ;Füllen ab Adresse &3800
LD IX,F_FILL8
CALL ROM_A2C
LD BC,7
LD HL,TXT ;Pointer to text, that shall be shown on screen
CALL STR_BB ;PRINT text on screen
LD HL,WATA
CALL ROM_C ;Auf Tastendruck warten
LD HL,TUR_E
JP ROM_D ;Ins Desktop zurück springen
;Text
TXT DB "ABCDEF",&00
;Switch ROM char set on = lower RAM on
romchar:
LD A,(RAMCHAR) ;actual RAM/ROM state
RES 2,A
LD (RAMCHAR),A ;set L-RAM on
LD B,&7F
OUT (C),A
ret
;Switch ROM char set off = lower ROM off
ramchar:
LD A,(RAMCHAR) ;actual RAM/ROM state
SET 2,A
LD (RAMCHAR),A ;set L-ROM off
LD B,&7F
OUT (C),A
ret
INRZ EQU &C9AD
F_FILL8 EQU &C01E
F_FILL6 EQU &C01F
AKT_RAM EQU &B84C
F_MOVE EQU &C0C8
LADE_N EQU &FD5C
REG_PC EQU &B8DA ;RAM
REG08_4 EQU &B8E0
REG16_3 EQU &B8EA
MO_ST EQU &B97F
STR_BB EQU &CA1C
C_POS EQU &B848
WATA EQU &FD38
TUR_E EQU &FE9D
RAMCHAR EQU &B847
LESC EQU &C017
ROM_A2C EQU &FF2A
OSRON_A EQU &FF22
OSRON_B EQU &FF58
OSRON_C EQU &FF8E
OSRON_D EQU &FFD6
ROM_A EQU &FF00
ROM_C EQU &FF0C
ROM_D EQU &FF12
ROM_D2A EQU &FFBA
S64X32 EQU &D5A8
S80X25 EQU &D60E
BORDER EQU &BB91
INK_0 EQU &BB92
INK_1 EQU &BB93
INK_2 EQU &BB94
INK_3 EQU &BB95
TER_GB EQU &CDF6
TER_BB EQU &CD4C
TER_GG EQU &CE80
TER_RR EQU &CF2A
TERM_2 EQU &D48C
TERM_2D EQU &D2F7
TERM_2I EQU &D358
TERM_2K EQU &D3C0
TERM_2U EQU &D42
--------------------------------
Diese Teste funktionieren Super.
Nur das Laden funktioniert nicht.
Bin mal kurz darüber geflogen, beim Laden fehlt - so weit ich sehe - der Zeiger auf den Dateinamen. Dann findet er die Zeichensatz-Datei nicht.
Danke , aber der Zeiger ist doch drin .
-------------------
LD DE,LBI ;Zeiger auf Namen
CALL LABI
LD HL,10 * 80 + &C000-1+10
LD (C_POS),HL
LD BC,8
LD HL,TXT ;Pointer to text, that shall be shown on screen
CALL STR_BB ;PRINT text on screen
LD HL,WATA
CALL ROM_C ;Auf Tastendruck warten
LD HL,TUR_E
JP ROM_D ;Ins Desktop zurück springen
;Text
TXT DB &01,"Beispieltext mit RAM Zeichen",&00
LBI DB &00,"CPC-DEUCS8" ;User-Nummer + Name + Extension
MEDIUM DB &00
............
.............
---------------------------
Danke.
Wenn ich nach den Kopf der SCR-Datei ($200) die 2048 Byte dran hänge , dann funktioniert es.
Danke
Hmmm... da kann ich jetzt nichts dazu sagen, denn ich kenne ja Deine Dateien nicht. Wenn es weiterhin Probleme geben sollte, dann bitte hier ins Forum das DSK mit Source und allen Dateien einstellen. Dann kann ich das da gleich anschauen und eventuell verbessern.
Falls die Zeichensatz-Datei selber keinen Header hat (also ohne Header gespeichert wurde), dann müsste man vor dem Laden mit LADE_N auch noch (AKT_RAM) auf &C0 setzen um beim Laden den Hauptspeicher einzublenden. Wobei das eh egal ist, wenn man nach &3800 läd.
P.S.: Da Du zur Zeichenausgabe die STR_xx Funktion nutzt und nicht die TER_xx Funktion werden Steuerzeichen als Zeichen ausgegeben. So it &01 am Textanfang nutzlos.
Du kannst ja mal TER_BB anstelle von STR_BB benutzen. Dann werden alle Steuerzeichen beachtet. Das ist auch gut für z.B. Cursor-Positionierung.
Danke für den Hinweis.
Damit funktionieren jetzt die Dateien.... :00008351: ohne das diese von mir geteilt werden müssen. Ich lade einfach die reinen char0001.bin ein mit 2048 Byte. Die Char sind vom C64.
CPCDiskXP.exe macht die Arbeit.
Danke.
Sehr schön! :smiley027: :jubelaola:
Weitere Zeichensätze (so ca. 20 Stück) lassen sich mit Omegasofts ZeichenInstallator II laden und aktivieren. Siehe Utilities Disc. Da ist auch der c64 Zeichensatz dabei (allerdings nur die ersten 128 Zeichen, wenn ich mich richtig erinnere).
Ja CPCDiskXP ist fein. Das nutze ich auch. Und manchmal das gute alte ManageDSK. Letzteres hat aber Fehler wenn die Dateilänge im Header = &0000 ist. Also CPCDiskXP ist nur zu empfehlen. :winke0002: