home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1993 #2 / Image.iso / clipper / nettos11.zip / MISC / FNCBALL.ASM < prev    next >
Assembly Source File  |  1992-10-18  |  6KB  |  120 lines

  1. ; File......: FNCBALL.ASM
  2. ; Author....: Ted Means
  3. ; CIS ID....: 73067,3332
  4. ; Date......: $Date$
  5. ; Revision..: $Revision$
  6. ; Log file..: $Logfile$
  7. ; This is an original work by Ted Means and is placed in the
  8. ; public domain.
  9. ;
  10. ; Modification history:
  11. ; ---------------------
  12. ;
  13. ; $Log$
  14. ;
  15.  
  16. IDEAL
  17.  
  18. PUBLIC   __FNCBALL
  19.  
  20. EXTRN    __PARINFO:FAR
  21. EXTRN    __PARCLEN:FAR
  22. EXTRN    __PARC:FAR
  23. EXTRN    __PARNI:FAR
  24. EXTRN    __RETCLEN:FAR
  25. EXTRN    __RETNI:FAR
  26.  
  27. SEGMENT  _FNNET  WORD      PUBLIC    "CODE"
  28.          ASSUME    CS:_FNNET
  29.  
  30. PROC     __FNCBALL   FAR
  31.  
  32.          PUSH      BP                        ; Save BP
  33.          MOV       BP,SP                     ; Set up stack reference
  34.          SUB       SP,12                     ; Create local vars on stack
  35.          MOV       [WORD PTR BP - 2],DX      ; Load instruction sequence into
  36.          MOV       [WORD PTR BP - 4],AX      ; local variable
  37.          MOV       [WORD PTR BP - 6],0       ; Initialize return value
  38.          LEA       AX,[BP - 4]               ; Get IP of bit operation code
  39.          MOV       [WORD PTR BP - 12],AX     ; Store in local var
  40.          MOV       [WORD PTR BP - 10],SS     ; Store CS of bit op code
  41.  
  42.          XOR       AX,AX                     ; Prepare to count params
  43.          PUSH      AX                        ; Save on stack
  44.          CALL      __PARINFO                 ; Call parameter info routine
  45.          ADD       SP,2                      ; Realign stack
  46.          MOV       BX,2                      ; Param count should be 2
  47.          CMP       [BYTE PTR BP - 4],0F7h    ; Unless NOT or NEG requested
  48.          JNE       HOWMANY                   ; If not, don't worry
  49.          DEC       BX                        ; NOT and NEG use only one param
  50. HOWMANY: CMP       AX,BX                     ; See if two parameters passed
  51.          JNE       DONE_N                    ; If not, return zero
  52.  
  53.          CMP       [BYTE PTR BP - 4],0F7h    ; See if NOT or NEG requested
  54.          JE        TEST1                     ; If so, no second param
  55.  
  56. TEST2:   MOV       AX,2                      ; Prepare to test second param
  57.          PUSH      AX                        ; Save on stack
  58.          CALL      __PARINFO                 ; Call parameter info routine
  59.          ADD       SP,2                      ; Realign stack
  60.          TEST      AX,2                      ; See if parameter is numeric
  61.          JZ        DONE_N                    ; If not, return zero
  62.  
  63. TEST1:   MOV       AX,1                      ; Prepare to test first param
  64.          PUSH      AX                        ; Save on stack
  65.          CALL      __PARINFO                 ; Call parameter info routine
  66.          ADD       SP,2                      ; Realign stack
  67.          TEST      AX,3                      ; See if character or numeric
  68.          JZ        DONE_N                    ; If not, return zero
  69.  
  70. WHICH:   TEST      AX,1                      ; See if character
  71.          MOV       AX,1                      ; Specify first parameter
  72.          PUSH      AX                        ; Save on stack
  73.          JNZ       GET_C                     ; If not, use __PARC
  74.          
  75. GET_N:   CALL      __PARNI                   ; Get param as integer
  76.          MOV       [WORD PTR BP - 8],OFFSET _FNNET:DONE_N
  77.                                              ; Store offset of return handler
  78.          JMP       SHORT GET_2               ; Skip over __PARC call
  79.  
  80. GET_C:   CALL      __PARC                    ; Get param as character
  81.          MOV       ES,DX                     ; Put segment portion into ES
  82.          MOV       BX,AX                     ; Put offset portion into BX
  83.          MOV       AX,[WORD PTR ES:BX]       ; Load value into AX
  84.          MOV       [WORD PTR BP - 8],OFFSET _FNNET:DONE_C
  85.                                              ; Store offset of return handler
  86.  
  87.          CMP       [BYTE PTR BP - 4],0F7h    ; See if NOT or NEG requested
  88.          JE        MANIP                     ; If so, no second param
  89.  
  90. GET_2:   ADD       SP,2                      ; Realign stack
  91.          MOV       [WORD PTR BP - 6],AX      ; Put param into local var
  92.          MOV       AX,2                      ; Specify second param
  93.          PUSH      AX                        ; Save on stack
  94.          CALL      __PARNI                   ; Retrieve second parameter
  95.          ADD       SP,2                      ; Realign stack
  96.          MOV       CX,AX                     ; In case of shift or rotate
  97.  
  98. MANIP:   CALL      [DWORD PTR BP - 12]       ; Execute bit instruction
  99.          JMP       [WORD PTR BP - 8]         ; Jump to return handler
  100.  
  101. DONE_N:  PUSH      [WORD PTR BP - 6]         ; Put return value on stack
  102.          CALL      __RETNI                   ; Return value to Clipper app
  103.          JMP       SHORT EXIT                ; Go to exit handler
  104.  
  105. DONE_C:  MOV       AX,2                      ; Length of string
  106.          PUSH      AX                        ; Save on stack
  107.          LEA       AX,[WORD PTR BP - 6]      ; Get address of return value
  108.          PUSH      SS                        ; Segment of return value
  109.          PUSH      AX                        ; Offset of return value
  110.          CALL      __RETCLEN                 ; Return value to Clipper app
  111.  
  112. EXIT:    MOV       SP,BP                     ; Reset stack pointer
  113.          POP       BP                        ; Restore BP
  114.          RETF                                ; Return to application
  115.  
  116. ENDP     __FNCBALL
  117. ENDS     _FNNET
  118. END
  119.