...vor einiger Zeit stürzte ich mich regelrecht ins Chaos. Ich ließ Apfelmännchen, Feigenbäume, Juliamengen und Attraktoren mit Hilfe von GFA-Basic V3.xx berechnen. Als diese wunderschönen Grafiken auf meinem Bildschirm flimmerten, kam mir die Idee, daß sich mein Drucker wieder ein mal nützlich machen könnte. Ein Blick ins Handbuch und schon hatte ich den Befehl HARDCOPY entdeckt. Jetzt war es kein Problem mehr ihn ins Programm einzubauen. Das Ergebnis kennt jeder. Nun, als Schüler benutzt man natürlich auch PD-Programme, doch ca. 50% der PD-Programm Autoren hatten das selbe Problem wie ich (z. B. bei mehreren Funktionsplottern). Ein Tag später hatte ich eine eigene kleine Druckertreiber Routine für meinen Epson kompatiblen 9-Nadel Drucker STAR LC-10 geschrieben. Um die Qualität von meinen nächsten PD-Programmen zu erhöhen, möchte ich diese kleine „Procedure“ an die Allgemeinheit weitergeben:
Matthias Brust u. Christian Roth
' ********************************************
' * Von -Matthias Brust und -Christian Roth- *
' * in GFA Basic 3.xx *
' ********************************************
DO
WHILE GEMDOS(17)=0 ! Drucker empfangsbereit
ALERT 1,"|Papier einlegen und|Drucker einschalten",1, "Nochmal|Abbruch",v&
IF v&=2
EDIT
ENDIF
WEND
bild$=SPACE$(32034) ! Speicher reservieren
FILESELECT #"Grafik laden","A:\*.*","",bild$
IF bild$="" ! Sicherheitsabfrage
EDIT
ENDIF
BLOAD bild$,V:bild$ ! Bild laden
bild$=RIGHT$(bild$,32000) ! Bild formatieren
adr_bild%=V:bild$ ! Adresse von Bild in Variable
BMOVE adr_bild%,XBIOS(2), 32000 ! auf Bildschirm zeigen
@druck(adr_bild%)
LOOP
PROCEDURE druck(adr%) ! Druckertreiber
grafik$=CHR$(27)+"*"+CHR$(5)+CHR$(144)+CHR$(1)
LPRINT CHR$(27);"A";CHR$(8);
spalte$=STRING$(400,0)
FOR s%=adr% TO adr%+79
stop$=INKEY$
EXIT IF stop$=CHR$(27)
adr_spalte%=V:spalte$
ziel%=s%+399*80
FOR m%=adr_spalte% TO adr_spalte%+399
POKE m%,PEEK(ziel%)
SUB ziel%,80
NEXT m%
LPRINT grafik$;spalte$
NEXT s%
RETURN
Zwar wurden die Rechner der Mega STE- und TT-Serie standardmäßig nicht mit HD-Laufwerken ausgerüstet, aber es ist leicht möglich, dies nachzuholen. Beide Computer sind nämlich bereits ab Werk mit einer Schaltung ausgerüstet, die es erlaubt, den Floppy-Controller WD1772 mit 16 MHz zu takten und so HD-Disketten zu einzusetzen. Im Gegensatz zum ST muß die entsprechende Hardware also nicht im nachhinein eingebaut zu werden.
Wird ein externes (oder auch internes) HD-Laufwerk (z.B. TEAC FD235 HF) angeschlossen, so lassen sich HD-Disketten lesen und beschreiben. Ein wenig problematisch ist lediglich das Formatieren solcher Disketten. Unter der Festplatte beider Geräte befinden sich DIP-Schalter, von denen der fünfte auf ON gesetzt werden muß. Anschließend findet man im Dialog zum Formatieren von Disketten einen Knopf mit der Bezeichnung „Hohe Schreibdichte“. Ist man nun stolzer Besitzer eines MegaSTE, so steht der Nutzung von HD-Disketten nichts mehr im Wege.
Ist man im Besitz eines TT mit TOS 3.01, so taucht ein ärgerliches Problem auf: Der Knopf „Hohe Schreibdichte“ läßt sich aufgrund eines Fehlers nicht anwählen. Dies ist erst ab TOS 3.05 möglich.
Wie kommt man nun trotzdem zu formatierten HD-Disketten? Falls man Zugang zu IBM-kompatiblen ATs hat. bietet es sich an, sich dort einige Disketten auf Vorrat zu formatieren. Nachteil: Solche Disketten zeichnen sich nicht gerade durch eine hohe Datenübertragungsrate aus. Schnelle HD-Disketten auch auf dem TT erhält man, wenn man zum Formatieren Programme heranzieht, die das Formatieren von HD-Disketten unabhängig vom TOS erlauben. Hier bietet sich z.B. das DISKUS-Diskutility an.
Noch ein wichtiger Hinweis: Werden auf dem TT Programme verwendet, die das ROM ins TT-RAM verlagern (z.B. ROMSPEED oder ROM RAM), kann es Vorkommen, das TOS Fehler beim Schreiben auf HD-Disketten meldet. Vermutlich handelt es sich um Timing-Probleme. Hier hilft nur. beim Arbeiten mit HD-Disketten auf die genannten Programme zu verzichten.
US
Die Version 3.15 von Wordplus stürzt ab, wenn beim Neu Formatieren das zu trennende Word mit einem Hochkomma (') anfängt. Ich stelle hier eine Möglichkeit vor, wie man diesen Fehler beheben kann. In der Datei WORDPLUS.PRG muß das Byte an der Position $1EBEE von $6C in $64 geändert werden. Die Änderung kann mit einem Diskmonitor vorgenommen werden. In Bild 1 sind noch ein paar Byte davor reassembliert. Falls bei anderen Versionen von Wordplus der gleiche Fehler auftritt, kann man die entsprechende Byte-Sequenz im Programm suchen.
Dabei sollte es reichen, wenn man die letzten 6 Byte suchen läßt.
Was wird geändert? An dieser Stelle werden erlaubte Trennstellen im Wort nach Silben gesucht. Über den ersten Buchstaben wird ein Pointer errechnet. Da das Word vorher bereits in Kleinbuchstaben umgewandelt wurde, liegen die erlaubten Werte zwischen $61 (a) und $7A (z). Das Hochkomma ($27) ergibt nach der Subtraktion einen negativen Wert (-58), wenn wir das Ergebnis als signed ansehen und ist damit kleiner als $ 1A. Interpretieren wir die Zahl nun aber als unsigned. so ist es 65420 und damit größer.
Pos. Inhalt Reassembliert
1EBCE 4E56 FFF6 LINK A6,#-$A
1EBD2 426E FFFA CLR.W -6(A6)
1EBD6 206E 0008 MOVEA.L 8(A6),A0
1EBDA 4240 CLR.W D0
1EBDC 1010 MOVE.B (A0).D0
1EBDE 3D40 FFF8 MOVE.W D0,-8(A6)
1EBE2 0440 0061 SUBI.M #$61,D0
1EBE6 3D40 FFF6 MOVE.W D0,-$A(A6)
1EBEA 0C40 001A CMPI.N #$1A,D0
1EBEE 6C72 BGE.S $72(PC)
Neu unsigned statt signed
1EBEE 6472 BCC.S $72(PC)
Georg Scheibler. W-4920 Lemgo
Wenn Sie mal in der GEM-Library stöbern, werden Ihnen zwei Befehle auffallen, die weder in Bedienungsanleitung noch in Lehrbüchern zu Omikrons BASIC dokumentiert sind. Es sind dies OUTLINE ON und OUTLINE OFF mit den entsprechenden VDI-Aufrufen vsf_perimeter(0) bzw. vsf_perimeter(1). Es ist also doch möglich, die Flächenumrandung direkt im BASIC umzuschalten. Das folgende kleine Programm soll dies demonstrieren:
Dirk Hagedorn, W-4796 Salzkotten 6
100 CLS
110 PRINT CHR$(27)+"f";
120 FILL STYLE = 2,1
130 '
140 OUTLINE OFF
150 PDOX 100,100,100,100
160 '
170 OUTLINE ON : ' dies ist die Standardeinstellung
180 PBOX 300,100,100,100
190 '
200 END
Jeder der schon mal versucht hat sein eigenes Zeichenprogramm in BASIC zu schreiben, wird sich überlegt haben, welche Grundfunktionen in sein Programm kommen sollten.
Nun, da es jedem Ziel sein sollte, den Standard zu verbessern, darf man wohl sagen, daß eine 90°-Drehfunktion, in jedes noch so kleine, PD-Zeichenprogramm gehört. Auch wenn man GFA-BASIC für noch so schnell bezeichnen kann, dauerte mein Benchmark 3.775 s, in meiner Assembler-Lösung, die in GFA-BASIC mit Parameterübergabe eingebunden wird, benötigt man “nur“ noch 0.725 s. Also fast viermal so schnell, welches für Assembler eigentlich noch langsam ist. Natürlich könnte man die Geschwindigkeit noch um einiges steigern, wenn man nicht pixelweise bzw. bitweise, sondern wordweise Vorgehen würde. Also 16 Pixel auf einmal im Speicher auswerten, und erst dann darstellen täte.
Nur diese Vorgehensweise müßte schon etwas genauer erklärt werden, um den internen Kontext zu verstehen. Also nichts mehr für die Quick-Tips.
Matthias Brust und Christian Roth
' Geschrieben von -Matthias Brust- und -Christian Roth-'
' --GFA Basic 3.xx—
INLINE start%,200 ! BASIC-interne Speicherreservierung
BLOAD "90_GRAD.O",start% ! Laden
DEFFILL 1,4,2 ! Für kleine Grafik...
x1&=0
y1&=0
x2&=190
y2&=190
PBOX x1&,y1&,x2&,y2&
~C:Start%(x1&,y1&,x2&,y2&)
'
' --GFA Basic 2.xx--
DIM feld%(200/4) ! Feld einrichten
start%=VARPTR(feld%(0)) ! Adresse holen
BLOAD "90_GRAD.O",start%
DEFFILL 1,4,2
x1%=0
y1%=0
x2%=190
y2%=190
PBOX x1%,y1%,x2%,y2%
VOID C:start%(x1%,y1%,x2%,y2%)
; *********************************************
; * Von -Matthias Brust- und -Christian Roth- *
; * in GFA Assembler V1.5 *
; *********************************************
intin equ 8 ; wichtige Adressen
ptsin equ 12
lstlin equ 32
.MACRO lineainit ; Init Macro
.DC.w $a000 ; Adresse von Init
movea.l a0,a5 ; Zeiger retten
move.w #-1,lstlin(a5) ; Sollte -1 sein
.ENDM
.MACRO putpixel farbe,x,y ; entspricht PSET
movea.l intin(a5),a0
move.w \1,(a0)
movea.l ptsin(a5),a0
move.w \2,(a0)
move.w \3,2(a0)
.DC.w $a001
.ENDM
.MACRO getpixel x,y ; Entspricht PTST
movea.l ptsin(a5),a0
move.w \1,(a0)
move.w \2,2(a0)
.DC.w $a002
.ENDM
code: move.w 4(sp),d3 ; Parameter x1&
move.w 6(sp),d4 ; Parameter y1&
move.w 8(sp),d5 ; Parameter x2&
move.w 10(sp),d6 ; Parameter y2&
move.w d5,d7 ; d5 duplizieren
lineainit
loop1: move.w d7,d5 ; Zähler neu setzen
loop2: getpixel d5,d6
cmpi.w #1,d0 ; Pixel gesetzt?
blt weiter ; Nein -> weiter
putpixel #1,d6,d5 ; Ja -> setzen
weiter: cmp.w d3,d5
dbls d5,loop2 ; x Koord. Schleife
cmp.w d4,d6
dbls d6,loop1 ; y Koord. Schleife
rts