Welcome to Schneider / Amstrad CPC Forum. Please login or sign up.

16. April 2024, 22:10:48

Login with username, password and session length

Shoutbox

TFM

2024-04-08, 20:42:44
Happy Sonnenfinsternis!  :)

TFM

2024-01-15, 17:06:57
Momentan billige Farbbänder auf Ebay für PCW

Devilmarkus

2023-07-09, 10:37:40
Zweiter 👋😂🤣

TFM

2023-06-13, 14:21:49
Sommerloch!

TFM

2023-05-30, 17:00:20
Erster ;-)

Recent

Members
Stats
  • Total Posts: 11,691
  • Total Topics: 1,334
  • Online today: 189
  • Online ever: 1,724
  • (16. January 2020, 00:18:45)
Users Online
Users: 1
Guests: 136
Total: 137

136 Guests, 1 User
Rennert

Mit ASCII-Zeichen spielen im FutureOS im Mode 1.

Started by cpcman, 27. January 2024, 08:54:10

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

cpcman

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.

TFM

Zum Erstellen und Speichern neuer Zeichensätze empfehle ich FutureTex, 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
TFM of FutureSoft
http://www.futureos.de --> Das Betriebssystem FutureOS (Update: 20.12.2023)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 26.12.2021)

cpcman

Hallo vielen Dank für die Hilfe.

Werde mich damit beschäftigen.

Danke.

TFM

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.
TFM of FutureSoft
http://www.futureos.de --> Das Betriebssystem FutureOS (Update: 20.12.2023)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 26.12.2021)

cpcman

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.

TFM

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.
TFM of FutureSoft
http://www.futureos.de --> Das Betriebssystem FutureOS (Update: 20.12.2023)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 26.12.2021)

cpcman

Das ist beim C64 normal.
Er hat 2 Zeichensätze.

Ich jann auch diese trennen mit je 2048 Byte.

Danke.

TFM

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.  :)
TFM of FutureSoft
http://www.futureos.de --> Das Betriebssystem FutureOS (Update: 20.12.2023)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 26.12.2021)

TFM

Eigenen Zeichensatz einschalten = Unteres RAM einschalten (siehe OS-LIB)

Zeichensatz laden, geht wie Bild laden, nur die Zieladresse muss auf &3800 gesetzt werden.
TFM of FutureSoft
http://www.futureos.de --> Das Betriebssystem FutureOS (Update: 20.12.2023)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 26.12.2021)

cpcman

#9
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

cpcman

#10
Wie kann ich bitte meinen eigenen Zeichensatz ascii.bin
umstellen in ein ladefähige Datei damit diese bitte geladen wird.

Danke.

TFM

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
TFM of FutureSoft
http://www.futureos.de --> Das Betriebssystem FutureOS (Update: 20.12.2023)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 26.12.2021)

cpcman

#12
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.

TFM

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.
TFM of FutureSoft
http://www.futureos.de --> Das Betriebssystem FutureOS (Update: 20.12.2023)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 26.12.2021)

cpcman

#14
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.