supermario/base/SuperMarioProj.1994-02-09/Toolbox/FontMgr/ShowINIT.a
2019-06-29 23:17:50 +08:00

323 lines
10 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; File: ShowINIT.a
; Last Modified: Friday, July 15, 1988 12:08:09 AM
;------------------------------------------------------------------------------------------------
;
; INIT notification routine
; by Paul Mercer, Darin Adler, and Paul Snively from an idea by Steve Capps
;
; Created: 6/7/87 PM - First version.
; Modified: 6/15/87 PM - Changed to standard (Pascal) calling conventions.
; 6/20/87 PM - Fixed color & Finder bug on Mac II.
; 6/22/87 DBA - Improved handling of QuickDraw.
; 6/29/87 DBA - Used scratch8 to avoid conflict with “Easy Access”.
; 6/30/87 DBA - Changed to a 4-byte scheme with “checksum”.
; 6/30/87 PFS - Separated into ShowINIT and InnerShowINIT.
; 7/1/87 DBA - Fixed stack bug and switched to CurApName+.
; 7/2/87 PM - Added check for old signature in ApplScratch for
; backword compatibility (TMON Startup).
; 7/3/87 PM - Removed _SysBeep in ErrorExit since it causes a crash.
; Also changed ICN# plotter to srcOr mode for Blinker.
; 7/13/87 PM - Fixed a3 trashing bug in InnerShowINIT - exit code left
; word on stack (reported by D. Dunham).
; 7/21/87 PM - Due to popular demand, InitGraf is no longer being called.
; This avoids the gamma correction problem with Startupscreens
; getting “washed out” by ShowINIT though someone else is still
; bound to call InitGraf sooner or later (i.e. InitWindows).
; 7/29/87 PM - Put InitGraf back in; this is required (reported by C. Derossi
; at Apple Tech Support). Took out GetPort/SetPort.
; 10/06/87 PM - Set CurrentA5 properly. Rearranged myVars.
; 12/28/87 PM - Major revision to accomodate future INIT31 based ShowINIT.
; 07/14/88 PM - Major revision to get rid of above 'accomodations'.
; Added color icon 'cicn' support and fixed beep crash.
; Removed support for old signature.
;
;------------------------------------------------------------------------------------------------
INCLUDE 'Traps.a'
INCLUDE 'QuickEqu.a'
INCLUDE 'SysEqu.a'
INCLUDE 'ToolEqu.a'
BLANKS ON
STRING ASIS
True equ 1
False equ 0
Debug equ True
;Debug equ False
myH equ CurApName+32-4 ; a GREAT place to store 4 bytes (it was Darin's idea)
myCheck equ myH+2 ; a simple checksum of myH to determine first-timeness
firstX equ 8 ; X coordinate of first icon to be drawn
bottomEdge equ 8+32 ; this far from bottom of screen
iconWidth equ 32 ; size of icon (square normally)
defaultMoveX equ 40 ; default amount to move icons
checksumConst equ $1021 ; constant used for computing checksum
minColorDepth equ 4 ; minimum bits/pixel for drawing color icons
maskOffset equ 128 ; offset to mask in ICN#
iconRowBytes equ 32/8 ; 32/8 bits
hasCQDBit equ 6 ; this bit in ROM85 is cleared if Color QuickDraw is available
iconID equ 6+4 ; positive stackframe objects
moveX equ 4+4
showINITArgs equ 4
iconPtrHdl equ 6+4
initDrawArgs equ 6
myVars RECORD 0,DECREMENT
saveA5 ds.l 1
localA5 ds.l 1
thePort ds.l 1 ; my own QuickDraw (required!)
ds.b grafSize-4 ; other QuickDraw globals (except thePort)
destRect ds.w 4
myBitMap ds.b bitMapRec
myPort ds.b portRec
varsSize equ *
ENDR
;------------------------------------------------------------------------------------------------
;
; Displays the ICN# (cicn when in 4 bit mode or higher) specified by iconID and
; move the pen horizontally by moveX.
; Pass a -1 in moveX to move the standard amount, moveX should be 40 for most ICN#'s
;
; PROCEDURE ShowINIT(iconID: Integer; moveX: Integer); EXTERNAL
;
; pascal void ShowINIT(iconID, moveX)
; short iconID, moveX;
; extern;
;
;------------------------------------------------------------------------------------------------
ShowINIT: PROC EXPORT
IMPORT INITDraw1Bit, INITDrawCQD
link a6,#0 ; create stack frame
movem.l d3-d7/a2-a4,-(sp) ; save standard registers
btst.b #hasCQDBit,ROM85 ; try to get a color icon if CQD exists
beq.s ShowINITCQD ; I could use SysEnvirons but I don't want to
ShowINIT1Bit
clr.l -(sp) ; try to get the icon resource
move.l #'ICN#',-(sp)
move.w iconID(a6),-(sp)
_GetResource
move.l (sp)+,d0
beq.s ShowINITError ; can't get it, give up
move.l d0,-(sp) ; leave handle on the stack for ReleaseResource
move.l d0,a0
move.l (a0),a0 ; dereference
move.l a0,-(sp) ; icon pointer
move.w moveX(a6),-(sp) ; moveX
bsr INITDraw1Bit ; draw
_ReleaseResource ; releaese the resource
ShowINITExit:
movem.l (sp)+,d3-d7/a2-a4 ; restore registers
unlk a6 ; ditch stack frame
move.l (sp)+,a0 ; get return address
addq.l #showINITArgs,sp ; ditch incoming arguments
jmp (a0) ; return to caller
ShowINITError:
IF Debug THEN
move.w #1,-(sp) ; just beep
_SysBeep
ENDIF
bra.s ShowINITExit
ShowINITCQD:
move.l MainDevice,a0 ; get handle to main device
move.l (a0),a0 ; dereference
move.l gdPMap(a0),a0 ; get its pixmap handle
move.l (a0),a0 ; dereference it
cmp.w #minColorDepth,pmPixelSize(a0) ; is it deep enough for us to draw in color?
blt.s ShowINIT1Bit ; no
clr.l -(sp) ; can a color icon be found?
move.w iconID(a6),-(sp)
_GetCIcon
move.l (sp)+,d0
beq.s ShowINIT1Bit ; no, so try for regular icon
move.l d0,-(sp) ; leave handle on the stack for DisposCIcon
move.l d0,-(sp) ; cicn handle
move.w moveX(a6),-(sp) ; moveX
bsr INITDrawCQD ; do the actual drawing
_DisposCIcon
bra.s ShowINITExit
ShowINITCredits:
dc.w 'ShowINIT by Paul Mercer'
dc.w 'Copyright 1987-1988'
dc.w 'Version of 7/15/88'
ENDPROC
;------------------------------------------------------------------------------------------------
;
; Initializes the world and sets up the drawing rectangle
;
;------------------------------------------------------------------------------------------------
INITInit: PROC EXPORT
WITH myVars
move.l CurrentA5,saveA5(a6) ; PM 10/6 save host A5
lea localA5(a6),a5 ; PM7/21
move.l a5,CurrentA5
pea thePort(a6) ; PM 10/6 use a5 reference instead of a6
_InitGraf ; fixes color bug as per DA@ICOM
pea myPort(a6)
_OpenPort
move.w myH,d0 ; get my h var
rol.w #1,d0 ; compare against checksum
eor.w #checksumConst,d0
cmp.w myCheck,d0
beq.s ScratchOK ; checks, so go on
move #firstX,myH ; else initialize as first time
ScratchOK:
lea myPort(a6),a0 ; compute the destination rectangle
move.w portBounds+bottom(a0),d0
sub.w #bottomEdge,d0
swap d0
move.w myH,d0
move.l d0,destRect(a6)
move.l d0,destRect+botRight(a6)
add.w #iconWidth,destRect+right(a6)
add.w #iconWidth,destRect+bottom(a6)
rts
ENDWITH
ENDPROC
;------------------------------------------------------------------------------------------------
;
; Cleans up the work done by INITInit and advances the icon drawing position
;
;------------------------------------------------------------------------------------------------
INITCleanup: PROC EXPORT
WITH myVars
move.w myH,d0 ; get current position
move.w moveX(a6),d1 ; get delta x
bpl.s NotDefault ; not default (-1)
move.w #defaultMoveX,d1 ; default
NotDefault:
add.w d1,d0 ; increment icon position
move.w d0,myH ; and save in global
rol.w #1,d0 ; recompute checksum
eor.w #checksumConst,d0
move.w d0,myCheck ; and save it
Exit:
pea myPort(a6)
_ClosePort
; *** (DBA) I think that QuickDraw leaves handles around.
; *** (DBA) Too bad we can't get rid of them...
move.l saveA5(a6),a5 ; PM 10/6 restore host A5
move.l a5,CurrentA5
rts
ENDWITH
ENDPROC
;------------------------------------------------------------------------------------------------
;
; display the ICN# pointed to by iconPtr and move the pen horizontally by moveX
; pass a -1 in moveX to move the standard amount, moveX should be 40 for most ICN#'s
;
; PROCEDURE INITDraw1Bit(iconPtr: ICONListPtr; moveX: Integer); EXTERNAL
;
; pascal void INITDraw1Bit(iconPtr, moveX)
; ICONList *iconPtr;
; short moveX;
; extern;
;
;------------------------------------------------------------------------------------------------
INITDraw1Bit: PROC EXPORT
IMPORT INITInit, INITCleanup:CODE
WITH myVars
link a6,#varsSize ; create stack frame
movem.l d3-d7/a2-a4,-(sp) ; save standard registers
bsr INITInit ; initialize for drawing
move.l iconPtrHdl(a6),a3 ; get ICN# pointer
lea myBitMap(a6),a4 ; point to bitmap structure
move.l a3,baseAddr(a4) ; fill it out
add.l #maskOffset,baseAddr(a4) ; skip to mask
move #iconRowBytes,rowBytes(a4)
move.l #0,bounds(a4) ; 0,0 topleft
move.w #iconWidth,bounds+bottom(a4) ; 32,32 botright
move.w #iconWidth,bounds+right(a4)
move.l a4,-(sp) ; punch hole with mask
lea myPort(a6),a2 ; get the desk port
pea portBits(a2) ; for its portbits
pea srcRect
pea destRect(a6)
move #srcBic,-(sp) ; punch a hole
clr.l -(sp) ; no clip region
_CopyBits
sub.l #128,baseAddr(a4)
move.l a4,-(sp) ; now draw (or) icon
pea portBits(a2)
pea srcRect
pea destRect(a6)
move #srcOr,-(sp)
clr.l -(sp)
_CopyBits
bsr INITCleanup ; cleanup, advance icon location
movem.l (sp)+,d3-d7/a2-a4 ; restore registers
unlk a6 ; ditch stack frame
move.l (sp)+,a0 ; get return address
addq.l #initDrawArgs,sp ; ditch incoming
jmp (a0) ; back to caller
srcRect: dc.w 0,0,32,32 ; for copybits
ENDWITH
ENDPROC
;------------------------------------------------------------------------------------------------
; same as above except with color icon handle
;------------------------------------------------------------------------------------------------
INITDrawCQD: PROC EXPORT
IMPORT INITInit, INITCleanup:CODE
WITH myVars
link a6,#varsSize ; create stack frame
movem.l d3-d7/a2-a4,-(sp) ; save standard registers
bsr INITInit ; initialize for drawing
pea destRect(a6) ; destination rect
move.l iconPtrHdl(a6),-(sp) ; cicn handle
_PlotCIcon ; draw it
bsr INITCleanup ; cleanup, advance icon location
movem.l (sp)+,d3-d7/a2-a4 ; restore registers
unlk a6 ; ditch stack frame
move.l (sp)+,a0 ; get return address
addq.l #initDrawArgs,sp ; ditch incoming
jmp (a0) ; back to caller
ENDWITH
ENDPROC
END