{************************************************} { } { FunctionGraph Demo Routine } { FUNGR.INC } { } {************************************************} Function Zfun (X,Y : Real) : Real; Begin Zfun:=Exp (- Sqr (X)-Sqr (Y)) ; End; Procedure FnGraph (Xmin,Xmax,Ymin,Ymax,Zmin, Zmax:Real;Adr:Integer); Const RetCode = $C9; Var OldL,NewL : PolyPoint; J,K,MaxX,LevZ : Integer; StepH,StepV,DeltH : Integer; X,Y,StepX,StepY,MultZ,Fun : Real; Return : Byte Absolute $F000; Procedure PushReal (X : Real); External $F000; Function CallFunc (Adr : Integer) : Real; Begin Inline ( $2A / Adr / { ld hl,(adr) } $E9 { jp (hl) }); End; Procedure HorizLines; Begin For K:=0 To 200 Do OldL.Co[K].Y:=0; Y:=Ymin; For J:=0 To 40 Do Begin X:=Xmin; For K:=0 To 200 Do Begin Return:=RetCode; PushReal (X); PushReal (Y); Fun:=CallFunc (Adr); NewL.Co[k].X:=K*StepH+J*DeltH; NewL.Co[k].Y:=Round (MultZ*Fun)+J *StepV+LevZ; X:=X+StepX; End; NewL.N:=K; For K:=1 To 200 Do If OldL.Co[K].Y > NewL.Co[K-1].Y Then NewL.Co[K-1].Y:=OldL.Co[K].Y; OldL:=NewL; If J Mod 2 = 0 Then Line (NewL); Y:=Y+StepY; End; End; Procedure VertLines; Begin For K:=0 To 200 Do OldL.Co[K].Y:=0; X:=Xmax; For J:=0 To 200 Do Begin Y:=Ymin; For K:=0 To 40 Do Begin Return:=RetCode; PushReal (X); PushReal (Y); Fun:=CallFunc (Adr); NewL.Co[k].X:=MaxX-J*DeltH+K*StepH; NewL.Co[k].Y:=Round (MultZ*Fun)+K*StepV +LevZ; Y:=Y+StepY; End; NewL.N:=K; For K:=0 To 39 Do If OldL.Co[K].Y > NewL.Co[K+1].Y Then NewL.Co[K+1].Y:=OldL.Co[K].Y; OldL:=NewL; If J Mod 5 = 0 Then Line (NewL); X:=X-StepX; End; End; Begin StepX:=(Xmax-Xmin) / 200; StepY:=(Ymax-Ymin) / 40; Case Device Of Monitor : Begin MultZ:=136 / (Zmax-Zmin); MaxX:=600; DeltH:=3; StepH:=3; StepV:=3; End; Plotter,Printer : Begin MultZ:=400 / (Zmax-Zmin); MaxX:=800; DeltH:=4; StepH:=4; StepV:=8; End; End; LevZ:=- Round (Zmin*MultZ); HorizLines; VertLines; End;