[comp.sys.atari.st] KILLER update

braner@batcomputer.tn.cornell.edu (braner) (12/20/86)

[]

Since I posted several unfinished sources for KILLER, and never the final
version, and since the posted binary did not conform to my later suggested
"protocol for the installation of resident utilities", here is an update:

[uuencoded binary after the source...]

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*   KILLER - a resident utility for the ST
*
*   by Moshe Braner,  861219
*
*   Run this program once, early in a session.
*   (Best: from the AUTO folder, but anyway NOT from a shell.)
*
*   Later, holding down both Shift keys, the Control and the
*   Alternate keys, and pressing another key (e.g. Return), causes
*   the currently running application to terminate.  This is useful
*   in case the application hangs, or is otherwise out of control.
*
*   WARNINGS:
*
*   This program is put in the public domain for the convenience of
*   developers who need its effect.  Use at your own risk!
*
*   Some addresses used here are NOT to be used in commercial programs.
*   They refer to undocumented, and unstable, ROM contents.
*
*   This is NOT a "well-behaved" TOS program.  In fact, it probably
*   will not work as-is with the next version of the TOS ROMs.
*
*   Do NOT use in a multi-tasking situation (e.g. while a printer-
*   spooler is printing) - one cannot predict which application
*   will be killed!

    CODE

* Install our own keyboard-interrupt vector:

    pea     install(PC)        ; tell TOS what to execute
    move.w  #$26,-(a7)         ;   in supervisor mode
    trap    #14
    addq.l  #6,a7
    clr.w   -(a7)
    move.l  #$00000200,-(a7)   ; terminate, but keep $200 bytes
    move.w  #$31,-(a7)
    trap    #1

install:

* Check if KILLER has been installed before, using our
* standard protocol for resident utilities:

    move.l  $118,d0            ; kbd interrupt vector
    move.l  d0,a0
    cmp.l   #$4B494C4C,-8(a0)  ; if "KILL" is there
    beq.S   done               ;   then don't do it over

* Replace old vector with new:

    lea     killer(PC),a0
    move.l  d0,-4(a0)          ; save old vector
    move.l  a0,$118            ; poke new
done:
    rts

* Our protocol stuff:

    dc.b    "KILL"             ; for ID
old:
    dc.l    $FC281C            ; space for old vector

* A fatal piece of code:

killer:

* If interrupted program was in supervisor mode, skip:

    btst    #5,(a7)            ; super bit in stacked status word
    bne.S   skip

* If not all the shift keys are down, skip:

    cmp.b   #$0F,$E1B          ; where TOS keeps shift info
    bne.S   skip               ;     ("classified" and "illegal")

* Return from this interrupt to the bomb factory:
* (we jmp into the middle of the bomb handler - "illegal"!)

    bset    #5,(a7)            ; keep super mode after RTE
    move.l  #$FC0A5A,2(a7)     ; overwrite return address
skip:
    move.l  old(PC),-(a7)      ; do usual handling of kbd intrpt
    rts

    END

~~~~~~~~~~~~~~~~ cut here ~~~~~~~~~~~~~~~~~~~
begin 644 KILLER.PRG
M8!H```!F``````````````````````````#__TAZ`!@_/``F3DY<CT)G+SP`a
M``(`/SP`,4Y!(#D```$8($`,J$M)3$S_^&<.0?H`%B%`__PCR````1A.=4M)a
M3$Q.<4YQ"!<`!686##D`#P``#AMF#`C7``4O?`#\"EH``B\Z_]Y.=0``````a
`
end
~~~~~~~~~~~~~~~~ and here ~~~~~~~~~~~~~~~~~~~~~~

- Moshe Braner