home *** CD-ROM | disk | FTP | other *** search
/ AMIGA PD 1 / AMIGA-PD-1.iso / Programme_zum_Heft / Anwendungen / Kurztests / PostScript / PsIntrp / graphics.a < prev    next >
Text File  |  1987-09-06  |  29KB  |  1,591 lines

  1.  
  2.    xref  graphicsbase
  3.    xref  rastport
  4.    xref  viewport
  5.    xref  type_mismatch
  6.    xref  msg
  7.    xref  reinterp
  8.  
  9.    xref  ipop
  10.    xref  r.ipush
  11.    xref  popnum
  12.    xref  dictsearch
  13.  
  14.    xref  popxy,poprxy
  15.    xref  _showg,_scaleg,_lengthg
  16.    xref  xadvance
  17.  
  18.    xref  checklwidth,xywidth
  19.  
  20.    section  one
  21.  
  22.    include  "ps.h"
  23.  
  24.  
  25.    lref     ClearScreen,4
  26.    lref     TextLength,5
  27.    lref     Text,6
  28.    lref     SetFont,7
  29.    lref     OpenFont,8
  30.    lref     CloseFont,9
  31.    lref     Move,36
  32.    lref     Draw,37
  33.    lref     AreaMove,38
  34.    lref     AreaDraw,39
  35.    lref     AreaEnd,40
  36.    lref     InitArea,43
  37.    lref     SetRGB4,44
  38.    lref     RectFill,47
  39.    lref     WritePixel,50
  40.    lref     Flood,51
  41.    lref     SetAPen,53
  42.    lref     SetBPen,54
  43.    lref     SetDrMd,55
  44.    lref     InitTmpRas,74
  45.    lref     AllocRaster,78
  46.    lref     FreeRaster,79
  47.    lref     GetRGB4,93
  48.  
  49.  
  50. graphics macro
  51.       move.l   A6,-(SP)
  52.       move.l   graphicsbase,A6
  53.       move.l   rastport,A1
  54.       jsr      _LVO\1(A6)
  55.       move.l   (SP)+,A6
  56.       endm
  57.  
  58. graph   macro
  59.       move.l   A6,-(SP)
  60.       move.l   graphicsbase,A6
  61.       jsr      _LVO\1(A6)
  62.       move.l   (SP)+,A6
  63.       endm
  64.  
  65.  
  66.  
  67.    xref     mathffpbase
  68.  
  69.  
  70. math  macro
  71.       move.l   A6,-(SP)
  72.       move.l   mathffpbase,A6
  73.       jsr      _LVO\1(A6)
  74.       move.l   (SP)+,A6
  75.       endm
  76.  
  77. mathb macro
  78.       move.l   mathffpbase,A6
  79.       endm
  80.  
  81. maths macro
  82.       jsr      _LVO\1(A6)
  83.       endm
  84.  
  85.    lref     SPFix,1
  86.    lref     SPFlt,2
  87.    lref     SPCmp,3
  88.    lref     SPTst,4
  89.    lref     SPAbs,5
  90.    lref     SPNeg,6
  91.    lref     SPAdd,7
  92.    lref     SPSub,8
  93.    lref     SPMul,9
  94.    lref     SPDiv,10
  95.  
  96. AreaSize    equ   500
  97.  
  98. PenMask     equ   NumColors-1
  99.    ifne     HiRes
  100. MaxY        equ   399
  101.    endc
  102.    ifeq     HiRes
  103. MaxY        equ   199
  104.    endc
  105.  
  106. *************************
  107.  
  108.    xdef  initgr
  109. initgr
  110.    move.l   rastport,A1
  111.  
  112.    move.l   #640,D0
  113.    move.l   #MaxY+1,D1
  114.    move.l   A1,-(SP)
  115.    graph    AllocRaster
  116.    move.l   D0,rasterpt
  117.  
  118.    move.l   (SP),A1
  119.    lea      tmpras,A0
  120.    move.l   A0,$0C(A1)
  121.    move.l   D0,A1
  122.    move.l   #640*(MaxY+1),D0
  123.    graph    InitTmpRas
  124.  
  125.    move.l   (SP)+,A1
  126.    lea      areasptrn,A0
  127.    move.l   A0,$08(A1)
  128.    move.b   #2,$1D(A1)     4 words
  129.  
  130.    lea      areainfo,A0
  131.    move.l   A0,$10(A1)
  132.    lea      areabuffer,A1
  133.    move.l   #AreaSize,D0
  134.    graph    InitArea
  135.  
  136.    lea      pstacktop,A0
  137.    move.l   A0,pstack
  138.    clr.w    pstackcnt
  139.    clr.w    (A0)+
  140.    lea      pathbuffer,A1
  141.    move.l   A1,(A0)
  142.    clr.w    pointcnt
  143.    move.l   A1,nextpoint
  144.  
  145.    moveq    #1,D0
  146.    graphics SetAPen
  147.    moveq    #0,D0
  148.    graphics SetBPen
  149.    moveq    #1,D0
  150.    graphics SetDrMd
  151.  
  152.    rts
  153.  
  154.  
  155.    xdef  endgr
  156. endgr
  157.    move.l   rasterpt,A0
  158.    move.l   #640,D0
  159.    move.l   #MaxY+1,D1
  160.    graphics FreeRaster
  161.    move.l   rastport,A1
  162.    clr.l   $08(A1)
  163.    clr.l   $0C(A1)
  164.    clr.l   $10(A1)
  165.    rts
  166.  
  167. rasterpt    dc.l  0
  168.  
  169.  
  170.  
  171.   DEF    stringwidth
  172.    move.b   resfontflag,D0
  173.    bne      _lengthg
  174.   ARG    String
  175.    move.l   D0,A0
  176.    moveq    #0,D0
  177.    move.w   (A0)+,D0
  178.    graphics TextLength
  179.    math     SPFlt       dx
  180.    move.w   #Real,D2
  181.    bsr      r.ipush
  182.    moveq    #0,D0       dy = 0
  183.    bra      r.ipush
  184.  
  185.  
  186.   DEF    show
  187.   ARG    String
  188.    move.l   D0,-(SP)
  189.    bsr      movehere
  190.    move.l   (SP)+,D0
  191.  
  192.    move.l   D0,A0
  193.    move.b   resfontflag,D0
  194.    bne      showresfont
  195.  
  196.    movem.l  currdevpoint,D0/D1
  197.    graphics Move
  198.  
  199.    move.l   rastport,A1
  200.    move.w   $24(A1),-(SP)
  201.    moveq    #0,D0
  202.    move.w   (A0)+,D0
  203.    graphics Text
  204.    move.l   rastport,A1
  205.    moveq    #0,D0
  206.    move.w   $24(A1),D0
  207.    move.w   (SP)+,D1
  208.    sub.w    D1,D0
  209.    bsr      xadvance
  210.    movem.l  D0-D3,bpath
  211.    movem.l  D0-D3,currdevpoint
  212.    rts
  213.  
  214. showresfont
  215.    move.l   A0,D0
  216.    move.w   #String,D2
  217.    bsr      r.ipush
  218.    bra      _showg
  219.  
  220. newpoint
  221.    moveq    #0,D4
  222.    move.w   #MaxY,D4
  223.    cmp.l    D4,D1
  224.    ble      1$
  225.    move.l   D4,D1
  226. 1$ tst.l    D1
  227.    bpl      2$
  228.    clr.l    D1
  229. 2$ move.w   #639,D4
  230.    cmp.l    D4,D0
  231.    ble      3$
  232.    move.l   D4,D0
  233. 3$ tst.l    D0
  234.    bpl      4$
  235.    clr.l    D0
  236. 4$ rts
  237.  
  238.   DEF    newpath
  239.    move.l   pstack,A0
  240.    move.w   (A0)+,pointcnt
  241.    move.l   (A0),nextpoint
  242.    move.b   #0,strokepathflag
  243.    rts
  244.  
  245.    xdef     ggsave
  246. ggsave
  247.    lea      pstackcnt,A0
  248.    cmp.w    #PstackSize,(A0)
  249.    beq      1$
  250.    addq.w   #1,(A0)
  251.    move.l   pstack,A0
  252.    move.l   currfont,-(A0)
  253.    move.l   graylevel,-(A0)
  254.    move.l   linecap,-(A0)
  255.    move.l   nextpoint,-(A0)   must be pushed next last
  256.    move.w   pointcnt,-(A0)    must be pushed last
  257.    move.l   A0,pstack
  258.    rts
  259. 1$ ERR      psov
  260.  
  261.    xdef     ggrestore
  262. ggrestore
  263.    lea      pstackcnt,A0
  264.    tst.w    (A0)
  265.    beq      1$
  266.    subq.w   #1,(A0)
  267.    move.l   pstack,A0
  268.    move.w   (A0)+,pointcnt
  269.    move.l   (A0)+,nextpoint
  270.    move.l   (A0)+,linecap
  271.    move.l   (A0)+,D0
  272.    move.l   (A0)+,currfont
  273.    move.l   A0,pstack
  274.    bsr      resetgray
  275.    move.l   currfont,D0
  276.    bra      resetfont
  277. 1$ ERR      psuv
  278.  
  279.  
  280.  
  281. c_moveto    equ   1
  282. c_lineto    equ   2
  283. c_closepath equ   3
  284.  
  285. appendpoint
  286.    lea      pointcnt,A0
  287.    cmp.w    #AreaSize,(A0)
  288.    beq      pointprob
  289.    addq.w   #1,(A0)
  290.    move.l   nextpoint,A0
  291.    move.w   D0,(A0)+
  292.    move.l   D2,(A0)+
  293.    move.l   D3,(A0)+
  294.    move.l   A0,nextpoint
  295.    rts
  296. pointprob
  297.    ERR      pntsov
  298.  
  299.   DEF    rmoveto
  300.    bsr      poprxy
  301.    bra      ymoveto
  302.  
  303.   DEF    moveto
  304.    bsr      popxy
  305.    xdef  ymoveto
  306. ymoveto
  307.    movem.l  D0-D3,bpath
  308.    movem.l  D0-D3,currdevpoint
  309.    moveq    #c_moveto,D0
  310.    bra      appendpoint
  311.  
  312. movehere
  313.    movem.l  currdevpoint,D0-D3
  314.  
  315.    xdef  xmoveto
  316. xmoveto
  317.    bsr      newpoint
  318.    movem.l  D0-D3,bpath
  319.    movem.l  D0-D3,currdevpoint
  320.    graphics Move
  321.    rts
  322.  
  323.   DEF    rlineto
  324.    bsr      poprxy
  325.    bra      ylineto
  326.  
  327.  
  328.   DEF    lineto
  329.    bsr      popxy
  330.    xdef  ylineto
  331. ylineto
  332.    tst.w    pointcnt
  333.    bne      1$
  334.    movem.l  D0-D3,-(SP)
  335.    movem.l  currdevpoint,D0-D3
  336.    bsr      ymoveto
  337.    movem.l  (SP)+,D0-D3
  338. 1$
  339.    movem.l  D0-D3,currdevpoint
  340.    moveq    #c_lineto,D0
  341.    bra      appendpoint
  342.  
  343.    xdef     xclosepath
  344. xclosepath
  345.    movem.l  bpath,D0-D3
  346.    movem.l  D0-D3,currdevpoint
  347.  
  348.    xdef  xlineto
  349. xlineto
  350.    bsr      arlineto
  351.    beq      xxlineto
  352.    rts
  353. xxlineto
  354.    bsr      newpoint
  355.    graphics Draw
  356.    rts
  357.  
  358.   DEF    closepath
  359.    movem.l  bpath,D0-D3
  360.    movem.l  D0-D3,currdevpoint
  361.    moveq    #c_closepath,D0
  362.    bra      appendpoint
  363.  
  364.  
  365.   DEF    pixel
  366. *   graphics WritePixel
  367. *   rts
  368.    bsr      movehere
  369.    move.l   rastport,A1
  370.    move.l   4(A1),A0       A0 -> bitmap
  371.    move.w   $26(A1),D1      D1 = cp_y
  372.    mulu     (A0),D1        cp_y * bytes per row
  373.    moveq    #0,D0
  374.    move.w   $24(A1),D0      cp_x
  375.    move.l   D0,D2
  376.    lsr.l    #3,D0          byte offset for x
  377.    add.l    D0,D1          byte address of pixel
  378.    and.l    #7,D2          bit offset
  379.    moveq    #7,D0
  380.    sub      D2,D0
  381.    move.b   $19(A1),D3     pen color
  382.  
  383.    move.l   8(A0),A1       base address of first screen
  384.    btst     #0,D3
  385.    beq      1$
  386.    bsr      2$
  387. 1$ move.l   12(A0),A1      base address of second screen
  388.    btst     #1,D3
  389.    beq      3$
  390. 2$ add.l    D1,A1
  391.    bset     D0,(A1)
  392. 3$ rts
  393.  
  394. **debug
  395.    ifd   DEBUG2
  396. pushA0
  397.    movem.l  D0-D7/A1-A6,-(SP)
  398.    move.l   A0,D0
  399.    move.w   #Integer,D2
  400.    bsr      r.ipush
  401.    movem.l  (SP)+,D0-D7/A1-A6
  402.    rts
  403.    endc
  404.  
  405. xpixel
  406. **debug
  407.    ifd   DEBUG2
  408.    move.l   D0,A0
  409.    bsr      pushA0
  410.    move.l   D1,A0
  411.    bsr      pushA0
  412.    move.l   D2,A0
  413.    bsr      pushA0
  414.    endc
  415.  
  416.    tst.b    D2
  417.    beq      3$
  418.    tst.l    D1
  419.    bmi      3$
  420.    tst.l    D0
  421.    bmi      3$
  422.    cmp.l    #639,D0
  423.    bhi      3$
  424.    cmp.l    #MaxY,D1
  425.    bhi      3$
  426.  
  427.    mulu     (A5),D1        cp_y * bytes per row
  428.    move.l   D2,A1          save pencolor
  429.    move.l   D0,D2
  430.    lsr.l    #3,D0          byte offset for x
  431.    add.l    D0,D1          byte address of pixel
  432.    and.l    #7,D2          bit offset
  433.    moveq    #7,D0
  434.    sub      D2,D0
  435.    move.l   A1,D2          pen color
  436.  
  437.    move.l   8(A5),A1       base address of first screen
  438.    btst     #0,D2
  439.    beq      1$
  440.    bsr      2$
  441. 1$ move.l   12(A5),A1      base address of second screen
  442.    btst     #1,D2
  443.  
  444.    ifne     HiRes
  445.    beq      10$
  446.    bsr      2$
  447. 10$
  448.    move.l   16(A5),A1
  449.    btst     #2,D2
  450.    endc
  451.  
  452.    beq      3$
  453. 2$ add.l    D1,A1
  454.    bset     D0,(A1)
  455. 3$ rts
  456.  
  457.  
  458.  
  459. arlineto
  460.    movem.l  oldx,A0/A1     starting real coord
  461.    movem.l  D2/D3,oldx     ending real coord - save for next time
  462.    tst.l    vint
  463.    beq      900$           0 vint means use Amiga line drawer
  464. * now draw antirasterized line from (A0,A1) to (D2,D3)
  465. * (y-axis is still inverted)
  466.    movem.l  D5-D7/A2-A6,-(SP)
  467. * D2,D3,A0,A1,A6
  468.    move.l   A0,D4
  469.    move.l   A1,D5
  470. * update cp
  471.    graphics Move
  472. * set A6 for short math calls
  473.    mathb
  474.  
  475. * D2(ex),D3(ey),D4(sx),D5(sy),A6(mbase)
  476.  
  477.    move.l   D5,D0
  478.    move.l   D3,D1
  479.    maths    SPCmp
  480.    bcs      4$
  481.    exg      D2,D4
  482.    exg      D3,D5
  483. 4$
  484.  
  485.    move.l   D2,D0
  486.    move.l   D4,D1
  487.    maths    SPSub          ex - sx
  488.    move.l   D0,D6
  489.  
  490.    move.l   D3,D0
  491.    move.l   D5,D1
  492.    maths    SPSub          ey - sy
  493.    move.l   D0,D7
  494.  
  495. * D2(ex),D3(ey),D4(sx),D5(sy),D6(dx),D7(dy)
  496.  
  497. *  move.l   D7,D0
  498.    and.b    #$7F,D0
  499.    move.l   D6,D1
  500.    and.b    #$7F,D1
  501.    maths    SPCmp          if abs(dy) >= abs(dx), exchange
  502.    bcs      10$
  503.    exg      D2,D3
  504.    exg      D4,D5
  505.    exg      D6,D7
  506.    moveq    #-1,D3         set exchange flag
  507.    bra      11$
  508. 10$
  509.    moveq    #0,D3
  510. 11$
  511.  
  512.    move.l   D4,D0
  513.    move.l   #PointFive,D1
  514.    maths    SPAdd
  515.    maths    SPFix
  516.    move.l   D0,A2          A2 = rx = round(sx)
  517. * D2(ex),D3(flag),D4(sx),D5(sy),D6(dx),D7(dy)
  518. * A2(rx),A4(abs dx)
  519.  
  520.  
  521.  
  522. *  move.l   A2,D0    count = trunc(abs(ex - rx)) + 1
  523.    maths    SPFlt
  524.    move.l   D0,D1
  525.    move.l   D2,D0
  526.    maths    SPSub    ex - flt(rx)
  527.    and.b    #$7F,D0
  528. * round not in original
  529.    move.l   #PointFive,D1
  530.    maths    SPAdd
  531.    maths    SPFix
  532.    addq.l   #1,D0
  533.    move.l   D0,A4
  534.  
  535.    move.l   D3,D2    move flag
  536.  
  537.    move.l   D7,D0
  538.    move.l   D6,D1
  539.    beq      800$
  540.    maths    SPDiv
  541.    move.l   D0,A5          A5 = slope = (ey - sy)/(ex - sx)
  542. * D2(flag),D3(n.u.),D4(sx),D5(sy),D6(dx),D7(dy),A2(rx),A4(cnt),A5(slope),A6
  543.  
  544.    move.l   A2,D0
  545.    maths    SPFlt
  546.    move.l   D4,D1
  547.    maths    SPSub          rx - sx
  548.    move.l   A5,D1
  549.    maths    SPMul          times slope
  550. * abs ??
  551.    move.l   D5,D1
  552.    maths    SPAdd          plus sy
  553.    move.l   D0,D3          D3 = aux
  554.  
  555. * round ??
  556.    maths    SPFix
  557.    move.l   D0,A3          A3 = ry
  558.  
  559.    move.l   A5,D0
  560.    and.b    #$7F,D0
  561.    move.l   vint,D5
  562.    move.l   D5,D1
  563.    maths    SPMul
  564.    move.l   D0,D4          D4 = dint = abs(slope) * vint
  565. * D2(flag),D3(aux),D4(dint),D5(vint),D6(dx),D7(dy)
  566. * A2(rx),A3(ry),A4(cnt),A5(n.u.),A6
  567.  
  568.    move.l   A3,D0
  569.    maths    SPFlt
  570.    move.l   D0,D1
  571.    move.l   D3,D0
  572.    maths    SPSub          aux - ry
  573.    move.l   D5,D1
  574.    maths    SPMul          times vint
  575.    move.l   D0,D3          D3 = lint
  576. * D2(flag),D3(lint),D4(dint),D5(vint),D6(dx),D7(dy)
  577. * A2(rx),A3(ry),A4(cnt),A5(n.u.),A6
  578.  
  579.    tst.w    D2
  580.    bpl      20$
  581.    exg      A2,A3
  582.    exg      D6,D7
  583. 20$
  584.  
  585.    move.l   D6,D1          dx -> +-1
  586.    moveq    #0,D0
  587.    maths    SPCmp
  588.    bne      22$
  589.    moveq    #1,D0
  590. 22$
  591.    move.l   D0,D6
  592.  
  593. *   move.l   D7,D0          dy -> -+1
  594. *   moveq    #0,D1
  595. *   maths    SPCmp
  596. *   bne      24$
  597. *   moveq    #-1,D0
  598. *24$
  599. *   move.l   D0,D7
  600.  
  601.    move.l   rastport,A0
  602.    move.l   4(A0),A5       bitmap
  603.  
  604.    move.l   #MaxY,D0        uninvert y-axis
  605.    move.l   A3,D1
  606.    sub.l    D1,D0
  607.    move.l   D0,A3
  608.  
  609.  
  610. * D0 (pass x)
  611. * D1 (pass y)
  612. * D2 flag dy > dx and pass pencolor
  613. * D3 lint
  614. * D4 dint
  615. * D5 vint
  616. * D6 sign dx
  617. *** D7 sign dy (n.u. now)
  618. * A0
  619. * A1 (temp)
  620. * A2 rx
  621. * A3 ry
  622. * A4 cnt
  623. * A5 bitmap
  624. * A6 mathffpbase
  625.  
  626. **debug
  627.    ifd   DEBUG1
  628.    move.l   A4,SAVECNT
  629.    move.l   A2,SAVERX
  630.    move.l   A3,SAVERY
  631.    move.l   D6,SAVESDX
  632.    move.l   D7,SAVESDY
  633.    move.l   D3,SAVELINT
  634.    move.l   D4,SAVEDINT
  635.    endc
  636.  
  637. 100$
  638.    subq.l   #1,A4
  639.    move.l   A4,D0
  640.    bmi      800$
  641.  
  642.    swap     D2       save exchange flag
  643.  
  644.    move.l   D5,D0
  645.    move.l   D3,D1
  646.    maths    SPSub       vint - lint
  647.    bsr      pixreg
  648.  
  649.    bsr      xpixel      pixel(rx,ry,rint)
  650.  
  651.    move.l   D3,D0
  652.    bsr      pixreg
  653.  
  654.    swap     D2
  655.    tst.w    D2
  656.    bpl      110$
  657.    add.l    D6,D0       lx = rx + 1
  658.    bra      111$
  659. 110$
  660. *   add.l    D7,D1       ly = ry + 1
  661.    subq.l   #1,D1
  662. 111$
  663.    swap     D2
  664.  
  665.    bsr      xpixel      pixel(lx,ly,lint)
  666.  
  667.    swap     D2
  668.  
  669.    move.l   D3,D0
  670.    move.l   D4,D1
  671.    maths    SPAdd
  672.    move.l   D0,D3       lint = lint + dint
  673.  
  674.    move.l   D5,D1
  675.    maths    SPCmp
  676.    bcs      200$        not if lint < vint
  677.  
  678.    tst.w    D2
  679.    bmi      120$
  680. *   add.l    D7,A3       ry = ry + sign(dy)
  681.    subq.l   #1,A3
  682.    bra      130$
  683. 120$
  684.    add.l    D6,A2       rx = rx + sign(dx)
  685. 130$
  686.  
  687.  
  688.    move.l   D3,D0
  689.    move.l   D5,D1
  690.    maths    SPSub
  691.    move.l   D0,D3       lint = lint - vint
  692.  
  693. 200$
  694.    tst.w    D2
  695.    bmi      220$
  696.    add.l    D6,A2       rx = rx + 1
  697.    bra      100$
  698. 220$
  699. *   add.l    D7,A3
  700.    subq.l   #1,A3
  701.    bra      100$
  702.  
  703.  
  704. 800$
  705.    movem.l  (SP)+,D5-D7/A2-A6
  706.  
  707. **debug
  708.    ifd   DEBUG1
  709.    move.w   #Integer,D2
  710.    move.l   SAVECNT,D0
  711.    bsr      r.ipush
  712.    move.l   SAVERX,D0
  713.    bsr      r.ipush
  714.    move.l   SAVERY,D0
  715.    bsr      r.ipush
  716.    move.l   SAVESDX,D0
  717.    bsr      r.ipush
  718.    move.l   SAVESDY,D0
  719.    bsr      r.ipush
  720.    move.w   #Real,D2
  721.    move.l   SAVELINT,D0
  722.    bsr      r.ipush
  723.    move.l   SAVEDINT,D0
  724.    bsr      r.ipush
  725.    endc
  726.  
  727.    moveq    #1,D0          signal line is drawn
  728. 900$
  729.    rts
  730.  
  731. **debug
  732.    ifd   DEBUG1
  733. SAVECNT  dc.l  0
  734. SAVERX   dc.l  0
  735. SAVERY   dc.l  0
  736. SAVESDX  dc.l  0
  737. SAVESDY  dc.l  0
  738. SAVELINT   dc.l   0
  739. SAVEDINT   dc.l   0
  740.    endc
  741.  
  742. pixreg
  743.    move.l   #FourPoint,D1
  744.    maths    SPMul
  745.    maths    SPFix
  746.    cmp.b    #4,D0
  747.    bne      2$
  748.    moveq    #3,D0
  749. 2$ move.w   D0,D2
  750.    move.l   A2,D0
  751.    move.l   A3,D1
  752. *   tst.l    D7
  753. *   bmi      1$
  754. *   addq.l   #1,D1
  755. 1$ rts
  756.  
  757.  
  758.   DEF    greyline
  759.    bsr      pop01
  760.    move.l   D0,vint
  761.    rts
  762.  
  763. pop01
  764.    bsr      ipop
  765.    move.l   #OnePoint,D1
  766.    cmp.w    #Real,D2
  767.    beq      1$
  768.    cmp.w    #Integer,D2
  769.    bne      type_mismatch
  770.    tst.l    D0
  771.    beq      2$
  772.    subq.l   #1,D0
  773.    bne      range01
  774.    move.l   D1,D0
  775. 1$ tst.b    D0
  776.    bmi      range01
  777.    move.l   D0,D2
  778.    math     SPCmp
  779.    bgt      range01
  780.    move.l   D2,D0
  781. 2$ rts
  782.  
  783. range01
  784.    ERR      out01
  785.  
  786. vint           dc.l  0
  787. bpath          dc.l  0,0
  788. oldx           dc.l  0,0
  789. currdevpoint   dc.l  0,0,0,0
  790.  
  791.   DEF    currentgray
  792.    move.l   graylevel,D0
  793.   RETURN    Real
  794.  
  795.  
  796.   DEF    setgray
  797.    bsr      pop01
  798. resetgray
  799.    move.l   D0,graylevel
  800.    lea      areasptrn,A0
  801.    tst.l    D0
  802.    beq      2$
  803.    move.l   #FourPoint,D1
  804.    math     SPMul
  805.    math     SPFix
  806.    moveq    #3,D1
  807.    cmp.l    D1,D0
  808.    bls      1$
  809.    move.l   D1,D0
  810. 1$ add.l    D0,D0
  811.    add.l    D0,D0
  812.    add.l    D0,D0
  813.    lea      areaptrn,A0
  814.    add.l    D0,A0
  815. 2$ move.l   rastport,A1
  816.    move.l   A0,8(A1)
  817.    rts
  818.  
  819.  
  820.   DEF    flood
  821.    bsr      popxy
  822.    bsr      newpoint
  823.    moveq    #0,D2
  824.    move.l   rastport,A1
  825.    move.b   $19(A1),$1B(A1)
  826.    graphics Flood
  827.    rts
  828.  
  829.   DEF    fill
  830.    lea      strokepathflag,A0
  831.    move.b   (A0),D0
  832.    move.b   #0,(A0)
  833.    tst.b    D0
  834.    bne      _stroke
  835.    moveq    #-1,D0
  836.    bra      ..strk
  837.  
  838.   DEF    strokepath
  839.    move.b   #1,strokepathflag
  840.    rts
  841.  
  842.   DEF    stroke
  843.    moveq    #0,D0
  844.    bsr      checklwidth    does line have width?
  845. ..strk
  846.    movem.l  D5-D7/A2-A4,-(SP)
  847.    move.l   D0,D7
  848.  
  849.    moveq    #-1,D0
  850.    move.l   D0,buttremember
  851.    move.l   D0,ibuttremember
  852.    move.l   D0,buttbegin
  853.    move.l   D0,ibuttbegin
  854.    move.l   D0,a_linecap
  855.  
  856.    move.l   pstack,A0
  857.    move.w   (A0)+,D0       pointcount at last newpath
  858.    move.l   (A0),A2        nextpoint at last newpath
  859.  
  860.    move.w   pointcnt,D5
  861.    sub.w    D0,D5
  862. *   lea      pathbuffer,A2
  863.  
  864. 1$ subq.w   #1,D5
  865.    bmi      100$
  866.    move.w   (A2)+,D6
  867.    move.l   (A2)+,D2
  868.    move.l   D2,D0
  869.    math     SPFix
  870.    move.l   D0,A3
  871.  
  872.    move.l   (A2)+,D3
  873.    move.l   D3,D0
  874.    math     SPFix
  875.    move.l   #MaxY,D1
  876.    sub.l    D0,D1
  877.    move.l   A3,D0
  878.  
  879.    tst.l    D7
  880.    bmi      4$
  881.    bne      6$
  882.    cmp.b    #c_moveto,D6
  883.    bne      2$
  884.    bsr      xmoveto
  885.    bra      1$
  886. 2$
  887. *   cmp.b    #c_lineto,D6
  888. *   bne      1$
  889.    bsr      xlineto
  890. 3$ bra      1$
  891.  
  892. 4$ cmp.b    #c_moveto,D6
  893.    bne      5$
  894.    graphics AreaMove
  895.    bra      1$
  896. 5$
  897. *   cmp.b    #c_lineto,D6
  898. *   bne      1$
  899.    graphics AreaDraw
  900.    bra      1$
  901.  
  902. 6$ cmp.b    #c_moveto,D6
  903.    bne      7$
  904.    movem.l  D0-D3,arsource
  905.  
  906. * put caps on ends of last subpath
  907.    bsr      dolinecaps
  908.  
  909.    moveq    #-1,D0
  910.    move.l   D0,buttremember
  911.    move.l   D0,ibuttremember
  912.    move.l   D0,buttbegin
  913.    move.l   D0,ibuttbegin
  914.    move.l   D0,a_linecap
  915.    bra      1$
  916.  
  917. * draw thick stroke by filling
  918. 7$
  919. *   cmp.b    #c_lineto,D6
  920. *   bne      1$
  921.    lea      ardest,A4
  922.    movem.l  D0-D3,(A4)
  923.    lea      arsource,A3
  924.  
  925. *   sub.l    (A3),D0
  926. *   bpl      71$
  927. *   neg.l    D0
  928. *71$
  929. *   sub.l    4(A3),D1
  930. *   bpl      72$
  931. *   neg.l    D1
  932. *72$
  933. *   add.l    D1,D0
  934. *   cmp.l    #4,D0
  935. *   blt      1$
  936.  
  937. * rmath routine calculates sides of right triangle whose
  938. * hypotenuse is perpendicular to this stroke and is
  939. * 1/2 linewidth in length -- returns x-side in D2, y-side in D3
  940. * also y in D0, x in D1 in device coordinates for x and y axes, resp.
  941.    bsr      xywidth
  942.    movem.l  D0/D1,deltayx
  943.    movem.l  buttremember,D0/D1
  944.    tst.l    D0
  945.    bpl      8$
  946. * 1st corner  at beginning of subpath
  947.    movem.l  (A3),D0/D1
  948.  
  949.    lea      a_linecap,A0
  950.    movem.l  D0-D3,(A0)
  951.    movem.l  deltayx,D0/D1
  952.    movem.l  D0/D1,16(A0)
  953.    movem.l  (A0),D0/D1
  954.  
  955.    sub.l    D2,D0
  956.    sub.l    D3,D1
  957.    movem.l  D0/D1,buttbegin
  958. 8$ movem.l  D0/D1,-(SP)    save to close rectangle at end
  959.    bsr      qamove
  960.  
  961.    move.l   buttremember,D0
  962.    bmi      9$
  963. * connect 2nd corner of last stroke to 1st corner of this one
  964.    movem.l  (A3),D0/D1
  965.    sub.l    D2,D0
  966.    sub.l    D3,D1
  967.    bsr      qadraw
  968.  
  969. 9$
  970. * 2nd corner
  971.    movem.l  (A4),D0/D1
  972.  
  973.    lea      b_linecap,A0
  974.    movem.l  D0-D3,(A0)
  975.    movem.l  deltayx,D0/D1
  976.    movem.l  D0/D1,16(A0)
  977.    movem.l  (A0),D0/D1
  978.  
  979.    sub.l    D2,D0
  980.    sub.l    D3,D1
  981.    movem.l  D0/D1,buttremember
  982.    bsr      qadraw
  983.  
  984.    cmp.b    #c_closepath,D6
  985.    bne      10$
  986. * signal don't do linecaps
  987.    moveq    #-1,D0
  988.    move.l   D0,a_linecap
  989.  
  990. * connect 2nd corner to 1st corner of stroke at
  991. * beginning of subpath
  992.    movem.l  buttbegin,D0/D1
  993.    tst.l    D0
  994.    bmi      10$
  995.    bsr      qadraw
  996.    movem.l  ibuttbegin,D0/D1
  997.    tst.l    D0
  998.    bmi      10$
  999.    bsr      qadraw
  1000.  
  1001. 10$
  1002. * 3rd corner
  1003.    movem.l  ibuttremember,D0/D1
  1004.    movem.l  D0/D1,-(SP)
  1005.  
  1006.    movem.l  (A4),D0/D1
  1007.    add.l    D2,D0
  1008.    add.l    D3,D1
  1009.    movem.l  D0/D1,ibuttremember
  1010. * may want move here instead of interior line
  1011.    bsr      qadraw
  1012.  
  1013. * 4th corner
  1014.    movem.l  (A3),D0/D1
  1015.    add.l    D2,D0
  1016.    add.l    D3,D1
  1017.    lea      ibuttbegin,A0
  1018.    tst.l    (A0)
  1019.    bpl      11$
  1020.    movem.l  D0/D1,(A0)
  1021. 11$
  1022.    bsr      qadraw
  1023.  
  1024. * connect 4th corner to 3rd corner of last stroke
  1025.    movem.l  (SP)+,D0/D1
  1026.    tst.l    D0
  1027.    bmi      12$
  1028.    bsr      qadraw
  1029.  
  1030. 12$
  1031. * close rectangle
  1032.    movem.l  (SP)+,D0/D1
  1033.    bsr      qadraw
  1034.  
  1035. * fill it
  1036.    bsr      qaend
  1037.  
  1038.    movem.l  (A4),D0-D3  this destination will be next source
  1039.    movem.l  D0-D3,(A3)
  1040.    bra      1$
  1041.  
  1042.  
  1043. 100$
  1044.    bsr      dolinecaps
  1045.    move.l   D7,D0
  1046.    movem.l  (SP)+,D5-D7/A2-A4
  1047.    tst.l    D0
  1048.    bpl      _newpath
  1049.    graphics AreaEnd
  1050.    bra      _newpath
  1051.  
  1052.  
  1053. qamove
  1054.    tst.b    strokepathflag
  1055.    bne      1$
  1056.    move.l   D2,D4
  1057.    or.l     D3,D4
  1058.    beq      1$
  1059.    graphics AreaMove
  1060.    tst.l    D0
  1061.    bmi      pointprob
  1062.    rts
  1063. 1$ movem.l  D2/D3,-(SP)
  1064.    bsr      xmoveto
  1065.    movem.l  (SP)+,D2/D3
  1066.    rts
  1067.  
  1068. qadraw
  1069.    move.l   D2,D4
  1070.    or.l     D3,D4
  1071.    beq      1$
  1072.    tst.b    strokepathflag
  1073.    bne      ..qnd
  1074.    graphics AreaDraw
  1075.    tst.l    D0
  1076.    bmi      pointprob
  1077. 1$ rts
  1078. ..qnd
  1079.    movem.l  D2/D3,-(SP)
  1080.    bsr      xxlineto
  1081.    movem.l  (SP)+,D2/D3
  1082.    rts
  1083.  
  1084. qaend
  1085.    move.l   D2,D4
  1086.    or.l     D3,D4
  1087.    beq      ..qnd
  1088.    tst.b    strokepathflag
  1089.    bne      1$
  1090.    graphics AreaEnd
  1091. 1$ rts
  1092.  
  1093.  
  1094. dolinecaps
  1095.    movem.l  D5/D6,-(SP)
  1096.    lea      a_linecap,A3
  1097.    tst.l    (A3)
  1098.    bmi      100$
  1099.    move.w   linecap,D0
  1100.    beq      100$
  1101.    cmp.b    #2,D0
  1102.    beq      100$     no round ones yet
  1103.  
  1104.    movem.l  (A3),D0-D5
  1105.    move.l   D4,D6
  1106.  
  1107.    bsr      onecap
  1108.    moveq    #-1,D0
  1109.    move.l   D0,(A3)     signal did it
  1110.  
  1111.    lea      b_linecap,A3
  1112.    movem.l  (A3),D0-D5
  1113.    move.l   D4,D6
  1114.  
  1115.    add.l    D5,D0
  1116.    sub.l    D4,D1
  1117.    movem.l  D0/D1,(A3)
  1118.    bsr      onecap
  1119.  
  1120. 100$
  1121.    movem.l  (SP)+,D5/D6
  1122.    rts
  1123.  
  1124.  
  1125. onecap
  1126.  
  1127.    movem.l  (A3),D0-D3
  1128.    sub.l    D2,D0
  1129.    sub.l    D5,D0
  1130.  
  1131.    sub.l    D3,D1
  1132.    add.l    D6,D1
  1133.  
  1134.    movem.l  D0/D1,-(SP)
  1135.    bsr      qamove
  1136.  
  1137.    movem.l  (A3),D0-D3
  1138.    sub.l    D2,D0
  1139.    sub.l    D3,D1
  1140.    bsr      qadraw
  1141.  
  1142.    movem.l  (A3),D0-D3
  1143.    add.l    D2,D0
  1144.    add.l    D3,D1
  1145.    bsr      qadraw
  1146.  
  1147.    movem.l  (A3),D0-D3
  1148.    add.l    D2,D0
  1149.    sub.l    D5,D0
  1150.    add.l    D3,D1
  1151.    add.l    D6,D1
  1152.    bsr      qadraw
  1153.  
  1154.    movem.l  (SP)+,D0/D1
  1155.    bsr      qadraw
  1156.  
  1157.    bra      qaend
  1158.  
  1159.  
  1160.  
  1161.   DEF    setlinecap
  1162.    bsr      popnum
  1163.    tst.l    D0
  1164.    bmi      type_mismatch
  1165.    cmp.l    #2,D0
  1166.    bgt      type_mismatch
  1167.    move.w   D0,linecap
  1168.    rts
  1169.  
  1170.   DEF    currentlinecap
  1171.    moveq    #0,D0
  1172.    move.w   linecap,D0
  1173.    RETURN   Integer
  1174.  
  1175.  
  1176.   DEF    setlinejoin
  1177.    bsr      popnum
  1178.    tst.l    D0
  1179.    bmi      type_mismatch
  1180.    cmp.l    #2,D0
  1181.    bgt      type_mismatch
  1182.    move.w   D0,linejoin
  1183.    rts
  1184.  
  1185.   DEF    currentlinejoin
  1186.    moveq    #0,D0
  1187.    move.w   linejoin,D0
  1188.    RETURN   Integer
  1189.  
  1190.  
  1191. arsource    dc.l  0,0,0,0
  1192. ardest      dc.l  0,0,0,0
  1193. deltayx     dc.l  0,0
  1194. buttremember   dc.l  0,0
  1195. ibuttremember  dc.l  0,0
  1196. buttbegin      dc.l  0,0
  1197. ibuttbegin     dc.l  0,0
  1198. a_linecap      dc.l  0,0,0,0,0,0
  1199. b_linecap      dc.l  0,0,0,0,0,0
  1200.  
  1201.  
  1202.  
  1203.   DEF    erasepage
  1204.    move.l   rastport,A1
  1205.    move.l   8(A1),-(SP)    save pattern
  1206.    moveq    #0,D0
  1207.    move.b   $19(A1),D0     save fgpen
  1208.    move.l   D0,-(SP)
  1209.    move.b   $1C(A1),D0     save draw mode
  1210.    move.l   D0,-(SP)
  1211.    lea      areasptrn,A0   solid pattern
  1212.    move.l   A0,8(A1)
  1213.  
  1214.    moveq    #0,D0
  1215.    graphics SetDrMd
  1216.  
  1217.    moveq    #0,D0
  1218.    graphics SetAPen
  1219.  
  1220.    moveq    #0,D0
  1221.    move.l   D0,D1
  1222.    move.l   #639,D2
  1223.    move.l   #MaxY,D3
  1224.  
  1225.    move.l   A1,-(SP)
  1226.    graphics RectFill
  1227.    move.l   (SP)+,A1
  1228.    move.l   (SP)+,D0       old mode
  1229.    move.l   (SP)+,D2       old fg pen
  1230.    move.l   (SP)+,8(A1)    old pattern
  1231.  
  1232.    graphics SetDrMd
  1233.    move.l   D2,D0
  1234.    graphics SetAPen
  1235.    rts
  1236.  
  1237. * above substituted for following, since system
  1238. * was corrupted by ClearScreen
  1239. *   lea      $24(A1),A2
  1240. *   move.l   (A2),-(SP)     save currentpoint
  1241. *   clr.l    (A2)           home
  1242. *   graphics ClearScreen
  1243. *   move.l   (SP)+,(A2)
  1244. *   rts
  1245.  
  1246.   DEF    pencolor
  1247.    bsr      popnum
  1248.    moveq    #PenMask,D1
  1249.    and.l    D1,D0
  1250.    graphics SetAPen
  1251.    rts
  1252.  
  1253.   DEF    penbcolor
  1254.    bsr      popnum
  1255.    moveq    #PenMask,D1
  1256.    and.l    D1,D0
  1257.    graphics SetBPen
  1258.    rts
  1259.  
  1260.   DEF    penmode
  1261.    bsr      popnum
  1262.    graphics SetDrMd
  1263.    rts
  1264.  
  1265.   DEF    penpattern
  1266.    bsr      popnum
  1267.    move.l   rastport,A1
  1268.    move.w   D0,$22(A1)
  1269.    rts
  1270.  
  1271.   DEF    box
  1272.    bsr      popxy
  1273.    bsr      newpoint
  1274.    movem.l  D0/D1,-(SP)
  1275.    bsr      popxy
  1276.    bsr      newpoint
  1277.    movem.l  (SP)+,D2/D3
  1278.  
  1279.    cmp.l    D2,D0
  1280.    bls      1$
  1281.    exg      D0,D2
  1282. 1$ cmp.l    D3,D1
  1283.    bls      2$
  1284.    exg      D1,D3
  1285. 2$
  1286.    graphics RectFill
  1287.    rts
  1288.  
  1289.  
  1290.   DEF    currentrgbcolor
  1291.    move.l   viewport,A0
  1292.    move.l   4(A0),A0       colormap
  1293.    move.l   rastport,A1
  1294.    moveq    #0,D0
  1295.    move.b   $19(A1),D0
  1296.    graphics GetRGB4
  1297.    move.l   D0,D3
  1298.    move.w   #Integer,D2
  1299.    moveq    #%1111,D1
  1300.    lsr      #8,D0
  1301.    and.l    D1,D0
  1302.    bsr      r.ipush
  1303.    move.l   D3,D0
  1304.    lsr      #4,D0
  1305.    and.l    D1,D0
  1306.    bsr      r.ipush
  1307.    move.l   D3,D0
  1308.    and.l    D1,D0
  1309.    bra      r.ipush
  1310.  
  1311.   DEF    setrgbcolor
  1312.    bsr      popnum
  1313.    move.l   D0,D3
  1314.    bsr      popnum
  1315.    move.l   D0,D4
  1316.    bsr      popnum
  1317.    move.l   D0,D1
  1318.    move.l   D4,D2
  1319.  
  1320.    move.l   viewport,A0
  1321.    move.l   rastport,A1
  1322.  
  1323.    moveq    #0,D0
  1324.    move.b   $19(A1),D0
  1325.    graphics SetRGB4
  1326.    rts
  1327.  
  1328.   DEF    findfont
  1329.    bsr      ipop
  1330.    move.l   D0,A1
  1331.    cmp.w    #Name,D2
  1332.    beq      1$
  1333.    cmp.w    #String,D2
  1334.    bne      type_mismatch
  1335.    move.b   (A1)+,D0
  1336.    bne      2$
  1337. 1$ lea      fontdirectory,A2
  1338.    bsr      dictsearch
  1339.    tst.l    D2
  1340.    bmi      3$
  1341.   RETURN    FontID
  1342. 2$ ERR      big_key
  1343. 3$ ERR      no_font
  1344.  
  1345.   DEF    scalefont
  1346.    bsr      ipop
  1347.    move.l   D0,D1
  1348.    move.w   D2,D3
  1349.   ARG    FontID
  1350.    move.l   D0,-(SP)
  1351.    move.w   #FontID,D2
  1352.    bsr      r.ipush
  1353.    move.l   D1,D0
  1354.    move.w   D3,D2
  1355.    bsr      r.ipush
  1356.  
  1357.    move.l   (SP)+,A0
  1358.    tst.w    (A0)
  1359.    bmi      _scaleg
  1360.  
  1361.    move.l   A0,-(SP)
  1362.    bsr      popnum
  1363.    move.l   (SP)+,A0
  1364.    move.w   D0,(A0)
  1365.    rts
  1366.  
  1367.  
  1368.   DEF    setfont
  1369.   ARG    FontID
  1370. resetfont
  1371.    move.l   D0,A2
  1372.    move.l   D0,A1
  1373.    move.w   (A1)+,D0    scaled size
  1374.    bmi      setresfont
  1375.    move.l   A1,D2       save ptr font address
  1376.    move.l   (A1)+,A0    font address, if open, and A1->TAttr
  1377.    addq.l   #4,A1
  1378.    move.w   (A1),D1     size in TAttr
  1379.    cmp.w    D1,D0
  1380.    beq      1$          req. size same as known size?
  1381.    move.w   D0,(A1)
  1382.    bra      2$          have to ask for new size
  1383. 1$ move.l   A0,D0       already open?
  1384.    bne      4$          if so, use it
  1385. * correct font and size not known
  1386. * first see if it's on list of resident fonts
  1387. 2$ lea      6(A2),A0    TAttr for following call
  1388.    graphics OpenFont
  1389.    tst.l    D0
  1390.    beq      20$         if was not found, try on disk
  1391.  
  1392.    move.l   D0,A0       for SetFont call
  1393.    move.l   D0,2(A2)    may as well keep address, even if wrong size
  1394.    move.w   $14(A0),D0  size of font found
  1395.    cmp.w    (A2),D0     same as scaled value?
  1396.    beq      4$          if so, go use it
  1397.  
  1398. 20$
  1399. * well, maybe it's on disk
  1400.    bsr      opendflib   make sure diskfont lib is open
  1401.    tst.l    D0
  1402.    beq      3$          no diskfont lib
  1403.  
  1404.    move.l   A6,-(SP)
  1405.    move.l   D0,A6       diskfontbase
  1406.    lea      6(A2),A0    TAttr
  1407.    jsr      -$1E(A6)    OpenDiskFont
  1408.    move.l   (SP)+,A6
  1409.  
  1410.    move.l   D0,A0
  1411.    tst.l    D0
  1412.    bne      4$          got it?
  1413. 3$ print    no_font     alternatives exhausted
  1414.    bra      reinterp
  1415. 4$ sf       resfontflag
  1416.    move.l   A0,2(A2)    save font address
  1417.    move.l   A2,currfont for currentfont operator
  1418.    graphics SetFont
  1419.    rts
  1420.  
  1421.  
  1422. setresfont
  1423.    st       resfontflag
  1424.    move.l   A2,currfont
  1425.    rts
  1426.  
  1427.   DEF    currentfont
  1428.    move.l   currfont,D0
  1429.   RETURN    FontID
  1430.  
  1431.    xdef     currfont
  1432. currfont    dc.l  _topaz
  1433.  
  1434. *******
  1435.  
  1436. opendflib
  1437.    move.l   diskfontbase,D0
  1438.    bne      1$
  1439.    move.l   A6,-(SP)
  1440.    move.l   4,A6
  1441.    lea      dflibname,A1
  1442.    moveq    #0,D0
  1443.    jsr      -$228(A6)
  1444.    move.l   D0,diskfontbase
  1445.    move.l   (SP)+,A6
  1446. 1$ rts
  1447.  
  1448. * not used yet
  1449. closedflib
  1450.    move.l   diskfontbase,D0
  1451.    beq      1$
  1452.    move.l   A6,-(SP)
  1453.    move.l   4,A6
  1454.    lea      dflibname,A1
  1455.    moveq    #0,D0
  1456.    jsr      -$19E(A6)
  1457.    moveq    #0,D0
  1458.    move.l   D0,diskfontbase
  1459.    move.l   (SP)+,A6
  1460. 1$ rts
  1461.  
  1462.  
  1463.    section  gdata,data
  1464.  
  1465.  
  1466. diskfontbase   dc.l  0
  1467. dflibname      dc.b  'diskfont.library',0
  1468. resfontflag    dc.b  0
  1469.                cnop  0,2
  1470.  
  1471. newfont  macro
  1472. _\1      dc.w  \2
  1473.          dc.l  0
  1474.          dc.l  1$
  1475.          dc.w  \2
  1476.          dc.b  0
  1477.          dc.b  %01100011
  1478. 1$       dc.b  '\1.font',0
  1479.          cnop  0,2
  1480.       endm
  1481.  
  1482.       newfont  topaz,8
  1483.       newfont  diamond,12
  1484.       newfont  ruby,12
  1485.       newfont  opal,11
  1486.       newfont  sapphire,19
  1487.       newfont  garnet,16
  1488.       newfont  emerald,20
  1489.  
  1490. _simplex    dc.w  $FFFF
  1491.             dc.w  Real
  1492.             dc.l  OnePoint
  1493.  
  1494. fentry   macro
  1495.          dc.l  .\1
  1496.          dc.w  FontID
  1497.          dc.l  _\1
  1498.          endm
  1499.  
  1500. nentry   macro
  1501. .\1      dc.b  1$-*-1
  1502.          dc.b  '\1'
  1503. 1$
  1504.          endm
  1505.  
  1506. fontdirectory
  1507.    fentry   topaz
  1508.    fentry   diamond
  1509.    fentry   ruby
  1510.    fentry   opal
  1511.    fentry   sapphire
  1512.    fentry   garnet
  1513.    fentry   emerald
  1514.    fentry   simplex
  1515.  
  1516.    dc.l     0
  1517.  
  1518. fontnames
  1519.    nentry   topaz
  1520.    nentry   diamond
  1521.    nentry   ruby
  1522.    nentry   opal
  1523.    nentry   sapphire
  1524.    nentry   garnet
  1525.    nentry   emerald
  1526.    nentry   simplex
  1527.  
  1528.    bstr     no_font,<can''t find font>
  1529.    bstr     big_key,<key too long>
  1530.    bstr     psov,<gsave overflow>
  1531.    bstr     psuv,<grestore underflow>
  1532.    bstr     pntsov,<too many points in path>
  1533.    bstr     out01,<arg outside 0...1 interval>
  1534.  
  1535.    cnop     0,2
  1536.  
  1537. linecap     dc.w  1     0=butt, 1=round, 2=projecting square
  1538. linejoin    dc.w  0
  1539.  
  1540. graylevel   dc.l  0
  1541.  
  1542. areasptrn
  1543.             dc.w  %1111111111111111
  1544.             dc.w  %1111111111111111
  1545.             dc.w  %1111111111111111
  1546.             dc.w  %1111111111111111
  1547.  
  1548. areaptrn
  1549.             dc.w  %0111011101110111
  1550.             dc.w  %1101110111011101
  1551.             dc.w  %0111011101110111
  1552.             dc.w  %1101110111011101
  1553.  
  1554.             dc.w  %0101010101010101
  1555.             dc.w  %1010101010101010
  1556.             dc.w  %0101010101010101
  1557.             dc.w  %1010101010101010
  1558.  
  1559.             dc.w  %0001000100010001
  1560.             dc.w  %0100010001000100
  1561.             dc.w  %0001000100010001
  1562.             dc.w  %0100010001000100
  1563.  
  1564.             dc.w  0,0,0,0
  1565.  
  1566.    xdef  strokepathflag
  1567. strokepathflag    dc.w  0
  1568.  
  1569.    section  groom,bss
  1570.  
  1571. pstackcnt   ds.w  1
  1572. pstack      ds.l  1
  1573.             ds.b  18*PstackSize
  1574. pstacktop   ds.w  1
  1575.             ds.l  1
  1576.  
  1577.  
  1578. pointcnt    ds.w  1
  1579. nextpoint   ds.l  1
  1580.  
  1581. tmpras      ds.l  2
  1582. areainfo    ds.l  4
  1583.             ds.w  4
  1584.  
  1585. areabuffer  ds.b  5*AreaSize
  1586.  
  1587. pathbuffer  ds.b  10*AreaSize
  1588.  
  1589.    end
  1590.  
  1591.