amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (02/19/91)
Submitted-by: dm@stekt.oulu.fi (Hannu Helminen ti) Posting-number: Volume 91, Issue 018 Archive-name: applications/mandel-1.0/part02 #!/bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 2 (of 4)." # Contents: source/gui.asm.ab source/gui.asm.ac # Wrapped by tadguy@ab20 on Mon Feb 18 17:25:39 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'source/gui.asm.ab' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'source/gui.asm.ab'\" else echo shar: Extracting \"'source/gui.asm.ab'\" \(25782 characters\) sed "s/^X//" >'source/gui.asm.ab' <<'END_OF_FILE' X beq.s no_bl X move.w d2,d0 X move.w d5,d1 X Call DrawBorder Xno_bl: X move.l a4,a1 X move.l a2,a0 X move.l a1,pic_tr X beq.s no_tr X move.w d4,d0 X move.w d3,d1 X Call DrawBorder Xno_tr: X move.l a5,a1 X move.l a2,a0 X move.l a1,pic_br X beq.s no_br X move.w d4,d0 X move.w d5,d1 X Call DrawBorder Xno_br: X pull a3-a5 X bra.s draw_pulling Xpig_big: X clr.l pic_tl X clr.l pic_bl X clr.l pic_tr X clr.l pic_br Xdraw_pulling: X pull a0-a2/a6/d0-d7 Xdraw_over: X rts X Xcalculate: X* Calculate centerpoint coordinates. X* Only needed when string gadget updated. X* The formula we use is (CurrentX - mb_x(a4)) / mb_dx(a4) (for x) X* and because I would have to use 32-bit division which my processor X* does unfortunately not have any instructions for, we use 16-bit X* division, which is much more tricky! X X* Another problem occurs when user enters a number that is NOT X* in the visible area. Because our number system can only represent X* numbers from -4 to 4, we have no reliable way of telling whether X* user wants to see grid to be (arrows!) to the LEFT, for instance, X* or to the RIGHT. X X* Currently any such numbers map to RIGHT and DOWN. One could try X* to fix it by choosing numbers that are as close to previous prex X* and prey as possible. X* I wont try to code that, however, my hair is grey enough now. X X push d0-d4 X move.l mb_dx(a4),d2 X move.l CurrentX,d4 X sub.l mb_x0(a4),d4 Xfix_div_x: X cmp.l #$10000,d2 X blo.s fixed_x X lsr.l #1,d2 X lsr.l #1,d4 X bra.s fix_div_x Xfixed_x: X divu d2,d4 X move.l d4,d0 ; renormalize remainder X clr.w d0 X divu d2,d0 X swap d0 X move.w d4,d0 X X move.l mb_dy(a4),d2 X move.l mb_y0(a4),d4 X sub.l CurrentY,d4 Xfix_div_y: X cmp.l #$10000,d2 X blo.s fixed_y X lsr.l #1,d2 X lsr.l #1,d4 X bra.s fix_div_y Xfixed_y: X divu d2,d4 X move.l d4,d1 X clr.w d1 X divu d2,d1 X swap d1 X move.w d4,d1 X X swap d0 X swap d1 X X move.l d0,prex X move.l d1,prey X pull d0-d4 X rts X XStringGadgetDown: X* GadgetID in d1 X and.w #IDMASK,d1 X X* We will wait for another message, thenafter we know the user has X* finished playing with the string gadget. This message could be the X* GADGETUP of same gadget, but then again, it could be something X* else. X* We must preserve the message (so that main loop may handle it). X move.l a5,a1 ; save gadget X bsr GetMessage X X move.l gg_SpecialInfo(a1),a0 X move.l si_Buffer(a0),a0 ; addr of the actual string X X cmp.w #GAD_X,d1 X beq.s gadget_x X cmp.w #GAD_Y,d1 X beq.s gadget_y X cmp.w #GAD_M,d1 X beq gadget_m X cmp.w #GAD_Z,d1 X beq.s gadget_z X* now it must be IGadget X bsr GetNum X beq.s 2$ X tst.b (a0) X beq.s 1$ X2$: X move.w mb_i(a4),d0 X1$: move.w d0,mb_i(a4) X bsr refresh_i X bra.s gadget_done X Xgadget_x: X bsr GetFixed X beq.s 2$ X tst.b (a0) ; if user entered some ugly stuff after numbers X beq.s 1$ X2$: X move.l CurrentX,d0 ; invalid -> get previous X1$: move.l d0,CurrentX X bsr calculate X bsr refresh_x X bsr DrawGrid X bra.s gadget_done X Xgadget_y: X bsr GetFixed X beq.s 2$ X tst.b (a0) X beq.s 1$ X2$: X move.l CurrentY,d0 X1$: move.l d0,CurrentY X bsr calculate X bsr refresh_y X bsr DrawGrid X bra.s gadget_done X Xgadget_z: X bsr GetSMagnify X beq.s 2$ X tst.b (a0) X beq.s 1$ X2$: X move.l Zoom,d0 X1$: move.l d0,Zoom X bsr refresh_z X bra.s gadget_done Xgadget_m: X bsr GetMagnify X beq.s 2$ X tst.b (a0) X beq.s 1$ X2$: X move.l Magnify,d0 X1$: move.l d0,Magnify X bsr refresh_m X Xgadget_done: X moveq #0,d0 X Xget_rid_of_us: X rts X X XOtherGadgetDown: X* GadgetID in d1 X move.w d1,d0 X and.w #ZOOMTYPE,d0 X beq not_zoom_gadget X and.w #IDMASK,d1 X X move.b #ZOOM,d0 X cmp.w #GAD_ZOOM,d1 X beq.s 1$ X X move.b #REDRAW,d0 X cmp.w #GAD_DRAW,d1 X beq.s 1$ X X move.b #RESET,d0 X1$: X move.b d0,method X bsr refresh_zoom X* Double-click to start drawing X move.l OldSecs,d0 X move.l OldMicros,d1 X move.l a2,d2 X move.l a3,d3 X move.l a2,OldSecs X move.l a3,OldMicros X Call DoubleClick X tst.w d0 X beq.s not_yet X moveq #-1,d0 ; result is negative Xnot_yet: X rts X Xnot_zoom_gadget: X move.w d1,d0 X and.w #SETTYPE,d0 X beq.s not_set_gadget X and.w #IDMASK,d1 X X bclr.b #MBB_JULIA,mb_flags(a4) X cmp.w #GAD_MANDEL,d1 X beq.s 1$ X bset.b #MBB_JULIA,mb_flags(a4) X1$: X bsr refresh_set X X moveq #FALSE,d0 X rts X Xnot_set_gadget: X cmp.w #GAD_QUIT,d1 X bne.s not_quit_gadget X* Double-click to exit X move.l OldSecs,d0 X move.l OldMicros,d1 X move.l a2,d2 X move.l a3,d3 X move.l a2,OldSecs X move.l a3,OldMicros X Call DoubleClick X tst.w d0 X beq.s first_click X moveq #TRUE,d0 ; +1 -> quitting Xfirst_click: X rts X Xnot_quit_gadget: X and.w #IDMASK,d1 X moveq #0,d7 X move.w d1,d7 Xit_was_timer: X bsr plus_minus X lea IOreq,a1 X X* Shortage of registers -- we must use upper half of d7 X swap d7 X move.l #400000,d0 ; .4 seconds initial delay X tst.w d7 X beq.s huu_haa_joo_jaa X move.l #100000,d0 ; .1 seconds next 9 X cmp.w #9,d7 X blo.s huu_haa_joo_jaa X move.l #020000,d0 ; 1/25 seconds X move.w #-2,d7 ; neverending! Xhuu_haa_joo_jaa: X addq.w #1,d7 X swap d7 X X move.w #TR_ADDREQUEST,IO_COMMAND(a1) X move.l #0,IOTV_TIME+TV_SECS(a1) X move.l d0,IOTV_TIME+TV_MICRO(a1) X move.l a1,UseReq X Base Exec X Call SendIO X bsr GetMessage X bne.s 1$ ; that old ^C X cmp.w #FAKECLASS,d2 X beq.s it_was_timer X moveq #FALSE,d7 X bra.s 2$ X1$: X moveq #TRUE,d7 X2$: X move.l UseReq,a1 X Call AbortIO X move.l UseReq,a1 X Call WaitIO X clr.l UseReq X tst.w d7 X rts X X moveq #0,d0 X rts X Xplus_minus: X* GadgetID in d2 X push d0-d1 X move.w d7,d0 X moveq #1,d1 X and.w #$7fff,d0 X cmp.w #GAD_X,d0 X bne.s skip_x X X move.l mb_dx(a4),d0 X swap d1 X tst.w d7 X bpl.s 1$ X neg.l d0 X neg.l d1 X1$: X add.l d0,CurrentX X add.l d1,prex X move.l CurrentX,d0 X bsr refresh_x X bsr DrawGrid X bra plus_minus_done Xskip_x: X cmp.w #GAD_Y,d0 X bne.s skip_y X X move.l mb_dy(a4),d0 X swap d1 X tst.w d7 X bpl.s 1$ X neg.l d0 X neg.l d1 X1$: X add.l d0,CurrentY X sub.l d1,prey X move.l CurrentY,d0 X bsr refresh_y X bsr DrawGrid X bra.s plus_minus_done Xskip_y: X cmp.w #GAD_M,d0 X bne.s skip_m X X move.l #$1999,d0 X tst.w d7 X bpl.s 1$ X neg.l d0 X1$: X add.l d0,Magnify X move.l Magnify,d0 X bsr refresh_m X bra.s plus_minus_done Xskip_m: X cmp.w #GAD_Z,d0 X bne.s skip_z X X move.l #$1999,d0 X tst.w d7 X bpl.s 1$ X neg.l d0 X1$: X add.l d0,Zoom X move.l Zoom,d0 X bsr refresh_z X bra.s plus_minus_done Xskip_z: X cmp.w #GAD_I,d0 X bne.s plus_minus_done X X tst.w d7 X bpl.s 1$ X neg.l d1 X1$: X add.w d1,mb_i(a4) X move.w mb_i(a4),d0 X bsr refresh_i Xplus_minus_done: X pull d0-d1 X rts X X X X* This group of routines updates whatever visual clues the user might X* have about the current situation. X X* NOTE: a DrawGrid is needed after every refresh_x or refresh_y. X* (To avoid drawing it twice if both coords updated) X X* d0 is the fresh number. X* Preserves all registers. Xrefresh_x: X push d0-d2/d7/a0-a3/a6 X move.l MyWindow2,a2 ; save thing from being overwritten X lea XGadget,a3 X* If in MANDEL mode, alter c = jx + jy settings. X* So user may set jx,jy, enter JULIA mode and still X* select another point. X btst.b #MBB_JULIA,mb_flags(a4) X bne.s 1$ X move.l d0,mb_jx(a4) X1$: X move.l d0,d2 X X move.l a2,a0 ; window X move.l a3,a1 ; gadget X Base Intuition X Call RemoveGadget ; remove, modify, add back. X* Later we will insert this gadget back to its original place. X* That is why d2 gets position. toDec needs number in d0. X exg.l d0,d2 X X move.l gg_SpecialInfo(a3),a0 X move.l si_Buffer(a0),a0 X X move.l mb_dx(a4),d7 ; delta (see toDec why) X bsr toDec X clr.b (a0) X X bsr refresh_add_gadget X pull d0-d2/d7/a0-a3/a6 X rts Xrefresh_y: X push d0-d2/d7/a0-a3/a6 X move.l MyWindow2,a2 ; save things from being overwritten X lea YGadget,a3 X X btst.b #MBB_JULIA,mb_flags(a4) X bne.s 1$ X move.l d0,mb_jy(a4) X1$: X move.l d0,d2 X X move.l a2,a0 ; window X move.l a3,a1 ; gadget X Base Intuition X Call RemoveGadget ; remove, modify, add back. X X exg.l d0,d2 X X move.l gg_SpecialInfo(a3),a0 X move.l si_Buffer(a0),a0 X X move.l mb_dy(a4),d7 ; delta (see toDec why) X bsr toDec X clr.b (a0) X X bsr refresh_add_gadget X pull d0-d2/d7/a0-a3/a6 X rts Xrefresh_z: X push d0-d2/a0-a3/a6 X move.l MyWindow2,a2 ; save thing from being overwritten X lea ZGadget,a3 X move.l d0,d2 X X move.l a2,a0 ; window X move.l a3,a1 ; gadget X Base Intuition X Call RemoveGadget ; remove, modify, add back. X* Later we will insert this gadget back to its original place. X* That is why d2 gets position. toDec needs number in d0. X exg.l d0,d2 X X move.l gg_SpecialInfo(a3),a0 X move.l si_Buffer(a0),a0 X X move.b #'+',d1 X tst.l d0 X bpl.s 1$ X neg.l d0 X move.b #'-',d1 X1$: X move.b d1,(a0)+ X X bsr toMag X clr.b (a0) X X bsr refresh_add_gadget X X cmp.b #REDRAW,method X bne.s 2$ X move.l OldMagnify,d0 X move.l d0,Magnify X bsr refresh_m ; to show magnify is again normal X move.b #ZOOM,method ; NOTE: this must be AFTER refresh_m X bsr refresh_zoom ; does also DrawGrid X bra.s 3$ ; so dont waste time doing it again X2$: X bsr DrawGrid X3$: X pull d0-d2/a0-a3/a6 X rts Xrefresh_i: X push d0-d2/a0-a3/a6 X move.l MyWindow2,a2 ; save thing from being overwritten X lea IGadget,a3 X move.l d0,d2 X X move.l a2,a0 ; window X move.l a3,a1 ; gadget X Base Intuition X Call RemoveGadget ; remove, modify, add back. X* Later we will insert this gadget back to its original place. X* That is why d2 gets position. toDec needs number in d0. X exg.l d0,d2 X X move.l gg_SpecialInfo(a3),a0 X move.l si_Buffer(a0),a0 X X bsr toInt X clr.b (a0) X X bsr.s refresh_add_gadget X pull d0-d2/a0-a3/a6 X rts Xrefresh_m: X push d0-d2/a0-a3/a6 X move.l MyWindow2,a2 ; save thing from being overwritten X lea MGadget,a3 X move.l d0,d2 X X move.l a2,a0 ; window X move.l a3,a1 ; gadget X Base Intuition X Call RemoveGadget ; remove, modify, add back. X* Later we will insert this gadget back to its original place. X* That is why d2 gets position. toDec needs number in d0. X exg.l d0,d2 X X move.l gg_SpecialInfo(a3),a0 X move.l si_Buffer(a0),a0 X X bsr toMag X clr.b (a0) X X bsr.s refresh_add_gadget X X cmp.b #ZOOM,method X bne.s 1$ X move.b #REDRAW,method X bsr refresh_zoom ; does also DrawGrid, X bra.s 2$ ; so dont repeat it. X1$: X bsr DrawGrid X2$: X pull d0-d2/a0-a3/a6 X rts X X* This is common to all above. Xrefresh_add_gadget: X move.l gg_SpecialInfo(a3),a0 X clr.w si_BufferPos(a0) X clr.w si_DispPos(a0) X move.l a2,a0 ; window X move.l a3,a1 ; gadget X move.l d2,d0 ; the very same position X Call AddGadget X move.l a3,a0 ; gadget X move.l a2,a1 ; window X sub.l a2,a2 ; "requester / no requester" X moveq #1,d0 X Call RefreshGList ; actually just one X rts X X* Hah haa! Still more refreshing routines: X Xrefresh_set: X push d0-d2/a0-a3/a5/a6 X Base Intuition X move.l MyWindow2,a0 X move.l a0,a5 X lea MANDELGadget,a1 X move.l a1,a3 X moveq #2,d0 X Call RemoveGList X X lea JULIAGadget,a1 X btst.b #MBB_JULIA,mb_flags(a4) X beq.s it_is_mandel X X or.w #SELECTED,gg_Flags(a1) X and.w #~SELECTED,gg_Flags(a3) X bra.s put_them_back Xit_is_mandel: X and.w #~SELECTED,gg_Flags(a1) X or.w #SELECTED,gg_Flags(a3) Xput_them_back: X move.l a5,a0 ; window X move.l a3,a1 ; gadget X sub.l a2,a2 ; requester X ; d0 is all right (RemoveGList...) X moveq #2,d1 X Call AddGList X X move.l a3,a0 ; gadget X move.l a5,a1 ; window X ; a2 is still 0. (Dunno if it should be 0 anyway?) X moveq #2,d0 X Call RefreshGList X X pull d0-d2/a0-a3/a5/a6 X rts X Xrefresh_zoom: X push d0-d2/a0-a3/a5/a6 X Base Intuition X move.l MyWindow2,a0 X move.l a0,a5 X lea ZOOMGadget,a1 X move.l a1,a3 X moveq #3,d0 X Call RemoveGList X X lea DRAWGadget,a2 X lea RESETGadget,a1 X X move.b method,d1 X cmp.b #REDRAW,d1 X beq.s it_is_draw X cmp.b #RESET,d1 X beq.s it_is_reset X X or.w #SELECTED,gg_Flags(a3) ; zoom X and.w #~SELECTED,gg_Flags(a2) X and.w #~SELECTED,gg_Flags(a1) X bra.s complex_and_unique_label Xit_is_draw: X and.w #~SELECTED,gg_Flags(a3) X or.w #SELECTED,gg_Flags(a2) ; draw X and.w #~SELECTED,gg_Flags(a1) X bra.s complex_and_unique_label Xit_is_reset: X and.w #~SELECTED,gg_Flags(a3) X and.w #~SELECTED,gg_Flags(a2) X or.w #SELECTED,gg_Flags(a1) ; reset Xcomplex_and_unique_label: X move.l a5,a0 ; window X move.l a3,a1 ; gadget X sub.l a2,a2 ; requester X ; d0 is all right (RemoveGList...) X moveq #3,d1 X Call AddGList X X move.l a3,a0 ; gadget X move.l a5,a1 ; window X ; a2 is still 0. (Dunno if it should be 0 anyway?) X moveq #3,d0 X Call RefreshGList X X pull d0-d2/a0-a3/a5/a6 X bsr DrawGrid ; if something changed, show it. X rts X X XGetSMagnify: X move.b (a0)+,d0 X cmp.b #'+',d0 X beq.s 1$ X cmp.b #'-',d0 X beq.s 2$ X subq.l #1,a0 X1$: X bsr GetMagnify X rts X2$: X bsr GetMagnify X beq.s 3$ X neg.l d0 X3$: X rts X XRightButton: X clr.b method ; == move.b #ZOOM,method X ; so RMB is a shorthand for ZOOM X bsr refresh_zoom X move.w d5,d0 X move.w d6,d1 X X push d5/d6 X swap d5 X swap d6 X clr.w d5 X clr.w d6 X bsr refresh_pos X pull d5/d6 X X* a few words of explanation: X* Because we cannot process MOUSEMOVE events fast enough, we do X* the following: Loop CheckMessage, saving d5/d6 each turn, X* until it returns event that isn't of class MOUSEMOVE. X* Then process saved d5/d6 (they represent the position mouse was X* in BEFORE this message arrived). X* If message is of class NULL (no messages), start it all again. X Xrightloop: X move.w d5,tmpx X move.w d6,tmpy X push d0-d1 X bsr CheckMessage X pull d0-d1 X bne do_the_wrong_thing X Xwe_have_already_got_one: X cmp.l #MOUSEMOVE,d2 X beq.s rightloop X X push d0-d2/d5/d6 ; so as not to trash current message X X* Uh oh... When I thought it would be nice if user could use X* magnification instead of deltas, I knew I would have to X* code 2^(-mag) in mach lang. But it never occured to me that X* I would have to code log2 somewhere.... X* There is only one word to describe this: disqusting X push d0/d1 ; again! X sub.w tmpx,d0 X bpl.s notneg1 X neg.w d0 Xnotneg1: X sub.w tmpy,d1 X bpl.s notneg2 X neg.w d1 Xnotneg2: X bne.s r_isnonzero X tst.w d0 X beq.s r_iszero Xr_isnonzero: X move.w mb_x2(a4),d2 X sub.w mb_x1(a4),d2 X swap d0 X clr.w d0 X divu d2,d0 X bvc.s no_overf_1 X moveq #-1,d0 Xno_overf_1: X move.w mb_y2(a4),d2 X sub.w mb_y1(a4),d2 X swap d1 X clr.w d1 X divu d2,d1 X bvc.s no_overf_2 X moveq #-1,d1 Xno_overf_2: X cmp.w d1,d0 X bhi.s d0_is_higher X move.w d1,d0 Xd0_is_higher: X bsr log2 ; I will code it later, ok? X move.l d0,Zoom Xr_iszero: X pull d0/d1 X move.w tmpx,d5 X move.w tmpy,d6 X add.w d0,d5 X add.w d1,d6 X swap d5 X swap d6 X clr.w d5 X clr.w d6 X X move.l mb_dx(a4),d1 X move.l mb_dy(a4),d2 X lsr.l #1,d1 X lsr.l #1,d2 X X lsr.l #1,d5 X tst.w d5 X bmi.s 1$ X moveq #0,d1 X1$: X lsr.l #1,d6 X tst.w d6 X bmi.s 2$ X moveq #0,d2 X2$: X move.l d5,prex X move.l d6,prey X swap d5 X swap d6 X bsr Position X add.l d1,d5 X sub.l d2,d6 X move.l d5,CurrentX X move.l d6,CurrentY X move.l d5,d0 X bsr refresh_x X move.l d6,d0 X bsr refresh_y X move.l Zoom,d0 X bsr refresh_z ; This will do DrawGrid also. X pull d0-d2/d5/d6 X tst.l d2 X bne.s exit_right_button ; probably MENUUP X X* How cute!!! LOVELY!!! Even here, this proggie refuses to busywait!!!! X bsr GetMessage ; (ya see, no CheckMessage!) X bne.s do_the_wrong_thing X cmp.l #MOUSEMOVE,d2 X bne.s exit_right_button X move.w d5,tmpx X move.w d6,tmpy X bra we_have_already_got_one X Xexit_right_button: X moveq #0,d0 Xdo_the_wrong_thing: X rts X Xrefresh_pos: X push d0 X move.l d5,prex X move.l d6,prey X swap d5 X swap d6 X bsr Position X move.l d5,CurrentX X move.l d6,CurrentY X move.l d5,d0 X bsr refresh_x X move.l d6,d0 X bsr refresh_y X bsr DrawGrid X pull d0 X rts X XLeftButton: X move.l OldSecs,d0 X move.l OldMicros,d1 X move.l a2,d2 X move.l a3,d3 X move.l a2,OldSecs X move.l a3,OldMicros X Call DoubleClick X tst.w d0 X bne.s left_double X X* We use a loop similar to RightButton's. Xleftloop X move.w d5,tmpx X move.w d6,tmpy X bsr CheckMessage X bne left_aborted ; ^C Xleft_gotmessage X cmp.l #MOUSEMOVE,d2 X beq.s leftloop X X push d5/d6 X swap d5 X swap d6 X clr.w d5 X clr.w d6 X bsr refresh_pos X pull d5/d6 X X tst.l d2 X bne.s left_exit ; probably SELECTUP X X bsr GetMessage X bne.s left_aborted X cmp.l #MOUSEMOVE,d2 X bne.s left_exit X move.w d5,tmpx X move.w d6,tmpy X bra left_gotmessage Xleft_exit X moveq #FALSE,d0 ; return zero X bra.s left_return Xleft_double X swap d5 X swap d6 X clr.w d5 X clr.w d6 X bsr refresh_pos X moveq #TRUE,d0 ; return positive nonzero X bra.s left_return Xleft_aborted X moveq #-TRUE,d0 ; return negative nonzero Xleft_return X rts X X X* Converts an integer from d0.w to a string (a0)+. X* Grr.. Why don't we have most significant digit last? XtoInt: X push d0-d2 X move.w #10000,d1 X moveq #FALSE,d2 X1$: X and.l #$ffff,d0 X divu d1,d0 X bne.s 4$ X tst.w d2 ; discard leading zeros X beq.s 2$ X4$: X add.b #'0',d0 X move.b d0,(a0)+ X moveq #TRUE,d2 X2$: X swap d0 X ext.l d1 X divu #10,d1 X bne.s 1$ X X tst.w d2 X bne.s 3$ X move.b #'0',(a0)+ ; if d0=0, display at least a 0. X3$: X pull d0-d2 X rts X X* Still one more conversion routine. (for Magnify's internal format) XtoMag: X push d0-d2 X move.l d0,d1 X swap d0 X bsr.s toInt X move.b #'.',(a0)+ X X moveq #3,d2 X1$: X mulu #10,d1 X swap d1 X add.b #'0',d1 X move.b d1,(a0)+ X swap d1 X dbf d2,1$ X X tst.w d1 X bpl.s 2$ ; if < $8000, no rounding needed X bsr Round X2$: X pull d0-d2 X rts X X XdispCoords: X* This routine displays the coordinates of current mouse position X* in screen title bar. X bsr.s Position X lea CoordText,a0 X move.l d5,d0 X move.l mb_dx(a4),d7 X bsr.s toDec X move.b #' ',(a0)+ X move.l d6,d0 X move.l mb_dy(a4),d7 X bsr.s toDec X clr.b (a0)+ X* There was a time when I used SetWindowTitles here. X* But the flashing... and the speed (or rather lack of)... X X move.l MyScreen,a0 X lea sc_RastPort(a0),a0 X lea Coords,a1 X moveq #80,d0 X moveq #0,d1 X Call PrintIText X X rts X X* Fetch absolute position in complex plane when d5/d6 has X* mouse position. Return result also in d5/d6. XPosition: X push d0 X move.w d5,d0 X mulu mb_dx(a4),d5 X swap d5 X clr.w d5 X mulu 2+mb_dx(a4),d0 X add.l d0,d5 X add.l mb_x0(a4),d5 X X move.w d6,d0 X mulu mb_dy(a4),d6 X swap d6 X clr.w d6 X mulu 2+mb_dy(a4),d0 X add.l d0,d6 X neg.l d6 X add.l mb_y0(a4),d6 X pull d0 X X rts X X* toDec is the reverse of GetFixed. I will use a couple look-up tables X* here, too. X* INPUTS fixed point in d0, buffer in a0, delta in d7. X* RETURN next a0 in a0. X XtoDec: X push a1-a3/d0-d6 X move.b #'+',d2 X tst.l d0 X bpl.s 1$ X X move.b #'-',d2 X neg.l d0 X1$: move.b d2,(a0)+ X X move.b #'0',d2 X3$: cmp.l #$20000000,d0 X blo.s 2$ X sub.l #$20000000,d0 X addq.b #1,d2 X bra.s 3$ END_OF_FILE if test 25782 -ne `wc -c <'source/gui.asm.ab'`; then echo shar: \"'source/gui.asm.ab'\" unpacked with wrong size! fi # end of 'source/gui.asm.ab' fi if test -f 'source/gui.asm.ac' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'source/gui.asm.ac'\" else echo shar: Extracting \"'source/gui.asm.ac'\" \(26047 characters\) sed "s/^X//" >'source/gui.asm.ac' <<'END_OF_FILE' X2$: X move.b d2,(a0)+ X move.b #'.',(a0)+ X X lea 4+NumberHi,a1 X lea 4+NumberLo,a2 X move.l #-1,a3 ; for precision determining. X moveq #0,d1 ; use 64 bits of precision (SHIT! why?) Xouterloop: X move.b #'0',d2 X move.l (a1)+,d3 X move.l (a2)+,d4 Xinnerloop: X move.l d0,d5 X move.l d1,d6 X sub.l d4,d6 X subx.l d3,d5 X bmi.s below0 X move.l d5,d0 X move.l d6,d1 X addq.b #1,d2 X bra.s innerloop Xbelow0: X cmp.l a3,d7 X move.l -4(a1),a3 X bhi.s it_is_over ; it sayz: being too accurate X move.b d2,(a0)+ X bra.s outerloop Xit_is_over: X X* Now we round the number. This was added because it was frustrating X* when user entered, say, 0.7 and got back 0.69. X* This is an ascii round. X cmp.b #'5',d2 X blo.s no_round X bsr.s Round X Xno_round: X pull a1-a3/d0-d6 X rts X X* This is an ASCII round. XRound: push a0/d0 X1$: move.b -(a0),d0 X cmp.b #'.',d0 X beq.s 1$ X cmp.b #'9',d0 X bne.s 2$ X move.b #'0',(a0) X bra.s 1$ X2$: X addq.b #1,(a0) X pull a0/d0 X rts X X* Wait() for an IDCMP message from either of the windows, X* or timer I/O to complete. X* Handle ^C explicitely. X XGetMessage: X push d0-d1/a0-a1 X Xtest_messages: X bsr CheckMessage X bne.s found_one ; of class ^C X tst.l d2 ; which class? (0 = none found) X bne.s set_Z_exit X X* No messages. Wait for them. X bset #SIGBREAKB_CTRL_C,d0 X Base Exec X Call Wait X btst #SIGBREAKB_CTRL_C,d0 X bne.s found_one ; ^C (return with Z clear) X X bra.s test_messages ; Now there's a message for us. Fetch it. Xset_Z_exit: X moveq #0,d0 Xfound_one: X pull d0-d1/a0-a1 X rts X X* This routine just gets a message if it IS here, but does not X* Wait() for it. However, returns with signal mask in d0 if X* caller wishes to wait. X XCheckMessage: X* Test if any messages arrived X Base Exec X moveq #0,d2 ; Signal mask X X* First window X move.l MyWindow1,a0 ; This is always open X move.l wd_UserPort(a0),a0 X move.b MP_SIGBIT(a0),d0 X bset d0,d2 X Call GetMsg X tst.l d0 X bne.s foundmsg X X* Second window X move.l MyWindow2,a0 X move.l a0,d0 X beq.s 1$ ; check if open X move.l wd_UserPort(a0),a0 X move.b MP_SIGBIT(a0),d0 X bset d0,d2 X Call GetMsg X tst.l d0 X bne.s foundmsg X1$: X* Timer I/O X move.l UseReq,a1 X move.l a1,d0 X beq.s 2$ ; no request pending X move.l MN_REPLYPORT(a1),a0 X move.b MP_SIGBIT(a0),d0 X bset d0,d2 X Call CheckIO X tst.l d0 X bne.s foundio X2$: X* No messages! Return with 0 in d2, signal set in d0. X exg.l d0,d2 X rts X Xfoundmsg: X move.l d0,a1 X move.l im_Class(a1),d2 X move.w im_Code(a1),d3 X move.w im_Qualifier(a1),d4 X move.l im_IAddress(a1),a5 X move.w im_MouseX(a1),d5 X move.w im_MouseY(a1),d6 X move.l im_Seconds(a1),a2 X move.l im_Micros(a1),a3 X Call ReplyMsg X cmp.l #RAWKEY,d2 X bne.s nobreak X cmp.w #$33,d3 ; RAW keycode for 'c' X bne.s nobreak X btst #IEQUALIFIERB_CONTROL,d4 X beq.s nobreak Xbreak: X moveq #TRUE,d0 X rts Xfoundio: X move.l UseReq,a1 X Call WaitIO X clr.l UseReq X moveq #FAKECLASS,d2 Xnobreak: X moveq #FALSE,d0 X rts X XTransform: X* Firsty: Magnify is useless to brot. Need to calculate X* 2 ^ (-Magnify). That, again, is very very inconvenient. X X* Lets do it in a subroutine. Someone else might need it. X move.w #$2000,d0 X moveq #$0000,d1 ; d0/d1 form 1 (fixed), X moveq #$0000,d2 ; d2 is just extension X move.l Magnify,d3 X bsr.s Power2 X X ifeq SCREEN-0 X move.l d0,mb_dx(a4) X move.l d0,mb_dy(a4) X endc X ifeq SCREEN-1 X asr.l #1,d0 X move.l d0,mb_dx(a4) X asl.l #1,d0 X move.l d0,mb_dy(a4) X endc X ifeq SCREEN-2 X asr.l #1,d0 X move.l d0,mb_dy(a4) X asl.l #1,d0 X move.l d0,mb_dx(a4) X endc X ifeq SCREEN-3 X asr.l #1,d0 X move.l d0,mb_dx(a4) X move.l d0,mb_dy(a4) X endc X X* 'brot' expects to see z = x0 + y0 i to be upper lefthand corner X* whereas this program has until now assumed it is centerpoint. X* I wont use mulX instructions here because we are not in such a X* hurry. And secondly, on low magnification levels this is more X* accurate. (OK, that sounded nice. The real reason was that X* I am too lazy to find out what was wrong with that mulu!) X X move.w mb_x1(a4),d0 X add.w mb_x2(a4),d0 X move.l CurrentX,d1 X move.l mb_dx(a4),d2 X lsr.w #1,d0 X bcc.s 1$ X X move.l d2,d3 X asr.l #1,d3 X sub.l d3,d1 X1$: X tst.w d0 X beq.s 2$ X sub.l d2,d1 X subq.w #1,d0 X bra.s 1$ X2$: move.l d1,mb_x0(a4) X X move.w mb_y1(a4),d0 X add.w mb_y2(a4),d0 X move.l CurrentY,d1 X move.l mb_dy(a4),d2 X lsr.w #1,d0 X bcc.s 3$ X X move.l d2,d3 X asr.l #1,d3 X add.l d3,d1 X3$: X tst.w d0 X beq.s 4$ X add.l d2,d1 X subq.w #1,d0 X bra.s 3$ X4$: move.l d1,mb_y0(a4) X X rts X XPower2: X* I must be a masochist... X* Right now I have no idea how to code this routine. Hm. let's see. X X* This routine should be called with Magnify (or Zoom) in d3. X* d0/d1/d2 should be set to value to be multiplied by 2^(-d3). X* Returns d0. X X push d1-d4/a0 X X* I seem to break the calculation into smaller ones, like X* 2^(-1) x 2^(-1) x ... x 2^(-1) x 2^(-1/2) x 2^(-1/4) x ... X* Each bit corresponds to one multiplication. X X swap d3 X tst.w d3 Xminusone: X beq.s skip_power X lsr.w #1,d0 ; This is x 2^(-1) X roxr.w #1,d1 X roxr.w #1,d2 X subq.w #1,d3 X bra.s minusone Xskip_power: X X swap d3 X lea NumberP,a0 Xminusfrac: X move.w (a0)+,d4 X asl.w #1,d3 X bcc.s dont_multi X X mulu d4,d0 X mulu d4,d1 X mulu d4,d2 X swap d2 X add.w d1,d2 X swap d1 X addx.w d0,d1 X swap d0 X moveq #0,d4 X addx.w d4,d0 Xdont_multi: X tst.w d3 X bne minusfrac X X* Ha! It was easy! X swap d0 X move.w d1,d0 X X pull d1-d4/a0 X rts X X* Oooooh how I wish I had a C-compiler! X* Inverse of Power2, that is, X* log ( d2 ) in zoom/magnify fixed point format. X* 2 Xlog2: X push d1-d4/a0 X moveq #0,d1 ; this gets the answer Xlog_int: X tst.w d0 X bmi.s log_frac X addq.w #1,d1 X lsl.w #1,d0 X bra.s log_int Xlog_frac: X swap d1 X lea NumberL,a0 X moveq #15,d2 Xlog_loop: X lsl.w #1,d1 ; go through 16 bits X move.w (a0)+,d3 X moveq #0,d4 X move.w d0,d4 X swap d4 X mulu d0,d3 X add.l d3,d4 X bcs.s log_overflow X* That multiplication was "valid" -> record intermediate result X* in d0. Bit in d1 collects final result. X or.b #1,d1 X swap d4 X bpl.s 1$ X add.w #1,d4 X1$: X move.w d4,d0 Xlog_overflow: X dbf d2,log_loop X move.l d1,d0 X pull d1-d4/a0 X X* AMAZING! UNBELIEVABLE! I think I got it right THE VERY FIRST TIME X* I CODED IT! This must have been the 1st routine that didnt X* need to be debugged! And I thought this would be hard... X X rts X X XCtrlC: X push a0-a1/d0-d1/a6 X Base Exec X move.l MyWindow1,a0 X move.l wd_UserPort(a0),a0 X Call GetMsg X tst.l d0 X beq.s no_c X move.l d0,a1 X cmp.l #RAWKEY,im_Class(a1) X bne.s reply_c X cmp.w #$33,im_Code(a1) X bne.s reply_c X move.w im_Qualifier(a1),d0 X btst #IEQUALIFIERB_CONTROL,d0 X beq.s reply_c X Call ReplyMsg X moveq #-1,d0 X bra.s exit_c Xreply_c: X Call ReplyMsg Xno_c: X moveq #0,d0 X moveq #0,d1 X Call SetSignal X btst #SIGBREAKB_CTRL_C,d0 Xexit_c: X pull a0-a1/d0-d1/a6 X rts X X X X* This routine gets decimal number ( -4.0 .. 4.0 ) from (a0)+ to d0. X* Format is fixed point. X X* If Z bit is set (indicating zero result) no number was found. X X* This may be one of the stupidest routines I've written. But X* it doesnot matter. This way I will always be accurate enough. X* (For those meatheads that do not understand what I mean: X* I use internally 64 bits of precision, the final result X* will have only 32...) X XGetFixed: X push a1-a3/d1-d5 X move.l a0,a3 X moveq #0,d1 X moveq #0,d3 X move.l #$80000000,d2 X lea NumberHi,a1 X lea NumberLo,a2 X1$: X move.b (a0)+,d0 X cmp.b #'+',d0 X beq.s 1$ X cmp.b #'-',d0 X bne.s 2$ X bset #15,d3 ; Now this is negative X bra.s 1$ X2$: X cmp.b #'.',d0 X bne.s 3$ X bset #7,d3 ; Remember: now we have gone past X bra.s 1$ X3$: X cmp.b #'0',d0 X blo.s 4$ X cmp.b #'9',d0 X bhi.s 4$ X X bset #0,d3 X cmp.l (a1)+,(a2)+ ; go to next number position X tst.b d3 X bmi.s 5$ X lea NumberHi,a1 ; We will patiently stuck with these until X lea NumberLo,a2 ; decimal point found X5$: X sub.b #'0'+1,d0 X bmi.s 1$ X ext.w d0 X move.l (a1),d4 X move.l (a2),d5 X6$: X add.l d5,d2 X addx.l d4,d1 X dbf d0,6$ X bra.s 1$ X X4$: X subq.l #1,a0 X bsr.s SkipBlk X tst.w d3 X bpl.s 7$ X neg.l d1 X7$: X move.l d1,d0 X btst #0,d3 X bne.s 8$ X move.l a3,a0 ; if error, go to where we started from X8$: X pull a1-a3/d1-d5 X rts X X* This routine gets number from (a0)+ to d0.w X XGetNum: X push d1/d2/a1 X move.l a0,a1 X moveq #FALSE,d2 ; no valid number yet X moveq #0,d0 X2$: X move.b (a0)+,d1 X cmp.b #'0',d1 X blo.s 1$ X cmp.b #'9',d1 X bhi.s 1$ X X sub.b #'0',d1 X ext.w d1 X mulu #10,d0 X add.w d1,d0 X moveq #TRUE,d2 ; valid number X bra.s 2$ X X1$: X subq.l #1,a0 X bsr.s SkipBlk X X tst.w d2 ; invalid? X bne.s 3$ X move.l a1,a0 ; if error, get back where to we started from X3$: X pull d1/d2/a1 X rts X X* This will skip all spaces and tabs. X XSkipBlk: X push d0 X1$: X move.b (a0)+,d0 X cmp.b #' ',d0 X beq.s 1$ X subq.l #1,a0 X pull d0 X rts X X* A subroutine for each of the options Xopt_x: bsr GetFixed X beq.s opt_xx X move.l d0,CurrentX X moveq #TRUE,d0 X rts Xopt_xx X* This is just -x meaning exit when drawn. X clr.b inter X moveq #TRUE,d0 X rts X Xopt_y: bsr GetFixed X beq.s 1$ X move.l d0,CurrentY X moveq #TRUE,d0 X1$: rts X X* This option is a very special one (internally) because it uses X* still one different number format (scaled by 2^16). X* This is converted to actual mb_dx and mb_dy values later... Xopt_m: bsr.s GetMagnify X beq.s opt_mm X move.l d0,Magnify X moveq #TRUE,d0 X rts Xopt_mm X* This is only -m meaning mandelbrot sets X bclr.b #MBB_JULIA,mb_flags(a4) X moveq #TRUE,d0 X rts X XGetMagnify: X push a1-a2/d1-d2 X move.l a1,a2 X bsr GetNum X swap d0 ; integer part go to high 16 bits X cmp.b #'.',(a0)+ X bne.s m_space ; number had ONLY integer part X moveq #0,d1 ; collect number here X moveq #0,d2 ; clear extra bits X clr.w d0 Xm_find_end: X move.b (a0)+,d2 X addq.w #1,d0 ; low word has a temporary role as counter X cmp.b #'0',d2 X blo.s m_end_found X cmp.b #'9',d2 X bls.s m_find_end Xm_end_found: X lea -1(a0),a1 Xm_loop: X subq.w #1,d0 X beq.s m_got_it X move.b -(a1),d2 X sub.b #'0',d2 X swap d1 X move.w d2,d1 X swap d1 X divu #10,d1 X bra.s m_loop Xm_got_it: X move.w d1,d0 X Xm_space: X subq.l #1,a0 X bsr SkipBlk X cmp.l #$001d0000,d0 ; greater than 2^29? X bhi.s m_error X moveq #TRUE,d1 X bra.s m_exit Xm_error: X moveq #FALSE,d0 X move.l a2,a1 Xm_exit: pull a1-a2/d1-d2 X rts X X Xopt_i: bsr GetNum X beq.s 1$ X move.w d0,mb_i(a4) X moveq #TRUE,d0 X1$: rts X X Xopt_l: bclr.b #MBB_AUTOPREC,mb_flags(a4) X bclr.b #MBB_HIGH,mb_flags(a4) X moveq #TRUE,d0 X rts X Xopt_h: bclr.b #MBB_AUTOPREC,mb_flags(a4) X bset.b #MBB_HIGH,mb_flags(a4) X moveq #TRUE,d0 X rts X Xopt_a: bset.b #MBB_AUTOPREC,mb_flags(a4) X moveq #TRUE,d0 X rts X X Xopt_c: bclr.b #MBB_AUTOCRAWL,mb_flags(a4) X bset.b #MBB_CRAWL,mb_flags(a4) X moveq #TRUE,d0 X rts X Xopt_w: bclr.b #MBB_AUTOCRAWL,mb_flags(a4) X bclr.b #MBB_CRAWL,mb_flags(a4) X moveq #TRUE,d0 X rts X Xopt_p: bset.b #MBB_AUTOCRAWL,mb_flags(a4) X moveq #TRUE,d0 X rts X Xopt_g: move.b #TRUE,inter X rts X X Xopt_j: move.b (a0)+,d0 X toupper d0 X X cmp.b #'X',d0 X bne.s j_no_x Xopt_jx ; WB options enter this routine here X bsr GetFixed X beq.s 1$ X move.l d0,mb_jx(a4) X moveq #TRUE,d0 X1$: rts X Xj_no_x: cmp.b #'Y',d0 X bne.s j_no_y Xopt_jy ; WB entry point X bsr GetFixed X beq.s 1$ X move.l d0,mb_jy(a4) X moveq #TRUE,d0 X1$: rts X X Xj_no_y X* This is just -j meaning julia sets X subq.l #1,a0 Xopt_jj ; WB entry X bset.b #MBB_JULIA,mb_flags(a4) X moveq #TRUE,d0 X rts X Xopt_s X lea NameBuffer,a1 Xs_endstr X move.b (a0)+,d0 X beq.s s_over X cmp.b #' ',d0 X beq.s s_over X move.b d0,(a1)+ X bra.s s_endstr Xs_over X subq.l #1,a0 X clr.b (a1) X move.l a1,NameEnd X bsr SkipBlk X move.b #TRUE,d0 X move.b d0,saveit X rts X X X* For WB use, e.g. FLAGS=xc\0 Xopt_flags X move.b (a0)+,d0 X beq.s no_more_flags X toupper d0 X X* This will return use in this routine. X pea opt_flags X cmp.b #'L',d0 X beq opt_l X cmp.b #'H',d0 X beq opt_h X cmp.b #'A',d0 X beq opt_a X cmp.b #'C',d0 X beq opt_c X cmp.b #'W',d0 X beq opt_w X cmp.b #'P',d0 X beq opt_p X cmp.b #'G',d0 X beq opt_g X cmp.b #'J',d0 X beq opt_jj ; not opt_j X cmp.b #'M',d0 X beq opt_mm ; not opt_m X cmp.b #'X',d0 X beq opt_xx ; not opt_x X* Wrong option! X addq.l #4,a7 X moveq #FALSE,d0 X rts Xno_more_flags X moveq #TRUE,d0 X rts X XSavePicture: X lea NameBuffer,a0 X move.l a0,d2 X X move.l NameEnd,a0 X move.w Counter,d0 X beq.s first_time X* When 2nd etc. file saved, use a running number as an identifier X bsr toInt X clr.b (a0) ; 0 terminates string Xfirst_time: X addq.w #1,Counter X X lea _IffLib,a1 X moveq #0,d0 X Base Exec X Call OpenLibrary X tst.l d0 X beq.s noifflib X move.l d0,a6 X X move.l MyScreen,a0 X move.l sc_ViewPort+vp_ColorMap(a0),a2 X move.l cm_ColorTable(a2),a2 ; colortable X move.l sc_RastPort+rp_BitMap(a0),a1 ; bitmap X move.l d2,a0 ; filename X X move.w mb_x1(a4),d1 X move.w mb_y1(a4),d2 X move.w mb_x2(a4),d3 X move.w mb_y2(a4),d4 X X lsr.w #3,d1 ; no of BYTES X add.w #7,d3 X lsr.w #3,d3 X X sub.w d1,d3 X sub.w d2,d4 X addq.w #1,d3 ; width and heigth X addq.w #1,d4 X X moveq #1,d0 ; run-length compression X X jsr SaveClip(a6) X move.l d0,d2 X X move.l a6,a1 X Base Exec X Call CloseLibrary X X tst.l d2 X bne.s exit_save X move.b #ERROR_ifflib,error X bra.s exit_save Xnoifflib: X move.b #ERROR_noifflib,error Xexit_save: X rts X X SECTION data,DATA X* First elements form $20000000 00000000 (represents 1) X* then 1/10, 1/100 etc. XNumberHi: X dc.l $20000000,$03333333,$0051EB85,$00083126 X dc.l $0000D1B7,$000014F8,$00000218,$00000035 X dc.l $00000005,$00000000,$00000000,$00000000 X dc.l $00000000,$00000000,$00000000,$00000000 XNumberLo: X dc.l $00000000,$33333333,$1EB851EB,$E978D4FD X dc.l $1758E219,$B588E368,$DEF416BD,$AFE53579 X dc.l $5E63B88C,$89705F41,$0DBE6FEC,$015FD7FE X dc.l $00232F33,$000384B8,$00005A12,$00000901 X X* Still one table. This time: 2^(-1/2) , 2^(-1/4) ... times $10000. XNumberP: X dc.w $b505,$d745,$eac1,$f525,$fa84,$fd3e,$fe9e,$ff4f X dc.w $ffa7,$ffd4,$ffea,$fff5,$fffa,$fffd,$ffff,$ffff X* Inverse of former: 2^(1/2), 2^(1/4) etc. X* Implied highest "1" has been deleted. X* (Example: 2^(1/2) = sqrt(2) = 1.4142 x $10000 = $16a0a -> $6a0a) XNumberL: X dc.w $6A0A,$3070,$172C,$0B56,$059B,$02CA,$0164,$00B2 X dc.w $0059,$002C,$0016,$000B,$0006,$0003,$0001,$0001 X X XColors: X ifeq DEPTH-5 X dc.w $888,$000 X dc.w $f00,$f30,$f60,$f90,$fc0,$ff0,$cf0,$9f0,$6f0,$3f0 X dc.w $0f0,$0f3,$0f6,$0f9,$0fc,$0ff,$0cf,$09f,$06f,$03f X dc.w $00f,$30f,$60f,$90f,$c0f,$f0f,$f0c,$f09,$f06,$f03 X endc X ifeq DEPTH-4 X dc.w $888,$000 X dc.w $f00,$f80,$ff0,$8f0 X dc.w $0f0,$0f6,$0fc,$0cf,$06f X dc.w $00f,$60f,$c0f,$f0c,$f06 X endc X ifeq DEPTH-3 X dc.w $888,$000,$f00,$ff0,$0f0,$0ff,$00f,$f0f X endc X ifeq DEPTH-2 X dc.w $888,$000,$f00,$00f X endc XMyNewScreen: X dc.w 0,0 ; offsets X dc.w XSIZE,YSIZE ; size x * y X dc.w DEPTH ; planes X dc.b 1,2 ; default pens X dc.w VIEWMODE X dc.w CUSTOMSCREEN X dc.l 0,ScreenTitle,0 ; font,title,gadgets X XMyNewWindow1: X dc.w 0,0 X dc.w XSIZE,YSIZE ; width, heigth X dc.b 1,2 ; pens X dc.l IDCMP1 ; IDCMP X dc.l FLAGS1 X dc.l 0,0,0 ; gadgets, checkmark, title XInsertScreen1: X ds.l 1 ; screen (to be inserted later) X dc.l 0 ; bitmap X dc.w -1,-1,-1,-1 ; min/max size X dc.w CUSTOMSCREEN ; screen type X XMyNewWindow2: X dc.w WINX,WINY ; place (to be modified later) X dc.w WINW,WINH ; width, heigth X dc.b 1,2 ; pens X dc.l IDCMP2 ; IDCMP X dc.l FLAGS2 X dc.l XGadget ; ... gadgets ... (lots of them!) X dc.l 0,0 ; checkmark, title XInsertScreen2: X ds.l 1 ; screen (to be inserted later) X dc.l 0 ; bitmap X dc.w -1,-1,-1,-1 ; min/max size X dc.w CUSTOMSCREEN ; screen type X XuniqueID SET 0 XMakeID macro X\1 EQU uniqueID XuniqueID SET uniqueID+1 X endm X X MakeID GAD_X X MakeID GAD_Y X MakeID GAD_M X MakeID GAD_Z X MakeID GAD_I X MakeID GAD_ZOOM X MakeID GAD_DRAW X MakeID GAD_RESET X MakeID GAD_MANDEL X MakeID GAD_JULIA X MakeID GAD_QUIT XMINUS EQU $8000 XSTRING EQU $4000 XZOOMTYPE EQU $2000 XSETTYPE EQU $1000 XIDMASK EQU $8fff ; so as not to mask sign X XXGadget: X dc.l YGadget ; link to next X dc.w 39,13,104,8 ; place & size X dc.w GADGHCOMP X dc.w RELVERIFY|GADGIMMEDIATE X dc.w STRGADGET X dc.l XYBorder ; image for gadget X dc.l 0 X dc.l XText X dc.l 0 ; MutualExclude X dc.l XString ; specialinfo X dc.w STRING|GAD_X ; ID X dc.l 0 XXString: X dc.l XBuffer X dc.l 0 X dc.w 0 X dc.w 13 X dc.w 0 X dc.w 0,0,0,0,0 X dc.l 0 X dc.l 0,0 XXText: X dc.b 1,2 ; pens X dc.b RP_JAM1,0 ; drawmodes X dc.w -10,0 ; offsets X dc.l 0 ; default font X dc.l XLetter ; (yeah, just one letter) X dc.l 0 ; no more text XYGadget: X dc.l YPLUSGadget ; the next one X dc.w 39,26,104,8 ; place & size X dc.w GADGHCOMP X dc.w RELVERIFY|GADGIMMEDIATE X dc.w STRGADGET X dc.l XYBorder X dc.l 0 X dc.l YText X dc.l 0 X dc.l YString ; specialinfo X dc.w STRING|GAD_Y ; ID X dc.l 0 XYString: X dc.l YBuffer X dc.l 0 X dc.w 0 X dc.w 13 X dc.w 0 X dc.w 0,0,0,0,0 X dc.l 0 X dc.l 0,0 XYText: X dc.b 1,2 ; pens X dc.b RP_JAM1,0 ; drawmodes X dc.w -10,0 ; offsets X dc.l 0 ; default font X dc.l YLetter ; (yeah, just one letter) X dc.l 0 ; no more text XXYBorder: X dc.w -2,-2 ; place X dc.b 1,0 ; pens X dc.b RP_JAM1 X dc.b 5 ; # of pairs X dc.l XYPairs ; the actual data X dc.l 0 XXYPairs: X dc.w 0,0 X dc.w 107,0 X dc.w 107,11 X dc.w 0,11 X dc.w 0,0 XYPLUSGadget: X dc.l YMINUSGadget ; and the next one. X dc.w 10,11,11,6 ; place & size X dc.w GADGHCOMP|GADGIMAGE X dc.w RELVERIFY|GADGIMMEDIATE X dc.w BOOLGADGET X dc.l UPimage X dc.l 0,0,0 X dc.l 0 ; specialinfo X dc.w GAD_Y ; ID X dc.l 0 XYMINUSGadget: X dc.l XMINUSGadget ; and the next one. X dc.w 10,30,11,6 ; place & size X dc.w GADGHCOMP|GADGIMAGE X dc.w RELVERIFY|GADGIMMEDIATE X dc.w BOOLGADGET X dc.l DOWNimage X dc.l 0,0,0 X dc.l 0 ; specialinfo X dc.w GAD_Y|MINUS ; ID X dc.l 0 XXMINUSGadget: X dc.l XPLUSGadget ; and the next one. X dc.w 3,18,6,11 ; place & size X dc.w GADGHCOMP|GADGIMAGE X dc.w RELVERIFY|GADGIMMEDIATE X dc.w BOOLGADGET X dc.l LEFTimage X dc.l 0,0,0 X dc.l 0 ; specialinfo X dc.w GAD_X|MINUS ; ID X dc.l 0 XXPLUSGadget: X dc.l MGadget ; and the next one. X dc.w 22,18,6,11 ; place & size X dc.w GADGHCOMP|GADGIMAGE X dc.w RELVERIFY|GADGIMMEDIATE X dc.w BOOLGADGET X dc.l RIGHTimage X dc.l 0,0,0 X dc.l 0 ; specialinfo X dc.w GAD_X ; ID X dc.l 0 XMGadget: X dc.l MPLUSGadget ; more to come... X dc.w 23,42,40,8 ; place & size X dc.w GADGHCOMP X dc.w RELVERIFY|GADGIMMEDIATE X dc.w STRGADGET X dc.l MBorder X dc.l 0 X dc.l MText X dc.l 0 X dc.l MString ; specialinfo X dc.w STRING|GAD_M ; ID X dc.l 0 XMString: X dc.l MBuffer X dc.l 0 X dc.w 0 X dc.w 9 X dc.w 0 X dc.w 0,0,0,0,0 X dc.l 0 X dc.l 0,0 XMText: X dc.b 1,2 ; pens X dc.b RP_JAM1,0 ; drawmodes X dc.w -18,0 ; offsets X dc.l 0 ; default font X dc.l MLetter ; (yeah, just one letter) X dc.l 0 ; no more text XMBorder: X dc.w -2,-2 ; place X dc.b 1,0 ; pens X dc.b RP_JAM1 X dc.b 5 ; # of pairs X dc.l MPairs ; the actual data X dc.l 0 XMPairs: X dc.w 0,0 X dc.w 43,0 X dc.w 43,11 END_OF_FILE if test 26047 -ne `wc -c <'source/gui.asm.ac'`; then echo shar: \"'source/gui.asm.ac'\" unpacked with wrong size! fi # end of 'source/gui.asm.ac' fi echo shar: End of archive 2 \(of 4\). cp /dev/null ark2isdone MISSING="" for I in 1 2 3 4 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 4 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mail submissions (sources or binaries) to <amiga@uunet.uu.net>. Mail comments to the moderator at <amiga-request@uunet.uu.net>. Post requests for sources, and general discussion to comp.sys.amiga.misc.