home *** CD-ROM | disk | FTP | other *** search
/ CD Shareware Masterblend / cdsharewaremasterblend.iso / bus-apps / zip-code / zprog.doc < prev   
Text File  |  1990-10-15  |  32KB  |  791 lines

  1. PROGRAMMATIC INTERFACE DOCUMENT
  2.  
  3.  
  4. This file is intended for computer programmers who wish to access
  5. ZIPKEY directly from within their programs.  If you are not a
  6. computer programmer, you may ignore this file.
  7.  
  8.  
  9. The ZIPKEY Interrupt
  10.  
  11. When ZIPKEY is installed as a memory-resident program (using the
  12. ZIPKEY 4 command), it takes over one of the 8086's interrupts,
  13. INT 179 (decimal; it's B3 in hexadecimal).  This interrupt serves
  14. two functions: first, it is the method by which ZIPKEY detects if
  15. it has already been installed.  Second, it provides the interface
  16. by which computer programs can call ZIPKEY directly, to obtain
  17. zipcode-related services.
  18.  
  19. I conducted a survey of numerous computers before selecting INT
  20. 179 to be used by ZIPKEY.  I found no computers or peripherals
  21. that use this interrupt, and I am hopeful that there are none.
  22. If your computer does use INT 179, then ZIPKEY and the device or
  23. program using INT 179 will interfere with each other.  You can
  24. change the interrupt number ZIPKEY uses by modifying the ZIPKEY
  25. program itself: the number 179 is stored in the fourth byte of
  26. the ZIPKEY program code, immediately beyond the three-byte JMP
  27. instruction that begins the program.  This JMP occurs at the very
  28. start of the ZIPKEY.COM file, or immediately beyond the 512-byte
  29. header of the ZIPKEY.EXE file.  You can use a debugger or a hex
  30. editor to modify the byte to an unused interrupt number.
  31.  
  32.  
  33. Testing for ZIPKEY's Presence
  34.  
  35. Before you program attempts to call ZIPKEY, it may wish to verify
  36. that ZIPKEY has been installed, and report an error if it isn't.
  37. Otherwise, you program may crash when it tries to call code that
  38. isn't there.
  39.  
  40. You can test for ZIPKEY's presence by examining the INT 179
  41. handler, whose doubleword pointer is stored at offset 179*4 (=716
  42. =02CCH) within segment 0 of the 8086 memory space.  If ZIPKEY is
  43. installed, the doubleword points to its code segment.  Location
  44. 075H within that code segment contains the signature string
  45. ZIPKEY.  Thus, the following code sequence will check for
  46. ZIPKEY's presence:
  47.                                                               P-2
  48.  
  49. OUR_ZIPKEY:                ; our copy of the template
  50.   DB 'ZIPKEY'
  51.  
  52. CHECK_FOR_ZIPKEY:
  53.   PUSH DS                  ; save register value
  54.   SUB AX,AX                ; load zero
  55.   MOV DS,AX                ; point DS to 0 -- 8086 interrupts
  56.   MOV DS,WORD PTR 02CEH    ; fetch the segment part of INT 179
  57.   MOV SI,075H              ; point to signature in segment
  58.   PUSH CS                  ; push our code segment
  59.   POP ES                   ; set ES to our code segment
  60.   MOV DI,OFFSET OUR_ZIPKEY ; now ES:DI points to 'ZIPKEY'
  61.   MOV CX,3                 ; there are 3 words in 'ZIPKEY'
  62.   REPE CMPSW               ; does DS:75H point to 'ZIPKEY'?
  63.   POP DS                   ; restore register before jumping
  64.   JZ ZIPKEY_INSTALLED      ; jump if it does match
  65. ZIPKEY_NOT_INSTALLED:      ; it does not match
  66.  
  67. Following the ZIPKEY signature, at offset 07BH within the ZIPKEY
  68. code segment, is a single byte that is zero in the initial
  69. version of ZIPKEY, but will increment each time I release a
  70. ZIPKEY with new features or any other changes to the programmatic
  71. interface.  That way, if you program needs ZIPKEY to be of a
  72. sufficiently recent version, it can ensure that it is.  (You can
  73. also use the version number returned by the ZK_VERSION function
  74. described shortly.)
  75.  
  76.  
  77. ZIPKEY Calling Conventions
  78.  
  79. ZIPKEY's interface works similarly to that of the MS-DOS
  80. operating system, or the LIM-EMS specification.  The interface is
  81. specified in 8086 assembly language.  You load a function number
  82. into the AH register, and possibly other input parameters into
  83. other registers, then you execute an INT instruction with an
  84. appropriate interrupt number -- in ZIPKEY's case, the INT 179
  85. instruction.
  86.  
  87. When ZIPKEY has completed the function, it returns control to
  88. your program at the instruction following the INT 179.  The
  89. success of the call is indicated by the Carry flag: NoCarry (flag
  90. = 0) indicates success; Carry (flag = 1) indicates failure.  If
  91. the Carry flag is set, AL is usually set to an error code (the
  92. exceptions are those functions which, as mentioned in their
  93. following descriptions, return the state code for a suggested
  94. city).  Here are the possible error codes:
  95.  
  96. 0FDH is returned if ZIPKEY is busy. You will get this error only
  97.      if the program calling ZIPKEY had interrupted another
  98.      program which also happened to be in the middle of a ZIPKEY
  99.      call.  ZIPKEY is not reentrant, so it must refuse calls in
  100.      this situation.  If you think this interrupted-programming
  101.      scenario is possible, you should check for this possibility.
  102.      If ZIPKEY is busy, you should give the interrupted code a
  103.      chance to complete the ZIPKEY call, and try your call again
  104.      later.
  105.                                                               P-3
  106.  
  107. 0FEH is returned if you provided an illegal function number in
  108.      the AH register.
  109.  
  110. 0FFH is returned if the searching function requested failed to
  111.      find a valid entry, or even a suggested value.
  112.  
  113. Here are ZIPKEY's register-preserving conventions:  The AX
  114. register is clobbered by an INT 179 call; but all other 8086
  115. machine registers are preserved unless they are specifically
  116. named as having return values.  If a function returns an error,
  117. such return registers may be clobbered even if they contain no
  118. values in the return case.  For example, the ZK_STCITY_ZIP
  119. function returns values in BH, CX, and DX.  Except for AX, all
  120. other registers not mentioned are preserved (SI,DI,BP,DS,ES).
  121. The BH, CX, and DX registers may be clobbered even if the search
  122. fails (and Carry is returned).
  123.  
  124.  
  125. The ZIPKEY Functions
  126.  
  127. Following are the functions available to you when ZIPKEY is
  128. installed. For each function, you load the input registers with
  129. the values indicated, then invoke INT 179.
  130.  
  131. The names of the functions (ZK_VERSION, ZK_ABBR_ST, etc.) have no
  132. significance to ZIPKEY-- I present them merely as suggested names
  133. if you wish to implement a library of calls; and also so that I
  134. can refer to the functions by name.
  135.  
  136. ZK_VERSION:   returns ZIPKEY version information.
  137.  
  138.   In: AH = 070H
  139.  
  140.  Out: AX = The ZIPKEY program version number, as shown when
  141.          ZIPKEY is invoked or the ZIPKEY window is popped up.  AH
  142.          is the major version number (to the left of the decimal
  143.          point) and AL is the minor version number (to the right
  144.          of the decimal point).  For example, for V1.0 the return
  145.          AX value would be hex 100.
  146.  
  147.       CL = The number of states, (and territories, etc.) in the
  148.          current database.  Each state is assigned an internal
  149.          numeric code by ZIPKEY, that is used by many of the
  150.          functions of ZIPKEY's programmatic interface.  These
  151.          codes range from 0 to CL-1.
  152.  
  153.       DX = The date of the current ZIPKEY.OVL database.  DL is
  154.          the month, ranging from 1 for January to 12 for
  155.          December.  DH is the year minus 1900; e.g., decimal 89
  156.          for 1989.
  157.                                                               P-4
  158.  
  159. ZK_ABBR_ST:   converts a two-letter abbreviation into a state
  160.               code.
  161.  
  162.  In:  AH = 071H
  163.  
  164.       BX = The 2-letter ASCII abbreviation for the state, in
  165.          either upper- or lower-case.  BL is the first letter and
  166.          BH is the second letter.
  167.  
  168. Out:  AL = The ZIPKEY state code, suitable for input to other
  169.          ZIPKEY functions in this chapter.
  170.  
  171.          AL = 0FFH with the Carry flag set if not found.
  172.  
  173.  
  174. ZK_ST_ABBR:   converts a state code into a two-letter
  175.               abbreviation.
  176.  
  177.  In:  AH = 072H
  178.  
  179.       BL = The ZIPKEY state code, ranging from 0 through CL-1,
  180.          where CL is returned by ZK_VERSION.
  181.  
  182. Out:  AX = The 2-letter ASCII abbreviation, upper case.  AL is
  183.       the first letter and AH is the second letter.
  184.  
  185.       The Carry flag is set if the input state code BL was
  186.       invalid.
  187.  
  188.  
  189. ZK_ST_NAME:   converts a state code into a full state name.
  190.  
  191.  In:  AH = 073H
  192.  
  193.       BL = The ZIPKEY state