jimomura@lsuc.on.ca (Jim Omura) (11/10/90)
Thanks to all who helped me with the Line-A stuff. Since I've finished all that I intend to do for now, I'm declaring it Public Domain. Those of you who are more proficient than me, please don't laugh too hard -- the hospitals don't need more hernia patients. :-) #!/bin/sh # This is a shell archive (shar 3.11) # made 11/10/1990 14:09 UTC by jimomura@lsuc.on.ca # Source directory /scr/jimomura/tempdir # # existing files WILL be overwritten # # This shar contains: # length mode name # ------ ---------- ------------------------------------------ # 1126 -rw-r--r-- Readme # 4895 -rw-r--r-- grtest.c # 1256 -rw-r--r-- line_a.h # 5113 -rw-r--r-- line_a.s # touch 2>&1 | fgrep '[-amc]' > /tmp/s3_touch$$ if [ -s /tmp/s3_touch$$ ] then TOUCH=can else TOUCH=cannot fi rm -f /tmp/s3_touch$$ # ============= Readme ============== echo "x - extracting Readme (Text)" sed 's/^X//' << 'SHAR_EOF' > Readme && X1990/11/10 X X I have finished working up the Line_A support as far as I Xneed it for the time being. As such, I have no intention to Ximpliment any more. In saying this, I should note that I don't Xreally have enough information onhand to finish all the possible Xfunctions anyway, though I have enough to do a fair bit more than XI have. X X This file set includes the following: X X1. 'line_a.h' is the header file I'm currently using. It is based X on information from "Atari ST Internals" (Data Becker). X X2. 'line_a.s' is the actual assembly source code for Sozobon C X version 1.2. NOTE that the individual functions can be separated. XThe transition marker lines are in the following format: X X; *** End of functionname *** X XIf you search for the 3 asterisks you'll find the transition markers Xand just have to "cut out" what you need. X X3. 'grtest.c' is a crude test program I used to test the functions. X There is some imbedded documentation in the file. X X All the files in this set are PUBLIC DOMAIN. X XCheers! -- Jim O. X X'jimomura@lsuc' XJim Omura, 2A King George's Drive, Toronto, Ontario, Can., M6M 2G8 SHAR_EOF chmod 0644 Readme || echo "restore of Readme fails" if [ $TOUCH = can ] then touch -am 1110090990 Readme fi set `wc -c Readme`;Wc_c=$1 if test "$Wc_c" != "1126" then echo original size 1126, current size $Wc_c;fi # ============= grtest.c ============== echo "x - extracting grtest.c (Text)" sed 's/^X//' << 'SHAR_EOF' > grtest.c && X/* GrTest.C */ X X/* Test A-Line Graphics Routines */ X X#include <stdio.h> X#include "line_a.h" X Xshort vplanes; Xshort vlinwr; X Xshort *cntrl; Xshort *intin; Xshort *ptsin; Xshort *intout; Xshort *ptsout; X X/* The following for 'foregrnd()' if used: */ Xshort plane1; Xshort plane2; Xshort plane3; /* My correction -- Jim O. */ Xshort plane4; /* My correction -- Jim O. */ X X/* The following for 'fgrnd() if used: */ Xshort colour; /* This is NOT a true A Line var. -- Jim O. */ X X/* short lstlin; Not Used */ X Xshort lnmask; Xshort wrtmod; /* My correction -- Jim O. */ Xshort x1; Xshort y1; Xshort x2; Xshort y2; Xshort *patptr; /* "long" Pointer to "short" array */ Xshort patmsk; Xshort multifill; Xshort clip; Xshort xmnclip; Xshort ymnclip; Xshort xmxclip; Xshort ymxclip; Xshort xaccdda; Xshort ddainc; Xshort tsclsts; Xshort monostatus; Xshort sourcex; Xshort sourcey; Xshort destx; Xshort desty; Xshort delx; Xshort dely; Xlong fbase; Xlong fwidth; Xshort style; Xshort litemask; Xshort skewmask; Xshort weight; Xshort roff; Xshort loff; Xshort scale; Xshort chup; Xshort textfg; Xlong scrtchp; Xshort scrpt2; Xshort textbg; Xshort copytran; X Xshort fillpat[] = { 0xffff,0xffff }; X Xmain() X{ X extern LINE_A *algtbase(); X char buffer[10]; X short fast; /* Switch for MCShow() */ X LINE_A *stpntr; X X stpntr = algtbase(); /* Get A-Line Data Struct Base */ X X#ifdef DOCUMENTATION X#include "line_a.h" XLINE_A *algtbase(); X XReturns pointer to A-Line Structure X#endif X X printf("A-Line Data at %1ld\n",stpntr); X X/* Line Function Test: */ X X#ifdef DOCUMENTATION Xinclude <line_a.h> Xvoid fgrnd(stpntr,colour); XLINE_A *stpntr; Xint colour; X XSets the foreground colour to "colour". X XALTERNATIVE CALL: Xvoid foregrnd(stpntr,plane1,plane2,plane3,plane4); Xint plane1, plane2, plane3, plane4; X/* The lowest bit in a colour register corresponds to plane1 */ X X There might be some advantage for using this Xlatter call where 1 plane is specifically being changed Xoften. The call has been tested and works. X X#endif X X colour = 1; X X fgrnd(stpntr,colour); /* Set Foreground Colour */ X X wrtmod = 0; X lnmask = -1; X X setlmsk(stpntr,wrtmod,lnmask); X X x1 = 39; X y1 = 39; X x2 = 55; X y2 = 55; X X line(stpntr,x1,y1,x2,y2); X X/* Get Pixel Function test: */ X X colour = getpxl(stpntr,x1,y1); X X printf("Colour %1d\n",colour); X X/* Horizontal Line Function Test: */ X X patptr = fillpat; X patmsk = 1; X X setfmsk(stpntr,wrtmod,patptr,patmsk); X X#ifdef DOCUMENTATION Xinclude <line_a.h> Xvoid setfmsk(stpntr,wrtmod,patptr,patmsk); XLINE_A *stpntr; Xshort wrtmod; Xshort *patptr; /* The pointer itself is 'long' */ Xshort patmsk; /* Number of mask words -1 */ X If a mask is needed, 'patmsk' is the number of bit pattern Xwords less 1. Therefore "0" means 1 word, "1" means 2 words, etc. X'Patptr' points to the array. X#endif X X x1 = 60; X y1 = 60; X x2 = 72; X X hline(stpntr,x1,y1,x2); X X/* Filled Box Function Test: */ X X clip = 0; X xmnclip = 0; /* Dummy values, unused */ X ymnclip = 0; X xmxclip = 0; X ymxclip = 0; X X setclip(stpntr,clip,xmnclip,ymnclip,xmxclip,ymxclip); X X#ifdef DOCUMENTATION Xinclude <line_a.h> Xvoid setclip(stpntr,clip,xmnclip,ymnclip,xmxclip,ymxclip); XLINE_A *stpntr; Xshort clip; /* Clip mode flag */ Xshort xmnclip; /* Upper Left X */ Xshort ymnclip; /* Upper Left Y */ Xshort xmxclip; /* Lower Right X */ Xshort,ymxclip; /* Lower Right Y */ X X#endif DOCUMENTATION X X x1 = 3; X y1 = 27; X x2 = 7; X y2 = 31; X X fbox(stpntr,x1,y1,x2,y2); X X#ifdef DOCUMENTATION Xinclude <line_a.h> Xvoid fbox(stpntr,x1,y1,x2,y2); XLINE_A *stpntr; /* Pointer to Line-A variable structure */ Xshort x1,y1; /* Coordinates of upper left corner */ Xshort x2,y2; /* Coordinates of lower right corner */ X XShort Explanation: X Makes a FILLED BOX. X XAffected by: X foregrnd() /* sets new drawing color */ X setfmsk() /* sets Fill mask */ X setclip() /* sets clip */ X X#endif DOCUMENTATION X X/* Test Mouse Cursor Show and Hide */ X X#ifdef DOCUMENTATION X Xvoid mchide() X XHide Mouse Cursor X XCalls to MCHide() are counted by the OS for MCShow(). X X#endif DOCUMENTATION X X#ifdef DOCUMENTATION X X#include "line_a.h" X Xvoid mcshow(spntr,fast) XLINE_A *spntr; Xshort fast; X XShow Mouse Cursor X If 'fast' = 0 then the mchide() count is bypassed X If 'fast' != 0 then mchide() count is active and X mouse will not be shown until "show" calls > "hide" X X#endif DOCUMENTATION X X printf ("0 = Fast Show, 1 = Show, 2 = Hide, 3 = Quit\n"); X fast = 0; X for(;;) X { X fgets(buffer,10,stdin); X switch( atoi(buffer)) X { X case 0: X mcshow(stpntr,0); X continue; X case 1: X mcshow(stpntr,1); X continue; X case 2: X mchide(); X continue; X default: X break; X } /* Endswitch */ X X break; /* Exit Loop */ X X } /* Endloop */ X X} /* End of main() */ X X/* End of grtest.c */ SHAR_EOF chmod 0644 grtest.c || echo "restore of grtest.c fails" if [ $TOUCH = can ] then touch -am 1110085790 grtest.c fi set `wc -c grtest.c`;Wc_c=$1 if test "$Wc_c" != "4895" then echo original size 4895, current size $Wc_c;fi # ============= line_a.h ============== echo "x - extracting line_a.h (Text)" sed 's/^X//' << 'SHAR_EOF' > line_a.h && X/* Line_A.h */ X X/* By Jim Omura */ X Xtypedef struct /* According to info in "Atari ST Internals" */ X{ X short v_planes, X v_lin_wr; X short *CNTRL, /* Note that Pointers to 'short' are 'long' */ X *INTIN, X *PTSIN, X *INTOUT, X *PTSOUT; X short _FG_BP_1, X _FG_BP_2, X _FG_BP_3, /* My correction -- Jim O. */ X _FG_BP_4, X _LSTLIN, X _LN_MASK, X _WRT_MOD, /* My correction -- Jim O. */ X _X1, X _Y1, X _X2, X _Y2; X short *_patptr; /* "long" pointer to "short" array */ X short _patmsk, X _multifill, X _CLIP, X _XMN_CLIP, X _YMN_CLIP, X _XMX_CLIP, X _YMX_CLIP, X _XACC_DDA, X _DDA_INC, X _T_SCLSTS, X _MONO_STATUS, X _SOURCEX, X _SOURCEY, X _DESTX, X _DESTY, X _DELX, X _DELY; X long _FBASE, X _FWIDTH; X short _STYLE, X _LITEMASK, X _SKEWMASK, X _WEIGHT, X _R_OFF, X _L_OFF, X _SCALE, X _CHUP, X _TEXT_FG; X long _scrtchp; X short _scrpt2, X _TEXT_BG, X _COPYTRAN; X} LINE_A; X X/* End of Line_A.h */ SHAR_EOF chmod 0644 line_a.h || echo "restore of line_a.h fails" if [ $TOUCH = can ] then touch -am 1110085190 line_a.h fi set `wc -c line_a.h`;Wc_c=$1 if test "$Wc_c" != "1256" then echo original size 1256, current size $Wc_c;fi # ============= line_a.s ============== echo "x - extracting line_a.s (Text)" sed 's/^X//' << 'SHAR_EOF' > line_a.s && X .text X .globl _algtbase X_algtbase: X; int algtbase() X; Get Pointer to A-Line Data Structure X; Sozobon C Line-A Support By Jim Omura X link a6,#-0 X; X .dc.w $a000 ; A-Line pseudo-instruction X; Return value is already in D0 X unlk a6 X rts X; X .data X; *** End of algtbase *** X .text X .globl _fbox X_fbox: X; void fbox(spntr,x1,y1,x2,y2) X; LINE_A *spntr; X; int x1,y1,x2,y2; X; Filled Box X; Sozobon C Line-A Support by Jim Omura X; X;var 4 8 _spntr X;var 2 12 _x1 X;var 2 14 _y1 X;var 2 16 _x2 X;var 2 18 _y2 X; X link a6,#-0 X; X movea.l 8(a6),a0 ; A0 = spntr X move.w 12(a6),38(a0) X move.w 14(a6),40(a0) X move.w 16(a6),42(a0) X move.w 18(a6),44(a0) X; X .dc.w $a005 ; Pseudo Instruction X; X unlk a6 X rts X; X .data X; *** End of fbox *** X .text X .globl _fgrnd X_fgrnd: X; void fgrnd(spntr,colour) X; LINE_A spntr; X; int colour; X; Set Foreground Colour X; Sozobon C Line-A Support Function by Jim Omura X; X;var 4 8 _spntr X;var 2 12 _colour X; X link a6,#-0 X; X movea.l 8(a6),a0 ; A0 = spntr X lea 24(a0),a0 ; A0 points at Plane 1 X move.w 12(a6),d1 ; D1 = Colour Reg. X moveq #3,d2 ; D2 = Loop Counter X; XDISTLP: ; Start Loop "Distribute Bits" X; *** Hugh Redelmeier's version: X clr.w (a0) X lsr.w #1,d1 X; NOTE: Last Bit shifted out sets CCR Carry and eXtend Flags X roxl.w (a0)+ ; Store remainder in Bit Plane & incr. X; XNEXT: X dbra d2,DISTLP ; End of Loop X; X unlk a6 X rts X .data X; *** End of fgrnd *** X .text X .globl _getpxl X_getpxl: X; int getpxl(spntr,x,y); X; LINE_A *spntr; X; int x,y; X; X; Sozobon C Line-A Support by Jim Omura X; X;var 4 8 _spntr X;var 2 12 _x X;var 2 14 _y X; X link a6,#-0 X; X movea.l 8(a6),a0 ; A0 = spntr X lea 12(a0),a0 ; A0 points at PTSIN X movea.l (a0),a0 ; A0 = PTSIN X; X move.w 12(a6),(a0)+ ; Store X X move.w 14(a6),(a0) ; Store Y X .dc.w $a002 ; Pseudo Instruction returns colour in D0 X; X unlk a6 X rts X; X .data X; *** End of getpxl *** X .text X .globl _hline X_hline: X; void hline(spntr,x1,y1,x2) X; LINE_A *spntr; X; int x1, y1; /* Start Point */ X; int x2; /* End point */ X; X; Horizontal Line X; Sozobon C Line-A Support by Jim Omura X; X;var 4 8 _spntr X;var 2 12 _x1 X;var 2 14 _y1 X;var 2 16 _x2 X; X link a6,#-0 X; X movea.l 8(a6),a0 ; A0 = spntr X move.w 12(a6),38(a0) X move.w 14(a6),40(a0) X move.w 16(a6),42(a0) X; X .dc.w $a004 ; Pseudo Instruction X; X unlk a6 X rts X; X .data X; *** End of hline *** X .text X .globl _line X_line: X; void line(spntr,x1,y1,x2,y2); X; LINE_A *spntr; X; int x1,y1; /* Start Point */ X; int x2,y2; /* End Point */ X; X; General Line Draw X; Sozobon C Line-A Support by Jim Omura X; X;var 4 8 _spntr X;var 2 12 _x1 X;var 2 14 _y1 X;var 2 16 _x2 X;var 2 18 _y2 X; X link a6,#-0 X; X movea.l 8(a6),a0 ; A0 = spntr X move.w 12(a6),38(a0) X move.w 14(a6),40(a0) X move.w 16(a6),42(a0) X move.w 18(a6),44(a0) X; X .dc.w $a003 ; Pseudo Instruction X; X unlk a6 X rts X; X .data X; *** End of line *** X .text X .globl _mchide X_mchide: X; void mchide() X; NO Variables X; X; Mouse Cursor Hide X; Sozobon C Line-A Support by Jim Omura X; X link a6,#-0 X; X .dc.w $a00a ; Pseudo Instruction X; X unlk a6 X rts X; X .data X; *** End of mchide *** X .text X .globl _mcshow X_mcshow: X; void mcshow(spntr,fast) X; LINE_A *spntr; X; short fast; /* 0 = Fast, 0 != count MCHides */ X; X; Mouse Cursor Show X; Sozobon C Line-A Support by Jim Omura X; X;var 4 8 _spntr X;var 2 12 _fast X; X link a6,#-0 X; X movea.l 8(a6),a0 ; A0 = spntr X lea.l 4(a0),a1 ; A1 points at CONTRL X movea.l (a1),a1 ; A1 = CONTRL X move.w #0,2(a1) ; word CONTRL(1) = 0 X move.w #1,6(a1) ; word CONTRL(3) = 1 X; X lea 8(a0),a1 ; A1 points at INTIN X movea.l (a1),a1 ; A1 = INTIN X move.w 12(a6),(a1) ; INTIN(0) = fast X; X .dc.w $a009 ; Pseudo Instruction X; X unlk a6 X rts X; X .data X; *** End of mcshow *** X .text X .globl _setclip X_setclip: X; void setclip(spntr,clip,xmnclip,ymnclip,xmxclip,ymxclip) X; LINE_A *spntr; X; int clip; X; int xmnclip, ymnclip; Upper Left Corner X; int xmxclip, ymxclip; Lower Right Corner X; X; Sozobon C Line-A Support by Jim Omura X; X;var 4 8 _spntr X;var 2 12 _clip X;var 2 14 _xmnclip X;var 2 16 _ymnclip X;var 2 18 _xmxclip X;var 2 20 _ymxclip X; X link a6,#-0 X; X movea.l 8(a6),a0 ; A0 = spntr X move.w 12(a6),54(a0) X move.w 14(a6),56(a0) X move.w 16(a6),58(a0) X move.w 18(a6),60(a0) X move.w 20(a6),62(a0) X; X unlk a6 X rts X; X .data X; *** End of setclip *** X .text X .globl _setfmsk X_setfmsk: X; void setfmsk(spntr,wrtmod,patptr,patmsk) X; LINE_A *spntr; X; short wrtmod, *patptr, patmsk; X; X; Set Fill Mask X; Line-A Support Module By Jim Omura X; X;var 4 8 _spntr X;var 2 12 _wrtmod X;var 4 14 _patptr X;var 2 18 _patmsk X; X link a6,#-0 X; X movea.l 8(a6),a0 ; A0 = spntr X move.w 12(a6),36(a0) X move.l 14(a6),46(a0) X move.w 18(a6),50(a0) X; X; No Pseudo Instruction -- Just setting parameters. X; X unlk a6 X rts X; X .data X; *** End of setfmsk *** X .text X .globl _setlmsk X_setlmsk: X; void setlmsk(spntr,wrtmod,lnmask); X; LINE_A *spntr; X; int wrtmod; X; int lnmsk; X; X; Set Line Mask X; Sozobon C Line-A Support by Jim Omura X; X;var 4 8 _spntr X;var 2 12 _wrtmod X;var 2 14 _lnmask X; X link a6,#-0 X; X movea.l 8(a6),a0 ; A0 = spntr X move.w 12(a6),36(a0) X move.w #-1,32(a0) ; _LSTLIN is always -1 X move.w 14(a6),34(a0) X; X; No Pseudo-Op needed -- Just setting data. X; X unlk a6 X rts X; X .data X; *** End of setlmsk *** SHAR_EOF chmod 0644 line_a.s || echo "restore of line_a.s fails" if [ $TOUCH = can ] then touch -am 1110084790 line_a.s fi set `wc -c line_a.s`;Wc_c=$1 if test "$Wc_c" != "5113" then echo original size 5113, current size $Wc_c;fi exit 0 -- Jim Omura, 2A King George's Drive, Toronto, (416) 652-3880 lsuc!jimomura Byte Information eXchange: jimomura