Grosse Bilder im RCS

Um einem Programm den professionellen Touch zu geben, wäre es oft schön, auch Bitmap-Grafiken einbinden zu können. Das eigene Portrait in der Copyright-Meldung gibt dem Programm gleich eine viel persönlichere Note. In der Ausgabe 8+9/88 der ST-Computer wurde ein Programm vorgestellt, das ein komfortables Erstellen solcher Bit-Blocks aus Bildern im Screen-Format erlaubt. Die Ausschnitte können dann mit „Merge...“ in eigene Resourcen eingefügt werden.

Das Problem bestand bisher darin, daß weder das RCS 1.4 noch das RCS 2.0 von Atari große Bit-Blocks bearbeiten konnte. Man konnte sie zwar laden, aber beim Abspeichern stürzte das RCS meist ab. Oft braucht man aber größere Bilder, und das Zusammensetzen eines Bildes aus vielen kleinen Blöcken erinnert eher an ein Puzzlespiel als an ernsthaftes Programmieren. Mit einem Disassembler bewaffnet, habe ich mich also auf die Suche begeben, um auch diesen Fehler zu finden und zu beheben. Ich habe mich dabei an das RCS 1.4 gehalten, obwohl es nicht die neueste Version ist, weil bei ihm zumindest alle Fehler bekannt sind, was man von der 2.0-Version nicht sagen kann.

Als Ursache stellte sich nicht, wie ich zuerst vermutete, ein Byte-Zugriff auf eine Wort-Variable heraus, sondern lediglich ein viel zu gering bemessener Zwischenspeicher für das Abspeichern von Images. Dieser ist mit 2500 Byte oft zu klein, und die folgenden Variablen werden einfach überschrieben. (Eine kleine Fehlerabfrage hätte an dieser Stelle sicherlich nicht geschadet!) Als Folge wird beim Abspeichern in den Bildschirmspeicher geschrieben, oder das RCS stürzt einfach ab.

Die Lösung zu diesem Problem ist also eine Vergrößerung dieses Zwischenspeichers. Da der bisherige Puffer mitten im BSS-Segment liegt, bleibt nichts anderes übrig, als ihn an das Segmentende zu verlegen. Hierzu muß zum einen die Größenangabe im Programm-Header für das BSS-Segment geändert werden, und zum anderen müssen alle Verweise auf den Puffer im Programm „umgebogen“ werden. Der alte Puffer wird dann nicht mehr verwendet. Um ihn ganz zu entfernen, müßten allerdings die Adressen aller folgenden Variablen verändert werden. Diesen Aufwand zum Sparen von 2500 Byte Hauptspeicher habe ich mir dann auch geschenkt. Der Bereich liegt halt brach.

Das GFA-BASIC-Programm (siehe Listing) prüft, ob es sich tatsächlich um das RCS Version 1.4 handelt, und führt dann die notwendigen Änderungen durch. Als neue Puffergröße habe ich 32.000 Byte angesetzt. Dieser Wert entspricht dem Speicher, den ein normaler Bildschirm belegt, und sollte ausreichend sein. Falls man mit einem Großbildschirm arbeitet und größere Bit-Blocks verwenden möchte, kann man die Konstante im Programm einfach ändern. Andere Größen sind allerdings unrealistisch, da man ab ca. 32 kB Größe an Größenbegrenzungen einiger anderer Puffer kommt. Dies scheint mir aber leicht zu verschmerzen zu sein, da man nun fast den ganzen Bildschirminhalt in der hohen Auflösung des ST als Bild einbinden kann.

Da sich der Puffer im BSS-Segment befindet, verändert sich die Länge des RCS auf Diskette nicht; nur während des Programmablaufs wird entsprechend mehr Speicher verbraucht.

Es bleibt noch anzumerken, daß Bit-Blocks immer monochrom dargestellt werden. Dies muß nicht unbedingt schwarzweiß sein, aber es wird immer nur eine Farbe für gesetzte Bits (Vordergrund) verwendet und eine zweite für den Hintergrund.

Literatur:

Ingo Brümmer, „Eigene Bilder in der Resource“, ST-Computer 8+9/88
Jan Willamowius, „Patchen des RCS 1.4“, ST-Computer 6/89

' Patch für RCS 1 4
' (c) Jan Willamowius, 1991
' Der Puffer für Images wird vergrößert
'
OPEN "U",#1,"RCS.PRG" ! RCS zum lesen/schreiben öffnen
'
' Länge des BSS-Segment holen
'
SEEK #1,&HA 
bss$=INPUT$(4, #1) 
bss%=LPEEK(VARPTR(bss$))
IF bss%>55000 THEN
    PRINT "Falsches oder schon gepatchtes RCS1"
    END
ENDIF
'
' BSS-Segment um 32 000 Bytes verlängern 
'
bss%=bss%+32000
'
' neue Länge byteweise schreiben 
'
SEEK #1,&HA
OUT #1,bss% DIV &H1000000 
bss%=bss% MOD &H1000000 
OUT #1,bss% DIV &H10000 
bss%=bss% MOD &H10000 
OUT #1,bss% DIV &H100 
bss%=bss% MOD &H100 
OUT #1,bss%
'
'' an 7 Stellen die neue Adresse des Puffers einfugen
'
GOSUB patch(&H77A)
GOSUB patch(&H7AE)
GOSUB patch(&H820)
GOSUB patch(&H47C4)
GOSUB patch(&H47DE)
GOSUB patch(&H51C2)
GOSUB patch(&H542C)
CLOSE #1            ! RCS schließen
END                 ! That’s all Charlie Brown!
'
' alte Adresse durch neue ersetzen
'
PROCEDURE patch(ort%)
    SEEK #1,ort% 
    test$=INPUT$(4,#1)
    IF LPEEK(VARPTR(test$))=&H1A586 THEN ! alter Puffer ist bei $1A586
        SEEK #1,ort%
        OUT #1,&H0 ! neue Adresse ist $1D19A
        OUT #1,&H1 
        OUT #1,&HD1 
        OUT #1,&H9A 
    ELSE
        PRINT "Falsches oder schon gepatchtes RCS!" 
        END 
    ENDIF 
RETURN


Jan Willamowius
Aus: ST-Computer 11 / 1991, Seite 77

Links

Copyright-Bestimmungen: siehe Über diese Seite