Magic Disk 64

home to index to html: MD9004-KURSE-GRAFIKKURS_TEIL_5-3.html
MD9004-KURSE-GRAFIKKURS_TEIL_5-3.koala.png
           Grafikkurs Teil 3            
----------------------------------------
Sie sehen in dieser Grafik,  welche  der
Bitkombinationen  welche Speicherauftei-
lung bewirkt. Die 3 Zahlen jeweils unter
einer Konfiguration geben  die  Stellung
der  Bits 0-2 an, die Zahl dahinter, den
Dezimalwert, den man im  Normalfall  mit
dieser  Kombination in Adresse 1 schrei-
ben sollte. Verändern Sie die  Bits  von
3-7  bitte  nicht! Diese haben bestimmte
Funktionen, die den Prozessor zu anderen
Dingen  veranlassen.  Bei  Veränderungen
könnten  Sie  so den Rechner schnell zum
Absturz bringen! Ebenso verhält es  sich
mit  den Kombinationen, die ein Ausblen-
den des Betriebssystems oder des  BASIC-
ROMs  bewirken, da wir nämlich von BASIC
aus programmieren, braucht  der  Rechner
diese  beiden  Bereiche!  Wenn  Sie also
verschwinden "verläuft" sich der Rechner
im RAM darunter und stürzt ebenfalls ab!
Diese Kombinationen werden erst für  As-
semblerprogrammier    interessant,   und
selbst dann ist  Vorsicht  geboten  beim
Abschalten der ROMs.                    
Für uns ist lediglich die Bitkombination
"011" sinnvoll.  Durch  sie  können  wir
nämlich einfach den I/O-Bereich ausblen-
den, der dann durch das  Zeichensatz-ROM
ersetzt   wird.  Beim  Zugriff  auf  die
Adressen 53248-57344  bekommen  wir  nun
also  nicht mehr etwa die Werte von VIC,
SID     und     den     anderen     Ein-
/Ausgabebausteinen   geliefert,  sondern
die des  Zeichenssatz-ROMs.  Wir  können
nun  den  gesamten Bereich mittels einer
Schleife ins RAM kopieren,  wo  wir  ihn
dann verändern werden.                  
Hierzu  jedoch noch ein kleiner Hinweis,
denn so einfach wird es uns leider  doch
nicht  gemacht. Um wiederum einen mögli-
chen Absturz des Rechners zu  verhindern
müssen   wir   auch   noch  den  System-
Interrupt abschalten. Dies ist eine Ein-
richtung  des Betriebssystems, die unter
anderem macht, daß der  Cursor  auf  dem
Bildschirm  rumblinkt.  Das wiederum hat
etwas mit der Bildschirmausgabe zu  tun,
und die ist ja nun nicht mehr gewährlei-
stet,  da  der  Ein-Ausgabebereich   des
Speichers  ja  abgeschaltet ist. Der In-
terrupt (auch IRQ  genannt)  würde  also
versuchen  auf  die Register des VIC und
vor  allem   auf   Register   der   Ein-
/Ausgabebausteine    zuzugreifen,    die
natürlich nicht mehr da  sind.  Es  gäbe
ein  großes  Chaos  mit einem Rechnerab-
sturz zur Folge. Öber den Interrupt  an-
sich  möchte  ich  mich  hier allerdings
nicht auslassen, das soll Aufgabe meines
Assemblerkollegen  Ralf  Trabhardt  sein
(dessen  Kurs  Sie ja parallel zu diesem
hier auch mitmachen können),  ich  werde
mich  darauf  beschränken, Ihnen zu zei-
gen, wie man den IRQ ein- und  ausschal-
tet.  Dies geht wie immer über den POKE-
Befehl. Die entsprechenden Befehle  lau-
ten:                                    
POKE 56334,PEEK(56334) AND 254          
zum einschalten, und                    
POKE 56334,PEEK(56334) OR 1             
Nun also zu dem Programm, daß  den  Zei-
chensatz aus dem Zeichensatz-ROM ins RAM
von  8192-12288 kopiert. Ich habe es Ih-
nen  auch  als  BASIC-Programm  auf  der
Rückseite  dieser  MD  unter  dem  Namen
"COPYCHARSET" abgespeichert:            
10 POKE 56334,PEEK(56334) AND 254:REM   
   IRQ AUSSCHALTEN                      
20 POKE 1,51:REM ZEICHENSATZ EINBLENDEN 
30 FOR I=0 4095                         
40 POKE 8192+I,PEEK(53248+I)            
50 NEXT                                 
60 POKE 1,55:REM I/O WIEDER EINBLENDEN  
70 POKE 56334,PEEK(56334) OR 1:REM IRQ  
   WIEDER EINSCHALTEN                   
Lassen Sie das Programm doch einmal lau-
fen, nach einiger  (sogar  sehr  langer)
Zeit  meldet  sich  der  64er wieder mit
"READY."  zurück,  und  der  Zeichensatz
steht  im  RAM.  Damit Sie nicht solange
warten müssen,  bis  die  Kopierschleife
durchlaufen  ist,  habe  ich  Ihnen auch
noch die Assemblerversion von "COPYCHAR-
SET"  auf der Rückseite unter "COPYCHAR-
SET.ASM" gespeichert. Öbrigens auch  ein
schöner  Vergleich  zwischen  BASIC  und
Assembler - der Zeichensatz ist mit  dem
zweiten  Programm nämlich in nur wenigen
Sekundenbruchteilen  umkopiert,  anstatt
in   wenigen  Minuten,  mit  der  BASIC-
Version! Haben Sie übrigens keine Angst,
wenn Sie das  BASIC-Programm  nicht  mit
RUN-STOP abbrechen können. Der IRQ fragt
nämlich auch ab, ob diese Taste gedrückt
wurde  und  läßt in diesem Fall ein Pro-
gramm abbrechen -  so  hat  es  den  an-
schein,  als  würde  der Rechner "schla-
fen". Da wir den IRQ jedoch abgeschaltet
haben, kann das Programm folglich  nicht
mehr  gestoppt werden, bis es abgelaufen
ist.                                    
So. Kommen wir nun, nachdem der Zeichen-
satz endlich  im  RAM  liegt  zu  dessen
Veränderung.                            
Ein Zeichen, so wie Sie es auf dem Bild-
schirm   sehen  können,  ist  aus  einer
Punktmatrix  von  8x8-Pixeln  aufgebaut.
Diese werden durch 8 aufeinanderfolgende
Bytes zu je 8 Bit repräsentiert (wie das
vor  sich  geht sollten Sie nun ja mitt-
lerweile wissen). In unserem Fall belegt
das erste Zeichen des Zeichensatzes  die
Bytes  8192  bis  8199.  Die Daten eines
neuen  Zeichens  müssen  also  lediglich
dort  ins  RAM  geschrieben  werden, und
schon haben wir ein anderes Zeichen ans-
telle  des alten auf dem Bildschirm ste-
hen. Das heißt noch nicht ganz, denn wir
müssen dem VIC ja erst  noch  mitteilen,
daß  er  sich die Zeichendaten jetzt aus
einem  anderen   Speicherbereich   holen
soll,  als aus dem Zeichensatz-ROM. Dies
geht wieder über eines der VIC-Register,
genauer gesagt  über  Register  24.  Die
Bits  0-3  dieses  Registers steuern die
Lage des Zeichensatzes, derer es 4  ver-
schiedene  Möglichkeiten gibt. Hier ein-
mal eine Tabelle:                       
Adressbereich Bitmuster Wert(dez.)      
----------------------------------      
    0- 4095     0001      01            
 4096- 8191     0101      05            
 8192-12287     1001      09            
12288-16383     1101      13            
Für uns ist also der dritte Eintrag die-
ser  Liste von Bedeutung, denn er adres-
siert den Bereich, in  dem  wir  unseren
neuen Zeichensatz abgelegt haben. Setzen
wir also die unteren vier Bits von Regi-
ster 24 einmal auf "1001":              
POKE V+24,PEEK(V+24) AND 240 OR 9       
Somit wäre also der Zeichensatzgenerator
des  VIC  auf  den  neuen Bereich einge-
stellt. Ich  werde  Ihnen  nachher  noch
einige   Sonderheiten  dieses  Registers
erklären, behalten Sie es also im Auge! 
Nun jedoch endlich zu der  langersehnten
Zeichenveränderung.  Das  erste  Zeichen
des neuen Zeichensatzes ist der  Klamme-
raffe " ". Schreiben Sie doch einmal ein
solches  Zeichen  irgendwo auf den Bild-
schirm. Jetzt fahren Sie mit dem  Cursor
an  eine  Stelle,  die noch frei ist und
schreiben mittels POKE den Wert  255  in
Speicherzelle 8192, also:               
POKE 8192,255                           
Sie werden jetzt sehen, daß unser  Klam-
meraffe  oben deutlich abgeflacht wurde.
Verändern Sie auch noch das nächste  By-
te,  so wird er sich immer mehr entstel-
len. Probieren Sie  was  sich  so  alles
damit  anstellen  läßt.  Sie  wissen  ja
mittlerweile, daß jeweils ein Bit  einer
Speicherstelle einen Punkt in einer Zei-
le des Zeichens darstellt.  Pro  Zeichen
haben  Sie acht Bytes zur Verfügung, die
das Aussehen dieses  Zeichens  erheblich
verändern können. Das zweite Zeichen des
Zeichensatzes ist übrigens das "A", wenn
Sie  also  die  Speicherstellen von 8200
bis 8207 verändern, so werden  Sie  alle
"A"s  auf  dem  Bildschirm in ihrer Form
verändern und so fort. Sie sehen, so ist
es leicht  möglich,  andere  Zeichen  zu
erzeugen, und so entstehen auch die Zei-
chensätze, wie sie in manchen  Spielen, 
oder  in  einem  der  zahlreichen  Demo-
Creator-Programme der MagicDisk  vorhan-
den sind.                               
Nun noch ein wenig über den Aufbau eines
Zeichensatzes. Die Zeichen  ansich,  256
an der Zahl, sind 8-Byte-Weise hinterei-
nander im Speicher abgelegt. Das  wissen
wir  ja schon. Da ein Zeichen 8 Byte be-
legt, müßte ein Zeichensatz  also  8*256
Bytes  lang sein, das sind insgesamt al-
lerdings 2048 Bytes und nicht 4096,  wie
ich  vorhin  erwähnte (und soviele Daten
haben wir ja auch  umkopiert).  Wie  Sie
merken  ist  4096 genau das doppelte von
2048. Die Erklärung dafür, daß der  Zei-
chensatz  länger  ist  als er eigentlich
sein sollte, liegt darin, daß ein er  in
der Form, in der er auch im Zeichensatz-
ROM vorliegt eigentlich  aus  ZWEI  Zei-
chensätzen  besteht.  Nämlich dem "Groß-
schrift"-und     dem     "Kleinschrift"-
Zeichensatz.  Normalerweise schalten Sie
zwischen diesen beiden Zeichensätzen mit
der Tastenkombination  "SHIFT-COMMODORE"
hin und her. Hierbei können Sie entweder
mit  Großen Buchstaben und Grafikzeichen
schreiben, oder mit kleinen  und  großen
Buchstaben und dafür mit einigen Grafik-
zeichen weniger. Probieren Sie es einmal
aus: wenn Sie einige  Grafikzeichen  mit
der    SHIFT-Buchstabentaste-Kombination
auf den Bildschirm bringen und dann  auf
Kleinschrift   umschalten  ("SHIFT/C="),
dann verwandeln sich  die  Grafikzeichen
in  Großbuchstaben und umgekeht. Demnach
reichen also 2096 Bytes für einen sicht-
baren Zeichensatz aus!                  
Soviel  hierzu.  Jetzt  noch ein Wort zu
der Lage von bestimmten  Zeichen  inner-
halb   eines  Zeichensatzes.  Zu  diesem
Zweck habe ich Ihnen ein  weiteres  Pro-
gramm  unter dem Namen "CHARLOC" auf der
Rückseite der MD gespeichert.  Es  zeigt
Ihnen an, wo ein Zeichen im  Zeichensatz
angesiedelt  ist, und wie seine Punktma-
trix aussieht. Die Zeichen von 0 bis 255
entsprechen hierbei  dem  "Groß/Grafik"-
Zeichensatz,  die  von  256  bis 511 dem
"Kleinschrift"-Zeichensatz. Die  Reihen-
folge  entspricht übrigens der der Bild-
schirmcodes, die wir ja schon im letzten
Kursteil hatten.                        
Nun möchte ich nocheinmal zu Register 24
des  VIC  kommen.  In diesem kann ja die
Lage des  darzustellenden  Zeichensatzes
festgelegt werden. Wir hatten da ja auch
den  Bereich von 8192-12287 eingestellt,
um unsere neuen Zeichen  auf  den  Bild-
schirm  zu bringen. Was jedoch tun, wenn
wir wieder den  "alten"  ROM-Zeichensatz
auf  dem  Bildschirm  haben  wollen, der
ROM-Bereich von 53248-57334 ist ja nicht
dort  aufgelistet?  Nun,  zur  Erklärung
dieser  Frage  muß  ich  wieder  auf die
Hardware-Grundlagen  des  64ers  zurück-
greifen.  Ich hatte Ihnen weiter oben ja
schon erläutert, daß der  VIC  sich  den
Zeichensatz   aus   dem  Zeichensatz-ROM
holt. Der VIC kann nun  aber  nur  einen
Bereich  von  maximal 16 KiloByte adres-
sieren (=auf ihn zugreifen)  -  das  ist
durch  seinen  hardwaremäßigen Aufbau so
gegeben. Deshalb haben wir übrigens auch
immer,  wenn  wir  irgendwo  Grafikdaten
abgelegt  haben,  sei das jetzt eine HI-
RES-Grafik, oder ein Sprite gewesen,  im
Bereich  von  0 bis 16384 gearbeitet. Es
gibt übrigens auch die Möglichkeit  die-
sen 16K-Bereich des VIC umzuschalten auf
folgende  16K-Bereiche,  doch  hierzu an
späterer Stelle mehr. Im Normalfall  ar-
beitet  der  VIC  also in den ersten 16K
des Speichers. Das  Zeichensatz-ROM  be-
findet sich nun aber in den letzten 16K,
womit sich ein Problem ergibt - denn wie
soll  der VIC den auf diesen Bereich zu-
greifen können, wenn er nicht in  seinem
"Einzugsbereich"  liegt.  Hier  wird mit
einem kleinen  Harwaretrick  gearbeitet.
Für  den  VIC  wird  der ROM-Zeichensatz
nämlich immer in  den  zweiten  Zeichen-
satz-Bereich eines jeden 16K-Blocks ein-
gespiegelt. Aber NUR für  den  VIC,  der
Prozessor  hat darauf keinen Zugriff. Im
Normalfall ist das also der Bereich  von
4096  bis  8191.  Wenn wir mit PEEK oder
POKE an diesen Bereich  gehen,  erhalten
oder verändern wir jedoch nur die Inhal-
te der  entsprechenden  RAM-Adressen  an
dieser Stelle. Der VIC sieht hier jedoch
den  ROM-Zeichensatz, weshalb dieser Be-
reich  nicht  dazu  geeignet  ist  einen
RAM-Zeichensatz  aufzunehmen.  VIC  wird
dann immer den Zeichensatz aus  dem  ROM
holen  und sich nicht darum kümmern, was
dort im  RAM steht. Deshalb ist auch der
zweite  Eintrag  in  der  Zeichensatzbe-
reichsliste  von  oben repräsentativ für
das Zeichensatz-ROM. Schalten  wir  also
diesen Bereich ein, so erhalten wir wie-
der den alten ROM-Zeichensatz! Sie  kön-
nen  ihn somit mit folgendem POKE wieder
herholen:                               
POKE V+24,PEEK(V+24) AND 240 OR 5       
Soviel  also  zu  diesem Thema. Wenn Sie
das mit den 16K nicht so recht  verstan-
den  haben,  dann macht das auch nichts.
Hauptsache, Sie wissen, wie man den Zei-
chensatz   wieder  in  den  Grundzustand
bringt. Das Thema mit  der  Adressierung
des  VICs  werden wir nächsten Monat so-
wieso nocheinmal genauer behandeln.     
Befassen Sie sich jetzt erst einmal  mit
der  Änderung  des Zeichensatzes selbst,
und experimentieren Sie ein  wenig.  Ich
verabschiede  mich  nämlich jetzt wieder
von Ihnen bis nächsten Monat,  wenn  wir
den  letzten Teil dieses Kurses durchge-
hen möchten, in dem es dann um noch  ei-
nige Feinheiten der Grafikprogrammierung
geht  und  um  die Einzelheiten, was man
mit einem gänderten Zeichensatz noch  so
anstellen kann. Bis dann also,          
Ihr Uli Basters (ub).                   
Valid HTML 4.0 Transitional Valid CSS!