VolksForth/st/LINE_A.FB
2017-04-24 00:25:49 +02:00

1 line
37 KiB
Plaintext
Raw Blame History

\\ *** Line-A Graphic *** cas20130106 This file contains the LINE-A graphic routines. While being sometimes faster than VDI Routines, LINE-A Functions are not supported on some newer Atari ST machines. It is recommended to only use VDI functions in new programs. This library is provided for compatibility reasons to be able to compile old source code. the programs will probablt not work on newer Atari machines. Examples for the use of LINE-A routines can be found in the fileDEMO.FB \ Line A - Graphics Loadscreen cas20130106 Onlyforth \needs Code include assemble.fb .( use of LINE-A is deprecated and will not work on newer ) .( Atari machines. Please use VDI routines instead! ) Vocabulary Graphics Graphics also definitions 1 $10 +thru \ Table offsets 26oct86we base @ decimal 0 >label v_planes 2 >label v_lin_wr 4 >label _cntrl 8 >label _intin 12 >label _ptsin 16 >label _intout 20 >label _ptsout 24 >label _fg_bp_1 26 >label _fg_bp_2 28 >label _fg_bp_3 30 >label _fg_bp_4 32 >label _lstlin 34 >label _ln_mask 36 >label _wrt_mode 38 >label _x1 40 >label _y1 42 >label _x2 44 >label _y2 46 >label _patptr 50 >label _patmsk 52 >label _multifill 54 >label _clip 56 >label _xmn_clip 58 >label _ymn_clip 60 >label _xmx_clip \ Table offsets 26oct86we 62 >label _ymx_clip 64 >label _xacc_dda 66 >label _dda_inc 68 >label _t_sclsts 70 >label _mono_status 72 >label _sourcex 74 >label _sourcey 76 >label _destx 78 >label _desty 80 >label _delx 82 >label _dely 84 >label _fbase 86 >label _fwidth 90 >label _style 92 >label _litemask 94 >label _skewmask 96 >label _weight 98 >label _r_off 100 >label _l_off 102 >label _scale 104 >label _chup 106 >label _text_fg 108 >label _scrtchp 112 >label _scrpt2 114 >label _text_bg 116 >label _copytran base ! \ Variable cas20130106 Variable xmin_clip Variable xmax_clip Variable ymin_clip Variable ymax_clip Variable multi_fill 0 multi_fill ! Variable linemask $FFFF linemask ! \ solid line Variable plane1 1 plane1 ! \ black Variable plane2 1 plane2 ! \ on Variable plane3 0 plane3 ! \ white Variable plane4 0 plane4 ! Variable cur_x 0 cur_x ! Variable cur_y 0 cur_y ! Variable wr_mode 0 wr_mode ! \ overwrite Variable scr_res 2 scr_res ! \ Hires \ arrays 17sep86we Variable pat_mask 1 pat_mask ! Variable pattern Create nopattern 0 , 0 , Create fullpattern $FFFF , $FFFF , fullpattern pattern ! Variable checking checking on Variable clipping clipping off Create a_fonts 4 allot Create a_base 4 allot \ Initialization 17sep86we Create a_setup Assembler $A000 , .l A0 a_base R#) move A1 a_fonts R#) move .w wr_mode R#) _wrt_mode A0 D) move plane1 R#) _fg_bp_1 A0 D) move plane2 R#) _fg_bp_2 A0 D) move plane3 R#) _fg_bp_2 A0 D) move plane4 R#) _fg_bp_4 A0 D) move rts end-code \ line 17sep86we Code line ( x1 y1 x2 y2 -- ) a_setup bsr -1 # _lstlin A0 D) move linemask R#) _ln_mask A0 D) move SP ) _y2 A0 D) move SP )+ cur_y R#) move SP ) _x2 A0 D) move SP )+ cur_x R#) move SP )+ _y1 A0 D) move SP )+ _x1 A0 D) move $A003 , Next end-code \ rectangle 17sep86we Code rectangle ( x1 y1 width heigth -- ) a_setup bsr clipping R#) _clip A0 D) move SP )+ D0 move 2 SP D) D0 add D0 _y2 A0 D) move SP )+ D0 move 2 SP D) D0 add D0 _x2 A0 D) move SP )+ _y1 A0 D) move SP )+ _x1 A0 D) move pattern R#) D6 move D6 reg) A1 lea .l A1 _patptr A0 D) move .w pat_mask R#) _patmsk A0 D) move multi_fill R#) _multifill A0 D) move xmin_clip R#) _xmn_clip A0 D) move ymin_clip R#) _ymn_clip A0 D) move xmax_clip R#) _xmx_clip A0 D) move ymax_clip R#) _ymx_clip A0 D) move $A005 , Next end-code \ Maus-Functions 17sep86we Code show_mouse a_setup bsr .l _cntrl A0 D) A1 move .w 2 A1 D) clr 1 # 6 A1 D) move .l _intin A0 D) A1 move A1 ) clr $A009 , Next end-code Code hide_mouse $A00A , Next end-code Code form_mouse ( addr -- ) a_setup bsr .l _intin A0 D) A1 move .w SP )+ D6 move D6 reg) A0 lea A0 )+ A1 )+ move A0 )+ A1 )+ move 1 # A1 )+ move 0 # A1 )+ move 1 # A1 )+ move $10 D0 moveq D0 DO .l A0 )+ A1 )+ move LOOP $A00B , Next end-code \ copyraster bp 12oct86 cr .( For copyraster use VDI-Functions !!) cr \\ $10 loadfrom gem\vdi.scr \ Checking cas20130106 | Create g_limits &320 , &200 , &640 , &200 , &640 , &400 , Code get_res ( -- flag ) 4 # A7 -) move $0E trap 2 A7 addq D0 SP -) move Next end-code | : (check \ checking @ 0= ?exit dup g_limits scr_res @ 4 * 2+ + @ > abort" Y-Value too big" over g_limits scr_res @ 4 * + @ > abort" X-Value too big" ; Code check ( x y -- x y ) checking R#) tst 0= IF NEXT THEN ;c: (check ; \ relative set draw clipping 18sep86we Code relative ( dx dy -- x y ) SP )+ D0 move cur_y R#) D0 add SP )+ D1 move cur_x R#) D1 add D1 SP -) move D0 SP -) move Next end-code : set ( x y -- ) check cur_y ! cur_x ! ; : draw ( x y -- ) check cur_x @ cur_y @ 2swap line ; : clip_window ( x1 y1 x2 y2 -- ) clipping on ymax_clip ! xmax_clip ! ymin_clip ! xmin_clip ! ; \ box 18sep86we Code box ( width heigth -- ) cur_y R#) D4 move D4 D7 move SP )+ D7 add cur_x R#) D3 move D3 D5 move SP )+ D5 add a_setup bsr D3 _x1 A0 D) move D4 _y1 A0 D) move D5 _x2 A0 D) move D4 _y2 A0 D) move $A003 , a_setup bsr D5 _x1 A0 D) move D4 _y1 A0 D) move D5 _x2 A0 D) move D7 _y2 A0 D) move $A003 , a_setup bsr D3 _x1 A0 D) move D7 _y1 A0 D) move D5 _x2 A0 D) move D7 _y2 A0 D) move $A003 , a_setup bsr D3 _x1 A0 D) move D4 _y1 A0 D) move D3 _x2 A0 D) move D7 _y2 A0 D) move $A003 , Next end-code \ +sprite -sprite 11dec86we Code +sprite ( sprt_def_blk sprt_sav_blk x y -- ) SP )+ D1 move SP )+ D0 move SP )+ D6 move D6 reg) A2 lea SP )+ D6 move D6 reg) A0 lea .l $1E A7 -) movem> $A00D , $7800 A7 )+ movem< Next end-code Code -sprite ( sprt_sav_blk -- ) SP )+ D6 move D6 reg) A2 lea .l $1E A7 -) movem> $A00C , $7800 A7 )+ movem< Next end-code \ put_pixel get_pixel 17sep86we Code put_pixel ( x y color -- ) a_setup bsr .l a_base R#) A0 move _intin A0 D) A1 move .w SP )+ A1 ) move .l _ptsin A0 D) A1 move .w SP )+ 2 A1 D) move SP )+ A1 ) move $A001 , Next end-code Code get_pixel ( x y -- color ) a_setup bsr .l a_base R#) A0 move _ptsin A0 D) A1 move .w SP )+ 2 A1 D) move SP )+ A1 ) move $A002 , D0 SP -) move Next end-code \ polygon 17sep86we Code polygon ( x1 y1 ... xn yn n ) a_setup bsr clipping R#) _clip A0 D) move pattern R#) D6 move D6 reg) A1 lea .l A1 _patptr A0 D) move .w pat_mask R#) _patmsk A0 D) move multi_fill R#) _multifill A0 D) move xmin_clip R#) _xmn_clip A0 D) move ymin_clip R#) _ymn_clip A0 D) move xmax_clip R#) _xmx_clip A0 D) move ymax_clip R#) _ymx_clip A0 D) move .l _cntrl A0 D) A1 move .w SP ) 2 A1 D) move SP )+ D0 move 2 # D0 asl 2 D0 subq D0 D5 move $7FFF # D3 move 0 D4 moveq \ polygon forts. 17sep86we .l _ptsin A0 D) A1 move BEGIN .w 0 D0 SP DI) D1 move D1 A1 )+ move D0 1 # btst 0= IF D1 D3 cmp CC IF D1 D3 move THEN D1 D4 cmp CS IF D1 D4 move THEN THEN D0 tst 0<> WHILE 2 D0 subq REPEAT 0 D5 SP DI) A1 )+ move 2 D5 subq 0 D5 SP DI) A1 ) move 4 D5 addq D5 SP adda .l A0 D5 move BEGIN D5 A0 move .w D3 _y1 A0 D) move $A006 , 1 D3 addq D3 D4 cmp 0= UNTIL Next end-code \ \ Line A - Graphics Loadscreen Line-A Routinen erhalten ein eigenes Vocabular. \ Table offsets 01jan86we Die Definitionen auf diesem Screen enthalten die sogenannten Line_A Variablen. Der Aufruf <20>ber $A000 liefert unter anderem die Basisadresse dieser Variablen zur<75>ck. Wenn diese Definitionen in anderen Programmen mitgenutzt werden sollen, m<>ssen diese beiden Screens mit 2 LOADFROM LINE_A.SCR und 3 LOADFROM LINE_A.SCR eingebunden werden. \ Table offsets 01jan86we Die Beschreibung der Line_A Variablen findet man in der ent- sprechenden Literatur (hoffentlich bald!!). Bei jeder Line_A Routine l<><6C>t sich am Quelltext sehen, welche Variablen gerade benutzt werden. Allerdings sind unsere Unter- lagen (ATARI-Entwicklungspaket) auch nicht besonders aussage- f<>hig.... \ Variable bp 12oct86 Diese vier Variablen beschreiben das 'Clipping-Window'. Damit lassen sich alle Ausgaben auf dieses Window beschr<68>nken. Anzahl der Planes f<>r F<>llmuster Bitmuster f<>r Linien ($FFFF = durchgezogen) Mit diesen vier Variablen werden die Farben der Planes fest- gelegt. Hilfsvariable zur Vereinfachung bei Draw. Enth<74>lt die Endkoordi- naten der zuletzt gezeichneten Linie. Schreibmodus: 0=over, 1= trans, 2=exor, 3=invtrans Bildschirmaufl<66>sung: 0=320x200, 1=320x400, 2=640x400 \ arrays 17sep86we Enth<74>lt die Anzahl - 1 der Worte in Arrays f<>r F<>llmuster. Enth<74>lt die Adresse des aktuellen F<>llmusters. Zwei wichtige F<>llmuster: Leer und voll Flag, ob die Koordinaten <20>berpr<70>ft werden sollen (Geschwindigk.)Flag, ob mit Clipping gearbeitet wird. speichert die lange Adresse der Zeichs<68>tze. speichert die lange Basis-Adresse der Line_A Variablen \ Initialization 17sep86we Wird bei vielen Routinen zu Beginn benutzt. $A000 <20>bergibt in A0 a_base, in A1 a_fonts Schreibmodus und die Farben der Planes <20>bergeben Alle diese Werte werden aus den FORTH-Variablen in die ent- sprechenden Line_A Variablen geschrieben. \ line 17sep86we zeichnet eine Gerade von (x1,y1) nach (x2,y2). Initialisierung Original-Ton ATARI: Set it to -1 and forget it ! Die Werte f<>r x2,y2 werden auch in cur_x und cur_y gemerkt. \ rectangle 17sep86we zeichnet ein gef<65>lltes Rechteck mit x1,y1 als oberer linker Ecke und width und height als Breite und H<>he. Umrechnung von Breite und H<>he in Koordinaten Adresse des F<>llmusters <20>bergeben. Anzahl der Worte im F<>llmuster Anzahl der Planes f<>r F<>llmuster Koordinaten des Clipping-Rechtecks \ Maus-Functions 17sep86we schaltet Maus-Cursor ein CONTRL(1) wird gel<65>scht und CONTRL(3) auf 1 gesetzt (???) INTIN(0) wird gel<65>scht, sonst wird die Anzahl der hide-Aufrufe ber<65>cksichtigt (s.a. c-flag beim entsprechenden VDI-Aufruf) schaltet Maus-Cursor aus. Damit kann eine eigene Mausform entwickelt werden. Adresse enth<74>lt ein Array mit folgendem Aufbau: Maskenfarbe, Datenfarbe 16 Worte Maske 16 Worte Daten \ copyraster bp 12oct86 Die Copyrasterfunktionen verlangen eine sehr komplexe Parameter- <20>bergabe. Diese ist im File VDI.SCR an der entsprechenden Stelle enthalten. Da diese Funktion gegen<65>ber der VDI-Funktion kaum Geschwindigkeitsvorteile bringt, wurde auf die nochmalige Definition hier verzichtet. Wen's interessiert, m<>ge im File VDI.SCR unter Rasterfunctions nachlesen. So l<>dt man den entsprechenden Teil der VDI-Bibliothek ! Dieser Teil wird schon vom Editor ben<65>tigt und ist daher im System normalerweise schon vorhanden. \ Checking 18sep86we Array mit den Grenzen f<>r die drei Aufl<66>sungsstufen. flag=0 bei 320x200, flag=1 bei 320x400, flag=2 bei 640x400 <20>berpr<70>ft, ob x und y innerhalb des Bildschirms liegen. Ansonsten erfolgt Abbruch. Diese Pr<50>fung kostet Zeit, erspart aber Systemabst<73>rze bei falschen Parametern. pr<70>ft x und y, wenn checking eingeschaltet ist. \ relative set draw clipping 18sep86we berechnet aus den Offsets dx und dy und den in cur_y und cur_y gespeicherten Werten die neuen Koordinaten x und y. setzt cur_x und cur_y zeichnet eine Linie von (cur_x,cur_y) nach (x,y). setzt das Clipping-Window und schaltet clipping ein. \ box 18sep86we zeichnet ein ungef<65>lltes Rechteck mit der Breite width und H<>he height. Die Koordinaten der linken oberen Ecke werden aus cur_x und cur_y entnommen. Das ganze besteht aus vier einzelnen Geraden. \ +sprite -sprite 17sep86we zeichnet ein Sprite und speichert den Bildschirm sprt_def_blk enth<74>lt die Sprite-Daten sprt_sav_blk ist die Adresse des Zwischenspeichers f<>r den Bild- schirm. Es werden pro Plane 64 Byte ben<65>tigt. (x,y) ist der 'Hotspot' des Sprites. l<>scht das Sprite und restauriert den Bildschirm. Der sprt_def_blk hat folgenden Aufbau: x-offset zum Hotspot, y-offset zum Hotspot Format-Flag, Hintergrundfarbe, Zeichenfarbe 32 Worte mit Muster: Hintergrund 1.Zeile, Vordergrund 1.Zeile Hintergrund 2.Zeile, Vordergrund 2.Zeile usw. \ put_pixel get_pixel 17sep86we zeichnet ein Pixel am Punkt (x,y) mit Farbe color. Man kann definieren: : plot ( x y -- ) 1 putpixel ; : unplot ( x y -- ) 0 putpixel ; color ist die Farbe des Punktes (x,y). \ polygon 17sep86we zeichnet ein n-Eck mit den Eckpunkten (x1,y1) ... (xn,yn). Clipping auswerten F<>llmuster <20>bergeben F<>llmustermaske und Anzahl der Planes <20>bergeben Clipping-Window setzen Anzahl der Ecken Eckpunkte ins ptsin-Array <20>bernehmen D3 und D4 enthalten die Koordianten des gr<67><72>ten Punktes \ polygon forts. 17sep86we f<>r die F<>llfunktion Werte <20>bergeben und D3,D4 ggf updaten. ersten Punkt wiederholen, vereinfacht die <20>bergabe $A006 so oft aufrufen, bis das n-Eck vollst<73>ndig gef<65>llt ist.