.PAGE .IF EXTERNAL = 1 .LIST .ENDC .IF USERINT = 1 ;********************************** ; Mini-Graphics Package * ; Contributed by Mike Urquhart * ; Copyright 1983, 1984 Apple * ;********************************** ;________________________________________________________________________________ ; ; DRAWDESK: ; ; this routine performs the following sequences: ; ; 1. clears the screen to a white background. ; 2. makes a menu bar by drawing a single pixel horizontal ; line across the screen. ; 3. fills the screen area below the menu bar with the stantard ; gray shade. ; ; Also has an entry point called CLRDESK that only does item (3). ; ; Destroys regs D0-D2,A1,A5-A6 ;________________________________________________________________________________ ; ; 1. clear screen to white background DRAWDESK clr.l d2 bsr.s whiten ; ; 2. make menu bar border CLRDESK moveq #ROWBYTES,d0 ;set length of line = 90 bytes moveq #-1,d2 ;draw a black pattern move.w #MENULINE,A1 ;start at offset 1440 address moveq #1,d1 ;draw only 1 pixel line bsr.s paint_box ; ; set a6 to starting pixel address for grey routine below ; set a5 to limit ; move #DESKLINE,a6 move #DESKLMT,a5 ;set limit ; ; 3. make the grey background: to make the gray background, alternating ; rows of $5555 and $AAAA starting with $AAAA are written to the ; screen area. ; gray MOVE.L #DESKPATRN,D2 ;set up grey pattern gray1 swap d2 ;start with the $AAAA pattern moveq #1,d1 ;draw a one pixel high line move.l a6,a1 ;starting pixel address must be in a1 for call bsr paint_box @1 add d0,a6 ;bump to next pixel line cmp.w a5,a6 ;is a6 less then max? blt.s gray1 ;loop if yes rts ;else done ;_________________________________________________________________________ ; ; subroutine blacken and whiten: clears full screen to black or white ; ; Calls: bsr blacken (no parameters) ; ; clr.l d2 ; bsr whiten ; ; registers used: d2.l - contains either FFFFFFFF or 0 on return ; d0.b - destroyed but contains $5A (90) on return ; d1.w - destroyed-->should contain 0 on return ; a1.l - destroyed ; ; ; This routine calls paint_box, so other registers may be destroyed. ; ; ;_________________________________________________________________________ BLACKEN moveq #-1,d2 ;black fill pattern whiten move.w #MaxY-1,d1 ;number of pixels in screen box heigth moveq #ROWBYTES,d0 ;length of screen box is 90 bytes suba.l A1,A1 ;clear A1 bsr.s paint_box rts ;------------------------------------------------------------------------ ; Subroutine to clear only menu bar on desktop ; Inputs: ; None ; Outputs: ; None ; Side Effects: ; None ;------------------------------------------------------------------------ CLRMENU MOVEM.L D0-D2/A1,-(SP) ;save regs MOVEQ #ROWBYTES,D0 ;width of menu bar is 90 bytes MOVEQ #MBARLEN,D1 ;heigth is 15 pixels MOVEQ #0,D2 ;set fill pattern SUBA.L A1,A1 ;upper left corner is at offset 0 BSR.S PAINT_BOX ;go do it MOVEM.L (SP)+,D0-D2/A1 ;restore and RTS ; exit ;________________________________________________________________________________ ; ; Routine paint_box ; ; Call: BSR paint_box ; or ; BSR paintb2 ; ; register setup: ; ; D2 must contain a one word fill pattern. ; D0 must contain the width of the box(horizontally) or the length of ; the line. ; D1 must contain the heigth(vertically of the box) in horizontal pixel ; rows: ; A1 must contains the screen displacement in the range 0..32670 ; ; __________________________________ ; . . ; . fill pattern . <-------heigth in pixels ; __________________________________ ; ^ ; ........... length horizontally ; ; Assumptions: location SCRNBASE contains the video address ; ; registers used-->D0-D3,A0-A2 ;________________________________________________________________________________ PAINT_BOX paintb1 lea movinst,A4 bra.s cont inverse lea exclusive,A4 cont ADD.L SCRNBASE,A1 ;add video address to starting pixel address offset. paintb2 MOVE.L A2,-(SP) ;save reg ; do some setup steps ; CLR.L D3 ;clear for use MOVE.W D0,D3 ;modify width/length NEG.l D3 ;negate the width/length (D3 = -width/length) ; ; add the length of one horizontal pixel row-2 to the -width/length ; to derive an offset which can be added to the updated address pointer ; (when it reflects the right corner or end point of the box/line) ; in order to arrive at the next row starting address. ; ADDI.l #ROWBYTES,D3 ;create displacement for following sequence ; ; ; MOVE.L A1,A2 ;create ending column check address ADD.L D0,A2 ;add length of line to obtain ending column address ; ; A1 now points to the left top coordinate of the box or line. ; A2 now points to the right top coordinate of the box or line. ; startop jmp (A4) ;execute the correct operation (EOR or MOVE) movinst MOVE.w D2,(A1)+ ;start the sequence bra.s compare exclusive eor.w D2,(A1)+ compare CMP.L A1,A2 ;reached the right most point? BEQ.S nextline ;yes BRA.S startop ; ; YES ; nextline ADD.L D3,A1 ;add 1 horizontal line length (5A) minus line length ADDA #ROWBYTES,A2 ;to reach the left most point of the box on the RM000 SUBQ.W #1,D1 ;next horizontal scan line. BNE.S startop ;loop until done. ; MOVE.L (SP)+,A2 ;restore and RTS ;return ;------------------------------------------------------------------------ ; Entry point to set cursor ptrs and make alert box for power cycling ;------------------------------------------------------------------------ MAKEPCALRT MOVEQ #PCROW,D5 ;set row ptr MOVEQ #PCCOL,D6 ;and col ptr ;then drop into alert box routine ;________________________________________________________________________ ; ; MAKEALERT ; ; This routine creates an alert box with no title. ;________________________________________________________________________ MAKEALERT movem.l d0-d1/a1,-(sp) MOVEQ #ALRTWIDTH,D0 ;set parameters for box MOVE.L #ALRTHIGH,D1 MOVEA #ALRTSTRT,A1 bsr.s makebox movem.l (sp)+,d0-d1/a1 rts ;________________________________________________________________________ ; ; MAKETEST ; ; This routine creates an alert box for test icon display. ;________________________________________________________________________ MAKETEST movem.l d0-d1/a1,-(sp) MOVEQ #TSTWWIDTH,D0 ;set parameters for alert box MOVEQ #TSTWHIGH,D1 MOVEA #TSTWSTRT,A1 BSR.S MAKEBOX ;go draw box MOVEQ #TSTMROW,D5 ;set cursor ptrs MOVEQ #TSTMCOL,D6 LEA CHKMSG,A3 ;set message ptr MOVEQ #-1,D1 ;append '...' string BSR DSPSTRING ;and go display it BSR DSPCPU ;display test icons BSR DSPIOB BSR DSPMBRD BSR DSPXCRD movem.l (sp)+,d0-d1/a1 rts ;________________________________________________________________________ ; ; MAKEDBOX ; ; This routine creates a dialog box. ;________________________________________________________________________ MAKEDBOX movem.l d0-d1/a1,-(sp) MOVEQ #DBOXWIDTH,D0 ;set parameters for dialog box MOVEQ #DBOXHIGH,D1 MOVEA #DBOXSTRT,A1 bsr.s makebox movem.l (sp)+,d0-d1/a1 rts ;________________________________________________________________________ ; ; routine makewindow ; ; This routine creates a fixed window of the folder type. ; The calling routine must provide the address of the ; string which will be used to fill in the title box. ; ; Call: ; move ,d0 ; move ,d1 ; move ,a1 ; lea ,a3 ; bsr makewindow ; ; This routine calls makebox ; ;________________________________________________________________________ MAKEWINDOW movem.l d0-d1/a1,-(sp) bsr.s makebox ; ; now draw the title box by drawing a single black line across ; the width of the window about 17 pixels from the top edge ; MOVE.L A1,-(SP) ;save start point add.w #MENULINE,a1 moveq #1,d1 ;set heigth of one pixel moveq #-1,d2 bsr.s paint_box MOVE.L (SP)+,A1 ;restore start point bsr writetitle movem.l (sp)+,d0-d1/a1 ;restore and return rts ;________________________________________________________________________ ; ; Routine makebox; ; ; This routine creates a window of either the folder type ; or the dialog box type. Is is the responsibility of ; the calling process to append the title box and title ; to the window if it is the folder type. ; ; Call: ; move.w ,d0 (range 0..90) even ; move.w ,d1 (range 0..364) ; move.w ,a1 (range 0..32670) ; bsr makebox ; ; registers used: d0,d1,d2,d3,d4,a1,a2 ;________________________________________________________________________ MAKEBOX ; ; make the basic window--->no edges D2 must be set to 0 on call ; d0 must be set to the width (90 maximum) ; d1 must be set to the heigth (364 maximum) ; A1 must be the offset address (0..32670) ; ; movem.l d0-d4/a1-a4,-(sp) movem.l d0-d1/a1,-(sp) ;save the heigth and the starting pixel address clr.l d2 ;the pattern bsr paint_box ; ; now draw the individual edges including the shadow edges on the right ; and bottom of the window ; ; ; draw bottom horizontal edge ; sub.l d3,a1 sub.l d0,a1 ;a1 is currently equal to the lower right point ; of the box so we can subtract the width to ; calculate the lower left point of the box. moveq #1,d1 ;set 1 pixel heigth moveq #-1,d2 ;set the line pattern bsr paintb2 ;remember a4 is set up to point to the move.w ; instruction ; ; draw bottom horizontal shadow ; @1 addq #2,a1 ;shadow begin offset by 2 moveq #1,d1 ;draw a one pixel line subq #2,d0 bsr paintb2 ;go ; ; draw top horizontal edge ; @2 movem.l (sp)+,d0-d1/a1 ;restore original parameters movem.l d1/a1,-(sp) moveq #1,d1 ;draw a 1 pixel line bsr paint_box ; ; now draw the right edge plus the right edge's shadow, use a1 ; with a column parameter of 0 ; movem.l (sp)+,d4/a2 moveq #1,d2 subq #2,d4 subq #2,d0 add.l d0,a1 move.l d4,d1 clr.l d0 bsr.s paint_v move.w #182,d0 ;set one byte offset from right edge moveq #7,d2 move.l d4,d1 bsr.s paintbit ;draw first pixel line of the right shadow move.w #272,d0 moveq #6,d2 move.l d4,d1 subq #1,d1 ;reduce heigth by 1 to compensate for shadow offset bsr.s paintbit ; ; now draw the left vertical edge of the box ; move.l a2,a1 ;restore the starting pixel address add.l SCRNBASE,a1 ;add in video address moveq #90,d0 add.l d0,a1 move #32768,d2 ;set the pattern move.l d4,d1 ;the heigth minus two clr.l d0 ;column 0 offset bsr.s paint_v movem.l (sp)+,d0-d4/a1-a4 rts ;_________________________________________________________________________ ; ; Routine paint_v ; ; This routine "paints" a vertical column one word wide. ; ; Call: BSR paint_v ; ; register setup: ; ; A1 must contain the screen base address. ; D2 must contain a one word pattern. ; D1 must contain the number of pixels in the vertical length of the line ; in the range 1..364 ; D0 must contain the screen word column in the range 0..44 ; ; Assumptions: location SCRNBASE contains the video address ; ; registers used: D0-D1 ;________________________________________________________________________ ; PAINT_V paintv1 @1 MOVE.W D2,0(A1,D0.W) ;write to screen SUBQ.W #1,D1 ;decrement count BEQ.S @2 ;return ADDI.W #ROWBYTES,D0 ;bump to next horizontal line BRA.S @1 ;loop to continue writing vertical. ; @2 RTS ;return ;_________________________________________________________________________ ; ; Routine paintbit ; ; This routine "paints" a vertical line one bit wide. ; ; Call: BSR paintbit ; ; register setup: ; ; A1 must contain the screen base address. ; D2 must contain the bit number to set ; D1 must contain the number of pixels in the vertical length of the line ; in the range 1..364 ; D0 must contain the screen word column in the range 0..44 ; ; Assumptions: location SCRNBASE contains the video address ; ; registers used: D0-D1 ;________________________________________________________________________ PAINTBIT @1 bset d2,0(a1,d0.w) subq.w #1,d1 ;subtract one from heigth beq.s @2 ;done addi.w #ROWBYTES,d0 ;increment to next pixel row. bra.s @1 @2 RTS ;return ;______________________________________________________________________ ; ; Routine makebutton --> creates a black lined box of the size ; specified by the parameters with button ; "label" and description if specified. ; Also makes entries in active rectangle ; table for later use with mouse. ; ; the left top corner is addressed by a1, ; the alternate keycode is contained in d0. ; the description is in A3. ; description location is in A2. ; '...' string appended to message if d1 nonzero ; ; ; Call: ; ; move.w ,a1 ; move.b ,d0 ; lea