← ST-Computer 06 / 1986

Assembler: Screendump über Alt-Help

Listing

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