home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / dpl.zip / ENVSTR.D < prev    next >
Text File  |  1988-07-11  |  4KB  |  174 lines

  1. ; Doug's Programming Language  -- DPL, Version 2.22
  2. ; Copyright (c) 1988 Douglas S. Cody, All rights reserved.
  3. ;----------------------------------------
  4. ;
  5. ; E N V S T R  --  Fetch the matching environment string from the
  6. ;           PSP segment.
  7. ;
  8. ; Entry Conditions:
  9. ;    AX points to the match string
  10. ;    BX points to the target string
  11. ;    ES holds the PSP segment
  12. ; Exit Conditions:
  13. ;    Assume all working registers destroyed.
  14. ;    All segment registers saved.
  15. ;    CARRY SET = not found, CLEAR = found
  16. ;
  17. ; CALLING EXAMPLE:
  18. ;
  19. ;    CALL    ENVSTR match target
  20. ;
  21. ; WHERE:
  22. ;    "match" is an ASCIIZ string to be compared against the PSP
  23. ;       environment strings. This match string must NOT have
  24. ;       the equal sign appended to the end. The match string MUST
  25. ;       be in uppercase since DOS holds the environment strings
  26. ;       in uppercase.
  27. ;    "target" is a ASCIIZ string which will the string found by
  28. ;       the search.
  29. ;
  30. SUBPGM ENVSTR
  31. ;
  32. ; STACK OFFSETS
  33. ;
  34. BPREG        EQU    00        ; SAVING BP
  35. PSPSEG        EQU    -2        ; STORAGE OFFSET TO PSP
  36. DTTASEG        EQU    -4        ; STORAGE OFFSET TO OUR DATA SEGMENT
  37. MTCHSTR        EQU    -6        ; STORAGE OFFSET TO MATCH STRING
  38. TRGSTR        EQU    -8        ; STORAGE OFFSET TO TARGET STRING
  39. SIREG        EQU    -10        ; SAVING SI
  40. DIREG        EQU    -12        ; SAVING DI 
  41. ;
  42. BEGIN    ENVSTR
  43. ;
  44. ; SAVE OUR CRITICALS ON THE STACK
  45. ;
  46.     PUSH    BP            ; FRAME THE STACK
  47.     MOV    BP,SP
  48.     PUSH    ES            ; SAVE THE PSP SEGMENT
  49.     PUSH    DS            ; SAVE THE DATA SEGMENT
  50.     PUSH    AX            ; SAVE THE MATCH STRING
  51.     PUSH    BX            ; SAVE THE TARGET STRING
  52.     PUSH    SI            ; SAVE THE INDEXES...
  53.     PUSH    DI
  54. ;
  55. ; SETUP TO POINT TO THE ENVIRONMENT STRINGS
  56. ;
  57.     PUSH    ES:[02CH]        ; GET THE ENVIRONMENT SEGMENT
  58.     POP    ES
  59.     XOR    DI,DI            ; DI WILL BECOME THE ENVIRONMENT POINTER
  60. ;
  61.     MOV    [BX],DI            ; SET A TERMINATOR IN THE TARGET
  62. ;
  63. EVST_05:
  64. ;
  65. ; GET THE NEXT ENVIRONMENT STRING LENGTH
  66. ;
  67.     CALL    GET_LENGTH
  68.     JC    EVST_BAD        ; EXIT IF OUT OF ENVIRONMENT STRINGS
  69. ;
  70. ; COMPARE THE ENVIRONMENT STRING TO THE MATCH STRING
  71. ;
  72.     MOV    SI,[BP+MTCHSTR]        ; GET THE MATCH STRING ADDRESS
  73. ;
  74. EVST_10:
  75.     REPE    CMPSB            ; COMPARE CHARACTERS
  76.     JE    EVST_GOOD        ; FOUND!!!
  77. ;
  78. ; STRING NOT FOUND, MOVE DI TO THE START OF THE NEXT ENVIRONMENT STRING
  79. ;
  80.     XOR    AL,AL            ; MAKE A MATCH IN AL
  81.     MOV    CX,-1            ; WE WILL SEARCH FOREVER, IF DOS LET'S US (IT WONT)
  82. EVST_15:
  83.     REPNE    SCASB            ; FIND IT!
  84.     JMP    SHORT EVST_05        ; GO FOR THE NEXT STRING
  85. ;
  86. ; STRING WAS FOUND, MOVE IT TO THE TARGET STRING...
  87. ;
  88. EVST_GOOD:
  89.     CMP    BYTE PTR ES:[DI],"="    ; ARE WE SITTING ON THE EQUAL SIGN?
  90.     JNZ    EVST_G05        ; NO, CONTINUE ON...
  91.     INC    DI            ; YES, MOVE PAST THE CHARACTER
  92. ;
  93. ; LOAD ES:[DI] & DS:[SI] FOR A BLOCK MOVE
  94. ;
  95. EVST_G05:
  96.     PUSH    ES            ; SETUP THE SEGMENTS
  97.     POP    DS            ; DS HOLDS THE ENVIRONMENT SEGMENT
  98.     MOV    ES,[BP+DTTASEG]
  99.     MOV    SI,DI            ; SI POINTS TO THE ENVIRONMENT STRING
  100.     MOV    DI,[BP+TRGSTR]        ; DI POINTS TO THE TARGET STRING
  101. ;
  102. EVST_G10:
  103.     LODSB                ; FETCH THE SOURCE STRING CHARACTER
  104.     STOSB                ; SAVE IN THE TARGET STRING
  105.     OR    AL,AL            ; ARE WE DONE?
  106.     JNZ    EVST_G10        ; NO, DO IT ALL
  107. ;
  108. ; ALL DONE, RESTORE ALL & RETURN HOME...
  109. ;
  110.     CLC                ; CLEAR CARRY
  111.     JMP    EVST_COMM        ; & EXIT THROUGH COMMON CODE
  112. ;
  113. ; WE GET HERE IF THE ENVIRONMENT DID NOT HAVE A MATCH FOR US.
  114. ;
  115. EVST_BAD:
  116.     STC                ; SET CARRY FOR MISMATCH CONDITION
  117. ;
  118. EVST_COMM:
  119.     POP    DI            ; RESTORE ALL & EXIT
  120.     POP    SI
  121.     POP    BX
  122.     POP    AX
  123.     POP    DS
  124.     POP    ES
  125.     POP    BP
  126.     RETURN
  127. ;
  128. ;
  129. ;=====================
  130. ;   ROUTINE SECTION
  131. ;    LEVEL 1
  132. ;=====================
  133. ;
  134. ;
  135. ;-----------------------------------------
  136. ; G E T _ L E N G T H  --  GET THE LENGTH OF THE
  137. ;               CURRENT ENVIRONMENT STRING
  138. ; Entry conditions:
  139. ;    ES:DI point to the start of the current string
  140. ; Exit conditions:
  141. ;    Carry SET   = end of list
  142. ;          CLEAR = data is available for checking
  143. ;              CX holds the environment string length
  144. ;
  145. GET_LENGTH    PROC    NEAR
  146.     CMP    BYTE PTR ES:[DI],0    ; ARE WE DONE?
  147.     JNZ    GTLN_05            ; NO, GO FIND THE LENGTH
  148.     STC
  149.     RET
  150. ;
  151. GTLN_05:
  152.     MOV    CX,DI            ; CX WILL HOLD OUR STARTING ADDRESS
  153.     MOV    AL,'='            ; THIS IS OUR TERMINATOR
  154. ;
  155. GTLN_10:
  156.     MOV    AH,ES:[DI]        ; GET THE CHARACTER
  157.     SCASB                ; SCAN FOR THE CHARACTER
  158.     JZ    GTLN_15            ; FOUND! EXIT NOW
  159.     OR    AH,AH            ; WAS THIS A NULL TERMINATOR?
  160.     JNZ    GTLN_10            ; NO, CONTINUE THE SEARCH
  161. ;
  162. GTLN_15:
  163.     DEC    DI            ; DISCOUNT THE TERMINATOR
  164.     XCHG    CX,DI            ; CX = ENDING ADDRESS, DI=ORIG ADDRESS
  165.     SUB    CX,DI            ; CX HOLDS THE LENGTH
  166.     CLC
  167.     RETURN
  168.  
  169. GET_LENGTH    ENDP
  170. ;
  171. ENDPGM    ENVSTR
  172.