Fact-checked by Grok 2 weeks ago

Terminate-and-stay-resident program

A terminate-and-stay-resident (TSR) program is a type of software designed for operating systems that loads into memory, executes an initial setup, and then returns control to the DOS command interpreter while keeping a portion of its code resident in to provide ongoing services, such as intercepting hardware interrupts (e.g., or timer events) or handling utility tasks like printing without interrupting the foreground application. Introduced with MS-DOS 2.0 in March 1983, TSRs addressed the limitations of DOS's single-tasking architecture by enabling pseudo-multitasking, allowing multiple programs to share system resources through techniques like interrupt hooking and time-slicing (e.g., responding to the timer interrupt at approximately 18.2 Hz). This feature quickly gained popularity for utilities such as print spoolers (e.g., the built-in command, which queues up to 32 files in a manner), graphics loaders (GRAFTABL for character sets or for printer dumps), drive redirectors (ASSIGN from MS-DOS 3.0), and file path managers ( from MS-DOS 3.2), often automatically loaded at boot via the file. Third-party developers extended TSRs to include keyboard enhancers (e.g., KEYBxx utilities occupying about 2 KB of ), screen savers, and even early network drivers, fostering an ecosystem of memory-resident tools that competed for the era's constrained 640 KB limit. Despite their utility, TSRs posed challenges, including permanent memory allocation that reduced space for primary applications (requiring manual unloading where possible, such as via parameterless invocation of commands like ASSIGN) and potential conflicts from overlapping interrupt handlers, which could cause system instability in the absence of robust tools like those introduced in later versions (e.g., upper memory blocks in 5.0). By the mid-1990s, as graphical operating systems like superseded with native multitasking and protected , TSRs became obsolete, though their legacy persists in emulators and retro computing contexts.

Definition and History

Core Concept

A terminate-and-stay-resident (TSR) program is a utility designed for environments that executes its primary initialization code before returning control to the operating system, while retaining a portion of its memory allocation in to enable ongoing background services. This approach circumvents the inherent single-tasking limitations of DOS, which normally allows only one foreground program to run at a time, by permitting the TSR to respond to system events without full reloading. The basic workflow of a TSR begins with the program loading into memory and completing setup tasks, such as installing handlers for specific interrupts. It then calls either INT 27h for smaller implementations or INT 21h with AH set to 31h for more flexible ones to "terminate" execution while preserving the designated memory block. With INT 27h, the DX register holds the offset of the last byte plus one relative to the (PSP), enforcing an initial size limit of 64 KB for the resident portion. In contrast, INT 21h function 31h allows specification of the resident size in DX as paragraphs (16-byte units), with a minimum of 6 paragraphs (96 bytes) and expansion to full segment allocation, accommodating larger utilities. Upon invocation, DOS deallocates any non-resident memory, restores relevant interrupt vectors from the PSP, and resumes the calling process or command . The primary benefit of this mechanism is the facilitation of interrupt-driven reactivation, allowing the TSR to perform tasks like functions or extensions , thereby mimicking multitasking behavior in a non-preemptive . Multiple TSRs can coexist through interrupt sharing, where each new handler links to the prior one in a .

Historical Development

Terminate-and-stay-resident (TSR) programs emerged in the early alongside the development of for the IBM PC, with formal support introduced in DOS 2.0, released in 1983. This version of the operating system, developed entirely by and adapted for the IBM PC's x86 architecture, built upon conceptual influences from —such as modular system calls and resident system components—but innovated TSR functionality to enable programs to remain in memory after termination, addressing the single-tasking limitations of early DOS while ensuring compatibility with IBM hardware standards. A key innovation in DOS 2.0 was the introduction of interrupt 27h, which allowed programs to terminate while keeping up to 64 KB of code resident in memory, effectively turning them into background extensions of the OS. Both interrupt 27h and interrupt 21h function 31h, which permitted larger memory blocks, were available from DOS 2.0. Early examples included in 1984, a manager that popularized TSRs for productivity by offering hotkey-activated tools like calculators and notepads, eventually selling over 1 million copies in its first three years, followed by SuperKey in 1985 for keystroke macros and automation. TSR usage grew rapidly through the 1980s and 1990s, commonly loaded via AUTOEXEC.BAT at boot for essential extensions such as mouse drivers (e.g., MOUSE.COM), print spoolers (e.g., PRINT.COM), and desk accessories, enabling pseudo-multitasking on resource-constrained systems. The technology reached its peak during the MS-DOS 5.0 (1991) and 6.0 (1993) era, when memory optimization tools like EMM386.EXE allowed TSRs and drivers to load into upper memory blocks (UMBs) within the unused 384 KB above conventional memory, maximizing available RAM for applications. This evolution was inextricably tied to the IBM PC/XT/AT architectures' 640 KB conventional memory constraint, a hardware design choice reserving the upper 384 KB of the 1 MB address space for system ROMs and adapters, which made efficient TSR memory management critical to avoid fragmenting the limited user-accessible space.

Technical Implementation

Loading and Memory Management

A terminate-and-stay-resident (TSR) program begins loading by executing as a standard DOS program, typically in the form of a .COM or .EXE file. During initialization, it allocates the necessary memory block using DOS interrupt 21h function 48h to request paragraphs (16 bytes each) from the available conventional memory pool. The program then installs its interrupt handlers to hook into system events, after which it invokes the termination call to remain resident: either interrupt 27h, which sets the memory to retain by providing in DX the offset of the last byte plus one from the program segment prefix (PSP), limiting allocation to up to 64 KB, or interrupt 21h with AH=31h, which specifies in DX the number of paragraphs to keep (minimum 6 paragraphs or 96 bytes) along with an exit code in AL for more flexible control. TSR programs occupy the high end of conventional , starting from the upper boundary of the 640 KB limit, to minimize interference with transient programs loaded at lower addresses. Each TSR owns its allocated block via the , a 256-byte structure at the segment base that tracks process details, vectors, and the memory arena entry for deallocation prevention. Multiple TSRs risk memory fragmentation by carving out non-contiguous blocks from the conventional chain, potentially stranding small unusable segments between allocations. Configuration for loading TSRs occurs primarily through system files: device drivers via the DEVICE= or DEVICEHIGH= directive in during boot, or utility programs via direct execution in , often with command-line parameters to specify the resident size in kilobytes (e.g., "tsr.exe 8" for 8 ). Manual invocation from the command prompt follows the same process, allowing but requiring size specification to override defaults. This setup integrates handling during the loading phase by updating the through the before the termination call. Interrupt 27h was available in versions 1.x through 6.x, providing a simple but limited TSR mechanism implemented initially in . From 2.0 onward, interrupt 21h function 31h became the preferred method, supporting larger theoretical allocations up to 1 MB (though constrained by the 640 KB limit in ) and proper return codes to the parent process or .

Interrupt Handling

Terminate-and-stay-resident (TSR) programs interact with the operating system primarily through handling, enabling them to remain responsive after termination by hooking into specific software and hardware s. The core mechanism involves modifying entries in the (IVT), a located at the base of (starting at 0x0000) that stores 256 four-byte pointers (:) to service routines (ISRs). When a TSR loads, it uses DOS 21h function 35h to retrieve the current IVT entry for the target , saves the original handler's , and then installs its own ISR using function 25h, effectively redirecting the to its code. Common s hooked by TSRs include INT 21h for DOS services (such as file I/O or program execution), INT 08h for the system timer (generating periodic ticks, approximately 18.2 per second), and INT 09h for keyboard input, allowing TSRs to monitor or intercept system events without constant polling. TSRs typically employ chaining to integrate with existing handlers rather than fully replacing them, preserving system functionality while adding their own processing. In chaining, the TSR's ISR first saves the processor state (using instructions like PUSHF and PUSHA to preserve flags and registers), executes its custom logic, and then invokes the previous handler via a far call to the saved IVT address before restoring the state and returning with IRET. For instance, a timer-based TSR might chain on INT 08h to perform background tasks like updating a clock after each tick, ensuring the original BIOS timer routine continues to maintain system timing. Full hooking, where the TSR overwrites the IVT without calling the prior handler, is less common due to the risk of breaking dependent software or BIOS functions, potentially causing system instability or loss of core services. Reactivation occurs seamlessly when the hooked interrupt triggers; the TSR's code executes in response, enabling features such as pop-up menus activated by hotkeys (e.g., via INT 09h detection of key combinations) or input buffering that captures keystrokes without user intervention, all while minimizing interference with the foreground application. When multiple TSRs hook the same , they form a chain ordered by load sequence, with each subsequent TSR saving and calling the prior one's handler, creating a of ISRs. The first-loaded TSR (at the chain's end) has the lowest priority for processing, as later ones intercept the first; this load-order can lead to unpredictable if not managed carefully. To mitigate conflicts, well-designed TSRs check for existing installations (e.g., via a in memory) before hooking and support uninstallation by restoring the original IVT entry. However, deep chains from numerous TSRs pose risks, particularly , as each ISR consumes stack space for saving state and nested calls; if the chain exceeds available stack depth (typically 128-256 bytes in applications), it can corrupt the call stack, leading to crashes or . TSRs address this by switching to private during execution, ensuring the application's stack remains intact.

Applications

Utility Software

Terminate-and-stay-resident (TSR) programs served as versatile in environments, providing on-demand access to productivity tools without disrupting primary applications. These utilities typically activated through hotkey combinations, allowing users to pause their main program and invoke secondary functions such as calculations or , before returning seamlessly to the original task. Common TSR utilities included pop-up calculators, notepads, and calendars, which enabled quick reference and data entry during computing sessions. For instance, offered an integrated suite featuring a for basic arithmetic, a notepad for jotting temporary notes, a for scheduling, and a phone/ for contact management, all accessible via predefined hotkeys. Print spoolers, such as the built-in PRINT.COM, functioned as TSRs to buffer print output in memory, freeing the user to continue working while documents queued for the printer. In peripheral support, TSRs extended hardware functionality for end-user convenience. Mouse drivers, exemplified by the TSR (MOUSE.COM), remained resident to interpret serial mouse inputs and provide cursor control across DOS applications lacking native support. RAM disks implemented as TSRs, such as certain variants, allocated as virtual high-speed storage for temporary files, accelerating access times compared to floppy or hard disks. Screen savers operated as TSRs to prevent phosphor burn-in on CRT monitors by activating idle-time animations or blanking after inactivity periods. Productivity-focused TSRs acted as desk accessories, enhancing workflow through specialized hotkey-activated features. On-screen clocks displayed time overlays, while tools like pop-up thesauruses provided synonym lookups during writing tasks. Clipboard enhancements, such as , allowed users to select and copy text from screens for pasting into word processors, bridging limitations in text transfer between applications. These integrations proved particularly useful with word processors like , where TSRs supplemented native features for smoother editing. Users commonly loaded TSR utilities by stacking their executables in the file during system boot, ensuring session-long availability without manual invocation. Developers optimized TSR sizes—often under 50 KB each—to conserve the 640 KB limit, prioritizing essential code to minimize impact on available for primary programs.

Device Drivers and System Extensions

Terminate-and-stay-resident (TSR) programs played a significant role in extending hardware support by functioning as non-s for peripherals such as drives, network cards, and sound cards, often loaded via the file, after the corresponding device drivers in , to enable access once the is initialized. For instance, MSCDEX.EXE served as a TSR that provided access by installing a hardware-dependent device driver and redirecting calls through multiplexing on INT 2Fh, allowing applications to treat s as standard drives without native OS support. Similarly, early configurations relied on TSRs like the Sound Blaster Pro Volume Control to handle audio output and interfacing, hooking into relevant interrupts for real-time sound processing in environments. Beyond , TSRs facilitated core system enhancements, such as and security monitoring, by remaining resident to intercept system events. , while implemented as a rather than a pure TSR, operated in a TSR-like manner to manage (XMS) above 1 MB, providing allocation services through INT 2Fh for programs and enabling upper memory block (UMB) utilization. Early antivirus solutions, like those from vendors responding to threats in the late , used TSRs to perform resident scans on file access, intercepting INT 21h calls to detect and quarantine viruses in without disrupting normal operations. TSRs also supported rudimentary system-level multitasking, with programs like DESQview leveraging TSR mechanisms to enable task switching among DOS applications by capturing interrupts and managing contexts, effectively turning non-cooperative programs into background tasks. This interrupt multiplexing allowed multiple TSRs to share hardware access efficiently, such as coordinating or sound operations across applications. In contrast to true MS-DOS device drivers, which are categorized as block (for storage like disks) or character (for serial devices) and loaded statically in CONFIG.SYS for permanent integration, TSRs follow a terminate-style model, dynamically loaded post-DOS initialization via AUTOEXEC.BAT, offering flexibility but reduced permanence as they could potentially conflict with subsequent loads. This distinction made TSRs ideal for extensible hardware and system features where full driver permanence was unnecessary, though it required careful interrupt chaining to avoid system instability.

Limitations

Operational Faults

Terminate-and-stay-resident (TSR) programs in often encountered memory conflicts due to their persistent allocation of , leading to fragmentation as partial blocks were reserved without full release upon termination. This fragmentation arose from DOS's first-fit allocation strategy, where TSRs claimed contiguous segments in the transient program area (TPA), leaving smaller, non-contiguous remnants that subsequent allocations could not utilize effectively, even if total free appeared sufficient. As a result, systems frequently reported "" errors during program launches, regardless of installed , because no single block met the minimum requirements for new executables. In DOS 5.0 and later, upper memory blocks (UMBs) managed by EMM386.EXE and provided relief by allowing TSRs to load into the 384 KB high memory area, but overcrowding occurred when multiple TSRs and device drivers exceeded available UMB space, forcing fallback to and exacerbating fragmentation. Compatibility faults were prevalent in TSR operations, particularly from interrupt chain overflows that disrupted the of handlers for key interrupts like INT 21h. Each TSR typically hooked interrupts by saving the previous vector and inserting its own handler, forming a chain; however, excessive chaining—common with multiple TSRs—could overflow limited stack space during recursive calls, causing stack crashes or system lockups. Conflicts intensified with extenders enabling protected-mode execution, such as DOS/4GW used in games like Doom, where TSRs operating in interfered with mode switches or memory mappings, resulting in fatal crashes unless the TSR was properly unloaded prior to launch. Performance degradation stemmed from TSRs introducing latency in critical system calls, notably through extended INT 21h chains that processed each invocation sequentially across all hooked handlers. This added overhead to frequent operations like file I/O or console input, slowing overall system responsiveness, especially in environments with numerous TSRs intercepting the same interrupt. In low-RAM configurations, such as 256 KB machines typical of early , TSRs further hogged scarce resources by retaining buffers and stacks, reducing available for foreground applications and amplifying slowdowns during multitasking attempts. Debugging TSR faults posed significant challenges in , lacking standardized tools to trace resident code execution or memory states post-installation. Faults often manifested as general protection faults (GPFs) in emulated environments or unexplained hangs in native , with no built-in mechanisms to attribute issues to specific TSRs amid intertwined chains and allocated blocks. Developers relied on rudimentary utilities like INTRSPY for tracing or manual vector inspection via DEBUG.COM, but these required preemptive loading and offered limited visibility into conflicts. Unloading via custom hooks provided partial mitigation for some faults, though unreliable chaining often left residual issues.

Unloading Mechanisms

Terminate-and-stay-resident (TSR) programs typically invoke interrupt 21h with function 31h to terminate execution while remaining resident in , but unloading requires custom code to restore the (IVT) to its original state and deallocate the program's segment prefix () using function 49h. This process involves verifying that the TSR is safe to remove by comparing current vectors—such as those for INT 9h (keyboard) or INT 2Fh (multiplex)—against the TSR's own handlers; if they match, the vectors are restored from saved originals, and is freed, often via a check on the multiplex INT 2Fh with 01h returning success (AL=0). Without such code, standard termination leaves the TSR's hooks intact, preventing proper resource release. Manual unloading tools exist for specific TSRs, often scanning memory for program signatures to identify and remove them. For instance, UNLOAD.COM from Central Point Software's PC-Tools utility suite allows users to unload supported TSRs by detecting their memory blocks and executing deallocation routines. Similarly, the MS-DOS SHARE.EXE utility, which installs as a TSR for file-sharing support, can be unloaded with the /U switch, freeing its allocated memory and restoring affected system structures. These tools typically require the TSR to support unloading or use heuristics like memory pattern matching, but they are limited to compatible programs. For chained TSR installations, unloading must occur in reverse load order to avoid breaking interrupt chains established by earlier programs. Each TSR, if designed with an exit routine, can be invoked to release its hooks—such as calling a provided deinstallation —and then the next in the chain is addressed similarly. Hotkey-based TSRs may register via 2Dh (the re-vector ) during installation, allowing coordinated release of hotkeys during unloading to prevent conflicts. This approach relies on protocols like IBM's Interrupt-Sharing for deinstallation, checking if other TSRs depend on the same before proceeding. Incomplete unloading poses significant risks, often leaving "ghost" interrupt handlers that cause system instability, such as crashes or unresponsive input, due to un-restored vectors pointing to deallocated memory. The absence of a universal in exacerbates this, forcing reliance on vendor-specific solutions or custom implementations, which may fail if the TSR lacks built-in support for safe removal.

Decline and Legacy

Factors Leading to Decline

The decline of terminate-and-stay-resident (TSR) programs began in the early , driven primarily by advancements that alleviated the severe memory constraints of the era. was fundamentally limited to 640 KB of due to its real-mode addressing, which forced TSRs to compete aggressively for scarce resources through techniques like memory compression and relocation. The release of in 1990 introduced enhanced mode operation on 386 processors, enabling access to beyond 1 MB via , thus reducing the necessity for TSRs to employ convoluted tricks to coexist in low-memory environments. This shift allowed applications to utilize larger address spaces without relying on TSR chaining, diminishing the appeal of TSRs for utility functions that previously required tight integration into . Parallel to hardware progress, the evolution of operating systems toward true multitasking further eroded TSR viability. Windows NT 3.1, launched in 1993, implemented preemptive multitasking in a fully 32-bit protected-mode environment, allowing multiple applications to run concurrently without the interrupt hooking and cooperative yielding that TSRs demanded from single-tasking DOS. Similarly, Windows 95 in 1995 combined a 32-bit kernel with preemptive multitasking for Windows applications, while virtualizing the DOS layer to handle legacy TSRs in isolated sessions; this design replaced many TSR roles with integrated system services, such as background printing and clipboard management, that no longer needed resident memory occupation. DOS extenders, popularized in the late 1980s and early 1990s (e.g., for games like Doom), further bypassed TSR limitations by switching to protected mode to access extended and expanded memory (EMS/XMS), enabling larger programs without fragmenting conventional memory for resident utilities. Standardization of driver models in (GUI) operating systems sealed the obsolescence of TSRs by mid-decade. In , drivers (VxDs) provided a protected-mode for system extensions, offering reliable handling and resource sharing without the instability of TSR chaining in ; this made traditional TSRs insecure and incompatible in multitasking contexts, as they could disrupt kernel-level operations. TSRs peaked in usage during the late 1980s amid dominance for productivity and , but their relevance sharply declined by the mid-1990s as consumer adoption of GUI OSes like surged, confining TSRs to niche -based and scenarios.

Modern Equivalents

In contemporary Windows systems, background services managed by the (SCM) offer persistent execution akin to TSR programs, allowing processes to run continuously without a or logged-in session, starting automatically at or on demand. These services handle tasks like system monitoring and extensions, replacing the memory-resident nature of TSRs with more structured, isolated operation. For user-mode event monitoring, applications can employ Win32 hooks or register system-wide hotkeys via the RegisterHotKey to intercept inputs and respond in , providing TSR-like interception without direct access. In , Virtual Device Drivers (VxDs) functioned as 32-bit protected-mode extensions, managing hardware, software, and even emulating TSR behaviors for compatibility, such as handling device drivers or resident programs within the virtual machine manager. Kernel-mode drivers in NT-based Windows further extend this for low-level system integration, ensuring stability through ring-0 execution with enforced boundaries. In systems such as , daemon processes serve as the primary equivalent to TSRs, operating as detached background programs that persist indefinitely to perform system tasks without terminal attachment or user intervention. Traditional daemons follow initialization rituals like forking and creating files for supervision, while modern implementations leverage service managers like for streamlined persistence and resource control. Examples include daemons for scheduled job execution and inotify-based watchers for event monitoring, enabling reactive behaviors similar to TSR interrupt handling but within a preemptive multitasking environment. Loadable Kernel Modules (LKMs) provide another analog for kernel-level extensions, dynamically inserting code to enhance functionality without rebooting, much like TSR hooks but with modular loading and unloading. On macOS and , the system daemon orchestrates persistent services through launch agents (user-specific) and launch daemons (system-wide), loading processes at boot or login to run scripts and applications in the background without full termination. This framework supports scheduled or event-driven execution, replacing TSR-style residency with plist-configured jobs managed via launchctl for loading and control. Features like Background App Refresh extend this to contexts, allowing apps to periodically content while minimizing resource use, though constrained by and policies. While lack direct TSR equivalents due to preemptive multitasking, , and —which prevent the cooperative, shared-memory model of —TSR functionality persists in emulation environments. supports loading and executing TSR programs for compatibility with legacy DOS software, enabling interrupt-based hooks within the emulator's virtualized session. Similarly, , as an open-source DOS-compatible OS, fully accommodates TSRs for running classic applications and utilities on contemporary hardware. Security paradigms in these systems have evolved to address TSR vulnerabilities like memory conflicts and ; sandboxing confines processes to limited resources, while privilege separation divides tasks into minimal-authority components, reducing the systemic risks of resident that could destabilize or compromise the entire .

References

  1. [1]
    The MS-DOS Encyclopedia: Section III: User Commands
    Description APPEND is a terminate-and-stay-resident program that is used to specify a path or paths to be searched for data files (in contrast with the PATH ...
  2. [2]
    Re-Open-Sourcing MS-DOS 1.25 and 2.0 - Windows Command Line
    Sep 28, 2018 · MS-DOS 2.0 dates from around August 3rd 1983, and grew considerably in sophistication (and team size), and is comprised of 100 .ASM files; There ...
  3. [3]
  4. [4]
    The MS-DOS Encyclopedia: Section V: System Calls - PCjs Machines
    cEnd Interrupt 21H (33) Function 31H (49) Terminate and Stay Resident 2.0 ... Memory-resident programs should be terminated with Function 31H (Terminate and Stay ...Missing: core | Show results with:core
  5. [5]
    [PDF] DOS INTERRUPTS - IC-Unicamp
    INT 21 - AH = 52h DOS Internal - GET LIST OF LISTS ... FIDO: Ralf Brown 1:129/31. I reply to all submissions and inquiries, but some of my replies ...
  6. [6]
  7. [7]
  8. [8]
    DOS 2.0 and 2.1 | OS/2 Museum
    If Ralf Brown's Interrupt List is to be believed (and it usually is), INT 27h was implemented in COMMAND.COM in DOS 1.x rather than in the DOS kernel itself.<|separator|>
  9. [9]
    Section I: The Development of MS-DOS | PCjs Machines
    MS- DOS, however, added a terminate-and-stay-resident function that enabled a program to be locked into memory and, in effect, become part of the operating ...
  10. [10]
    [PDF] Microsoft_Programmers_Referen...
    1.1. INTRODUCTION. MS-DOS provides two types of system calls: interrupts and call them, function requests. This chapter describes the environments from which ...<|separator|>
  11. [11]
    What is a TSR? - DOS Days
    Popular Early TSRs. Borland's Sidekick, launched in 1984, was an early PIM (Personal Information Manager). It included a personal calendar, text editor (with ...
  12. [12]
    SideKick v1.56A 1985 : Borland International - Internet Archive
    Oct 15, 2018 · Sidekick was a personal information manager (PIM) launched by American software company Borland in 1984 under Philippe Kahn's leadership.
  13. [13]
    DOS Memory Management
    From MS-DOS 5.0, launched in June 1991, device drivers and TSRs could be loaded into unused locations within the 384 KB of UMA via the loading of EMM386.EXE (a ...Missing: TSR 6.0
  14. [14]
    Why Were PCs Limited to 640K of RAM (And How Did They Fix It)?
    Aug 26, 2023 · Expanded Memory Specification (EMS) and Extended Memory Specification (XMS) were two clever solutions to overcome the 640K memory limitation in early PCs.
  15. [15]
    Ralf Brown's Interrupt List - HTML Version
    **Summary of INT 27h and INT 21h AH=31h from Ralf Brown's Interrupt List:**
  16. [16]
    13.3.6 - MS-DOS Memory Management Functions
    MS-DOS provides three memory management functions- allocate, deallocate, and resize (modify). For most programs, these three memory allocation calls are not ...
  17. [17]
    Retro-Malware: DOS TSRs, Interrupt Handlers, and Far Calls, Part 2
    Aug 30, 2016 · Originally appearing in DOS 2.0, TSRs, as the name suggests, are programs that exit but leave some part of their code around in memory. TSRs are ...Interrupt Handlers · Tsrs In Action · Tsr Loading
  18. [18]
    Terminate and Stay Resident Programming
    This DOS service restores the interrupt vectors for 22h, 23h, and 24h to the defaults, so changing their vector interrupt address' will not do you any good.
  19. [19]
    [PDF] Resident Programs Chapter 18 - Plantation Productions
    The trick to using the terminate and stay resident call is to figure out how many paragraphs should remain resident. Most TSRs contain two sections of code: a ...Missing: documentation | Show results with:documentation
  20. [20]
    Definition of Sidekick - PCMag
    Sidekick included a calculator, notepad, calendar, phone dialer and ASCII table and popularized the concept of a terminate and stay resident (TSR) utility. It ...<|control11|><|separator|>
  21. [21]
  22. [22]
    Sidekick - CLC Definition - Computer Language
    Sidekick included a calculator, notepad, calendar, phone dialer and ASCII table and popularized the concept of a terminate and stay resident (TSR) utility. It ...Missing: examples | Show results with:examples
  23. [23]
    Section II: Programming in the MS-DOS Environment - PCjs Machines
    For example, terminate-and-stay-resident (TSR) programs such as PRINT use these hooks to perform limited concurrent processing by taking control of system ...
  24. [24]
    Utilities for DOS and Windows - Uwe Sieber
    Sep 14, 2005 · The utilities include DOS mouse drivers, disk/file tools, CD-ROM drivers, and some tools for Windows 9x.<|separator|>
  25. [25]
    MemMan 2.32 TSR Development Kit - MSX Assembly Page
    The Alloc (10) function now also recognizes memory that becomes available when the DOS2 RAMdisk is removed or resized! It does not matter anymore if the RAMdisk ...
  26. [26]
    SCREEN SAVERS FOR MS DOS - jstor
    This article presents a method for developing TSR programs to solve the screen saving problem. A screen saver automatically displays a dynamic image that ...<|separator|>
  27. [27]
    FREE SOFTWARE FOR DOS — Screen & Video
    MOUSEBUF, MouseClip, and xPC-Mouse are similar TSR programs that allow a user to highlight, copy, and paste text from a text mode DOS screen or application ...
  28. [28]
    AUTOEXEC.BAT & CONFIG.SYS Reference Guide - Socket 3
    Dec 25, 2016 · Sometimes careful placement of commands were needed to maximise the 640 KB of conventional memory to avoid “out of memory” errors for Windows ...
  29. [29]
    Guide to CONFIG.SYS & AUTOEXEC.BAT - The DOS PC nerd page
    * DOS will only directly access the first 640 kilobytes of memory. ... BAT, so it is essential to check that none of the drivers and TSR programs loaded from ...
  30. [30]
  31. [31]
    History of Microsoft MS-DOS CD-ROM Extensions (MSCDEX ...
    This article documents the changes in the Microsoft MS-DOS CD-ROM Extensions (MSCDEX) from version 2.1 to version 2.23.
  32. [32]
    Creative Labs - VOGONS Vintage Driver Library
    ... DOS & Windows 3.1 Driver ... Sound Blaster Pro MCV (CT5330) Driver disk #1, 1.32 MiB. 2015-09-05 02:29:43. Creative Labs. Sound Blaster Pro Volume Control TSR ...
  33. [33]
    Why HIMEM was implemented as a DOS driver and not a TSR
    Aug 15, 2024 · Had HIMEM been a TSR, you couldn't have drivers that used Extended Memory without conflicts, or (in later versions) load DOS itself in High ...<|separator|>
  34. [34]
    Changing threats, changing solutions: A history of viruses and ...
    Apr 14, 2008 · In the face of this threat antivirus vendors began to implement real-time protection. This meant developing TSR (Terminate and Stay Resident) ...<|separator|>
  35. [35]
    In the shadow of DOS: DESQView and DESQView/X - Techsplatter
    Nov 25, 2013 · Before DESQView, a program had to be programmed to be able to become a TSR. But with DESQView, any program can become a TSR. This allowed for ...Missing: MS- | Show results with:MS-
  36. [36]
  37. [37]
    XMSDSK conflicts and crashes DOS4GW (DOOM) if set over 15168 ...
    Oct 29, 2020 · This bug is not about doom or getting it to run. It is about a memory space overlap that seems to occur in certain scenarios.
  38. [38]
    FEB89: DEBUGGING TSR PROGRAMS - Jacob Filipp
    In this article, I'll briefly describe how TSR programs work, then talk about how you can debug them when things go wrong.Missing: GPF | Show results with:GPF
  39. [39]
    DOS TSRs | Vintage Computer Federation Forums
    Aug 10, 2008 · Has anybody out there written a DOS TSR? I'm looking for a tutorial or a good book to reference before I dig in. (I have a few that cover it ...Missing: Superkey | Show results with:Superkey
  40. [40]
    [PDF] ROM-DOS 6.22
    Jun 1, 1990 · The final example unloads SHARE and frees the used memory. SHARE /U. Page 177. ROM-DOS 6.22 Command Descriptions Š 167. SHELL. CONFIG.SYS.
  41. [41]
    [PDF] A to Z of C :: 27. TSR Programming
    TSR programs are the one which seems to terminate, but remains resident in memory. So the resident program can be invoked at any time.
  42. [42]
    The 640K memory limit of MS-DOS - XtoF's Lair
    Mar 9, 2018 · The 640K ceiling​​ With its 8088, the IBM PC could address up to 1 MiB of memory. A huge amount in 1981. This address space had to be shared ...
  43. [43]
    Under the Hood: Happy 10th Anniversary, Windows | Microsoft Learn
    In real mode, Windows 3.0 was not much more than a pretty GUI layer over MS-DOS. It was limited to using 640KB, plus whatever memory might be available via the ...
  44. [44]
    A quick look back at the launch of Windows NT 3.1, 30 years today
    Jul 27, 2023 · Among its prominent features were preemptive multitasking, multiprocessing, and multiuser support, which collectively elevated the standard of ...<|control11|><|separator|>
  45. [45]
    [PDF] Tracing Windows95 - UC Berkeley EECS
    The roles of. TSR programs have been replaced by virtual device drivers. Lee ... Windows95 uses a priority-based scheme to preemptively multi-task threads.
  46. [46]
    Why did "protected-mode MS-DOS" never happen?
    Jan 23, 2023 · DOS applications written using a DOS extender weren't DOS applications; they were applications written to the DOS extender's API. So even the ...How did the Sidekick TSR interfere with other programs? [closed]Why did the MS-DOS API choose software interrupts for its interface?More results from retrocomputing.stackexchange.comMissing: conflicts | Show results with:conflicts
  47. [47]
    Doing Windows, Part 7: Third Time's the Charm
    Aug 3, 2018 · When started on an 8088-class machine, or on any machine without memory beyond 640 K, Windows ran in “real mode.” When started on an 80286 with ...