home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / hrtx11r0.zip / DOCS / MANUAL.INF (.txt) < prev   
OS/2 Help File  |  2001-06-29  |  36KB  |  1,133 lines

  1.  
  2. ΓòÉΓòÉΓòÉ 1. Document and driver version ΓòÉΓòÉΓòÉ
  3.  
  4. This document is valid for the following version of the Extended 
  5. High-Resolution Timer driver. 
  6.  
  7.  Version:            1.1r01 
  8.  Build level:        195 
  9.  
  10.  
  11. ΓòÉΓòÉΓòÉ 2. IMPORTANT. Please read before using this driver ΓòÉΓòÉΓòÉ
  12.  
  13. Extended High-Resolution Timer driver set 
  14.  
  15. Copyright (C) 2000-2001 Dr J A Gow. 
  16.  
  17. IMPORTANT 
  18.  
  19.  PLEASE NOTE:                  This release is a PUBLIC RELEASE. This driver or 
  20.                                any of its components may not be redistributed 
  21.                                in whole or in part, and IN ANY FORM, without 
  22.                                the express written authorization of the author. 
  23.  
  24.  DISCLAIMER:                   While I have taken every care to ensure that 
  25.                                each release is reasonably stable, this 
  26.                                program/s are DEVICE DRIVERS and as such run 
  27.                                wholly or partially at Ring-0, the most 
  28.                                privileged level. There may be unforseen 
  29.                                situations in which failure could result in (but 
  30.                                not limited to) a kernel trap with possible data 
  31.                                loss. It is therefore advised that this software 
  32.                                is not used with machines upon which life 
  33.                                depends, or in applications which require 100% 
  34.                                availability. No liability whatsoever can be 
  35.                                accepted by the author for any loss of data, 
  36.                                machine damage etc. resulting from the use or 
  37.                                abuse of this software. 
  38.  
  39.  WARRANTIES:                   No warranties, explicit or implied, are provided 
  40.                                for this driver. It is used entirely at your own 
  41.                                risk. 
  42.  
  43.  TECHNICAL SUPPORT:            Limited non-chargeable technical support for 
  44.                                this driver is available via email ONLY and at 
  45.                                the discretion of the author. This facility may 
  46.                                be withdrawn at any time without notice. 
  47.  
  48.  PLEASE READ ALL DOCUMENTATION BEFORE USING THIS DRIVER 
  49.  
  50.  
  51. ΓòÉΓòÉΓòÉ 2.1. Beta versions ΓòÉΓòÉΓòÉ
  52.  
  53. If you are an authorized recipient of beta versions, and this is such a 
  54. version, then further important information may be found in the file 
  55. BETANOTE.INF, if present.  News! 
  56.  
  57.  
  58. ΓòÉΓòÉΓòÉ 2.2. Future releases ΓòÉΓòÉΓòÉ
  59.  
  60. Starting with the next major release number (V2.0), HRTX will be opensource. 
  61. This will allow time for completion of the direct timer-VDD interface and to 
  62. allow for exhaustive testing prior to release of the source. It should be noted 
  63. that once the source is released, I will only be supporting 'official' 
  64. versions. If you have modified the source, and those modifications are not part 
  65. of the 'official' source tree, then support will not be forthcoming. 
  66.  
  67. Terms and conditions of use of the source code will be issued with the source 
  68. archive once it becomes available. 
  69.  
  70.  
  71. ΓòÉΓòÉΓòÉ 3. Versioning ΓòÉΓòÉΓòÉ
  72.  
  73. IT IS EXTREMELY IMPORTANT not to mix versions of the components of this driver, 
  74. or unpredictable results may occur. There is a utility supplied with the driver 
  75. set called VERSION. To display the version of any component of all releases of 
  76. this driver, simply use the command VERSION <filename>, where the <filename> is 
  77. the filename of the component you wish to check. Version number, build ID and 
  78. component name will be displayed. If a message 'No version information in this 
  79. file' is displayed you probably are running VERSION against the original 
  80. TIMER0.SYS or CLOCK01.SYS, or if unlucky have a corrupted file. 
  81.  
  82. Note: Compatibility has been fully retained in CLOCK01.SYS. The new CLOCK01.SYS 
  83. is fully compatible with the original TIMER0.SYS and will cause no ill-effects 
  84. in such an arrangement. If the new TIMER0.SYS is used in conjunction with the 
  85. old CLOCK01.SYS however, the high resolution timer driver will simply not work. 
  86. Neither configuration will result in a system trap. 
  87.  
  88.  
  89. ΓòÉΓòÉΓòÉ 4. Files in archive ΓòÉΓòÉΓòÉ
  90.  
  91.  ChangeLog.txt                           Contains changes made with different 
  92.                                          builds 
  93.  README.TXT                              Important breaking information 
  94.  MANUAL.INF                              The user-manual for this driver (this 
  95.                                          file) 
  96.  
  97.  
  98. ΓòÉΓòÉΓòÉ 5. Overview ΓòÉΓòÉΓòÉ
  99.  
  100. The Extended High-Resolution Timer driver set is intended as a general 
  101. replacement for the TIMER0.SYS and CLOCK01.SYS shipped with OS/2 Warp V4. It 
  102. may also work with Warp V3, but this has not been tested. 
  103.  
  104.  
  105. ΓòÉΓòÉΓòÉ 5.1. Design objectives ΓòÉΓòÉΓòÉ
  106.  
  107. This driver set was written to overcome a major problem with the TIMER0.SYS 
  108. high-resolution timer driver that is shipped with Warp 4 and higher. 
  109.  
  110. In the original TIMER0.SYS, the hardware counter-0 is used to provide a 
  111. free-running counter generating interrupts at 1ms resolution. To do this it 
  112. must effectively detach counter-0 from DOS VDMs as DOS also makes use of 
  113. counter-0 to generate its timer tick interrupt. Owing to the possible demands 
  114. of VDMs to require direct access to counter-0, it becomes necessary to deny 
  115. them access to counter-0 while a TIMER0.SYS client is active. It is thus 
  116. impossible for VDMs to receive timer-tick interrupts while TIMER0 is in use. 
  117. This has ramifications for most DOS (and hence WinOS/2) MIDI programs where the 
  118. generic WinOS/2 audio and Soundblaster emulation interface is concerned as this 
  119. interface will not work in conjunction with any OS/2 audio MIDI PDD that uses 
  120. TIMER0. Once the OS/2 audio MIDI PDD is opened, TIMER0 is opened and VDMs no 
  121. longer receive timer tick interrupts - so the DOS or WinOS/2 MIDI player 
  122. running in the session no longer has any timing info and can no longer send 
  123. data. RTMIDI uses TIMER0 and suffers from the same limitation. 
  124.  
  125. To fix this, it is necessary to find an alternative to the use of counter-0 for 
  126. the generation of the high-resolution timer interrupts. VDMs hit counter-0 
  127. directly, with access mediated by VTIMER.SYS, and DOS sets the timer frequency 
  128. on boot. 
  129.  
  130. There are, however, two timer-based interrupts available in an OS/2 system. One 
  131. is the counter-0 interrupt discussed previously. The second is the periodic 
  132. interrupt generated by the real-time clock hardware and handled in CLOCK01.SYS. 
  133. This interrupt handler is responsible both for updating some of the timer-based 
  134. kernel variables, and also for providing callbacks to the kernel at 8Hz and 
  135. 32Hz. The kernel uses these to aid in process scheduling. 
  136.  
  137. It is possible to change the rate of the RTC interrupt. However, it is not 
  138. possible to change this to exactly 1ms. The 8Hz/32Hz kernel callback rates 
  139. should be preserved - it is thus possible to reprogram the RTC to generate 
  140. interrupts at 1024Hz, a convenient multiple of 32 and 8Hz. Modifications to the 
  141. RTC interrupt handler allow the system millisecond count to now be updated more 
  142. frequently while preserving the kernel callback rates. Furthermore, the IRQ 
  143. thread can be redirected into a new TIMER0.SYS which can provide 1/1024Hz 
  144. resolution or via a simple resampling technique, 1ms resolution. 
  145.  
  146.  
  147. ΓòÉΓòÉΓòÉ 5.2. Architecture of the new driver set ΓòÉΓòÉΓòÉ
  148.  
  149. The new driver set consists of two components. The first of these is a modified 
  150. CLOCK01.SYS. The second is a replacement TIMER0.SYS built from the ground up. 
  151.  
  152.  
  153. ΓòÉΓòÉΓòÉ 5.2.1. CLOCK01.SYS ΓòÉΓòÉΓòÉ
  154.  
  155.  CLOCK01.SYS 
  156.  
  157. This driver has been updated and the RTC interrupt code modified as described 
  158. in  the design objectives  and a small number of improvements made to the 
  159. structure of the code to clean it up somewhat. A protocol has been added to 
  160. allow communication between the new TIMER0.SYS and CLOCK01.SYS. Note, however, 
  161. that all existing communications mechanisms have been retained in the modified 
  162. CLOCK01.SYS, and the original TIMER0.SYS will work with the new CLOCK01.SYS in 
  163. the original manner (i.e. without the fix). 
  164.  
  165.  
  166. ΓòÉΓòÉΓòÉ 5.2.2. CLOCK02.SYS ΓòÉΓòÉΓòÉ
  167.  
  168.  CLOCK02.SYS 
  169.  
  170. An updated CLOCK02.SYS has not been developed and is not included in this 
  171. release. It is believed that this driver only supports some legacy hardware 
  172. (Microchannel machines). However, if you need it then please contact me and let 
  173. me know. If enough people require it then I will update this as well. 
  174.  
  175.  
  176. ΓòÉΓòÉΓòÉ 5.2.3. TIMER0.SYS ΓòÉΓòÉΓòÉ
  177.  
  178.  TIMER0.SYS 
  179.  
  180.  The new TIMER0.SYS included in this package has been written from the 
  181. ground-up as a new implementation of the high-resolution timer and is not based 
  182. upon the original TIMER0.SYS. It does not affect the VDM timer, and provides up 
  183. to ten virtual independent timers which can individually support resolutions of 
  184. 1/1024s or 1ms resampled. 
  185.  
  186. It supports two different API models: compatibility model and extended model. 
  187. In the first model full compatibility is retained with the original TIMER0, and 
  188. TIMER0 clients will not need modification to work with the new TIMER0. The 
  189. second model can co-exist with the first and provides a handle-based API to the 
  190. virtual independent timers accessible in any execution context.  Coming soon 
  191.  
  192.  Direct timer access from a VDD will be available from version 2.0. This will 
  193. allow a VDD to directly access the extended API by opening TIMER0 for IDC, 
  194. without requiring a second PDD to arbitrate the access. 
  195.  
  196.  
  197. ΓòÉΓòÉΓòÉ 6. System Requirements ΓòÉΓòÉΓòÉ
  198.  
  199. OS/2 Warp 4 or higher is required, preferably on a Pentium class system. There 
  200. is some speculation that the driver may also work on Warp 3 with a fixpack 
  201. applied, but this has not been tested. 
  202.  
  203.  
  204. ΓòÉΓòÉΓòÉ 7. Installation ΓòÉΓòÉΓòÉ
  205.  
  206. To install this driver, follow the sequence outlined below. 
  207.  
  208.    1. With the archive unpacked into a suitable directory, execute 'ddinstal' 
  209.       from a command prompt, or select 'System Setup' -> 'Install/Remove' -> 
  210.       'Device Driver Install' 
  211.  
  212.    2. Select the source directory as the path into which this archive was 
  213.       unpacked. Then select the destination directory as 'C:' 
  214.  
  215.    3. Select 'Install', then from the list box 'Extended High-Resolution Timer 
  216.       Driver' 
  217.  
  218.    4. The driver will then be installed. Reboot to complete the process. 
  219.  
  220.    5. If you are a developer and wish to code for the new HRTX API, then copy 
  221.       the HRTX.H file to a directory in your INCLUDE path, or point your 
  222.       compiler at the location where you expanded the zipfile. 
  223.  
  224.  
  225. ΓòÉΓòÉΓòÉ 8. Application support and programming guide ΓòÉΓòÉΓòÉ
  226.  
  227. As stated previously , the new HRT supports two API models. In the first model, 
  228. known as the compatibility API, full compatibility is maintained with the 
  229. original TIMER0 HRT. Existing HRT clients will not need rewriting in any way in 
  230. order to use the new timer. However, some enhancements have been made to this 
  231. API which extend its usefulness. 
  232.  
  233. The second model, known as the enhanced API, is radically different. It is a 
  234. handle-based approach supporting individual timers, each of which can be 
  235. considered to be an entity in itself. Changes may be made to an individual 
  236. timer referenced by its handle without disrupting or affecting the operation of 
  237. other timers. Multiple processes and threads may use independent timers 
  238. simulataneously, or may share a timer provided the handle is known. It is also 
  239. possible to access the timer in any execution context - there is no 
  240. restrictions placed upon threads running in an interrupt context when using 
  241. this extended API. The extended API is similar in both ring 0 and ring 3 
  242. providing a uniform interface to both device drivers and user-mode 
  243. applications. 
  244.  
  245. Details of the interface are given in this section. 
  246.  
  247.  
  248. ΓòÉΓòÉΓòÉ 8.1. Include file. ΓòÉΓòÉΓòÉ
  249.  
  250. Unlike the original HRT, which presented two distinct include files for ring-3 
  251. and ring-0 operation, the extended HRT presents a single unified include file 
  252. for use in either context (HRTX.H). If it is intended to write code for use 
  253. with the compatibility API alone, then it is perfectly feasible to use the 
  254. original HRT include files. These, however will not permit ready access to the 
  255. extended API. 
  256.  
  257.  
  258. ΓòÉΓòÉΓòÉ 8.2. Compatibility API ΓòÉΓòÉΓòÉ
  259.  
  260. For a detailed reference to the operation of the compatibility API, please 
  261. refer to the 'MMPM/2 Device Driver Programmer's Reference'. However, if the new 
  262. combined include file is to be used to develop new source, it should be noted 
  263. that some IOCtl and IDC function references have different names to those used 
  264. in the original. A list of the compatibility API functions may be found below. 
  265.  
  266. The extended HRT additionally brings some important enhancements to the 
  267. compatibility API. These are also detailed below 
  268.  
  269.  
  270. ΓòÉΓòÉΓòÉ 8.2.1. Function list and cross-reference - ring 3 ΓòÉΓòÉΓòÉ
  271.  
  272. The following functions are available in the compatibility API for access from 
  273. ring-3 processes via IOCtls 
  274.  
  275.  
  276. ΓòÉΓòÉΓòÉ 8.2.1.1. IOCtl category ΓòÉΓòÉΓòÉ
  277.  
  278. All IOCtls are issued under the category HRTXIOCTL_CATEGORY (0x80). 
  279.  
  280.  
  281. ΓòÉΓòÉΓòÉ 8.2.1.2. Ring-3 usage issues and enhancements ΓòÉΓòÉΓòÉ
  282.  
  283. The usage from ring-3 of the compatibility API is identical to that of the 
  284. original HRT. Some enhancements have been made to the functionality, and these 
  285. are discussed below. 
  286.  
  287.  
  288. ΓòÉΓòÉΓòÉ 8.2.1.3. HRTXIOCTL_QUERYVERSION ΓòÉΓòÉΓòÉ
  289.  
  290.  Identifier:         HRTXIOCTL_QUERYVERSION 
  291.  
  292.  Context:            N/A 
  293.  
  294.  Parameter packet:   unused 
  295.  
  296.  Data packet:        (ULONG) Composite version code is returned herein 
  297.  
  298.  Description:        Returns a composite version code using the same structure 
  299.                      as defined in the original HRT. The macros presented in 
  300.                      the original include files for splitting the composite 
  301.                      version code up into its components are also present in 
  302.                      HRTX.H. 
  303.  
  304.  
  305. ΓòÉΓòÉΓòÉ 8.2.1.4. HRTXIOCTL_GETRESOLUTION ΓòÉΓòÉΓòÉ
  306.  
  307.  Identifier:         HRTXIOCTL_GETRESOLUTION 
  308.  
  309.  Context:            N/A 
  310.  
  311.  Parameter packet:   unused 
  312.  
  313.  Data packet:        (ULONG) Resolution is returned in this ULONG 
  314.  
  315.  Description:        This IOCtl returns the resolution of the timer attached to 
  316.                      the current process. This will be a value of 1 (1ms - 
  317.                      default) or -1 (1/1024Hz). 
  318.  
  319.  
  320. ΓòÉΓòÉΓòÉ 8.2.1.5. HRTXIOCTL_SETRESOLUTION ΓòÉΓòÉΓòÉ
  321.  
  322.  Identifier:         HRTXIOCTL_SETRESOLUTION 
  323.  
  324.  Context:            N/A 
  325.  
  326.  Parameter packet:   (ULONG) Resolution to set 
  327.  
  328.  Data packet:        unused 
  329.  
  330.  Description:        Sets the resolution of the timer attached to the current 
  331.                      process. Note that setting this resolution will only 
  332.                      affect this specific timer. Other processes using the 
  333.                      extended HRT will be unaffected as each timer is 
  334.                      encapsulated. The resolution can be 1 (1ms - default) or 
  335.                      -1 (1/1024Hz). Any other value will cause HRTXERR_BADPARAM 
  336.                      to be returned. 
  337.  
  338.  
  339. ΓòÉΓòÉΓòÉ 8.2.1.6. HRTXIOCTL_GETPOINTER ΓòÉΓòÉΓòÉ
  340.  
  341.  Identifier:         HRTXIOCTL_GETPOINTER 
  342.  
  343.  Context:            N/A 
  344.  
  345.  Parameter packet:   unused 
  346.  
  347.  Data packet:        (FAR16) A FAR16 pointer to the timer count variable will 
  348.                      be placed here 
  349.  
  350.  Description:        Returns a FAR16 pointer to the timer count variable of the 
  351.                      timer attached to the current process. This pointer is in 
  352.                      the LDT tiled region and the process may use a macro such 
  353.                      as SelToFlat to flatten it prior to use. The memory that 
  354.                      this region addresses is guaranteed to be valid, even 
  355.                      after the timer attached to this process has been 
  356.                      deregistered (although its contents are not guaranteed to 
  357.                      be specific after this time). Changes to this timer count 
  358.                      variable will not affect timers used by other processes, 
  359.                      or other timers registered using the extended API. 
  360.  
  361.  
  362. ΓòÉΓòÉΓòÉ 8.2.1.7. HRTXIOCTL_FREEPOINTER ΓòÉΓòÉΓòÉ
  363.  
  364.  Identifier:         HRTXIOCTL_FREEPOINTER 
  365.  
  366.  Context:            N/A 
  367.  
  368.  Parameter packet:   unused 
  369.  
  370.  Data packet:        unused 
  371.  
  372.  Description:        This API is provided for compatibility only. It does 
  373.                      absolutely nothing and changes no aspect of the timer. 
  374.  
  375.  
  376. ΓòÉΓòÉΓòÉ 8.2.1.8. HRTXIOCTL_BLOCKUNTIL ΓòÉΓòÉΓòÉ
  377.  
  378.  Identifier:         HRTXIOCTL_BLOCKUNTIL 
  379.  
  380.  Context:            N/A 
  381.  
  382.  Parameter packet:   (ULONG) Time to wait for. 
  383.  
  384.  Data packet:        unused 
  385.  
  386.  Description:        A thread calling this API will block for the number of 
  387.                      timer ticks (1ms per tick for RESOLUTION=1, (1/1024)ms per 
  388.                      tick for RESOLUTION=-1). This function is reentrant and a 
  389.                      maximum of ten threads per timer may be blocked at any one 
  390.                      time. Zero is a valid amount of time to wait; in this case 
  391.                      the thread will not block at all. 
  392.  
  393.  
  394. ΓòÉΓòÉΓòÉ 8.2.2. Function list and cross-reference - ring 0 ΓòÉΓòÉΓòÉ
  395.  
  396. The following functions are available in the compatibility API for access from 
  397. device drivers. 
  398.  
  399.  
  400. ΓòÉΓòÉΓòÉ 8.2.2.1. Ring-0 usage issues and enhancements ΓòÉΓòÉΓòÉ
  401.  
  402. The usage from ring-0 of the compatibility API is identical to that of the 
  403. original HRT. Some major enhancements have been made to the functionality, and 
  404. these are discussed below. 
  405.  
  406. To attach to the extended HRT, just issue a DevHelp_AttachDD with the name 
  407. string as 'TIMER0$ '. This will return an entry point with the following 
  408. prototype. 
  409.  
  410. int (_far _loadds _cdecl *FPFNHRTXIDC)(int Command, ULONG Parm1, ULONG Parm2)
  411.  
  412. to which calls should be directed. Note that C calling convention dictates that 
  413. the caller should clean up the argument list on the stack. 
  414.  
  415.  
  416. ΓòÉΓòÉΓòÉ 8.2.2.2. HRTXIDC_REGISTER ΓòÉΓòÉΓòÉ
  417.  
  418.  Identifier:         HRTXIDC_REGISTER 
  419.  
  420.  Context:            Task, IRQ (NOT INIT) 
  421.  
  422.  Parm1:              (FAR16) Address of callback function, to which the 
  423.                      extended HRT calls after the time specified in the second 
  424.                      parameter. The prototype for the callback function is: 
  425.  
  426.                                           void (_far _loadds *FPFNHRTXCALLBACK)(void);
  427.  
  428.  Data packet:        (ULONG) Number of timer ticks between callbacks 
  429.  
  430.  Description:        Registers the use of a timer to the current process. Note 
  431.                      that if called on an IRQ thread, then it is only permitted 
  432.                      to modify the callback interval of an existing timer, not 
  433.                      to register a new one (behaves identically to the original 
  434.                      HRT in this respect). This is due to the inability to 
  435.                      relate the timer to a specific process at IRQ time. 
  436.                      However, it is worth noting that the handle based extended 
  437.                      API allows full access to the timers from an interrupt 
  438.                      thread, including registration and deregistration. 
  439.  
  440.  
  441. ΓòÉΓòÉΓòÉ 8.2.2.3. HRTXIDC_DEREGISTER ΓòÉΓòÉΓòÉ
  442.  
  443.  Identifier:         HRTXIDC_DEREGISTER 
  444.  
  445.  Context:            Task only (NOT INIT or IRQ) 
  446.  
  447.  Parm1:              (FAR16) Address of callback function, to which the 
  448.                      extended HRT calls after the time specified in the second 
  449.                      parameter. The prototype for the callback function is: 
  450.  
  451.                                           void (_far _loadds *FPFNHRTXCALLBACK)(void);
  452.  
  453.  Data packet:        unused 
  454.  
  455.  Description:        Deregisters the timer attached to the current process. 
  456.                      With the compatibility API this may not be done on an IRQ 
  457.                      thread owing to the inability to determine the process 
  458.                      that owns the timer requiring deregistration. However, it 
  459.                      is worth noting that the handle based extended API allows 
  460.                      full access to the timers from an interrupt thread, 
  461.                      including registration and deregistration. 
  462.  
  463.  
  464. ΓòÉΓòÉΓòÉ 8.2.2.4. HRTXIDC_GETPOINTER ΓòÉΓòÉΓòÉ
  465.  
  466.  Identifier:         HRTXIDC_GETPOINTER 
  467.  
  468.  Context:            Task only (NOT INIT or IRQ) 
  469.  
  470.  Parm1:              (FPFAR16) FAR16 address of a location to receive the FAR16 
  471.                      pointer to the timer count variable. 
  472.  
  473.  Data packet:        unused 
  474.  
  475.  Description:        Returns a FAR16 pointer to the timer count variable of the 
  476.                      timer attached to the current process. The memory that 
  477.                      this pointer addresses is guaranteed to be valid, even 
  478.                      after the timer attached to this process has been 
  479.                      deregistered (although its contents are not guaranteed to 
  480.                      be specific after this time). Changes to this timer count 
  481.                      variable will not affect timers used by other processes, 
  482.                      or other timers registered using the extended API. 
  483.  
  484.  
  485. ΓòÉΓòÉΓòÉ 8.3. Extended API ΓòÉΓòÉΓòÉ
  486.  
  487. The Extended API introduces a new model for access to the extended HRT. It is a 
  488. handle-based model, where if the handle to a timer is known then this timer may 
  489. be accessed from any context. However, changes to one timer will not affect 
  490. other timers used elsewhere. The extended HRT supports up to ten concurrent 
  491. timers. 
  492.  
  493. The API consists of a single set of functions, mirrored in ring-3 and ring-0. 
  494. The same functions may thus be accessed in the same manner from applications 
  495. and device drivers, with the exception of callback functions which only have 
  496. meaning in ring-0. A function is also provided to link the compatibility API 
  497. with the extended API by returning the handle to the timer owned by the current 
  498. process and registered through the compatiblity API (e.g. through opening the 
  499. driver with DosOpen). This way timers created using the compatibility API may 
  500. be accessed using the extended API, allowing existing clients to be enhanced 
  501. and developed without having to rewrite sections of code. 
  502.  
  503. Identifiers of the extended API conform to the following pattern: 
  504.  
  505.  IOCtl:    HRTXIOCTL_X_ccccccccc 
  506.  
  507.  IDC:      HRTXIDC_X_ccccccccc 
  508.  
  509.  where ccccccccc is the command. 
  510.  
  511.  
  512. ΓòÉΓòÉΓòÉ 8.3.1. Function list and cross-reference - ring 0 and ring 3 ΓòÉΓòÉΓòÉ
  513.  
  514. The following functions are available in the compatibility API for access from 
  515. ring-3 processes via IOCtls and from ring-0 processes via the IDC protocol. 
  516.  
  517.  
  518. ΓòÉΓòÉΓòÉ 8.3.1.1. IOCtl category for ring-3 access to the extended API ΓòÉΓòÉΓòÉ
  519.  
  520. As with the compatibility API, all IOCtls are issued under the category 
  521. HRTXIOCTL_CATEGORY (0x80). 
  522.  
  523.  
  524. ΓòÉΓòÉΓòÉ 8.3.1.2. QUERYVERSION ΓòÉΓòÉΓòÉ
  525.  
  526.  IOCTL- 
  527.  
  528.  Identifier:         HRTXIOCTL_X_QUERYVERSION 
  529.  
  530.  Parameter packet:   unused 
  531.  
  532.  Data packet:        (VER) VER structure to fill with the current version 
  533.                      information 
  534.  
  535.  IDC- 
  536.  
  537.  Identifer:          HRTXIDC_X_QUERYVERSION 
  538.  
  539.  Context:            All 
  540.  
  541.  Parameter 1:        unused 
  542.  
  543.  Parameter 2:        (PVER) FAR16 pointer to a VER structure to fill with the 
  544.                      current version information 
  545.  
  546.  Description 
  547.  
  548.  Returns the extended version information by filling the VER structure passed 
  549.  as a parameter. The VER structure has the following format. 
  550.  
  551.   typedef struct _VER {
  552.  
  553.           unsigned char   ver[7];
  554.           unsigned char   build[5];
  555.           unsigned char   desc[40];
  556.  
  557.   } VER;
  558.  
  559.   typedef VER *   PVER;
  560.  
  561.  The unsigned char arrays will be filled with the extended version information, 
  562.  in zero-terminated string format. The bytes after the zero termination are not 
  563.  guaranteed to be zero. 
  564.  
  565.  The strings have the following format. 
  566.  
  567.  Version string (ver): 
  568.  
  569.  A version string has the format 1.0a01, where: 
  570.  
  571.  1  -   Major version number 
  572.  
  573.  .  -   Separator 
  574.  
  575.  0  -   Minor version number 
  576.  
  577.  a  -   Status: a=alpha, b=beta, r=release 
  578.  
  579.  01 -   Release number (01-99) 
  580.  
  581.  Build ID (build) 
  582.  
  583.  The build ID is a string representation of the build number, a four digit 
  584.  integer from 0-9999 
  585.  
  586.  Description (desc) 
  587.  
  588.  A description string of the component. 
  589.  
  590.  
  591. ΓòÉΓòÉΓòÉ 8.3.1.3. QUERYCOMPATHANDLE ΓòÉΓòÉΓòÉ
  592.  
  593.  IOCTL- 
  594.  
  595.  Identifier:         HRTXIOCTL_X_QUERYCOMPATHANDLE 
  596.  
  597.  Parameter packet:   unused 
  598.  
  599.  Data packet:        (ULONG) ULONG to return the handle in. 
  600.  
  601.  IDC- 
  602.  
  603.  Identifer:          HRTXIDC_X_QUERYCOMPATHANDLE 
  604.  
  605.  Context:            Task only (NOT IRQ or INIT) 
  606.  
  607.  Parameter 1:        unused 
  608.  
  609.  Parameter 2:        (PULONG) Pointer to a ULONG in which to deposit the handle 
  610.  
  611.  Description 
  612.  
  613.  Provides a method of linking timers registered by the compatibility API to 
  614.  allow them to be accessed using the extended API by returning the handle 
  615.  associated with it. All timers managed by the extended HRT server have an 
  616.  associated handle - but in the case of the compatibility API this handle is 
  617.  hidden by the compatibility layer which maps the handle to a specific process. 
  618.  To use this API it must be called in the context of the process which owns the 
  619.  compatibility timer. The returned handle may then be used in any context with 
  620.  any of the extended API functions. 
  621.  
  622.  
  623. ΓòÉΓòÉΓòÉ 8.3.1.4. CREATETIMER ΓòÉΓòÉΓòÉ
  624.  
  625.  IOCTL- 
  626.  
  627.  Identifier:         HRTXIOCTL_X_CREATETIMER 
  628.  
  629.  Parameter packet:   unused 
  630.  
  631.  Data packet:        (ULONG) ULONG in which to return the handle to the new 
  632.                      timer. 
  633.  
  634.  IDC- 
  635.  
  636.  Identifer:          HRTXIDC_X_CREATETIMER 
  637.  
  638.  Context:            All 
  639.  
  640.  Parameter 1:        (FAR16) Address of callback function 
  641.  
  642.  Parameter 2:        (PULONG). The contents of this address are modified by the 
  643.                      call and should be as follows. 
  644.  
  645.                      Entry -        Number of ticks between callbacks 
  646.  
  647.                      Exit -         The handle to the new timer 
  648.  
  649.  Description 
  650.  
  651.  Registers a timer for use by a client. The timer is registered and a handle to 
  652.  it is returned. Any calls to extended API functions must use this handle to 
  653.  reference the timer. There are no restrictions on where this handle may be 
  654.  used - if other processes are made aware of the handle the timer may be shared 
  655.  between processes. 
  656.  
  657.  
  658. ΓòÉΓòÉΓòÉ 8.3.1.5. DESTROYTIMER ΓòÉΓòÉΓòÉ
  659.  
  660.  IOCTL- 
  661.  
  662.  Identifier:         HRTXIOCTL_X_DESTROYTIMER 
  663.  
  664.  Parameter packet:   (ULONG) ULONG containing handle of timer to deregister 
  665.  
  666.  Data packet:        unused 
  667.  
  668.  IDC- 
  669.  
  670.  Identifer:          HRTXIDC_X_DESTROYTIMER 
  671.  
  672.  Context:            All 
  673.  
  674.  Parameter 1:        (ULONG) ULONG containing handle of timer to deregister 
  675.  
  676.  Parameter 2:        unused 
  677.  
  678.  Description 
  679.  
  680.  Deregisters a timer once a client has finished with it. Note that if a timer 
  681.  created by the compatibility API and whose handle is determined through 
  682.  QUERYCOMPATHANDLE is deregistered, then it will no longer be accessible from 
  683.  the compatibility API either. Deregistration is not automatic on process exit, 
  684.  so as not to leave orphaned resources it is essential to ensure that clients 
  685.  deregister all timers once they have ceased to require access to them. 
  686.  
  687.  
  688. ΓòÉΓòÉΓòÉ 8.3.1.6. MODIFYCALLBACKTIMER ΓòÉΓòÉΓòÉ
  689.  
  690.  IOCTL- 
  691.  
  692. Note this function only has meaning in a ring-0 context and there is no ring-3 
  693. equivalent. 
  694.  
  695. IDC- 
  696.  
  697.  Identifer:          HRTXIDC_X_MODIFYCALLBACKTIMER 
  698.  
  699.  Context:            All 
  700.  
  701.  Parameter 1:        (ULONG) ULONG containing handle of timer to modify 
  702.  
  703.  Parameter 2:        (ULONG) ULONG containing new callback period 
  704.  
  705.  Description 
  706.  
  707.  Alters the callback period of a timer in timer ticks. 
  708.  
  709.  
  710. ΓòÉΓòÉΓòÉ 8.3.1.7. SETRESOLUTION ΓòÉΓòÉΓòÉ
  711.  
  712. IOCTL- 
  713.  
  714.  Identifier:         HRTXIOCTL_X_SETRESOLUTION 
  715.  
  716.  Parameter packet:   (ULONG) ULONG containing handle of timer to deregister 
  717.  
  718.  Data packet:        Resolution to set the timer to (1=1ms, -1=(1/1024)ms) 
  719.  
  720.  IDC- 
  721.  
  722.  Identifer:          HRTXIDC_X_SETRESOLUTION 
  723.  
  724.  Context:            All 
  725.  
  726.  Parameter 1:        (ULONG) ULONG containing handle of timer to deregister 
  727.  
  728.  Parameter 2:        (ULONG) Resolution to set the timer to (1=1ms, 
  729.                      -1=(1/1024)ms) 
  730.  
  731.  Description 
  732.  
  733.  Changes the resolution (frequency of timer ticks) of the current timer to that 
  734.  specified. Values that are not -1 or 1 will cause an error to be returned. 
  735.  
  736.  
  737. ΓòÉΓòÉΓòÉ 8.3.1.8. GETRESOLUTION ΓòÉΓòÉΓòÉ
  738.  
  739. IOCTL- 
  740.  
  741.  Identifier:         HRTXIOCTL_X_GETRESOLUTION 
  742.  
  743.  Parameter packet:   (ULONG) ULONG containing handle of timer to deregister 
  744.  
  745.  Data packet:        (ULONG) Resolution of the timer will be returned herein 
  746.  
  747.  IDC- 
  748.  
  749.  Identifer:          HRTXIDC_X_GETRESOLUTION 
  750.  
  751.  Context:            All 
  752.  
  753.  Parameter 1:        (ULONG) ULONG containing handle of timer to deregister 
  754.  
  755.  Parameter 2:        (PULONG) Resolution will be placed in this memory location 
  756.  
  757.  Description 
  758.  
  759.  Returns the resolution of the specified timer. This will either be 1 (1ms - 
  760.  default) or -1 ((1/1024)ms ) 
  761.  
  762.  
  763. ΓòÉΓòÉΓòÉ 8.3.1.9. BLOCKTHREAD ΓòÉΓòÉΓòÉ
  764.  
  765. IOCTL- 
  766.  
  767.  Identifier:         HRTXIOCTL_X_BLOCKTHREAD 
  768.  
  769.  Parameter packet:   (ULONG) ULONG containing handle of timer to deregister 
  770.  
  771.  Data packet:        (ULONG) Number of timer ticks to block for 
  772.  
  773.  IDC- 
  774.  
  775.  Identifer:          HRTXIDC_X_BLOCKTHREAD 
  776.  
  777.  Context:            Task, (NOT IRQ) 
  778.  
  779.  Parameter 1:        (ULONG) ULONG containing handle of timer to deregister 
  780.  
  781.  Parameter 2:        (ULONG) Number of timer ticks to block for 
  782.  
  783.  Description 
  784.  
  785.  Blocks the thread calling into this API for the time specified and ties the 
  786.  thread to the specified timer. Up to ten threads per timer may be blocked at 
  787.  any one time. In ring-0, this function will return an error if called in an 
  788.  interrupt context. 
  789.  
  790.  
  791. ΓòÉΓòÉΓòÉ 8.3.1.10. QUERYCOUNTADDR ΓòÉΓòÉΓòÉ
  792.  
  793. IOCTL- 
  794.  
  795.  Identifier:         HRTXIOCTL_X_QUERYCOUNTADDR 
  796.  
  797.  Parameter packet:   (ULONG) ULONG containing handle of timer to deregister 
  798.  
  799.  Data packet:        (PULONG) Address into which a process-addressible linear 
  800.                      pointer to the ULONG timer count variable will be placed 
  801.  
  802.  IDC- 
  803.  
  804.  Identifer:          HRTXIDC_X_QUERYCOUNTADDR 
  805.  
  806.  Context:            Any 
  807.  
  808.  Parameter 1:        (ULONG) ULONG containing handle of timer to deregister 
  809.  
  810.  Parameter 2:        (FAR16) Address into which the FAR16 address of the timer 
  811.                      count variable will be placed. 
  812.  
  813.  Description 
  814.  
  815.  Returns the address of the timer count variable. Note that from an IOCtl, a 
  816.  process-addressible linear pointer is returned. From an IDC, a FAR16 pointer 
  817.  is returned. 
  818.  
  819.  
  820. ΓòÉΓòÉΓòÉ 8.3.2. Sample code - extended API ΓòÉΓòÉΓòÉ
  821.  
  822. The following sample code gives a very simple example of how to implement 
  823. timers using the extended API. It does not show the use of multiple timers, or 
  824. multiple threads blocking using a single timer. 
  825.  
  826. The sample code may be found in the file SAMPLE\TEST.C 
  827.  
  828.  
  829. ΓòÉΓòÉΓòÉ 8.4. Main limitations: ΓòÉΓòÉΓòÉ
  830.  
  831. All applications that are clients of the original TIMER0 need no modification 
  832. to work with the new TIMER0. 
  833.  
  834.  
  835. ΓòÉΓòÉΓòÉ 9. Command line parameters ΓòÉΓòÉΓòÉ
  836.  
  837. All command line parameters are case insensitive. 
  838.  
  839.  
  840. ΓòÉΓòÉΓòÉ 9.1. TIMER0.SYS ΓòÉΓòÉΓòÉ
  841.  
  842. The following parameters are accepted by TIMER0.SYS on the load line in the 
  843. CONFIG.SYS. 
  844.  
  845.       BASEDEV=TIMER0.SYS <params> 
  846.  
  847.   ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  848.   ΓöéFLAG                ΓöéRANGE               ΓöéACTION              Γöé
  849.   Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  850.   Γöé/Q                  Γöé-                   ΓöéLoad quietly        Γöé
  851.   ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  852.  
  853.  
  854. ΓòÉΓòÉΓòÉ 10. Troubleshooting. ΓòÉΓòÉΓòÉ
  855.  
  856. If you run into difficulty with this driver, then please first consult these 
  857. sections as the most common issues will be described here with the appropriate 
  858. solution. If this still does not resolve the problem then please contact me and 
  859. I will attempt to advise you. 
  860.  
  861.  
  862. ΓòÉΓòÉΓòÉ 10.1. Errors ΓòÉΓòÉΓòÉ
  863.  
  864.  The following error codes may be returned from the driver in response to an 
  865. IOCtl or an IDC call. 
  866.  
  867.  
  868. ΓòÉΓòÉΓòÉ 10.1.1. HRTXERR_NOERROR ΓòÉΓòÉΓòÉ
  869.  
  870.  Integer value: - 0x00 
  871.  
  872. No error has occurred and the call has completed successfully 
  873.  
  874.  
  875. ΓòÉΓòÉΓòÉ 10.1.2. HRTXERR_MODONINT ΓòÉΓòÉΓòÉ
  876.  
  877.  Integer value: - 0x01 
  878.  
  879. Generated in response to an IDC call issued while in interrupt context when the 
  880. function requested is not available in this context. 
  881.  
  882.  
  883. ΓòÉΓòÉΓòÉ 10.1.3. HRTXERR_MAX_CLIENTS ΓòÉΓòÉΓòÉ
  884.  
  885.  Integer value: - 0x02 
  886.  
  887. Returned if an attempt is made to register more than 10 clients simultaneously, 
  888. or to block more than 10 threads simultaneously per timer. 
  889.  
  890.  
  891. ΓòÉΓòÉΓòÉ 10.1.4. HRTXERR_NOSUCHCLIENT ΓòÉΓòÉΓòÉ
  892.  
  893.  Integer value: - 0x03 
  894.  
  895. Returned from the compatibility API if a timer is not registered for this 
  896. process. 
  897.  
  898.  
  899. ΓòÉΓòÉΓòÉ 10.1.5. HRTXERR_BADPARAM ΓòÉΓòÉΓòÉ
  900.  
  901.  Integer value: - 0x04 
  902.  
  903. Returned from an IOCtl or an IDC function if an invalid parameter is submitted 
  904.  
  905.  
  906. ΓòÉΓòÉΓòÉ 10.1.6. HRTXERR_HRTCBFAIL. ΓòÉΓòÉΓòÉ
  907.  
  908.  Integer value: - 0x05 
  909.  
  910. Generated if a problem occurs in attaching to the modified CLOCK01.SYS. Be sure 
  911. that the correct version of CLOCK01.SYS is installed in the system. 
  912.  
  913.  
  914. ΓòÉΓòÉΓòÉ 10.1.7. HRTXERR_EARLYREGISTER ΓòÉΓòÉΓòÉ
  915.  
  916.  Integer value: - 0x06 
  917.  
  918. Generated if an attempt is made to register a client through the compatibility 
  919. API from ring-0 before or during INIT_COMPLETE. 
  920.  
  921.  
  922. ΓòÉΓòÉΓòÉ 10.1.8. HRTXERR_INVALIDHANDLE ΓòÉΓòÉΓòÉ
  923.  
  924.  Integer value: - 0x07 
  925.  
  926. Returned if an invalid handle is passed to the extended API. 
  927.  
  928.  
  929. ΓòÉΓòÉΓòÉ 11. Known bugs ΓòÉΓòÉΓòÉ
  930.  
  931.  This file contains a list of known bugs, and consists of the last few major 
  932. entries in the problem database for this release. Please verify against this 
  933. list before submitting a bug report. 
  934.  
  935. The driver version in the list is the version in which the bug was found. If 
  936. the bug is marked as FIXED then the version in which the fix was introduced is 
  937. also listed. 
  938.  
  939. STATUS: This can be one of 
  940.  
  941.  FIXED:                                Problem is fixed in current release 
  942.  
  943.  PENDING:                              Problem is under investigation 
  944.  
  945.  QUEUED:                               Problem is awaiting attention 
  946.  
  947.  LIMITATION:                           Problem can not be fixed due to 
  948.                                        limitations of system or architecture. 
  949.  
  950.  
  951. ΓòÉΓòÉΓòÉ 11.1. HRTX10a01/0001 ΓòÉΓòÉΓòÉ
  952.  
  953.  Reported by: 
  954.  
  955.  STATUS:                               FIXED 
  956.  
  957.  Driver version:                       1.0a01 - FIXED IN 1.1r01 
  958.  
  959.  OS/2 version:                         Warp 4 
  960.  
  961.  OS/2 Fixpack level:                   14 
  962.  
  963.  CPU type:                             All 
  964.  
  965.  CPU speed:                            All 
  966.  
  967.  RAM MB:                               N/A 
  968.  
  969.  Description of problem 
  970.  
  971.  Threads blocked using HRTXIOCTL_X_BLOCKTHREAD or HRTXIOCTL_BLOCKUNTIL remain 
  972.  blocked in the timer until time expires should the client process terminate 
  973.  abnormally. 
  974.  
  975.  Error in header file is now corrected allowing ring-0 block calls to correctly 
  976.  return on a process death 
  977.  
  978.  
  979. ΓòÉΓòÉΓòÉ 11.2. HRTX10r02/0001 ΓòÉΓòÉΓòÉ
  980.  
  981.  Reported by:                          RI 
  982.  
  983.  STATUS:                               FIXED 
  984.  
  985.  Driver version:                       1.0r03 - FIXED IN 1.0r03 
  986.  
  987.  OS/2 version:                         Warp 4 
  988.  
  989.  OS/2 Fixpack level:                   14 
  990.  
  991.  CPU type:                             All 
  992.  
  993.  CPU speed:                            All 
  994.  
  995.  RAM MB:                               N/A 
  996.  
  997.  Description of problem 
  998.  
  999.  Driver traps on any calls to time set functions. 
  1000.  
  1001.  Swappable code segment in executable incorrectly flagged in executable header. 
  1002.  v1.0r03 corrected specifically this problem 
  1003.  
  1004.  
  1005. ΓòÉΓòÉΓòÉ 11.3. HRTX10r03/0001 ΓòÉΓòÉΓòÉ
  1006.  
  1007.  Reported by:                          MG 
  1008.  
  1009.  STATUS:                               PENDING 
  1010.  
  1011.  Driver version:                       1.0r03 
  1012.  
  1013.  OS/2 version:                         Warp 4 
  1014.  
  1015.  OS/2 Fixpack level:                   14 
  1016.  
  1017.  CPU type:                             All 
  1018.  
  1019.  CPU speed:                            All 
  1020.  
  1021.  RAM MB:                               N/A 
  1022.  
  1023.  Description of problem 
  1024.  
  1025.  Mysterious lockup in REXX scripts that use system wait calls. This has not 
  1026.  been observed elsewhere. Problem traced to the CLOCK01 portion of the driver, 
  1027.  but no clear indication of the cause has been found. Attempts to replicate the 
  1028.  behaviour have so far proved negative. 
  1029.  
  1030.  Fixed in version:  N/A 
  1031.  
  1032.  
  1033. ΓòÉΓòÉΓòÉ 11.4. HRTX10r03/0002 ΓòÉΓòÉΓòÉ
  1034.  
  1035.  Reported by:                          RWK 
  1036.  
  1037.  STATUS:                               FIXED 
  1038.  
  1039.  Driver version:                       1.0r03 - FIXED IN 1.1r01 
  1040.  
  1041.  OS/2 version:                         Warp 4 
  1042.  
  1043.  OS/2 Fixpack level:                   14 
  1044.  
  1045.  CPU type:                             All 
  1046.  
  1047.  CPU speed:                            All 
  1048.  
  1049.  RAM MB:                               N/A 
  1050.  
  1051.  Description of problem 
  1052.  
  1053.  R0 Trap0D in RTMIDI apps. 
  1054.  
  1055.  Overwrite of the client callback address pointer by successive registration 
  1056.  from RTMIDI.DLL after MIDI.DLL had executed an IDC attachment. 
  1057.  
  1058.  Updated compatibility-mode client code has completely resolved this - I hope 
  1059.  ************************************* 
  1060.  
  1061.  
  1062. ΓòÉΓòÉΓòÉ 12. Reporting bugs ΓòÉΓòÉΓòÉ
  1063.  
  1064. To report a bug in the driver, please fill in the form which can be found in 
  1065. the file DOC\BUGREP.TXT. However, please first verify the following before 
  1066. submitting a report. 
  1067.  
  1068.    1. REPEATABILITY 
  1069.  
  1070.       The bug must be repeatable - i.e. you must be able to consistently 
  1071.       reproduce the effect on more than one occasion 
  1072.  
  1073.    2. PRE-EMINENCE 
  1074.  
  1075.       Please check against the file DOC\KNOWNBUG.TXT, if this file exists, to 
  1076.       see if the bug is already known about. If it is, and occurs under exactly 
  1077.       the same conditions (but possibly with different hardware), then please 
  1078.       do not report it - it is already known. However, if the bug occurs under 
  1079.       very different conditions, but is sufficiently similar in nature to a 
  1080.       report in DOC\KNOWNBUG.TXT, then please do report it quoting the bug 
  1081.       report number (top left hand corner of the header of each bug report in 
  1082.       DOC\KNOWNBUG.TXT) in the 'Reference current bug no:' field in the report 
  1083.       form and specifying the conditions under which the bug may be produced. 
  1084.  
  1085.  
  1086. ΓòÉΓòÉΓòÉ 12.1. Submission ΓòÉΓòÉΓòÉ
  1087.  
  1088. To submit the report, please email the complete bug report form to me. 
  1089.  
  1090.  
  1091. ΓòÉΓòÉΓòÉ 13. Contact details ΓòÉΓòÉΓòÉ
  1092.  
  1093. If you would like to contact me regarding this driver, or other matters, 
  1094. suggestions for enhancements etc. please send email to 
  1095. J.A.Gow@furrybubble.co.uk and I will attempt to resolve your query. Please note 
  1096. however, that: 
  1097.  
  1098. if( !POLITENESS) {
  1099.  
  1100.     return I_WILL_IGNORE_YOUR_MESSAGE();
  1101.  
  1102. }
  1103.  
  1104. You get the drift! :) 
  1105.  
  1106.  
  1107. ΓòÉΓòÉΓòÉ 14. Acknowledgements ΓòÉΓòÉΓòÉ
  1108.  
  1109. The further development of this driver would not have been possible had it not 
  1110. been for the help and assistance of the following people whose contribution is 
  1111. gratefully acknowledged: 
  1112.  
  1113.  Timur Tabi:                    Timur wrote the original high-resolution timer 
  1114.                                implementation and has been very helpful during 
  1115.                                the planning phase of this development with 
  1116.                                suggestions and answers to my questions. 
  1117.  
  1118.  Roderick Klein:               Roderick does a superb job of managing the web 
  1119.                                site and the beta test programs, not to mention 
  1120.                                considerable advice and encouragement 
  1121.  
  1122.  IBM:                           Without the CLOCKxx sources, usefully released 
  1123.                                as part of the device driver kit, this fix would 
  1124.                                not have been possible. 
  1125.  
  1126.  Sarah:                        Not forgetting Sarah, my wife, who willingly 
  1127.                                eschewed many a romantic evening in front of a 
  1128.                                roaring (imitation) coal fire for less romantic 
  1129.                                evenings in front of the monitor in order to 
  1130.                                develop this code to a high standard despite my 
  1131.                                gruelling schedule as a research engineer. 
  1132.                                Support like that is rare in today's society. 
  1133.