home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / rxfiles.zip / rx_frame.asm < prev    next >
Assembly Source File  |  1997-08-14  |  5KB  |  152 lines

  1. ;-----------------------------------------------------------------------
  2. ; xyzzy.ASM frame for xyzzy.RX by ML /AT /Fe xyzzy.RX xyzzy.ASM
  3. ;-----------------------------------------------------------------------
  4.  
  5. code     segment para public 'CODE'
  6.  
  7.          assume cs:code, ds:code, es:code, ss:code
  8.  
  9. RXSTR    struct
  10.  RxLen   dw     ?
  11.  RxPtr   dd     ?
  12. RXSTR    ends
  13.  
  14. PRXSTR   TYPEDEF far ptr RXSTR
  15.  
  16. SHVBLOCK struct
  17.  ShvNext dd     ?
  18.  ShvNam  RXSTR  <>
  19.  ShvVal  RXSTR  <>
  20.  ShvNamL dw     ?
  21.  ShvValL dw     ?
  22.  ShvCode db     ?
  23.  ShvRet  db     ?
  24. SHVBLOCK ends
  25.  
  26.          org    16h
  27. RXpid    dw     ?               ;_psp:0x16 parent (REXX) pid
  28.  
  29.          org    2Ch
  30. envseg   dw     ?               ;_psp:0x2C environment segment
  31.  
  32.          org    54h
  33. DOSREXX4 dd     ?               ;_psp:0x54 'REXX' signature
  34. SHVENTRY dd     ?               ;_psp:0x58 shared variable handler
  35.  
  36.          org    82h
  37. RXARGC   dw     ?               ;_psp:0x82 number of arguments
  38. RXARGV   PRXSTR ?               ;_psp:0x84 arg.s (length, pointer)
  39. RXRESULT dd     ?               ;_psp:0x88 RESULT buffer (256 bytes)
  40. _RXNAME  db     ?               ;_psp:0x8C (undocumented)
  41.  
  42.          org    100h            ;COM entry point at CS:100
  43. start:   jmp    stack           ;set stack, release memory
  44.  
  45.          ;????? ????
  46.          ;????? ????
  47. argstr   db     ' <= argument',13,10,0
  48.  
  49. ;-----------------------------------------------------------------------
  50. main     proc   near            ;enter after initialization
  51.  
  52.          cmp    word ptr DOSREXX4+2,'XX'
  53.          jne    fail
  54.          mov    cx,RXARGC       ;example: number of arguments
  55.          les    si,RXARGV
  56.          jcxz   copyres
  57.  
  58. nextarg: push   cx
  59.  
  60.          push   ds
  61.          mov    cx,es:RXSTR.RxLen[si]   ;example: argument length
  62.          lds    dx,es:RXSTR.RxPtr[si]   ;example: argument pointer
  63.          mov    bx,2                    ;stderr
  64.          mov    ah,40h                  ;output DS:DX, length CX
  65.          int    21h
  66.          pop    ds
  67.  
  68.          mov    dx,offset argstr
  69.          call   message
  70.          add    si,sizeof RXSTR
  71.          pop    cx
  72.          loop   nextarg
  73.  
  74. copyres: push   ds
  75.          pop    es
  76.          mov    dx,offset _RXNAME
  77.          call   strlen
  78.          les    di,RXRESULT     ;example: ES:DI = RESULT
  79.          mov    si,dx           ;example: DS:SI = _RXNAME
  80.          rep    movsb           ;copy _RXNAME (undocumented)
  81.  
  82.          ;????? ????
  83.          ;????? ????
  84.  
  85. okay:    xor    al,al           ;REXX function ended
  86.          jmp    exit
  87. fail:    mov    al,1            ;REXX function error
  88. exit:    mov    ah,4Ch          ;terminate with RC AL
  89.          int    21h
  90.  
  91. main     endp
  92.  
  93. ;-----------------------------------------------------------------------
  94.  
  95.          ;????? ????
  96.          ;????? ????
  97.  
  98. ;-----------------------------------------------------------------------
  99. strlen   proc   near            ;return length ASCIIZ string ES:DX
  100.  
  101.          xchg   di,dx           ;modifies AX, CX
  102.          mov    cx,di           ;keep DX, DI, ES
  103.          not    cx              ;terminate search at segment limit
  104.          push   di              ;this will work for length < 64 KB
  105.          xor    al,al
  106.          repne  scasb           ;search NUL
  107.          mov    cx,di           ;DI points behind NUL (or is NULL)
  108.          pop    di              ;restore DI
  109.          sub    cx,di           ;length inclusive NUL
  110.          dec    cx              ;length exclusive NUL
  111.          xchg   dx,di           ;restore DX
  112.          ret                    ;returns CX string length
  113.  
  114. strlen   endp
  115.  
  116. ;-----------------------------------------------------------------------
  117. message  proc   near            ;ASCIIZ string DS:DX to STDERR
  118.  
  119.          push   ax              ;modifies BX, CX
  120.          push   es              ;keep AX, DX, DS, ES
  121.          push   ds
  122.          pop    es              ;set ES = DS
  123.          call   strlen          ;CX = strlen( ES:DX )
  124.          pop    es              ;load old ES
  125.  
  126.          mov    bx,2            ;ASCIIZ string DS:DX to STDERR
  127.          mov    ah,40h
  128.          int    21h
  129.          pop    ax
  130.          ret
  131.  
  132. message  endp
  133.  
  134. ;-----------------------------------------------------------------------
  135.          align  16
  136. stkparas equ    32              ;stack size 512 = 32 * 16
  137.  
  138. stack    label  near            ;initialise *.com program
  139.  
  140.          mov    bx,offset stack + 16 * stkparas
  141.          mov    sp,bx           ;new stack 100h above init
  142.          mov    cl,4
  143.          shr    bx,cl           ;used number of paragraphs:
  144.          mov    ah,4ah          ;modify allocated memory to
  145.          int    21h             ;needed size i.e. free rest
  146.  
  147.          jmp    main            ;current SP must be beyond
  148.  
  149. ;-----------------------------------------------------------------------
  150. code     ends
  151.          end    start           ;program entry point
  152.