Quick-Tips

Trouble mit HARDCOPY...

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

HD-Laufwerke am STE und TT

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

Korrektur eines Fehlers bei Word plus Version 3.15

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

Unbekannte Omikron.BASIC-Befehle

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

Drehen als Grundfunktion

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


Aus: ST-Computer 07 / 1991, Seite 153

Links

Copyright-Bestimmungen: siehe Über diese Seite