Está en la página 1de 58

NASA Technical Memorandum

83783
NAgA-TM-83783 19850002375

4 ,f"

Floating-Point Function Generation Routines for 16-Bit Microcomputers

Michael A. Mackin and James F. Soeder Lewis Research Center Cleveland, Ohio

!i"'/_

ig84

].ANGLEYRESEARCH CENTER LIBRARY,NASA HM_llJTOrl, VIRGINIA

October 1984

1
J

RIASA

FLOATING-POINT FUNCTION GENERATIONROUTINES FOR 16-BIT MICROCOMPUTERS MichaelA. Mackln and James F. Soeder NationalAeronauticsand Space Administration Lewis Research Center Cleveland,Ohio 44135 SUMMARY Several computer subroutineshave been developedthat interpolatethree types of nonanalyticfunctions: unlvarlate,blvarlate,and map. The routines use data in floatlng-polnt form. However, because they are written for use on a 16-blt Intel 8086 systemwith an 8087 mathematicalcoprocessor,they execute as fast as routines using data in scaled integer form. Although all of the routines are written in assembly language they have been implementedin a modular fashion so as to facilitatetheir use with hlgh-levellanguages
I

INTRODUCTION The use of digitalmicrocomputersin real-tlmesimulationand control applicationshas created a need for hlgh-speedfunction generationroutines. These routines are needed to mathematicallysimulate the relationshipsbetween the inputs and outputs of a physical system. For function generationroutines being used in the controlof systems such as gas turbine engines, speed of executionis a major concern. Previously, because of this speed requirement,function generationprograms could only deal wlth data in an integer format (ref. l). However, by using a mathematical floatlng-polnt hardware coprocessor,these routines can be extended to deal with data in floatlng-polnt form. The programs described in this report are written in assembly language for use with the Intel 8086 microprocessor and the 8087 coprocessorchip. They use stralght-llneinterpolation as the numerical estimationmethod and are callable from hlgh-levellanguages. The ability of these programs to be directly linked with a hlgh-levellanguagemakes it possible to develop the main logic of a control in a hlgh-levellanguagewith calls to the assembly language routineswhen hlgh-speedfunction generationis needed. These programs deal with three types of functionalrelationships: (1). simple Input-outputfunctions(unlvarlatefunctions),(2) functionsof two variableswith identical x data values on each curve (blvarlatefunctions), and (3) functionsof two variableswith different x data values on each curve (map.functlons). Figures1 to 3 illustrateeach type. The programs are describedby examiningthe three types of functions,by discussingthe computer subroutineswritten to implementthese functions,and by examininghow the high computationspeeds were achieved.

DESCRIPTIONOF FUNCTION TYPES The six programs described in this report can interpolateoutputs for three kinds of functionalrelationships. These functionalrelationshipsare described in this section.

FunctionType One (UnlvarlateFunction) This is the Simplesttype of function. It Is a simple Input-output relationshipin which all data points are on the same curve (fig. l). Every input value x uniquely Identlfles.anoutput value y. The function can be symbolizedas YV = F(Xv). An output value YV for which there is no corresponding experimentaldata point XV can be found by linearly interpolating between adjacent data points. This interpolationis carried out by using equation (1).

YV :

H - Y

+ YL

(I)

The relationshipsbetween variablesare shown in figure l.


o

FunctionType Two (BlvarlateFunction) This function consists of a family of curves (fig. 2) instead of the single curve of functiontype one. Each curve has a particularvalue of z assigned to it. Therefore it is necessary to provide two input values, XV and Zv, before an output can be determined. This type of functionalrelationship can be symbolizedas YV = F(Xv, ZV)- For this function a restrictionis made that each curve must have the same number of data points. Additionally, it is requiredthat the data points for each curve be taken at identicalvalues of x. The output YV is found by linearly interpolatingbetweenadjacent x and z values by using equations(2) to (4):

The relationshipsbetween variablesare shown in flgure4.

Function Type Three (Map Function) This last function, which also consists of a family of curves, is the most general one. The restriction requiring all curves to have the same x breakpoints Is removed. However, each curve ls still required to have the same number of breakpoints per z curve (fig. 3). Because each curve has a unique set of x and y breakpoints, additional calculations must be made. The equations required to obtain the interpolated output YV = F(Xv, ZV) are

xF =
XG = , Z__ ZL)

B- Xc) Xc
_E - X_ ' + XD (6)

YG =

_E - Y_

+ YD

(8,

YV =

_G - YO

+ YF

(9)

The relationships between variablesare shown In figure 5. DESCRIPTIONOF COMPUTER ROUTINES Theprograms used to implementfunction generationwere developedfor the Intel 8086 16-blt microprocessor coupledwlth an 8087 mathematicalcoprocessor. The 80B6 chlp uses 16-blt address registersand 16-blt segment registers. An address reglster and a segment register are combined to form a 20-blt address that can access up to l megabyte of storage (fig. 6). In Intel"small-memory model", programs the segment registersremain constantwhile the program is executing. Although thls restrictionallows the program to address only 64K bytes of storage,it simplifiesmany programmingtasks and has the least amount of programmingoverhead. Intel "large-memory model" programs do not require the segment registersto remain constant. Thus large-modelprogramsmustset up and maintain the segment registersat their correct values. Becauseof the subtle differencesbetween the large and small models, slx separate function generationroutinesare presented In thls report,a large- and small-model program for each of the three types of function. Further informationon the large-and small-memorymodels for the 8086/8087processorsIs given In references2 to 5.

Linking to High-LevelLanguages The function generationroutinescan be linked to both large- and smallmodel hlgh-levellanguageprograms because all Intel conventionsregardingthe saving and restoringof registersare followed. This means that the routines can be used with Fortran-B6,a large-model, hlgh-levellanguage,or PL/M-86, which can be either a large- or small-modellanguage. The hlgh-levellanguage must supply the function generationroutineswith two types of input parameter: (1) the address in memory of a data block holding informationabout the experimentalbreakpolnts(the breakpointinformation block), and (2) the input values of the function. The breakpointinformationblock contains two types of information: (1) informationused to describe the format of the experimentdata, and (2) the arrays holding the data. All items in the breakpointinformationblock are identifiedin figure 7. An example of a typical hlgh-level-language call includingsetup of the breakpointinformationblock is shown in figure 8. Accordingto parameter passlng conventlons,the first storageaddress in the breakpointinformation block (the variable XPTR) Is passed by the hlgh-level-language program on the BOB6 stack, and the real-numberinput values are passed on the 8087 stack. The final interpolatedresult produced by the lookup routine is returned to the hlgh-level-language program on the 8087 stack. When the parametersare passed to the subroutineas shown in figure 8, this process is taken care of automaticallyby the compiler and assembly language function routines and is transparenttothe hlgh-levellanguage programmer. Out-Of-RangeConditions For a typical control applicationan out-of-rangedata input must not be allowed to cause an unpredictableoutput. This is necessaryto prevent damage to the control system that could occur if, for instance,an actuator were pushed beyond its range of operation. If a value is out or range, either too high or too low, the programs will output the closest boundary value of the function. If, for example, the input value is higher than the last experimental data point in the breakpointinformationblock of a simple Input-output curve, the routinewill output the highestexperimentalvalue. If the input z value Into a two-varlablefunction interpolationroutine is above the maximum z data value, the routinewill use the highest allowable z curve when performingthe interpolation(fig. 9). Dealingwith out-of-rangevalues in this way keeps the output from becoming unpredictableand results in a control system that is well behaved. OPERATION OF COMPUTER ROUTINES Six subroutinesare described in this report,two for each type of function: They are RFUNIS, RFUNIL, RFUN2S, RFUN2L, RFUN3S, and RFUN3L. The last letter in the program name tells the type of memory model with which the

programwill interface. A "S" suffix indicatesthat the routine is to be used in the small-memorymodel, and a "L" indicatesuse with the large-memory model. Listings of all programs,includingexample calls, are included in the appendix to this report.

RFUNIS and RFUNIL Programs The routines RFUNIS and RFUNIL, which interfaceswith the Intel small- and large-modelprograms respectively, deal with simple unlvarlateInput-output function lookups. The dataare set up in the breakpointinformationblock as shown In flgure lO. Figure 8 shows how these block data are set up by a Fortrancalling program. XPTR is an index pointing to the location of the data in the most recent previous call to the routine. ZPTR is not used in these routines but is included to make the data structuresimilar to that used in RFUN2 and RFUN3. NXPTS Is the number of data breakpolnts,NZPTS is not used but Is included for the same reason as ZPTR. XARRAY,whlch contalns the breakpointvalues of x, is stored next followed by YARRAY, the function output for each x value. During executionthree basic operationsare performed. First the routine initializesits registers. Then it determineswhether the input value is higher or lower than the initial x value indicatedby the XPTR index. The program then scans the XARRAY table to find the x segmentthat correspondsto the x input value. Once the scanning is complete, the 8087 chip is used to performthe interpolationby using equation (1), which was discussedearlier. Finally, the routine updatesthe index pointer and returnsto the calling program with the interpolatedfunction output value y on the 8087 stack.

RFUN2S and RFUN2L Programs RFUN2S and RFUN2L generate values for two-varlablefunctionswith identical breakpolnts(as in fig. 2) in the small- and large-modelprograms,respectively. They function similarlyto RFUNIS and RFUNIL with one additionalstep. The routinesmust perform a search through the z valuesas well as through the x values. They must also read and update the ZPTR value in the breakpoint informationblock (this variablewas not used in the RFUNI programs). The data are stored in this program as shown in figure II. Since all of the x breakpolntsoccur at identicalpoints on all curves, only a onedimensionalXARRAY is necessary. However, because each curve will have a dlfferent y output value at each breakpoint,a two-dlmenslonal YARRAY is needed. The arrangementof this array is such that the first row correspondsto the outputs of the first z curve, the second row correspondsto the outputs of the second z curve, and so on, up to the number of curves that exist. The programsmake use of equations (2) to (4) to computethe proper interpolated output. As in the RFUNI programs, the final interpolatedfunction output is returned on the 8081 stack.

RFUN3S and RFUN3L Programs The RFUN3 programs generate outputs for two-varlablefunctionswith Indlvldual breakpolnts(as in fig. 3). They operate.slmilarly to RFUN2S and RFUN2L except that additionalcalculationsare made during each x scan to flnd the breakpolntson a new z curve. The RFUN3 programs first scan the ZARRAY to determinewhich curves the z input value is between. Next it uses equations (5) and (6) to generate the x breakpolntsof this new interpolated z curve. The x value search proceeds by generatingnew x values as a function of z until the upper and lower boundariesof the input x are found. Then interpolation between the generated segment endpolntsby using equations (7) to (9) determinesthe final output value y. Finallythe x and z index pointers are updatedand the y output value is returnedto the calling program on the 8087 stack. The data setup for the RFUN3 programs is more complicatedthan that for either the RFUNI programs or the RFUN2 programs because each breakpointis independentof all others. Not only does each curve have an individualset of y output values,as in the RFUN2 programs,but each also has an individualset of x values. To support this arrangement,the data are set up as shown in figure 12. XARRAY is a two-dlmenslonal array containingthe breakpolntsfor each curve. The first row correspondsto the first z curve, the second row to the second z curve, and so on as In the YARRAY used in the RFUN2 programs. The YARRAY used in the RFUN3programs is set up the same as the YARRAY in the RFUN2 programs. IMPLEMENTINGFAST EXECUTIONSPEEDS Since function generationroutinesare used most often in real-tlmeapplications where executiontime is critical,an efficientalgorithmis very important. Several techniquesare used in the function generationroutines to attain this speed efficiency. Before interpolationis possible,the function generationroutinemust determine the magnitude of the Inputby searchingthrough the breakpoint informationblock values for the one closest to the input value. Typically, since a specific function routine is called only once per control update interval,and since the input value normally changes relativelyslowly from one control interval to the next, the breakpointinformationblock search is sped up if the index locationof the previous search is known. All of the function generationprograms described in this report store the final index value for use as the starting point of the next search. This index value, XPTR for example, is stored at.the beginningof the breakpointinformationblock and is updatedat the end of each call of the function generationroutine. Another way to decrease the executiontime of the routine is to use memory access instructionsonly when necessarysince these take longer to execute than register access instructions. The routines described in this report store any frequentlyused integer value,,In an B086 Internal registerand any frequently used real value in an 8087 register,thus ellmlnatlngunnecessarymemory accesses.

A third approach used to decrease the executiontlme Is to use In-llne codlng of instructionsrather than subroutinecalls. In-linecodlng may cause the size of the code to be larger,but it will execute faster because the processordoes not have to store pointers and status registersas it does for subroutinecalls.

Function Routine Execution Times Typical executiontimes for the entire lookup routlnewere experimentally determinedto be 0.50 ms for a unlvarlatefunction lookup,0.90 ms for a blvarlatefunction lookup,and l.O0 ms for a map function lookup. CONCLUDINGREMARKS :

Three types of nonanalyticfunction routines have been developedfor use with control algorithmswritten in hlgh-levellanguages. These routines operate on data in floatlng-polnt form and are fast enough to be used in realtime control systems. Additionally,problemsassociatedwlth the.8086 segmentedarchitecturehave been resolved sothat the routines can be easily and efficientlyintegratedinto most control schemes. . REFERENCES I. Soeder, James F.; and Shaufl, Maryrlta: NonanalyticFunctionGeneration Routines for 16-Bit Microprocessors. NASA TM-81586,1980. 2. MCS-86 Macro Assembly LanguageReferenceManual. Intel Corp. (Manual Order No. 9800640-02),1979. 3. MCS-86 AssemblerOperating Instructions for ISIS-IIUsers. Intel Corp. (ManualOrder No. 9800641A),1978. 4. PL/M-86users Guide. Intel Corp. (Order No. 121636-003),1982.

5. FORTRANL86Users Guide. Intel Corp. (Order No. 121570-001),1981.

"_

APPENDIX- PROGRAM LISTINGS

8086!871881186 MACRO A_EMBLER RFUN1S

08/30!84 PACE 1

SERIES-Ill 80861871881NACRO 186 ASSEMBLER V2.0ASSEMBLY OF NOD!.tE RFUNIS OBJECT MODULE PLACED IN :FI:RFUNIS.O_ A_ENBLER INVOKED BY: A_6,86 :FI:RFUNIS.SRC

LOC OBJ

LINE

SOURE

2 3 4 5 6 7 8 I0 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 _ 29 30 31 _ Z.3 34 35 36 37 38 o, 40 41 42 43 44 45 46 47 48 49 50

* ROUTINE NAME: RFUNIS * VERSION: 2.0 * DATE: AL_.9, 1983 _ PROGRA_IMER'S NAME: MICHAEL NAO(IN _ PURPOSE: TO INTERPCtATE A SIMPLE * F_CTIC_ FORSMALL-MO[EL , PROORAMS

THIS_;BROUTINE _JTPUTS THEESTIMATED VALLE OF A FL_ICTION YV= F(XV) BY INTER_LATI_ FROHKNC_N SOLUTION POINTS, VSI_ THERELATION YV = ((XV-XL)/(XH_XL))(YL-YL) + YL _ERE YV= ANSWER TOBE COMPUTED XV= INPL_ VALL_ XH= K_E_WN HIGHX FOINT XL= KNOWN LOWX POINT YH= KNOWN HIC_ Y POINT YL = KNO_ L_ Y POINT INPUT REQUIREMENTS: I)T_ FOLLOWING ADDFESSES WILLBEPA_ED TO THIS SIJBRgJTINE: A. ON TOPOf: THE8086STACK: THEADDRE_(OFFSET) OF A DATA AREAWITHTHEFOLLOWING FORMAT DSTRUCSTRUC XPTR D_i ZPTR DW NXPTS _ NZPTS [_ X_RRAYDD YARRAYDO DSTRUCENDS ; ; ; ; _ ; ; ; ; ; _ ; B. _4TOPOF THE8087STACk': THEINPUT VALUE, XV,TO BE INTERPOLATED 2) ITISREQUIRED THAT THE8087 CHIPHAVE3 EMPTY REGISTERS WHENTHISINTERPOLATION R_JTINE ISCALLED. OL_PUT EFFECTS: I)REGISTERS DESTROYED: AX,BX,CX,DX,DI,SI 2) INTERPOLATED RESULT RETURNED ON TOPOF 8087STAC_ 3) XPTR LC_ATIC_4 UPDATED TO INDEX X VALUE JUST PRECEDING XV. (TOSPEED FUTURE SEARCHES FORX) _ ? ? ? NXPTS DUP(?) NYPTS [_P(?) ;XARRAY INDEX ;YARRAY INDEX ;NO. OF EEMENTSINX ARRAY ;NO. OF ELEHENTS IN Y ARRAY ;XAP_AY _YARRAY

.... 0'300 0002 04 0006

; ;

----

80861871881MACF_ 186 ASSEMBLER _UNIS

08130184 PAGE

LOC OBJ

LINE 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 7:3 80 8! 82 83 84 85 86 87

SOLR_ EXAMPLE PLIHPROGRAM USING RFUNIS: $SMALL PLMPGII: DO; DECLARE DSTRUC STRUCTURE ( XINDEX INTEGER, ZINDEX INTEGER, NXPTS INTEGER, NZPTS INTEGER, XARRAY(7) REAL, YARRAY(7) REAL) PUBLIC INITIAL (0,0,7,7,0.0,1.0,2.0,3.0,4.0,5.0,6.0,0.0,1.0, 4.0,9.0,16.0,25.0,o6.0), RFUNIS: PRC_CEDL_RE (X, STRUC_ADDR) REAL EXTERNAL; DECLARE X REAL; DECLARE STRLIC_ADDR POINTER; ENDRFUNIS; PLHTEST: PF,'OCE_JRE PUBLIC; DECLARE I INTEGER; DECLARE (X,Y) REAL; X = 1.5; Y = RFUNIS(X, _ZrSTRUC); CALLPRINT_ANSWER(Y)_ END; ENDFUNPGN; ENDPLNPGH; *

NAME RFUN IS COROUP OROJPCODE _RO.P GRO._ DATA A_BUMECS:CGRCWJP, _:DGRO.IP PUBLICRFL_IS

-OK;O 0002 0004 ....

90 91 _ 94 _ 96 97 98 9Y
100

STACK STRL_TURE

PARAMSSTRUC OLD_BPD{,I RETURNDW DADDR DW PARAMSENDS


;_______

_ "> "_

;SAVED BPREGISTER ;RETURN ADDRESS ;ADDRESS OF DATA STRUCTURE

--0000_

102 103 104 105

DATA

SEGN_TPUBLIC'DATA"

STW_AVE DW

lO

8086187188!186 MACRO ASSEMBLER RFUNIS

08/30184 PAGE 3

LOC OBJ

LINE 106 107 108


109

S(_]RCE

----

DATA

ENDS

;_I___H_H_____

---0000

0000 000055 _01 8BEC 0003 8B5E04 0006 8BSF 0008 DiE7 ,.'!{K_A DIE7 O00C 8B7704 L.%,DIE6 O!}F 0011 DIE6 0013 _C308 00168BD3 (_1803D6 001A9BD811 {_ID 9BDD3EO0 0022 9B 0023 AI0@}0 0026 250041 (Z_29 3_0001 002C 7432

R R

O02E {K_2E 83C704 00313BFE 0033741E 0035 9BD811 00389BDDSEO000 R _)3D 9B OOSE AIO000 R 0041 25{K_41 0044 3D0001 47 740A 0049 3D0040 4C 7405 004E83C704 0051EBBE 0053B3EE04 005683EF04

111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 !28 I_ ISO 131 132+2 133+i 134+i 135+I 136+I 137+2 138+2 139+2 140+i 141 142 143 144 145 146 147+2 148+I 149+I 150+I 15!+I 152+2 153+2 154+2 155+2 156+I 157 158 159 160

COlE

SEGME_PUBLIC'CO[_' PRO(] NEAR

_ARCOE

RFUNIS: ;SA_ REGISTERS PUSH MOV MOV _OV SHL S_L MOV SHL SHL ADD _V ADD FCOM FSTSW FWAIT MOV AND CMP JE BP BP,SP BX,[BP].DADDR Dh [BX].XPTR DI,I DI,I Sh [BX].NXPTS SI,I SI, I BX,8 DX,BX DX,SI D{.IORD PTR[BX+ D!] ST_SAVE AX,STWSAVE AX,4100H AX,010014 LEFT_OF_START

;GET START ADDRESS OFDATASTRUCTL_E ;DI= ELEMENT I_DEX ;DI= BYTEINDEX = ELEMENT INDEX _4 ;SI= NXPTS ;SI= NO.OF BYTES=NXPTS _4 ;BX= START OF X ARRAY ;DX= START OF Y ARRAY ; LTO_PARE ARRAY ELEMENT WITH XV

MASK-IN COMPARISON BITS ; EXITIF XV< ARRAY ELEMENT

RIGHT_OF_START: ADD Dh 4 RSI: CMP DI,SI JE LI FCOM FSTSW F_AIT NOV AND CMP JE CMP JE ADD JMP SUB SUB DHORD PTR[BX+ DI] STWSAVE AX_STWSAVE AX,41{_ AX,010(_ LI AX,4000H LI DI,4 RK31 SI,4 Dh 4

;IFX > DATA(ORIGINAL INDEX) ;_ THENBEGIN _ ; INDEX = INDEX +4 ; I_HILE (INDEX {= NO.OF BYTES) ; ; _ DO BEGIN _ ; COHPARE ARRAY ELENENT WITHXV

; ; ; ; ; ; ;

MASK-IN CG_PARISON BITS EXITIF XV{ ARRAY ELEMENT EXITIF XV= ARRAY ELEMENT INDEX = INDEX +4 _ END{WHILE} **_

LI:

II

8086/87/88/MACRO 186 ASSEMBLER RFUNIS

08130/84 PAGE

LOC OBJ C_59 3BFE 005B7458 (_5DEB3290

LINE 161 162 163 164 165 166 !67 168 169 170 171+2 172+I 173+i 174+I 175+I 176+2 177+2 178+2 179 +2 180+I 181 182 183 184 185 186 187 18B 189 190 191 I_ 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215

SOURCE CMP JE JMP DI,S; OUT_OF_RAEE F_J__LOW_INEX ; IF INDEX > I_.OF BYTES ; THEN (,.IT_OF_RANGE ; ELSEFOUHD_LON_INDEX ;**_ END{IF} *_ ;IFX < DATA(ORIGINAL INDEX) 1._* THENBEGIN *** ; INDEX = INDEX -4 ; WHILE (INDEX > O) ; ; **_DO. BEGIN ,m, ; COMPARE ARRAY ELEMENT WITH XV

0060 006083EF04 006383FFO0 {_667CIE 00689BD811 006B 9BDDSEO000 R (_70 9B 0071AIO000 R 0074 2541 0077 8D0000 I_37A 740A 007C3DO040 007F7405 008183EF04 0084EBDD 00086 83FF{_ 00897D06 008B 83C704 ,_JSE EB2590

LEFT_OF_START: SUB DI,4 LSI: C_ DI,0 .t MI FCOH FSTSW FWAIT _V AND CMP dE CMP JE SUB .IMP CMP ._E ADD J_P [_ORD PTR[BX+ DI] ST!_AVE AX,ST_AVE AX,4100H AX,O000H M! AX,4000H MI Dh 4 LSI DI,0 FOUND_LOW_INDEX Dh 4 C{IT_OF_RAN_

; ;

MASK-IN COMPARISON B!TS EXIT!F XV> ARRAY ELEMENT

EXITIFXV = ARRAY ELEMENT

Hi:

_ INDEX = INDEX -4 ; **_END{WHILE} *_ ; IFINDEX 0 INDEX_M!N ; THENFOUND_LOW_INDEX ; ; ELSEOUT_OF_RAnGE; ;*** END{IF} ***

0091 (_91 00919BDgOI 0094 9BDCE9 00979BD86904 009B 9BDEF9 O09E87DA 00A09BD901 OOA39BD94104 A7 ?BDSEI OOAA9BDECA GOAD 9BDECI OOBO 87DA OOB2 EBOBgO OOB5 B5 9BDDDO OOB887D3 00BA9B[_OI OOBD87D3 OOBF O(}BF DIEF 0_71DIEF 00_ 83EB08 00C6893F

FOUND_LOW_!NDEX: INTERPOLATE: FLD D.UZJRD PTR[BX+DI] FSUB ST(1), ST FSUBR DWORD PTR[BX+DI+4] FDIV XCHG BX,DX FLD DWORD PTR[BX+DI] FLD DWORD PTR[BX+DI+4] FSUB ST,ST(1) FML_P ST(2), ST FADD XCHG BX,DX ,_P SA__NEW_XPTR {(IT_OF_RANE: FST ST(O) XC_ DX,BX FLD DWORD PTR[BX+ DI] XCHG DX,BX SAVE___XPTR: SHR DI,I _R DI,I _L_B BX,8 MOV WORD PTR[BX], DI

;XVALREADY OR TC_BYPLMPGM. ;STORE XLON STACK TOP ;(XV-XL) C_ STACK BOTTOH ;(XH-XL) ON STACK TOP ;(XV-XL)/(XH-XL) LEFT ON STACK ;STORE YL ON STACK TOP ;STORE YH ON ST_K TOP ;(YH-YL) ON STACK TOP ;((XV-XL)!(XH-XL}}(YH-YL}ON STA_ BOT ;YVC_ STACK TOP(At_SWER)

;DISCARD TOPC_ STACK ;SAVE BC_,ZDRY Y VALLE

;DI= D; / 4 ;BX= XPTRLOCATION ;SAVE NEWXPTR

12

8086!87188!186 ItACRO ASSEMBLER RFUN1S LOC OB,J c_tC8 C_.8 5D OOC?C20100 LINE 216 217 218 219 220 221 2_ 223
224

08/30!84 PAGE 5

SOURCE EPILOGUE: POP RET NEARCODE CODE


;_______

BP 1 ENDP

;RESTORE REGISTERS

----

ENDS

.,'_6 227 ASSE_IBLY CC_PLETE_ NOERRORS FOUND

END

13

8086/87/88/MACRO 186 ASSEMBLER RFL_41L

08/80/84 PAGE

SERIES-Ill 8086/87/88/NACRO 186 A_SEMBLER V2.0 ASSEMBLY OFMO[(SLE RFUNIL OBJECT MODULE PLACED IN :FI:RFUNIL.OBJ ASSEYBLER INVCKED BY: ASM86.86 :FI:RFUNIL.SRC

LOC OBJ

LINE I 2 3 4 5 6 7 9 11 12 13 14 15 16 17 18 19 2) 21 22 23 24 26 27 28 29 30 31 32 :<3 34 35 36 37 88 39 40 41 42 43 44 45 46 47 48 49 50

SOURCE ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;. ; ; _***_**_****_******_****_**_*_*_* * ROUTINE NAME: RFUNIL * DATE: AUG. 25,1983 * _ PROGRAMMER'S NAME: MICHAEL HACKIN * PUF(POSE: TO INTEF9LATE A SIHPLE * * FL_$]TION FORLARGE-MODEL * PF_Z_GRAMS.

THISSUBROUTINE C(_TPL_S THEESTIMATED VALUE OF A FUNCTION YV = F(XV) BY INTER_LATIN FROM G KNOWN SOLUTION POINTS, USING THERELATION YV = ((XV-XL)/(XH_XL})(YL-YL) + YL WHERE YV= ANSNER TOBE COMPUTED XV= INFI.FF VALLE XH= KkDWN HIGHX POINT XL= KNOWN LOWX POINT YH : K_NN HIGHY POINT YL = K_DWR LOWY POINT INPUT F_OUIR_MENTS: I)THEFOLLOWING ADDRESSES _ILLBEPASSED TO THIS _t_BROUTINE: A. ON TOPOFTHE8086STACK: THEADDRESS (OFFSET THENSEGMENT) OF A DATA AREAWITH THEFOLLOWING FORMAT DSTRUCSTRUC XPTR DW ZPTR DW NXPTS DW NZPTS DW XAF_AYDD YhRRAYDD DSTR_]ENDS ? ;XARRAY INDEX _ ;YARRAY INDEX 9 INO. OFELEMENTS IN X ARRAY ? _NO. OF ELEMENTS INY ARRAY NXPTS DUP(?) ;XARRAY NYPTS [{_P(?) ;YARRAY

0000 0002 04 0006

; ;

----

I ; ; ; ; ; ; ; ; ; ; ; ;

B. 2NDFRC_THETOPOF, THE8086STACK: THEADDRESS OF THEMEMORY LOCATION WHICH HOLDS THEX I!_L_ VALUE 2) IT ISREQUIRED THATTHE8087CHIPHAVE3 EMPTY REGISTERS _EN THISINTERPOLATION ROUTINE !SCALLED. C_JTPUT EFFECTS: i)REGISTERS DESTROYED: AX,BX,CX,DX,DI,SI 2) INTERPOLATED RESL_T RETURNED ON TOPOF 8087STACK 8) XPTRLOCATION UPDATED TO INDEX X VALLE_._ST PRECEDING XV.

14

8086!87188!186 HACRO ASSEMBLER RFUN1L

08130184PAGE 2

LOCOBJ

LINE
51 52 53 54 55 56 57 58 59 60 61 62 63 6.4 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87

SOURCE
EXAMPLE FORTRAN CALL: SUBROUTINE RTEST DIFENSION XARRAY(7), YARRAY(7) INrrEGER XI,_E'IEX, YINDEX COM_ION ISTUFFIXINDEX, ZINDEX,.NXPTS, NZPTS, XARRAY, YARRAY DATAXINDEX, ZIN_X,NXPTS, NZPTS/O, 7, 7/ DATA XARRAYIO.0,1.0,2.0,3.0,4.0,5.0,6.0! DATAYARRAY/O.O, 1.0,4.0,9.0, Io.0, :5.0,_6.0/ X--I.5 Y=RFUNIL(X, XINDEX) PRINT +, Y END

NAME RFL_._IL CGROUPGROUP CODE DO_JP GRCOP DATA ASSUMECS:f_ROUP, DS:[GROUP, . . PUBLICP_'UN IL ; _.,.,._,.+_,_**_**_,_,.+,+***_+**.+**_**H_****_,+**_,+_ ; STACK ..TRJC.TL;RE

---0000 0002 0004 0006 c.'_JOA 00_ ---

PARA_ STRUt'. OLD_ES [rW OLD_BPDW OLD_DSDW RETURNDD DADDR DD XV DD PARAMSENDS "_ o "> -_ '_ ') ;SAVED ESREGISTER _SAVED BPREGISTER ;SAVED DS REGISTER _RETURN ADDRESS (OFFSET ON TOP,THENSEGMENT} ;ADDRESS OF DATASTRUCTURE (OFFSET THEP , SEGMENT) ;AD_ESS OF XV (OFFSET, THEN SEOI'ENT)

---0000??_ --

91 92 93 94 95 96 97

DATA

SEGt-ENT PUBLIC"DATA" ">

SI",4SAVE DW DATA ENDS

--0000

100 101 102 103 104 105

CODE

S_GMENT PL_LIC"CODE" FAR

FARCGDE PROC

15

8._618716_1MACRO 186 ASSBIBLER RFL_IL

08130184 PAGE

L[_ OBJ

LIK_

SOURCE

0000 0000IE 0001 55 0{._2 06 00038BEC 0(_5B8 mR 00088ECO cXIOA C_EOE O00D9BD907 (_DIO C55EC_ 0013$B3F 0015DIE7 0017DIE7 0019 8B7704 001CDIE6 (_IEDIE6 00208C_]308 00238BD3 0025 03D6 00279BD811 O02A?B26DD3EO000 R (K330 9B 003126AI0000 R 00352_X_41 00383D0001 <33B 7434

O03D {_3D 83C704 00403BFE 00427420 00449B[_II 00479B26DD3E,_}O0 R C<)4D 9B 004E 26A!0000 R 0052250041 0055 3DO001 {_]58 74_ 005A 3D0040 {(_5D 7469 {_J5F 83C704 ,_62 EBDC 0064B_EE04 0067_3EF04 {_6A3BFE 006C745A 006EEB3490

0071

106 107 RFUNIL: 108 PUSH DS _SA_ REGISTERS 109 PL_H BP 110 PUSH ES III MOV BP,SP 112 MOV AX,[_TA 113 NOV ES,AX 114 LDS BX,[BP].XV ;GET XV ADDRESS ANDSEGMENT 115 FLD DIIORD PTR[BX] ;PUTXVON TOPOF 8087STACK 116 LDS BX,[BP].DADDR ;GET START ADDRESS OF DATASTRLFCTURE 117 NOV Dh [BX].XPTR ;DI= ELEMENT INDEX 11B S_ Dh I 119 SHL Dh I ;DI= BYTEINDEX = ELENENT INZ_X *4 120 MOV SI,[BX].NXPTS ;SI= NXPTS 121 SHL Sh I 122 SHL Sh I ;SI= NO.OF BYTES=NXPTS *4 123 ADD BX,8 ;BX= START OF X ARRAY 124 MOV DX,BX 125 ADD DX,SI ;DX= START OF Y _RRAY 126+2 FCOR _ORD PTR[BX+ DI] ; COMPARE ARRAY ELE_L_NT WITHXV 127+I FSTSH ES:ST_SAVE 128+I FWAIT 129+I MOV AX,ES:STWSAVE 130+I AND AX,41{_)H ; MASK-IN COMPARISON BITS 131+2 CMP AX,0100H 132+2 JE LEFT_[__START ; EXITIF XV( AF_AY ELEMENT 133+2 134+i 135 ;IFX > DATA(ORIGINAL INDEX) 136 RIGHT_OF_START: ;***THEN BEGIN _** 137 ADD DI,4 ; INDEX = INDEX +4 i_8 RSI: CMP Dh SI ; WHILE (INDEX <= NO.OF BYTES) 139 JE LI ; !40 ; **__] BEGIN _* 141+2 FCOM DWORD PTR[BX+ DI] ; COMPARE ARRAY ELEMENT NITHXV 142+I FSTSW ES:STWSAVE 143+I FWAIT 144+i MOV AX,ES:STWSAVE 145+I AND AX,4100H ; MAS_K-IN COMPARISC_ BITS I_6 +2 CNP AX,0100H 147+2 JE LI ; EXITIFXV{ ARRAY ELE_NT 148+2 CNP AX,400{_ 149+2 JE BREAKPOINT ; EXITIF XV= ARRAY ELEMENT 150+I 151 ADD Dh 4 ; INDEX = INDEX +4 152 JMP F_SI ; ***END{{_ILE} *** 153 LI: SL_ Sh 4 ; 154 SUB Dh 4 ; 155 CMP DI,SI ; IFINDEX } NO.OFBYTES 156 JE OUT_OF_RANGE ; THENOUT_OF_RAnGE 157 JMP FOL_D_LOW_INDEX ; ELSE FOUND_LOH_INDEX 158 ;*** END{IF} *** 159 ;IFX { DATA(ORIGINAL INDEX) 160 LEFT_OF_START: ;*** THENBEGIN *_

16

80861871_1186 MACRO ASSEMBLER RFUNIL LOC OBJ 007183EF04 007483FFO0 00777C20 00799BD811 007C9B26DD3EO000 R 00829B 008326AI0000 R 008725_}41 O08A3D0000 008D740A O08F3D0040 00927434 0094 83EF04 0097EBDB 0099 83FF00 009C7D06 009E8_704 OOAI E_590 LINE _URCE ; ; ; ; ; INDEX = INDEX -4 NH, ILE(INDEX > O)

08130184 PAGE

00A4 OOA4 0_4 9BD901 OOA79B_E9 O{_A9BD86904 OOAE9B[{F9 OOBI87DA 00B39BDgOI (_B69BD941.04 OOBA9BDGEI OOBD9BDECA OOCO9BDECI D3 87DA 00C5EBOB?O 00C8 0C_8 00C89BDDD8 00CB87D3 OOCD9BD901 OODO87D3 OOD2 00D2DIEF OOD4DIEF OOD68SLEB08 OOD9893F OODB OODB 07 00[_ 5D OODDIF OODE CA0800

161 _JB DI,4 162 LSI: CMP Oh 0 163 JL Mi 164 165+2 F{_H [_3RD PTR[BX+ DI] 166+I FSTSW ES:STWSAVE 167+I F_IT 168+I FIOV AX,ES:ST_BAV_ 169+I AND AX,4100H 170+2 CFIP AX,O_}OH 171+2 dE MI 172+2 CMP AX,4000H 173+2 dE B_AKPOINT 174+I 175 SUB DI,4 176 ,_!P LSI 177 MI: C_ Dh 0 178 dGE FOUND_LOin_INDEX 179 ADD Dh 4 180 JNP OUT_OF_RANC_ 18! 182 IB3 FC(IND_LOW_INDEX: 184 INTEF?OLATE: IB5 FLD B_ORD PTR[BX+DI] 186 FSUB ST(1), ST 187 F_J_ [_ORD PI'R [BX+DI+4] 188 FDIV 189 XCI-IGBX,DX 190 FLD DWORD PTR[BX+DI] 191 FLD DW_D PTR[BX+DI+4] 192 FSUB ST,ST(I} I_ FMULP ST(2), ST 194 FADD I_ XCHG BX,DX 196 JMP SAV__NEW_XPTR 197 198 BREAKPOINT: I* OUT_OF_RANGE: 200 FSTP ST(O} 201 XCHG DX,BX 202 FLD DWORD PTR[BX+ DI] 203 XCHG DX,BX 204 205 SAVE_NEW_XPTR: 206 S_R Dh I 207 SHR Dh I 208 SL_ BX,8 209 HOV {_ORD PTR[BX], DI 210 211 EPILB._L_: 212 POP, ES 213 POP BP 214 PO.P DS 215 _T 8

_*_DOBEGIN _ COMPAF_ ARRAY ELEMENT WITHXV

; ;

MASK-IN COHPARISON BITS EXITIFXV > ARRAY 8_E_IENT

EXITIFXV = ARRAY ELE_IENT

INDEX = INDEX -4 _ END{WHILE} _ IF INDEX <>0 THENFOUND_LOW_INDEX ELSE OUT_OF_RANGE; 1_**END{ID} _

;STORE XLON STACK TOP ;(XV-XL) ON STACK _TTOM ;(XH-XL) ON STACK TOP ;(XV-XL)!(XH--XL) LEFT ON ST_K ;STORE YLON STACK TOP ;STOF_ YH C_ STAO, CTC_ ;(YH-YL) ON STACK TOP ;((XV-XL)/(XH-XL))(YH-YL)ON STAO:: BOT ;YVON STACK TOP(ANSWER}

;DISCARD TOPOF STACK ;SAVE BOUNDRY Y VALLE

;DI= DI 1 4 ;BX= XPTRLOCATION ;SAVE NEWXPTR

;RESTORE REGISTE_

17

80861871881186 MACRO ASSEHBLER RF_tlL

(8/30/84 PAGE 5

LOC OBJ

LINE 216 217 218 219 22O 221 223 224

&_JRCE

FARCODE ENDP CODE ENDS

----

;***************************H***************************************

END

ASSEMBLY COMPLETE, NOERRORS FOL_JD

18

8086/87188/_CRO 186 ASSB.IBLER RFL_2S

08130184 PAGE

SERIES-Ill 8086187/881186_R0 ASSEMBLER V2.0 ASSEI_BLY OFMODULE RFUN2S OB,_CT MOBJLE PLACED IN :FI:RF_S.OBJ ASSEMBLER IN'hIKED BY: ASM86.86 :FI:RFUN2S.SRC

LOC OBJ

LINE

SO_CE

2 o 4 5 6 7 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 85 36 37 38 40 41 42 43 44 45 46 47 48 49 _

_ ROUTINE _,Y_ME: RFUN2S _ DATE: AUG. 27,1983 * _ PROGRAMMER'S NA_E: MICHAEL MACKIN _ PL_PO_:TO INTERPOLATE A SIMPLE * FUNCTIC_ FORSMALL-MODEL * PROGRAMS

THISSUBROUTINE OUTPUTS THE ESTIMATED VALUE OFA FUNCTION YV= F(XV, ZV} BY INTERPOLATING FROMKNC_N SOLUTION POINTSUSING , THERELATIONS YL = ((XV-XL)/(XH-XL))(YB-YA) + YA YH = ((XV-XL}/(XH-XL})(Y_YC} + YC YV = ((ZV-ZL)I(ZH_ZL))(YH-YL) + YL INF_T REQUIREMENTS: 1)THEFOLLOWI{_3 ADDRESSES WILLBEPASSED TO THIS SUBROUTINE: A. ONTOP OFTHE 8086STACK: THEAD[eESS (OFFSET) OFA DATAAREAWITH T_ F&LOWING FORMAT DSTRUCSTR_] XPTR Z_l ZPTR DW NXPTS DH NZPTS #_ ZARRAYDD XARRAY DD YARRAYDD DSTRLENDS ; _ ; ; ; ; ; i ; ; ; ; ; ; ; ; B. ON THE8087STA_: ON TOPIV,I'HEN XV 2) IT ISREQUIRED THATTHE8087CHIP HAVE5 EMPTY REGISTERS _HEN THISINTERPOLATION ROUTINE ISCALLED. 3)NOTE: NO T{-_ ADJACENT ELEHENTS OF XARRAY OR YARRAY I';AY HA_ IDENTICAL ELEMEntS. THIS WILLRESULT IN DIVISION BY ZERO. OUTPUT EFFECTS: I) REGISTERS [_STROYED: AX,BX,CX,DX,DI,SI 2} INTERPOLATED RESULT RETURNED ONTOPOF 8087 STACK 8)'XPTR LOCATICP[_ UP[_TED TO INDEX X VALI_ JUST PRECEDING XV. ZPTR L_ATIONUPDATED TO INDEX Z VALLE JUST PRECEDING ZV. (TO_EED FUTU_SEARCHES FORX ANDZ) EXAMPLE PLIM CALL: o ;XARRAY INDEX o ;Z ARRAY INDEX _ ;NO. OF ELEMENTS INX ARRAY _ ;NO. OF ELEMENTS IN Z ARRAY NZPTS DUP(?) ;ZARRAY (255 ELEMENTS BAXINUM) NXPTS [&_P(?) ;XARRAY NYPTS [#JP(?) ;YARRAY

---0000 0002 0004 0006

; ; ;

----

19

ASS_BLER PEle_

08!30/84 PAGE 2

LINE 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 BO 81 8"2 84 85 86 87 89 91 93 94 95 96 97 ,08 I00 I01 102 103 104 105

SOLACE

$SHALL TSTPGM: DO; i*THISISA PR@3R_TO TEST RC_JTINE RFL_,!2S *I DECLARE DSTRUC STRUCTURE ( 7fr _[EXINTECER, XIN_X INTEGER .... NXPTS INTEGER, NZPTS INTEGER, ZARRAY(3) REAL, XARRAY(5) REAL, YARRAY(15) REAL) PUBLIC !NITI_( /_XINDEX {/ 0, !_ ZINZ_X _/ O, !_ NXPTS *I 5, !_ NZPTS *I 3, /* ZARRAY _/ 0.0, i0.0, 20.0, !_ XAR_AY */ 0.0, 2.0, 4.0, 6.0, 8.0, /* YARRAY */ 0.0, 2.0, 4.0, 6.0, 8.0, I0.0, 12.0, 14.0, 16.0, 18.0, 20.0, _.0, 24.0, 26.0, 28.0 )1 RFL_2_: PRO_DL_E(X,Z,STRUC_REAL ADDR) EXTERNAL; DECLARE X REAL_ DECLARE Z REAL; DECLARE STRUC_ADDR POINTER; END RFUk"2S; FUNF'GH: F'RCGEDURE PUBLIC; DECLARE I INTEGER; DECLARE (X,Z,YREAL; ) X : 1.5; Z = 12.0; Y = RFUt2S(X,Z,_DSTRUC); CALLPRINT_ANSWER; END; END FL_PGN; ENDTSTPGH;

NAME RFUN2S CGROUPGROUP CODE DGROtPGR@JP DATA AS_NE CS:CGF-IOJJP, DS:DGROUP PUBLICRFUN2S

STAO: STRt_T_E

PARAMSSTRI_ _DBP DW 9 ;SAVED BP REGISTER

2O

8086/87/88/MACRO 186 AS_MBLER RFUN2S

08/80/84 PAGE

LOC OBJ 0C_)2 (>?04 ---

LINE 106 107 108 109 110

S_.IRCE RE-FURN DW DADDR DW PARAMSEN_ _ _ ;RETURN AD_ESS ;ADDRESS OF DATASTRUCTL_:E

--0000???? --

113 114 115 1!6 117 118 119

DATA

SEGMENT PUBLIC'DATA'

STWSAVE [_ DATA EN_

---0000

0000 000055 01 8BEC 00038BSE04 K_06 8BD3 00088BOF C_OA 8B6F04 O00D SB7F02 (X)IO DIE/ 0012 DIE7 0014 8B7706 0017 DIE6 _J1? DIE6 001B C_)IB _3_08 O01E9BD811 _21 9BDD3E(_','}O R _26 9B 0027 AIO000 R 002A250041 (X)2D 3DOI 00307432

122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 !37 138 13') !40 141 142 143 144 145 146+2 147+I 148+i 149+I 150+I 151+2 152+2

CODE

SEOMr_T PUBLIC"CODE" PROC NEAR

_ARCODE

RFUFOS: ;SAVE REGISTERS PUSH _ _V _IOV NOV MOV NOV SHL SHL MOV S.HL SHL RP BP,SP BX,[BP].[_D_ DX,BX CX,[BX].XPTR BP,[BX].NXPTS DI,[BX].ZPTR DI,I DI,I SI,[BX].NZPTS SI,I SI,i

;GET START AD_ESSOFDATASTRL_TL_E ;SAVE BX ;CX= XPTR ;BP= NXPTS ;DI= ZPTR ;DI= BYTEINDEX = ELEMENT INDEX *4 ;SI= NZPTS ;SI= NO.f.H:. BYTES = NZPTS _4

GET_Z_INDEX: ADD BX,8 FCO_ D_]RD PTR[BX+ DI] FSTSi_STIISAVE FWAIT _OV AX,STWSAVE AND AX_4100H CNP AX,OIOOH JE LEFT_OF_Z_START MENT

_BX= START OF Z AF:RAY _ CO_PARE ARRAY ELEMENT WITHZV

_!ASK-IN CORPARISON BITS ; EXITIFZV < ARRAY ELE

003_ 003283C704 0035 SBFE 00377419

153+2 154 155 RIC_T_OF_Z_START: 156 ADD DI,4 157 RZSI: C_ DI,SI 158 ,_ RZS_ 159

;IFZ > DATA(ORIGINAL IN[_X) ;*_* THENBEGIN **_ ; INDEX = INDEX +4 ; WHILE (INDEX <=_. OF BYTES) i _ _ DO BEGIN _*_

21

8086187!881!86 F_CRO ASS_-IBLER RFL_2S

08130184PAGE

L_

OBJ

LINE 160+2 161+I 162+1 163+I 164+! 165+2 166+2 167 +2 168 169 170 !71 172 !73 174 175 176 177 178 179 180 181 182 183 184+2 185+I 186+I !87+I I_ +I 189+2 190+2 191+2 192+2 193 194 195 196 197 198 199 2{@ 201 202 203 204 205 206 207 _8 209 210 211 212 213 214

SOLACE FCO_ FSTSW FHAIT _]V AND C_P JE [_.IORD PTR[BX+ DI] ST_AVE AX_STWSAVE AX,4100H AX,010!_ RZS2 ; COMPARE ARRAY ELEMENT WITHZV

00399BDSII 003C 9BDDSEOK!O R {_41 9B 0042 AI0000 R 0045 25.o041 0048 3D0001 {g4B 7405 (_4D83C704 0050EBE3 000.52 8BC6 00542D0400 005783EF04 O05ASERFS 005C7540 O05E9BDDD8 0061EB_BgO

; ;

MASK-IN COMPARISON BITS EXITIF ZV{ ARRAY ELEMENT

0064 006483EF04 0067 _FFO0 _)6A 7CIE 006C 9BD811 006F9BD_3E0000 R 00749B 0075A10000 R 0078250041 007B3D0000 007E740A 00803D0040 00837405 0085 88EF04 _88 EBDD O08A 83FF00 C<_8D 7DOF O08F83C704 00_ 9BDDD8 00959BD9EE 00989BD9C9 O09BEBII90

ADD DI,4 _ INDEX = INDEX +4 JMP RZS! ; ***END{_ILE} *_ RZS2: MOV AX,SI ; SUB AX,4 ; SUB DI,4 ; CMP DI,AX ; IF INDEX <> NO.OF BYTES JNE FOUND_LOW_Z_INDEX ; THEN FOL_!D_LOW_INDEX FSTP ST(O) _ ELSE OUT_OF_RANGE JMP GET_X_INDEX ; ;*_ END{IF} *_* ;IFZ < DATA(ORIGINAL INDEX) LEFT_OF_Z_START: ;_* THENBEGIN _* SUB DI,4 ; INDEX = INDEX -4 LZSI: CMP DI,0 ; WHILE (INDEX > O) JL LZS2 ; ; ***DO BEGIN FCOt-!DWORD PTR[BX+ DI] ; COMPARE ARRAY ELEMENT WITHZV FSTSW ST_SAVE FWAIT _V AX,STWSAVE AND AX,4100H ; MASK-IN C_-_PARI_ BITS CNP AX,000_ ; EXITIFZV > ARRAY ELEME!'.IT JE LZS2 CMP AX,4000H JE LZS2 ; EXITIFZV = ARRAY ELEMENT _rB DI,4 ; INDEX = INDEX -4 JMP LZSI ; ***E_ {WHILE} *** LZS2: C_ DI,0 ; IF INDEX {> 0 JGE FC_D_LOW_Z_INDEX ; THENFOL_D_LC_,LINDEX ADD DI,4 ; ELSEOUT_OF_RANGE FSTP ST(O) ; FLDZ ; REPLAC.E TOPWITH 0 FXCH ST(1) ; PUTXV ON TOPOF 8087ST. JMP GET_X_INDEX ; ;**_ O_D{IF} *** F_._ID_LC__Z_INDEX: FLD DWORD PTR[BX+DI] FSL_ ST(1), ST F_JBR DWORD PTR[BX+DI+4] FDIV FXCH ST(I} GET_X_INDEX: ADD BX,S; XCB} DI,CX SHL DI,I

009E 009E9BDg.01 OOAI9BDCE9 OOA49BD86904 00A89BDEF9 0GAB9BD9C9 00AE AE 03DE OOBO 87F9 B2 DIE7

;STORE ZLON ST_K TOP ;(ZV-ZL) 2NDFRONTOP ;(ZH-ZL) ON STACK T[_ ;(ZV-ZL)/(ZH-ZL) LEFT ON STACK ;PUT XVON TOPOF 8087 STACX

;BX= START OF XARRAY ;DI= XPTR: CX = L_A_Z_INDEX

22

8086/87/881MACP, 186O A_EMBLER RFL_J2S

08130184 PAGE

LOC OBJ OOB4DIE7 OOB687F5 _BSDIE6 OOBADIE6 _X)_9B0811 OOBF9BDD3E{_O0 R tX_C4 9B 00C5 AIO_O R (9C8 250041 OOxCB 300001 {K_E 7432

LINE 215 216 217 218 219+2 220+I 221+I 222+I 223+I 224+2 225+2

SOURCE SHL XCHO S_ SHL FCOM FST_ FHAIT MOV AND CMP JE NENT Dh I Sh BP SI,I SI,I DWORD PTR[BX+ DI] S_-ISAVE AX_S_SAVE AX,41_}H AX,0100H LEFT_OF_X_START ;DI= BYTEINDEX = XPTR _4 _Sl= NXPTS ; _SI= NO.OF X BYTES = NXPTS _4 ; COMPA_ARRAY ELEMENT WITHXV

MASK-IN COMPARISON BITS ; EXITIF XV< ARPAY ELE

OODO O0.DO 83C704 00038BFE {_,05 7419 00079BD811 OODA9BDD3EO000 R _,DF 9B OOEOAI00 R {_JE3 250041 OOE6800_I &DE97405 OOEB83C704 OOEEEBE3 FO 8BC6 OOF2200400 00F583EF04 00F83BF8 OOFA753D OOFC 9BDDD8 _X_FF EB4590

0102 0102 B3EF04 0105 83FFO0 0108 7CIE 010A9BD811 010D9BDD3EO000 R 0112 9B 01!3AI0000 R 0116 250..041 01193D0000 011C 740A OIIE300040 0121 7405 01_ 83EF04 0126 EBDD 01288,3FF00

226+2 227 228 229 230 231 232 283+2 234+I 235+I _6 +! 237+I 2Z_8 +2 239+2 240+2 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257+2 258+I 259+I 260+I 261+I 262+2 263+2 264+2 265+2 266 267 268

R!GHT_OF_X_ST_T: ADD DI,4 RXSI: O.!P Dh SI JE RXS2 FCOM DWORD PTR[BX+ DI] FSTS{_STRSAVE F_AIT Y_V AX,ST_-_AVE AND AX,410(.._ CNP AX,OIOOH JE RXS2 ADD JMP RXS2: M_ SUB SUB CF_ Jt, E FSTP JMP Dh 4 RXSI AX,SI AX,4 Dh 4 DI,AX FOUND_LOW_X_INDEX ST{O) GET_YL

;IFX > DATA(ORIGINAL INDEX) ;_* THENBEGIN _ ; INDEX : INDEX +4 ; _HILE (INDEX {= NO.OF BYTES) ; ; _ DO BEGIN _*_ ; COMPARE ARRAY ELBIENT WITHXV

; ;

MASK-IN CC_.tPARISOR BITS EXITIF XV< ARRAY ELEMENT INDEX = INDEX +4 ***END{k_!LE} *_

IFINDEX <> NO.OF B_ES THEN F_JND_LOW_INDEX ELSEOUT_OF-P ANGE , ;_*_ END{IF} _ ;IFX < DATA(ORIGINAL INDEX} ;**_ THENBEGIN *_ ; INDEX = INDEX -4 _ WHI_ (INDEX > 0) ; ; _ DO BEGIN **_ ; COMPARE ARRAY ELEMENT _ITHXV

LEFT_OF_X_START: SUB DI,4 LXSI: CMP Dh 0 ,_ LXS2 FCO_ FSTSW FWAIT ,_V AND CMP JE CNP JE SUB JMP CNP DWORD PTR[BX+ DI] ST_AVE AX_ST_$SA_ AX,41(_H AX,O00GH LXS2 AX,4000H LXS2 Dh 4 LXSI Dh 0

; ;

MASK-IN CO_-_ARISON BITS EXITIF XV> ARRAY ELEMENT

LX_:

; ; ; ;

EX!TIF XV= AP_AY ELENENT INDEX = lh_X - 4 _*__t,!D {_HILE} **_ IF INDEX <> 0

23

8086!87!88!186 MACRO ASSEMBLER RFUN2S

08!30/84 PAGE 6

LOC OBJ 012B7DOC 012D83C704 01309BDDD8 01339BDgEE 0136EBOEgO

LINE 269 270 271 272 278 274 275 276 277 278 279 280 281 _2 2_ 284 285 286 287 288 .,'28.'9 290 291 292 298 294 295 296 297 _8 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 3!9 820 321 322 32_

9_RCE JGE ADD FSTP FLDZ J_ FOL_{D_L_-LX_INDEX ; THEN FOUND_LOW_INDEX hl,4 : ELSE OUT_OF_R_F_E ST(O) ; ; REPLACE TOPWITH 0 G__YL ; :*_ END(!F} _

0139 01399BDOI 013CBDCE9 013F9BD86904 01489BDEF9 0146 014603DE 01488_6 014ADIE8 014CD!E8 014EF6EI

FOL_D_LOW_X_IFE_X: P_D _.JORD PTR[BX+D!] FSUB ST(1), ST FSUBR DWORD PTR[BX+DI+4] FDIV GET_YL: ADD MOV SHR SHR HUL

:STORE XLC_,! STACK TOP ;(XV-XL) ON STACK BOTTOM ;(XH-XL) ON STACK TOP :(XV-XL)/(XH-XL) LEFTON STACK

BX,S: AX,S: AX,I AX,! CL

:BX= START OF YARRAY ;AX= _. OF X BYTES ;AX= NXPTS = k.OF X BYTES /4 :AX= YAROWOFFSET ;THE AVVE IF_STR. LIMITS LENGTH OF ZhRRAY ;TO255ELEMENTS ;BX= YA ROWPTR= NXPTS _ ZPTR ;BX= YA POINTER :STORE YA ONST TOP

0!5003D8 0152OSDF 0!54_BDg07 01578B07 0159050400 015C3BC6 015E7410 01609BD9C9 01639BD94704 01679BDSE2 OIGA9BD8C9 OI6D9BDEC2 0!70 0170BBCI 0172050400 (}175 3BC5 0177750F 01798BC7 0!7B050400 017E3B06 0180742A 01_ 9BDDD8 0!85 EB2590 0188 03DE 018A 9BD907 0!8D 8BC7 018F 0504_ 0192 3BC6 0194740D 01969BD94704 OIgA 9BZ_EI OI9D 9BDECA

ADD ADD FLD MOV ADD CMP JE FXCH FLD FSLe FMUL FADDP GET_YH: MOV ADD CMP ,B!E MOV ADD CNP JE FSTP ,_P GYHI: ADD FLD HOV ADD O'IP ,_ FLD FSUB FM_P

_X,_X BX,D: D!._]RD PTR[BX] AX,D: AX,4 AX,S: GET_YH ST(1) D!_RD PTR[BX+ 4] ST,ST(2) ST,ST(1) ST(2), ST

:EXIT !FXVPASTBOUNDRY ;(XV-XL)I(XH-XL) ON TOP,THEN YA :STORE YB ONST.TOP ;(YB-YA) ON ST.TOP ;((XV-XL)I(XH-XL))(YB-YA) ON STT_ :YL_D FROM TOPOF STACK

AX,CX AX,4 AX,BP GYHI AX,D: AX,4 AX,S: F_JND_YV ST FOUND_YV BX,SI DWORD PTR[BX] AX,DI AX,4 AX,Sl GET_YV D_E'RD PTR[BX+ 4] ST,ST(1) ST(2}, ST

:IF(Z_POIRTER TOOBIG) ;_ DO BEGIN _

IF (X_POINTER TOOBIG)

; THENEXIT ; ELSEDISCARD JUNK ; ANDTHEN EXIT; 1.*_ END{IF} *_ ;BX= YC POINTER :STORE YC ON STACK TOP

;EXIT IFXV PASTBOF_DRY ;STORE YD ON STACK TOP ;YD-YC ON ST TOP ;((XV-XL}/(XH-XL}}(YD-YC) 2NDFRO_ TOP

24

8086/87/88/N 186 ACF_ ASSEMBLER RFUN2S

08/80/84 PAGE

LOC OBJ OIAO 9BDECI 01A3 OIA39BD8EI 01A69BDECA OIA99BDECI OI_'JC OIAC OlAC8BDA 01AE DIEF 01B0 DIEF 01B2 8_F OIB4 DIE? OIB6 DIE9 OIB8 894F02 01BB 01BB 5D OIBC C20!

LINE 324 325 326 327 828 329 _0 331 332 333 _4 335 386 337 338 339 340 341 342 843 344 345 846 847 34B

S'OURCE FADD OET_YV: FSUB ST,ST(!) FFIUI_P ST(2), ST FADD FOUND_YV: SAVE_NEW_POINTERS: M_J BX,DX SHR Dh I SHR Dh ! MOV [BX].XPTR, DI SHR CX,I SHR CX,I MOV [BX].ZPTR, CX EPIL@UE: POP RET !,EARCODE CODE ENDS ;YHON TOP_ 8087 ;YHTOP,THENYL,THENSLOPE ;YH-YL ON ST.TOP ;((ZV-ZL)/(ZH-ZL))(YH-YL) 2NDFRC(_ TOP ;YVC_ST.TOP

;SAVE XPTR

;S,_VE ZPTR

BP I E,_DP

;RESTORE REGISTERS

351 352 A>.,_BLY COMPLETE, _0 EP_ORS FOUND

END

25

80861871881HA_ 186 ASSIB_R F_UN&

08130184 PAGE

SERIES-Ill 8086187/88/HACIR, 186O ASSEMBLER V2.0ASSEMBLY OF MODULE RFUN2L OB,_CT MODULE PLACED IN :FI:RFUN2L.OBJ A_EHBLER INVOKED BY: ASM86.86 :FI:RFUN2L._C

LOC OBJ

LINE

SC(IRL-'E

2 3 4 5 6 7 9 10 II 12 13 14 15 16 17 18 19 20 21 22 24 25 26 27 28 29 30 31 .32 33 3_ 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

1 1 _ ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

* ROUTINE NAME: RFL_2L * DATE: SEP. h 19_ * PROGRAMNER'S NAME: HICHAEL NACKIN * PLY:POSE: TO INTERPOLATE A SIMPLE * FUNCTION FORLARGE-MODEL * PROGRANS *

THISSUBROUTINE OUTPUTS THEESTIMATED VALUE OF A FU_TION YV = F(XV, ZV) BY INTERPC_ATING FROM KNOWN SOLUTION POINTS, L_SING THERELATIONS YL = ((XV-XL)I(XH-XL))(YB-YA) + YA YH= ((XV-XL)/(XH-XL})(YD-YC} + YC YV: ((ZV-ZL)/(ZH_ZL))(YH-YL) + YL INPUT REQUIRemENTS: I)THEFOLLOWING ADDRESSES WILL BE PASSED TOTH!SSUBR_JTINE: A. ON TOPOF THE8086STACK: THEADDRESS (OFFSET) OFA DATAAREAWITH THEFOLLO_IING FORMAT [_STRUC STRUC XPTR DB ZPTR DW NXPTS DB NZPTS DW ZARRAYDD XARRAY DD YARRAYDD DSTRUCENDS _ _ o _ NZPTS DUP(?) NXPTS DUP(?} NYPTS [_P(?) ;XARRAY INDEX ;ZARRAY INDEX iNO. OF ELEMENTS IN X ARRAY ;_B. OFELENENTS INZ ARRAY ;ZARRAY (255 ELEMENTS _AXI_UM) ;XARRAY IYARRAY

---00 0002 (_4 0006

; ; _

_-

; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

B. NEXT ON THE8086 STACK: THEADDRESS OF THEMENORY LOCATION WHICH HOLDS THEX INPUT VALUE. 2) ITISREQUIRED THATTHE8087 CHIPHAVE5 EMPTY REGISTERS WHENTHISINTERPOLATION ROUTINE ISCALLED. 3)_]TE: _]TWOADJACENT ELEMENTS OF XARRAY OR YARRAY MAYHAVE IDENTICAL ELEMENTS. THIS WILLRESULT INDIVISION BY ZERO. OUTPUT EFFECTS: i) F_GISTERS DESTROYED: AX,BX,CX,DX,DI,SI 2) INTERPOLATED RESULT RETURNED ON TOPOF 8087 STACK 3) XPTR LC_]ATION UPDATED TO INDEX X VALUE ,_JST PRECEDING XV. ZPTRLOCATION UP[_TED TO INDEX Z VALUE JUST PRECEDIt ZV. ._ (TOSPEED FUTL_E SEARCHES FORX ANDZ)

26

80861871881_IACRO 186 ASSEHBLER RFLB!21.

08130184 PAGE

LOC OBJ

LINE 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 68 69 70 71 72 73 74 75 77 78 7 80 81 82 83 84 8"5 86 87 88 89 90
.0.2

SOURCE EXAMPLE FORTRAN CALL SLIBROUT!NE TEST DI_Ek'SION XARRAY(5}, ZARRAY(3), Y_R_Y(15) INTEGER XINDEX, ZINDEX, NXPTS, NZPTS COMFION /STL.IFF!XINDEX,ZINDEX,NXPTS,NZPTS, ZARRAY, XARRAY,YARRAY [_TAXINDEX, ZINDEX, NXPTS, RZPTS/0, O, 5, 3/ DATA ZARRAY! 0,10. O. O, 20.0/ DATAXARRAY/ O, O. 2. O, 4. O, 6.0, 8. O/ DATA YA,,,,AY, #P z 0..... n_ ,4 ........ 4 .g 10., 12.,14. ,16.,!8.,20.,22.,24.,26.,28./ X=2.5 Z=12.0 Y=RFUN2L (X, Z, XINDEX) PRINT _, Y END

NA!4E RFLI._L CGROUPGROUP CODE DGRC_JP GROUP DATA ASSUFIE CS:CGROUP, DS:[GROL@, ES:DGRL'_JP PUBLICRFUN2L

STAO: STRUCTURE "

---0000 0002 _04 0006 (_OA 000E 0012 ----

PARAMSSTRUC OLD_ESDW OLD_BPDW OLD_DS_._ R_URN DD DADDR DD ZV DD XV DD PARAMSEND'S


;_-{" { _'-I-_ _*_ _ _-X-_ .'X" .'.'.'.'.'.'.'.'.'X' .K" ___ __z *__z'fr _{'_ .K, _'_ .'.'.'.'.'.'.'.'.'X,i$ ____ _*___'_ __ ______ _ { ____

_ _ _ _ 9 "_ "_

;SAVED ES REGISTER ;SAVED BP REGISTER ;SA_D DS REGISTER ;RETURN ADDRESS (OFFSET ON TOP,THEN SEONENT) ;ADDRESS OF DATAoTRU.TURE (OFFSET, THENSEGMENT) ;ADE_ESS OF ZV (OFFSET, THET_ SEG_I_IT) ;ADDRESS _ XV (OFFSET, T_4 SEGM_T)

---0000 ???? ----

94 95 96 97 98 97 100
102

DATA

SEGM_IT PUBLIC'DATA' ?

.TW..AVE DW DATA ENDS

__"l{"_ _{'_._'{'{"IFI_ _F{ -_'I{ " '._"I'_'I{-]F_'_ _'_'___

__ _ _

__

_ __

__

__

....

103 104 105

CODE SEGMENT PUBLIC'CODE"

2'7

8086/87/88/MACRO 186 ASSEMBLER P_JN2L

08/30/84 PAC,_ 3

LOC OBJ 000{I

LINE

SC{IRCE

0000 (X._}O. IE 000155 02 06 0003 8BEC (]9_ BS .... 0008 8ECO (_A C55E12 O00D9BD?07 0010C55EOE 00139BD907 0016C55E{_I 00198BD3 _31B 8B{_ 001D 8B6F04 C_208B7F02 0023DIE7 _Z_25 DIE7 00278B7706 O02ADIE6 002CDIE6

002E 002E 83C308 0031 9BD811 K134 9_6DD3E00{(! R O03A9B {_3B 26AI00{_ R 003F250041 00423[<I{_i 00457434

0047 C(147 83C704 004A3BFE 004C741B C44E9BDS11 {1051 9B26DD3E0000 R _D57 9B 005826AI0000 R 005C 250041 005F3D0001 C_627405 64 83C704 (_J67 EBEI 0069 8BC6 O06B 2D0400

106 FARCODE PROC FAR 107 108 109 110 RFUN2L: 111 PUSH DS 112 PUSH BP 113 PUSH ES 114 _OV BP,SP 115 MGV AX,DATA 116 MOV ES,AX 117 LDS BX,[BP].XV 118 FLD [_!ORD PTR[BXI 119 LDS BX,[BP].ZV 120 FLD _WORD PTR[BXI 121 LDS BX,[BP].DADDR 122 MGV DX,BX 123 HOV CX,[BX].XPTR 124 h_V BP,[BXI.NXPTS 125 MOV DI_[BX].ZPTR 126 S_ DI,I 127 SHL Dh i 128 MOV SI,[BXI.NZPTS 129 SHL El,i 130 SHL SI,I 131 I_ GET_Z_INDEX: 133 ADD BX,8 134+2 F_R DW_D PTR[BX+ DII 135+I FSTSW ES:STWSAVE 136+I FWAIT 137+I T_JV AX,ES:STHSAVE 138+I AND AX,4100H 139+2 CMP AX,01{_ 140+2 JE LEFT_OF_Z_ST_T NEFIT 141+2 142 143 RIC_T_OF_Z_START: 144 ADD DI,4 145 RZSI: CHP D!,SI 146 JE RZS2 147 !48+2 FCOM DWORD PTR[BX+ DI] 149+I FSTSW ES:STBSAVE 150+I FWAIT 151+i MOV AX,ES:STWSAVE 152+I AND AX,41{_C_ !53+2 CMP AX,010_ 154+2 JE RZS2 155+2 156 ADD DI,4 157 JMP RZSI 158 RZ_: MOV AX,SI 159 SUB AX,4

;SAVE REGISTERS

;GET XV ADDRESS ANDSEGMENT ;PUT XVON TOPOF 8087 STACK ;GET ZVADDRESS ANDSEGMENT ;PUT ZV ON TOPOF S087STACK ;GET START ADDRESS OFDATASTRUCTURE ;SAVE BX ;CX= XPTR ;BP= NXPTS ;DI= ZPTR ;DI= BYTEINDEX = ELEMENT INDEX *4 ;Si= HZPTS ;El= NO.OFBYTES = NZPTS *4

;BX= START OF Z ARRAY ; COMPARE ARRAY ELE_EF_ WITH ZV

MASK-IN COMPARISON BITS : EXITIF ZV( ARRAY ELE

;IFZ > DATA(_IGIHAL IRE:X) ;***THEN BEGIN *** ; INDEX = INDEX +4 ; _HILE (INDEX {= NO._ BYTES) ; ; ***DOBEGIN _* ; COMPARE ARRAY ELERENT WITHZV

; ; ; ; ; ;

MASK-IN CO_AR!SGR BITS EXITIFZV{ ARRAY ELEMENT INDEX = INDEX +4 ***END{_HILE} ***

28

8_6/87/88/MACRO IB6 ASSEMBLER RSUN2L

08/30/84 PAGE

LC,] OBJ C_GE 83EF04 0071SBF8 _}73 7542 0075BDDD8 0078 EB4D90

LINE 160 161 162 163 164 165 166 167 168 169 170 171 172 +2 173+I 174+I 175+I 176 +i 177+2 178 +2 179+2 180 +2 !81 182 183 184 !85 186 187 188 187 190 191 192 193 194 195 I% 197

SOUR_ SUB CNP JNE FSTP JMP D!,4 Dh AX FO.,_ l!_n ...... lh_ I_Z_IN[EX ,_ ST(O} GET_X_INDEX ; ; IF INDEX <> NO.OF BYTES ; THENFOUND_LO__INDEX ; ELSE C_;T_OF_RAF.L_E ; 1.** END {!F} *** IIFZ < DATA(OR!G!NAL Ir_EX) ;*** THEkBEGIN *_, ; INDEX = IN[_X -4 ; WHILE (INDEX > 0) ; ; _,_<F BEGIN _* COMPARE ARRAY ELEMENT WITHZY

007B {_7B 83EF04 007E 83FFO0 008! 7..... r_n C_83 9BD811 0086 9B26DDSE000R 0 008C 9B 008D 26AI0000 R 0091 250041 0094 3DO000 {_97 740A 009?3D0040 _:9] 7405 009E 83EF04 _OAI EBDB OOA3 83FF00 00A6 7DOF OOA8 83C704 0GAB 9BDDDS 00AE 9BDEE L_BI 9BD?C? OOB4 EBIIgO

LEFT_OF_Z_START: SUB DI,4 LZS!: CMP DI,0 JL LZS2 FCO_! DWORD PTR[BX+ DI] _:T: "_ i Eo.STW:_E FWAIT MOV AX,ES:STI_SAVE AND AX,41_H CMP AX,O000H ,.E LZS2 _P AX,4000H JE LZS2 SUB Dh 4 ,_.!P LZSI LZS2: CMP D!,0 JOE F_D_LC(LZ_INDEX ADD DI,4 FSTP ST(O) FLDZ FXCH ST(1) JNP GET_X_INDEX

; ;

MASK-IN COMPARISON BITS EXITIF ZV> ARRAY ELEMENT

; EXITIFZV = flF_:AY ELE_IENT ; INDEX : INDEX -4 ; ***END{WHILE} *** ; IF INDEX <> 0 ; THEN FOUND_LOW_INDEX ; ELSE OUT_OF_RANGE ; I REPLACE TOPWITH0 I PUTXVC_ TOPOF 8087ST. ; 1.*_ END{IF} ***

C"L)B7 OOB7%D901 OOBA9BDCE9 OOBD9BD86904 _CI 9BDEF9 00C49BD9C9 0_7 0{,$7 03DE 00C987F9 (_CB DIE7 OOCDDIE7 (()C:F 87F5 OODI DIE6 _)D3 DIE6 OOD5 9BD811 _OD8 9B26D[rSEO000 R OODE 9B {_DF 26AI0000 R OOE3 250041 (_E6 3D0_I OOE9 7434

FOUND_LOW_Z_INDEX: FLD DWCD PTR[BX+DI] FSUB ST(1), ST FSUBR D!_D PTR[BX+D!+4I FDIV FXCH ST(1)

ISTORE ZL_I ST_]K TC9 ;(ZV-ZL) 2NDFR_I TOP ;(ZH-ZL) ON STACK TOP I(ZV-ZL)/(ZH-ZL) LEFTON STACK _PUT XV ON TOPOF 8087 STACK

199 GET_X_INDEX: 2_Z_ ADD BX,SI 201 XCHG DI,CX ol 202 _H_ Dh I 203 S_ DI,I 204 XCHG SI,BP 205 S_ Sh I 206 SP_ SI,I 207+2 FCOM _ORD PTR[BX+ DI] 20B+I FSTSW ES:STWSAVE 209+I FWAIT 210+I NOV AX,E_..,TW.A_'_ _ _ 211+I AF_ AX,410LYH 212+2 CMP AX,010_ 213+2 JE LEFT_OF_X_START NENT

;BX= START OF XARRAY ;DI: XPTR: CX : LOW_Z_!N_X ;DI= BYTEINDEX : XPTR *4 ;SI= NXPTS ; !SI= NO.OF X BYTES = NXPTS *4 _ COMPARE ARPAY ELEMENT WITHXV

MASK-IN COMPARISON BITS 1 EXITIFXV < ARRAY ELE

29

8086187/88/MACRO 186 ASSEMBLER PU!2L

09130/84 PAGE

LC_ OBJ

LINE

SOURCE

OOEB <_ 83C704 OOEE3BFE _.' 0:,F 741B .._2 9BD911 {.V!.F5 9_._DDSE0000 R )FB 9B 00FC 26A10000 R 01{_ 25{_341 0103 3D0001 0106 7405 0108 83C704 010B EBEI OIOD8BC6 0!_ 2D0400 0112 83EF04 0115 3BF8 0117 753F 0119 9BDDD8 011C EB_,790

01!F 011F 83EF04 012283FF00 01257C20 01279BDB11 0!2A9B26DDSE0000 R 01309B 013126(110000 R 0135 250041 01383DO000 013B 740A 013D3D0040 01407405 014283EF04 0143. EBDB 014783FF00 014A7DOC 01':C 83C704 014F9BDDD3 0152 9BDSEE 0155 EBOESO

0!58 0158 9BD901 015B9BZ_E9 015E9BD86904 0162?BDEF9

214+2 215 ;IFX > DATA(C_IGINAL IF;DEX) 216 RIGHT_OF_X_ST_T: ;_{ THEN BEGIN _* 217 ADD DI,4 ; INDEX = INDEX + 4 2!8 RXSI: CMP DI,SI ; WHILE (INDEX ,.'= NO,OF BYTES) 219 JE RXS2 ; _0 ; _* DO BEGIN _*_ 221+2 FCOM DWORD PTR[BX+ DI] ; COMPARE ARRAY ELE,r.IENT WITHXV 2_ +I FST_ ES:ST_AVE 223+I FWAIT 224+I MOV AX,ES:STWSAVE 225+I A_;D AX,4100H MASK-IN CG!_PARISON BITS 226+2 CMP AX,0100H' 227+2 JE RXS2 ; EX!TIF XV-.. ARRAY " ELEMENT 228+2 229 ADD DI,4 ; INDEX = INDEX +4 230 .IMP RXSI ; +_*END{WHILE} *_ 23i RX_: MOV AX,81 ; 232 SUB AX,4 ; 233 SUB DI,4 ; T _ 234 CMP DI,AX ; IF INDEX <>NO.OF BY,E: _5 Jr'_E FOUND_LO!'LX_INDEX ; THEN FOLIF!D_LO'_!_INDEX 236 FSTP ST(O) ; ELSEOUT_OF_RA,_!GE 237 J_P GET_YL 233 I_*_ END{!F} _ 239 _IFX < DATA(ORIGINAL INDEX) 240 LEFT___X_START: ;_ THENBEGIN _** 241 SUB D!,4 _ INDEX = INIEX -4 242 LXSI: CMP D!_0 ; WHILE (INDEX > O) 243 JL LXS2 ; 244 ; _ DO BEGIN _ 245+2 FCOM [_-JORD PTR[BX+ DI] ; COMPARE ARRAY ELE,_ENT WITHXV 246+! FSTSW ES:ST!-_SAVE 247+I F_IAIT 248+i K_]V AX,ES:STWSAVE 249+I AND AX,410C_ ; MASK-IN CO!.!PARISON BITS 250+2 CI'_ AX,O000H ; EXIT!FXV > ARRAY ELE_E_'T 251+2 JE LXS2 252+2 CMP AX,4000H 253+2 JE LXS'2 ; EX!T!FXV = ARRAY ELEHENT 254 8UB DI,4 ; !_!DEX = !NDEX -4 255 ,..,_-: LXSI , ; _ END{WHILE} .H 256 LX_: C_.IP DI,0 ; !F INDEX ,.'> 0 257 JGE FOUND_LOW_X_INDEX ; THEN FOUND_LOW_INDEX 258 ADD DI,4 ; ELSEOLFF_OF_RA_}GE 259 FSTP ST(O) ; 260 FLDZ ; REPLACE TOPWITH0 261 JMP GET_YL ; 262 ;_ END{IF} _ 263 264 FGUND_LOW_X_INDEX: 265 FLD _4ORD PTR[BX+DI] ;STORE XL_ STACK TOP 266 FSUB ST(1), ST ;(XV-XL) ON STACK BOTTC4.1 267 FSUBR DWORD PTR[BX+DI+4] I(XH-XL) ON STACK TOP 268 FDIV ;(XV-XL)/(XH-XL) LEFT ON STACK

3O

80861871881186 MACRO ASSEMBLER RFUH2L

08130184PAGE

LOCOBJ
0165 016503DE 0!678BC6 0169DIE8 016BDIE8 016DF6EI

LINE
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 _3

SOURCE
GET_YL: ADD MOV SHR SHR MUL

BX,S; AX,S; AX,I AX,I CL

;BX= START OF YARRAY ;AX= NO.OF X BYTES ;AX: NXPTS : NO.OF X BYTES /4 tAX= YARO_OFFSET ;T_ AVOVE !NSTR. LIMITS LENGTH OF ZARRAY ;TO255ELEM_,ITS ;BX= YA RO_PTR= NXPTS * ZPTR ;BX= YA POINTER ;STORE YA C_d STTZ_

OI6F03D8 017103DF 0173 98D907 017688C7 0178 050400 01783BC6 OI7D7410 OI7F 9BD9C9 0!8298D94704 01869BDSE2 0!8998D8C9 018C9BDEC2 018F 018F8BCI 019!050400 01943BC5 0!96750F 0198 88C7 019A 050400 0i9D 3BC6 019F742A 01AI9BDDD8 01_4EBb90 OIA703DE OIA9 9BD907 OIAC 88C7 OIAE 0.5{i4(_ OIBI 3BC6 0183 740D 0195 98D94704 0!89 9BDBEI OIBC9BDECA OIBF9BDECI 01C2 01C2 9BDSEI 0105 9BDECA 01C8 9BDECI OICB OICB OICB 8BDA 01CD DIEF 01CF DIEF

ADD ADD FLD MOV ADD CMP ,E FXCH FLD FSUB FML_. FADDP

BX,AX BX,DI D_E_D PTR[BX] AX,D; AX,4 AX,S; OET_'_ ST(i) DHORD PTRIBX+ 4] ST,ST(2) ST,ST(1) ST(2), ST

;EX!T IFXV PAST BOUNZ_:Y ;(XV-XL)!(XH-XL) ON TOP, THENYA ;STORE YB ONST.TOP ;(YB-YA} ON ST.TOP ;((XV-XL)!(XH-XL)}(YB-YA) ONST TCP ;YL2NDFROHTOPC_ STACK

C_T_YH: MOV AX,CX ADD AX,4 CHP AX,BP JNE OYHI NOV AX,D; ADD AX,4 CMP AX,S; JE FOUND_YV FSTP ST J_P FOUND_YV GYHI: ADD BX,S; FLD DWORD PTR[BX] _OV AX,hl ADD AX,4 CMP AX,S! JE GET_YV F!..D [_ORD PTR[BX+ 4] FSUB ST,ST(1) FF$!LPST(2), ST FADD GET_YV: FSUB ST,ST(1) FMULP ST(2), ST FADD FOUND__: SAVE_NEW_POINTERS: MOV BX,DX SHR DI,I SHR DI,I

;IF(Z_POINTER TOOBIG) ;*** DO BEGIN **_

IF IX_POINTER TOOBIG)

_ THEN EXIT ; ELSEDISCARD JL_,IK ; ANDTHEN EXIT_ ;_* END{IF] +_ ;BX= YCPOINTER ;STORE YC ON STACK TOP

;EXIT IFXV PAST BOL_,!DRY ;STORE YDON STACK TOP ;YD-YC C4 ST TOP ;((XV-XL}!(XH-XL))(Y[_YC) 2NDFRON TOP ;YHON TOPOF 8087 ;YHTCP,THENYL,THENSLOPE ;YH-YL ON ST.TOP I((ZV-ZL)I(ZH-ZL))(YH-YL) 2NDFROMTOP ;YVONST.TCP

31

_}8618718B/NACRO 186 ASSE,_IBLER RFI_2L

08130/84 PAGE

LC_ OB.J 01DI893F OID3DIE9 01D5DIE9 01D7 894F02 01DA OIDA 07 OIDB5D 01DCIF OIDDCA_

L!NE 324 325 326 327 328 329 _30 331 3"$2 3_ 335 _6 337 33S

_]L_CE NOV SHR SHR _V EPILOGUE: POP POP POP RET FARCODE ENDP CODE ENDS [BX].XPTR, DI CX,I CX,I [BX].ZPTR, CX ;SAVE XPTR

;SAVE ZPTR

ES BP DS 12

;RESTORE REGIST_S

----

341 3_2 ASSENBLY CO_IPLETE, NO ERRORS FOUND

END

32

8086/87/88/MACRO 186 A_EMBLER RFL_3S

08/30/84 PACE

SERIES-If! 8086/87/88M_CRO /186ASSEMBLER V2.0 ASSEMBLY OFMODL_E RFUN3S OBJECT HODULE PLACED IN:FI:PEUN3S.OBJ ASSEMBLER IN_:ED BY: AS_!86.86 :FI:RFUN33.S_C
LOC OBJ LI{.E S_JRCE

2 8 4 5 6

i ; ; ; _

_ R_IT!NE IJAME: RFUN?S _ DATE: SEP. 6, 1983 _ FRC_RA_MER NA_E: 'S MICHAEL _ACKIN M_L: " _ PURPOSE: TO INTERPOLATE AR .I, . * * FU_t_T!ON FORS_LL-FIODEL

9 I0 II 12 18 14 !5 16 !7 18 19 20 21 .... 0000 0002 C_04 0006 23 24 25 26 27 28 29 30 31 32 _3 34 35 36 37 38 39 40 41 42 43 44 45 46 47 S 49 50

; ; ; ; ; ; ; ; ; ; ; ; ;

THISSUBRC_JTINE OUTPUTS THE. ESTIHATED VALL_ OFA FL_CTION Yv : F(XV, ZV) BY I_ERPOLATING F_DM KNOWN _LUTIO_ POIk_S, USING THERELATI{_S XF : ((ZV-ZL)I(ZH-ZL))(XB-XC) + XC XG: ((ZV-ZL)!(ZH-ZL))(XE-XD} + XD YF : ((ZV-ZL)I(ZH-ZL))(YB-YC) + YC YG : ((ZV-ZL}!(Z.ZL))(YE-YD) + YD t_ : ((XV-XF)I(XG-XF))(YC-YF) + YF INPUT REQUIREMENTS: I)THEFC_LOHING ADDRES3ES WILL BE PASS_TO THISSUBROUTIne: A, ON TOPOF THE8086 STACK: THEADDRESS (OFFSET) OFA DATAAREA WITHTHEFC_LOWIt FORMAT _3 DST_._STRUC XPTR DW ZPTR DW NXPTS _ NZPTS DW ZARRAYDD XA_AY DD YARRAYDD DSTR_ -L-'_DS _ ;XARRAY INDEX ? ;ZARRAY IN[_X ? ;NO. C_ X BREAKPOINTS ON EACHZ L!NE _ ;NO. OF ELE_-ENTS INZ ARRAY NZPTS [_JP(?) ;ZA_RAY (255 ELEHENTS MAXIML_) NXPTS _JP(?) ;XARRAY NYPTS [_Ip(?) ;YARRAY

; ; ;

----

; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

B. ONTHE8087 STACk:: {_ TOPZV,THENXV 2) IT ISREQUIRED THATTHE8087CHIPHAVE 5 EMPTY REGISTERS WHeNTHISINTERPOLATION ROUTINE ISChLLED. 3)NOTE: NO TWOADJACEF_ ELEMENTS OF XARRAY, YAP, RAY, OR ZARRAY MAYHAVEIDENTICAL ELEFIENTS. THISWILLRESULT INDIVISION BY ZERO. _JTPUT EFFECTS: I)REGISTERS _STROYED: AX,BX,CX,DX,DI,SI 2) INTERPOLATED RESULT RETL_NED ON TOPOF8087STACK 3) XPTR LOCATION L_DATED TO INDEX X VALL_ JUSTPRE_DING XV. ZPTRL_2ATION I_DATED TO IN[_X Z VAL!_ JL_TPRECEDING ZV. (TO _EED FUTL_E SEAE_S FORX AF!D Z)

33

AS3EMBLER RFL_,!3S

08130184 PAGE

LIE 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 89 9O 91 92 93 94 95 96 98 99 100 I01 102 103 104 105

SOJRCE ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; _ -: ; ; ; ; ; ; ; ; ; ; ; EXAMPLE PL/MCALL P_IPGM: DO_ DECLARE DSTRUC STRUCTURE ( XINDEX INTEGER, ZIPDEX INTEOER, NXPTS INTEGER, NZPTS INTEGER, ZA_AY(3) REAL, XARRAY(15) REAL, YARRAY(15) REAL) PUBLIC INITIAL ( /_ XINDEX *1O, /* ZINDEX *1 O, /_ NXPTS*1 5, /,NZPTS*1 3, /, ZARRAY *1 0.0,10.0, 20.0, I* XARRAY _I 0.0,2.0, 4.0,6.0, 8.0, 1.0, 3.0,5.0,7.9, 9.0, 1.5, 1.75, 1.8, 5.0,I0.0, /_YARRAY */ 0.0, 2.0,4.0,6.0, 8.0, 10.0, 12.0, 14.0, 16.0, 18.0, 20.0, 2_.0, 24.0, 26.0, 28.0); RFLr._3S: PROCEDURE(X,Z,STRUC_ADDR) REALEXTERNAL; DECLARE X REAL; DECLA, Z EREAL; DEC_RESTRUC_ADDR POINTER; ENDP_UR3S; R3TEST: PROCEI_._E PUBLIC; DECLARE (X,Z,Y) F;EAL; X = 3.2; Z = 12.0; Y = RFUN3S(X, Z,_DSTRUC); 0!LLPRINTOUT(Y); END; ENDR3TEST; _D PLMPC_I;

NAHE RFU[_S CGROUPGROUP CODE FGROLPGROUP DATA ASSUFIE CS:C6ROUP, DS:[GROUP PUBLICRFU[_,_S

STACK STR_3]TURE

PAPAS STRUC OLD_BPD_I RETURND_J DADDR [_.i ') '_ _ ;SAVED BP REGISTER ;RETURN AD[_ESS ;ADDRESS OFFATASTRUCTL_E

34

8086!87!881186 M_RO ASSEMBLER RFUFOS

08/30/84 PAGE 3

LOCOBJ
---

LINE
106 107 108

SOURCE
PAR_S ENDS

---0000 ???? ----

111 112 113 114 115 116 117

DATA

SEGMENT PUBLIC'DATA' ?

STI_SAVE DW DATA ENDS

.... 0000

0000 000055 00018BEC 00038BSE04 _068BD3 0_8 8B2F 000A8B4F04 O00D8B7F02 I0 DIE7 0012DIE7 00148B7706 0017 DIE6 0019DIE6 001B O_IB _308 001E 9BD811 0021 9BDD3E0000 R 0026 9B 0027 AIOO{K) R O02A 250041 002D 3D0001 0030 7432

120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144+2 145 +I 146+I 147 +I 148+I 149+2 150+2

CODE

SEGMENT PUBLIC'CO_" PR_ _AR

NEARCODE

RFUN3S: ;SAVE REGISTERS . PU_ MOV MOV M_W _V MOV MOV SHL SHL _OV .HL SHt B? BP,S_ BX,[BP].DADDR DX,BX BP,[BX].XPTR CX,[BX].NXPTS DI,[BXI.ZPTR Dh I Dh I Sl,[BX],NZPTS Sh I SI,I

;GET START AD[_E_OF DATA STRUC_IRE ;SA_BX _BP= XPTR ;CX= NXPTS ;DI= ZPTR ;Ol= BYTEINDEX = ELE_ ;Sl= NZPTS INDEX *4

;Sl= NO.OF BYTES = NZPTS _4

GET_Z_!NDEX: ADD BX,8 FCC_ DWORD PTR[BX+ DI] FSTSW STWSAVE F_._IT MOV AX,STWSAVE AND AX,4100H CMP AX,01(.,0H.. ,;E LEFT_OF_Z_START NENT

;BX= START OF Z ARRAY ; COMPARE ARRAY ELEMENT WITHZV

MASK-IN COMPARISON BITS ; EXIT!F ZV< ARRAY ELE

0032 00328_704 00353BFE C_377419 00399BD811 003C9BDD3E0000 R

151+2 152 153 RIGHT_OF_Z_START: 154 ADD Dh 4 155 RZSI: C_;P Dh Sl 156 dE RZS2 157 158+2 FCC#_ D!._DRD PIR[BX+ DI] 159+I FSTSW STWSAVE

_IFZ ) DATA(ORIGINAL INDEX) ;*** THEN BEGIN *** ; INDEX = IN[_X +4 ; WHILE (INDEX (= _. OF BYTES) ; ; **-* DO BEGIN _*_ ; COMPARE ARRAY ELEMB_7 WITH ZV

35

8086/87/88!186 MACRO ASS_-IBLERRFUN3S

08!30!84 PAGE 4

LOC OBJ 0041 9B 0042A!OC_O (_45250041 0048 3D0001 (_4B 7405 004D83C704 0050 EBE3 C52 88C6 0054 2D0400 6?5783EF04 O05A38_8 005C7540 O05E9BDDD8 0061E84B90

LI_E 160+I 161+I 162 +I 163+2 164+2 165+2 166 167 168 !69 170 171 172 !78 174 !75 176 177 178 179 180 !81 182+2 188+I 184+I 185+I 186+I !87+2 188+2 189+2 190 +2 191 192 193 194 195 196 197 198 !99 200 201
9A9

SOURCE FWAIT MOV AND CMP ,: ADD JMP RZS2: MOV SUB _]B C_P JNE FSTP _IP

AX,STWSAVE AX,41_H AX,010_ RZS2 DI,4 RZSI AX,SI AX,4 DI,4 DI,AX FOUND_L__Z_INDEX ST(O) GET_X_IRDEX

_ ;

MASK-IN COMPARISC_ BITS EXITIF ZV< ARRAY ELEMENT

0064 _64 83EF04 0067 83FF00 006A7CIE 006C981811 O06F 9BDD3EOC_O R 00749B 0075AI0000 R 007825_341 007B3D0000 (_7E740A OOSO3D0040 _33 7405 008583EF04 _X_88 EBDD 008A83FFO0 {!08D 7DOF 008F8?C704 C_929BDDD3 00959BDgEE (:_)98 98D9C9 009B EBI!90

LEFT_OF_Z_START: SUB DI,4 LZSI: CMP Dl,0 JL LZ_ FCOM FSTS_ FWAIT MOV AND CMP JE CNP ,E SUB JHP LZ_: CFP JGE ADD FSTP FLDZ FXCH JFIP DWORD PTR[BX+ DII ST_SAVE

; INDEX = INDEX +4 M I ; _m_END{,,H ,LE} _ ; ; ; ; IF INDEX ,:> NO.OF BYTES _ THEN F_JND_L_-!_INDEX ; ELSE_JT_OF_RANGE ; ;_ END{IF} _ ;IFZ < _TA(ORIGINAL INDEX) 1_ THEN BEGIN _ ; INDEX = INDEX -4 ; W_ILE (INDEX > O} ; _ _* [_ BEGIN _ ; COMPARE ARRAY FIF__FE_: WITHZV

AX,ST{SAVE AX,4100H ; MASK-IN COMPARISON BITS hX,{_OOH ; EXIT!F ZV> ARRAY ELE_IENT LZS2 _X,4000H LZS2 _ EXITIF ZV= ARRAY ELEMENT DI,4 ; INDEX = INDEX -4 LZSI I _ END{WHILE] _*_ DI;0 ; IF INDEX <> 0 FC_;_D_LC_4_Z_INDEX ; THENFOUND_LOW_INDEX DI,4 ; ELSECKIT_OF_RANGE ST(O) ; ; REPLACE TOPWITHO; ST(1) ; GET_X_IF_EX ; ;_ END{IF] _

..00,._E

PNI_Jn _

7 I_n_Y,

O09E98D901 00AI9BDCE9 OOh49BD86904 {X)A8 9BDEF9 00AB98D9C9 O{_,E GDAE03BE 0080 88C7 00B2 F6EI 0084 03D8 B6 87FD

203 204 205 206 207 208 209 210 211 212 213 214

FLD FSUB FSUBR FDIV FXCH

D_Z:RD PTR[BX+DI] ;STORE ZLOFf ST_CK TOP ST(1), ST ;(ZV-ZL) 2RDFROMTOP _ORD PTR[BX+DI+4] _(ZH-ZL) ON STACK TOP ;(ZV-ZL)/(ZH-ZL) LEFT_ STACK ST(I} ;PUTXVON TOPOF8087STACK

GE-T_X_IN_X: ADD BX,SI F_V AX,Dl MUL CL ADD BX,AX XCHG DI,BP

;BX= START _ XARRAY ;AX: NO.OF Z BYTES ;AX= XCROWOFFSET=N. [f ZBYTES*NXPTS ;BX: XCNONPTR ;DI= XPTR: BP = LOW_Z_INDEX

36

806187!88!186 M_CRO ASSEMBLER RFU_S

08/30/84 PAC_ 5

LOC OBJ 00B8DIE7 CODA DIE"/ _3BC87FI _BE DIE6 OOCODIE6 c_)C2 9BD901 00C58BO5 00C7050400 OOCA3BCI _:C 7410 O_:E 03DF OODO 9BD900 OOD3 2BDF C'OD5 9BDSEI 00D89BDSCB DB 9BDECI OODE9BDSDI {X)EI 9BDD3EOOv30R OOE69B OOE7AIO0{_ R OOEA250041 00_ 3DO000 OOFO745A

LINE

SOURCE

OOF2 _F2 83C704 OOF5 3BFE _F7 7430 0_9 9BD901 00FC 80C5 _FE 050400 0!0!30CI 0103 7410 0!0503[_ 010790D900 01{_2BDF OIOC9BD3EI OIOF9BDSCC 01129BDECI 0115 9BDSD2 01189BDD3EO000 R OIID 90 OIIEAlOf_)O R 0121 250041 01243DO000 0127 7400 0129 9BD9C9 01_ 9BDDD8 OI2F 83C704 0132 EBCI 0134 9BD9C9 0137 8BOG

215 _L DI,I 216 SNL Dh I 217 XCHG Sh CX 218 SHL Sh I 219 S.HL SI,! 220 FLD D_Z_D PTR[BX+ DII 221 MOV AX, 222 ADD AX,4 223 CMP AX, CX 224 JE GXI 225 ADD BX,DI _6 FLD DWORD PTR[BX+SI] 227 _tlB BX,DI 228 FSLe ST,ST(1) 229 F_JL ST,ST(3) 230 FADD _I +2 GXI: FCOM ST(!) 232+I FSTSW S_'JSAVE 233.I FWAIT 234+I MOV AX,STWSAVE 235+I AND AX,4100H 236+2 CMP AX,0c.'44 _7 +2 JE LEFT.OF_X_START 238 +2 239 240 RIGHT_OF_X_START: 241 ADD DI,4 242 RXSI: CMP Dh SI 243 JE RXS2 244 245 FLD B_OR, D PTR[BX+ DI] 246 MOV AX,BP 247 ADD AX,4 248 Ct.IP AX,CX 249 ,E RX_ 2_ ADD BX,DI 251 F_ DWC_RD PTR[BX+SI] 252 SUB BX,DI 253 FSUB ST,ST(1) 254 F_E_L ST,ST(4) 255 FADD 256+2 RXS3: FCON ST(2) 25"/+I FSTS_ ST_SA_ 258+I F_IT 259+I MOV AX,STWSA_ 260+I AND AX,4100H 261+2 CMP AX,O000H 262+2 JE RXS2 263+2 264 FXCH ST(1) 265 FSTP ST(O) 266 ADD Dh 4 267 JMP RXSI 268 RXS2: FXCH ST(1) 269 _V AX,SI

;DI= BYTEINDEX = XPTR *4 _SI= NXPTS : CX = F_O. OF Z BYTES ; _SI= NO.OF X BYTES = NXPTS _4 ;STORE XC ON TOPOF STACK

_EXIT IFZ TOOHIGH ISTORE XB ON TOPOF STACK ;XB-XC ON ST.TOP _((ZV-ZL}I(ZH-ZL))(XB-XC) ON ST.TOP ;XFONST.TZe ; COr_PARE ARRAY ELEMENT WITHXV

; ;

MASK-IN COMPARISON BITS EXITIFXV } ARRAY ELEMENT

;IFX } DATA(ORIGINAL INDEX} ;**_THEN BEGIN *_* ; IN_X = I_EX + 4 ; _HILE (INDEX <= F_.{_BYTES} ; ; ; ; ; _ ; ; ; ; ; ; _ _* gO BEGIN *_ STORE XD{_4 TOPOF STACK

EX!TIF Z T_}HIGH., STORE XE ONTOPOF ST_K XE-XD ON.. ST.TOP. ((ZV-ZL}I(ZH-ZL))(XD-XE} ON ST.TOP XG ON ST.TOP COF!PARE _RAY EL_EI,.rI" WITHXV

; ;

MASK-IN COMPARISON BITS EXITIFXV } ARRAY ELEMENT

; ; ; ; ; ;

XF = XG DISCARD _O XF INDEX = INDEX +4 ***END{I.:_ILE} _

37

8086187188/MACRO 186 ASSEHBLER RFU_S

08130184 PAGE

LOC OBJ 0139 2_400 013C 83EF04 OI3F 3BF8 0141 7565 01439BDDDS 01469BDDD8 0149EB7290

LINE

SOLACE

014C 014C83EF04 014F 83FFO0 0152 7C40 01549BDSOI 01578BC5 0159 050400 015C 3BCI 015E 7410 016003DF 0162 9BDSO0 _' 0165_[_ 01679BD3EI OIGA9BDSCC 016D9BDECI 01709BDSD2 01799BDD3EO0_} R 0!78 98 0179 AIO(_O R 017C 250041 017F 38}001 01827410 01843D0040 0187740B 01899BDSC9 018C9BDDD8 OISF 83EF04 0192 EBBB 0194 83FFC_) 0!97 7DOF 0199 83_704 0!9C 9BDDD8 019F 9BDDD8 OIA29B_EE OIA5EBI690

01A8 01A89BDCEA 01AB 9BDEE9 01AE9BDEF9 01BI8BC5 OIB3050400 OIB63BCI 01887403

270 SUB AX,4 ; 271 SUB Dh 4 ; 272 CMP Dh AX ; IFINDEX <> NO.OF BYTES 273 ,_!E FZ_ND_LOW_X_INDEX ; THEN FC4;ND_LOW_INDEX 274 FSTP ST(O) ; ELSE OUT_OF_RANGE 275 FSTP ST(O) _ DISCARD XG,ANDXV 276 JMP GET__4SWER ; 277 i*** END{IF} m** 278 ;IFX < D_TA(ORIGINAL INDEX) 279 LEFT_OF_X_SThRT: ;_* T_N BEGIN *_ 280 SUB DI,4 ; INDEX = INDEX -4 281 LXSI: CHP Dh 0 ; WHILE (INDEX > O) _ _ LXS2 ; 283 ; *_*DOBEGIN 284 FLD _ORD PTR[BX+ DI] ; STC_E XDON TC_OF ST_SK 285 HOV AX,BP 286 ADD AX,4 ; 287 CHP AX,CX 288 JE LXS3 ; EXITIF Z TOOHIGH 289 ADD BX,DI ; 290 FLD _.JORD PTR[BX+ SI] ; STORE XE ONTOPOF STACK SUB BX,DI ; 291 292 FSUB ST,ST(1) ; XB-XC ON ST.TOP 293 FF_JL ST,ST(4) ; ((ZV-ZL)I(ZH-ZL))(XB-XC) ON ST.TOP 294 FADD ; XGON ST.TOP .?9,5 +2 LXS3..: FC@I ST(2) ; COMPARE ARRAY ELENENT NITH XV 296+I FSTSW ST_SAVE 297+I FWAIT 298+i _OV AX,STWSA_ 2. +I AND AX,4!00H ; HASK-IN CC_.!PARISON BITS 3FJ+2 CHP AX,0100H 301+2 JE LXS2 ; EXITIF XV_ ARRAY ELEFIENT 302+2 CMP AX,40_]H 303+2 JE LXS2 ; EXITIF XV= ARRAY ELENENT 304 FXCH ST(1) _ XF=XG 305 FSTP ST(O) ; DISCARD OLDXF 306 SUB DI,4 1 INDEX = INDEX -4 307 JHP LXS! ; _* END{HHILE} *_ 308 .X_: CNP DI,0 ; IF I,,[LX 0 309 JGE FOUND_LOH_X_It_EX ; THEN FOUND_L__INDEX 310 ADD Dh 4 ; ELSEOUT_OF_RANGE 311 FSTP ST(O) 312 FSTP ST(O) ; DISCARD XC .313 FLDZ ; REPLACE TOPHITH0 314 JNP G_T_AF.3.LR ; 3!5 ;*{-* END{IF} _ 316 317 FOLIND_L_R_X_IN_X: ;XF, XG,XV,ZS_OPE ON ST. 318 FSUB ST(2), ST _XF, XG,(XV-XF}, ZSLOPE 319 FSUB ;(XG-XF), (XV-XF), ZSLCeE 320 FD!V ;((XV-XF)/(XG-XF)), ZSLOFE 321 MOV AX,BP ;IFZ {-DT TOOHIGH 322 ADD AX,4 Z_3 CF? AX,CX _4 JE OET_ANSHER

38

_861871881186 MACRO ASSEMBLER RFI_3S

08130184 PAGE

LOC OBJ 01BA9BD9C9 01BD 01BD8BC6 01BFDIE8 01CIDIE8 01C3F6EI

L!NE 325 326 327 328 329 330 331 332 333 334 Z_5 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379

SOURCE FXCH ST(If ; THEN(ZV-ZL)I(ZH-ZL) ON ST.TZP

CEF_AN_-$ER: MOV AX,SI SHR AX,I SHR AX,I ML_ Ct

;AX= NO._ X BYTES ;AX= NXPTS = _].OF X BYTES /4 T(.Eo _ ;CX NO OF Z _ _ ;AX= YCF_WCEFSET _THE AVO_E INSTR. LIMITS LENGTH OF Z_RRAY ;TO255ELEMEF_S ;BX= YC RO_PTR= NXPTS * ZPTR ;BX= YCPOINTER ;STORE YCON ST TOP

01C503D8 01C703DF 01_ %D907 01CC8B_ 01CE050400 01DI3BCI 01D37510 01D5 OID58BC7 01D70504_3 01DA3BC6 01DC7444 01DE OIDE9BD94704 OIE2EB3290 01_ 01E58BC7 01E7050400 0!EA3BC6 01EC7423 01EE OIEE9BD9C9 OIFI9BD900 01F49BDSE2 O!F79BD8C9 OIFA9BDEC2 OIFD9BD94704 0201 9BD94004 02059B_SE1 02039BDECA 020B9BDECI 020EEB0690 0211 021103DE 02139B_07 0216 0216 9BDSEI 0219 9BDECA 021C 9BDECI 021F EBOI90

ADD ADD FLD MOV ADD CMP JNE

BX,AX BX,DI [_D PTR[BXI AX,BP AX,4 AX,CX Z_NOT_HIGH

Z_T_}_HIGH: MGV AX,DI ADD AX,4 CNP AX,SI JE FOUND_W X_VALID: FLD [_D PTR[BX+ 4] JMP GET_YV

;IFZ OUTOF RA_}E 1,** DO BEGIN *** ; IF X _JTOFRANGE ; THENEXIT ; {ZTOOHIGHBUTX ISIN RANGE} ; STORE XD ;_* END{IF}

Z_NOT_HIGH: )IFZ VALID MOV AX,DI 1_* Ft] BEGIN _*_ ADD AX,4 ; IF X OUTOF. RANGE CMP AX,Sl ; ,{ Z_VALID ; THENEXIT BOTH_VALID: ; ELSE{BOTH XVANDZVAREINRANGE} FXCH ST(1) ;(ZV-ZL>/(ZH-ZL) ON TOP., THEN YC FLD DWORD PTR[BX+SI] ;STORE YBON ST.TOP FSUB ST,ST(2) ;(YB-YC) ON ST.TOP F_._ ST,ST(I} ;((ZV-ZL}/(Z.H-ZL}}(YB-YC} ON ST TOP FADDP ST(2), ST ;YFZNDFR_ITOPOF, STACK FLD D_,_RD PTR[BX+ 4] ;STORE YDON STACK TOP , FLD DWORD PTR[BX+ SI+ 4] ;ST.nRE YE ON STACK TOP FSUB ST,ST(I> ;YE-YD ONST TOP FM, L;_P ST(2), ST ;((ZV-ZL)/(ZH-ZL))(YE-YD) 2NDFRONTOP FADD ;YGON TOPOF 8087 JMP GET_W ;*_* END{IF} *** Z_VALID: ADD FLD GET_W: FSUB F_EP FADD ,_IP I{X_JTOF RANGE BUTZ VALID} BX,SI DWCRD PTR[BX] ;YGTOP,TH_,I YF,THENSLOPE ;YG-YF ON ST.TOP ;((XV-XF)I(XG-XF))(YG--YF) _,_D FROMTOP ;YVON ST.TOP

ST,ST(I} ST(2), ST F_._D_W

39

80861871881i'-IAC_! 186 ASSEi"IBLER RFL_,'3S LOC OBJ LINE 380 S_,31 382 383 384 3S5 386 387 388 3S9 390 391 3_ 3_ 394 3.95 396 397 3')8 SOURCE

08!30!84 PAGE

0__ 00222 0222 8BDA 0224 D!EF 0226 DIEF 0_8 8_F 022A DIED 022C DIED 022E896F02 0231 02315D 02_ C20100

FOUND_YV: SAVE_FE!,LPOI_ERS: MOV BX,OX SHR Oh 1 SHR Oh I MOV [BX].XPTR, D! SHR BP,I mR BP,I MOV [BX].ZPTR, BP EPILC_}UE: POP RET NEARCODE CODE EJ'_S

;RESTORE BX TOSTART C_DATASTRUC.

;SAVE XPTR

;SAVE ZPTR

BP I EI,;[_

;RESTORE REGISTERS

--

401 402 A_EMBLY COI._,FLETE, I'_0 ERRORS FOUND

END

4O

8086!8718SINACRO 186 ASSEMBLER RFUNSL

08!3018_ PAGE

SERIES-Ill 80861871881K_ACRO 186 ASSEMBLER V2.0ASSEMBLY OF F_DB]LE RFUN3L OBJECT MODLE PLACED IN:FI:RFUR3L.OBJ ASSEMBLER INVOKED BY: ASM@6.86 :FI:RFU_.SRC

LOC OBJ

LINE

S_JRCE

2 3 4 5 6 7 9 I0 II 12 13 14 15 16 17 18 19 20 21 22 24 25 26 27 28 29 30 31 33 34 35 36 37 38 40 41 42 43 44 45 46 47 48 49 5O

* ROUTINE NhNE: RFUNSL * DATE: _P. 8, 19B3 * PR_RAF_ER' _ME: S NIC_ L4ACKIN * MJRPOSE: TO INTERPC_.ATE A SIMPLE * FUNCT!ON FORL_GE_OD:"L * PROC_AMS

, * * * * *

TH!SSUBR_JTINE C_ITPUTS T_ EST!_TED VALUE _ A FL_CTION YV= F(XV,ZV) BY INT_PC_ATIF_) FRO_F_C_._N SOLUTION POINTS, USING THERELATIONS XF= ((ZV-ZL)/(ZH-ZL))(XB-XC) + XC XO= ((ZV-ZL}/(ZH-ZL})(XE-XD} + XD YF = ((ZV-ZL)/(ZH-ZL)}(YB-YC} + YC YG= ((ZV-ZL}/(ZH-ZL}}(YE-YD} + YD YV = ((XV-XF)I(X_XF}!(YG-YF) + YF INPUT RE_I_MENTS: I) THEF_LORIF,_ AD[_ESSES _ILLBE PASSED TO THIS_BR_TI_: A.{_ TOPOF THES(_96 ST_K: THEADDRESS (OFF,T) OF A DATA AREAWITHTHEFOLL_41NG FORMAT DSTRUCSTRL_ XPTR DW ZPTR DW NXPTS DW NZPTS DW ZA_?AYDD XARRAYDD YARRAYDD DSTRL_E!_DS ; ; ; ; ; ; ; ; ; i ; ; ; ; ; ; B. ON THE8087 STACK: C_i T_ ZV,TH_ XV 2) IT ISREOUIRED THAT THE8087CHIP HAVE5 EMPTY REGISTERS _._EN THISINTERF'C._ATION ROUTINE IS CALLED. 3)[_]TE: NO_ ADJAC._NT ELEMENTS C_ XARRAY, YAR_AY, OR ZARRAY _AYHAVE!DENTIC_L ELEHENTS. THIS WILLFS_LT INDIVISION BY ZERO. _JTPUT EFFECTS: I)REGISTERS _STROYED: AX,BX,CX,DX,Dh SI 2} INTERPOLATED RESt_T RETURNED ON TOPOF 8087ST_){ 3) XPTR LOCATION UPDATED TO INDEX X VALUE ,_{ST PRECEDING XV. ZPTRLOCATION UPDATED TO I_EX Z VAI_L_ JL_T PRECEDING ZV. (TO_EED FUTURE SEARCHES FORX ANDZ) ? _ ? _ NZPTS D;_(?) NXPTS DL_(?} NYPTS BJP(?) ;XARRAY INDEX ;ZARRAY INDEX ;NO. OF X _EAKPOINTS ON EACHZ LINE _NO. OFELEMENTS IN Z ARRAY ;Z ARF_Y (255 ELERENTS MAXI_L_.I) ;XARRAY ;Y ARRAY

0..r'00 0002 00.04 0006

; ; ;

41

8_6!87/8B/186 MACRO ASCEMBLER RFU,k_3L

08/30/84 PAGE

LOC OBJ

L!NE 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
67

SOUSE EXAMPLE FC_TRAN CALL SUBR(_JTINE F3CALL DI_!E._._SI XARRAY(15), O_ ZARRAY(31, YARRAY(15) INTEGER XIN[rEX, ZINDEX, NXPTS, NZPTS COMM_ISTUFFIXINDEX,ZINDEX,NXPTS, NZPTS, ZARRAY, XARRAY,YARRAY DATAXINDEX, ZINDEX, NXPTS,NZPTS O, / 5,8 O, / DATAZARRAY/O.O, 10.0,20.0/ DATA XARRAYIO.O,2.0,4.0,6.0,8.0, I.,3.,5., 7.9,9., 1.5, I. 75,1.8,5., I0.I DATAYARRAY/ 0,2. O. ,4.,6. ,8., I0.1 ,2., 14., 16., 18.,20. ,22.,24.,26., I 28. X=9. I Z=II.3 Y=RFUN3J. ( X, Z, XI NDE X) PRINT _, Y END
', _'X-_.I{--I-fr'I-.l{-_._.I,_-N _(-_,]1-_ _,X-,X-'I'@_ _ , 'iFI-_ 1-_.I$._-}'(-_ __________ _ ____ _ _____ __ __

68 69 70 71 72 73 74 75

NAME RFI_GL CGR_.._ GR_!P CODE _R_JP GR..Q.,P DATA ASSL_%_:CGROUP, DS:DGRC_JP, ES:DGR@JP PUBLICRFUN__

--0_0 0002 _..')0._ 0006 OA O00E 0012 --

78 79 80 81 _ 83 84 85 86 87 88 6? 90 91

STACK STRtK_TL_E

PAR,A, MS STF,t_] OLD_ESDW OLD_BP[H,_ OLD_DEDH RETL_NDD DADDR DD ZV DD XV DD PARAMSENDS "> "> _ '> "> "_ ') ISA_DESREGISTER ;SAVED BP REGISTER ;SAVED DSREGISTER ;RETL',,R.N ADDRESS (OFFSET ONTOP,THEN SEGMENT) ;ADDRESS OFDATASTRUCTURE (C_FSET, THENSEGFIENT) ;ADDRESS GF ZV (OFFSET THEN , SEGNENT) ;ADDRES_ OF XV (OFFSET, THENSEGr-IENT)

--0000???? --

94 95 96 97 98 99 I00

DATA

SEGMENT PUBLIC"DATA' ?

STWSAV["_ E [VITA EI'!_3

--

103 104 !05

CODE

SEGMEk'T M.IBLIC 'CODE'

42

80861871881186 MACRO ASSEMBLER RFL.KI3L

08130184 PAGE

L_

OBJ

LINE

SOl_t_E

0000

0000 _ IE 0001 55 000206 00038BEC O..(Y)5 BS---O_D_8ECO O{_AC55E12 O_}D9BD907 0010C55EOE 00139BD907 0016C55EOA 0019BBD3 O01B8B2F C_ID 8BqF04 _J20 8B7F02 0023 DIE7 0025 DIE7 0027 SB7706 2A DIE6 _)2C DIE6

O02E (YO2E 83C308 00319BD811 00.34 9B26DD3EOO{_J R 003A9B 003B26A10000 R (_SF25_41 (}0..42 3D0001 00457434

0047 _)47 8S_704 O04A 3BFE 004C 741B 004E 9BD811 00519B26DDSEOOC_ R .0057 9B 005826AI0_0 R (_5C 250041 005F3D0001 _J627405 006483C704 0067EBEI 00698BC6 O06B O0

106 FARCO_PROC FAR 107 108 1.49.. Ii0 RFURSL: Ill PUSH DS !12 PUS_ BP 113 PUSH ES 114 _OV BP,SP 115 NOV AX,DATA !16 _lV ES,hX 117 LDS BX,[BP].XV 118 FLD _!CRD PTR[BX] 119 LDS BX,[BP].ZV 120 FLD D_}RD PTR[BX] 121 LDS BX,[BP].DADDR 122 MOV DX,BX 123 MOV BP,[BX].XPTR 124 F_ CX,[BX].NXPTS 125 MOV Dh [BX].ZPTR I26 S_ Dh I 127 SHL Dh I 128 _IV Sh [BX].NZPTS 129 SHL SI,I 130 SHL Sh i 131 I_ GET_Z_I_DEX: 133 ADD BX,B 134+2 FCOH DWORD PTR[BX+ DI] 135+1 FSTSW ES:ST_SAt_ !36+I FWAIT 187+I MOV AX,ES:ST_SAVE 138+I AND AX,4100H 139+2 CMP AX,OIOOH HO +2 JE LEFT_OF_Z_SThRT FERT 141 +2 142 143 RIGHT_OF_Z_START: 144 ADD DI,4 !45 RZSI: CMP DI,SI 146 JE RZS2 147 14B+2 FCOM DWZ_D PTR[BX+ DI] !49+I FSTSW ES:STWSAV_ 150+I F_IAIT 151+I F_V AX,ES:STGSAVE 152+i AND AX,41@3H !53+2 C_P AX,0100H 154+2 JE RZS2 I_ +2 156 ADD DI,4 157 JHP RZSI 15B RZS2: MOV AX,SI 159 SUB AX,4

;SAVE REGISTERS

IGET XVADZ_:ESS ANDSEGMenT ;PUT XV ON TOPOF 8087 STACK ;GET ZVADDRESS ANDSEGMENT ;PUT ZV ON TOPOF 8087 STACK ;GET START ADDRESS OFDATASTRUCTURE _SAVE BX ;BP= XPTR _CX= NXPTS ;DI: ZPTR ;DI= BYTEINDEX = ELEMENT INDEX _4 _Sl= NZPTS _SI= _].C_ BYTES = NZPTS _4

;BX= START OF Z ARRAY i C(}_ARE ARRAY ELEMENT WITHZV

MASK-IN CCMPARISON BITS ; EXITIFZV < ARRAY ELE

;IFZ } DATA(C_IGINAL IN[_X) 1._*THEN BEGIN _* ; INDEX = INDEX +4 ; WHILE (INDEX <=F_._ BYTES) ; ; _ DO BEGIN *_ ; COI_'ARE ARRAY ELEMENT _ITHZV

; ; ; ; ; ;

_ASK-Ifl COMPARISON BITS EXITIFZV< ARRAY ELENENT INDEX = INE_X +4 *_+END{_HILE] _

43

8086!871881MACRO 186 ASSEM_.ER RFL_3L

08130184 PAGE

LOC OBJ _}6E83EF04 0071 38F8 (]_73 7542 0075 9BDDD8 00...78 EB4DgO

LI_ 160 161 162 163 164 165 166 167 168 169 170 171 172 +2 173+I 174+I 175+I 176 +I 177 +2 178+2 179+2 180+2 181 182 I_ 184 185 186 i87 188 18_ 190 191 192 193 194 195 196 197 198 199 2 201 202 203 204 205 206 207 208 209 210 211 212 213 214

SC_.JRCE SUB CMP JNE FSTP ,_-IP DI,4 DI,AX FO_D_LOW_Z_INDEX ST(O} GET_X_INDEX ; : IFIN_X <> NO.OF BYTES ; THEN F_._!D_LOW_INDEX ; ELSE C_T__F_RANGE ; ;_* END{IF} **m ;IFZ < DATA(ORIGINS. I_EX) ;_*_ THENBEGIN _** _ IN[_X = INDEX -4 ; WHILE (INDEX > O} ; ; H, DOBEGIN _ ; COMPARE AP_AY ELEMENT _ITH, ZV

007B 7B 83EF04 007E83FFO0 81 7C20 83 9BDSII 00869B26DD3EO000 R 008C9B O08D26AI0000 R (Z!91 250041 0094_D000.O _97 740A 00993D0040 009C 7405 009E8_F04 00AIEBDB 00A383FFO0 CK_A6 7DOF OOh8 83C704 LX_AB 9BDDD8 O_E 9B09EE OOBI 98D9C9 0084 EB!IgO

LEFT_OF_Z_START: SUB DI,4 LZSI: CMP BI,0 ,_ LZS2 FCOM FSTSW FWAIT MOV AND CMP JE CMP JE SUB ,_P LZS2: CMP JOE ADD FSTP FLDZ FXCH JNP [6_ORD PTR[BX+ DI] ES:STWSAYE

AX,ES:ST_SAVE AX,41C_ _ MASK-IN COMPARIF_I BITS AX,000014 ; EXITIF ZV> ARRAY ELEMENT LZS2 AX,4(_OH LZS2 ; EXITIFZV = ARRAY ELEMENT Dl,4 ; INDEX = I_EX - 4 LZSI ; _ END{[_ILE} _* DI,0 ; IF INDEX <> 0 FOUND_L_-LZ_IN[_X ; THENFC_JND_LC_4_INZ_X Dh 4 ; ELSEOL__OF_RANC_ ST(O) ; ; REPL_ETOPWITH01 ST(1) ; GET_X_INDEX ; ;**_ END{IF} _**

00B7 00879BD901 00BA9BDCE9 OOBD98D86904 00CI9BDEF9 00C498D_9 0_7 00C703[_ 00C988C7 _S_BF6EI OOCD03D8 K_F 87FD OODID!E7 00D3DIE7 OOD5 87FI D7 DIE6 OOD9DIE6 OODB9BD901 OODE 88C5 OOEO 050400 OOE3 3BCI _E57410

FC_IND_LOW_Z_INDEX: FLD DWORD PTR[BX+DI] FSUB ST(1), ST FSUBR D_D PTR[BX+DI+4] FD!V FXCH ST(1) C_T_X_INDEX: ADD BX,SI NOV AX,DI MLP. CL ADD BX,AX XCHG DI,BP SHL BI,I SHL Dh I X_G SI,CX SHL Sh I SHE El,I FLD DWORD PTR[BX+ DI] _V AX,BP ADD AX,4 CMP AX,CX JE GXI

;STORE ZL ON STACK TOP ;(ZV-ZL) 2NDFROMTOP _(ZH-ZL} ON STACK TOP ;(ZV-ZL)/(ZH-ZL) LEFT ON STACK ;PUTXV@i TOPOF 8087STACK

;BX= START OF XARRAY ;AX= NO.OF Z BYTES ;AX= XC,ROH _FSET=N, OF ZBYTES*NXPTS ;BX= XCRONPTR ;DI= XPTR: BP: LOW_Z_INDEX ;DI= BYTEIN[{X = XPTR_ 4 ;El= NXPTS : CX = _tO, OF Z BYTES ; ;El= NO,OF X BYTES = NXPTS *4 ;ST_nRE XCON TOPOF STACK

;EXIT IFZ TOOHIGH

44

80861871881NACRO 186 ASSEMBLER RFU_BL

08130184 PAG, E

LOC OBJ OOE7 03El _E9 9BD9C_ OOEC2BDF O_E 9BDBEI OOFI9BDBCB OOF4 9BDECI OOF79BDBDI OOFA9B26DD3EO000 R 01009B 010126AI0{_00 R 0105250041 01083DFJ{_ 010B 74_

LINE 215 216 217 218 219 220 _I +2 222+I 223+I _4 +I 225+I 226+2 227+2 _8 +2 229 :_0 231 2._.2 233 _4 235 236 237 238 239 240 241 242 243 244 245 246+2 247+I 248+I 249+I 250+I 251+2 252+2 _3 +2 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269

S'OURCE ADD FLD SUB FSUB FRUL FADD GXi: FCO_I FSTSW R_AIT MOV AND CMP JE BX,DI B-lORD PTR[BX+ SI] BX,DI ST,ST(1) ST,ST(3) ST(1) ES:STWSAVE AX,ES:STWSA_ AX,4!0_ AL O000H LEFT_OF_X_START

;STORE XBC_ TOPC_STA_K ;XB-XC C_ ST.TOP ;((ZV-ZL)/(ZH-ZL}}(XB-XC} ONST.TOP ;XFON ST.T{e ; COMP_EARRAY EL_.ENT WITHXV

; ;

HASK-IN C(]_PARISON BITS EXITIFXV> ARRAY ELEMENT

010D 010D 83C704 0110 3_E 0112 743D 0114 9BDgOI 0117 8BC5 0119 0.504(_ OIIC 3BCI OIIE 7410 0120 03DF 01_ 9BDg(_ 0125 2B[_ 0127 9BDSEI OI2A9BD8CC OI2D9BDECI 01309BDBD2 01339B26DD_E_O R 01399B 013A26AI(_ R OI3E250041 01413DO0 0144740B 01469BD_C9 0149 9BDDD8 014CB_C704 OI4F EBBF 0151 9BD9C9 0154 8BC6 0156 2D0400 0159 83EF04 01% 3BF8 OISE7567 0160 9BDDD8 01639BDDD8 0166 EB7490

RIC_T_OF_X_START: ADD DI,4 RXSI: C_ DI,SI JE RXS2 FLD MOV ADD CMP ,E ADD FLD SUB FSUB FI_ FADD RXS3: FCON FSTSW F_AIT _CN AND CNP JE FXCH FSTP ADD ,J_P RXS2: FXCH MOV _JB SUB CRP JNE FSTP FSTP JMP DWORD PTR[BX+ 01] AX,_ AX,4 AX,CX RXS3 BX,DI D!_3RD PTR[BX+ SI] BX,DI ST,ST(I} ST,ST(4) ST(2} ES:STWSAVE AX,ES:ST_SAVE AX,4100H AX,0000H RXS2 ST(1) ST(O} DI,4 RXSI ST(I) AX,Sl AX,4 DI,4 Dh AX F_ND_LON_X_INDEX ST(O) ST(O} GET__;WER

;IFX > _TA(_IGIN_ INDEX) ;*** T_N BEGIN *** ; INDEX = IN_X+ 4 ; WHILE (INDEX {= F_.OF BYTES} ; ; ; ; ; ; ; ; ; ; ; _ DO _GIN **_ STORE XD ON TOP. {: STACK

EXITIFZ T@ HIGH STOF XE O_ TOPC_ STACK XE-XD _ ST.TOP ((ZV-ZL)I(ZH-ZL))(XD-XE) ON ST.TOP XG ON ST.TOP C@!PARE ARRAY ELEMENT {_ITH XV

; ;

_!ASK-IN COMPARISON BITS EXITIF XV) ARRAY ELEmEnT

; ; ; ; ;

XF= XG DISCARD OLDXF INDEX = INDEX +4 ***END{WHILE} _

0169

LEFT_OF_X_START:

; ; ; !FINDEX (> t@3. OFBYTES ; THENFC_ND_LON_INDEX _ ELSE _JT_C__P_RGE ; DISC_;RD XG_ANDXV ; ;_ END{IF} *_ ;IFX { DATA(ORIGINAL INDEX) _**.* THENBEGIN_*_

45

8086/87/88/186 _CP/3ASSE_BLEP_t_43L

08/30/84 P_E

LOC OBJ 0169 83EF04 016C 83FF00 016F 7C42 01719BDgOI 01748_5 01760504C_ 0179 3BCI 017B7410 017D 03DF 017F 9BDgO0 01822BDF 01849BDBEI 01879BDSCC 018A9BDECI 018D 9BDSD2 0190 %26DD_EOC_R J 01969B 019726A1000{_,_R 019B250041 019E3D0001 01AI 7410 01A33D_40 01A6 740B 01A8 9BD9C9 OIAB 9BDDD8 01AE 83EF04 01BIEBB9 01B383FF{WJ OIB6 7DOF OIB8 83C704 OIBB9BDDD8 01BE 9BDDD8 01CI9BDOEE 01C4 EB1690

LINE 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285+2 286+I 287+I 289+I 289+I 290+2 291+2 292+2 2.93 +2 294 29.5 296 297 298 299 300 301 302 303 304 305 3_6 307 308 309 310 311 312 313 314 315 316 317 318 319 _0 _I 322 .R23 _4

SOURCE SUB LXSI: CMP JL FLD MOV ADD CMP JE ADD FLD SUB FSUB FMUL FADD LXS3: FCOM FSTSW _AIT NOV AND CHP JE C{.IP dE FX_ FSTP SUB ,'_P LXS2: CMP JOE ADD FSTP FSTP FLDZ JMP DI,4 Dl,0 LXS2 D{._RD PTR[BX+ DI] AX,BP AX,4 AX,CX LXS3 BX,DI DWORD PTR[BX+ SI] BX,DI ST,ST(1) ST,ST(4} ST(2} ES:S_4SAVE ; ; ; _ ; " ; ; ; ; ; ; ; _ ; INDEX = INDEX -4 WHILE (INDEX > 0} .._._ DO _OIN **._ STORE XD ONTOPOF, STACK

EXITIF Z TOOHIGH STORE XEON TCeOF STACK XB-XC ON ST.TOP ((ZV-ZL)!(ZH-ZL))(XB-XC) ON ST.TOP XO_! ST.TOP. COMPARE ARRAY ELEMENT WI_ XV

AX,ES:ST_A_ AX,4100H ; MASK-IN COMPARISON BITS AX,01..rK_H LXS2 ; EXITIF XV,. ARRAY " ELEMENT AX,40_d LX_ ; EXITIFXV= ARRAY ELEMENT ST(1) ; XF=XG ST(O) ; DISCARD OLDXF DI,4 ; INDEX = INDEX -4 LXSI ; *{_END{WHILE} _{ DI,0 ; IF INZEX 0" 0 FOt_,JD_LOW_X_INDEX ; THENFOUND_LOW_INDEX Dh 4 ; ELSEOUT_OF_RANGE ST(O) ; ST(O) ; DISCARD XC ; REPLACE TOPWITH0 GET_ANSI_R ; I_m* END{IF} **_ ;XF, XG,XV,ZSLOPE ON ST. _XF,Xe,(XV-XF), ZSLOPE ;(XG-XF), (XV-XF), ZSLZPE ;((XV-XF) /(XO-XF} },ZSLOPE _IFZ NOTTOOHIGH

01C7 01C7 9BDCEA 01CA9BDEE9 01CD 9BDEF9 01DO8B05 OID2050400 01D5 3BCI 01D77403 01D99BD9C9 01_ 01DC8BC6 01DE DIE8 01EO DES 01E2F6EI

FOUNI]_LO{LX_I{fDEX: FSUB ST(2), ST F.q_ FDIV M_ AX,BP ADD AX,4 CMP AX,CX JE GET_ANSWER FXCH ST(1) GET_ANSWER: MOV AX,SI _R AX,I SHR AX,I Mtt CL

THEN(ZV-ZL)/(ZH-ZL) ON ST.TOP

IAX= NO.C_ X BYTES ;AX= NXPTS = NO.OF, X BYTES /4 ;CX= NOOF Z BYTES ;AX= YC RO{.i OFFSET ;THE AVOVE INSTR. LIMITS LENGTH OF ZARRAY ;TO2_ ELEMENTS

46

8086187188/!86 _CROASSEMBLER RFL_3L

08!30!84 PAGE 7

LOC OBJ 01E403D8 01E6 03OF OIE8 9BD907 OIEB8BC5 OIED050400 01FO3BCI 01F275!0 01F4 OIF4 8BC7 OIF60504_ 01F93BC6 OIFB7444 01FD OIFD 9BD94704 0201EB3290 0204 02048BC7 02060_400 02093BC6 020B7423 020D 020D9BD9C9 021.0 9BD900 02139BDSE2 02169BD.'..4C9 02199BDEC2 021C%D94704 02200BD94004 0224 9BDSEI 02279BDECA 022A 9BDECI 022DEB0690 0230 0230 03DE 0232 9BD907 0235 02359BDOEI 0238 9BDECA 023B9BDECI 023EEB0190

LINE

SOURCE

0241 0241 0241 8BDA 0243DIEF 0245DIEF 0247893F 0249DI_ 024BDIED 024D896F02

325 ADD BX,AX ;BX= YCR'r_._ PTR = NXPTS 4 ZPTR 326. ADD BX._ DI _BX= YCPOINTER 327 FLD gNORD PTR[BX] ;STORE YC ON STTOP 328 f:_V AX,BP 329 ADD AX, 4 330 CFP AX,CX 331 JNE ZJ4OT..HIGH #2 333 Z_TOO_HIGH: ;IFZ OUTOF RANGE 33.4 MOV AX,D; ;4,, DO BEGIN H, 335 ADD AX,4 ; IF X OUTOF RA,_4GE 336 CMP AX_S; 337 ..E FOU_'ELYV ; T_N EXIT 338 X_VALID: ; {ZTDOHIC44 BUTX IS INRANGE} 339 FLD DWORD PTR[BX+ 4] ; STORE XD 340 JMP GET_YV ;_*_ END {!F} *'_ 341 342 Z_NOT_HIGH: ;IFZ VALID 343 M.OV AX,DI _4,4 DO BEGIN 4_ 344 ADD AX,4 ; IFX OUTOFRANGE 345 CMP AX,SI ; 346 JE Z_VALID ; THEN EXIT 347 BOTH_VALID: ; ELSE{BOTH XVANDZVAREINRANGE} 348 FXCH ST(1) ;(ZV-ZL)/(ZH-ZL) ON TC_,THEN YC 349 FLD DWORD PTR[BX+ El] ;STORE YBON ST.TOP 350 F_.IB ST, ST(2) ;(YB-YC)ONST. TOP 351 FMUL ST,ST(1) ;((ZV-ZL}/(ZH-ZL}}(YB-YC} ONST TOP 352 FADDP ST(2), ST ;YF 2NDFRO,_-I T& OF STACK 353 FLD D_fRD PTR[BX. 4] ;STORE YDOF, _STACK TOP 354 FLD DI,!ORD PTR[BX+ S; + 4] ;STO_YE O:,I STACK TOP 355 FSUB ST,ST(1) ;YE-YD ONST TOP 356 FMULP ST(2), ST ;((ZV-ZL)/(ZH--ZL))(YE-YD) 2NDFRC_.I TOP 357 FADD ;YGON TOPOF 8037 35.8 JMP GET_YV ;4_. END{IF} 4,4 359 360 Z_VALID: ;{XOUTOF RANGE BUTZ VALID} 361 ADD BX,S; 362 FLD D{,_DRD PTR[BX] 363 364 GET_YV: ;YGTOP, THENYF,THEN SLOPE 365 FSUB ST,ST(I} ;YC-YF ON ST.TC_ 366 FMULP ST(2), ST I((XV-XF)/(XG-XF))(YG-YF) 2NDFRO[-! TOP 367 FADD ;YV@i ST.TOP 368 Jt-IP FOUND_YV 369 370 371 FOUNB_YV: 372 SAVE__q,.'_POINTERS: 373 MOV BX,DX ;RESTORE BX TOSTART OFDATASTRUC. 374 SHR DI,i 375 SHR, DI,I 376 NOV [BX].XPTR, D; ;SAVE XPTR 377 S_R BP,I 378 S_R BP,i 379 MOV [BXI,ZPTR, _ ;SA_ ZPTR

47

_ _ _ RFUF_L 80S6/87188/MACRO 186 A_.-EM.LE, ,

n,qIonIR4 PAGE , .........

L_] OBJ

LIF_ 380 381 32 383 384 385 386 387 388 389 390
391

SC_JR..CE

0250 0250 07 02515D 0252iF 0253CA_O0

EPILOGLE: POP POP POP RET FAR CODE , ENDP CODE ENDS

ES BP DS 12

;RESTORE REGISTERS

;_______'X-@=_

392 393 394

;**_.._***_-.._--._*_'_*_*'_._*__*_*_*_*_*_*_ ERD

ASSBIBLY COMPLETE, RO ERRORS FOL_ID

48

YV

YL

xL

xv

xH

FigureI. - Univariate function.

tZ

Figure2. - Bivariatefunction.

IZ

-. X

Figure 3. - Mapfunction.

Yn

YH-YC Yv--

--ZL

yB
YA

I
I
xL Xv XH Figure 4. - Bivariate function interpolationdiagram.

E YE z_"-... G

Yc

",\

I
I I I ,

I
I
xF xB

I I I t

I
im X

xC

xv

xE

xo

xD

Figure5. - Mapfunction interpolationdiagram.

16-Bit segment register I1 0 1 1 1 O0 0 1 1 0 1 1 10 01 Recjular 16-bit recjister 1101101100011110 I

011100 + 1011100011 110110110001111 1100011010001101111 ,

0J 0

Figure6. - How 16-bit registers are combined toform 20-bitaddress.

FIELD XPTR: ZPTR: NXPTS: NZPTS: Data Arrays:

DEFINITION X pointer Z pointer Numberof x datapointsperz curve Numberof z curves These fields holdactualexperimental datapoints. Thepointsmarkthe startandendof a curve segment.

Figure7. - Fieldidentificationsin breakpoint informationblock.

DIMENSION XARRAY (7), YARRAY (1) INTEGER XPTR,YPTR COMMON ISTUFFIXPTR, ZPTR,NXPTS, NZPTS,XARRAY, YARRAY DATA XPTR,ZPTR,NXPTS, NZPTSIO, O,7,71 DATA XARRAY I0. 0, I. 0, 2.0, 3.0, 4.0, 5.0, 6.01 DATA YARRAY I0. 0, 1.0, 4.0, 9.O, 16.0, 25.O,36.01 XIN- 1.5 Y- RFUNIL (XIN,XPTR) PRINT % Y END Figure8. - Fortranprogram for univariatefunction call.

tz

? (Xin, Zhigh)
I I I
I I I

1 I
Your [Xin, Zlimit)

I I

Your

--_ I (Xlimi t, Zin)

O(Xhigh' Zin)

Figure9. - Twoout-of-rangeexamples.

FIELD NAME XPTR ZPTR NXPTS NZPTS XARRAY , YARRAY

FIELD VALUE X index Notused Numberof x datapoints (4 in this example) Notused Xl, X2, X3, X4 YI, Y2, Y3, Y4

FigureI0. - Breakpoint informationblockfor RFUNI programs.

FIELD NAME XPI'R ZPTR NXPTS NZPTS ZARRAY XARRAY YARRAY

FIELD VALUE X index Z index Numberof x datapoints ( 4 in this example) Numberof z datapoints (5 in this example) Zl, Z2, Z3, Z4, Z5 X1, X2, X3, X4 Yll, Y12, Y13,Y14 Y21,Y22,Y23,Y24 Y31,Y32,Y33,Y34 Y41,Y42,Y43,Y44 Y51, '(52, Y53, Y54

Figure11. - Breakpoint informationblockfor RFUN2 programs.

FIELD NAME XPTR ZPTR NXPTS NZPTS ZARRAY XARRAY

FIELD VALUE X index Z index Numberof x datapoints (4 in this example) Numberof z datapoints (5 in this example) Z1, Z2, Z3, Z4, Z5 Xll, X12,X13,X14 X21,X22,X23,X24 X31,X32,X33,X34 X41,X42, X43,X44 )(51,X52,X53,X54 Yll, Y12,Y13, Y14 Y21,Y22,Y23,Y24 Y31,Y32,Y33,Y34 Y41,Y42,Y43,Y44 Y51, Y52,Y53, Y54

YARRAY

Figure12. - Breakpoint informationblockfor RFUN3 programs.

1. Report No.

2. Government Accession No.

3. Reciplent's Catalog No.

NASATM-83783
4. Title and Subtitle 5. Report Date

F1 oati ng- Point Function Generati on Routi nes for 16-Bit Microcomputers
7. Author(s)

October ]984 6.Performing Organization Code 5O5-43,4


8. Performing Organization Report No.
i

Michael A. Mackin and James F. Soeder


9. Performing Organization Name and Address

10. Work Unit No.

E-2279

11. Contract or Grant No.

National Aeronautics and Space Administration Lewis Research Center C1 eve1and, 0hi o 44135
12. Sponsoring Agency Name and Address

13. Type of Report

and'Perio Cov d ered

National Aeronautics and Space Admini strati on Washington, D.C. 20546


15. Supplementary Notes

Technical Memorandum 14S . ponsoring Agency Code

16. Abstract

Several' computer subroutines have been developed that Interpolate three types of nonanalytic functions: unlvarlate, blvarlate, and map. The routlnes use data In floating-point form. However, because they are wrltten for use on a 16-bit Intel 8086 system wlth an 8087 mathematical coprocessor, they execute as fast as routines ustng data In scaled Integer form. Although all of the routines are wrltten In assembly language, they have been Implemented In a modular fashlon so as to facilitate thelr use wlth high-level languages.

17. Key Words (Suggested by Author(s))

18. Distribution Statement

Function generation Look-up tables Floating-point routines Microprocesser control


19. Security Classif. (of this report)

Unclassified - unlimited STARCategory 61

20. Security Classif. (of this page)

21. No. of pages

22. Price*

Unclassified

Unclassified
*For sale by the National Technical Information Service, Springfield, Virginia 22161

)
National Aeronautics and
Space Administration Washington, D.C.

SPECIAL FOURTH CLASSMAIL


E"OK O

3 1176 00512 5886


II II I

_'_--"_

20546
OffiCial Business Penalty for Private Use, $300 Postage and Fees Paid National Aeronautics and Space Administration NASA-451

N/A
i i i

POSTMASTER:

If Unddiverahli: (Section I S_ Postal Manual) I)_DNot _furl'm

También podría gustarte