Assembler: Screendump über Alt-Help

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


Aus: ST-Computer 06 / 1986, Seite 48

Links

Copyright-Bestimmungen: siehe Über diese Seite