home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / progc / c_all592.arj / TI430.ASC < prev    next >
Text File  |  1991-08-27  |  5KB  |  199 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.   PRODUCT  :  TURBO BASIC                            NUMBER  :  430
  8.   VERSION  :  1.1
  9.        OS  :  PC-DOS
  10.      DATE  :  APRIL 4, 1989                            PAGE  :  1/3
  11.  
  12.     TITLE  :  PASSING STRINGS VIA A CALL ABSOLUTE STATEMENT TO AN
  13.               ASSEMBLY LANGUAGE PROCEDURE
  14.  
  15.  
  16.  
  17.  
  18.   This program demonstrates how to  pass  strings,  using  the CALL
  19.   ABSOLUTE statement, to an assembly language procedure.
  20.  
  21.  
  22.   'TESTCAPS.BAS invokes CAPS.COM
  23.  
  24.   A = EndMem - 100     'Reserve space for CAPS.ASM (trailer-header
  25.                         = 41h)
  26.   MEMSET A             'Reserve an area at the top of memory for
  27.                         the subroutine
  28.                        'Compute the 16-bit segment from the 32-bit
  29.                         start address
  30.   Segment = fix(A/16)
  31.                        'Compute the 16-bit offset from the 32-bit
  32.                         address
  33.   Ucase = A - (Segment * 16)
  34.   DEF SEG = Segment
  35.   BLOAD "CAPS.COM",Ucase
  36.   DEF SEG
  37.   CLS
  38.   A$ = "Hello World !"
  39.   B$ = SPACE$(LEN(A$))
  40.                        'Call to translate A$ to uppercase and store
  41.                        'in B$
  42.  
  43.   S1seg% = VARSEG(A$)  'Store the segment address of A$ in S1seg%
  44.   S1ofs% = VARPTR(A$)  'Store the address of A$ in S1seg%
  45.  
  46.   S2seg% = VARSEG(B$)  'Store the address of B$ in S1seg%
  47.   S2ofs% = VARPTR(B$)  'Store the address of B$ in S1seg%
  48.   DEF SEG = Segment
  49.   CALL ABSOLUTE Ucase(S1seg%,S1ofs%,S2seg%,S2ofs%)
  50.   DEF SEG
  51.  
  52.   PRINT "[";A$;"]"
  53.   PRINT "[";B$;"]"
  54.   END
  55.  
  56.  
  57.  
  58.   ;CAPS.ASM
  59.   ;Translate the first parameter to uppercase and store in second
  60.   ;parameter.
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.   PRODUCT  :  TURBO BASIC                            NUMBER  :  430
  74.   VERSION  :  1.1
  75.        OS  :  PC-DOS
  76.      DATE  :  APRIL 4, 1989                            PAGE  :  2/3
  77.  
  78.     TITLE  :  PASSING STRINGS VIA A CALL ABSOLUTE STATEMENT TO AN
  79.               ASSEMBLY LANGUAGE PROCEDURE
  80.  
  81.  
  82.  
  83.  
  84.   ;CAPS.COM is called from Turbo Basic:
  85.   ;
  86.   ; 'reserve space for caps.asm (trailer -header = 41h 1h)
  87.   ;  A= ENDMEM - 100
  88.   ;  MEMSET A
  89.   ;
  90.   ; 'Convert first$ to uppercase and store in second$:
  91.   ;  S1seg% = VARSEG(First$)
  92.   ;  S1ofs% = VARPTR(First$)
  93.   ;  S2seg% = VARSEG(Second$)
  94.   ;  S2ofs% = VARPTR(Second$)
  95.   ;  Segment = fix(A/16)
  96.   ;  Ucase = A - (Segment * 16)
  97.   ;  DEF SEG = Segment
  98.   ;  CALL ABSOLUTE Ucase(S1seg%,S1ofs%,S2seg%,S2ofs%)
  99.   ;  DEF SEG
  100.   ;
  101.   ;  Assembled with Microsoft's Macro Assembler 4.00
  102.   ;
  103.   bsave   equ  0fdh
  104.   aaa     segment para       ;BLOAD header
  105.           db bsave
  106.           dw 0,0
  107.           dw trailer-header
  108.   aaa     ends
  109.   cseg    segment byte public 'code'
  110.           assume cs:cseg,ds:cseg
  111.   header  equ $
  112.   caps    proc far
  113.           push bp
  114.           push ds         ;save ds and es too because we must
  115.                           ;now
  116.           push es         ;keep track of string's segment
  117.           mov ax,ds       ;save ds in ax temporarily
  118.           mov bp,sp
  119.           mov si,[bp+0eh] ;ofs of int var which holds 1ststr
  120.                           ;desc ofs
  121.           mov si,[si]     ;SI=offset of 1st string descriptor
  122.           mov bx,[bp+10h] ;ofs of int var which holds 1st str
  123.                           ;desc seg
  124.           mov ds,[bx]     ;DS = segment of 1st string descriptor
  125.           mov cx,[si]     ;get length of 1st string from descriptor
  126.           and ch,80h      ;strip off upper reserved bit of length
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.   PRODUCT  :  TURBO BASIC                            NUMBER  :  430
  140.   VERSION  :  1.1
  141.        OS  :  PC-DOS
  142.      DATE  :  APRIL 4, 1989                            PAGE  :  3/3
  143.  
  144.     TITLE  :  PASSING STRINGS VIA A CALL ABSOLUTE STATEMENT TO AN
  145.               ASSEMBLY LANGUAGE PROCEDURE
  146.  
  147.  
  148.  
  149.  
  150.           jcxz s2         ;done if string length = 0
  151.           mov si,[si+2]   ;get offset of 1st string in string
  152.                           ;segment
  153.           mov ds,ax       ;get original DS value back
  154.           mov ax,ds:0     ;AX = current string segment value (from
  155.                           ;DS:0)
  156.           mov di,[bp+0ah] ;ofs of int var which holds 2nd str desc
  157.                           ;ofs
  158.           mov di,[di]     ;DI = offset of 2nd string descriptor
  159.           mov bx,[bp+0ch] ;ofs of int var which holds 2nd str desc
  160.                           ;seg
  161.           mov es,[bx]     ;ES = segment of 2nd string descriptor
  162.           mov di,es:[di+2];get offset of 2nd string in string
  163.                           ;segment
  164.           mov ds,ax       ;DS = current string segment value (from
  165.                           ;DS:0)
  166.           mov es,ax       ;put it in ES for later
  167.   ;
  168.   ;      At this point, DS:SI points to the start of first$, CX
  169.   ;      contains the length of first$, and ES:DI points to the
  170.   ;      start of second$
  171.   ;
  172.   S0:
  173.           lodsb           ;get character from DS:SI (first$)
  174.           cmp al,'a'
  175.           jl s1
  176.           cmp al,'z'
  177.           jg s1
  178.           and al,223
  179.   S1:
  180.           stosb
  181.           loop S0          ;put character in ES:DI (second$)
  182.  
  183.   S2:     mov sp,bp
  184.           pop es           ;restore ES and DS too
  185.           pop ds
  186.           pop bp
  187.  
  188.           ret 8
  189.   caps    endp
  190.   trailer equ $
  191.   cseg    ends
  192.           end
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.