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

Links

Copyright-Bestimmungen: siehe Über diese Seite