home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / Tu-Basic / SETDTA.ASM < prev    next >
Assembly Source File  |  1987-04-01  |  3KB  |  81 lines

  1.  
  2. ; This routine  expects three  routines to be passed onto the stack.  The
  3. ; first  and second  represent the possible address(Segment and Offset) of
  4. ; the new DTA while the third is a string that may have been allocated for
  5. ; the DTA.  If  both the Segment  and Offset values are equal to zero then
  6. ; the  DTA will be set to  the location of the string descriptor. However,
  7. ; if either  the segment or the  offset is not equal to zero  then the DTA
  8. ; will be set to the address specified by the first two parameters.
  9. ;
  10. ;      STACK after saving BP
  11. ;
  12. ;   │ 32 Bit(Segment and Offset) │
  13. ;   │ pointer to TB integer rep- │ <----- BP + 0Eh
  14. ;   │ resenting segment of DTA   │
  15. ;   ├────────────────────────────┤
  16. ;   │ 32 Bit(Segment and Offset) │
  17. ;   │ pointer to TB integer rep- │ <----- BP + 0Ah
  18. ;   │ resenting offset of DTA     │
  19. ;   ├────────────────────────────┤
  20. ;   │ 32 Bit(Segment and Offset) │
  21. ;   │ pointer to TB string desc- │ <----- BP + 6
  22. ;   │ riptor representing DTA    │
  23. ;   ├────────────────────────────┤
  24. ;   │     return address that     │
  25. ;   │     TB will go to after     │ <----- BP + 2
  26. ;   │    completion of routine     │
  27. ;   ├────────────────────────────┤
  28. ;   │    saved BP               │ <----- BP
  29. ;   │                           │
  30. ;   └────────────────────────────┘
  31.  
  32. Zero     equ  00h    ; equates for this program
  33. DosCall  equ  21h
  34. SetDTA   equ  1Ah
  35.  
  36.  
  37. program segment  ; begin program segment
  38.   assume cs:program
  39.  
  40.   push  bp      ; save bp
  41.   mov   bp, sp
  42.   push  es      ; save es because we'll use it for pointer manipulation
  43.   push  ds      ; ditto
  44.  
  45.   les   di, [bp + 0Eh]  ; get pointer to segment
  46.   mov   ax, es:[di]     ; put segment value in ax
  47.   cmp   ax, Zero
  48.   jnz   SegOrOfsIsNotZero  ; if ax <> 0 then use segment and offset values
  49.  
  50.   les   di, [bp + 0Ah]  ; get pointer to segment
  51.   mov   dx, es:[di]     ; put segment value in ax
  52.   cmp   dx, Zero
  53.   jz    SegAndOfsZero   ; if ax = 0 then use string location
  54.  
  55. SegOrOfsIsNotZero:
  56.   mov   ds, ax
  57.   mov   si, dx
  58.  
  59. SegAndOfsZero:
  60.   ; need to get location of string
  61.   les   di, [bp + 6h] ; get pointer to Turbo Basic String Descriptor
  62.   mov   dx, ds:[0]    ; get the beginning of the string segment from ds:[0]
  63.   push  dx
  64.   pop   ds            ; make ds point to string segment
  65.   mov   dx, es:[di + 2]   ; get offset into string segment from es:[di + 2]
  66.  
  67. DoDOSCall:
  68.   ; now ds:dx points to the appropriate location for the DOS Set DTA
  69.   ; call
  70.   mov   ah, SetDTA
  71.   int   DosCall
  72.  
  73.   pop   ds
  74.   pop   es      ; restore registers
  75.   pop   bp
  76.  
  77. program ends    ; end program segment
  78.  
  79. end
  80.  
  81.