From: Ralf.Brown@B.GP.CS.CMU.EDU
Newsgroups: comp.os.msdos.programmer
Subject: Re: Results of the smallest TSR contest
Date: 1 Sep 92 12:34:29 GMT
Organization: Carnegie Mellon University School of Computer Science
Originator: ralf@B.GP.CS.CMU.EDU

In article <BtvM6J.70o@ireq.hydro.qc.ca>, beaurega@ireq.hydro.qc.ca (Denis Beauregard) wrote:
}Then, I proposed the contest : the Smallest TSR Program
} 
}In the category : Assembly only (out of competition)
}  128 bytes for a program swapping keys of the keyboard (no example given)

See PD1:<MSDOS.KEYBOARD>RBKEYSWP.ZIP on SIMTEL20.  Includes full source.
It's actually 53 bytes of resident code, which requires a 64-byte UMB or
128 bytes in low memory (64 bytes of PSP).  Of those 53 bytes, 16 bytes are
overhead to make sure that the right control key is ignored and only the
left one is remapped.

}In the category : HLL with almost no Assembly
}  Duncan Murdoch
}  160 bytes for a similar program (key swapper)
} 
}In the category : HLL with Assembly
}  Ross Ridge
}  64 bytes for a TSR counter

I didn't see this one.  That must be in a UMB, as DOS won't let a program go
TSR with less than 96 bytes.

}My own entry : doing the key swapper in HLL + Inline.
}Let's presume I use the same loader as Ross' program.
}The result would give 48 bytes.  Compare with 160 bytes without assembly.
}The program is (in assembly) :
} 
}swapkey:
}        cmp   ax,0x4F00 + K_ESC  3      'K_ESC = 01Bh = Esc key code

K_ESC should be 01h, etc.  While this program might actually work on
your system after fixing the scan codes, it is not correct.  When you
press and release Esc, your BIOS (and anybody else hooked into INT
15/4F) will see you press BackSpace and release Esc....

}Counting 5 bytes for Memory Control Block header and using a
}MCB header contiguous to memory controlled, I need 40 bytes.

That won't necessarily work if you want to load into an XMS UMB, since
different XMS implementations handle them differently.	Also, DOS 4+
use the last 8 bytes of the MCB for a program name, so overwriting that
part with code may confuse many memory mappers.

Here's the RBkeyswap resident code, stripped of the right-control checking.
37 bytes of code.

int15_handler:
       cmp	ah,4Fh			; scan code translation?
       jne	not_ours		; if not, chain immediately
       shl	al,1			; move break bit into CF
       pushf				;   and remember it for later
       cmp	al,1Dh*2		; ctrl?
       je	ctrl_or_capslock
       cmp	al,3Ah*2		; capslock?
       je	ctrl_or_capslock
       cmp	al,01h*2		; ESC?
       je	esc_or_tilde
       cmp	al,29h*2		; backquote/tilde key?
       jne	int15_no_xlat
esc_or_tilde:
       xor	al,0Fh*2		; (AL xor 0F) xor 27 == (AL xor 28h)
					; 01h -> 29h, 29h -> 01h
					; thus esc and tilde swapped
ctrl_or_capslock:
       xor	al,27h*2		; 1Dh -> 3Ah, 3Ah -> 1Dh
					; thus left-ctrl and capslock swapped
int15_no_xlat:
       popf				; retrieve break bit in CF
       rcr	al,1			;   and add to translated scan code
       stc				; use the scan code
not_ours:
       db	0EAh			; FAR JMP chain to previous handler
old_int15 dd	?

-- 
Internet: RALF+@CS.CMU.EDU   |The University would disclaim this if it knew...
FIDO: Ralf Brown 1:129/26.1  |
BIT: RALF%CS.CMU.EDU@CARNEGIE|"Success has a simple formula: do your best,
AT&Tnet: (412)268-3053 school| and people may like it."   -- Sam Ewing
Newsgroups: comp.os.msdos.programmer