[comp.sys.amiga] ps interpreter, repost of part 1, 2nd half

lee@uhccux.UUCP (Greg Lee) (10/10/87)

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 2 (of 2)."
# Contents:  rmath.a
# Wrapped by lee@uhccux on Sat Oct 10 05:09:51 1987
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f rmath.a -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"rmath.a\"
else
echo shar: Extracting \"rmath.a\" \(25500 characters\)
sed "s/^X//" >rmath.a <<'END_OF_rmath.a'
X
X* link with lmath.o
X   xref  lmulu
X   xref  ldivu
X   xref  ldivs
X   xref  lmoddivu
X
X   xref  ipop
X   xref  popnum
X   xref  r.ipush
X   xref  mathffpbase
X   xref  mathtransbase
X   xref  _fontalloc
X
X   xref  msg         for 'print' macro
X   xref  reinterp
X   xref  type_mismatch
X
X   xref  xmoveto,xlineto,xclosepath
X   xref  ymoveto,ylineto,_closepath
X   xref  ggsave,ggrestore
X
X   xref  simplex
X   xref  strokepathflag
X   xref  currfont
X
X   section  one
X
X   include  "ps.h"
X
X
Xmath  macro
X      move.l   A6,-(SP)
X      move.l   mathffpbase,A6
X      jsr      _LVO\1(A6)
X      move.l   (SP)+,A6
X      endm
X
Xieee  macro
X      move.l   A6,-(SP)
X      move.l   mathtransbase,A6
X      jsr      _LVO\1(A6)
X      move.l   (SP)+,A6
X      endm
X
X
X
X   lref     SPFix,1
X   lref     SPFlt,2
X   lref     SPCmp,3
X   lref     SPTst,4
X   lref     SPAbs,5
X   lref     SPNeg,6
X   lref     SPAdd,7
X   lref     SPSub,8
X   lref     SPMul,9
X   lref     SPDiv,10
X
X   lref     fieee,14
X   lref     tieee,13
X   lref     sqrt,12
X   lref     ln,10
X   lref     exp,9
X   lref     pow,11
X   lref     tanh,8
X   lref     cosh,7
X   lref     sinh,6
X   lref     sincos,5
X   lref     tan,4
X   lref     cos,3
X   lref     sin,2
X   lref     atan,1
X
X   ifne     HiRes
XMaxY        equ   399
XVFactor     equ   $C8000040
X   endc
X   ifeq     HiRes
XMaxY        equ   199
XVFactor     equ   $C800003F
X   endc
X
X
XGsaveSize   equ   11
X
X
Xpopri
X   bsr      ipop
X   move.l   D0,D1
X   cmp.w    #Real,D2
X   bne      1$
X   bsr      ipop
X   cmp.w    #Real,D2
X   beq      7$
X   cmp.w    #Integer,D2
X   bne      type_mismatch
X   move.l   D1,D3
X   math     SPFlt
X   move.l   D3,D1
X   move.w   #Real,D2
X   bra      7$
X
X1$ cmp.w    #Integer,D2
X   bne      type_mismatch
X   bsr      ipop
X   cmp.w    #Integer,D2
X   beq      8$
X   cmp.w    #Real,D2
X   bne      type_mismatch
X   move.l   D0,D3
X   move.l   D1,D0
X   math     SPFlt
X   move.l   D0,D1
X   move.l   D3,D0
X
X7$ moveq    #-1,D3      ret neq with 2 reals
X8$ rts                  ret eq with 2 integers
X
Xpopr
X   bsr      ipop
X   cmp.w    #Real,D2
X   beq      1$
X   cmp.w    #Integer,D2
X   bne      type_mismatch
X   move.l   D1,-(SP)
X   math     SPFlt
X   move.l   (SP)+,D1
X   move.w   #Real,D2
X1$ rts
X
X  DEF    eq
X   bsr      compare
X   beq      is_true
X   rts
X
X  DEF    ne
X   bsr      compare
X   bne      is_true
X   rts
X
X  DEF    ge
X   bsr      compare
X   bge      is_true
X   rts
X
X  DEF    gt
X   bsr      compare
X   bgt      is_true
X   rts
X
X  DEF    le
X   bsr      compare
X   ble      is_true
X   rts
X
X  DEF    lt
X   bsr      compare
X   blt      is_true
X   rts
X
X
Xcompare
X   move.l   (SP)+,A0
X   pea      is_false
X   move.l   A0,-(SP)
X   bsr      popri
X   beq      1$
X   math     SPCmp
X   rts
X1$ cmp.l    D1,D0
X   rts
X
Xis_false
X   moveq    #0,D0
X  RETURN    Boolean
X
Xis_true
X   addq.l   #4,SP
X   moveq    #-1,D0
X  RETURN    Boolean
X
X
X
X  DEF    add
X   bsr      popri
X   bne      1$
X   add.l    D1,D0
X   bra      r.ipush
X1$ math     SPAdd
X   bra      r.ipush
X
X  DEF    sub
X   bsr      popri
X   bne      1$
X   sub.l    D1,D0
X   bra      r.ipush
X1$ math     SPSub
X   bra      r.ipush
X
X  DEF    mul
X   bsr      popri
X   bne      1$
X   jsr      lmulu
X   bra      r.ipush
X1$ math     SPMul
X   bra      r.ipush
X
X  DEF    div
X   bsr      popr
X   move.l   D0,D1
X   bsr      popr
X   tst.b    D1
X   beq      diverr
X   math     SPDiv
X   bra      r.ipush
X
X  DEF    idiv
X   bsr      popnum
X   move.l   D0,D1
X   bsr      popnum
X   tst.l    D1
X   beq      diverr
X   jsr      ldivs
X   bra      r.ipush
X
Xdiverr
X   ERR      divzero
X
X  DEF    mod
X   bsr      popnum
X   move.l   D0,D1
X   bsr      popnum
X   move.l   D0,D3
X   tst.l    D0
X   bpl      1$
X   neg.l    D0
X1$ tst.l    D1
X   bpl      2$
X   neg.l    D1
X2$ move.l   D1,D2
X   move.l   D0,D1
X   jsr      lmoddivu
X   tst.l    D3
X   bpl      3$
X   neg.l    D0
X3$ bra      retinteger
X
X  DEF    abs
X   bsr      ipop
X   cmp.w    #Integer,D2
X   bne      2$
X   tst.l    D0
X   bpl      1$
X   neg.l    D0
X1$ bra      r.ipush
X2$ cmp.w    #Real,D2
X   bne      type_mismatch
X   math     SPAbs
X   bra      retreal
X
X  DEF    neg
X   bsr      ipop
X   cmp.w    #Integer,D2
X   bne      2$
X   bra      r.ipush
X2$ cmp.w    #Real,D2
X   bne      type_mismatch
X   math     SPNeg
X   bra      retreal
X
X  DEF    floor
X   moveq    #-1,D4
X   bra      ..clng
X  DEF    ceiling
X   moveq    #0,D4
X..clng
X   bsr      ipop
X   cmp.w    #Integer,D2
X   beq      r.ipush
X   cmp.w    #Real,D2
X   bne      type_mismatch
X   move.l   D0,D3
X   math     SPFix
X   move.l   D0,D2
X   math     SPFlt
X   move.l   D3,D1
X   math     SPCmp
X   beq      3$
X
X   tst.l    D4
X   bne      1$
X   tst.l    D2
X   bmi      3$
X   addq.l   #1,D2
X   bra      3$
X1$ tst.l    D2
X   bpl      3$
X   subq.l   #1,D2
X
X3$ move.l   D2,D0
X   bra      retinteger
X
X  DEF    round
X   bsr      ipop
X   cmp.w    #Integer,D2
X   beq      r.ipush
X   cmp.w    #Real,D2
X   bne      type_mismatch
X   move.l   D0,D3
X   and.b    #$7F,D0
X   move.l   #PointFive,D1
X   math     SPAdd
X   math     SPFix
X   and.b    #$80,D3
X   beq      retinteger
X   neg.l    D0
X   bra      retinteger
X
X  DEF    truncate
X   bsr      ipop
X   cmp.w    #Integer,D2
X   beq      r.ipush
X   cmp.w    #Real,D2
X   bne      type_mismatch
X   math     SPFix
X   bra      retinteger
X
Xretinteger
X   RETURN   Integer
X
Xretreal
X   RETURN   Real
X
X
X
Xief   macro
X   xdef  _\1
X_\1
X   bsr   popr
X   ieee  \1
X   bra   retreal
X   endm
X
X
Xiefa  macro
X   xdef  _\1
X_\1
X   bsr   popr
X   move.l   #$8EFA353B,D1
X   math     SPMul
X   ieee  \1
X   bra   retreal
X   endm
X
X   ief     fieee
X   ief     tieee
X   ief     sqrt
X   ief     ln
X   ief     exp
X   ief     pow
X   iefa     tanh
X   iefa     cosh
X   iefa     sinh
X*   ief     sincos
X   iefa     tan
X   iefa     cos
X   iefa     sin
X
X
X  DEF    log
X   bsr      popr
X   ieee     ln
X   move.l   #$935D8D42,D1
X   math     SPDiv
X   bra      retreal
X
X
X  DEF    atan
X   bsr      popr        x
X   move.l   D0,D1
X   bsr      popr        y
X   moveq    #0,D3
X   tst.b    D1
X   beq      ..vrt
X   bpl      1$
X   move.w   #180,D3     +y/-x
X   tst.b    D0
X   bpl      2$
X   move.w   #270,D3     -y/-x
X   bra      2$
X1$ tst.b    D0
X   bpl      2$
X   move.w   #360,D3     -y/+x
X2$
X   math     SPDiv
X   and.b    #$7F,D0
X   ieee     atan
X   move.l   #$8EFA353B,D1
X   math     SPDiv
X   tst.l    D3
X   beq      retreal
X   or.b     #$80,D0     subtr. from 180,270, or 360
X   exg      D0,D3
X   math     SPFlt
X   move.l   D3,D1
X   math     SPAdd
X   bra      retreal
X..vrt
X   move.l   D0,D1
X   move.l   #90,D0
X   tst.b    D1
X   beq      diverr
X   bpl      retinteger
X   move.w   #270,D0
X   bra      retinteger
X
X
X  DEF    gsave
X   lea      gsavecnt,A0
X   cmp.w    #PstackSize,(A0)
X   beq      2$
X   move.w   (A0),D0
X   addq.w   #1,(A0)
X   mulu     #GsaveSize*4,D0
X   moveq    #GsaveSize-1,D1
X   lea      CTM,A0
X   lea      sCTM,A1
X   add.l    D0,A1
X1$ move.l   (A0)+,(A1)+
X   dbra     D1,1$
X   bra      ggsave
X2$ ERR      gsov
X
X
X  DEF    grestore
X   lea      gsavecnt,A0
X   tst.w    (A0)
X   beq      2$
X   subq.w   #1,(A0)
X   move.w   (A0),D0
X   mulu     #GsaveSize*4,D0
X
X   moveq    #GsaveSize-1,D1
X   lea      CTM,A0
X   lea      sCTM,A1
X   add.l    D0,A1
X1$ move.l   (A1)+,(A0)+
X   dbra     D1,1$
X   bra      ggrestore
X2$ ERR      gsuv
X
X
XmatA     equ   0
XmatB     equ   4
XmatC     equ   8
XmatD     equ   12
XmatTx    equ   16
XmatTy    equ   20
X
X* convert array of 6 numbers at D0 to matrix
Xarrayto2matrix
X   lea      temp2matrix,A1
X   bra      ..arrtm
Xarraytomatrix
X   lea      tempmatrix,A1
X..arrtm
X   move.l   D0,A0
X   cmp.w    #6,(A0)+
X   bne      materr
X   moveq    #5,D3
X1$
X   move.w   (A0)+,D2
X   move.l   (A0)+,D0
X   cmp.w    #Real,D2
X   beq      2$
X   cmp.w    #Integer,D2
X   bne      materr
X   math     SPFlt
X2$
X   move.l   D0,(A1)+
X   dbra     D3,1$
X   rts
X
Xmaterr
X   ERR      materror
X
X
X  DEF    translate
X   lea      v_translate,A0
Xdomatrix
X   move.l   A4,-(SP)
X   move.l   A0,A4
X   bsr      ipop
X   cmp.w    #Array,D2
X   bne      1$
X   move.l   D0,-(SP)
X   bsr      arraytomatrix
X   lea      tempmatrix,A2
X   move.l   A2,-(SP)
X   jsr      (A4)
X   move.l   (SP)+,A2
X   move.l   (SP),D0
X   bsr      matrixtoarray
X   move.l   (SP)+,D0
X   move.l   (SP)+,A4
X   RETURN   Array
X1$
X   bsr      r.ipush
X   lea      CTM,A2
X   jsr      (A4)
X   move.l   (SP)+,A4
X   rts
X
Xmatrixtoarray
X   move.l   D0,A0
X   lea      2(A0),A0    past length
X   moveq    #5,D3
X   move.w   #Real,D2
X1$ move.w   D2,(A0)+
X   move.l   (A2)+,(A0)+
X   dbra     D3,1$
X   rts
X
Xv_translate
X   bsr      popr
X   move.l   D0,D3
X   bsr      popr
X*   lea      CTM,A2
Xxtranslate
X   move.l   matTx(A2),D1
X   math     SPAdd
X   move.l   D0,matTx(A2)
X   move.l   D3,D0
X   move.l   matTy(A2),D1
X   math     SPAdd
X   move.l   D0,matTy(A2)
X   rts
X
X  DEF    scale
X   lea      v_scale,A0
X   bra      domatrix
Xv_scale
X   bsr      popr
X   tst.b    D0
X   beq      diverr
X   move.l   D0,D3
X   bsr      popr
X   tst.b    D0
X   beq      diverr
X   move.l   D0,D2
X*   lea      CTM,A2
X   bsr      xscale
X
X   exg      D2,D3
X   move.l   currx,D0
X   move.l   D2,D1
X   math     SPDiv
X   move.l   D0,D2
X
X   move.l   curry,D0
X   move.l   D3,D1
X   math     SPDiv
X   move.l   D0,D3
X
X   bra      xy
X
X
Xxscale
X   move.l   (A2),D1
X   bsr      rmul
X   move.l   D0,(A2)     sx * a
X
X   move.l   matB(A2),D1
X   bsr      rmul
X   move.l   D0,matB(A2)    sx * b
X
X   exg      D3,D2
X   move.l   matC(A2),D1
X   bsr      rmul
X   move.l   D0,matC(A2)    sy * c
X
X   move.l   matD(A2),D1
X   bsr      rmul
X   move.l   D0,matD(A2)   sy * d
X
X   rts
X
X  DEF    rotate
X   lea      v_rotate,A0
X   bra      domatrix
Xv_rotate
X   bsr      popr
X   move.l   #$8EFA353B,D1
X   math     SPMul
X   move.l   D0,D3
X   ieee     sin
X   exg      D0,D3
X   ieee     cos
X   move.l   D0,D4
X* D3 = sin, D4 = cos
X
X*   lea      CTM,A2
X   bsr      rot1
X
X   lea      4(A2),A2
Xrot1
X   move.l   (A2),D0
X   move.l   D0,-(SP)
X   move.l   D4,D1
X   math     SPMul
X   move.l   D0,D2    a * cos (b * cos)
X
X   move.l   matC(A2),D0
X   move.l   D0,-(SP)    c (d)
X   move.l   D3,D1
X   math     SPMul    c * sin (d * sin)
X   move.l   D2,D1
X   math     SPAdd
X   move.l   D0,(A2)  a * cos + c * sin  (b * cos + d * sin)
X
X   move.l   (SP)+,D0    c (d)
X   move.l   D4,D1
X   math     SPMul
X   move.l   D0,D2       c * cos
X   move.l   (SP)+,D0    a (b)
X   move.l   D3,D1
X   math     SPMul       a * sin
X   move.l   D2,D1
X   exg      D0,D1
X   math     SPSub       c * cos - a * sin (d * cos - b * sin)
X   move.l   D0,matC(A2)
X   rts
X
Xrmul
X   beq      2$
X   move.l   D2,D0
X   beq      1$
X   math     SPMul
X1$ rts
X2$ moveq    #0,D0
X   rts
X
X  DEF    concatmatrix
X  ARG    Array
X   move.l   D0,-(SP)    save result matrix to return
X   move.l   D0,A0
X   cmp.w    #6,(A0)     right size?
X   bne      materr
X  ARG    Array
X   bsr      arrayto2matrix    matrix2
X  ARG    Array
X   bsr      arraytomatrix     matrix1
X
X   lea      tempmatrix,A0
X   lea      temp2matrix,A2
X   move.l   A2,-(SP)
X   bsr      y_concat
X   move.l   (SP)+,A2
X   move.l   (SP),D0
X   bsr      matrixtoarray
X   move.l   (SP)+,D0
X   RETURN   Array
X
X  DEF    concat
X  ARG    Array
X   bsr   arraytomatrix
X   lea   tempmatrix,A0
X   lea   CTM,A2
X
X* matrix at A2 = matrix at A0 X matrix at A2
Xy_concat
X   movem.l  D4/A3,-(SP)
X   move.l   A0,A3
X   bsr      halfmul
X   lea      4(A2),A2
X   bsr      halfmul
X   movem.l  (SP)+,D4/A3
X   rts
X
X* uses D2 = a2 D3 = c2 D4 = multiplicand
Xhalfmul
X   move.l   (A2),D2
X   move.l   matC(A2),D3
X
X   move.l   (A3),D0
X   move.l   D2,D1
X   math     SPMul
X   move.l   D0,D4
X
X   move.l   matB(A3),D0
X   move.l   D3,D1
X   math     SPMul
X   move.l   D4,D1
X   math     SPAdd
X   move.l   D0,(A2)
X
X   move.l   matC(A3),D0
X   move.l   D2,D1
X   math     SPMul
X   move.l   D0,D4
X
X   move.l   matD(A3),D0
X   move.l   D3,D1
X   math     SPMul
X   move.l   D4,D1
X   math     SPAdd
X   move.l   D0,matC(A2)
X
X   move.l   matTx(A3),D0
X   move.l   D2,D1
X   math     SPMul
X   move.l   D0,D4
X
X   move.l   matTy(A3),D0
X   move.l   D3,D1
X   math     SPMul
X   move.l   D4,D1
X   math     SPAdd
X   move.l   matTx(A2),D1
X   math     SPAdd
X   move.l   D0,matTx(A2)
X
X   rts
X
X  DEF    dtransform
X   lea      y_dtransform,A0
X   bra      domatrix
Xy_dtransform
X   bsr      popr
X   move.l   D0,D3
X   bsr      popr
X   move.l   D0,D2
X   bsr      xxy
X   move.l   vcurrx,D0
X   move.l   matTx(A2),D1
X   math     SPSub
X   move.w   #Real,D2
X   bsr      r.ipush
X   move.l   vcurry,D0
X   move.l   matTy(A2),D1
X   math     SPSub
X   bra      r.ipush
X
X  DEF    transform
X   lea      y_transform,A0
X   bra      domatrix
Xy_transform
X   bsr      popr
X   move.l   D0,D3
X   bsr      popr
X   move.l   D0,D2
X   bsr      xxy
X   move.w   #Real,D2
X   move.l   vcurrx,D0
X   bsr      r.ipush
X   move.l   vcurry,D0
X   bra      r.ipush
X
X
X  DEF    currentpoint
X   move.w   #Real,D2
X   move.l   currx,D0
X   bsr      r.ipush
X   move.l   curry,D0
X   bra      r.ipush
X
X   xdef     poprxy
Xpoprxy
X   bsr      popr
X   move.l   curry,D1
X   math     SPAdd
X   move.l   D0,D3
X   bsr      popr
X   move.l   currx,D1
X   math     SPAdd
X   move.l   D0,D2
X   bra      xy
X
X
X   xdef     popxy
X* get coordinate from stack and convert
X* to screen address in D0=x and D1=y
X* also, in real form, D2=x and D3=y
Xpopxy
X   bsr      popr
X   move.l   D0,D3
X   bsr      popr
X   move.l   D0,D2
Xxy
X   movem.l  D2/D3,currx
X   lea      CTM,A2
Xxxy
X   move.l   (A2),D1
X   bsr      rmul        ax
X   move.l   matTx(A2),D1
X   math     SPAdd       + tx
X   move.l   D0,D4
X   exg      D2,D3
X   move.l   matC(A2),D1
X   bsr      rmul        cy
X   move.l   D4,D1
X   math     SPAdd       + cy
X   move.l   D0,vcurrx
X
X   move.l   #PointFive,D1
X   math     SPAdd
X   math     SPFix
X   move.l   D0,-(SP)
X
X   exg      D2,D3
X   move.l   matB(A2),D1
X   bsr      rmul        bx
X   move.l   matTy(A2),D1
X   math     SPAdd       + ty
X   move.l   D0,D4
X   exg      D2,D3
X   move.l   matD(A2),D1
X   bsr      rmul        dy
X   move.l   D4,D1
X   exg      D2,D3
X   math     SPAdd       + dy
X   move.l   D0,vcurry
X
X* times 200/512 = 25/64 = .390625
X   move.l   #VFactor,D1
X   math     SPMul
X
X   move.l   D0,D3    for antiraster lineto
X   move.l   vcurrx,D2
X
X   move.l   #PointFive,D1
X   math     SPAdd
X   math     SPFix
X   move.l   #MaxY,D1
X   sub.l    D0,D1
X
X   move.l   (SP)+,D0
X   rts
X
X  DEF    currentlinewidth
X   move.l   linewidth,D0
X   bra      retreal
X
X  DEF    setlinewidth
X   bsr      popr
X   tst.b    D0
X   bmi      type_mismatch
X   move.l   D0,linewidth
X   rts
X
X* called by stroke to see if lines currently have width
X* should return D0=1 if so, D0=0 if not
X   xdef     checklwidth
Xchecklwidth
X   move.l   linewidth,D0
X   move.l   #PointFive,D1
X   math     SPMul
X   move.l   D0,D2
X   move.l   D2,D3
X   bsr      deltaxy
X   or.l     D2,D3
X   bne      1$
X   moveq    #0,D0
X   rts
X1$ moveq    #1,D0
X   rts
X
Xdeltaxy
X   move.l   A2,-(SP)
X   lea      CTM,A2
X*   move.l   matB(A2),-(SP)
X*   move.l   matC(A2),-(SP)
X   move.l   matTx(A2),-(SP)
X   move.l   matTy(A2),-(SP)
X*   clr.l    matB(A2)
X*   clr.l    matC(A2)
X   clr.l    matTx(A2)
X   clr.l    matTy(A2)
X   bsr      xxy
X   move.l   (SP)+,matTy(A2)
X   move.l   (SP)+,matTx(A2)
X*   move.l   (SP)+,matC(A2)
X*   move.l   (SP)+,matB(A2)
X   move.l   (SP)+,A2
X
X   move.l   D0,D2
X   bpl      1$
X   neg.l    D2
X1$
X   move.l   D3,D0
X   and.b    #$7F,D0
X   move.l   #PointFive,D1
X   math     SPAdd
X   math     SPFix
X   move.l   D0,D3
X
X   rts
X
X* called by stroke routine to calculate
X* x and y components of linewidth
X* A3 -> source: (int,int) (real,real)
X* A4 -> dest:    ditto
X* returns D2=dx D3=dy
X   xdef     xywidth
Xxywidth
X   move.l   linewidth,D0
X   move.l   #PointFive,D1
X   math     SPMul
X   move.l   D0,-(SP)
X
X   move.l   12(A4),D0      y1
X   move.l   12(A3),D1      y0
X   math     SPSub             y1 - y0
X   move.l   #VFactor,D1
X   math     SPDiv
X   move.l   D0,D2
X
X   move.l   8(A4),D0       x1
X   move.l   8(A3),D1       x0
X   math     SPSub             x1 - x0
X
X   tst.b    D0
X   bne      1$
X   moveq    #0,D3          cos = 0
X   move.l   (SP),D0        sin = 1
X   bra      2$
X1$
X   move.l   D0,D1
X   move.l   D2,D0
X   math     SPDiv       (y1-y0)/(x1-x0)
X   and.b    #$7F,D0
X
X   ieee     atan
X   move.l   D0,D2
X   ieee     cos
X   move.l   D0,D3
X   move.l   D2,D0
X   ieee     sin
X
X   move.l   (SP),D1
X   math     SPMul
X2$
X   move.l   D0,D2
X
X   move.l   (SP)+,D1
X   move.l   D3,D0
X   math     SPMul
X   move.l   D0,D3
X
X   movem.l  D2/D3,-(SP)
X   exg      D2,D3
X   bsr      deltaxy
X   exg      D2,D3
X
X   bsr      22$
X   move.l   D2,D0
X   move.l   D3,D1
X   movem.l  (SP)+,D2/D3
X
X   movem.l  D0/D1,-(SP)
X   bsr      21$
X   movem.l  (SP)+,D0/D1
X   rts
X
X21$
X   bsr      deltaxy
X22$
X
X   move.l   (A4),D0
X   cmp.l    (A3),D0
X   bne      3$
X   moveq    #0,D3
X   bra      4$
X3$ bpl      4$
X   neg.l    D3
X4$ move.l   4(A4),D0
X   cmp.l    4(A3),D0
X   bne      5$
X   moveq    #0,D2
X   bra      6$
X5$ blt      6$
X   neg.l    D2
X6$
X   rts
X
X
X
X   xdef     xadvance
Xxadvance
X   math     SPFlt
X   move.l   currx,D1
X   math     SPAdd
X   move.l   D0,D2
X   move.l   curry,D3
X   bra      xy
X
X  DEF    setflat
X   bsr      popr
X   and.b    #$7F,D0
X   cmp.b    #$42,D0
X   bcs      type_mismatch
X   move.l   D0,flatness
X   rts
X  DEF    currentflat
X   move.l   flatness,D0
X   RETURN   Real
X
X
Xctx0     equ   0
Xcty0     equ   4
Xctx1     equ   8
Xcty1     equ  12
Xctx2     equ  16
Xcty2     equ  20
Xctx3     equ  24
Xcty3     equ  28
X
Xctax     equ   0
Xctbx     equ   8
Xctcx     equ  16
X
X  DEF    rcurveto
X   moveq    #-1,D0
X   bra      ..crvt
X
X  DEF    curveto
X   moveq    #0,D0
X..crvt
X   movem.l  D6/D7/A3/A4,-(SP)
X   move.l   D0,D6
X   lea      ct_xy,A4
X   lea      currx,A3
X   bsr      ctxystow
X   bsr      popxy
X   lea      16(A4),A4
X   bsr      ctxystow
X   bsr      popxy
X   lea      -16(A4),A4
X   bsr      ctxystow
X   bsr      popxy
X   lea      -16(A4),A4
X   bsr      ctxystow
X
X   lea      ct_xy,A3
X   tst.l    D6
X   beq      11$
X
X   lea      ctx1(A3),A4
X   moveq    #2,D3
X10$
X   move.l   (A3),D0
X   move.l   (A4),D1
X   math     SPAdd
X   move.l   D0,(A4)+
X   move.l   cty0(A3),D0
X   move.l   (A4),D1
X   math     SPAdd
X   move.l   D0,(A4)+
X   dbra     D3,10$
X
X11$
X   lea      ct_abc,A4
X   bsr      ctabcfigure
X   movem.l  D4/A3/A4,-(SP)
X   lea      4(A3),A3
X   lea      4(A4),A4
X   bsr      ctabcfigure
X   move.l   D4,D3
X   movem.l  (SP)+,D4/A3/A4
X* D3 = y3 - y0; D4 = x3 - x0
X   and.b    #$7F,D4
X   and.b    #$7F,D3
X   move.l   D4,D0
X   move.l   D3,D1
X   math     SPCmp
X   bgt      1$
X   move.l   D3,D4
X1$
X   move.l   D4,D1
X   move.l   flatness,D0  (make setable)
X   math     SPDiv          dt = 4/dx or 4/dy
X   tst.b    D0
X   beq      100$
X
X   move.l   D0,D7
X   move.l   D7,D3
X
X   moveq    #-1,D4
X   move.l   (A3),D0
X   move.l   cty0(A3),D1
X   bsr      ctto
X
X2$
X   cmp.b    #$41,D3
X   blt      3$
X   move.l   ctx3(A3),D0
X   move.l   cty3(A3),D1
X   clr.l    D4
X   bsr      ctto
X   bra      100$
X3$
X   bsr      ctxfigure
X   movem.l  D0/A3/A4,-(SP)
X   lea      4(A3),A3
X   lea      4(A4),A4
X   bsr      ctxfigure
X   move.l   D0,D1
X   movem.l  (SP)+,D0/A3/A4
X
X   clr.l    D4
X   bsr      ctto
X
X   move.l   D7,D0
X   move.l   D3,D1
X   math     SPAdd
X   move.l   D0,D3
X   bra      2$
X
X100$
X   movem.l  (SP)+,D6/D7/A3/A4
X   rts
X
Xctto
X   movem.l  D3/A3/A4,-(SP)
X   move.l   D0,D2
X   move.l   D1,D3
X   bsr      xy
X   tst.l    D4
X   bne      1$
X   bsr      ylineto
X   bra      2$
X1$ bsr      ymoveto
X2$ movem.l  (SP)+,D3/A3/A4
X   rts
X
Xctabcfigure
X   move.l   ctx1(A3),D0
X   move.l   ctx0(A3),D1
X   math     SPSub
X   move.l   #ThreePoint,D1
X   move.l   D1,D2
X   math     SPMul
X   move.l   D0,ctcx(A4)
X   move.l   D0,D3
X
X   move.l   ctx2(A3),D0
X   move.l   ctx1(A3),D1
X   math     SPSub
X   move.l   D2,D1
X   math     SPMul
X   move.l   D3,D1
X   math     SPSub
X   move.l   D0,ctbx(A4)
X   move.l   D0,D2
X
X   move.l   ctx3(A3),D0
X   move.l   ctx0(A3),D1
X   math     SPSub
X   move.l   D0,D4
X   move.l   D2,D1
X   math     SPSub
X   move.l   D3,D1
X   math     SPSub
X   move.l   D0,ctax(A4)
X
X   rts
X
X* D3 = t
Xctxfigure
X   move.l   ctax(A4),D0
X   move.l   D3,D1
X   math     SPMul
X   move.l   ctbx(A4),D1
X   math     SPAdd
X   move.l   D3,D1
X   math     SPMul
X   move.l   ctcx(A4),D1
X   math     SPAdd
X   move.l   D3,D1
X   math     SPMul
X   move.l   (A3),D1
X   math     SPAdd
X   rts
X
X
Xctxystow
X   move.l   A3,-(SP)
X   move.l   (A3)+,(A4)+
X   move.l   (A3)+,(A4)+
X   move.l   (SP)+,A3
X   rts
X
X
Xct_xy    dcb.l    8,0
Xct_abc   dcb.l    6,0
X
X
X  DEF    makefont
X  ARG    Array
X   bsr      _fontalloc
X   move.l   A0,D1
X   move.w   #-1,(A0)+
X   move.w   #Array,(A0)+
X   move.l   D0,(A0)+
X  ARG    FontID
X   move.l   D0,A0
X   tst.w    (A0)
X   bpl      type_mismatch
X   move.l   D1,D0
X   RETURN   FontID
X
X
X  DEF    scaleg
X   bsr      popr
X   bsr      _fontalloc
X   move.l   A0,D1
X   move.w   #-1,(A0)+
X   move.w   #Real,(A0)+
X   move.l   D0,(A0)+
X  ARG    FontID
X   move.l   D1,D0
X   RETURN   FontID
X
X
Xinitfctm
X
X* copy current CTM to fCTM
X   moveq    #5,D1
X   lea      CTM,A0
X   lea      fCTM,A1
X   move.l   A0,A2
X1$ move.l   (A0)+,(A1)+
X   dbra     D1,1$
X 
X* translate to current position
X   move.l   curry,D3
X   move.l   currx,D2
X   bsr      xxy
X   lea      fCTM,A2
X   move.l   vcurry,matTy(A2)
X   move.l   vcurrx,matTx(A2)
X
X* zero temp matrix
X   lea      tempmatrix,A0
X   moveq    #5,D1
X   moveq    #0,D0
X2$ move.l   D0,(A0)+
X   dbra     D1,2$
X
X   move.l   currfont,A0
X   tst.w    (A0)+
X   bmi      3$
X   move.l   #OnePoint,D0      ??
X   bra      4$
X3$
X   move.w   (A0)+,D2
X   move.l   (A0),D0
X   cmp.w    #Real,D2
X   bne      5$
X4$
X   lea      tempmatrix,A0
X   move.l   D0,(A0)
X   move.l   D0,matD(A0)
X   bra      6$
X5$
X   cmp.w    #Array,D2
X   bne      type_mismatch
X   bsr      arraytomatrix
X
X6$
X   lea      tempmatrix,A2
X   move.w   simplex_base,D0
X   ext.l    D0
X   math     SPFlt
X   move.l   matTy(A2),D1
X   math     SPAdd
X   move.l   D0,matTy(A2)
X
X* scale down by nominal height
X   move.w   simplex_height,D0
X   ext.l    D0
X   math     SPFlt
X   move.l   D0,D1
X   move.l   #OnePoint,D0
X   math     SPDiv
X   move.l   D0,D2
X   move.l   D0,D3
X   bsr      xscale
X
X* save 'a' for currentpoint update
X   move.l   (A2),simplex_scale
X
X* concat with copy of CTM
X   lea      tempmatrix,A0
X   lea      fCTM,A2
X   bsr      y_concat
X
X   lea      fCTM,A2
X
X   rts
X
X
X   xdef  _lengthg
X_lengthg
X   movem.l  D5/D6,-(SP)
X   moveq    #0,D6
X   bra      ..shwg
X
X  DEF    charpath
X  ARG    Boolean
X   beq      1$
X   move.b   #1,strokepathflag
X1$
X   movem.l  D5/D6,-(SP)
X   moveq    #-1,D6
X   bra      ..shwg
X
X  DEF    showg
X   movem.l  D5/D6,-(SP)
X   moveq    #1,D6
X..shwg
X   bsr      initfctm    henceforth A2 -> fCTM
X
X  ARG    String
X
X   move.l   D0,A0
X   moveq    #0,D0
X   move.l   D0,lastx
X   move.l   D0,xoffset
X   move.w   (A0)+,D3
X1$
X   subq.w   #1,D3
X   bpl      2$
X
X   move.l   lastx,D0
X   math     SPFlt
X
X   move.l   simplex_scale,D1
X   math     SPMul
X
X   move.l   D6,D4
X   movem.l  (SP)+,D5/D6
X
X   tst.l    D4
X   bne      10$
X   move.w   #Real,D2
X   bsr      r.ipush
X   moveq    #0,D0
X   bra      r.ipush
X
X10$
X   move.l   currx,D1
X   math     SPAdd
X   move.l   D0,D2
X   move.l   curry,D3
X   bsr      xy
X   tst.l    D4
X   bpl      xmoveto
X   bra      ymoveto
X
X2$
X   moveq    #0,D0
X   move.b   (A0)+,D0
X   movem.l  D3/A0,-(SP)
X   bsr      drawchar
X   movem.l  (SP)+,D3/A0
X   bra      1$
X
X
Xdrawchar
X   cmp.b    #' ',D0
X   bcs      ..dcret
X   cmp.b    #$7F,D0
X   bhi      ..dcret
X
X   sub.b    #' ',D0
X   add.l    D0,D0
X   lea      simplex,A0
X   move.l   A0,A3
X   add.l    D0,A0
X   add.w    (A0),A3
X
X
X* x-offset to center of character
X
X   move.b   (A3)+,D0    left bound
X   ext.w    D0
X   ext.l    D0
X   neg.l    D0
X   move.l   lastx,D1
X   add.l    D1,D0
X   move.l   D0,xoffset
X   move.l   D0,D2       save to update currx
X
X* update currx
X   move.b   (A3)+,D0    right bound
X   ext.w    D0
X   ext.l    D0
X   add.l    D2,D0
X   move.l   D0,lastx
X
X   tst.l    D6
X   beq      ..dcret
X
X   clr.l    D5          pen is up
X
Xf_endchar   equ   0
Xf_penup     equ   1
Xf_closepath equ   2
X
X
X* start drawing
Xnextpoint
X   move.b   (A3)+,D0    x
X   move.b   (A3)+,D3    y
X   cmp.b    #64,D0      special command?
X   bne      dopoint
X   cmp.b    #f_endchar,D3
X   bne      ..dc1
X..dcret
X   rts
X
X..dc1
X   cmp.b    #f_closepath,D3
X   bne      ..dc2
X   tst.l    D6
X   bpl      1$
X   bsr      _closepath
X   bra      2$
X1$ bsr      xclosepath
X2$ clr.l    D5          pen up
X   bra      nextpoint
X
X..dc2
X   cmp.b    #f_penup,D3
X   bne      nextpoint   unknown
X   clr.l    D5          pen up
X   bra      nextpoint
X
Xdopoint
X   ext.w    D0
X   ext.l    D0
X   move.l   xoffset,D1
X   add.l    D1,D0
X   math     SPFlt
X   move.l   D0,D2
X
X   move.b   D3,D0
X   ext.w    D0
X   ext.l    D0
X   neg.l    D0
X   math     SPFlt
X   move.l   D0,D3
X   bsr      xxy            get device coordinates
X   tst.l    D5
X   bmi      3$
X
X   tst.l    D6
X   bpl      1$
X   bsr      ymoveto
X   bra      2$
X1$ bsr      xmoveto
X2$ moveq    #-1,D5         now pen is down
X   bra      nextpoint
X
X3$ tst.l    D6
X   bpl      4$
X   bsr      ylineto
X   bra      nextpoint
X
X4$ bsr      xlineto
X   bra      nextpoint
X
X
X
X   section  three,data
X
X
XCTM
X   dc.l     OnePoint
X   dc.l     0
X   dc.l     0
X   dc.l     OnePoint
X   dc.l     0
X   dc.l     0
Xcurrx
X   dc.l     0
Xcurry
X   dc.l     0
Xvcurrx
X   dc.l     0
Xvcurry
X   dc.l     0
Xlinewidth
X   dc.l     0
Xflatness
X   dc.l     FourPoint     not saved
X
X
X
XfCTM
X   dc.l     OnePoint
X   dc.l     0
X   dc.l     0
X   dc.l     OnePoint
X   dc.l     0
X   dc.l     0
X
Xlastx          dc.l     0
Xxoffset        dc.l     0
X
Xsimplex_scale  dc.l     $BA2E8C3C   1/22
Xsimplex_base   dc.w     9
Xsimplex_height dc.w     22
X
Xgsavecnt       dc.w     0
X
X   bstr     gsov,<gsave overflow>
X   bstr     gsuv,<grestore underflow>
X   bstr     divzero,<divide by zero>
X   bstr     materror,<matrix error>
X
X   section  mroom,bss
X
Xtempmatrix  ds.l  6
Xtemp2matrix ds.l  6
XsCTM        ds.l  PstackSize*GsaveSize
X
X   end
X
X
END_OF_rmath.a
if test 25500 -ne `wc -c <rmath.a`; then
    echo shar: \"rmath.a\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 2 \(of 2\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked both archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0