home *** CD-ROM | disk | FTP | other *** search
- From: roelofs@nas.nasa.gov (Cave Newt)
- Newsgroups: comp.binaries.ibm.pc.d,alt.sources
- Subject: Re: screen clearing TSR
- Message-ID: <1990Nov12.055127.16872@nas.nasa.gov>
- Date: 12 Nov 90 05:51:27 GMT
-
- Michael Page, apm388p@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@amelia.nas.nasa.gov
-
-
- begin 600 hotclear.com
- MZS.0`````/M0Y&`\+G40N$``'H[8H!<`'R0//`IT!E@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
-