home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Monster Media 1993 #2
/
Image.iso
/
clipper
/
nettos11.zip
/
MISC
/
FNCBALL.ASM
< prev
next >
Wrap
Assembly Source File
|
1992-10-18
|
6KB
|
120 lines
; File......: FNCBALL.ASM
; Author....: Ted Means
; CIS ID....: 73067,3332
; Date......: $Date$
; Revision..: $Revision$
; Log file..: $Logfile$
;
; This is an original work by Ted Means and is placed in the
; public domain.
;
; Modification history:
; ---------------------
;
; $Log$
;
IDEAL
PUBLIC __FNCBALL
EXTRN __PARINFO:FAR
EXTRN __PARCLEN:FAR
EXTRN __PARC:FAR
EXTRN __PARNI:FAR
EXTRN __RETCLEN:FAR
EXTRN __RETNI:FAR
SEGMENT _FNNET WORD PUBLIC "CODE"
ASSUME CS:_FNNET
PROC __FNCBALL FAR
PUSH BP ; Save BP
MOV BP,SP ; Set up stack reference
SUB SP,12 ; Create local vars on stack
MOV [WORD PTR BP - 2],DX ; Load instruction sequence into
MOV [WORD PTR BP - 4],AX ; local variable
MOV [WORD PTR BP - 6],0 ; Initialize return value
LEA AX,[BP - 4] ; Get IP of bit operation code
MOV [WORD PTR BP - 12],AX ; Store in local var
MOV [WORD PTR BP - 10],SS ; Store CS of bit op code
XOR AX,AX ; Prepare to count params
PUSH AX ; Save on stack
CALL __PARINFO ; Call parameter info routine
ADD SP,2 ; Realign stack
MOV BX,2 ; Param count should be 2
CMP [BYTE PTR BP - 4],0F7h ; Unless NOT or NEG requested
JNE HOWMANY ; If not, don't worry
DEC BX ; NOT and NEG use only one param
HOWMANY: CMP AX,BX ; See if two parameters passed
JNE DONE_N ; If not, return zero
CMP [BYTE PTR BP - 4],0F7h ; See if NOT or NEG requested
JE TEST1 ; If so, no second param
TEST2: MOV AX,2 ; Prepare to test second param
PUSH AX ; Save on stack
CALL __PARINFO ; Call parameter info routine
ADD SP,2 ; Realign stack
TEST AX,2 ; See if parameter is numeric
JZ DONE_N ; If not, return zero
TEST1: MOV AX,1 ; Prepare to test first param
PUSH AX ; Save on stack
CALL __PARINFO ; Call parameter info routine
ADD SP,2 ; Realign stack
TEST AX,3 ; See if character or numeric
JZ DONE_N ; If not, return zero
WHICH: TEST AX,1 ; See if character
MOV AX,1 ; Specify first parameter
PUSH AX ; Save on stack
JNZ GET_C ; If not, use __PARC
GET_N: CALL __PARNI ; Get param as integer
MOV [WORD PTR BP - 8],OFFSET _FNNET:DONE_N
; Store offset of return handler
JMP SHORT GET_2 ; Skip over __PARC call
GET_C: CALL __PARC ; Get param as character
MOV ES,DX ; Put segment portion into ES
MOV BX,AX ; Put offset portion into BX
MOV AX,[WORD PTR ES:BX] ; Load value into AX
MOV [WORD PTR BP - 8],OFFSET _FNNET:DONE_C
; Store offset of return handler
CMP [BYTE PTR BP - 4],0F7h ; See if NOT or NEG requested
JE MANIP ; If so, no second param
GET_2: ADD SP,2 ; Realign stack
MOV [WORD PTR BP - 6],AX ; Put param into local var
MOV AX,2 ; Specify second param
PUSH AX ; Save on stack
CALL __PARNI ; Retrieve second parameter
ADD SP,2 ; Realign stack
MOV CX,AX ; In case of shift or rotate
MANIP: CALL [DWORD PTR BP - 12] ; Execute bit instruction
JMP [WORD PTR BP - 8] ; Jump to return handler
DONE_N: PUSH [WORD PTR BP - 6] ; Put return value on stack
CALL __RETNI ; Return value to Clipper app
JMP SHORT EXIT ; Go to exit handler
DONE_C: MOV AX,2 ; Length of string
PUSH AX ; Save on stack
LEA AX,[WORD PTR BP - 6] ; Get address of return value
PUSH SS ; Segment of return value
PUSH AX ; Offset of return value
CALL __RETCLEN ; Return value to Clipper app
EXIT: MOV SP,BP ; Reset stack pointer
POP BP ; Restore BP
RETF ; Return to application
ENDP __FNCBALL
ENDS _FNNET
END