mirror of
https://github.com/antoinevignau/source.git
synced 2024-11-19 22:31:52 +00:00
1 line
12 KiB
Plaintext
Executable File
1 line
12 KiB
Plaintext
Executable File
|
|
LOAD 'Macros.dump'
|
|
|
|
INCLUDE 'SS.equ'
|
|
|
|
INCLUDE 'Driver.equ'
|
|
INCLUDE 'Heap.aii.i'
|
|
|
|
;------------------------------------------
|
|
;
|
|
; Equates from procedure S_PieData
|
|
;
|
|
;------------------------------------------
|
|
|
|
S_MaxPieCount equ 24
|
|
S_PieColWd equ 180
|
|
|
|
;-----------------------------------------------
|
|
;
|
|
; Imported addresses
|
|
;
|
|
;-----------------------------------------------
|
|
|
|
IMPORT D_ClosePicture
|
|
IMPORT D_AlertBox
|
|
IMPORT D_CheckPurge
|
|
IMPORT D_Deref
|
|
IMPORT D_DrawString
|
|
IMPORT D_FastMult
|
|
IMPORT D_KillFont
|
|
IMPORT D_NeedHand
|
|
IMPORT D_SelectFont
|
|
IMPORT D_Set4Pat
|
|
|
|
IMPORT X_FormatValue
|
|
|
|
IMPORT S_ChartTitleLoc
|
|
IMPORT S_MissingSlice
|
|
IMPORT S_SliceStr
|
|
|
|
IMPORT S_BadNum
|
|
IMPORT S_BigPie
|
|
IMPORT S_ChartColors
|
|
IMPORT S_Cur2Heap
|
|
IMPORT S_GetCellPtr
|
|
IMPORT S_ItzaBar
|
|
IMPORT S_NoData
|
|
IMPORT S_NormalizeRange
|
|
IMPORT S_PictRect
|
|
IMPORT S_PieRect
|
|
IMPORT S_TraverseRange
|
|
IMPORT S_GetMinMax
|
|
IMPORT S_NoINF
|
|
|
|
;-----------------------------------------------
|
|
;
|
|
; Forward addresses and entries
|
|
;
|
|
;-----------------------------------------------
|
|
|
|
ENTRY AngleToPt
|
|
ENTRY S_Pie360
|
|
ENTRY S_PieArray
|
|
ENTRY S_PieDiv
|
|
ENTRY S_PieLegend
|
|
ENTRY S_PieNegFlag
|
|
ENTRY S_PieOffset
|
|
ENTRY S_PieOne
|
|
ENTRY S_PiePict
|
|
ENTRY S_PieSliceCount
|
|
ENTRY S_PieSum
|
|
ENTRY S_PieTotal
|
|
ENTRY S_PieTwo
|
|
ENTRY S_PieZero
|
|
ENTRY S_SlicePie
|
|
|
|
;---------------------------------------------------------------------------
|
|
;
|
|
; S_MakePie
|
|
;
|
|
;
|
|
|
|
S_MakePie PROC EXPORT
|
|
;Using S_CurrentData2
|
|
;Using S_ChartData
|
|
;Using S_PieData
|
|
;Using SANEEQUS
|
|
|
|
input charthdl:l
|
|
output pict:l
|
|
local arrayhdl:l,chart:l
|
|
local color:w,OldClip:l
|
|
local col:w,items:l
|
|
local tmp:l,topl:l,botr:l
|
|
error err
|
|
begin
|
|
|
|
stz err
|
|
|
|
H_GetBlockPtr charthdl,chart
|
|
call S_NormalizeRange,in=([chart]:#S_CRange:l,[chart]:#S_CRange+4:l)
|
|
pulllong botr
|
|
pulllong topl
|
|
|
|
call S_GetMinMax,in=(topl:l,botr:l,#1:w),out=(:l)
|
|
tool FCLASSX,in=(:l)
|
|
txa
|
|
asl a
|
|
cmp #2*FCINF
|
|
beq @INF
|
|
|
|
call S_GetMinMax,in=(topl:l,botr:l,#0:w),out=(:l)
|
|
tool FCLASSX,in=(:l)
|
|
txa
|
|
asl a
|
|
cmp #2*FCINF
|
|
bne @dopie
|
|
|
|
@INF call D_AlertBox,in=(#1:w,#S_NoINF:l),out=(a:w)
|
|
dec err
|
|
brl exit
|
|
@dopie
|
|
subword botr,topl,a
|
|
ina
|
|
sta tmp
|
|
subword botr+2,topl+2,a
|
|
ina
|
|
sta tmp+2
|
|
|
|
tool _Multiply,in=(tmp:w,tmp+2:w),out=(items:l)
|
|
movelong items,tmp
|
|
|
|
mull4 tmp
|
|
|
|
tool _NewRgn,out=(OldClip:l),err=(err)
|
|
jcs exit
|
|
tool _GetClip,in=(OldClip:l)
|
|
tool _ClipRect,in=(#S_PictRect:l)
|
|
call D_NeedHand,in=(tmp:l),out=(arrayhdl:l),err=(err)
|
|
jcs whoops2
|
|
|
|
rcall D_Deref,in=(arrayhdl:ax),out=(S_PieArray:ax)
|
|
|
|
moveX S_PieZero,S_PieTotal
|
|
stz S_PieOffset
|
|
stz S_PieNegFlag
|
|
|
|
call S_TraverseRange,in=(topl:l,botr:l,#S_PieSum:l),err=(err)
|
|
jcs whoops
|
|
|
|
lda S_PieOffset
|
|
beq @nodata
|
|
|
|
tool FCMPX,in=(#S_PieTotal:l,#S_PieZero:l) ; any real data?
|
|
bvs OpenIt
|
|
|
|
@nodata call D_AlertBox,in=(#1:w,#S_NoData:l),out=(a:w)
|
|
dec err
|
|
brl whoops
|
|
|
|
OpenIt cmpw S_PieOffset,#S_MaxPieCount+1
|
|
blt ReallyOpen
|
|
|
|
call D_AlertBox,in=(#1:w,#S_BigPie:l),out=(a:w)
|
|
dec err
|
|
brl whoops
|
|
|
|
ReallyOpen tool _OpenPicture,in=(#S_Pictrect:l),out=(pict:l)
|
|
movelong pict,S_PiePict
|
|
|
|
moveword S_PieOffset,S_PieSliceCount
|
|
stz S_PieOffset
|
|
|
|
stz S_MissingSlice
|
|
tool _PicComment,in=(#picLParen:w,#0:w,#0:l)
|
|
call S_TraverseRange,in=(topl:l,botr:l,#S_PieDiv:l)
|
|
tool _PicComment,in=(#picRParen:w,#0:w,#0:l)
|
|
|
|
call S_SlicePie,in=(S_PieOffset:w,S_PieArray:l)
|
|
|
|
; Draw the title, at the bottom...
|
|
|
|
tool _MoveTo,in=(S_ChartTitleLoc:l)
|
|
_PenNormal ; necess. for #'s in case of 0's ==> no colour
|
|
jsl D_KillFont
|
|
rcall D_SelectFont,in=(#$FFFE:a,#$0800:x,#0:y)
|
|
|
|
H_GetBlockPtr charthdl,chart
|
|
addlong chart,#S_CName,s
|
|
Call D_DrawString,in=(:l)
|
|
|
|
jsl D_ClosePicture
|
|
bcs @picErr
|
|
call D_CheckPurge
|
|
bcs KillIt
|
|
lda S_MissingSlice
|
|
beq Done
|
|
|
|
call D_AlertBox,in=(#1:w,#S_SliceStr:l),out=(a:w)
|
|
bra exit
|
|
|
|
@picErr
|
|
KillIt tool _KillPicture,in=(pict:l)
|
|
call D_CheckPurge
|
|
dec err
|
|
|
|
; cmpl items,#25
|
|
; blt Done
|
|
|
|
|
|
Done _PenNormal
|
|
whoops tool _DisposeHandle,in=(arrayhdl:l)
|
|
whoops2 tool _SetClip,in=(OldClip:l)
|
|
tool _DisposeRgn,in=(OldClip:l)
|
|
|
|
exit return
|
|
ENDP
|
|
|
|
;---------------------------------------------------------------------------
|
|
;
|
|
; S_PieSum
|
|
;
|
|
; check cell for negative value, RETURN error if found.
|
|
; add value to S_PieTotal
|
|
|
|
S_PieSum PROC EXPORT
|
|
;Using SANEEQUS
|
|
;Using S_PieData
|
|
;Using S_ChartData
|
|
;Using S_CurrentData2
|
|
|
|
input cell:l
|
|
local ptr:l,cellptr:l
|
|
error err
|
|
BEGIN +b
|
|
|
|
stz err
|
|
|
|
call S_GetCellPtr,in=(Cell:l),out=(CellPtr:l)
|
|
|
|
ora CellPtr
|
|
jeq Exit
|
|
|
|
addlong cellptr,#S_CellFormat,ptr
|
|
lda [ptr]
|
|
and #S_CellTypeValue
|
|
cmp #S_CellTypeText
|
|
beq Exit
|
|
|
|
AddLong cellptr,#S_CellValue,ptr
|
|
|
|
lda S_ItzaBar
|
|
bne ThatsAll
|
|
|
|
tool FCMPX,in=(ptr:l,#S_PieZero:l)
|
|
bpl Positive
|
|
|
|
lda S_PieNegFlag
|
|
bne DidFlag
|
|
|
|
dec S_PieNegFlag
|
|
|
|
DidFlag lda S_PieNegFlag
|
|
bmi DoAdd
|
|
|
|
bozo call D_AlertBox,in=(#1:w,#S_BadNum:l),out=(a:w)
|
|
dec err
|
|
bra exit
|
|
|
|
Positive lda S_PieNegFlag
|
|
bne DidNegFlag2
|
|
|
|
inc S_PieNegFlag
|
|
|
|
DidNegFlag2 lda S_PieNegFlag
|
|
bmi bozo
|
|
DoAdd tool FADDX,in=(ptr:l,#S_PieTotal:l)
|
|
|
|
ThatsAll inc S_PieOffset
|
|
|
|
exit RETURN
|
|
ENDP
|
|
|
|
;---------------------------------------------------------------------------
|
|
;
|
|
; S_PieDiv
|
|
;
|
|
; calculate size of each slice.
|
|
|
|
S_PieDiv PROC EXPORT
|
|
;Using S_ChartData
|
|
;Using S_PieData
|
|
;Using SANEEQUS
|
|
;Using S_CurrentData2
|
|
|
|
input cell:l
|
|
local p1:w,percent:r,a1:w,angle:r
|
|
local cellptr:l
|
|
local ptr:l,tmp:l,color:w,count:w,skip:w
|
|
error err
|
|
BEGIN +b
|
|
|
|
stz err
|
|
|
|
call S_GetCellPtr,in=(Cell:l),out=(CellPtr:l)
|
|
|
|
ora CellPtr
|
|
jeq Exit
|
|
|
|
|
|
AddLong cellptr,#S_CellValue,cellptr
|
|
|
|
moveX [cellptr],percent
|
|
|
|
tool FCMPX,in=(#S_PieTotal:l,#S_PieZero:l)
|
|
bne DoDiv
|
|
|
|
moveX S_PieOne,percent
|
|
bra DidDiv
|
|
|
|
DoDiv tool FDIVX,in=(#S_PieTotal:l,!percent:l)
|
|
|
|
DidDiv moveX percent,angle
|
|
|
|
lda S_PieOffset
|
|
asl a
|
|
addlong a,S_PieArray,ptr
|
|
|
|
tool FMULX,in=(#S_Pie360:l,!angle:l)
|
|
tool FX2I,in=(!angle:l,!tmp:l)
|
|
|
|
moveword tmp,[ptr]
|
|
beq NoColor
|
|
|
|
stz skip
|
|
moveword S_PieOffset,color
|
|
bra DoLegend
|
|
|
|
NoColor inc skip
|
|
inc S_MissingSlice
|
|
|
|
DoLegend call S_PieLegend,in=(S_PieOffset:w,!percent:l,cellptr:l,skip:w)
|
|
|
|
inc S_PieOffset
|
|
|
|
exit RETURN
|
|
ENDP
|
|
|
|
;---------------------------------------------------------------------------
|
|
;
|
|
; S_PieLegend
|
|
;
|
|
; Draw a single legend.
|
|
; ^^^^^^
|
|
; Rect of color, percentage, value.
|
|
|
|
S_PieLegend PROC EXPORT
|
|
;Using S_ChartData
|
|
;Using S_PieData
|
|
|
|
input entry:w,percent:l,value:l,skip:w
|
|
local offset:w,tmprect:r,string:l,col:w,colors:l
|
|
local inccolor:w,ptr:l,drawcolor:w
|
|
BEGIN
|
|
|
|
stz inccolor
|
|
lda S_PieSliceCount
|
|
dec a
|
|
cmp entry
|
|
bne ContLegend
|
|
cmp #0
|
|
beq ContLegend
|
|
|
|
inc inccolor
|
|
|
|
ContLegend movelong #S_ChartColors,colors
|
|
|
|
tool _UDivide,in=(entry:w,#12:w),out=(entry:w,col:w)
|
|
|
|
rcall D_FastMult,in=(entry:x,#13:y),out=(tmprect:a)
|
|
|
|
rcall D_FastMult,in=(#S_PieColWd:x,col:y),out=(col:a)
|
|
|
|
addword col,#S_PieLegendH,tmprect+2
|
|
addword tmprect,#8,tmprect+4
|
|
addword col,#S_PieLegendH+16,tmprect+6
|
|
tool _PicComment,in=(#picLParen:w,#0:w,#0:l)
|
|
|
|
lda skip
|
|
bne Didcolor
|
|
|
|
lda entry
|
|
asl a
|
|
tay
|
|
bne Do4Pat
|
|
lda inccolor
|
|
asl a ; 0 = blue, 2= red...
|
|
asl a
|
|
tay
|
|
|
|
Do4Pat call D_Set4Pat,in=([colors]:y:w)
|
|
|
|
tool _PaintRect,in=(!tmprect:l)
|
|
_PenNormal
|
|
tool _SetPenSize,in=(#2:w,#1:w)
|
|
tool _FrameRect,in=(!tmprect:l)
|
|
DidColor
|
|
|
|
moveword tmprect+4,tmprect
|
|
|
|
addword col,#S_PieLegendH+24,a
|
|
tool _MoveTo,in=(a:w,tmprect:w)
|
|
|
|
_PenNormal ; necess. for #'s in case of 0's ==> no colour
|
|
jsl D_KillFont
|
|
rcall D_SelectFont,in=(#$FFFE:a,#$0800:x,#0:y)
|
|
|
|
|
|
in #60:w,#$11000:l,percent:l
|
|
out a:w,string:l,a:w
|
|
xcall X_FormatValue
|
|
|
|
Call D_DrawString,in=(string:l)
|
|
|
|
addword col,#S_PieLegendH+80,a
|
|
tool _MoveTo,in=(a:w,tmprect:w)
|
|
|
|
sublong value,#S_CellValue-S_CellFormat,ptr
|
|
in #80:w,[ptr]:l,value:l
|
|
out a:w,string:l,drawcolor:w
|
|
xcall X_FormatValue
|
|
|
|
lda DrawColor
|
|
pha
|
|
xba
|
|
ora 1,s
|
|
sta 1,s
|
|
asl a
|
|
asl a
|
|
asl a
|
|
asl a
|
|
ora 1,s
|
|
sta 1,s
|
|
_SetForeColor
|
|
|
|
Call D_DrawString,in=(string:l)
|
|
tool _PicComment,in=(#picRParen:w,#0:w,#0:l)
|
|
|
|
RETURN
|
|
ENDP
|
|
|
|
;---------------------------------------------------------------------------
|
|
;
|
|
; S_SlicePie (count,array)
|
|
; count:w Number of slices. 1-15, inclusive
|
|
; array:l array[count] of angles for slicing.
|
|
;
|
|
; Routine to actually draw pie. Assumes PICT has already been
|
|
; opened or whatever offsets necessary have been made.
|
|
;
|
|
; Pie is drawn as the circle inscribed in the rect [0,0,150,300]
|
|
;
|
|
|
|
S_SlicePie PROC EXPORT
|
|
;Using S_ChartData
|
|
;Using S_PieData
|
|
|
|
input count:w,array:l
|
|
local color:w,arc:w,tmp:l,colortab:l
|
|
local offset:w,comment:w,single:w
|
|
BEGIN
|
|
|
|
lda count
|
|
jeq exit
|
|
sta single
|
|
|
|
stz comment
|
|
stz color
|
|
stz offset
|
|
stz arc
|
|
movelong #S_ChartColors,colortab
|
|
|
|
loop lda color
|
|
asl a
|
|
tay
|
|
call D_Set4Pat,in=([colortab]:y:w)
|
|
|
|
lda offset
|
|
asl a
|
|
tay
|
|
moveword [array]:y,tmp
|
|
jeq DidArc
|
|
|
|
cmpw single,#1 ; in case of 1 item, full circle.
|
|
beq DoPaint
|
|
|
|
cmpw count,#1
|
|
bne DoComment
|
|
subword #360,arc,tmp ; subvert round-off errors on last slice.
|
|
|
|
DoComment tool _PicComment,in=(#picLParen:w,#0:w,#0:l) ; Avoid grouping
|
|
inc comment ; single objects.
|
|
DoPaint tool _PaintArc,in=(#S_PieRect:l,arc:w,tmp:w)
|
|
_PenNormal
|
|
tool _SetPenSize,in=(#2:w,#1:w)
|
|
tool _FrameArc,in=(#S_PieRect:l,arc:w,tmp:w)
|
|
subword tmp,arc,a
|
|
cmp #360 ; no slices -- one pie.
|
|
beq DidArc
|
|
|
|
call AngleToPt,in=(arc:w),out=(a:w,x:w)
|
|
pha
|
|
phx
|
|
_MoveTo
|
|
tool _LineTo,in=(#S_PieHCtr:w,#S_PieVCtr:w)
|
|
addword arc,tmp,arc
|
|
call AngleToPt,in=(arc:w),out=(a:w,x:w)
|
|
pha
|
|
phx
|
|
_MoveTo
|
|
tool _LineTo,in=(#S_PieHCtr:w,#S_PieVCtr:w)
|
|
|
|
lda comment
|
|
beq DidArc
|
|
tool _PicComment,in=(#picRParen:w,#0:w,#0:l)
|
|
stz comment
|
|
|
|
DidArc lda color
|
|
inc a
|
|
cmp #12
|
|
bne ContColor
|
|
lda count
|
|
dec a
|
|
dec a ; Last color.
|
|
bne OKFirst
|
|
lda #2 ; Red
|
|
bra ContColor
|
|
|
|
OKFirst lda #0
|
|
|
|
ContColor sta color
|
|
inc offset
|
|
dec count
|
|
jne loop
|
|
|
|
exit RETURN
|
|
ENDP
|
|
|
|
****************************************************************
|
|
*
|
|
* AngleToPt - take a reference rect and an angle to a point.
|
|
*
|
|
* Notes: The point RETURNed lies on the ellipse inscribed in the
|
|
* rectangle.
|
|
*
|
|
*
|
|
****************************************************************
|
|
|
|
AngleToPt PROC EXPORT
|
|
;Using SANEEQUS
|
|
;Using S_PieData
|
|
;Using S_ChartData
|
|
|
|
input angle:w ; angle
|
|
output point:l ; point (value)
|
|
local tmp:l
|
|
BEGIN
|
|
|
|
lda angle
|
|
Loop360 cmp #360
|
|
blt Did360
|
|
subword a,#360,a
|
|
bra Loop360
|
|
Did360 sta angle
|
|
|
|
; Convert deg->rad
|
|
; y = (-cos(a)+1) ; 1/2 ; (rect_bot - rect_top) + rect_top
|
|
; x = (sin(a)+1) ; 1/2 ; (rect_right - rect_left) + rect_left
|
|
|
|
tool FI2X,in=(!angle:l,#FlP1:l)
|
|
|
|
|
|
tool FMULX,in=(#PI:l,#FlP1:l)
|
|
tool FMULX,in=(#S_PieTwo:l,#FlP1:l)
|
|
moveX S_Pie360,FlP3
|
|
tool FDIVX,in=(#FlP3:l,#FlP1:l)
|
|
|
|
moveX FlP1,Flp2
|
|
tool FCOSX,in=(#FlP1:l)
|
|
tool FSINX,in=(#FlP2:l)
|
|
|
|
moveX FlP1,FlP3
|
|
moveX S_PieOne,FlP1
|
|
tool FSUBX,in=(#FlP3:l,#FlP1:l)
|
|
tool FADDX,in=(#S_PieOne:l,#FlP2:l)
|
|
|
|
subword S_PieRect+4,#1,tmp
|
|
tool FI2X,in=(!tmp:l,#FlP3:l)
|
|
tool FMULX,in=(#FlP3:l,#FlP1:l)
|
|
|
|
moveX S_PieTwo,FlP3
|
|
tool FDIVX,in=(#FlP3:l,#FlP1:l)
|
|
tool FX2I,in=(#FlP1:l,!point:l)
|
|
|
|
subword S_PieRect+6,#1,tmp
|
|
tool FI2X,in=(!tmp:l,#FlP3:l)
|
|
tool FMULX,in=(#FlP3:l,#FlP2:l)
|
|
|
|
moveX S_PieTwo,FlP3
|
|
tool FDIVX,in=(#FlP3:l,#FlP2:l)
|
|
tool FX2I,in=(#FlP2:l,!point+2:l)
|
|
|
|
RETURN
|
|
|
|
PI DC.X "3.14159265358979323846264338327950288419716939937511"
|
|
FlP1 DS.B 10
|
|
FlP2 DS.B 10
|
|
FlP3 DS.B 10
|
|
|
|
ENDP
|
|
|
|
;--------------------------------------------
|
|
|
|
Fix2Int PROC EXPORT
|
|
|
|
tay
|
|
bpl exit
|
|
|
|
inx
|
|
|
|
exit txa
|
|
rtl
|
|
|
|
ENDP
|
|
|
|
;--------------------------------------------
|
|
;
|
|
; S_PieData
|
|
;
|
|
|
|
S_PieData PROC EXPORT
|
|
|
|
EXPORT S_PieNegFlag
|
|
EXPORT S_PiePict
|
|
EXPORT S_PieOffset
|
|
EXPORT S_PieSliceCount
|
|
EXPORT S_PieArray
|
|
EXPORT S_PieTotal
|
|
EXPORT S_PieZero
|
|
EXPORT S_Pie360
|
|
EXPORT S_PieTwo
|
|
EXPORT S_PieOne
|
|
|
|
S_PieNegFlag DS.W 1
|
|
S_PiePict DS.L 1
|
|
S_PieOffset DS.W 1
|
|
S_PieSliceCount DS.W 1
|
|
S_PieArray DS.L 1
|
|
S_PieTotal DS.B 10
|
|
|
|
S_PieZero DC.X "0.0"
|
|
S_Pie360 DC.X "360.0"
|
|
S_PieTwo DC.X "2.0"
|
|
S_PieOne DC.X "1.0"
|
|
|
|
ENDP
|
|
END
|
|
|