///////////////////////////////////////////////////////////////////////////////
/                                                                             /
/     P*ST:                                                                   /
/           Christoph Conrad                                                  /
/           Adalbertsteinweg 113                                              /
/           5100 Aachen                                                       /
/                                                                             /
/ E-Mail Direkt:                                                              /
/     MAUS: Christoph Conrad @ AC3                                            /
/                                                                             /
/ E-Mail Gateways:                                                            /
/     FIDO: Christoph Conrad % Maus AC3 2:242/2.6                             /
/   USEnet: Christoph_Conrad@ac3.maus.de                                      /
/ Zerberus: Christoph_Conrad%ac3@zermaus.zer                                  /
/      BTX: Seite *35008024#, im Formular ausfllen                           /
/           Christoph_Conrad@AC3.MAUS.DE.UUCP                                 /
/           (kostet 90 Pfennig)                                               /
/                                                                             /
/ Falls Sie irgendetwas entdecken, was Sie strt, oder Verbesserungsvorschlge/
/ hast, nur zu: schreiben Sie mir ber EMail (vorzugsweise) oder P*ST.        /
/                                                                             /
/ Wenn Sie Fehler im Basic finden, schreiben Sie mir!                         /
/                                                                             /
/ Ich kann weder die juristische Verantwortung noch irgendeine Haftung fuer   /
/ eventuelle  Schaeden  an Daten oder Programmen uebernehmen, die direkt oder /
/ indirekt auf die Benutzung dieser Patches zurueckzufuehren sind!            /
/                                                                             /
///////////////////////////////////////////////////////////////////////////////

+++++++++++++++++++++
QUESTION:
Ich hre immer, Line-A sollte nicht verwendet werden. Warum eigentlich?
Nun, wie bekomme ich denn dann meine Compilerbibliothek (GFA3BLIB) Line-A frei?

Im folgenden bedeute LA LINE-A!

ANSWER:
Dazu ein Auszug aus dem Profibuch, 10te Auflage:
[ZITAT:ON]
Die Architektur des Betriebssystems spricht allerdings eindeutig gegen die
Benutzung der Line-A-Routinen. Diese stellen nmlich die untere Ebene des
VDI-Bildschirmtreibers im ROM dar. Mit ihrer Verwendung verbaut man sich also
eine eventuelle Nutzung eines anderen (schnelleren) Bildschirmtreibers!

Auch ist eine Existenz der Line-A-Routinen nur fr die ST-Modi (also
320 * 200, 640 * 200 und 640 * 400) garantiert. Schon bei 256-Farbgrafik
(spezielle Grafikkarte bzw. TT in der 'niedrigen' Auflsung) sind die
Mglichkeiten der Line-A-Schnittstelle erschpft (siehe COLBIT0 bis COLBIT3).
[ZITAT:OFF]

Falls Sie jetzt nur Bahnhof verstanden haben: KEINE PANIK!

Eine entscheidende Folgerung dieser Aussagen ist, das Programme, die Line-A
Routinen benutzen, nicht unbedingt korrekt auf allen Graphikkarten laufen!
Ergo: weg damit.


Zum Patchen benutzen Sie bitte einen Diskettenmonitor. Die Patches beziehen
sich auf die GFA 3.6 Compilerlibrary GFA3BLIB der Grsse 139766 Byte.

Sie gehen mit ihrem Diskettenmonitor an den entsprechenden Dateioffset der
GFA3BLIB-Datei. An diesem Offset geben Sie bei einem Patch namens

nop    die beiden Bytes   $4E $71

und bei

rts    die beiden Bytes   $4E $75

ein. Denken Sie daran, vorher eine Sicherungskopie von GFA3BLIB zu machen.
Patch (1) ist brigens nicht unbedingt zwingend. Wird er aber durchgefhrt,
muss Patch (4) ebenfalls gemacht werden, bei (2)/(3) sind die Hinweise
zu beachten!

(1)
Dateioffset: $486C
Patch: nop

Erklrung:
$A000, LA-INIT im Initialisierungsteil Compiler
Gfa merkt sich hier A0 und A1.
A0: LA-Variablen
A1: Zeiger auf Tabelle mit Zeigern auf Systemzeichensaetze

VORSICHT: es werden nach $A000 die aktuellen Inhalte von A0/A1
          gerettet, nach Patch die Werte nach einem MSHRINK-Aufruf.
          Es koennten also beliebige Werte darin stehen, auch
          Null oder Eins. Dies wuerde bei manchen GFA-Befehlen
          dazu fuehren, dass bei Zugriff auf negative LA-
          Variablen ein Bus-oder Adresserror ausgeloest werden koennte.
          Deshalb sollte man ueberhaupt keine Befehle mehr ver-
          wenden, die irgendwie nur auf LA-Variablen
          zugreifen, also z.B. auch kein SETMOUSE.

(2)
Dateioffset: $6C82
Patch: nop

Erklrung:
$A00A, Hidemouse, u.a. intern vor VDI-Befehlen

BESSER: da kein Zugriff auf LA-Variablen (zwingend, falls Patch (1) verwendet!)
Offset $6C6E, direkt am Anfang Hidemouse
Patch: rts

(3)
Dateioffset: $6CB6
Patch: nop

Erklrung:
$A009, Showmouse, u.a. intern vor AES-Befehlen

BESSER: da kein Zugriff auf LA-Variablen (zwingend, falls Patch (1) verwendet!)
Offset $6C94, direkt am Anfang Showmouse
Patch: rts

(4) Dateioffset: $A584, $A58A
(zwingend, falls Patch (1) verwendet!)

Bei Verwendung von VDI-Befehlen macht GFA im Initialisierungsteil
ein vs_clip, 'Clipping ein' mit der Bildschirmbreite/hoehe. Beide
Werte holt es sich aus Offset -4/-12 der LA-Variablen.
Patches: jeweils $6002 (bra.s relativ zwei Byte weiter).
>>>>>> WICHTIG: !! CLIP OFF am Programmanfang

(5)
Dateioffset: $D55E
Patch: nop

Erklrung:
$A00A, vor einem SupExec, Bedeutung unbekannt (naja, nehmen wir mal mit...)

>> Ohne Gewaehr auf Vollstaendigkeit!

*** Im Interpreter $A009/$A00A Show/Hide Mouse rauspatchen! Das gibt zwar
leichte "Flecken" beim Bewegen der Maus im Interpreter, aber dafuer keine
beim laufenden Programm!

*** Auf eine saubere Schachtelung von hidems/showms
(ueber GRAF_MOUSE AES 78) achten! Zu jedem Hide ein Show, sonst gibt's
"Flecken". Maus nicht anschalten, wenn sie schon an ist, wie in der
Regel nach dem Start von GEM-Programmen, sonst "Flecken".

*** Folgende Befehle meiden:
CRSCOL   CRSLIN   INPUT    MOUSE    MOUSEK   MOUSEX   MOUSEY   SETMOUSE
SHOWM    HIDEM    SPRITE   ACHAR    ACLIP    ALINE    APOLY    ARECT
ATEXT    BITBLT   HLINE    L~A      PSET     PTST     GET      PUT
SGET     SPUT     RC_COPY

...und gegebenenfalls entsprechende VDI/AES-Befehle nutzen!

Von BITBLT gibt es eine VDI und eine LA-Variante!

>> Ohne Gewaehr auf Vollstaendigkeit!

Ansonsten kann ich nur empfehlen, mit SysMon mal mitzutracen. Wer
noch Befehle findet, die LA verwenden (auch indirekt ueber
LA-Variablen), schreibe mir bitte eine PM. Die Verwendung
von LA-Variablen laesst sich einfach rauskriegen, wenn ihr
LADI_1_1.PRG vom TEMPLEMON verwendet und auf den Programmstart
einen Breakpoint setzt. Das erste JSR springt in den INIT-Teil
von GFA-Basic. Hinter den ersten MShrink (auf das auf LA-Init
gepatchte nop) einen Breakpoint und Register A0 und A1 auf 1 gesetzt,
diese werden direkt dahinter gesichert.

+++++++++++++++++++++
QUESTION:
Wo finde ich denn Hinweise auf GEM-konforme Programmierung?

ANSWER:
Tim Orens ProGEM. Dieser Text von 1985, inzwischen wohl in den meisten Musen
zu finden, gehoert mit zum besten ueber 'Professionelle GEM'-Programmierung.
Weiterhin gibt es das Buch 'Vom Anfnger zum GEM-Profi' der Gebrder Geiss.
Ein wenig unbersichtlich, aber sonst ganz gut. Unverzichtbar ist allerdings
das 'Profibuch' von Jankowski/Reschke/Rabich.

...to be continued in the next message!
+++++++++++++++++++++
QUESTION:
GFA bietet doch so schne eigene Befehle fr Fenster. Taugt das was?

ANSWER:
Ich rate von der Verwendung der GFA eigenen Fensterverwaltung
ab. Diese war in frueheren Versionen fehlerhaft, ob heute, wer weiss?
bers AES ist es genauso 'einfach' oder 'schwierig'.

+++++++++++++++++++++
QUESTION:
Alles schn und gut, aber das sind doch nur alles Patches fr 3.6. Wie finde
ich denn die entsprechenden Stellen bei anderen Versionen?

ANSWER:
Da kann ich Ihnen helfen: Das folgende Programm findet alle Stellen mit
LA-Aufrufen. Aehm, genauer gesagt, findet es alle Stellen, an denen an
geraden Adressen ein Word $A00X vorkommt, wobei X zwischen 0 und 15 liegen
kann. Es kann also auch irgendein Datum sein. Sie mssen dies vor dem Patchen
erst berprfen!

' GFA-Compilerlibrary - Line-A Codes finden
DATA  Init, Put Pixel, Get Pixel, Line, Horizontal Line
DATA  Filled Rectangle, Filled Polygon, BitBlt, TextBlt
DATA  Show Mouse, Hide Mouse, Transform Mouse, Undraw Sprite
DATA  Draw Sprite, Copy raster form, Seedfill
DIM la.name$(15)
FOR i&=0 TO 15
  READ la.name$(i&)
NEXT i&
'
lib$="GFA3BLIB"
OPEN "i",#1,lib$
len%=LOF(#1)
CLOSE #1
DIM p|(len%)
ram%=V:p|(0)
BLOAD lib$,ram%
'
OPEN "o",#1,"LINEAADR.DAT"
PRINT #1,"Offsets zum Dateistart (hex)"
'
FOR off%=0 TO len%-1 STEP 2
  w%=CARD{ram%+off%}
  IF &HA000<=w% AND w%<=&HA00F
    info$=HEX$(off%,6)+" : "+HEX$(w%,4)+la.name$(w% AND &HF)
    PRINT info$
    PRINT #1;info$
  ENDIF
NEXT off%
CLOSE #1

+++++++++++++++++++++
QUESTION:
Mein Programm strzt mir manchmal ab. Ich kann beim besten Willen keinen Fehler
finden. Was kann das sein und wie finde ich das raus?

ANSWER:
SysMon und TempleMon verwenden. TempleMon kann in vielen MAUS-Boxen gesaugt
werden, SysMon direkt beim Autor

Karsten Isakovic
Wilmersdorferstr. 82
1000 Berlin 12

bezogen werden. Zum Zeitpunkt des Absturzes kann man so zumindest den letzten
verwendeten Systemaufruf feststellen und evt. falsche Parameter.

Eine weitere gute Mglichkeit ist die Verwendung von TRACE procedurename
(siehe Handbuch). Wenn man nun alle getraceten Zeilen in eine vorher
geffnete Datei schreibt (PRINT #1,TRACE$) lsst sich die Absturzstelle
schnell lokalisieren.

Ebenso ntzlich kann der Turbo-C/Pure-C Debugger sein, wenn man das Programm
mit Symbolen bersetzt.

Ein weitgehend unbekannter Fehler betrifft die GFA-Basic eigene
Speicherverwaltung. Der Fehler ist in allen 3er Versionen.

Abhilfe: an 'hufig' durchlaufene Stellen ein ~FRE(0).

Probieren Sie mal folgendes (danach neu booten):

' Compilerversion mit $m
' statt RESERVE
RESERVE 1000
$m 4711
' RESERVE damit's etwas schneller
' abstrzt aber eigentlich unntig
' Die (**) Zeilen braucht man
' beim Interpreter, damit
' nach dem RESERVE auch wirklich
' danach (FRE() MOD 16) == 0 gilt
' minus 4: wegen Backtrailer bei rest16$
' beim Compiler falls $m XXXX
' mit (XXXX MOD 16)<>0
rest16%=(FRE(0) MOD 16)-4   ! **
IF rest16%<0                ! **
  ADD rest16%,16            ! **
ENDIF                       ! **
rest16$=STRING$(rest16%,0)  ! **
' (FRE() MOD 16) == 0 jetzt erfllt
str$="AHAH"
DO
  @crash(str$)
LOOP
PROCEDURE crash(str$)
  str$="OHOH"
RETURN
