screen clearing TSR
Cave Newt
roelofs at nas.nasa.gov
Mon Nov 12 16:51:27 AEST 1990
Michael Page, apm388p at vaxc.cc.monash.edu.au, writes:
>I am looking for a simple utility which will enable me to *clear the screen*
>(by sending ANSI <esc>[2J ?) by issuing a keystroke, for example while I am
>in graphics mode of NCSA Telnet or Kermit. (Perhaps this last requirement
>is irrelevant because presumably the keystroke would be intercepted by the
>PC before it is sent off.)
It's not clear to me whether you want something to send a clear-screen
signal to the host computer or simply a local, PC-based screen-clearer.
If the latter, here's a small (and pretty stupid) TSR to do it for you.
All this does is check the current video mode and then do a reset to that
mode (so if you're in graphics mode, you'll stay that way). It doesn't
do anything beyond that, however, so if you're in a 35-line editor mode,
you'll lose the bottom 10 lines (and maybe the cursor, too) when the mode
gets reset. But hey--that's what caveat emptor is all about. :)
Appended is a uuencoded .com file, then source (so you can compare with a
debug dump and convince yourself there're no trojans lurking about), and
follow-ups to alt.sources.d.
Greg
roelofs at amelia.nas.nasa.gov
begin 600 hotclear.com
MZS.0`````/M0Y&`\+G40N$``'H[8H!<`'R0//`IT!E at N_RX#`;`@YB!3M`_-
J$#+DS1!;6,^X"37-(8D>`P&,!@4!M"6Z!P'-(:$L`([`M$G-(;HU`<TG
`
end
;------------------------------------------------------------------------------
; hotclear.asm G. Roelofs, 11 Nov 90
;
; TSR to clear screen when hotkey is pressed. Not very bright: clears screen
; by resetting video mode, which will nuke colors, fonts, etc. (in particular,
; 35-, 43-, 50- and 60-line modes get changed back to 25-line mode). In addi-
; tion, hotclear doesn't bother to check and see if it's already resident, nor
; does it have any mechanism for turning itself off (both are pretty trivial
; to add, however). Default hotkey is ALT-LEFTSHIFT-C, but it may be changed.
;------------------------------------------------------------------------------
BIOS_DATA segment at 40h ; BIOS data area
org 17h
kb_flag db ? ; keyboard status (shift)
BIOS_DATA ends
CSEG segment
assume cs:CSEG, ds:nothing, es:nothing
org 2Ch
envir_seg dw ? ; segment addr of environment
org 100h ; .com program
begin: jmp initialize ; code to make TSR
; Equates, data
; -------------
EOI equ 20h ; end-of-interrupt signal
INT_CTRL equ 20h ; 8259 port address
KB_DATA equ 60h ; keyboard data port
KB_CTRL equ 61h ; keyboard control port
KB_STAT equ 64h ; keyboard status port
SHIFT_MASK equ 00001111b ; overall shift mask
ALT_MASK equ 00001000b ; alt shift key is down
CTRL_MASK equ 00000100b ; ctrl shift key is down
LEFT_MASK equ 00000010b ; left shift key is down
RIGHT_MASK equ 00000001b ; right shift key is down
HOTSHIFT equ ALT_MASK+LEFT_MASK ; (or just ALT_MASK, etc.)
HOTKEY equ 2Eh ; "c" scan code
oldint9h label dword
oldint9h_addr dw 2 dup (?) ; old keyboard handler vector
; New interrupt 9h handler: if not hotkey, let old one do the work
; -----------------------------------------------------------------
newint9h proc near
sti ; set interrupt enable flag
push ax ; save AX
in al, KB_DATA ; get scan code from keyboard
cmp al, HOTKEY ; our hotkey?
jne outta_here ; nope: we're outta_here
mov ax, BIOS_DATA ; yep: now check for our shift
push ds ; save DS
mov ds, ax ; now pointing at BIOS data area
assume ds:BIOS_DATA ; so assembler knows what's up
mov al, kb_flag ; get keyboard status
pop ds ; restore DS
assume ds:nothing ; oh, nothing...
and al, SHIFT_MASK ; only alt, ctrl, normal shifts
cmp al, HOTSHIFT ; see if ours is (are) down
je our_thing ; yep: do our_thing
outta_here: pop ax ; nope: we're outta_here
jmp oldint9h ; let old handler handle it
; The people have spoken: do a hard reset of the video mode to
; whatever it is now. Then leave.
our_thing: mov al, EOI ; end-of-interrupt signal (else
out INT_CTRL, al ; system locks up)
push bx ; gets modified by video call
mov ah, 0Fh ; current-video-state function
int 10h ; video interrupt
xor ah, ah ; set-video-mode function
int 10h ; banzai
pop bx ; restore regs
pop ax ;
iret ; hot damn: all done
newint9h endp
; Reset interrupt vector, free environment, and become resident
; -------------------------------------------------------------
initialize proc near
assume ds:CSEG
mov ax, 3509h ; get current keyboard handler
int 21h ; vector
mov oldint9h_addr, bx ; save it for later use
mov oldint9h_addr[2], es ;
mov ah, 25h ; set vector to our routine
mov dx, OFFSET newint9h ;
int 21h ;
mov ax, envir_seg ; get environment segment
mov es, ax ;
mov ah, 49h ; free allocated memory:
int 21h ; if fails...too bad
mov dx, OFFSET initialize ; end of resident code
int 27h ; become TSR and return to DOS
initialize endp
CSEG ends
end begin ; non-TSR entry point
More information about the Alt.sources
mailing list