home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / pcmagazi / 1988 / 02 / modenv.asm next >
Assembly Source File  |  1987-12-14  |  4KB  |  138 lines

  1.          name      modenv
  2.          page      55,132
  3.          title     MODENV --- demo of PUTENV function
  4. ;
  5. ; MODENV.ASM --- demonstrate use of PUTENV routine
  6. ; (C) 1987 Ziff Communications Co, by Ray Duncan
  7. ;
  8.  
  9. stdin   equ     0               ; MS-DOS handles for
  10. stdout  equ     1               ; standard devices
  11. stderr  equ     2
  12.  
  13. cr      equ     0dh             ; ASCII carriage return
  14. lf      equ     0ah             ; ASCII line feed
  15.  
  16. stksize equ     128             ; size of stack segment
  17.  
  18.         extrn   putenv:near     ; changes environment string
  19.  
  20. DGROUP  group   _DATA,STACK
  21.  
  22. _TEXT   segment word public 'CODE'
  23.  
  24.         assume  cs:_TEXT,ds:DGROUP,ss:STACK
  25.  
  26. main    proc    far             ; entry point from MS-DOS
  27.  
  28.         mov     ax,DGROUP       ; make our data segment 
  29.         mov     ds,ax           ; addressable
  30.  
  31.                                 ; now give back extra memory...
  32.         mov     ax,es           ; let AX = segment of PSP base
  33.         mov     bx,ss           ; and BX = segment of stack base
  34.         sub     bx,ax           ; reserve seg stack - seg psp 
  35.         add     bx,stksize/16   ; plus paragraphs of stack
  36.         inc     bx              ; round up for safety
  37.         mov     ah,4ah          ; fxn 4ah = modify memory block
  38.         int     21h             ; transfer to MS-DOS
  39.         jc      main9           ; exit if resize failed
  40.  
  41.         mov     pspseg,es       ; save segment of PSP   
  42.  
  43.         mov     dx,offset msg1  ; display message
  44.         mov     cx,msg1_len     ; 'Before call to PUTENV'
  45.         call    pmsg
  46.  
  47.         mov     es,es:[002ch]   ; get environment pointer
  48.         call    dumpenv         ; dump environment strings
  49.  
  50.                                 ; change PROMPT= in environment
  51.         mov     es,pspseg       ; ES = PSP segment
  52.         mov     si,offset prompt; DS:SI = new value for PROMPT
  53.         call    putenv  
  54.  
  55.         mov     dx,offset msg2  ; display message
  56.         mov     cx,msg2_len     ; 'After call to PUTENV'
  57.         call    pmsg
  58.  
  59.         mov     es,pspseg       ; let ES = segment of environment
  60.         mov     es,es:[002ch]
  61.         call    dumpenv         ; dump environment strings
  62.  
  63. main9:  mov     ax,4c00h        ; final exit to MS-DOS
  64.         int     21h
  65.  
  66. main    endp
  67.  
  68.  
  69. dumpenv proc    near            ; dump contents of environment
  70.                                 ;  block to standard output
  71.                                 ; call with ES = env. base
  72.  
  73.         xor     di,di           ; initialize env. offset
  74.  
  75. dump1:                          ; reached end of env. block?
  76.         cmp     byte ptr es:[di],0
  77.         je      dump2           ; yes, exit
  78.  
  79.         mov     dx,offset msg3  ; no, move to new line
  80.         mov     cx,msg3_len     ;  by sending carriage 
  81.         call    pmsg            ;  return/line feed
  82.  
  83.         mov     dx,di           ; save address of next 
  84.         mov     cx,-1           ;  environment variable
  85.         xor     al,al           ;  and find its length
  86.         repne scasb             ; scan for terminating null
  87.         not     cx
  88.         dec     cx              ; now CX = length
  89.         push    ds              ; save our data segment
  90.         mov     ax,es           ; let DS:DX = address
  91.         mov     ds,ax           ;  of environment variable
  92.         call    pmsg            ;  and display it
  93.         pop     ds              ; restore our data segment
  94.         jmp     dump1           ; get next env. variable
  95.  
  96. dump2:  ret                     ; back to caller
  97.  
  98. dumpenv endp
  99.  
  100.  
  101. pmsg    proc    near            ; print message on stdout
  102.                                 ; DS:DX=message, CX=length
  103.         mov     bx,stdout
  104.         mov     ah,40h
  105.         int     21h
  106.         ret
  107.  
  108. pmsg    endp
  109.  
  110. _TEXT   ends
  111.  
  112.  
  113. _DATA   segment word public 'DATA'
  114.  
  115. pspseg  dw      ?               ; segment of program segment prefix
  116.  
  117. msg1    db      cr,lf,'Before call to PUTENV:'
  118. msg1_len equ $-msg1
  119.  
  120. msg2    db      cr,lf,lf,'After call to PUTENV:'
  121. msg2_len equ $-msg2
  122.  
  123. msg3    db      cr,lf           ; carriage return/line feed
  124. msg3_len equ $-msg3
  125.  
  126. prompt  db      'PROMPT=This is a test!$_$p$g',0
  127.  
  128. _DATA   ends
  129.  
  130.  
  131. STACK   segment para stack 'STACK'
  132.  
  133.         db      stksize dup (?)
  134.  
  135. STACK   ends
  136.  
  137.         end     main
  138.