mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-12-01 02:51:04 +00:00
163 lines
6.7 KiB
Plaintext
163 lines
6.7 KiB
Plaintext
;
|
||
; File: puMedian.a
|
||
;
|
||
; Contains: Assembly routines for the median color finding algorithm for the picture utilities package.
|
||
;
|
||
; Written by: Dave Good. Some ideas stolen from Konstantin Othmer and Bruce Leak. Algorithm by Keith McGreggor.
|
||
;
|
||
; Copyright: © 1990 by Apple Computer, Inc., all rights reserved.
|
||
;
|
||
; Change History (most recent first):
|
||
;
|
||
; <6> 9/21/90 DDG Made changes from code review. Saved a few bytes of code.
|
||
; <5> 8/16/90 DDG Added and cleaned up some comments.
|
||
; <4> 8/1/90 DDG Changed the dispatch selector to go by ones instead of twos.
|
||
; <3> 7/30/90 DDG Adding a dispatch routine to support the generic colorPickMethod
|
||
; model.
|
||
; <2> 7/29/90 DDG Fixed header.
|
||
; <1> 7/29/90 DDG First checked in using new structure.
|
||
;
|
||
; To Do:
|
||
;
|
||
|
||
|
||
|
||
MACHINE MC68000
|
||
CASE OBJ
|
||
|
||
|
||
;••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
|
||
|
||
BoxInfo RECORD 0
|
||
|
||
count ds.w 1
|
||
|
||
minRed ds.w 1
|
||
maxRed ds.w 1
|
||
minGreen ds.w 1
|
||
maxGreen ds.w 1
|
||
minBlue ds.w 1
|
||
maxBlue ds.w 1
|
||
|
||
totalRed ds.l 1
|
||
totalGreen ds.l 1
|
||
totalBlue ds.l 1
|
||
|
||
padding1 ds.l 1
|
||
padding2 ds.w 1
|
||
sizeofBoxInfo
|
||
|
||
ENDR
|
||
|
||
;••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
|
||
|
||
|
||
|
||
;••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
|
||
|
||
MedianDispatch PROC EXPORT
|
||
|
||
IMPORT INITMEDIANMETHOD
|
||
IMPORT RECORDMEDIANCOLORS
|
||
IMPORT CALCMEDIANTABLE
|
||
IMPORT KILLMEDIANMETHOD
|
||
|
||
lsl.l #2,D0
|
||
jmp dispatchTable(D0.w) ; jump into jump table
|
||
|
||
dispatchTable
|
||
jmp INITMEDIANMETHOD ; selector 0
|
||
jmp RECORDMEDIANCOLORS ; selector 1
|
||
jmp CALCMEDIANTABLE ; selector 2
|
||
jmp KILLMEDIANMETHOD ; selector 3
|
||
|
||
ENDPROC
|
||
|
||
;••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
|
||
;
|
||
; This routine scans thru all the boxes in the passed array (boxInfoPtr), checking to see if their count is
|
||
; greater than zero. If it is, then we have a color to return, so for each component, we divide the total by
|
||
; the number of colors in this box to get the average component, then we smear the component out to fill a
|
||
; full 16-bit range for the color table. If the count for a particular color is zero, then we return black for
|
||
; that entry in the color table. Note that this will never happen until we have reached the end of the filled
|
||
; boxes, so at that point all we really want to do is fill the rest of the returned color table with black.
|
||
;
|
||
|
||
FillMedianTable PROC EXPORT
|
||
|
||
;----------------------------------------------------------------------------------------------------
|
||
boxInfoPtr EQU A0
|
||
resultPtr EQU A1
|
||
|
||
colorsRequested EQU D0
|
||
index EQU D1
|
||
temp EQU D2
|
||
five EQU D3
|
||
ten EQU D4
|
||
eleven EQU D5
|
||
component EQU D6
|
||
colorCount EQU D7
|
||
|
||
registersUsed REG D3-D7
|
||
regSize EQU 20
|
||
;----------------------------------------------------------------------------------------------------
|
||
|
||
|
||
;----------------------------------------------------------------------------------------------------
|
||
WITH BoxInfo
|
||
|
||
movem.l registersUsed,-(SP) ;save our work registers
|
||
|
||
move.l regSize+4(SP),boxInfoPtr ;copy our parameters into local variables (registers)
|
||
move.l regSize+8(SP),resultPtr
|
||
move.l regSize+12(SP),colorsRequested
|
||
|
||
clr.w index ;this is our counter for the color’s value.
|
||
moveq #5,five ;these are some constants that we want in registers
|
||
moveq #10,ten
|
||
moveq #11,eleven
|
||
bra.s @enter ;enter the loop properly for the DBRA instruction.
|
||
|
||
@loop move.w index,(resultPtr)+ ;set the value for the current entry and move “resultPtr”
|
||
addq.w #1,index ;..to the red component. Then increment “index”
|
||
|
||
move.w count(boxInfoPtr),colorCount ;check the box count - if it is zero, then we are at
|
||
beq.s @empty ;..the end of the unique colors, so clear the entry.
|
||
|
||
move.l totalRed(boxInfoPtr),component ;get the total red value, divide by the color count,
|
||
bsr.s smearAndCopy ;..smear it into a 16-bit color and put it in “resultPtr”
|
||
move.l totalGreen(boxInfoPtr),component ;get the total green value, divide by the color count,
|
||
bsr.s smearAndCopy ;..smear it into a 16-bit color and put it in “resultPtr”
|
||
move.l totalBlue(boxInfoPtr),component ;get the total blue value, divide by the color count,
|
||
bsr.s smearAndCopy ;..smear it into a 16-bit color and put it in “resultPtr”
|
||
bra.s @next ;skip over the “clear” code.
|
||
|
||
@empty clr.l (resultPtr)+ ;clear both the red and green components at once
|
||
clr.w (resultPtr)+ ;clear the blue component
|
||
|
||
@next add.w #sizeofBoxInfo,boxInfoPtr ;move to the next box in the array
|
||
@enter dbra colorsRequested,@loop ;count down the number of colors and loop back
|
||
|
||
movem.l (SP)+,registersUsed ;restore our work registers
|
||
rts ;C will clean up the stack
|
||
|
||
ENDWITH
|
||
;----------------------------------------------------------------------------------------------------
|
||
smearAndCopy divu colorCount,component ;divide the total by the number of colors in this box.
|
||
lsl.w eleven,component ;smear the component into a 16-bit color, the same way
|
||
move.w component,temp ;..that quickdraw does.
|
||
lsr.w five,temp
|
||
or.w temp,component
|
||
move.w component,temp
|
||
lsr.w ten,temp
|
||
or.w temp,component
|
||
move.w component,(resultPtr)+ ;move the component into the result and increment the ptr
|
||
rts
|
||
;----------------------------------------------------------------------------------------------------
|
||
|
||
ENDPROC
|
||
|
||
;••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
|
||
|
||
END
|