home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.update.uu.se
/
ftp.update.uu.se.2014.03.zip
/
ftp.update.uu.se
/
pub
/
rainbow
/
msdos
/
decus
/
RB139
/
rb-tsr.lzh
/
RB-TSR.ASM
next >
Wrap
Assembly Source File
|
1986-11-03
|
3KB
|
112 lines
; RB-TSR.ASM
; Grabs firmware calls for Level 2 character input
; adapted from "Writing Desk accessories" by Tom Wadlow
; BYTE magazine, Fall 1985 IBM issue, page 108
; Modified for Rainbow by Booth Hartley
;
; To build into an executable program:
; MASM RB-TSR;
; LINK RB-TSR;
; EXE2BIN RB-TSR RB-TSR.COM
;
;
RB_firmware equ 18h
DOS_function equ 21h
DOS_terminate_resident equ 27h
get_vector equ 35h
set_vector equ 25h
;
cseg segment
assume cs:cseg,ds:cseg
org 100h
start:
jmp initialize
old_firmware dd ;set aside a double word for old keyboard vector
n_chars_avail db 0 ;number of chars avail
char_buf db 'a',0
orig_di dw
;
keyboard_interceptor proc far
assume cs:cseg,ds:nothing
sti
cmp di,2 ;is this a level 2 char_input request?
jz ki4
cmp di,4 ;is this a level 2 status request?
jnz ki2 ;jump if not
ki4: mov orig_di,di ;save di
mov al,n_chars_avail ;first see if we already have a char
cmp al,0
jne ki5 ;jump if have one
pushf ;push flags to simulate an INT call
mov di,6
assume ds:nothing
call old_firmware ;use old firmware interrupt
cmp cl,0 ;did we get a char?
je ki1 ;jump if not
cmp cl,01h ;see if char in level 2 buffer
jne ki3
mov di,2 ;level 2 char input
jmp ki2 ;use the char from level 2 buffer
;
ki3:
; check for lower case z. If found, convert to upper case
cmp al,'z'
jne ki0 ;jump if not z
mov al,'Z'
jmp ki6
; same for upper case Z
ki0: cmp al,'Z'
jne ki6
mov al,'z'
ki6:
mov char_buf,al ;put char into buffer
mov al,1
mov n_chars_avail,al
ki5: ; we know that there is a char in char_buf
mov cl,0ffh ;say that char is avail
mov di,orig_di
cmp di,4 ;status only
je ki1
dec n_chars_avail
mov al,n_chars_avail
mov ah,0
mov di,ax
mov al,char_buf[di]
ki1: iret ;return from the interrupt
;
;the following processes other functions by transferring control to
;the old handler
ki2:
assume ds:nothing
jmp old_firmware
keyboard_interceptor endp
;
;Application code should end here
;
initialize:
mov bx,cs
mov ds,bx ;ds points to code seg
; get the old firmware vector
mov al,RB_firmware
mov ah,get_vector
int DOS_function
; save it
mov word ptr old_firmware,bx
mov word ptr old_firmware[2],es
;
;Set the firmware vector to our routine
mov bx,cs
mov ds,bx
mov dx,offset keyboard_interceptor
mov al,RB_firmware
mov ah,set_vector
int DOS_function
;
mov bx,cs
mov ds,bx
mov dx,offset initialize ;point to the end of the resident code
int DOS_terminate_resident
;
cseg ends
end start