 Pascal Programmierkurs Teil 1

Als ich vor gut einem halben Jahr meinen Portfolio (im weiteren 
Verlauf liebevoll Pofi genannt) bekommen habe, war eine der tollsten 
Dinge an dem kleinen Kasten, da man nicht nur auf die internen 
Anwendungen beschrnkt war. Nach der ersten RAM-Karte und den ersten 
Quellen fr Pofisoft machte sich dann aber schnell der Wunsch breit, 
da man das, was man nicht bekommen konnte ebend selbst schreibt. 
Gesagt, getan. Ich war natrlich der Meinung, PC bleibt PC und 
Programme die fr den PC geschrieben sind laufen auch auf dem Pofi. 
Einschrnkungen ergeben sich daher nur aus der Gre des Bildschirms 
und der Gre der Programme. Was lag da also nher als die 
Programmiersprache zu benutzen, in der ich auch sonst meinen Unsinn 
produziere. Ich suchte also eines meiner alten Listings heraus und 
feilte ein bichen an der Bilschirmausgabe herum, um diese dann auf 
den Pofi zu bertragen. Die berraschung war nicht schlecht als ich 
dezent vom Transferprogramm darauf hingewiesen wurde, da zu wenig 
Platz auf dem Pofi ist. Wenn man sich einmal den Dimensionssprung vor 
Augen fhrt, mit dem wir es hier zu tun haben ist das auch wenig 
verwunderlich. Unser kleiner Liebling hat nun einmal von Haus aus 
keine Festplatte und nur 640 KB RAM. Programme, die man vorher fr 
relativ klein gehalten hat, sind aus der Sicht des Pofi regelrechte 
Speicherriesen. Nachdem ich also etwas Platz geschaffen hatte, pate 
es dann doch noch auf die RAM-Karte. Start ... BUM. Ich mute dann 
erstmal fr eine geraume Zeit die Batterien entfernen, um den Pofi 
wieder zu beleben ( ein wirklich zher kleiner Bursche, wenn es darum 
geht Daten im RAM zu halten ). Resmee dieser Aktion : Einfache 
Portierung der Programme ist anscheinend nicht mglich. Na gut. Ich 
war allerdings dickkpfig genug, um mich nicht so leicht von meinem 
Vorhaben abbringen zu lassen. Es hat mich dann viel Mhe gekostet an 
einigermaen brauchbare Unterlagen zu kommen, die mir bei diesem 
Problem behilflich sein konnten. Darum geht es also in diesem(n) 
Artikel(n). Kein Programmierkurs in Pascal. Dafr gibt es gengend 
andere und bessere Literatur (siehe Anhang). Es geht darum, wie ich 
Anwendungen schreibe die speziell auf den Portfolio zugeschnitten 
sind und trotzdem mit einer PC-Hochsprache compiliert werden.

Grundstzlich mssen Pascal-Programme fr den Pofi also vor allem 
immer mit dem vorhandenen Speicherplatz vor Augen geschrieben werden. 
Pascal selber geht bei der bersetzung des Codes nicht gerade sparsam 
damit um. Debug-Informationen, Prfcodes etc., die den Speicherplatz 
brauchen sind aber fr unsere Zwecke sowieso nicht sinnvoll. Denn was 
ntzen mir Daten die der Debugger braucht, wenn ich die Programme ja 
sowieso nicht auf dem Pofi debugge. Prfcodes wie etwa Range-Checking 
und Stack-Checking verbrauchen sehr viel  Speicherplatz. Wenn man auf 
diese Sachen verzichtet, dann lt sich damit eine Menge Platz sparen 
und macht unsere Programme damit sehr viel freundlicher fr unseren 
Kleinen. Es ist wirklich erstaunlich, was sich durch geeignete 
Einstellungen sparen lt. Wieviel das ausmacht kann man allerdings 
nicht genau sagen, weil dies natrlich auch auf die Art der Programme 
bzw. auf die verwendeten Funktionen ankommt.

Ein kleines Beispiel :

PROGRAM DISK_WRITE;
VAR f : TEXT;
BEGIN
	ASSIGN ( f, 'DWRITE.DAT' );
	REWRITE ( f );
	WRITELN ( f, 'Hello World ...' );
	CLOSE ( f );
END.

Dieses Programm ist, wenn man es mit den Voreinstellungen von Pascal 
compiliert tatschlich 3,55 KB gro. Nimmt man jetzt alle unntzen 
Optionen raus ( vor allem natrlich die Option I/O-Checking ), dann 
kommt man nur noch auf 1,85 KB.
Ich hoffe, das war beeindruckend.

Um die Freude aber wieder ein wenig zu dmpfen : Grundstzlich mu 
man natrlich wissen, da Programme die man in einer Hochsprache 
schreibt bersetzt immer recht gro sein werden. Man hat ebend als 
Programmierer keinen bzw. nur geringen Einflu darauf, wie der 
Compiler den Code bersetzt und was er alles dort rein schreibt. 
Deshalb lohnt sich die Verwendung einer Hochsprache generell nur 
dann, wenn man recht umfangreiche und komplexe Applikationen 
schreiben will. Fr kleine Tools und Systemprogramme werden die 
kleinen Basic-Dialekte fr den Pofi sicherlich immer geeigneter sein. 
Es sei denn, man ist ein Bit-Hexer und beherrscht die hohe Kunst der 
Assemblerprogrammierung ... :o)

Ok. Wir wollen also ein umfangreiches Programm verfassen und wir 
wollen auch die netten und bersichtlichen Strukturen eines 
Hochsprachenquelltextes nicht vermissen. Was kommen dabei also fr 
Probleme auf uns zu.

Natrlich gibt es ein paar entscheidende Unterschiede zwischen einem 
"normalen" PC und dem Pofi. Zum Ansprechen der Hardware sollte man 
zum Beispiel lieber die Portfolio eigenen BIOS-Serviceroutinen 
verwenden. Direkte Zugriffe scheitern meist daran, da die dafr 
ntigen Adressen ebend nicht kompatibel sind. Teilweise sind auch 
nicht alle BIOS-Routinen die beim PC bekannt sind im Pofi-BIOS wieder 
zu finden. Wieder andere Funktionen sind nur fr unseren Kleinen 
extra eingefhrt worden. Spezielle bzw. modifizierte Routinen sind 
zum Beispiel fr das Handling der RAM-Karten hinzugekommen. Das hrt 
sich natrlich jetzt an als gbe es fast nichts, da man benutzen 
kann. Die DIP Leute haben das BIOS aber trotzdem so gestaltet, da 
alle Programme ( und dazu zhlen auch unsere Pascal-Units ) die 
"sauber" programmiert sind, sich auch auf unserem Kleinen wohl 
fhlen. Trotzdem ... Was hat das nun fr Folgen fr unsere Pascal-Programmierung.

Tataaaa ... Der nchste Hammer. Die Pascal-CRT-Unit kann man leider 
nicht verwenden. Sie ist verantwortlich fr den massiven Absturz, den 
ich in der Einleitung beschrieben habe. Anscheinend wird hier doch 
nher an der Hardware gearbeitet als es von auen scheint. Es gibt 
aber wohl  kaum ein DOS-Programm, wenn nicht sogar keines, das nicht 
Funktionen daraus bentigt. Durch den Wegfall dieser Unit fehlen uns 
so wichtige Sachen wie Bildschirmlschen, das Setzen des Cursors, 
Tastendrcke holen usw. Was bleibt uns also anderes brig als ... 
selber schreiben !!!
"Oh Gott ... was kommt jetzt ...". Grundstzlich hrt sich das 
natrlich schlimmer an als es ist. Sehen wir uns erst einmal an, was 
das fr Funktionen sind.

	CRT.TPU Funktionen und Prozeduren

	AssignCrt         	ClrEol
	ClrScr            	Delay
	DelLine           	GotoXY
	HighVideo         	InsLine
	KeyPressed        	LowVideo
	NormVideo         	NoSound
	ReadKey           	Sound
	TextBackground 	        TextColor
	TextMode          	WhereX
	WhereY            	Window

Verschiedene Funktionen knnen wir schon mal ausschlieen, da sie auf 
dem Pofi keinen Wert haben. Wozu brauche ich Routinen zur nderung 
der Textfarbe, wenn ich nur ein S/W-LCD-Display habe? Also, was 
bleibt brig:

	ClrEol		ClrScr		Delay
	DelLine		GotoXY		InsLine
	KeyPressed	ReadKey		Sound
	TextMode	WhereX		WhereY
	Window

Ich mu dazu noch bemerken, da ich die Funktionen ClrEol, InsLine, 
DelLine und Window  in meiner Version der Portfolio-CRT-Unit nicht 
implementiert habe. Das liegt am einen daran, da ich diese 
Funktionen uerst selten verwende und ich weiterhin zugeben mu, da 
die Programmierung der Window-Routine doch einen mittleren Aufwand 
bedeutet. Vielleicht werde ich diese Sachen aber zu einem spteren 
Zeitpunkt noch mit einbauen. Wenn sich aber Leute damit schon 
beschftigt haben und eine einigermaen gute und stabile Lsung 
darbieten knnen, wre ich natrlich dankbar, wenn ich mir diese Mhe 
sparen knnte ... :o)

Wichtig bei der ganzen Sache ist fr uns natrlich auch, da die 
neuen Funktionen weitgehend aufrufkompatibel zu den gewohnten 
bleiben. Wir wollen ja schlielich keine neuen Befehle lernen, 
sondern in gewohnter Weise weiter machen knnen. Ich hab mich also 
mal daran gemacht und aus verschiedenen Quellen diese Sachen zusammen 
gesucht. Die komplette Unit als Pascal-Quelltext liegt in der Pofo-Mail-Box. Ich will jetzt auch gar nicht so intensiv darauf eingehen 
wie die einzelnen Routinen  programmiert sind. Viel wichtiger sind 
hier ein paar grundstzliche Sachen, die speziell fr die Arbeit mit 
dem Pofi wichtig sind.

Auffallend fr Leute, die sich schon einmal nher mit den DOS-Interrupts beschftigt haben, ist sicherlich, da beim Pofi der 
Interrupt $61 eine wichtige Rolle spielt. Wie weiter oben im Text 
schon erwhnt, fehlen im Pofi-BIOS einige Funktionen. Diesen Mistand 
versuchen wir nun mit Hilfe der speziellen Pofi-Funktionen im Int $61 
auszugleichen. Die Interrupts $60 ( dieser wird uns im zweiten Teil 
noch intensiv beschftigen ) und $61 sind im PC-BIOS unbelegt. 
Dadurch wird deutlich, da es ungemein schwierig und aufwendig wird, 
ein Programm zu schreiben, da sowohl auf dem Pofi als auch auf dem 
PC luft. Leider wird es uns aber kaum erspart bleiben diese 
Funktionen zu benutzen. Wenn ich also kompatibel programmieren will, 
dann mu ich alles doppelt schreiben. Andererseits bietet sich hier 
auch die Mglichkeit an, PC-User davor zu bewahren, unsere Pofi-Programme aus Versehen auf ihrem Rechner zu starten. Sollte der Int 
$61 also auf 0000:0000 zeigen, dann ist das ein relativ sicheres 
Zeichen, da unser Programm keinen Pofi vor sich hat. 
Sicherheitslcken gibt es natrlich immer. Sollte ein PC-Programm 
also diesen Interrupt benutzen, dann sehen wir schon wieder alt aus.

Zurck zum eigentlichen Thema. Der Pofi hat bekanntlich drei 
Textmodi. Unser Pofi beherrscht neben seinem eigenen 40x8 Modus auch 
noch den zum PC kompatiblen 80x25 Modus. Beim 80x25 Modus wird nun 
noch zwischen statisch und dynamisch unterschieden. Da der Pofi 
allerdings nur ein Display von 40x8 Zeichen hat, wirkt in  diesem 
Modus das Display wie eine Art Fenster, das man dann ber den 
eigentlichen Bildschirm von 80x25 Zeichen bewegen mu. Die 
Umschaltung zwischen diesen Betriebsarten erfolgt nun mit Hilfe der 
Funktion $0E des Interrupt $61. Die Abfrage des aktuellen Modus wird 
auch ber diese Funktion erledigt. So schn wie der 80x25 Modus 
vielleicht auch sein mag, aber es ist doch sehr lstig, stndig den 
gerade sichtbaren Bereich verschieben zu mssen, um alles auf dem 
Bildschirm verfolgen zu knnen. Ich empfehle deshalb immer den 40x8 
Modus zu benutzen. Eine zweite Besonderheit ist in diesem 
Zusammenhang auch sicherlich die Tatsache, da das LCD-Display keine 
Attribute darstellen kann. Das heit, da ich nicht die Mglichkeit 
habe einen Text zum Beispiel invertiert darzustellen. Aus diesem 
Grund fallen ja auch ein paar der Funktionen der CRT-Unit fr uns 
weg. Es zeigt aber auch, da wir uns andere Mittel und Wege suchen 
mssen, um Mens und Auswahlbalken zu verwalten und fr den Benutzer 
kenntlich zu machen.

Als weiteren wichtigen Punkt mssen wir uns mit den Routinen 
KeyPressed und ReadKey beschftigen. Es gibt drei Funktionen die uns 
vom BIOS zur Kommuni- kation mit der Tastatur zur Verfgung gestellt 
werden. Diese Funktionen werden nun ber den Interrupt $16 
aufgerufen. Wichtig ist nun der Unterschied zwischen den Funktionen 
$00 und $01. Die Funktion $00 liest ein Zeichen aus dem 
Tastaturpuffer und  falls kein Zeichen vorhanden sein sollte, wird so 
lange gewartet, bis ein Zeichen vorliegt. Die Funktion $01 hingegen 
prft lediglich, ob ein Zeichen im Puffer vorhanden ist und gibt den 
Wert des Zeichens zurck, ohne es zu lschen. Um das Zeichen zu 
lschen mu also ein weiteres mal die Funktion $00 aufgerufen werden. 
So, wo ist nun das Problem dabei? Beim Aufruf von $00 wird ein Timer 
gestartet, der nach Ablauf einer bestimmten Zeit die berhmte Power-Down-Sequenz einleitet. Mit dieser Selbstabschaltung wird ein nicht 
unerheblicher Stromspar-Effekt erzielt. Das ist ja genau genommen 
auch erwnscht. Leider ist es in diesem Stromsparmodus nicht mehr 
mglich auf eventuelle Hardware-Interrupts der seriellen 
Schnittstelle zu reagieren. Wenn ich in meinen Programmen also darauf 
angewiesen bin, bleibt mir nichts anderes brig, als mir eine eigene 
Routine zu schreiben, die die Funktion $01 verwendet. Denn hierbei 
wird die Kontrolle gerade nicht an das BIOS bergeben. Die in der 
Unit implementierten Funktionen ReadKey und KeyPressed verwenden nun 
beide die Funktion $01. Dadurch wird aber wie gesagt der Power-Down 
verhindert, und wenn ein Programm nun lange auf eine Eingabe des 
Benutzers wartet, dann schaltet sich der Rechner nicht ab. Wem das 
nicht pat, sollte diese beiden Funktionen unter Verwendung der $00 
Funktion programmieren. Man kann natrlich beide Versionen in die 
Unit aufnehmen, was allerdings im Wiederspruch zur Magabe steht, da 
diese dann kompatibel zur Orginal CRT-Unit sind.

Soviel also zu diesem Thema. Das soll aber anderweitig noch mal 
behandelt werden.
Abschlieend noch ein paar kurze Worte zu den Routinen Sound und 
Delay. Die Sound-Funktion wird vom Pofi sehr komfortabel ber den 
Interrut $61 ( was auch sonst ) angesprochen. Sie ist nicht 
aufrufkompatibel, bietet dafr aber auch eine sehr viel bessere 
Mglichkeit, Sounds auf dem Pofi zu erzeugen. Die Funktion ist aus 
einer CRT-Unit entnommen, die ich in einem Buch gefunden habe, das 
sich speziell mit der Programmierung unseres Kleinen 
auseinandersetzt. Wer irgendwie eine Mglichkeit hat, an dieses Buch 
heranzukommen, dem mchte ich es wrmstens empfehlen ( alle 
Quellenangaben sind im Anhang vermerkt ).

Die Delay-Prozedur ist eigentlich nur eine Zhlerschleife und deshalb 
fr genaue Zeitmessungen oder hnliches vollkommen ungeeignet. Die 
Werte fr die Anzahl der Durchlufe sind reine Erfahrungswerte. Ich 
halte aber auch mehr Aufwand fr nicht ntig, weil mir bisher noch 
kein Programm eingefallen ist, bei dem es auf einen unheimlich 
genauen Zeittakt ankommen wrde.

So, das war also eine kleine Zusammenfassung der Schwierigkeiten und 
vor allem auch der Lsungsanstze einiger Probleme. Ich denke, da 
nun eine Grundlage geschaffen sein sollte, um endlich auch Programme 
in Pascal fr den Pofi zu stricken. Es gibt natrlich noch hunderte 
von Details ber die Besonderheiten des Pofi zu sagen. Das hat 
allerdings nicht speziell etwas mit der Pascalprogrammierung zu tun 
und eignet sich deshalb bestimmt gut als eine Art Grundlagenartikel.
Ich will aber diesen Text jetzt nicht einfach so enden lassen.
Geplant ist eigentlich so etwas wie ein Kurs. Was soll also 
voraussichtlich noch unser Thema sein? Vor allem die speziellen 
Funktion die uns das BIOS noch so zur Verfgung stellt. Fr die 
Insider seien hier nur kurz die PofiMens erwhnt, wie sie von den 
internen Applikationen her bekannt sind.

Ich will mich hier allerdings nicht festlegen. Ich habe diesen 
Artikel jetzt in den letzten drei Tagen verbrochen. Es gibt also 
bestimmt noch viele ungeklrte Fragen und auch 
Verbesserungsvorschlge. Ich bin fr Untersttzung, Anregungen und 
Meckereien sehr dankbar. Also, auf gehts. Auf da eine wahre Flut an 
neuen Pofiprogrammen unserem Kleinen nie die Luft ausgehen lassen.

	Anhang

verwendete Quellen : 
	Portfolio Programmierpraxis
		Frank Riemenschneider, Michael Schuschk
		Verlag : Markt&Technik

	Portfolio Technical Reference Guide
		DIP

	Diverse Texte aus diversen Mailboxen

Meine eMail-Adressen :

	MausNet 	- Torsten Hler @ OS3
	Internet 	- 057136695@t-online.de

Meistens bin ich auch nach 17:00 Uhr telefonisch zu erreichen und 
stehe damit also auch fr Telefonische Hilfe und Fragen gern zur 
Verfgung. Tel.: 0571/36695