Manchmal ist es wünschenswert, den aktuellen Bildschirm abzuspeichern. Zum Beispiel können die Bilder von Objekt-orientierten Zeichenprogrammen wie GEM-Draw oder EASY-Draw nicht von Flächen-orientierten Programmen wie DOODLE, DEGAS oder STAD gelesen werden. Auch ist es möglich Bilder aus anderen Programmen zu übernehmen, um sie mit diesen Programmen weiter zu verarbeiten.
Mit dieser Screendumproutine kann aus fast allen Programmen der aktuelle Bildschirm auf die angemeldete Floppy im Bildschirmformat abgespeichert werden. Es funktioniert nicht bei Programmen die die VBL-Queue selber bestimmen.
Zum Programm:
Alle 1/70 s wird in der Monochromeversion der Vertical Blank Interrupt erzeugt. Er wird beim ST dazu benutzt, periodisch auszuführende Arbeiten in einer speziellen Interruptroutine zu erledigen Großzügigerweise ist es möglich, eigene Aufgaben in diese Interruptroutine einzubinden. Zwei Adressen sind dafür wichtig:
$452 nvbls (word),
Anzahl der Vertical Blank Routinen
$456_vblqueue (long),
Zeiger auf die Liste von vbl-Routinen
Als erstes wird nun die Screendumproutine, in diese vblqueue eingeklinkt. Damit sie aber nicht jedesmal ausgeführt wird, muß noch eine weitere Betriebssystemroutine ’umfunktioniert’ werden. Der Tastaturprozessor liefert in seiner Interruptroutine ein Flag, ob ALT und HELP gleichzeitig gedrückt wurden. Bekanntlich wird dann normalerweise eine Hardcopy des Bildschirms ausgeführt.
$4ee_dumpfig (word), - 1 = $ffff inaktiv
0 aktiv
Zum Glück wird aber dieses Flag in der VBL-Routine erst nach dem Abarbeiten der vblqueue getestet. Deshalb fragen wir in unserer Routine als erstes dieses Flag ab. Ist es gleich Null, wird der Bildschirm abgespeichert und das Flag wieder zurückgesetzt, wenn nicht, dann ist die Routine schon beendet. Eine Hardcopy ist nun nicht mehr möglich, da die Interruptroutine immer auf das gelöschte Flag trifft.
Keine Probleme bereitet das Abspeichern eines Teils des 5peichers mit diesem Rechner. Mit ’create’ wird die Datei eröffnet, mit ’write’ beschrieben und mit ’close’ ordnungsgemäß wieder geschlossen.
Probleme sind dagegen mit dem Criti-cal Error Händler möglich. Er funkt zum Beispiel bei schreibgeschützten Disketten dazwischen. Da diese vom Programm nicht vorgesehene Fehlermeldung meistens zum Absturz führt, wird er für die Dauer der Interruptroutine abgehängt. Eine Kontrolel des Abspeicherns wird deshalb nicht zugelassen.
clrvblkq.tos
Dieses Miniprogramm dient dazu, die vblqueue wieder in ihren Normalzustand zu versetzen. Zu beachten ist, daß die abgehängten Programm bis zum nächsten Reset im Speicher als Leichen herumliegen und ihr Speicherbereich vom Betriebssystem als belegt betrachtet wird.
Peter Melzer
**************************************************************************
* clrvblq.s *
* --------- *
* vblqueue löschen *
* Bis auf den ersten slot vblqueue löschen und eventuell ersten slot mit *
* Mausroutinen belegen. *
* 3.3.86 - Peter Melzer, Schwarzenbach 54, 7821 Eisenbach *
**************************************************************************
nvbls equ $454
_vblque equ $456
.text
move.l a7,a5
move.l #ustck,a7 * Userstack definieren
move.l 4(a5),a5 * Programmlänge berechnen
move.l #$100,d7
add.l 12(a5),d7
add.l 20(a5),d7
add.l 28(a5),d7
move.l d7,-(a7) * Länge des reservierten Speichers
move.l a5,-(a7) * Anfangsadresse des res. Speichers
clr.w -(a7) * dummy ?
move.w #$4a,-(a7) * - setblock
trap 1
adda.l #12,a7
*
move.l #start,-(a7) * Programm im Supervisor ausführen
move.w #38,-(a7) * - supexec
trap 14
addq.1 #6,a7
*
clr.w -(a7) * - term
trap 1 * Programm beenden
********************** programm **************************************
start
move.w nvbls,d0 * anzahl slots
lsl.w #2,d0
movea.l _vblque,a2
move.w #4,d1 * ersten überlesen
loesche
clr.l (a2,d1) * die restlichen löschen
addq #4,d1
cmp.w d0,d1
bne loesche
*
* Beim 197 TOS:
* (Adresse nicht abfragbar !?)
* eventuell weglassen
move.l #$16252,(a2) * Mausroutinen
rts * done
.data
.ds.l 20 * großzügig
ustck
.dc.1 0
***********************************************************************
* *
* Screendump über alt-he1p-f1ag *
* *
* Der Bildschirm wird auf die aktuelle Floppy abgespeichert Bis zu 10 *
* Screens können damit im DOODLE- oder STAD- Format abgespeichert *
* werden. Die vblqueue kann durch das 'cIrvblq.tos' - Programm wieder *
* in den Standardzustand zurückgesetzt werden. *
* *
* 3.3.1986 - Peter Melzer, Schwarzenbach 54, 7821 Eisenbach *
* *
***********************************************************************
etv_critic equ $404
nvbls equ $454
_vblqueue equ $456
_dumpflg equ $4ee
_v_bas_ad equ $44e
.text
move.l a7,a5
move.l #ustck,a7 * Userstack definieren
move.1 4(a5),a5 * Programmlänge berechnen
move.l #$100,d7
add.l 12(a5),d7
add.l 20(a5),d7
add.1 28(a5),d7 * in d7 Länge
*
move.l #init,-(a7) * initialisierung im
move.w #38,-(a7) * Supervisor ausführen
trap 14
addq.1 #6,a7
*
clr.w -(a7)
move.l d7,-(a7) * Programmlänge
move.w #$31,-(a7) * - keep process
trap 1 * Programm im Speicher halten
*************************** programm *******************************
init
move.b #"0",counter * Zähler 0 bis 9 für die screens
*
move.w nvbls,d0 * anzahl slots
lsl.w #2,d0
movea.l _vblqueue,a0
clr.w d1
suche
tst.l (a0,d1)
beq gefunden * freien slot suchen
addq #4,d1
cmp.w d0,d1
bne suche
rts * keinen gefunden
gefunden
lea (a0,d1),a1
move.l #start,(a1) * routine in vblqueue eingebunden
rts
start
tst.w _dumpflg * auf alt-help testen
bne return
jsr dojob
move.w #-1,_dumpflg
return
rts
dojob
move.1 etv_critic,sv_critic * critical error handler abhängen
move.l #error,etv_critic
move.w #$19,-(a7) * - get current disk
trap 1
addq.1 #2,a7
add.w #$41,d0 * um Buchstabe des Laufwerks zu erhalten
move.b d0,filename * an den Anfang des Filenamens setzen
move.b counter,filename+8 * bis zu 10 screens
add.b #1,counter * Zähler um 1 erhöhen
cmpi.b #"9",counter * nicht zu groß werden lassen
ble doj
move.b #"0",counter
doj
* 1. Datei eröffnen
clr.w -(a7) * r/w - Datei eröffnen
move.l #filename,-(a7) * Adresse des Filenamens
move.w #$3c,-(a7) * - create
trap 1
addq.1 #8,a7
tst d0
bmi error
move.w d0,_handle
* 2. Datei schreiben
move.l _v_bas_ad,-(a7) * aktuelle Screenadresse als Pufferanfang
move.l #$7d00,-(a7) * Länge des Bildschirms
move.w _handle,-(a7)
move.w #$40,-(a7) * - write
trap 1
adda.1 #12,a7
tst.l d0
bmi error
* 3. Datei schließen
move.w _handle,-(a7)
move.w #$3e,-(a7) * - close
trap 1
addq.1 #4,a7
error * ohne Fehlermeldung
move.l sv_critic,etv_critic * zurück zum normalen Err.handler
rts
.data
sv_critic
.dc.1 0
counter
.dc.w 0
_handle
.dc.w 0
filename
.dc.b "A:\TRANS .PIC",0,0,0,0,0,0,0
*
.ds.1 30
ustck
.dc.1 0