home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PROGRAMS / UTILS / COMPRESS / PKV100.ZIP / PKV100.INC < prev    next >
Encoding:
Text File  |  1990-10-14  |  16.5 KB  |  454 lines

  1. Comment |
  2. Name    VERSION2.PRC
  3. Type    Procedure
  4. Author  BF Gavin, Online Reference BBS.  All rights reserved.
  5.  
  6. Intent  Check for DOS v2.00 or higher
  7. Origin  26FEB89
  8. Update  15APR89 - Changed procedure from "Version" to "Version2".
  9.         04JUN89 - Mov CS to DS for .COM or .EXE capability.
  10.         05OCT89 - Add in major, minor variables in CODE SEGMENT
  11.         04NOV89 - Return AH,AL as set by DOS
  12.         11JAN90 - Change local variables from '_xxx' to '@xxx'
  13.         19JAN90 - Fix bug that didn't display error message
  14.  
  15. Needs   Nothing
  16. Entry   Nothing
  17.  
  18. Flags        (destroyed)
  19. Regs    AX - (destroyed)  Work reg
  20.  
  21. Exit    Returns major/minor version in AH/AL
  22. Remark  Terminates program if DOS is not 2.0 or higher, ERRORLEVEL=1
  23.         |
  24.  
  25.  
  26. @doserr$        Db    Cr,Lf,'Sorry, requires DOS 2.0 or higher',Cr,Lf,Lf,'$'
  27. @osmajor        Db    0                         ; DOS major version level
  28. @osminor        Db    0                         ; DOS minor version level
  29.  
  30. DOS_Version     Proc   Near
  31.         Mov     AH,30h                          ; Version function call
  32.         Int     21h                             ; Call DOS
  33.         Cmp     AL,02h                          ; Version 2 or higher?
  34.         Jnb     _dosversionexit                 ; OK - continue
  35.         Push    CS                              ; Get code segment
  36.         Pop     DS                              ; Insure DS is set
  37.         Lea     DX,@doserr$                     ; Wrong DOS version message
  38.         Mov     AH,09h                          ; Display dollar string
  39.         Int     21h                             ; Call DOS
  40.         Mov     AX,4C01h                        ; Set ERRORLEVEL = 1..
  41.         Int     21h                             ;   and exit
  42.  
  43.   _dosversionexit:
  44.         Mov     @osmajor,AL                     ; Save major version level
  45.         Mov     @osminor,AH                     ; Save minor version level
  46.         Ret                                     ; To caller with version in AX
  47. DOS_Version     Endp
  48.  
  49.  
  50.  
  51.  
  52.  
  53. Comment |
  54. Name    LBLANKS1.PRC
  55. Type    Procedure
  56. Author  BF Gavin, Online Reference BBS.  All rights reserved.
  57.  
  58. Intent  Return next non blank character in AL, either case
  59. Origin  18MAY1988
  60. Update  18JAN1990 - Set CF=1 if 13 (CR) is 1st non-blank character
  61.  
  62. Needs   Nothing
  63. Entry   DS:SI points at string
  64.  
  65. Regs    AX - (destroyed) Charcter returned to caller in AL
  66.         SI - (destroyed) Points to next character
  67. Flags        (destroyed)
  68.  
  69. Exit    AL holds non-blank character
  70. Remark  Skips tab and space characters
  71.         |
  72.  
  73. Leading_Blanks  Proc    Near
  74.   _lblanks_loop:
  75.         Lodsb                                   ; Read the next byte at [SI]
  76.         Cmp     AL,20h                          ; Is AL a blank space?
  77.         Jz      _lblanks_loop                   ; Yes - get the next byte
  78.         Cmp     AL,09h                          ; Is AL a tab character?
  79.         Jz      _lblanks_loop                   ; Yes - get the next byte
  80.         Cmp     AL,0Dh                          ; Carriage return?
  81.         Jne     _lblanks_exit                   ; No  - leave CF=0
  82.         Stc                                     ; Yes - set CF=1
  83.         Ret                                     ; With char in AL, CF=set
  84.  
  85.   _lblanks_exit:
  86.         Clc
  87.         Ret                                     ; With char in AL, CF=clear
  88. Leading_Blanks  Endp
  89.  
  90.  
  91.  
  92.  
  93.  
  94. Comment |
  95. Name    DISP-DOS.PRC
  96. Type    Procedure
  97. Author  BF Gavin, Online Reference BBS.  All rights reserved.
  98.  
  99. Intent  Display message [DS:DX] at current cursor location with DOS
  100. Origin  19JUN87
  101. Update  15SEP89 - Assign unique label names
  102.         15OCT90 - Preserve DX register
  103.  
  104. Needs   Nothing
  105. Entry   DX points at ASCIIZ message
  106.  
  107. Regs    AX - (DESTROYED) DOS function, Char in AL
  108.         DX - (preserved) Message pointer at entry
  109.         SI - (preserved) Message pointer source reg
  110.  
  111. Exit
  112. Remark  Used for Hercules, etc, video drivers.
  113.         DISP-MSG.PRC does not support odd-ball drivers.
  114.         |
  115.  
  116.  
  117. Display_Message Proc      Near
  118.         Push    DX                              ; Save all registers used
  119.         Push    SI                              ; Entry value
  120.         Mov     SI,DX                           ; Message pointer
  121.  
  122.   _display_msg_loop:
  123.         Lodsb                                   ; Get message bytes
  124.         Cmp     AL,0                            ; All done?
  125.         Jz      _display_msg_exit               ; Yes
  126.         Mov     DL,AL                           ; Setup to display
  127.         Mov     AH,02                           ; Display character function
  128.         Int     21h                             ; Call DOS
  129.         Jmp     Short _display_msg_loop         ; Loop through message
  130.  
  131.   _display_msg_exit:
  132.         Pop     SI                              ; Restore saved registers
  133.         Pop     DX
  134.         Ret                                     ; To caller
  135. Display_Message Endp
  136.  
  137.  
  138.  
  139.  
  140.  
  141. Comment |
  142. Name    Upper_Case
  143. Type    Procedure
  144. Author  BF Gavin, Online Reference BBS.  All rights reserved.
  145.  
  146. Intent  Convert letter in AL to upper case
  147. Origin  15OCT90 -
  148. Update  ddmmmyy -
  149.  
  150. Needs   Other procedures.
  151. Caller  Procedure names.
  152. Size    xxx bytes.
  153.  
  154. Entry   Describe registers at entry.
  155.         FL - (DESTROYED) ?
  156.         AL - (DESTROYED) Letter to convert.
  157.  
  158.  
  159. Exit    AL is upper case.
  160. Remark
  161.  
  162.         |
  163.  
  164. Upper_Case      Proc    Near
  165.         Cmp     AL,97                           ; Lower case 'A'?
  166.         Jb      _ucexit                         ; No  - not a lower case char
  167.         Cmp     AL,122                          ; Lower case 'Z'?
  168.         Ja      _ucexit                         ; No  - not a lower case char
  169.         And     AL,0DFh                         ; Yes - convert to upper case
  170.  
  171.   _ucexit:
  172.         Ret                                     ; To caller with upper case AL
  173. Upper_Case      Endp
  174.  
  175.  
  176.  
  177.  
  178.  
  179. Comment |
  180. Name    AXDX2HEX
  181. Type    Procedure
  182. Author  BF Gavin
  183.  
  184. Intent  Convert DX:AX to ASCII hex characters
  185. Origin  16JAN89
  186. Update  14SEP89 - Assign unique label names
  187.         13OCT90 - Carry Flag 0/1 = leading zeros/blanks.
  188.  
  189. Needs   Nothing
  190. Entry   DX:AX set to HI:LO hex values.
  191.         ES:DI points to 8 byte buffer area
  192.         NC    use leading zeros
  193.         CF    use leading blanks
  194.  
  195. Flags      - (preserved)
  196. Regs    AX - (preserved)
  197.         BX - (preserved)
  198.         CX - (preserved)
  199.         DX - (preserved)
  200.         SI - (preserved)
  201.         DI - (preserved)
  202.         DS - (preserved)
  203.  
  204. Exit    Buffer contains ASCII hex characters.
  205. Remark  Leading zeros or leading blanks set by Carry Flag state.
  206.         |
  207.                 EVEN
  208. @HexBfrPtr      Dw      0                       ; Save area for DI buffer ptr
  209. @AXDX_Tbl       Db      '0123456789abcdef'      ; Xlat table, lower case
  210. @AXDX2Hex_Sw    Db      1                       ; 0/1 = leading zeros/blanks
  211.  
  212. AXDX2Hex        Proc    Near
  213.         PushF                                   ; Save direction flag
  214.         Push    AX                              ; Save all registers used
  215.         Push    BX
  216.         Push    CX
  217.         Push    DX
  218.         Push    SI
  219.         Push    DS
  220.         Mov     @HexBfrPtr,DI                   ; Save it
  221.  
  222.         Mov     @AXDX2Hex_Sw,1                  ; Assume leading blanks wanted
  223.         Jc      _axdx_bfrset                    ; User wants leading blanks
  224.         Mov     @AXDX2Hex_Sw,0                  ; NC - wants leading zeros
  225.  
  226.   _axdx_bfrset:
  227.         Add     DI,7                            ; End of buffer
  228.         Std                                     ; Descending direction
  229.         Mov     BX,CS                           ; Xlat table is here
  230.         Mov     DS,BX                           ; Address it
  231.         Mov     BX,Offset @AXDX_Tbl             ; Xlat table
  232.         Push    DX                              ; Save for later
  233.         Mov     DX,AX                           ; Work on AX via DX
  234.         Mov     CX,4                            ; 4 nybbles worth
  235.  
  236.   _loop_32_lo:
  237.         Mov     AL,DL                           ; Lo nybble to AL
  238.         And     AL,0Fh                          ; Isolate lo nybble
  239.         Xlat                                    ; Convert nybble to hex
  240.         Stosb                                   ; Store in display area
  241.         Shr     DX,1                            ; Get next nybble
  242.         Shr     DX,1
  243.         Shr     DX,1
  244.         Shr     DX,1
  245.         Loop    _loop_32_lo
  246.  
  247.         Pop     DX                              ; Restore DX to DX
  248.         Mov     CX,4                            ; 4 nybbles worth
  249.  
  250.   _loop_32_hi:
  251.         Mov     AL,DL                           ; Lo nybble to AL
  252.         And     AL,0Fh                          ; Isolate lo nybble
  253.         Xlat                                    ; Convert nybble to hex
  254.         Stosb                                   ; Store in display area
  255.         Shr     DX,1                            ; Get next nybble
  256.         Shr     DX,1
  257.         Shr     DX,1
  258.         Shr     DX,1
  259.         Loop    _loop_32_hi
  260.  
  261.         Cmp     @AXDX2Hex_Sw,1                  ; Want leading blanks?
  262.         Jnz     _h32b                           ; No - skip this part
  263.         Mov     DI,@HexBfrPtr                   ; Start of buffer
  264.         Mov     SI,DI                           ; Set both
  265.         Cld                                     ; Ascending direction
  266.         Mov     CX,7                            ; Check first 7 digits
  267.   _h32a:
  268.         Lodsb                                   ; Check for ASCII zero
  269.         Cmp     AL,30h                          ; Zero
  270.         Jnz     _h32b                           ; Done
  271.         Mov     AL,20h                          ; Set to blank
  272.         Stosb                                   ; Store it
  273.         Loop    _h32a                           ; Keep going
  274.  
  275.   _h32b:
  276.         Mov     DI,@HexBfrPtr                   ; Restore all registers used
  277.         Pop     DS
  278.         Pop     SI
  279.         Pop     DX
  280.         Pop     CX
  281.         Pop     BX
  282.         Pop     AX
  283.         PopF                                    ; Restore flags
  284.         Ret                                     ; To caller
  285. AXDX2Hex        Endp
  286.  
  287.  
  288.  
  289.  
  290.  
  291. Comment |
  292. Name    DIVIDE10.PRC
  293. Type    Function
  294. Author  BF Gavin, Online Reference BBS.  All rights reserved.
  295.  
  296. Intent  Divide DX:AX by 10.  Prevents Int03 overflow interrupt when returned
  297.         quotient > 16 bit value.
  298.  
  299. Origin  26FEB1989
  300. Update
  301.  
  302. Needs   Nothing
  303. Entry   DX:AX set to Hi:Lo values
  304.         SI    set to Divisor
  305.  
  306. Regs    AX - (destroyed) - Entry Lo dividend, Exit quotient Lo
  307.         BX - (destroyed) - Remainder
  308.         CX - (preserved) - Divide bit width 16/32
  309.         DX - (destroyed) - Entry Hi dividend, Exit quotient Hi
  310.         SI - (preserved) - Working divisor
  311. Flags        (destroyed)
  312.  
  313. Exit    DX:AX quotient,  BX remainder
  314. Remark
  315.         |
  316. Divide10        Proc    Near
  317.         Push    CX                              ; Entry value
  318.         Mov     SI,10                           ; Divisor value to SI
  319.         Xor     BX,BX                           ; Zero partial dividend
  320.         Or      DX,DX                           ; Test for 32 bit divide
  321.         Jz      _div16_setup                    ; No  - do 16 bit instead
  322.         Mov     CX,32                           ; 32 bits max for divide
  323.  
  324.   _div32_loop:
  325.         Shl     AX,1                            ; Hi bit to carry
  326.         Rcl     DX,1                            ; Set carry in Hi reg
  327.         Rcl     BX,1                            ; Carry to partial divdnd
  328.         Cmp     BX,SI                           ; Partial divdnd < divisor
  329.         Jb      _div1032_nxt                    ; Yes - skip subtraction
  330.         Sub     BX,SI                           ; Partial divdnd - divsor
  331.         Inc     AX                              ; Set quotient bit
  332.  
  333.   _div1032_nxt:
  334.         Loop    _div32_loop                     ; Loop thru CX bits
  335.         Jmp     Short _divide10_exit            ; All done
  336.  
  337.   _div16_setup:
  338.         Mov     CX,16                           ; 16 bits max for divide
  339.  
  340.    _div16_loop:
  341.         Shl     AX,1                            ; Hi bit to carry
  342.         Rcl     BX,1                            ; Carry to partial divdnd
  343.         Cmp     BX,SI                           ; Partial divdnd < divisor
  344.         Jb      _div1016_nxt                    ; Yes - skip subtraction
  345.         Sub     BX,SI                           ; Partial divdnd - divsor
  346.         Inc     AX                              ; Set quotient bit
  347.  
  348.   _div1016_nxt:
  349.         Loop    _div16_loop                     ; Loop thru CX bits
  350.  
  351.   _divide10_exit:
  352.         Pop     CX                              ; Entry value
  353.         Ret
  354. Divide10        Endp
  355.  
  356.  
  357.  
  358.  
  359.  
  360. Comment |
  361. Name    AXDX2DEC
  362. Type    Procedure
  363. Author  BF Gavin
  364.  
  365. Intent  Convert DX:AX to ASCII decimal value in user buffer.
  366. Origin  15MAY1988
  367. Update  04JUN89 - Removed DIVIDE10.PRC from this procedure.
  368.         14SEP89 - Assign unique label names.
  369.         13OCT90 - Control leading blanks with Carry Flag.
  370.  
  371. Needs   Divide10.  This procedure prevents overflow errors (Int03) when
  372.         Quotient > 16 bits.
  373.  
  374. Entry   DX:AX set to HI:LO hex values.
  375.         ES:DI points to start of 10 byte display buffer at entry
  376.         NC use leading zeros.
  377.         CF use leading blanks.
  378.  
  379.         FL - (preserved)
  380.         AX - (preserved)
  381.         BX - (preserved)
  382.         CX - (preserved)
  383.         DX - (preserved)
  384.         DI - (preserved)
  385.         DS - (preserved)
  386.  
  387.  
  388. Exit    Display buffer contains ASCII decimal characters.
  389. Remark  Leading zeros or leading blanks set by switch.
  390.         |
  391.  
  392.  
  393. @AXDX2Dec_Sw    Db      1                       ; 0/1 = leading zeros/blanks
  394. @DecBfrPtr      Dw      0                       ; Save area for DI buffer ptr
  395. AXDX2Dec        Proc    Near
  396.         PushF                                   ; Save all registers used
  397.         Push    AX
  398.         Push    BX
  399.         Push    CX
  400.         Push    DX
  401.         Push    DS
  402.         Mov     @DecBfrPtr,DI                   ; Save DI pointer to buffer
  403.         Mov     @AXDX2Dec_Sw,1                  ; Assume leading blanks wanted
  404.  
  405.         Jc      _axdx2dec                       ; CF = leading blanks
  406.         Mov     @AXDX2Dec_Sw,0                  ; NC = leading zeros
  407.  
  408.   _axdx2dec:
  409.         Cld                                     ; Ascending direction
  410.         Mov     CX,5                            ; Zero the 10 byte display
  411.         Mov     BX,AX                           ; Save AX in BX
  412.         Mov     AX,3030h                        ; Store ASCII zeros
  413.         Rep     Stosw                           ; Do it
  414.         Mov     AX,BX                           ; Restore AX from BX
  415.         Mov     DI,@DecBfrPtr                   ; Restore buffer pointer
  416.         Add     DI,9                            ; End of buffer
  417.         Std                                     ; Descending direction
  418.  
  419.   _axdx2dec_loop:
  420.         Call    Divide10                        ; AX = Quotient, BX = remainder
  421.         Add     BL,30h                          ; Remainder to ASCII
  422.         Mov     [DI],BL                         ; Store in display
  423.         Dec     DI                              ; Instead of Stosb
  424.         Or      AX,AX                           ; Test for Lo dividend
  425.         Jnz     _axdx2dec_loop                  ; More left to do
  426.         Or      DX,DX                           ; Test for Hi dividend
  427.         Jnz     _axdx2dec_loop                  ; AX zero, but Hi is valid
  428.  
  429.   ;Substitute blanks for leading zeros
  430.         Cmp     @AXDX2Dec_Sw,0                  ; Leading zeros?
  431.         Jz      _d32b                           ; Yes - don't substitute blanks
  432.         Mov     DI,@DecBfrPtr                   ; Pointer to start of buffer
  433.         Cld                                     ; Ascending direction
  434.         Mov     CX,9                            ; Check first 9 digits
  435.         Mov     DI,@DecBfrPtr                   ; Start of buffer
  436.  
  437.   _d32a:
  438.         Cmp     Byte Ptr ES:[DI],30h            ; Check for ASCII zero
  439.         Jnz     _d32b                           ; Done
  440.         Mov     Byte Ptr ES:[DI],20h            ; Store a blank
  441.         Inc     DI                              ; Next position
  442.         Loop    _d32a                           ; Keep going
  443.  
  444.   _d32b:
  445.         Mov     DI,@DecBfrPtr                   ; Restore DI pointer
  446.         Pop     DS                              ; Restore all registers used
  447.         Pop     DX
  448.         Pop     CX
  449.         Pop     BX
  450.         Pop     AX
  451.         PopF                                    ; Entry flags
  452.         Ret                                     ; To caller
  453. AXDX2Dec      Endp
  454.