lee@uhccux.UUCP (Greg Lee) (08/28/87)
# This is a shell archive. Remove anything before this line # then unpack it by saving it in a file and typing "sh file" # (Files unpacked will be owned by you and have default permissions). # This archive contains the following files: # ./gothic-g # ./graphics.a # ./letters # ./lmath.a # ./palette # ./prg # ./ps.a # if `test ! -s ./gothic-g` then echo "writing ./gothic-g" sed 's/^X//' > ./gothic-g << '\Rogue\Monster\' X X2 pencolor Xsave X/gg { X -5 3 moveto -5 -6 lineto -7 -7 lineto -6 -7 lineto X -4 -8 lineto -3 -9 lineto -2 -8 lineto 0 -7 lineto X 3 -6 lineto X X -4 2 moveto -4 -7 lineto -2 -8 lineto X X -3 3 moveto -3 -6 lineto -1 -7 lineto 0 -7 lineto X X -5 3 moveto -3 3 lineto 0 4 lineto 2 5 lineto 3 4 lineto X 5 3 lineto 7 3 lineto 5 2 lineto 5 -10 lineto X 4 -13 lineto 2 -15 lineto 0 -16 lineto -1 -15 lineto X -3 -14 lineto -5 -14 lineto X X 1 4 moveto 4 2 lineto 4 -10 lineto X X 1 -15 moveto -1 -14 lineto -2 -14 lineto X X 0 4 moveto 1 3 lineto 3 2 lineto 3 -8 lineto X 4 -11 lineto 4 -13 lineto X X 2 -15 moveto 1 -14 lineto -1 -13 lineto -3 -13 lineto X -5 -14 lineto X X } def X X50 180 translate X X gg stroke X X10 { X 50 0 translate 1.2 1.2 scale gg stroke X } repeat X Xrestore X \Rogue\Monster\ else echo "will not over write ./gothic-g" fi if [ `wc -c ./gothic-g | awk '{printf $1}'` -ne 786 ] then echo `wc -c ./gothic-g | awk '{print "Got " $1 ", Expected " 786}'` fi if `test ! -s ./graphics.a` then echo "writing ./graphics.a" sed 's/^X//' > ./graphics.a << '\Rogue\Monster\' X X xref graphicsbase X xref rastport X xref viewport X xref type_mismatch X xref msg X xref reinterp X X xref ipop X xref r.ipush X xref popnum X xref dictsearch X X xref popxy,poprxy X xref _showg,_scaleg,_lengthg X xref xadvance X X xref checklwidth,xywidth X X section one X X include "ps.h" X X X lref ClearScreen,4 X lref TextLength,5 X lref Text,6 X lref SetFont,7 X lref OpenFont,8 X lref CloseFont,9 X lref Move,36 X lref Draw,37 X lref AreaMove,38 X lref AreaDraw,39 X lref AreaEnd,40 X lref InitArea,43 X lref SetRGB4,44 X lref RectFill,47 X lref WritePixel,50 X lref Flood,51 X lref SetAPen,53 X lref SetBPen,54 X lref SetDrMd,55 X lref InitTmpRas,74 X lref AllocRaster,78 X lref FreeRaster,79 X lref GetRGB4,93 X X Xgraphics macro X move.l A6,-(SP) X move.l graphicsbase,A6 X move.l rastport,A1 X jsr _LVO\1(A6) X move.l (SP)+,A6 X endm X Xgraph macro X move.l A6,-(SP) X move.l graphicsbase,A6 X jsr _LVO\1(A6) X move.l (SP)+,A6 X endm X X X X xref mathffpbase 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 Xmathb macro X move.l mathffpbase,A6 X endm X Xmaths macro X jsr _LVO\1(A6) X endm 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 XAreaSize equ 500 X XPenMask equ NumColors-1 X ifne HiRes XMaxY equ 399 X endc X ifeq HiRes XMaxY equ 199 X endc X X************************* X X xdef initgr Xinitgr X move.l rastport,A1 X X move.l #640,D0 X move.l #MaxY+1,D1 X move.l A1,-(SP) X graph AllocRaster X move.l D0,rasterpt X X move.l (SP),A1 X lea tmpras,A0 X move.l A0,$0C(A1) X move.l D0,A1 X move.l #640*(MaxY+1),D0 X graph InitTmpRas X X move.l (SP)+,A1 X lea areasptrn,A0 X move.l A0,$08(A1) X move.b #2,$1D(A1) 4 words X X lea areainfo,A0 X move.l A0,$10(A1) X lea areabuffer,A1 X move.l #AreaSize,D0 X graph InitArea X X lea pstacktop,A0 X move.l A0,pstack X clr.w pstackcnt X clr.w (A0)+ X lea pathbuffer,A1 X move.l A1,(A0) X clr.w pointcnt X move.l A1,nextpoint X X moveq #1,D0 X graphics SetAPen X moveq #0,D0 X graphics SetBPen X moveq #1,D0 X graphics SetDrMd X X rts X X X xdef endgr Xendgr X move.l rasterpt,A0 X move.l #640,D0 X move.l #MaxY+1,D1 X graphics FreeRaster X move.l rastport,A1 X clr.l $08(A1) X clr.l $0C(A1) X clr.l $10(A1) X rts X Xrasterpt dc.l 0 X X X X DEF stringwidth X move.b resfontflag,D0 X bne _lengthg X ARG String X move.l D0,A0 X moveq #0,D0 X move.w (A0)+,D0 X graphics TextLength X math SPFlt dx X move.w #Real,D2 X bsr r.ipush X moveq #0,D0 dy = 0 X bra r.ipush X X X DEF show X ARG String X move.l D0,-(SP) X bsr movehere X move.l (SP)+,D0 X X move.l D0,A0 X move.b resfontflag,D0 X bne showresfont X X movem.l currdevpoint,D0/D1 X graphics Move X X move.l rastport,A1 X move.w $24(A1),-(SP) X moveq #0,D0 X move.w (A0)+,D0 X graphics Text X move.l rastport,A1 X moveq #0,D0 X move.w $24(A1),D0 X move.w (SP)+,D1 X sub.w D1,D0 X bsr xadvance X movem.l D0-D3,bpath X movem.l D0-D3,currdevpoint X rts X Xshowresfont X move.l A0,D0 X move.w #String,D2 X bsr r.ipush X bra _showg X Xnewpoint X moveq #0,D4 X move.w #MaxY,D4 X cmp.l D4,D1 X ble 1$ X move.l D4,D1 X1$ tst.l D1 X bpl 2$ X clr.l D1 X2$ move.w #639,D4 X cmp.l D4,D0 X ble 3$ X move.l D4,D0 X3$ tst.l D0 X bpl 4$ X clr.l D0 X4$ rts X X DEF newpath X move.l pstack,A0 X move.w (A0)+,pointcnt X move.l (A0),nextpoint X move.b #0,strokepathflag X rts X X xdef ggsave Xggsave X lea pstackcnt,A0 X cmp.w #PstackSize,(A0) X beq 1$ X addq.w #1,(A0) X move.l pstack,A0 X move.l currfont,-(A0) X move.l graylevel,-(A0) X move.l linecap,-(A0) X move.l nextpoint,-(A0) must be pushed next last X move.w pointcnt,-(A0) must be pushed last X move.l A0,pstack X rts X1$ ERR psov X X xdef ggrestore Xggrestore X lea pstackcnt,A0 X tst.w (A0) X beq 1$ X subq.w #1,(A0) X move.l pstack,A0 X move.w (A0)+,pointcnt X move.l (A0)+,nextpoint X move.l (A0)+,linecap X move.l (A0)+,D0 X move.l (A0)+,currfont X move.l A0,pstack X bsr resetgray X move.l currfont,D0 X bra resetfont X1$ ERR psuv X X X Xc_moveto equ 1 Xc_lineto equ 2 Xc_closepath equ 3 X Xappendpoint X lea pointcnt,A0 X cmp.w #AreaSize,(A0) X beq pointprob X addq.w #1,(A0) X move.l nextpoint,A0 X move.w D0,(A0)+ X move.l D2,(A0)+ X move.l D3,(A0)+ X move.l A0,nextpoint X rts Xpointprob X ERR pntsov X X DEF rmoveto X bsr poprxy X bra ymoveto X X DEF moveto X bsr popxy X xdef ymoveto Xymoveto X movem.l D0-D3,bpath X movem.l D0-D3,currdevpoint X moveq #c_moveto,D0 X bra appendpoint X Xmovehere X movem.l currdevpoint,D0-D3 X X xdef xmoveto Xxmoveto X bsr newpoint X movem.l D0-D3,bpath X movem.l D0-D3,currdevpoint X graphics Move X rts X X DEF rlineto X bsr poprxy X bra ylineto X X X DEF lineto X bsr popxy X xdef ylineto Xylineto X tst.w pointcnt X bne 1$ X movem.l D0-D3,-(SP) X movem.l currdevpoint,D0-D3 X bsr ymoveto X movem.l (SP)+,D0-D3 X1$ X movem.l D0-D3,currdevpoint X moveq #c_lineto,D0 X bra appendpoint X X xdef xclosepath Xxclosepath X movem.l bpath,D0-D3 X movem.l D0-D3,currdevpoint X X xdef xlineto Xxlineto X bsr arlineto X beq xxlineto X rts Xxxlineto X bsr newpoint X graphics Draw X rts X X DEF closepath X movem.l bpath,D0-D3 X movem.l D0-D3,currdevpoint X moveq #c_closepath,D0 X bra appendpoint X X X DEF pixel X* graphics WritePixel X* rts X bsr movehere X move.l rastport,A1 X move.l 4(A1),A0 A0 -> bitmap X move.w $26(A1),D1 D1 = cp_y X mulu (A0),D1 cp_y * bytes per row X moveq #0,D0 X move.w $24(A1),D0 cp_x X move.l D0,D2 X lsr.l #3,D0 byte offset for x X add.l D0,D1 byte address of pixel X and.l #7,D2 bit offset X moveq #7,D0 X sub D2,D0 X move.b $19(A1),D3 pen color X X move.l 8(A0),A1 base address of first screen X btst #0,D3 X beq 1$ X bsr 2$ X1$ move.l 12(A0),A1 base address of second screen X btst #1,D3 X beq 3$ X2$ add.l D1,A1 X bset D0,(A1) X3$ rts X X**debug X ifd DEBUG2 XpushA0 X movem.l D0-D7/A1-A6,-(SP) X move.l A0,D0 X move.w #Integer,D2 X bsr r.ipush X movem.l (SP)+,D0-D7/A1-A6 X rts X endc X Xxpixel X**debug X ifd DEBUG2 X move.l D0,A0 X bsr pushA0 X move.l D1,A0 X bsr pushA0 X move.l D2,A0 X bsr pushA0 X endc X X tst.b D2 X beq 3$ X tst.l D1 X bmi 3$ X tst.l D0 X bmi 3$ X cmp.l #639,D0 X bhi 3$ X cmp.l #MaxY,D1 X bhi 3$ X X mulu (A5),D1 cp_y * bytes per row X move.l D2,A1 save pencolor X move.l D0,D2 X lsr.l #3,D0 byte offset for x X add.l D0,D1 byte address of pixel X and.l #7,D2 bit offset X moveq #7,D0 X sub D2,D0 X move.l A1,D2 pen color X X move.l 8(A5),A1 base address of first screen X btst #0,D2 X beq 1$ X bsr 2$ X1$ move.l 12(A5),A1 base address of second screen X btst #1,D2 X X ifne HiRes X beq 10$ X bsr 2$ X10$ X move.l 16(A5),A1 X btst #2,D2 X endc X X beq 3$ X2$ add.l D1,A1 X bset D0,(A1) X3$ rts X X X Xarlineto X movem.l oldx,A0/A1 starting real coord X movem.l D2/D3,oldx ending real coord - save for next time X tst.l vint X beq 900$ 0 vint means use Amiga line drawer X* now draw antirasterized line from (A0,A1) to (D2,D3) X* (y-axis is still inverted) X movem.l D5-D7/A2-A6,-(SP) X* D2,D3,A0,A1,A6 X move.l A0,D4 X move.l A1,D5 X* update cp X graphics Move X* set A6 for short math calls X mathb X X* D2(ex),D3(ey),D4(sx),D5(sy),A6(mbase) X X move.l D5,D0 X move.l D3,D1 X maths SPCmp X bcs 4$ X exg D2,D4 X exg D3,D5 X4$ X X move.l D2,D0 X move.l D4,D1 X maths SPSub ex - sx X move.l D0,D6 X X move.l D3,D0 X move.l D5,D1 X maths SPSub ey - sy X move.l D0,D7 X X* D2(ex),D3(ey),D4(sx),D5(sy),D6(dx),D7(dy) X X* move.l D7,D0 X and.b #$7F,D0 X move.l D6,D1 X and.b #$7F,D1 X maths SPCmp if abs(dy) >= abs(dx), exchange X bcs 10$ X exg D2,D3 X exg D4,D5 X exg D6,D7 X moveq #-1,D3 set exchange flag X bra 11$ X10$ X moveq #0,D3 X11$ X X move.l D4,D0 X move.l #PointFive,D1 X maths SPAdd X maths SPFix X move.l D0,A2 A2 = rx = round(sx) X* D2(ex),D3(flag),D4(sx),D5(sy),D6(dx),D7(dy) X* A2(rx),A4(abs dx) X X X X* move.l A2,D0 count = trunc(abs(ex - rx)) + 1 X maths SPFlt X move.l D0,D1 X move.l D2,D0 X maths SPSub ex - flt(rx) X and.b #$7F,D0 X* round not in original X move.l #PointFive,D1 X maths SPAdd X maths SPFix X addq.l #1,D0 X move.l D0,A4 X X move.l D3,D2 move flag X X move.l D7,D0 X move.l D6,D1 X beq 800$ X maths SPDiv X move.l D0,A5 A5 = slope = (ey - sy)/(ex - sx) X* D2(flag),D3(n.u.),D4(sx),D5(sy),D6(dx),D7(dy),A2(rx),A4(cnt),A5(slope),A6 X X move.l A2,D0 X maths SPFlt X move.l D4,D1 X maths SPSub rx - sx X move.l A5,D1 X maths SPMul times slope X* abs ?? X move.l D5,D1 X maths SPAdd plus sy X move.l D0,D3 D3 = aux X X* round ?? X maths SPFix X move.l D0,A3 A3 = ry X X move.l A5,D0 X and.b #$7F,D0 X move.l vint,D5 X move.l D5,D1 X maths SPMul X move.l D0,D4 D4 = dint = abs(slope) * vint X* D2(flag),D3(aux),D4(dint),D5(vint),D6(dx),D7(dy) X* A2(rx),A3(ry),A4(cnt),A5(n.u.),A6 X X move.l A3,D0 X maths SPFlt X move.l D0,D1 X move.l D3,D0 X maths SPSub aux - ry X move.l D5,D1 X maths SPMul times vint X move.l D0,D3 D3 = lint X* D2(flag),D3(lint),D4(dint),D5(vint),D6(dx),D7(dy) X* A2(rx),A3(ry),A4(cnt),A5(n.u.),A6 X X tst.w D2 X bpl 20$ X exg A2,A3 X exg D6,D7 X20$ X X move.l D6,D1 dx -> +-1 X moveq #0,D0 X maths SPCmp X bne 22$ X moveq #1,D0 X22$ X move.l D0,D6 X X* move.l D7,D0 dy -> -+1 X* moveq #0,D1 X* maths SPCmp X* bne 24$ X* moveq #-1,D0 X*24$ X* move.l D0,D7 X X move.l rastport,A0 X move.l 4(A0),A5 bitmap X X move.l #MaxY,D0 uninvert y-axis X move.l A3,D1 X sub.l D1,D0 X move.l D0,A3 X X X* D0 (pass x) X* D1 (pass y) X* D2 flag dy > dx and pass pencolor X* D3 lint X* D4 dint X* D5 vint X* D6 sign dx X*** D7 sign dy (n.u. now) X* A0 X* A1 (temp) X* A2 rx X* A3 ry X* A4 cnt X* A5 bitmap X* A6 mathffpbase X X**debug X ifd DEBUG1 X move.l A4,SAVECNT X move.l A2,SAVERX X move.l A3,SAVERY X move.l D6,SAVESDX X move.l D7,SAVESDY X move.l D3,SAVELINT X move.l D4,SAVEDINT X endc X X100$ X subq.l #1,A4 X move.l A4,D0 X bmi 800$ X X swap D2 save exchange flag X X move.l D5,D0 X move.l D3,D1 X maths SPSub vint - lint X bsr pixreg X X bsr xpixel pixel(rx,ry,rint) X X move.l D3,D0 X bsr pixreg X X swap D2 X tst.w D2 X bpl 110$ X add.l D6,D0 lx = rx + 1 X bra 111$ X110$ X* add.l D7,D1 ly = ry + 1 X subq.l #1,D1 X111$ X swap D2 X X bsr xpixel pixel(lx,ly,lint) X X swap D2 X X move.l D3,D0 X move.l D4,D1 X maths SPAdd X move.l D0,D3 lint = lint + dint X X move.l D5,D1 X maths SPCmp X bcs 200$ not if lint < vint X X tst.w D2 X bmi 120$ X* add.l D7,A3 ry = ry + sign(dy) X subq.l #1,A3 X bra 130$ X120$ X add.l D6,A2 rx = rx + sign(dx) X130$ X X X move.l D3,D0 X move.l D5,D1 X maths SPSub X move.l D0,D3 lint = lint - vint X X200$ X tst.w D2 X bmi 220$ X add.l D6,A2 rx = rx + 1 X bra 100$ X220$ X* add.l D7,A3 X subq.l #1,A3 X bra 100$ X X X800$ X movem.l (SP)+,D5-D7/A2-A6 X X**debug X ifd DEBUG1 X move.w #Integer,D2 X move.l SAVECNT,D0 X bsr r.ipush X move.l SAVERX,D0 X bsr r.ipush X move.l SAVERY,D0 X bsr r.ipush X move.l SAVESDX,D0 X bsr r.ipush X move.l SAVESDY,D0 X bsr r.ipush X move.w #Real,D2 X move.l SAVELINT,D0 X bsr r.ipush X move.l SAVEDINT,D0 X bsr r.ipush X endc X X moveq #1,D0 signal line is drawn X900$ X rts X X**debug X ifd DEBUG1 XSAVECNT dc.l 0 XSAVERX dc.l 0 XSAVERY dc.l 0 XSAVESDX dc.l 0 XSAVESDY dc.l 0 XSAVELINT dc.l 0 XSAVEDINT dc.l 0 X endc X Xpixreg X move.l #FourPoint,D1 X maths SPMul X maths SPFix X cmp.b #4,D0 X bne 2$ X moveq #3,D0 X2$ move.w D0,D2 X move.l A2,D0 X move.l A3,D1 X* tst.l D7 X* bmi 1$ X* addq.l #1,D1 X1$ rts X X X DEF greyline X bsr pop01 X move.l D0,vint X rts X Xpop01 X bsr ipop X move.l #OnePoint,D1 X cmp.w #Real,D2 X beq 1$ X cmp.w #Integer,D2 X bne type_mismatch X tst.l D0 X beq 2$ X subq.l #1,D0 X bne range01 X move.l D1,D0 X1$ tst.b D0 X bmi range01 X move.l D0,D2 X math SPCmp X bgt range01 X move.l D2,D0 X2$ rts X Xrange01 X ERR out01 X Xvint dc.l 0 Xbpath dc.l 0,0 Xoldx dc.l 0,0 Xcurrdevpoint dc.l 0,0,0,0 X X DEF currentgray X move.l graylevel,D0 X RETURN Real X X X DEF setgray X bsr pop01 Xresetgray X move.l D0,graylevel X lea areasptrn,A0 X tst.l D0 X beq 2$ X move.l #FourPoint,D1 X math SPMul X math SPFix X moveq #3,D1 X cmp.l D1,D0 X bls 1$ X move.l D1,D0 X1$ add.l D0,D0 X add.l D0,D0 X add.l D0,D0 X lea areaptrn,A0 X add.l D0,A0 X2$ move.l rastport,A1 X move.l A0,8(A1) X rts X X X DEF flood X bsr popxy X bsr newpoint X moveq #0,D2 X move.l rastport,A1 X move.b $19(A1),$1B(A1) X graphics Flood X rts X X DEF fill X lea strokepathflag,A0 X move.b (A0),D0 X move.b #0,(A0) X tst.b D0 X bne _stroke X moveq #-1,D0 X bra ..strk X X DEF strokepath X move.b #1,strokepathflag X rts X X DEF stroke X moveq #0,D0 X bsr checklwidth does line have width? X..strk X movem.l D5-D7/A2-A4,-(SP) X move.l D0,D7 X X moveq #-1,D0 X move.l D0,buttremember X move.l D0,ibuttremember X move.l D0,buttbegin X move.l D0,ibuttbegin X move.l D0,a_linecap X X move.l pstack,A0 X move.w (A0)+,D0 pointcount at last newpath X move.l (A0),A2 nextpoint at last newpath X X move.w pointcnt,D5 X sub.w D0,D5 X* lea pathbuffer,A2 X X1$ subq.w #1,D5 X bmi 100$ X move.w (A2)+,D6 X move.l (A2)+,D2 X move.l D2,D0 X math SPFix X move.l D0,A3 X X move.l (A2)+,D3 X move.l D3,D0 X math SPFix X move.l #MaxY,D1 X sub.l D0,D1 X move.l A3,D0 X X tst.l D7 X bmi 4$ X bne 6$ X cmp.b #c_moveto,D6 X bne 2$ X bsr xmoveto X bra 1$ X2$ X* cmp.b #c_lineto,D6 X* bne 1$ X bsr xlineto X3$ bra 1$ X X4$ cmp.b #c_moveto,D6 X bne 5$ X graphics AreaMove X bra 1$ X5$ X* cmp.b #c_lineto,D6 X* bne 1$ X graphics AreaDraw X bra 1$ X X6$ cmp.b #c_moveto,D6 X bne 7$ X movem.l D0-D3,arsource X X* put caps on ends of last subpath X bsr dolinecaps X X moveq #-1,D0 X move.l D0,buttremember X move.l D0,ibuttremember X move.l D0,buttbegin X move.l D0,ibuttbegin X move.l D0,a_linecap X bra 1$ X X* draw thick stroke by filling X7$ X* cmp.b #c_lineto,D6 X* bne 1$ X lea ardest,A4 X movem.l D0-D3,(A4) X lea arsource,A3 X X* sub.l (A3),D0 X* bpl 71$ X* neg.l D0 X*71$ X* sub.l 4(A3),D1 X* bpl 72$ X* neg.l D1 X*72$ X* add.l D1,D0 X* cmp.l #4,D0 X* blt 1$ X X* rmath routine calculates sides of right triangle whose X* hypotenuse is perpendicular to this stroke and is X* 1/2 linewidth in length -- returns x-side in D2, y-side in D3 X* also y in D0, x in D1 in device coordinates for x and y axes, resp. X bsr xywidth X movem.l D0/D1,deltayx X movem.l buttremember,D0/D1 X tst.l D0 X bpl 8$ X* 1st corner at beginning of subpath X movem.l (A3),D0/D1 X X lea a_linecap,A0 X movem.l D0-D3,(A0) X movem.l deltayx,D0/D1 X movem.l D0/D1,16(A0) X movem.l (A0),D0/D1 X X sub.l D2,D0 X sub.l D3,D1 X movem.l D0/D1,buttbegin X8$ movem.l D0/D1,-(SP) save to close rectangle at end X bsr qamove X X move.l buttremember,D0 X bmi 9$ X* connect 2nd corner of last stroke to 1st corner of this one X movem.l (A3),D0/D1 X sub.l D2,D0 X sub.l D3,D1 X bsr qadraw X X9$ X* 2nd corner X movem.l (A4),D0/D1 X X lea b_linecap,A0 X movem.l D0-D3,(A0) X movem.l deltayx,D0/D1 X movem.l D0/D1,16(A0) X movem.l (A0),D0/D1 X X sub.l D2,D0 X sub.l D3,D1 X movem.l D0/D1,buttremember X bsr qadraw X X cmp.b #c_closepath,D6 X bne 10$ X* signal don't do linecaps X moveq #-1,D0 X move.l D0,a_linecap X X* connect 2nd corner to 1st corner of stroke at X* beginning of subpath X movem.l buttbegin,D0/D1 X tst.l D0 X bmi 10$ X bsr qadraw X movem.l ibuttbegin,D0/D1 X tst.l D0 X bmi 10$ X bsr qadraw X X10$ X* 3rd corner X movem.l ibuttremember,D0/D1 X movem.l D0/D1,-(SP) X X movem.l (A4),D0/D1 X add.l D2,D0 X add.l D3,D1 X movem.l D0/D1,ibuttremember X* may want move here instead of interior line X bsr qadraw X X* 4th corner X movem.l (A3),D0/D1 X add.l D2,D0 X add.l D3,D1 X lea ibuttbegin,A0 X tst.l (A0) X bpl 11$ X movem.l D0/D1,(A0) X11$ X bsr qadraw X X* connect 4th corner to 3rd corner of last stroke X movem.l (SP)+,D0/D1 X tst.l D0 X bmi 12$ X bsr qadraw X X12$ X* close rectangle X movem.l (SP)+,D0/D1 X bsr qadraw X X* fill it X bsr qaend X X movem.l (A4),D0-D3 this destination will be next source X movem.l D0-D3,(A3) X bra 1$ X X X100$ X bsr dolinecaps X move.l D7,D0 X movem.l (SP)+,D5-D7/A2-A4 X tst.l D0 X bpl _newpath X graphics AreaEnd X bra _newpath X X Xqamove X tst.b strokepathflag X bne 1$ X move.l D2,D4 X or.l D3,D4 X beq 1$ X graphics AreaMove X tst.l D0 X bmi pointprob X rts X1$ movem.l D2/D3,-(SP) X bsr xmoveto X movem.l (SP)+,D2/D3 X rts X Xqadraw X move.l D2,D4 X or.l D3,D4 X beq 1$ X tst.b strokepathflag X bne ..qnd X graphics AreaDraw X tst.l D0 X bmi pointprob X1$ rts X..qnd X movem.l D2/D3,-(SP) X bsr xxlineto X movem.l (SP)+,D2/D3 X rts X Xqaend X move.l D2,D4 X or.l D3,D4 X beq ..qnd X tst.b strokepathflag X bne 1$ X graphics AreaEnd X1$ rts X X Xdolinecaps X movem.l D5/D6,-(SP) X lea a_linecap,A3 X tst.l (A3) X bmi 100$ X move.w linecap,D0 X beq 100$ X cmp.b #2,D0 X beq 100$ no round ones yet X X movem.l (A3),D0-D5 X move.l D4,D6 X X bsr onecap X moveq #-1,D0 X move.l D0,(A3) signal did it X X lea b_linecap,A3 X movem.l (A3),D0-D5 X move.l D4,D6 X X add.l D5,D0 X sub.l D4,D1 X movem.l D0/D1,(A3) X bsr onecap X X100$ X movem.l (SP)+,D5/D6 X rts X X Xonecap X X movem.l (A3),D0-D3 X sub.l D2,D0 X sub.l D5,D0 X X sub.l D3,D1 X add.l D6,D1 X X movem.l D0/D1,-(SP) X bsr qamove X X movem.l (A3),D0-D3 X sub.l D2,D0 X sub.l D3,D1 X bsr qadraw X X movem.l (A3),D0-D3 X add.l D2,D0 X add.l D3,D1 X bsr qadraw X X movem.l (A3),D0-D3 X add.l D2,D0 X sub.l D5,D0 X add.l D3,D1 X add.l D6,D1 X bsr qadraw X X movem.l (SP)+,D0/D1 X bsr qadraw X X bra qaend X X X X DEF setlinecap X bsr popnum X tst.l D0 X bmi type_mismatch X cmp.l #2,D0 X bgt type_mismatch X move.w D0,linecap X rts X X DEF currentlinecap X moveq #0,D0 X move.w linecap,D0 X RETURN Integer X X X DEF setlinejoin X bsr popnum X tst.l D0 X bmi type_mismatch X cmp.l #2,D0 X bgt type_mismatch X move.w D0,linejoin X rts X X DEF currentlinejoin X moveq #0,D0 X move.w linejoin,D0 X RETURN Integer X X Xarsource dc.l 0,0,0,0 Xardest dc.l 0,0,0,0 Xdeltayx dc.l 0,0 Xbuttremember dc.l 0,0 Xibuttremember dc.l 0,0 Xbuttbegin dc.l 0,0 Xibuttbegin dc.l 0,0 Xa_linecap dc.l 0,0,0,0,0,0 Xb_linecap dc.l 0,0,0,0,0,0 X X X X DEF erasepage X move.l rastport,A1 X move.l 8(A1),-(SP) save pattern X moveq #0,D0 X move.b $19(A1),D0 save fgpen X move.l D0,-(SP) X move.b $1C(A1),D0 save draw mode X move.l D0,-(SP) X lea areasptrn,A0 solid pattern X move.l A0,8(A1) X X moveq #0,D0 X graphics SetDrMd X X moveq #0,D0 X graphics SetAPen X X moveq #0,D0 X move.l D0,D1 X move.l #639,D2 X move.l #MaxY,D3 X X move.l A1,-(SP) X graphics RectFill X move.l (SP)+,A1 X move.l (SP)+,D0 old mode X move.l (SP)+,D2 old fg pen X move.l (SP)+,8(A1) old pattern X X graphics SetDrMd X move.l D2,D0 X graphics SetAPen X rts X X* above substituted for following, since system X* was corrupted by ClearScreen X* lea $24(A1),A2 X* move.l (A2),-(SP) save currentpoint X* clr.l (A2) home X* graphics ClearScreen X* move.l (SP)+,(A2) X* rts X X DEF pencolor X bsr popnum X moveq #PenMask,D1 X and.l D1,D0 X graphics SetAPen X rts X X DEF penbcolor X bsr popnum X moveq #PenMask,D1 X and.l D1,D0 X graphics SetBPen X rts X X DEF penmode X bsr popnum X graphics SetDrMd X rts X X DEF penpattern X bsr popnum X move.l rastport,A1 X move.w D0,$22(A1) X rts X X DEF box X bsr popxy X bsr newpoint X movem.l D0/D1,-(SP) X bsr popxy X bsr newpoint X movem.l (SP)+,D2/D3 X X cmp.l D2,D0 X bls 1$ X exg D0,D2 X1$ cmp.l D3,D1 X bls 2$ X exg D1,D3 X2$ X graphics RectFill X rts X X X DEF currentrgbcolor X move.l viewport,A0 X move.l 4(A0),A0 colormap X move.l rastport,A1 X moveq #0,D0 X move.b $19(A1),D0 X graphics GetRGB4 X move.l D0,D3 X move.w #Integer,D2 X moveq #%1111,D1 X lsr #8,D0 X and.l D1,D0 X bsr r.ipush X move.l D3,D0 X lsr #4,D0 X and.l D1,D0 X bsr r.ipush X move.l D3,D0 X and.l D1,D0 X bra r.ipush X X DEF setrgbcolor X bsr popnum X move.l D0,D3 X bsr popnum X move.l D0,D4 X bsr popnum X move.l D0,D1 X move.l D4,D2 X X move.l viewport,A0 X move.l rastport,A1 X X moveq #0,D0 X move.b $19(A1),D0 X graphics SetRGB4 X rts X X DEF findfont X bsr ipop X move.l D0,A1 X cmp.w #Name,D2 X beq 1$ X cmp.w #String,D2 X bne type_mismatch X move.b (A1)+,D0 X bne 2$ X1$ lea fontdirectory,A2 X bsr dictsearch X tst.l D2 X bmi 3$ X RETURN FontID X2$ ERR big_key X3$ ERR no_font X X DEF scalefont X bsr ipop X move.l D0,D1 X move.w D2,D3 X ARG FontID X move.l D0,-(SP) X move.w #FontID,D2 X bsr r.ipush X move.l D1,D0 X move.w D3,D2 X bsr r.ipush X X move.l (SP)+,A0 X tst.w (A0) X bmi _scaleg X X move.l A0,-(SP) X bsr popnum X move.l (SP)+,A0 X move.w D0,(A0) X rts X X X DEF setfont X ARG FontID Xresetfont X move.l D0,A2 X move.l D0,A1 X move.w (A1)+,D0 scaled size X bmi setresfont X move.l A1,D2 save ptr font address X move.l (A1)+,A0 font address, if open, and A1->TAttr X addq.l #4,A1 X move.w (A1),D1 size in TAttr X cmp.w D1,D0 X beq 1$ req. size same as known size? X move.w D0,(A1) X bra 2$ have to ask for new size X1$ move.l A0,D0 already open? X bne 4$ if so, use it X* correct font and size not known X* first see if it's on list of resident fonts X2$ lea 6(A2),A0 TAttr for following call X graphics OpenFont X tst.l D0 X beq 20$ if was not found, try on disk X X move.l D0,A0 for SetFont call X move.l D0,2(A2) may as well keep address, even if wrong size X move.w $14(A0),D0 size of font found X cmp.w (A2),D0 same as scaled value? X beq 4$ if so, go use it X X20$ X* well, maybe it's on disk X bsr opendflib make sure diskfont lib is open X tst.l D0 X beq 3$ no diskfont lib X X move.l A6,-(SP) X move.l D0,A6 diskfontbase X lea 6(A2),A0 TAttr X jsr -$1E(A6) OpenDiskFont X move.l (SP)+,A6 X X move.l D0,A0 X tst.l D0 X bne 4$ got it? X3$ print no_font alternatives exhausted X bra reinterp X4$ sf resfontflag X move.l A0,2(A2) save font address X move.l A2,currfont for currentfont operator X graphics SetFont X rts X X Xsetresfont X st resfontflag X move.l A2,currfont X rts X X DEF currentfont X move.l currfont,D0 X RETURN FontID X X xdef currfont Xcurrfont dc.l _topaz X X******* X Xopendflib X move.l diskfontbase,D0 X bne 1$ X move.l A6,-(SP) X move.l 4,A6 X lea dflibname,A1 X moveq #0,D0 X jsr -$228(A6) X move.l D0,diskfontbase X move.l (SP)+,A6 X1$ rts X X* not used yet Xclosedflib X move.l diskfontbase,D0 X beq 1$ X move.l A6,-(SP) X move.l 4,A6 X lea dflibname,A1 X moveq #0,D0 X jsr -$19E(A6) X moveq #0,D0 X move.l D0,diskfontbase X move.l (SP)+,A6 X1$ rts X X X section gdata,data X X Xdiskfontbase dc.l 0 Xdflibname dc.b 'diskfont.library',0 Xresfontflag dc.b 0 X cnop 0,2 X Xnewfont macro X_\1 dc.w \2 X dc.l 0 X dc.l 1$ X dc.w \2 X dc.b 0 X dc.b %01100011 X1$ dc.b '\1.font',0 X cnop 0,2 X endm X X newfont topaz,8 X newfont diamond,12 X newfont ruby,12 X newfont opal,11 X newfont sapphire,19 X newfont garnet,16 X newfont emerald,20 X X_simplex dc.w $FFFF X dc.w Real X dc.l OnePoint X Xfentry macro X dc.l .\1 X dc.w FontID X dc.l _\1 X endm X Xnentry macro X.\1 dc.b 1$-*-1 X dc.b '\1' X1$ X endm X Xfontdirectory X fentry topaz X fentry diamond X fentry ruby X fentry opal X fentry sapphire X fentry garnet X fentry emerald X fentry simplex X X dc.l 0 X Xfontnames X nentry topaz X nentry diamond X nentry ruby X nentry opal X nentry sapphire X nentry garnet X nentry emerald X nentry simplex X X bstr no_font,<can''t find font> X bstr big_key,<key too long> X bstr psov,<gsave overflow> X bstr psuv,<grestore underflow> X bstr pntsov,<too many points in path> X bstr out01,<arg outside 0...1 interval> X X cnop 0,2 X Xlinecap dc.w 1 0=butt, 1=round, 2=projecting square Xlinejoin dc.w 0 X Xgraylevel dc.l 0 X Xareasptrn X dc.w %1111111111111111 X dc.w %1111111111111111 X dc.w %1111111111111111 X dc.w %1111111111111111 X Xareaptrn X dc.w %0111011101110111 X dc.w %1101110111011101 X dc.w %0111011101110111 X dc.w %1101110111011101 X X dc.w %0101010101010101 X dc.w %1010101010101010 X dc.w %0101010101010101 X dc.w %1010101010101010 X X dc.w %0001000100010001 X dc.w %0100010001000100 X dc.w %0001000100010001 X dc.w %0100010001000100 X X dc.w 0,0,0,0 X X xdef strokepathflag Xstrokepathflag dc.w 0 X X section groom,bss X Xpstackcnt ds.w 1 Xpstack ds.l 1 X ds.b 18*PstackSize Xpstacktop ds.w 1 X ds.l 1 X X Xpointcnt ds.w 1 Xnextpoint ds.l 1 X Xtmpras ds.l 2 Xareainfo ds.l 4 X ds.w 4 X Xareabuffer ds.b 5*AreaSize X Xpathbuffer ds.b 10*AreaSize X X end X \Rogue\Monster\ else echo "will not over write ./graphics.a" fi if [ `wc -c ./graphics.a | awk '{printf $1}'` -ne 28981 ] then echo `wc -c ./graphics.a | awk '{print "Got " $1 ", Expected " 28981}'` fi if `test ! -s ./letters` then echo "writing ./letters" sed 's/^X//' > ./letters << '\Rogue\Monster\' X Xsave X X2 pencolor X X/simplex findfont 12 scalefont setfont X X/char (x) def X X/caps { X 65 1 65 25 add % for A to Z X { char exch 0 exch put X char show } for X } def X X/small { X 97 1 97 25 add X { char exch 0 exch put X char show } for X } def X X50 300 moveto small X50 250 moveto caps X X/simplex findfont 20 scalefont setfont X X50 200 moveto small X50 150 moveto caps X Xrestore X \Rogue\Monster\ else echo "will not over write ./letters" fi if [ `wc -c ./letters | awk '{printf $1}'` -ne 389 ] then echo `wc -c ./letters | awk '{print "Got " $1 ", Expected " 389}'` fi if `test ! -s ./lmath.a` then echo "writing ./lmath.a" sed 's/^X//' > ./lmath.a << '\Rogue\Monster\' X X xdef ldivs X xdef ldivu X xdef lmulu * really signed X xdef lmoddivu X X section one X X* divide D1 by D2 X* quotient in D1; remainder in D0 Xlmoddivu X cmp.l #$00FFFF,D2 X bgt .bigdiv X move.w D1,A1 X clr.w D1 X swap D1 X divu D2,D1 X move.l D1,D0 X swap D1 X move.w A1,D0 X divu D2,D0 X move.w D0,D1 X clr.w D0 X swap D0 X rts X.bigdiv X move.l D1,D0 X clr.w D0 X swap D0 X swap D1 X clr.w D1 X move.l D2,A1 X moveq #$0F,D2 X1$ add.l D1,D1 X addx.l D0,D0 X cmp.l D0,A1 X bgt 2$ X sub.l A1,D0 X addq.w #1,D1 X2$ dbra D2,1$ X rts X Xlmulu X move.l D2,-(SP) X move.l D0,D2 X mulu D1,D2 X move.l D2,A0 X move.l D0,D2 X swap D2 X mulu D1,D2 X swap D1 X mulu D1,D0 X add.l D2,D0 X swap D0 X clr.w D0 X add.l D0,A0 X move.l A0,D0 X move.l (SP)+,D2 X rts X X* remainder after unsigned divide D0 by D1 X X* move.l D2,-(SP) X* move.l D1,D2 X* move.l D0,D1 X* bsr lmoddivu X* move.l (SP)+,D2 X* rts X X* unsigned divide D0 by D1 Xldivu X move.l D2,-(SP) X move.l D1,D2 X move.l D0,D1 X bsr lmoddivu X move.l D1,D0 X move.l (SP)+,D2 X rts X X* signed remainder after signed divide D0 by D1 X* move.l D2,-(SP) X* move.l D1,D2 X* bge lab736A X* neg.l D2 X*lab736A X* move.l D0,D1 X* moveq #0,D0 X* tst.l D1 X* bge lab7376 X* neg.l D1 X* not.l D0 X*lab7376 X* move.l D0,A0 X* bsr lmoddivu X* move.w A0,D2 X* beq lab7382 X* neg.l D0 X*lab7382 X* move.l (SP)+,D2 X* rts X Xldivs X move.l D2,-(SP) X move.l D0,A0 X moveq #0,D0 X move.l D1,D2 X bge 1$ same as bpl X neg.l D2 X not.l D0 X1$ move.l A0,D1 X bge 2$ same as bpl X neg.l D1 X not.l D0 X2$ move.l D0,A0 X bsr lmoddivu X move.l A0,D2 X beq 3$ were signs the same? X neg.l D1 X3$ move.l D1,D0 X move.l (SP)+,D2 X rts X X end X \Rogue\Monster\ else echo "will not over write ./lmath.a" fi if [ `wc -c ./lmath.a | awk '{printf $1}'` -ne 2156 ] then echo `wc -c ./lmath.a | awk '{print "Got " $1 ", Expected " 2156}'` fi if `test ! -s ./palette` then echo "writing ./palette" sed 's/^X//' > ./palette << '\Rogue\Monster\' X Xsave X X0 setgray X X/boxheight 100 def X/boxwidth 50 def X/thecolor 0 def X X/dab { X thecolor pencolor X currentpoint X currentpoint boxheight add X currentpoint exch boxwidth add exch X box X exch boxwidth add exch moveto X /thecolor thecolor 1 add def X} def X X 640 8 boxwidth mul sub 2 idiv X 400 2 boxheight mul sub 2 idiv X 2 copy X boxheight add moveto X 8 {dab} repeat X moveto X 8 {dab} repeat X X1 pencolor Xrestore X \Rogue\Monster\ else echo "will not over write ./palette" fi if [ `wc -c ./palette | awk '{printf $1}'` -ne 423 ] then echo `wc -c ./palette | awk '{print "Got " $1 ", Expected " 423}'` fi if `test ! -s ./prg` then echo "writing ./prg" sed 's/^X//' > ./prg << '\Rogue\Monster\' Xmv $1 $1.n Xtr -d '\015' <$1.n >$1 Xrm $1.n \Rogue\Monster\ else echo "will not over write ./prg" fi if [ `wc -c ./prg | awk '{printf $1}'` -ne 42 ] then echo `wc -c ./prg | awk '{print "Got " $1 ", Expected " 42}'` fi if `test ! -s ./ps.a` then echo "writing ./ps.a" sed 's/^X//' > ./ps.a << '\Rogue\Monster\' X X* X* This program is in the public domain. PostScript is a trademark X* of Adobe Systems. X* Greg Lee, July, 1987. X* U.S. mail: 562 Moore Hall, Dept. of Linguistics X* University of Hawaii, Honolulu, HI 96822 X* ARPA: uhccux!lee@nosc.ARPA X* X X* link with ffpa.o X xref FFPAFP X* xref FFPFPA X* link with lmath.o X xref lmulu X xref ldivu X xref ldivs X* xref lmoddivu X* link with files.o X xref readln X xref runclose X xref showreal X xref show8x X xref showdec X xref newline X xref getstr X xref msg,longmsg X xref ioinit X xref endio X* in control.o X xref initloops X xref _exec X* in graphics.o X xref initgr,endgr X* in rmath.o X xref _gsave,_grestore X* in dict.o X xref systemdict X xref fdict,enddict X xref .true,.false X X X X xdef reinterp X X xdef ihandle,ohandle X xdef rastport,wbscreen X xdef intuitionbase X xdef graphicsbase X xdef mathffpbase X xdef mathtransbase X X X X X idnt PS 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\(A6) X move.l (SP)+,A6 X endm X X X lref Open, X lref Close,2 X lref Read,3 X lref Write,4 X lref Input, X lref Output,6 X lref DeleteFile,8 X lref IoErr,8 X lref LoadSeg,2 X lref UnLoadSeg,22 X lref IsInteractive,32 X X lref SPFix, X lref SPFlt,2 X lref SPCmp,3 X lref SPTst,4 X lref SPAbs, X lref SPNeg,6 X lref SPAdd,7 X lref SPSub,8 X lref SPMul,9 X lref SPDiv, X X X X_RTS equ % X_JSR equ % destination abs. long X_JMP equ % destination abs. long X_MOVELD equ % source immediate long X_MOVEVD equ % source abs. long X_MOVEWD2 equ % source immediate word X_MOVEVD2 equ % source abs. long X X X Xmain X move.l SP,stacksave X bsr ioinit X bsr initgr X X X* here on error to redo stack Xmain X bsr _clear X bsr dsclear X X* get more stuff to interpret Xmain.in X bsr getstr X* (from here, A -> next stuff to interpret) X X X* interpret next symbol Xmain.next X bsr skipsp X beq main.in X X pea main.next X move.b compilelevel,D3 X X* if it's a number, push it X bsr testnumber X beq pushnum X X* name literal? X cmp.b #'/',D X beq pushlit X X cmp.b #'(',D X beq pushstr X X cmp.b #'{',D X beq start_compile X X cmp.b #'}',D X beq end_compile X X cmp.b #'%',D X beq getstr X X* interpret a name X bsr findsym X tst.l D2 X bpl name.ok Xsay_undefined X print unknown X bra reinterp X Xname.ok X move.b compilelevel,D3 X beq no.dummies X cmp.w #Dummy,D2 X bne no.dummies X bsr vpush X lea _exec,A X move.l A,D X bra stowcall X Xno.dummies X cmp.w #ICode,D2 X bne vpush X X tst.b D3 X bne stowcall X X move.l A,-(SP) X move.l D,A X jsr (A) X move.l (SP)+,A X rts X X* exit Xsystem X bsr endgr X bsr endio X moveq #,D X rts X*********************** X X DEF clear X lea istacktop,A X moveq #Illegal,D X move.l D,-(A) X move.w D,-(A) X rts X Xcountistack X moveq #-,D X moveq #Illegal,D2 X move.l A,A X$ addq.l #,D X move.w (A),D X addq.l #6,A X cmp.w D,D2 X bne $ X rts X X X DEF count X bsr countistack X RETURN Integer X Xindexistack X bsr popnum X addq.l #,D X bgt ..ndxis X bra iuflow Xindexistack X bsr popnum X..ndxis X move.l D,D3 X bmi iuflow X bsr countistack X cmp.l D,D3 X bhi iuflow X move.l D3,D X subq #,D X mulu #6,D X move.l A,A2 X add.l D,A2 X rts X X DEF copy X bsr indexistack X bra 2$ X$ move.w (A2)+,D2 X move.l (A2),D X bsr r.ipush X subq.l #8,A2 X2$ dbra D3,$ X rts X X DEF index X bsr indexistack X move.w (A2)+,D2 X move.l (A2)+,D X bra r.ipush X X DEF roll X bsr popnum X move.l D,-(SP) X bsr indexistack X move.l (SP)+,D X subq.l #,D3 X bmi 2$ X move.l D3,D4 X$ move.l D4,D3 X bsr roll X bne $ X2$ rts Xroll X tst.l D X beq $ X bmi rollm X bra rollp X$ rts X Xrollp X subq.l #,D X move.l D,-(SP) X move.l A,A X move.l A,A X move.w (A)+,-(SP) X move.l (A)+,-(SP) X bra 2$ X$ move.w (A)+,(A)+ X move.l (A)+,(A)+ X2$ dbra D3,$ X move.l (SP)+,D X move.w (SP)+,(A)+ X move.l D,(A) X move.l (SP)+,D X rts X Xrollm X addq.l #,D X move.l D,-(SP) X move.l A2,A X move.l A2,A X subq.l #6,A X move.w (A2)+,-(SP) X move.l (A2)+,-(SP) X bra 2$ X$ move.w (A)+,(A)+ X move.l (A),(A) X subq.l #8,A X subq.l #8,A X2$ dbra D3,$ X move.l (SP)+,D X move.w (SP)+,(A)+ X move.l D,(A) X move.l (SP)+,D X rts X Xdsclear X lea dstacktop,A X move.l A,dstack X moveq #,D X move.w D,dstackcnt X lea sstacktop,A X move.l A,sstack X moveq #,D X move.w D,sstackcnt X rts X X Xstart_compile X addq.l #,A X move.b compilelevel,D X move.w D,-(SP) X move.l nextcode,A X move.w #ICode,D2 X move.w (SP),D X tst.b D X beq 2$ X add.l #6+4+6+6,A allow for push & jmp if doing sub-proc X2$ move.l A,D X* if doing sub-proc, this generates code to do the push X bsr ipush X move.w (SP),D X addq.b #,D X move.b D,compilelevel X move.w (SP)+,D X tst.b D X bne 3$ X rts X3$ X move.w #_JMP,D X bsr stowword X move.l nextcode,A X move.l A,-(SP) where to put dest of jmp X moveq #,D leave room for dest of jmp X bsr stowword X bsr stowword X X bsr main.next go compile the sub-procedure X* should return to here when get matching '}' X move.l (SP)+,A patch in dest of jmp X move.l nextcode,(A) X rts X X Xend_compile X addq.l #,A X move.b compilelevel,D X beq 2$ unmatched '}' X move.w D,-(SP) X move.w #_RTS,D X bsr stowword X move.w (SP)+,D X subq.b #,D X move.b D,compilelevel X beq $ X addq.l #4,SP discard ret to main.next and ret to above X$ rts X2$ print rbrace X bra reinterp X Xtestnumber X cmp.b #'-',D X beq ..endtestn X cmp.b #'+',D X beq ..endtestn X cmp.b #'.',D (only if next is digit?) X beq ..endtestn Xtestdig X cmp.b #'',D * is it a decimal digit? X bcs ..endtestn X cmp.b #'9',D X bhi ..endtestn X cmp.b D,D X..endtestn X rts X Xpushstr X addq.l #,A X move.w #,parenlevel X move.l farea,D X btst #,D X beq $ X bsr stowbyte X move.l farea,D X$ X move.l D,-(SP) place to put length X move.w #String,D2 X bsr ipush X X moveq #,D X move.w D,-(SP) count length X bsr stowbyte room for length X bsr stowbyte X X..nextsbyte X addq.w #,(SP) X pea ..nextsbyte X move.b (A)+,D X bne 2$ X move.b #,D X bsr stowbyte X bra getstr X X2$ cmp.b #'(',D X bne 3$ X add.w #,parenlevel X bra stowbyte X X3$ cmp.b #')',D X bne 4$ X sub.w #,parenlevel X bne stowbyte X addq.l #4,SP discard ret to ..nextsbyte X X move.w (SP)+,D X subq.w #,D correct for ')' not stored X move.l (SP)+,A X move.w D,(A) X rts X X4$ cmp.b #'\',D X bne stowbyte X move.b (A)+,D X beq getstr X move.b D,D X X move.b #,D X cmp.b #'n',D X beq stowbyte X X move.b #3,D X cmp.b #'r',D X beq stowbyte X X move.b #9,D X cmp.b #'t',D X beq stowbyte X X move.b #8,D X cmp.b #'b',D X beq stowbyte X X move.b #2,D X cmp.b #'f',D X beq stowbyte X X cmp.b #'',D X bcs ..noct X cmp.b #'7',D X bhi ..noct X moveq #,D X bsr ..isoct X bsr ..isoct X sub.b #'',D X asl.b #3,D X add.b D,D X bra stowbyte X X..isoct X sub.b #'',D X asl.b #3,D X add.b D,D X move.b (A),D X cmp.b #'',D X bcs $ X cmp.b #'7',D X bhi $ X addq.l #,A X rts X$ addq.l #4,SP X bra stowbyte X X..noct X move.b D,D X cmp.b #'\',D X beq stowbyte X cmp.b #'(',D X beq stowbyte X cmp.b #')',D X beq stowbyte X rts X X Xpushlit X addq.l #,A past '/' X move.l farea,A save to push X moveq #,D3 count X bsr stowbyte room for length X$ move.b (A)+,D X bsr testendchar X bne 2$ X move.b D3,(A) X subq.l #,A X move.l A,D X move.w #Name,D2 X bra ipush X2$ bsr stowbyte X addq.l #,D3 X bra $ X Xpushnum X moveq #,D X move.l D,D2 neg flag X move.l D,D3 dec point flag X move.l A,A X cmp.b #'-',(A) X bne $ X move.b (A)+,D2 X$ move.b (A)+,D X bsr testdig X bne 2$ X sub.b #'',D X ext.w D X ext.l D X X move.l D,-(SP) X add.l D,D X move.l D,D X lsl.l #2,D X add.l D,D X move.l (SP)+,D X add.l D,D X bra $ X X2$ tst.b D3 X beq 6$ X cmp.b #'E',D X bne realpush X3$ move.b (A)+,D X cmp.b #'-',D X bne $ X4$ move.b (A)+,D X$ bsr testdig X beq 4$ X bra realpush X X6$ cmp.b #'E',D X beq 3$ X cmp.b #'.',D X bne intpush X move.b D,D3 X bra $ X Xrealpush X subq.l #,A X move.l A,-(SP) X jsr FFPAFP X move.l (SP)+,A X bvs $ X move.w #Real,D2 X move.l D7,D X bra ipush X$ print fperr X bra reinterp X Xintpush X subq.l #,A X move.b D2,D3 X move.w #Integer,D2 X move.l D,D X tst.b D3 X beq ipush X neg.l D X Xipush X move.b compilelevel,D3 X beq r.ipush X bsr stowmovel X bsr stowmovew X..iptype X lea r.ipush,A X move.l A,D X bra stowcall X Xvpush X tst.b D3 X beq r.ipush X move.l A2,D get address of value X addq.l #2,D X move.l A2,-(SP) X bsr stowmovev X move.l (SP)+,D get address of type X bsr stowmovevw X bra ..iptype X X xdef r.ipush Xr.ipush X* move.l istack,A X move.l D,-(A) X move.w D2,-(A) X cmp.l #istackbot,A X bhi ipush.ok X print overflow Xreinterp X move.b #,compilelevel X bsr initloops X bsr runclose X move.l stacksave,SP X bra main X Xipush.ok X* move.l A,istack X rts X X X xdef ipop Xipop X DEF pop X* move.l istack,A X move.w (A)+,D2 X cmp.w #Illegal,D2 X bne ..ippok Xiuflow X print underflow X bra reinterp X..ippok X move.l (A)+,D X* move.l A,istack X rts X X xdef popnum Xpopnum X bsr ipop X cmp.w #Integer,D2 X beq $ X cmp.w #Real,D2 X bne type_mismatch X move.l D,-(SP) X math SPFix X move.l (SP)+,D X move.w #Integer,D2 X$ rts X Xskipsp X move.b (A),D X beq 2$ X cmp.b #,D X beq $ X cmp.b #' ',D X bne 2$ X$ addq.l #,A X bra skipsp X2$ rts X Xtestendchar X tst.b D X beq $ X cmp.b #' ',D X beq $ X cmp.b #,D X beq $ X cmp.b #'}',D X beq $ X cmp.b #'{',D X beq $ X cmp.b #')',D X beq $ X cmp.b #'(',D X beq $ X cmp.b #'/',D X beq $ X cmp.b #'%',D X beq $ X cmp.b #']',D X beq $ X cmp.b #'[',D X beq $ X cmp.b #'>',D X beq $ X cmp.b #'<',D X$ rts X X* A -> name to look for X* return with A -> past name X* D2 = - if not found, else D2 = type X* D = value & A2 -> type of entry Xfindsym X move.l A,A X moveq #,D3 X move.l D3,D2 X X$ move.b (A)+,D get length in D3 X bsr testendchar X beq 2$ X addq.l #,D3 X bra $ X2$ tst.l D3 X bne 4$ X cmp.b #'[',D X beq 3$ X cmp.b #']',D X bne .nonefound X3$ moveq #,D3 X4$ bsr allsym X tst.l D2 X bpl $ X move.b compilelevel,D X bne dummyentry X$ add.l D3,A X rts X Xallsym X move.w dstackcnt,D X move.l dstack,A X$ subq.w #,D X bmi 2$ X move.l (A)+,A2 X addq.l #2,A2 X movem.l A/D,-(SP) X moveq #,D2 X bsr nextsym X movem.l (SP)+,A/D X tst.l D2 X bmi $ X rts X2$ moveq #,D2 X lea systemdict,A2 X X* also called by dictsearch Xnextsym X move.l (A2)+,D X beq .nonefound X move.l D,A3 A3 -> name in dict X move.l A,A A -> name X move.l D3,D X move.w (A2)+,D2 D2 = type X move.l (A2)+,D D = value X X cmp.b (A3)+,D same length? X bne nextsym X X subq.l #,D X4$ cmp.b (A3)+,(A)+ X dbne D,4$ X bne nextsym X subq.l #6,A2 X rts X X.nonefound X moveq #-,D2 X rts X X* from above -- A -> name; D3 = length Xdummyentry X move.l A,A X add.l D3,A X move.l A,-(SP) X move.l farea,A save for entry name X move.l D3,D X bsr stowbyte length X bra 2$ X$ move.b (A)+,D X bsr stowbyte X2$ dbra D3,$ X X lea say_undefined,A X move.l A,D X move.l #Dummy,D2 X bsr newentry X subq.l #6,A X move.l A,A2 X bsr vpush X lea _exec,A X move.l #ICode,D2 X move.l A,D X move.l (SP)+,A X rts X X X X DEF begin X ARG Dictionary X lea dstackcnt,A X cmp.w #DstackSize,(A) X beq $ X addq.w #,(A) X move.l dstack,A X move.l D,-(A) X move.l A,dstack X rts X$ print dstackov X bra reinterp X X DEF end X lea dstackcnt,A X tst.w (A) X beq $ X subq.w #,(A) X move.l dstack,A X move.l (A)+,D X move.l A,dstack X rts X$ print dstackuv X bra reinterp X X********** X X Xstowbyte X move.l farea,A2 X move.b D,(A2)+ X cmp.l #endsarea,A2 X bne $ X print areafull X bra reinterp X$ move.l A2,farea X rts X X* store instruction 'move.w <D>,D2' Xstowmovevw X move.l D,-(SP) X move.w #_MOVEVD2,D X bra ..stowi X* store instruction 'move.w #<D2>,D2' Xstowmovew X move.w #_MOVEWD2,D X bsr stowword X move.w D2,D X bra stowword X* store instruction 'move.l <D>,D' Xstowmovev X move.l D,-(SP) X move.w #_MOVEVD,D X bra ..stowi X* store instruction 'move.l #<D>,D' Xstowmovel X move.l D,-(SP) X move.w #_MOVELD,D X bra ..stowi X* store instruction 'jsr <D>' Xstowcall X move.l D,-(SP) X move.w #_JSR,D change to BSR? X..stowi X bsr stowword X move.l (SP),D X swap D X bsr stowword X move.l (SP)+,D X Xstowword X move.l nextcode,A2 X move.w D,(A2)+ X cmp.l #endcode,A2 X bls $ X print codefull X bra reinterp X$ move.l A2,nextcode X rts X Xstowlong X swap D X bsr stowword X swap D X bra stowword X X************************************ X X DEF hex X bsr ipop X bsr show8x X move.l A,D X RETURN Name X X DEF quit X move.l stacksave,SP X bsr runclose X bra system X X DEF cvs X ARG String X move.l D,-(SP) X moveq #-,D flag this is a string conversion X bra ..prnt X..cvs2 X* it better be long enough X move.l (SP)+,A X move.l A,D X* A -> name; A -> string X moveq #,D X move.b D,(A)+ X move.b (A),D X$ move.b (A)+,(A)+ X dbra D,$ X RETURN String X X..pors X move.l (SP)+,D X bne ..cvs2 X bsr msg X bra newline X X DEF print X ARG String X move.l D,A X moveq #,D3 X move.w (A)+,D3 X bra longmsg X X X DEF equalsprint X moveq #,D flag this is a print X..prnt X move.l D,-(SP) X bsr ipop X cmp.w #Integer,D2 X bne 2$ X bsr showdec X bra ..pors X X2$ cmp.w #Name,D2 X bne 3$ X move.l D,A X bra ..pors X X3$ cmp.w #String,D2 X bne 4$ X move.l D,A X move.l (SP)+,D X beq 3$ X move.l (SP)+,D X bra r.ipush it's already a string -- should copy it? X3$ X moveq #,D3 X move.w (A)+,D3 X bsr longmsg X bra newline X X4$ cmp.w #Boolean,D2 X bne 6$ X lea .true,A X tst.l D X bne $ X lea .false,A X$ bra ..pors X X6$ cmp.w #Real,D2 X bne 7$ X bsr showreal X bra ..pors X X7$ X lea nsv,A X bra ..pors X X X DEF string X bsr popnum X move.l D,D3 X swap D X tst.w D X bne 2$ X X move.l farea,D X btst #,D X beq $ X bsr stowbyte X move.l farea,D X$ X move.l D,A2 X add.l D3,A2 X addq.l #2,A2 X cmp.l #endsarea,A2 X bcs 3$ X2$ print areafull X bra reinterp X3$ move.l D,A X move.w D3,(A) X move.l A2,farea X RETURN String X X DEF dict X moveq #-,D4 X bra ..arry X X DEF array X moveq #,D4 X..arry X bsr popnum X move.l nextcode,A2 X move.l A2,A X move.w D,(A2)+ X add.l D,D bytes -> words X move.l D,D X add.l D,D X add.l D,D length * 3 X tst.l D4 X beq $ X add.l D,D X add.l D,D length * X addq.l #4,D + for null at end X move.l A2,A X clr.w (A2)+ current length is X clr.l (A2) flag end X$ add.l D,A2 X cmp.l #endcode,A2 X bls 2$ X ERR codefull X2$ move.l A2,nextcode X move.l A,D X tst.l D4 X bne 3$ X RETURN Array X3$ RETURN Dictionary X X DEF fontalloc X move.l nextcode,A X lea 8(A),A2 X cmp.l #endcode,A2 X bls $ X ERR codefull X$ move.l A2,nextcode X rts X X X DEF maxlength X bsr ipop X move.l D,A X subq.l #2,A X bra ..lngth X X DEF length X bsr ipop X move.l D,A X cmp.w #String,D2 X beq ..rlngth X cmp.w #Array,D2 X beq ..rlngth X..lngth X cmp.w #Dictionary,D2 X bne type_mismatch X..rlngth X moveq #,D X move.w (A),D X move.w #Integer,D2 X bra r.ipush X X Xarrayref X bsr popnum X move.l D,D the index X bsr ipop X move.l D,A base of array X moveq #,D3 X cmp.w #Array,D2 X beq $ X cmp.w #String,D2 X bne type_mismatch X$ move.w (A)+,D3 X subq.l #,D3 length - is max index X bmi 3$ X cmp.l D3,D past end? X bhi 3$ X cmp.w #Array,D2 X beq 2$ X add.l D,A ret not equal X rts X2$ add.l D,D word reference X move.l D,D X add.l D,D times 3 X add.l D,D X add.l D,A index to element X cmp.l D,D X rts X3$ print arr_err X bra reinterp X X X DEF get X bsr arrayref X bne $ X move.w (A)+,D2 type X move.l (A),D value X bra r.ipush X$ move.w #Integer,D2 X moveq #,D X move.b (A),D X bra r.ipush X X DEF put X bsr ipop X move.l D,-(SP) X move.w D2,-(SP) X bsr arrayref X bne $ X move.w (SP)+,(A)+ X move.l (SP)+,(A) X rts X$ move.w (SP)+,D2 X move.l (SP)+,D X cmp.w #Integer,D2 X bne type_mismatch X move.b D,(A) X rts X X DEF mark X moveq #,D X RETURN Mark X X DEF rbracket X moveq #,D3 count array elements X$ bsr ipop X cmp.w #Mark,D2 X beq 2$ X addq.l #,D3 X move.l D,-(SP) X move.w D2,-(SP) X bra $ X2$ move.l nextcode,D X move.w #Array,D2 X bsr r.ipush X move.l D3,D X bsr stowword X bra 4$ X X3$ move.w (SP)+,D X bsr stowword X move.l (SP)+,D X bsr stowlong X4$ dbra D3,3$ X rts X X X DEF def X bsr ipop X movem.l D/D2,-(SP) X ARG Name X move.l D,A first check dict to see if old symbol X move.l D,-(SP) save for name of new entry X bsr alldictsearch X move.l (SP)+,D X tst.l D2 found? X bmi newentry X* replace old entry X movem.l (SP)+,D/D2 X*(perhaps change this so that when types don't match, X* make old entry nameless and create new entry, to prevent X* problem with previously compiled code) X move.w D2,(A2)+ new type X move.l D,(A2) new value X rts X X* called from findsym Xnewentry X movem.l D/D2,-(SP) X move.l A,D X* make new entry X* type & value on stack; D -> name Xnewentry X move.w dstackcnt,D X bne 4$ X move.l nextentry,A X move.l D,(A)+ X movem.l (SP)+,D/D2 X move.w D2,(A)+ X move.l D,(A)+ X clr.l (A) X cmp.l #enddict,A X bhi 3$ X move.l A,nextentry X rts X3$ print fulldict X bra reinterp X4$ move.l dstack,A X move.l (A),A address of dict -> current size X move.w -(A),D D = maxsize X addq.l #2,A point at current size again X cmp.w (A),D if max <= current, no room X bls 3$ X moveq #,D form address for new entry X move.w (A),D X add.l D,D word X move.l D,D2 * new current size X add.l D,D X add.l D,D X add.l D2,D X X addq.w #,(A)+ new current size, & point to st entry X add.l D,A point to new entry X tst.l (A) if not null, imp. error X bne imp_error X X move.l D,(A)+ X movem.l (SP)+,D/D2 X move.w D2,(A)+ X move.l D,(A)+ X clr.l (A) X X rts X Xalldictsearch X move.l dstack,A X move.w dstackcnt,D3 X$ subq.w #,D3 X bmi 3$ X move.l (A)+,A2 X addq.l #2,A2 past current length X movem.l D3/A,-(SP) X bsr dictsearch X movem.l (SP)+,D3/A X tst.l D2 X* bmi $ (it was a mistake to search past top dictionary) X rts X3$ lea systemdict,A2 X xdef dictsearch X* A -> Name (bstr) X* A2 -> dict X* returns D2 = - if not found X* else D2 = type X* D = value X* A2 -> type in entry Xdictsearch X move.l A,-(SP) X moveq #,D3 len X move.l D3,D2 X move.b (A)+,D3 X bsr nextsym X move.l (SP)+,A X rts X X X DEF exch X bsr ipop X move.l D,D X move.w D2,D3 X bsr ipop X exg D,D X exg D2,D3 X bsr r.ipush X move.l D,D X move.w D3,D2 X bra r.ipush X X DEF dup X bsr ipop X bsr r.ipush X bra r.ipush X X DEF true X moveq #-,D X RETURN Boolean X X DEF false X moveq #,D X RETURN Boolean X X DEF cvr X ARG Integer X math SPFlt X RETURN Real X X DEF cvi X ARG Real X math SPFix X RETURN Integer X X************** X X DEF save X lea sstackcnt,A X cmp.w #SstackSize,(A) X beq $ X addq.w #,(A) X move.l sstack,A X move.l farea,-(A) X move.l nextentry,-(A) X move.l nextcode,-(A) X move.l A,sstack X bsr _gsave X moveq #,D X RETURN Save X$ print sstkov X bra reinterp X X DEF restore X ARG Save X lea sstackcnt,A X tst.w (A) X beq $ X subq.w #,(A) X move.l sstack,A X move.l (A)+,nextcode X move.l (A)+,A X clr.l (A) X move.l A,nextentry X move.l (A)+,farea X bra _grestore X$ print sstkuv X bra reinterp X X X**************** X Ximp_error X print imperr X bra reinterp X X xdef type_mismatch Xtype_mismatch X print mismatch X bra reinterp X X***************************** X section three,bss X Xstacksave ds.l X X*DOS_point ds.l X* xdef graphicsbase Xgraphicsbase ds.l Xintuitionbase ds.l X* xdef mathffpbase Xmathffpbase ds.l X* xdef mathtransbase Xmathtransbase ds.l X X* xdef wbscreen Xwbscreen ds.l X*thiswindow ds.l X*doswindow ds.l X* xdef rastport Xrastport ds.l X Xohandle ds.l X* xdef ihandle Xihandle ds.l X X Xcodearea ds.w CodeSize Xendcode ds.w 4 X Xistack ds.l X ds.b 2 Xistackbot ds.b 6*IstackSize Xistacktop ds.l X Xdstackcnt ds.w Xdstack ds.l X ds.b 8 Xdstackbot ds.b 4*DstackSize Xdstacktop ds.l X X Xsstackcnt ds.w Xsstack ds.l X ds.b 2 Xsstackbot ds.b 2*SstackSize Xsstacktop ds.l X Xfsarea ds.b SAreaSize Xendsarea ds.b 2 X X section two,data X Xfarea dc.l fsarea Xnextentry dc.l fdict Xnextcode dc.l codearea Xcompilelevel dc.w Xparenlevel dc.w X X X bstr underflow,<stack underflow> X bstr overflow,<stack overflow> X bstr areafull,<string area is full> X bstr mismatch,<type mismatch> X bstr nsv,<--nostringval--> X bstr fulldict,<dictionary is full> X bstr codefull,<code area is full> X bstr unknown,<unknown symbol> X bstr rbrace,<unmatched right brace> X bstr fperr,<floating point error> X bstr arr_err,<bad array reference> X bstr dstackov,<dict stack overflow> X bstr dstackuv,<dict stack underflow> X bstr imperr,<implementation error> X bstr sstkov,<save stack overflow> X bstr sstkuv,<save stack underflow> X X end X \Rogue\Monster\ else echo "will not over write ./ps.a" fi if [ `wc -c ./ps.a | awk '{printf $1}'` -ne 24428 ] then echo `wc -c ./ps.a | awk '{print "Got " $1 ", Expected " 24428}'` fi echo "Finished archive 2 of 3" # if you want to concatenate archives, remove anything after t*Ar ],< qb X