home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / mslang / tsr4c / tech.txt < prev   
Text File  |  1994-02-02  |  26KB  |  622 lines

  1. ──────────────────────────────────────────────────────────────────
  2.                     CodeRunneR (R)
  3. ──────────────────────────────────────────────────────────────────
  4.            Omega Point, Inc.
  5.              25 Birch Road
  6.           Framingham, MA 01701
  7. ──────────────────────────────────────────────────────────────────
  8.         TEL:  (508) 877 - 1819
  9.         FAX:  (508) 877 - 0915
  10. ──────────────────────────────────────────────────────────────────
  11.  
  12.  
  13. CodeRunneR is a library and startup code for C programmers
  14. optimized for creating highly efficient and reliable TSRs
  15. (Terminate and Stay Resident programs). After four years as a
  16. commercial product and its use by thousands of professional
  17. developers, CodeRunneR has become de facto TSR standard and
  18. a synonym for small, fast and rock solid TSRs.
  19.  
  20. Here is what the experts say about CodeRunneR:
  21.  
  22.  
  23. ■      "the size of any program you develop with
  24.        CodeRunneR will astound you"
  25.  
  26. ■      "CodeRunneR will make your C TSRs smaller than
  27.        you could imagine"
  28.  
  29.                                Mark Davidson, Computer Language
  30.  
  31.  
  32. ■ "the cream of the crop"
  33.                                              Tom Swan, PC-World
  34.  
  35.  
  36. ■      "CodeRunneR not only solves problems, it inspires
  37.        new possibilities. It is destined for the Programmer's
  38.        Hall of Fame."
  39.  
  40.         Joe Campbell, Author of "C Programmer's Guide to 
  41.                      Serial Communications"
  42.  
  43.  
  44. ■      "CodeRunneR and its associated Professional
  45.        Developer's Kits are highly useful set of utilities that
  46.        open the difficult world of TSR programming to anyone
  47.        who can grasp the C language."
  48.  
  49. ■      "The video routines make saving and displaying
  50.        screen information a breeze"
  51.  
  52.                           R. Bradley Andrews, Dr. Dobbs Journal
  53.  
  54.  
  55. ■      "professional development tool that'll let you create
  56.        compact, fast TSRs"
  57.  
  58.                               Gary Entsminger, Micro Cornucopia
  59.  
  60.  
  61. ■      "Using the TSR template provided with CodeRunneR,
  62.        you can get your first TSR application up and
  63.        running in days instead of weeks."
  64.  
  65. ■      "one of the best BBS support lines I have seen yet.
  66.        The response time to the questions I posted on the
  67.        BBS was excellent."
  68.  
  69. ■      "The CodeRunneR product excels in its TSR
  70.        capabilities, coexistence with other DOS applications
  71.        and technical support."
  72.  
  73.                          Victor R. Volkman, The C Users Journal
  74.  
  75.  
  76.  
  77.  
  78.                      TIME SAVING FEATURES
  79. ──────────────────────────────────────────────────────────────────
  80.  
  81.  
  82. In addition to the top quality and unique capabilities of the code
  83. and the wide scope of the library, CodeRunneR package includes
  84. the following time and effort saving features:
  85.  
  86. ■      Quick Start templates and our PopFEATURE collection
  87.        (fully operational, useful TSRs with C source) will help
  88.        you create professional quality TSRs the first day. A
  89.        dozen useful TSRs with full source include expression
  90.        parsing calculators, calendar, text browser, ASCII chart,
  91.        keyboard decoder, stopwatch, terminal TSR with file
  92.        transfers, ...etc.
  93.  
  94. ■      On-Line Context-sensitive Hypertext Help (a TSR using
  95.        1.3K with LIM or 30K without LIM) has all CR functions
  96.        and variables cross-referenced and linked to related topics
  97.        as well as miscellaneous useful PC/AT technical facts.
  98.        The TSR allows cut & paste of code into a foreground
  99.        application.
  100.   
  101. ■      The printed documentation consists of a 300 page
  102.        Reference manual and a 60 page Quick Start manual. The
  103.        main reference includes a chapter on efficient C
  104.        programming covering 36 techniques for optimizing size
  105.        and speed of C programs. The Quick Start manual guides
  106.        you quickly through the how-to phase in a pragmatic
  107.        manner. It includes a chapter of the most often asked
  108.        questions with answers.
  109.  
  110. ■      The package also contains a large collection of tips and
  111.        discussions from the CodeRunneR Technical Support BBS
  112.        (spanning 3 years; over 800K of text). The collection is a
  113.        treasure of real life, practical problems and solutions, a
  114.        gold mine of ideas and strategies from hundreds of
  115.        programmers.
  116.  
  117. ■      Our In-Depth Technical support is unmatched in the
  118.        industry. You can discuss with our TSR experts topics
  119.        from strategies and algorithms for implementing your TSR
  120.        to tracking down difficult bugs and optimizing your TSR.
  121.  
  122. ■      You can call, FAX or leave technical questions/code on the
  123.        Tech Support BBS at any time (including weekends) and
  124.        they'll be addressed and resolved usually within hours from
  125.        the request. Registered users can download fixes and
  126.        updates from the BBS as soon as they are available (we
  127.        don't use phrase "known bug").
  128.  
  129. ■      CodeRunneR works with all major C compilers (TC, BC,
  130.        MSC, Watcom, Zortec).
  131.  
  132. ■      No royalties are required for the programs linked with
  133.        CodeRunneR and its associated add-on kits.
  134.  
  135. In addition to the main package, there are 3 Professional
  136. Developer's Kits (add-on) for specialized needs: PDK-1,2 and 3.
  137. For example PDK-1 has a background communications library,
  138. LIM access and ability to move TSRs to LIM, copy protection,
  139. print spooler,...etc.
  140.  
  141. Finally, there is an Advanced Developer's Kit ADK-1, a library
  142. for creating multi-application swappers. It includes PopSWAP, a
  143. fully functional software carousel-like TSR for fast swapping of up
  144. to 10 applications (easily extensible to any number).
  145.  
  146.  
  147.  
  148.                      TECHNICAL HIGHLIGHTS
  149. ──────────────────────────────────────────────────────────────────
  150.  
  151.  
  152. ■      CodeRunneR has over 300 functions hand crafted in pure
  153.        assembler for size and speed. The library is fully granular
  154.        so that only the used facilities are linked in.
  155.   
  156. ■      Our unique memory manager discards initialization code
  157.        and data before switching to resident mode. This means
  158.        that any signon/help screens, command line/file parsers,
  159.        set-up menus, ...etc. will not take any memory in TSR
  160.        mode. Similarly disposed are any library facilities used
  161.        only at load time such as startup code,
  162.        hardware/environment identification routines, non-
  163.        applicable video, keyboard, COM handlers ...etc.
  164.  
  165. ■      TSRs can use DOS/Networks safely. A set of efficient file
  166.        i/o and directory functions provides full DOS directory/file
  167.        access.
  168.  
  169. ■      The CodeRunneR task switcher supports execution of
  170.        multiple threads in resident or non-resident mode. Context
  171.        switching, stack allocation and thread entry control/locking
  172.        is handled automatically (with facilities to override the
  173.        defaults).
  174.  
  175. ■      TSR can define up to 256 simultaneous dynamic hotkeys,
  176.        which may include multikey combinations such as Ctrl-
  177.        Shift-Home. On extended keyboards the distinction can be
  178.        made between Left and Right Ctl (or Alt) keys as well as
  179.        between dedicated and non-dedicated cursor keys. The
  180.        hotkeys can be added, removed or redefined at any time
  181.        during TSR operation. The standard CodeRunneR header
  182.        allows external programs to examine and modify hotkeys
  183.        of a resident program.
  184.  
  185. ■      There are three different hotkey handlers: Hardware
  186.        level, BIOS level (for triggering TSR by other applications
  187.        via simulated hotkeys) and Timer-Hotkeys (for triggering
  188.        TSR with applications which take over the keyboard
  189.        exclusively). Any of the three handlers (or combination)
  190.        triggers TSR by calling user specified C function with a
  191.        hotkey value as a function argument.
  192.  
  193. ■      Two event schedulers are available: Tiny and Master
  194.        scheduler. The Tiny scheduler is small and highly 
  195.        efficient, useful for single event scheduling. The Master
  196.        scheduler allows any number of events to be scheduled and
  197.        pending simultaneously. When some event becomes due,
  198.        the TSR is triggered via a call to a specified C function
  199.        with the pointer to the event structure as an argument.
  200.  
  201. ■      Interrupt traps trigger user's C function when specified
  202.        software or hardware interrupts occur. The traps can be
  203.        added and removed in TSR mode. The hooked interrupts
  204.        are automatically restored when TSR unloads. The C
  205.        service function can examine and modify caller's CPU
  206.        registers (via structures) and in each trigger instance
  207.        specify whether to return to the caller (IRET) or pass
  208.        control to the original interrupt handler. An alternate
  209.        assembly language interrupt handler can be enabled if
  210.        necessary. A template for custom interrupt service in
  211.        assembler with an interface to CodeRunneR task switcher
  212.        is included.
  213.   
  214. ■      Very compact and accurate BCD floating point library
  215.        supports from 12 to 248 digits of precision and exponents
  216.        up to ±16383. It is ideal for business/financial
  217.        computations since it eliminates the fraction rounding
  218.        errors which are common with regular binary floating
  219.        point.
  220.  
  221. ■      Ultra compact video functions perform lightning fast
  222.        screen output. They automatically handle variable screen
  223.        sizes and different video adapters. Another rich set of
  224.        functions automates save and restore operation of screen
  225.        windows, cursor position and type, fonts, palette, RGB
  226.        colors, ...etc.
  227.  
  228. ■      Memory management functions support mixed far and
  229.        near allocation and allow full control of the amount of
  230.        memory which should remain resident. The compaction is
  231.        done before going resident to eliminate gaps between near
  232.        heap and stack as well as between the far heap and
  233.        compacted near heap.
  234.  
  235. ■      Stack diagnostic functions provide information about
  236.        resident stack use by different threads. This is helpful in
  237.        minimizing the stack use in the final stages of
  238.        development.
  239.  
  240. ■      Large number of functions cover all aspects of PC/AT
  241.        hardware, BIOS and DOS control, such as printers, COM
  242.        ports, sound, time, delays, old/new keyboards, key
  243.        stuffing, video, interrupt controllers, ...etc.
  244.  
  245. Please inquire about any features of interest which you didn't see
  246. listed in this brief overview.
  247.  
  248.  
  249.  
  250.                         PDK-1  Features
  251. ──────────────────────────────────────────────────────────────────
  252.  
  253.                      Serial Communications
  254.  
  255. The main part of PDK-1 is the interrupt driven serial
  256. communications library. Due to its compactness it is ideally suited
  257. for TSRs. Its speed makes it perfect for background, low
  258. overhead, communications.
  259.  
  260. ■      Support for multiple channels limited only by available
  261.        hardware. It can service cases from the single channel
  262.        single interrupt (IRQ) to the multichannel configurations
  263.        with separate or shared IRQs (with one or two interrupt
  264.        controllers). Also supported are two types of commercial
  265.        multiport boards (Digiboard type with base-2 ID and
  266.        Stargate type with bit-mask ID).
  267.  
  268. ■      Standard PC/AT UART 8250 and the high performance
  269.        FIFO 16550 are supported.
  270.  
  271. ■      Automatic or manual flow control (RTS/CTS, DTR/DSR,
  272.        XON/XOFF) is changeable at any time during operation.
  273.  
  274. ■      User's C function can be triggered in real time by any
  275.        conditions of the COM channel (modem status lines
  276.        change, ring, loss of carrier, errors, break, receive buffer
  277.        above critical mark, output buffer below critical mark,
  278.        ...etc).
  279.  
  280. ■      Buffered serial I/O provides several types of buffers, from
  281.        simple flat and circular buffers to chained buffers. With
  282.        chained buffers, the library interrupt handlers automatically
  283.        switch from one buffer to the next. This is very helpful
  284.        with packet protocols where the chained buffers perform
  285.        automatic separation of the packet envelope from its
  286.        content, greatly speeding up and simplifying the packet
  287.        merge/split functions.
  288.  
  289. ■      Several types of polled I/O, from the ultra fast streamlined
  290.        version to variations with built in timeouts.
  291.   
  292. ■      ANSI Terminal Emulator via a single functions
  293.        ansi_chr(). The TERM.C sample utilizes this function to
  294.        implement a tiny ANSI terminal emulator.
  295.  
  296. ■      Facilities to reduce system overhead (from other interrupt
  297.        sources) in time critical situations include quick handlers
  298.        for timer and keyboard interrupts and ability to increase
  299.        priority of COM interrupts at hardware level.
  300.  
  301. ■      Multitasking functions sleep() and awake() simplify
  302.        conversions of a straight non-background C code into a
  303.        multitasking code for background operation. The sleep()
  304.        suspends execution, freezing the state of the thread.
  305.        Subsequent awake() (which can be triggered by a
  306.        full/empty buffer, timeout or any other event source)
  307.        resumes original thread as if sleep() has just returned.
  308.  
  309. ■      Very fast and small checksum and CRC functions
  310.        (compatible with X/YMODEM protocols).
  311.  
  312. ■      Powerful HyperCOM program (C source included)
  313.        demonstrates many library features. It supports
  314.        XMODEM, YMODEM/BAT multifile background
  315.        transfers, logon scripts, dial directory, ANSI Terminal
  316.        emulator.
  317.  
  318.                           LIM Support
  319.  
  320. ■      LIM (EMS) detection and LIM API support.
  321.  
  322. ■      Mixed model functions convenient for operating on LIM
  323.        pages.
  324.  
  325. ■      TSR can move to LIM using a single call move_to_lim().
  326.        Code, Data or both can be moved. In all cases the move is
  327.        transparent to the C code. The library will retain in low
  328.        memory only the minimum interrupt handlers (such as
  329.        timer for schedulers, keyboard for hotkeys, DOS idle,...).
  330.        This leaves around 1K in low memory, the rest is in
  331.        LIM. When a trigger condition is detected by the low
  332.        memory handlers (event due, hotkey pressed, DOS became
  333.        idle), the LIM state is saved, the TSRs image is remapped
  334.        into the CPU address space and the control is passed to the
  335.        original interrupt handlers. Upon thread return the LIM
  336.        state is restored, so that the foreground applications can
  337.        safely use LIM. Any number of TSRs can be moved to
  338.        LIM, each leaving a small footprint in conventional
  339.        memory (or in high memory with QEMM, 386Max or
  340.        DOS 5 UMBs with 0K low memory overhead).
  341.  
  342.                         Print Spooling
  343.  
  344. ■      The printer trap buffers printer data and triggers a C
  345.        service function when buffer reaches a specified critical
  346.        level. 
  347.  
  348. ■      Special technique is used to allow DOS access (for buffer
  349.        flushing to a file) even when printing is done through DOS
  350.        (i.e. when DOS is "officially" busy).
  351.  
  352. ■      Data can be captured with or without passing them to the
  353.        printer. The LPT status returned to the foreground
  354.        application is fully customizable. All or just selected
  355.        printers can be monitored.
  356.  
  357.                 Registration & Copy Protection
  358.  
  359. PDK-1 includes registration facility designed for copy protection.
  360. The protection method works as follows: 
  361.  
  362. You make available to potential customers an unregistered version
  363. of your program as a demo copy with some features disabled.
  364. With the demo you include a User Register program UREG (C
  365. source included in PDK-1). If the user decides to buy your
  366. program s/he can call in and request an Unlock Code (asked by
  367. UREG). A sales person at your site runs Internal Register program
  368. IREG, fills in user name and company. The end user does same
  369. with  UREG. Based on this information the IREG will produce a
  370. unique number, the Unlock Code which the sales person tells the
  371. customer who enters it into the UREG's Unlock Code field. If the
  372. Unlock Code is valid UREG unlocks the primary application and
  373. simultaneously stores the encrypted user's name and company into
  374. some file from  your package. The application can check and
  375. display at convenient time this information which should
  376. discourage software pirating. 
  377.  
  378. Besides the functions for generating, checking and locating the
  379. valid Unlock Code, several functions are supplied for defeating
  380. debugging or patching by would-be pirates.
  381.  
  382.  
  383.  
  384.                         PDK-2 Features
  385. ──────────────────────────────────────────────────────────────────
  386.  
  387.  
  388. PDK-2 covers wider area of applications than PDK-1 or PDK-3,
  389. containing the facilities developers have often asked for.
  390.  
  391.                       EXE Merge Facility
  392.  
  393. ■      Multiple EXE files are merged into a single EXE file. Each
  394.        member EXE file can switch over to another one with a
  395.        single call. The calling member EXE is discarded from the
  396.        memory and the new member EXE is spawned. This
  397.        facility is useful when there are several variations of a
  398.        program or when there is a setup program plus one or
  399.        more main executables. The EXE Merge packages all
  400.        programs into a single EXE file which greatly simplifies
  401.        consistent updates and installation by end users.
  402.  
  403.                           Spawn Over
  404.  
  405. This facility allows programs to spawn another application by
  406. swapping themselves to XMS, EMS or disk. Only a 1.4K
  407. footprint is left from the parent process. Upon exit of the child
  408. program, the parent program is restored.
  409.  
  410. ■      To gain speed only the minimum necessary swapping is
  411.        done. Depending on the size of child program
  412.        spawn_over() will first try to utilize any free memory. If
  413.        that isn't sufficient it compacts the parent program (free
  414.        heap/stack space) and only if that isn't enough it swaps out
  415.        the minimum necessary parts of the parent program.
  416.  
  417. ■      Parent program can designate section of memory as shared
  418.        with the child program. This memory is not swapped out
  419.        and it can be accessed by the spawned program for fast
  420.        two-way information exchange.
  421.  
  422.                           XMS Support
  423.  
  424. ■      XMS API allows access to extended memory. The
  425.        functions are similar to LIM support in PDK-1.
  426.  
  427. ■      XMS functions will also enhance the swappers in PDK-3
  428.        and ADK-1 for swapping graphics state and foreground
  429.        applications to XMS. Except for the initial XMS presence
  430.        check and xms_alloc() call, the rest is transparent to the
  431.        C code (handled internally by the swappers).
  432.  
  433. ■      Official XMS specifications are included in the PDK-2
  434.        manual.
  435.  
  436.                 Keyboard Stuffing & Monitoring
  437.  
  438. ■      TSRs can feed scan codes directly to hardware so they
  439.        are indistinguishable from the real keys, even by
  440.        applications which read hardware directly. This feature is
  441.        available only on PS/2 and better AT clones (such as
  442.        Compaq). A software emulation is provided for machines
  443.        lacking this capability (detection included).
  444.  
  445. ■      High speed key feeding (at BIOS level) with a mechanism
  446.        to handle applications which flush keyboard between keys
  447.        received.
  448.  
  449. ■      Embedded command codes automate setting of keyboard
  450.        flags (Shift, Ctl,..) without requiring special attention from
  451.        C code.
  452.  
  453. ■      C service function can be awakened when the output string
  454.        has been passed to the foreground application.
  455.  
  456. ■      A C function can watch all keystrokes and decide on
  457.        action: pass, remove or substitute the keys typed.
  458.  
  459.                     Time Slicing Functions
  460.  
  461. ■      Function wait(N) suspends current thread for N timer ticks.
  462.        The control returns either when N ticks have expired or
  463.        when another thread calls wait_done().
  464.  
  465. ■      Function waitfor() is similar to wait() except that it also
  466.        supplies a pattern and the address (such as video memory).
  467.        The thread is awakened when either time expires or the
  468.        pattern appears at specified location. This is useful for
  469.        programs which control other applications (such as
  470.        automated testers, screen data grabbers) where the TSR
  471.        stays idle until some prompt occurs on the screen.
  472.  
  473.                       Far Call Interface
  474.  
  475. This facility is similar to software traps except that it allows
  476. external programs to call into TSR (without using interrupts) and
  477. to activate a TSR.
  478.  
  479.                          Traps to LIM
  480.  
  481. The TSRs which use move_to_lim() facilities cannot set interrupt
  482. vectors to point into LIM since the TSR image in LIM can get
  483. swapped out by other applications. The PDK-2 ltrap facility allows
  484. interrupt trapping by setting up an indirect handler in low
  485. memory which handles LIM state saving/restoring and TSR
  486. triggering.
  487.  
  488.                   Utilizing System Idle Time
  489.  
  490. Functions idle_on() and idle_off() allow TSRs which need to do
  491. time consuming processing in the background (e.g. printing) to
  492. utilize system idle time. Whenever system is idle the specified C
  493. service function is called with high frequency.
  494.  
  495.                       Dual Monitor Access
  496.  
  497. This set of functions allow CodeRunneR video functions to operate
  498. on a selected monitor on systems with two monitors. The selection
  499. can be changed at any time.
  500.  
  501. ■      Automatic screen overflow handler can redirect data
  502.        scrolled off at the top of the primary monitor to the bottom
  503.        of the secondary monitor.
  504.  
  505. ■      A useful sample program DMON demonstrates dual
  506.        monitor functions. It can clone parts of the screen from the
  507.        primary to the secondary monitor.
  508.  
  509.  
  510.  
  511.                         PDK-3 Features
  512. ──────────────────────────────────────────────────────────────────
  513.  
  514.  
  515. With PDK-3 you can, in less than an hour, turn any application
  516. (graphics & floating point, too) into a TSR taking only 1.5K of
  517. RAM without any modifications to the application. You can also
  518. use PDK-3 for non-TSR applications which are too large to fit in
  519. 640K: a tiny TSR (1.5K) loads temporarily before your main
  520. application and serves as a swapper between several large
  521. components of the main application.
  522.  
  523. PDK-3 performs its magic via the in-depth support for spawning
  524. applications from the TSR, swapping TSR or foreground
  525. application and swapping graphics. The TSR can spawn another
  526. application in several ways: by swapping foreground application to
  527. disk, LIM or XMS, by swapping itself, by remapping LIM pages,
  528. by using unused space from COMMAND.COM when at DOS
  529. prompt.
  530.  
  531. ■      Graphics swapping allows pop-up over graphics
  532.        application. All major video adapters are supported
  533.        (Hercules, CGA, MCGA, EGA, S/VGA). The graphics
  534.        image can be swapped to disk, LIM or XMS.
  535.  
  536. ■      Mouse API is supported including interrupt driven
  537.        triggers on mouse events (movement, button clicks or
  538.        Shift, Alt, Ctl + button clicks).
  539.  
  540. ■      Mouse, graphics, math coprocessor, ... can be used by
  541.        spawned programs without interfering with their use by
  542.        foreground applications.
  543.  
  544. ■      Three fully operational spawn templates are supplied.
  545.        They allow building your custom spawner by few simple
  546.        changes in the header files (to set-up application name,
  547.        memory size, graphics use and swap medium).
  548.  
  549. The swapping to LIM (XMS) requires PDK-1 (PDK-2)
  550. respectively. The swap functions handle different swap media
  551. transparently to C code.
  552.  
  553.  
  554.  
  555.                         ADK-1 Features
  556. ──────────────────────────────────────────────────────────────────
  557.  
  558.  
  559. The Advanced Developers Kit ADK-1 contains very powerful
  560. multi-application swapping capabilities. Multiple (graphics)
  561. applications can be suspended, saved  (to disk, EMS or XMS) then
  562. restored and resumed at any time from within the TSR. Any
  563. CodeRunneR trigger mechanisms can be used to initiate the
  564. switch (hotkeys, timer, interrupts from applications, phone ring,
  565. ...etc).
  566.  
  567. ■      The ADK-1 C interface is very simple, just few powerful
  568.        functions: app_start(), app_suspend(), app_resume(). Yet
  569.        it allows full dynamic customization via APP_CTL and
  570.        SWAP_CTL structures.
  571.  
  572. ■      For speed, only the minimum necessary swapping is
  573.        done. The use of available swap media (disk, EMS, XMS)
  574.        can be dynamically adapted and mixed within the same
  575.        swap operation for optimum performance. The resulting
  576.        swapping is 2-3 times faster than with the DOS 5 swapper
  577.        DOSSHELL. Yet the ADK-1 sample swapper PopSWAP
  578.        is three times smaller than DOSSHELL (or 30 times if
  579.        LIM is available).
  580.  
  581. ■      Generic I/O functions allow uniform access to files, EMS
  582.        or XMS, with each media presented as a linear read/write
  583.        space addressable via single 32-bit pointer. Read/Write
  584.        blocks can be any size (the 32-bit read/write count is
  585.        used).
  586.  
  587. ■      Full source for all ADK-1 library functions (ASM) is
  588.        included.
  589.  
  590.  
  591.  
  592.                        PRICE & ORDERING
  593. ──────────────────────────────────────────────────────────────────
  594.  
  595.  
  596. The prices for CodeRunneR and the add-on kits are:
  597.  
  598.        CodeRunneR                              $ 195
  599.        PDK-1, 2 or 3                           $  99
  600.        CodeRunneR + 3 PDKs                  $ 429
  601.        ADK-1                                   $ 995
  602.  
  603. For US orders add $5 for regular shipping, $10 for 2nd day or $15
  604. for next day delivery. For Canada add $10 for Air Mail or $50 for
  605. FEDEX. For other countries add $25 for Air Mail. Alternatively
  606. provide your FEDEX number to be used for shipping. On
  607. international orders we accept VISA, MasterCard, AMEX (please
  608. include card number & exp. date) or a bank check in US funds
  609. (prepaid).
  610.  
  611. ──────────────────────────────────────────────────────────────────
  612.             Omega Point, Inc.
  613.               25 Birch Road
  614.                Framingham, MA 01701
  615.  
  616.             TEL:  (508) 877 - 1819
  617.             FAX:  (508) 877 - 0915
  618. ──────────────────────────────────────────────────────────────────
  619.  
  620.  
  621.  
  622.