mirror of
https://github.com/antoinevignau/source.git
synced 2024-07-10 00:28:58 +00:00
1 line
21 KiB
ArmAsm
Executable File
1 line
21 KiB
ArmAsm
Executable File
|
|
load 'macros.dump'
|
|
include 'driver.equ'
|
|
include 'pl.equ'
|
|
|
|
;-----------------------------------------------
|
|
;
|
|
; Imported addresses
|
|
;
|
|
;-----------------------------------------------
|
|
|
|
IMPORT D_AddRectRgn
|
|
IMPORT D_Deref
|
|
IMPORT P_DrawHandles
|
|
IMPORT P_Fix2Int
|
|
IMPORT P_FixRect
|
|
IMPORT P_GetModifiers
|
|
IMPORT P_GetPageMode
|
|
|
|
;-----------------------------------------------
|
|
;
|
|
; Forward addresses and entries
|
|
;
|
|
;-----------------------------------------------
|
|
|
|
ENTRY P_AddObjRgn
|
|
ENTRY P_DoHandles
|
|
ENTRY P_FixSpecRect
|
|
ENTRY P_PtInLine
|
|
ENTRY P_PtInOval
|
|
ENTRY P_ValidRect
|
|
|
|
|
|
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; P_ListOp (ObjList:l,Oper:w,Data:l,Data2:l)
|
|
;
|
|
; Automatically skips any object with the Deleted flag set.
|
|
|
|
P_ListOp PROC EXPORT
|
|
;Using P_ObjData
|
|
|
|
INPUT ObjList:l,Oper:w,Data:l,Data2:l
|
|
LOCAL ObjPtr:l,ObjType:w,Selected:w,Q_Rect:r
|
|
|
|
BEGIN
|
|
|
|
ObjLoop cpzl ObjList
|
|
beq Exit
|
|
|
|
movelong [ObjList],ObjPtr
|
|
moveword [ObjPtr]:#P_Deleted,a
|
|
bne NextObj
|
|
tool _HLock,in=(ObjList:l)
|
|
|
|
moveword [ObjPtr]:#P_Type,ObjType
|
|
moveword [ObjPtr]:#P_Selected,Selected
|
|
moverect [ObjPtr]:#P_ObjRect,Q_Rect
|
|
|
|
|
|
lda Oper
|
|
asl a
|
|
tax
|
|
jsr (JumpTable,x)
|
|
|
|
tool _HUnlock,in=(ObjList:l)
|
|
|
|
NextObj movelong [ObjPtr],ObjList
|
|
bra ObjLoop
|
|
|
|
|
|
Exit RETURN
|
|
|
|
JumpTable
|
|
DC.W SelectRect
|
|
DC.W DeselectAll
|
|
DC.W SelectAll
|
|
DC.W FixTObj
|
|
DC.W OffsetObj
|
|
DC.W AddUpdate
|
|
DC.W ClrUndoData
|
|
DC.W SetUndoData
|
|
DC.W CpyUndoData
|
|
|
|
|
|
|
|
; -------- Operation 0
|
|
|
|
SelectRect
|
|
|
|
;TopLeft
|
|
tool _PtInRect,in=(!Q_Rect:l,Data:l),out=(a:w)
|
|
beq Exit0
|
|
|
|
;BottomRight
|
|
tool _PtInRect,in=(!Q_Rect+4:l,Data:l),out=(a:w)
|
|
beq Exit0
|
|
|
|
lda Selected
|
|
eor #1
|
|
moveword a,[ObjPtr]:#P_Selected
|
|
call P_DrawHandles,in=(ObjPtr:l)
|
|
Exit0 rts
|
|
|
|
|
|
|
|
; -------- Operation 1
|
|
;
|
|
; If Data is not 0, then don't D_Update the screen.
|
|
|
|
DeselectAll
|
|
lda Selected
|
|
beq Exit1
|
|
moveword #0,[ObjPtr]:#P_Selected
|
|
lda Data
|
|
bne Exit1
|
|
call P_DrawHandles,in=(ObjPtr:l)
|
|
Exit1 rts
|
|
|
|
|
|
|
|
; ------- Operation 2
|
|
|
|
SelectAll
|
|
lda Selected
|
|
bne Exit2
|
|
inc a
|
|
moveword a,[ObjPtr]:#P_Selected
|
|
call P_DrawHandles,in=(ObjPtr:l)
|
|
Exit2 rts
|
|
|
|
|
|
|
|
; ------- Operation 3
|
|
|
|
FixTObj
|
|
cmpw ObjType,#P_ALPHA
|
|
bne Exit3
|
|
moveword Data,[ObjPtr]:#P_PageNo
|
|
Exit3 rts
|
|
|
|
|
|
; ------- Operation 4
|
|
; Offsets all object Q_Rects by Data.
|
|
|
|
OffsetObj
|
|
lda Selected
|
|
beq Exit4
|
|
|
|
addword Q_Rect,Data,[ObjPtr]:#P_ObjRect
|
|
addword Q_Rect+4,Data,[ObjPtr]:#P_ObjRect+4
|
|
addword Q_Rect+2,Data+2,[ObjPtr]:#P_ObjRect+2
|
|
addword Q_Rect+6,Data+2,[ObjPtr]:#P_ObjRect+6
|
|
|
|
cmpw ObjType,#P_PICTURE
|
|
bne PictSet
|
|
|
|
addword [ObjPtr]:#P_PictRect,Data,[ObjPtr]:#P_PictRect
|
|
addword [ObjPtr]:#P_PictRect+4,Data,[ObjPtr]:#P_PictRect+4
|
|
addword [ObjPtr]:#P_PictRect+2,Data+2,[ObjPtr]:#P_PictRect+2
|
|
addword [ObjPtr]:#P_PictRect+6,Data+2,[ObjPtr]:#P_PictRect+6
|
|
PictSet
|
|
|
|
call P_FixSpecRect,in=(ObjPtr:l)
|
|
|
|
Exit4 rts
|
|
|
|
|
|
|
|
; ------- Operation 5
|
|
; Adds the selected objects to the D_Update Q_Region passed in Data.
|
|
|
|
AddUpdate
|
|
lda Selected
|
|
beq Exit5
|
|
call P_AddObjRgn,in=(ObjPtr:l,Data:l)
|
|
Exit5 rts
|
|
|
|
|
|
|
|
; ------ Operation 6
|
|
; Sets the UndoData for all selected objects.
|
|
|
|
ClrUndoData
|
|
moveword #0,[ObjPtr]:#P_UndoData
|
|
Exit6 rts
|
|
|
|
|
|
|
|
; ------ Operation 7
|
|
; Sets the UndoData for all selected objects.
|
|
|
|
SetUndoData
|
|
lda Selected
|
|
beq Exit7
|
|
moveword Data,[ObjPtr]:#P_UndoData
|
|
Exit7 rts
|
|
|
|
|
|
|
|
; ------ Operation 8
|
|
; Copies the UndoData into the Selected field. Used for redo of obj deletion.
|
|
|
|
CpyUndoData
|
|
moveword [ObjPtr]:#P_UndoData,[ObjPtr]:#P_Selected
|
|
Exit8 rts
|
|
|
|
|
|
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; P_FindObject (ObjList:l,Pt:l) : ObjHdl:l,Handle:w
|
|
;
|
|
; Pt must be in screen coordinates.
|
|
;
|
|
; Returns 0 for ObjHdl if no object is found.
|
|
; Handle ranges from 1 to 4 for normal objects, and includes
|
|
; 5 and 6 for Q_Text objects.
|
|
;
|
|
; [BOGUS] -- leaves ObjHdl X_Locked.
|
|
|
|
|
|
P_FindObject PROC EXPORT
|
|
;Using P_Data
|
|
;Using P_ObjData
|
|
|
|
INPUT ObjList:l,Pt:l
|
|
OUTPUT ObjHdl:l,Handle:w
|
|
|
|
LOCAL ObjPtr:l,Q_Rect:r,InnerRect:r,HRect:r,PageMode:w
|
|
LOCAL ObjType:w,Q_PenSize:w,RgnHdl:l,InLine:w
|
|
|
|
BEGIN
|
|
|
|
|
|
rcall P_GetPageMode,out=(PageMode:a)
|
|
|
|
|
|
; Check Handles of all objects first
|
|
movelong ObjList,ObjHdl
|
|
|
|
Loop cpzl ObjHdl
|
|
beq CheckObjects
|
|
|
|
rcall D_Deref,in=(ObjHdl:ax),out=(ObjPtr:ax)
|
|
moveword [ObjPtr]:#P_Deleted,a
|
|
bne TryNext
|
|
moveword [ObjPtr]:#P_Selected,a
|
|
beq TryNext
|
|
|
|
call P_DoHandles,in=(ObjPtr:l,#1:w,Pt:l),out=(Handle:w)
|
|
jne Exit
|
|
|
|
TryNext
|
|
tool _HUnlock,in=(ObjHdl:l)
|
|
movelong [ObjPtr],ObjHdl
|
|
brl Loop
|
|
|
|
|
|
|
|
; Check all the objects
|
|
|
|
CheckObjects
|
|
stz Handle
|
|
movelong ObjList,ObjHdl
|
|
|
|
Loop2 cpzl ObjHdl
|
|
jeq Exit
|
|
|
|
rcall D_Deref,in=(ObjHdl:ax),out=(ObjPtr:ax)
|
|
moveword [ObjPtr]:#P_Deleted,a
|
|
jne TryNext2
|
|
|
|
moveword [ObjPtr]:#P_Type,ObjType
|
|
moveword [ObjPtr]:#P_PenSize,Q_PenSize
|
|
moverect [ObjPtr]:#P_ObjRect,Q_Rect
|
|
moverect Q_Rect,InnerRect
|
|
|
|
call P_FixRect,in=(!Q_Rect:l,ObjType:w,PageMode:w,#1:w)
|
|
|
|
; Inset by Q_PenSize
|
|
pushlong !InnerRect
|
|
lda Q_PenSize
|
|
tax
|
|
asl a
|
|
inc a
|
|
pha
|
|
inx
|
|
phx
|
|
_InsetRect
|
|
|
|
call P_FixRect,in=(!InnerRect:l,ObjType:w,PageMode:w,#1:w)
|
|
|
|
|
|
lda ObjType
|
|
asl a
|
|
tax
|
|
jmp (JumpTable,x)
|
|
|
|
CheckLine
|
|
call P_PtInLine,in=(Pt:l,ObjPtr:l,!Q_Rect:l),out=(a:w)
|
|
jne Exit
|
|
brl TryNext2
|
|
|
|
CheckFRect
|
|
tool _PtInRect,in=(!Pt:l,!Q_Rect:l),out=(a:w)
|
|
jne Exit
|
|
brl TryNext2
|
|
|
|
CheckRect
|
|
moveword [ObjPtr]:#P_ObjFilled,a
|
|
bne CheckFRect
|
|
tool _PtInRect,in=(!Pt:l,!Q_Rect:l),out=(a:w)
|
|
beq TryNext2
|
|
|
|
tool _PtInRect,in=(!Pt:l,!InnerRect:l),out=(a:w)
|
|
beq Exit
|
|
bra TryNext2
|
|
|
|
|
|
CheckCircle
|
|
call P_PtInOval,in=(Pt:l,!Q_Rect:l),out=(a:w)
|
|
beq TryNext2
|
|
moveword [ObjPtr]:#P_ObjFilled,a
|
|
bne Exit
|
|
|
|
call P_PtInOval,in=(Pt:l,!InnerRect:l),out=(a:w)
|
|
beq Exit
|
|
|
|
|
|
TryNext2 tool _HUnlock,in=(ObjHdl:l)
|
|
movelong [ObjPtr],ObjHdl
|
|
brl Loop2
|
|
|
|
|
|
Exit RETURN
|
|
|
|
|
|
JumpTable DC.W TryNext2
|
|
DC.W CheckFRect
|
|
DC.W CheckFRect
|
|
DC.W CheckFRect
|
|
DC.W CheckLine
|
|
DC.W CheckLine
|
|
DC.W CheckRect
|
|
DC.W CheckRect
|
|
DC.W CheckCircle
|
|
DC.W CheckFRect
|
|
|
|
ENDP
|
|
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; P_LineAdjust (ObjPtr:l,RectPtr:l)
|
|
;
|
|
|
|
P_LineAdjust PROC EXPORT
|
|
;Using P_ObjData
|
|
|
|
INPUT ObjPtr:l,RectPtr:l
|
|
LOCAL Q_PenSize:w
|
|
|
|
BEGIN
|
|
|
|
cmpw [ObjPtr]:#P_Type,#P_LINE
|
|
beq IsLine
|
|
cmp #P_STRLINE
|
|
bne Exit
|
|
IsLine
|
|
|
|
moveword [ObjPtr]:#P_PenSize,Q_PenSize
|
|
|
|
cmpw [RectPtr]:#4,[RectPtr]
|
|
bge Normal1
|
|
addword Q_PenSize,[RectPtr],[RectPtr]
|
|
bra Horiz
|
|
|
|
Normal1 addword Q_PenSize,[RectPtr]:#4,[RectPtr]:#4
|
|
|
|
Horiz
|
|
asl Q_PenSize
|
|
cmpw [RectPtr]:#6,[RectPtr]:#2
|
|
bge Normal2
|
|
addword Q_PenSize,[RectPtr]:#2,[RectPtr]:#2
|
|
bra Exit
|
|
|
|
Normal2 addword Q_PenSize,[RectPtr]:#6,[RectPtr]:#6
|
|
|
|
Exit RETURN
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; P_DoHandles (ObjPtr:l,DoFind:w,Where:l) : Handle:w
|
|
;
|
|
; DoFind -- 1 - Find; 0 - Draw
|
|
; Where -- Mouse pos. in local screen coordinates if Find
|
|
; Handle -- Result of Find
|
|
;
|
|
; General purpose routine for drawing and finding handles.
|
|
|
|
P_DoHandles PROC EXPORT
|
|
;Using P_Data
|
|
;Using P_ObjData
|
|
|
|
INPUT ObjPtr:l,DoFind:w,Where:l
|
|
OUTPUT Handle:w
|
|
|
|
LOCAL Q_Rect:r,HRect:r,ObjType:w,Swapped:w
|
|
LOCAL Type:w,Q_PenSize:w,DblPen:w,Temp:w,PageMode:w
|
|
|
|
Q_Line equ 1
|
|
FlipLine equ 2
|
|
|
|
BEGIN
|
|
|
|
moverect [ObjPtr]:#P_ObjRect,Q_Rect
|
|
call P_LineAdjust,in=(ObjPtr:l,!Q_Rect:l)
|
|
|
|
moveword [ObjPtr]:#P_Type,ObjType
|
|
moveword [ObjPtr]:#P_PenSize,Q_PenSize
|
|
asl a
|
|
sta DblPen
|
|
|
|
rcall P_GetPageMode,out=(PageMode:a)
|
|
call P_FixRect,in=(!Q_Rect:l,ObjType:w,PageMode:w,#1:w)
|
|
call P_ValidRect,in=(!Q_Rect:l),out=(Swapped:w)
|
|
|
|
|
|
lda DoFind
|
|
beq Drawing
|
|
|
|
; finding - first test bounds, to make test fast for really bad pts
|
|
|
|
stz Handle
|
|
moverect Q_Rect,HRect
|
|
tool _InsetRect,in=(!HRect:l,#-4:w,#-6:w)
|
|
tool _PtInRect,in=(!Where:l,!HRect:l),out=(a:w)
|
|
jeq done
|
|
Drawing
|
|
|
|
|
|
stz Type
|
|
cmpw ObjType,#P_LINE
|
|
beq IsLine
|
|
cmp #P_STRLINE
|
|
bne Cont
|
|
|
|
IsLine
|
|
inc Type
|
|
lda Swapped
|
|
beq Cont
|
|
inc Type
|
|
Cont
|
|
|
|
|
|
|
|
TestHV
|
|
lda Type
|
|
jeq NotHV ; Not a horiz or vert Q_Line
|
|
subword Q_Rect+6,Q_Rect+2,a ; Q_Rect width = horiz. Q_PenSize?
|
|
cmp DblPen
|
|
bne NotVert
|
|
|
|
|
|
; Vertical Q_Line
|
|
|
|
lsr a
|
|
addword a,Q_Rect+2,a
|
|
subword a,#3,HRect+2
|
|
addword a,#6,HRect+6
|
|
addword Q_Rect,#1,HRect+4
|
|
subword a,#3,HRect
|
|
lda #P_TLHdl
|
|
jsr DoOneHand ; draw or test the handle
|
|
jcs done ; carry set if hit: exit
|
|
|
|
subword Q_Rect+4,#1,HRect
|
|
addword a,#3,HRect+4
|
|
lda #P_BRHdl
|
|
jsr DoOneHand
|
|
brl done
|
|
|
|
notvert subword Q_Rect+4,Q_Rect,a ; Q_Rect height = vert. Q_PenSize?
|
|
cmp DblPen
|
|
bne nothv
|
|
|
|
|
|
|
|
; Horizontal Q_Line
|
|
|
|
lsr a
|
|
addword a,Q_Rect,a
|
|
subword a,#1,HRect
|
|
addword a,#3,HRect+4
|
|
addword Q_Rect+2,#2,HRect+6
|
|
subword a,#6,HRect+2
|
|
lda #P_TLHdl
|
|
jsr DoOneHand
|
|
jcs done
|
|
|
|
subword Q_Rect+6,#2,HRect+2
|
|
addword a,#6,HRect+6
|
|
lda #P_BRHdl
|
|
jsr DoOneHand
|
|
brl done
|
|
|
|
|
|
; Not horizontal or vertical
|
|
|
|
nothv
|
|
addword Q_Rect,#1,HRect+4
|
|
subword a,#3,HRect
|
|
addword Q_Rect+2,#2,HRect+6
|
|
subword a,#6,HRect+2
|
|
cmpw Type,#FLipLine
|
|
beq didul
|
|
lda #P_TLHdl
|
|
jsr DoOneHand
|
|
jcs done
|
|
|
|
didul
|
|
subword Q_Rect+4,#1,HRect
|
|
addword a,#3,HRect+4
|
|
cmpw Type,#Q_Line
|
|
beq diddl
|
|
lda #P_BLHdl
|
|
jsr DoOneHand
|
|
jcs done
|
|
|
|
diddl
|
|
subword Q_Rect+6,#2,HRect+2
|
|
addword a,#6,HRect+6
|
|
cmpw Type,#FlipLine
|
|
beq diddr
|
|
lda #P_BRHdl
|
|
jsr DoOneHand
|
|
jcs done
|
|
|
|
diddr
|
|
addword Q_Rect,#1,HRect+4
|
|
subword a,#3,HRect
|
|
cmpw Type,#Q_Line
|
|
beq didur
|
|
lda #P_TRHdl
|
|
jsr DoOneHand
|
|
jcs done
|
|
didur
|
|
|
|
|
|
lda DoFind
|
|
jeq done
|
|
cmpw ObjType,#P_ALPHA
|
|
jne done
|
|
|
|
subword Q_Rect+6,Q_Rect+2,a
|
|
lsr a
|
|
subword a,#7,a
|
|
addword a,Q_Rect+2,HRect+2
|
|
addword a,#14,HRect+6
|
|
|
|
moveword Q_Rect,HRect+4
|
|
subword a,#5,HRect
|
|
lda #5
|
|
jsr DoOneHand
|
|
jcs done
|
|
|
|
moveword Q_Rect+4,HRect
|
|
addword a,#6,HRect+4
|
|
lda #6
|
|
jsr DoOneHand
|
|
|
|
|
|
|
|
done
|
|
cmpw Type,#2
|
|
bne Exit
|
|
|
|
cmpw Handle,#4
|
|
bne Try2
|
|
moveword #1,Handle
|
|
bra Exit
|
|
Try2 cmp #3
|
|
bne Exit
|
|
moveword #2,Handle
|
|
|
|
|
|
Exit RETURN
|
|
|
|
|
|
DoOneHand
|
|
sta temp
|
|
|
|
lda DoFind
|
|
beq DrawIt
|
|
|
|
tool _PtInRect,in=(!Where:l,!HRect:l),out=(a:w)
|
|
beq notin
|
|
sec
|
|
moveword temp,Handle
|
|
notin rts
|
|
|
|
DrawIt
|
|
tool _InvertRect,in=(!HRect:l)
|
|
rts
|
|
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;-------------------------------------------------------------------------------
|
|
;
|
|
; P_DoThread (ObjHdl:l,NewObj:l,Dir:w)
|
|
;
|
|
|
|
P_DoThread PROC EXPORT
|
|
;Using P_ObjData
|
|
|
|
INPUT ObjHdl:l,NewObj:l,Dir:w
|
|
|
|
LOCAL ObjPtr:l,NewPtr:l,PrevObj:l,PrevPtr:l
|
|
LOCAL NextObj:l,NextPtr:l
|
|
|
|
BEGIN
|
|
|
|
movelong [ObjHdl],ObjPtr
|
|
movelong [NewObj],NewPtr
|
|
|
|
lda Dir
|
|
bne After
|
|
|
|
movelong [ObjPtr]:#P_PThread,PrevObj
|
|
movelong ObjHdl,[NewPtr]:#P_NThread
|
|
movelong PrevObj,[NewPtr]:#P_PThread
|
|
movelong NewObj,[ObjPtr]:#P_PThread
|
|
cpzl PrevObj
|
|
beq Skip1
|
|
movelong [PrevObj],PrevPtr
|
|
movelong NewObj,[PrevPtr]:#P_NThread
|
|
Skip1
|
|
bra Exit
|
|
|
|
|
|
|
|
After
|
|
movelong [ObjPtr]:#P_NThread,NextObj
|
|
movelong ObjHdl,[NewPtr]:#P_PThread
|
|
movelong NextObj,[NewPtr]:#P_NThread
|
|
movelong NewObj,[ObjPtr]:#P_NThread
|
|
cpzl NextObj
|
|
beq Skip2
|
|
movelong [NextObj],NextPtr
|
|
movelong NewObj,[NextPtr]:#P_PThread
|
|
Skip2
|
|
|
|
|
|
Exit RETURN
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;-----------------------------------------------------------------------------
|
|
;
|
|
; P_BoundsRect (ObjHdl:l,RectPtr:l) : Count:w
|
|
;
|
|
|
|
P_BoundsRect PROC EXPORT
|
|
;Using P_Data
|
|
;Using P_ObjData
|
|
|
|
INPUT ObjHdl:l,RectPtr:l
|
|
OUTPUT Count:w
|
|
LOCAL ObjPtr:l,Q_Rect:r
|
|
|
|
BEGIN
|
|
|
|
stz Count
|
|
|
|
WhileLoop cpzl ObjHdl
|
|
jeq EndLoop
|
|
movelong [ObjHdl],ObjPtr
|
|
moveword [ObjPtr]:#P_Deleted,a
|
|
jne NextObject
|
|
moveword [ObjPtr]:#P_Selected,a
|
|
jeq NextObject
|
|
|
|
moverect [ObjPtr]:#P_ObjRect,Q_Rect
|
|
call P_LineAdjust,in=(ObjPtr:l,!Q_Rect:l)
|
|
call P_ValidRect,in=(!Q_Rect:l),out=(a:w)
|
|
|
|
lda Count
|
|
bne NotFirst
|
|
moverect Q_Rect,[RectPtr]
|
|
NotFirst
|
|
inc Count
|
|
|
|
|
|
cmpw Q_Rect,[RectPtr]
|
|
bpl x1
|
|
sta [RectPtr]
|
|
x1
|
|
cmpw Q_Rect+2,[RectPtr]:#2
|
|
bpl x2
|
|
sta [RectPtr],y
|
|
x2
|
|
cmpw Q_Rect+4,[RectPtr]:#4
|
|
bmi x3
|
|
sta [RectPtr],y
|
|
x3
|
|
cmpw Q_Rect+6,[RectPtr]:#6
|
|
bmi x4
|
|
sta [RectPtr],y
|
|
x4
|
|
|
|
|
|
NextObject movelong [ObjPtr],ObjHdl
|
|
brl WhileLoop
|
|
EndLoop
|
|
|
|
RETURN
|
|
ENDP
|
|
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; P_Constrain (Figure:w,AnchorPt:l,PointPtr:l,PrintHandle:l)
|
|
;
|
|
|
|
P_Constrain PROC EXPORT
|
|
;Using P_ObjData
|
|
|
|
INPUT Figure:w,AnchorPt:l,PointPtr:l,PHdl:l
|
|
LOCAL ModFlags:w,Flags:w,NewPt:l
|
|
LOCAL dx:w,dy:w,pdx:l,pdy:l
|
|
LOCAL ratio:l,tmp:l,newdy:l
|
|
|
|
BEGIN +B
|
|
|
|
call P_GetModifiers,out=(ModFlags:w)
|
|
|
|
lda Figure
|
|
beq ToExit
|
|
asl a
|
|
tay
|
|
lda ConstrainTable,y
|
|
sta flags
|
|
|
|
cmpw Figure,#P_STRLINE
|
|
beq DoConstr
|
|
|
|
lda ModFlags
|
|
and #shiftKey
|
|
bne DoConstr
|
|
ToExit brl Exit
|
|
|
|
|
|
*
|
|
* This code constrains newpt with reference to anchorpt. The type of
|
|
* constraint is specified in `flags,' a combination of the bits
|
|
* %01 (constrain horizontally/vertically) & %10 (constrain
|
|
* diagonally). At least one bit must be set.
|
|
* Q_Pixels are assumed to be shaped as defined by the print record.
|
|
*
|
|
|
|
DoConstr movelong [phdl],tmp
|
|
|
|
tool _FixRatio,in=([tmp]:#4:w,[tmp]:#6:w),out=(ratio:l)
|
|
|
|
movelong [pointptr],newpt
|
|
|
|
subword anchorpt,newpt,dy
|
|
abs a
|
|
sta pdy+2
|
|
stz pdy
|
|
|
|
subword anchorpt+2,newpt+2,dx
|
|
abs a
|
|
sta pdx+2
|
|
stz pdx
|
|
|
|
tool _FixDiv,in=(pdy:l,ratio:l),out=(newdy:l)
|
|
movelong newdy,tmp
|
|
|
|
clc
|
|
rol tmp
|
|
rol tmp+2
|
|
cmpl tmp,pdx ; if 2dy < dx, should be horizontal
|
|
jlt horiz
|
|
cmpl newdy,pdx ; if dy < dx, should be diag/horiz
|
|
blt diag2
|
|
|
|
movelong pdx,tmp
|
|
clc
|
|
rol tmp
|
|
rol tmp+2
|
|
cmpl newdy,tmp ; if dy < 2dx should be diag/vert
|
|
blt diag1 ; otherwise vertical.
|
|
|
|
vert lda flags ; If can't be vertical, diagonal
|
|
bit #1
|
|
beq diag1
|
|
|
|
moveword anchorpt+2,[pointptr]:#2
|
|
brl exit
|
|
|
|
diag1 lda flags ; If can't be diagonal, vertical
|
|
bit #2
|
|
beq vert
|
|
|
|
lda dx
|
|
bpl d1pos
|
|
rcall P_Fix2Int,in=(newdy:ax)
|
|
addword a,anchorpt+2,[pointptr]:#2
|
|
bra exit
|
|
d1pos rcall P_Fix2Int,in=(newdy:ax)
|
|
neg a
|
|
addword a,anchorpt+2,[pointptr]:#2
|
|
bra exit
|
|
|
|
diag2 lda flags ; If can't be diagonal, horizontal
|
|
bit #2
|
|
beq horiz
|
|
|
|
tool _FixMul,in=(pdx:l,ratio:l),out=(pdx:l)
|
|
lda dy
|
|
bpl d2pos
|
|
rcall P_Fix2Int,in=(pdx:ax)
|
|
addword a,anchorpt,[pointptr]
|
|
bra exit
|
|
d2pos rcall P_Fix2Int,in=(pdx:ax)
|
|
neg a
|
|
addword a,anchorpt,[pointptr]
|
|
bra exit
|
|
|
|
horiz lda flags ; If can't be horizontal, diagonal
|
|
bit #1
|
|
beq diag2
|
|
|
|
moveword anchorpt,[pointptr]
|
|
|
|
|
|
Exit RETURN
|
|
|
|
ConstrainTable DC.W 0,2,2,2,1,3,2,2,2,2,1
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
;-----------------------------------------------------------------------------
|
|
;
|
|
; P_AddObjRgn (ObjPtr:l; RgnHdl:l)
|
|
;
|
|
; Adds the area taken up by the object to the already created RgnHdl.
|
|
|
|
|
|
P_AddObjRgn PROC EXPORT
|
|
;Using P_Data
|
|
;Using P_ObjData
|
|
|
|
INPUT ObjPtr:l,RgnHdl:l
|
|
LOCAL Q_Rect:r,HRect:r,PageMode:w
|
|
|
|
BEGIN
|
|
|
|
moverect [ObjPtr]:#P_ObjRect,Q_Rect
|
|
call P_LineAdjust,in=(ObjPtr:l,!Q_Rect:l)
|
|
rcall P_GetPageMode,out=(PageMode:a)
|
|
call P_FixRect,in=(!Q_Rect:l,#P_RECTANGLE:w,PageMode:w,#1:w)
|
|
|
|
moveword [ObjPtr]:#P_Selected,a
|
|
beq AddRect
|
|
subword Q_Rect+2,#4,Q_Rect+2
|
|
addword Q_Rect+6,#4,Q_Rect+6
|
|
cmpw [ObjPtr]:#P_Type,#P_ALPHA
|
|
bne NotAlpha
|
|
subword Q_Rect,#6,Q_Rect
|
|
addword Q_Rect+4,#6,Q_Rect+4
|
|
bra AddRect
|
|
NotAlpha dec Q_Rect
|
|
dec Q_Rect
|
|
inc Q_Rect+4
|
|
inc Q_Rect+4
|
|
|
|
AddRect
|
|
call D_AddRectRgn,in=(RgnHdl:l,!Q_Rect:l)
|
|
|
|
Exit RETURN
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
|
|
;----------------------------------------------------------------------------
|
|
;
|
|
; P_SmallRect (RectPtr:l) : Small:w
|
|
|
|
P_SmallRect PROC EXPORT
|
|
|
|
INPUT RectPtr:l
|
|
OUTPUT Small:w
|
|
|
|
BEGIN
|
|
|
|
stz Small
|
|
|
|
subword [RectPtr]:#4,[RectPtr],a
|
|
cmp #6
|
|
bge Exit
|
|
|
|
subword [RectPtr]:#6,[RectPtr]:#2,a
|
|
cmp #12
|
|
bge Exit
|
|
inc Small
|
|
|
|
Exit RETURN
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; P_MaskRect (RectPtr:l)
|
|
;
|
|
|
|
P_MaskRect PROC EXPORT
|
|
|
|
INPUT RectPtr:l
|
|
|
|
BEGIN
|
|
|
|
ldy #2
|
|
lda [RectPtr],y
|
|
and #$FFFE
|
|
sta [RectPtr],y
|
|
|
|
ldy #6
|
|
lda [RectPtr],y
|
|
and #$FFFE
|
|
sta [RectPtr],y
|
|
|
|
RETURN
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
|
|
;---------------------------------------------------------------------------------
|
|
;
|
|
; P_FixSpecRect (ObjPtr:l)
|
|
;
|
|
|
|
P_FixSpecRect PROC EXPORT
|
|
;Using P_ObjData
|
|
|
|
INPUT ObjPtr:l
|
|
LOCAL Q_Rect:r,TRect:r,Tmp:w
|
|
|
|
BEGIN
|
|
|
|
addlong ObjPtr,#P_ObjRect,s
|
|
jsl P_MaskRect
|
|
|
|
|
|
moveword [ObjPtr]:#P_Type,a
|
|
cmp #P_ALPHA
|
|
jne NotAlpha
|
|
|
|
moverect [ObjPtr]:#P_ObjRect,Q_Rect
|
|
addword Q_Rect+2,#22,Tmp
|
|
scmpw Tmp,Q_Rect+6
|
|
blt HOkay
|
|
moveword Tmp,Q_Rect+6
|
|
moveword a,[ObjPtr]:#P_ObjRect+6
|
|
HOkay
|
|
|
|
addword Q_Rect,#4,Tmp
|
|
scmpw Tmp,Q_Rect+4
|
|
blt VOKay
|
|
moveword Tmp,Q_Rect+4
|
|
moveword a,[ObjPtr]:#P_ObjRect+4
|
|
VOkay
|
|
|
|
addword Q_Rect,#1,TRect
|
|
subword Q_Rect+4,#1,TRect+4
|
|
addword Q_Rect+2,#4,TRect+2
|
|
subword Q_Rect+6,#4,TRect+6
|
|
|
|
moverect TRect,[ObjPtr]:#P_TRect
|
|
NotAlpha
|
|
|
|
|
|
cmpw [ObjPtr]:#P_Type,#P_PICTURE
|
|
bne Exit
|
|
|
|
addlong ObjPtr,#P_PictRect,s
|
|
jsl P_MaskRect
|
|
|
|
Exit RETURN
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
;-----------------------------------------------------------------------------
|
|
;
|
|
; P_ValidRect (RectPtr:l) : Flipped:w
|
|
;
|
|
|
|
P_ValidRect PROC EXPORT
|
|
;Using P_ObjData
|
|
|
|
INPUT RectPtr:l
|
|
OUTPUT Flipped:w
|
|
|
|
BEGIN
|
|
|
|
stz Flipped
|
|
|
|
lda [RectPtr]
|
|
tax
|
|
cmpw a,[RectPtr]:#4
|
|
bmi VOkay
|
|
ldy #4
|
|
moveword [RectPtr]:y,[RectPtr]
|
|
txa
|
|
moveword a,[RectPtr]:y
|
|
inc Flipped
|
|
VOkay
|
|
|
|
moveword [RectPtr]:#2,a
|
|
tax
|
|
cmpw a,[RectPtr]:#6
|
|
bmi HOkay
|
|
moveword [RectPtr]:#6,[RectPtr]:#2
|
|
txa
|
|
moveword a,[RectPtr]:#6
|
|
lda Flipped
|
|
eor #1
|
|
sta Flipped
|
|
HOkay
|
|
|
|
Exit RETURN
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; P_GetPictSize (PictHdl:l) : Pt:l
|
|
;
|
|
; Sets RectPtr to the bounding Q_Rect for the given picture.
|
|
|
|
P_GetPictSize PROC EXPORT
|
|
|
|
INPUT PictHdl:l
|
|
OUTPUT Pt:l
|
|
|
|
LOCAL Ptr:l
|
|
|
|
BEGIN
|
|
|
|
movelong [PictHdl],Ptr
|
|
subword [Ptr]:#6,[Ptr]:#2,Pt
|
|
subword [Ptr]:#8,[Ptr]:#4,Pt+2
|
|
|
|
; moveword [Ptr],a
|
|
; and #$80
|
|
; bne Not320
|
|
; asl Pt+2
|
|
Not320
|
|
|
|
RETURN
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; P_PtInLine (Pt:l,ObjPtr:l,RectPtr:l) : Result:w
|
|
;
|
|
; Makes a rgn of the Q_Line and does a _PtInRgn
|
|
|
|
P_PtInLine PROC EXPORT
|
|
;Using P_ObjData
|
|
|
|
INPUT Pt:l,ObjPtr:l,RectPtr:l
|
|
OUTPUT Result:w
|
|
|
|
LOCAL Start:l,End:l,width:w,height:w,lh:w,lv:w
|
|
LOCAL RgnHdl:l,Flipped:w,Q_Rect:r
|
|
|
|
|
|
BEGIN
|
|
|
|
; Make a quick check to the adjusted Q_Line coordinates to see if in
|
|
; bounding rectangle
|
|
|
|
stz Result
|
|
moverect [RectPtr],Q_Rect
|
|
call P_LineAdjust,in=(ObjPtr:l,!Q_Rect:l)
|
|
call P_ValidRect,in=(!Q_Rect:l),out=(a:w)
|
|
tool _PtInRect,in=(!Pt:l,!Q_Rect:l),out=(Result:w)
|
|
jeq Exit
|
|
|
|
|
|
moveword [ObjPtr]:#P_PenSize,lv
|
|
asl a
|
|
sta lh
|
|
|
|
call P_ValidRect,in=(RectPtr:l),out=(Flipped:w)
|
|
movelong [RectPtr],End
|
|
movelong [RectPtr]:#4,Start
|
|
|
|
|
|
; now ul is in end, dr in start
|
|
|
|
subword start,end,height
|
|
subword start+2,end+2,width
|
|
|
|
tool _NewRgn,out=(RgnHdl:l)
|
|
tool _OpenRgn
|
|
|
|
lda Flipped
|
|
bne Type2
|
|
|
|
|
|
; Q_Line is ul-dr
|
|
|
|
type1 tool _MoveTo,in=(end:l)
|
|
tool _Line,in=(#0:w,lv:w)
|
|
tool _Line,in=height:l
|
|
tool _Line,in=(lh:w,#0:w)
|
|
pea 0
|
|
lda lv
|
|
eor #-1
|
|
inc a
|
|
pha
|
|
_Line
|
|
lda width
|
|
eor #-1
|
|
inc a
|
|
pha
|
|
lda height
|
|
eor #-1
|
|
inc a
|
|
pha
|
|
_Line
|
|
tool _LineTo,in=(end:l)
|
|
bra done
|
|
|
|
|
|
; Q_Line is dl-ur
|
|
|
|
type2 tool _MoveTo,in=(end+2:w,start:w)
|
|
tool _Line,in=(#0:w,lv:w)
|
|
tool _Line,in=(lh:w,#0:w)
|
|
pushw width
|
|
lda height
|
|
eor #-1
|
|
inc a
|
|
pha
|
|
_Line
|
|
pea 0
|
|
lda lv
|
|
eor #-1
|
|
inc a
|
|
pha
|
|
_Line
|
|
lda lh
|
|
eor #-1
|
|
inc a
|
|
pha
|
|
pea 0
|
|
_Line
|
|
tool _LineTo,in=(end+2:w,start:w)
|
|
|
|
done tool _CloseRgn,in=(RgnHdl:l)
|
|
tool _PtInRgn,in=(!Pt:l,RgnHdl:l),out=(Result:w)
|
|
tool _DisposeRgn,in=(RgnHdl:l)
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
; P_PtInOval (Q_Point:l,RectPtr:l) : boolean;
|
|
;
|
|
; Notes: To avoid floating Q_Point math or 64-bit numbers, the
|
|
; equation used is x^2 a^2 / b^2 + y^2 <= a^2. (The left
|
|
; addend is actually computed as x*x/b*a/b*a)
|
|
;
|
|
|
|
P_PtInOval PROC EXPORT
|
|
|
|
INPUT Q_Point:l,rectptr:l
|
|
OUTPUT init:w
|
|
LOCAL arad:w,brad:w,a2:l,midx:w,midy:w,temp:l
|
|
|
|
BEGIN
|
|
|
|
tool _PtInRect,in=(!Q_Point:l,RectPtr:l),out=(a:w)
|
|
jeq notinoval
|
|
|
|
subword [rectptr]:#4,[rectptr],arad ; get horiz. radius
|
|
lsr arad
|
|
addword arad,[rectptr],midy ; get horizontal Q_center
|
|
|
|
subword [rectptr]:#6,[rectptr]:#2,brad ; get vert. distance
|
|
lsr brad
|
|
addword brad,[rectptr]:#2,midx ; get vertical Q_center
|
|
|
|
tool _Multiply,in=(arad:w,arad:w),out=(a2:l) ; compute a^2
|
|
|
|
spacelong ; rmdr - used for result x*x/b*a/b*a
|
|
spacelong ; quotient x*x/b*a/b
|
|
spacelong ; rmdr - used for result x*x/b*a
|
|
spacelong ; quotient x*x/b
|
|
spacelong ; result x*x
|
|
|
|
subword Q_Point+2,midx,a
|
|
bpl xok ; Mutiply doesn't handle neg #s right
|
|
|
|
eor #$ffff
|
|
inc a
|
|
|
|
xok pha
|
|
pha
|
|
_Multiply ; x*x
|
|
|
|
pea 0
|
|
pushword brad
|
|
_LongDivide ; x*x/b
|
|
pla ; significant word of quotient
|
|
sta 1,s ; high word was 0 (assuming x <= b)
|
|
pushword arad
|
|
_Multiply ; x*x*a/b
|
|
|
|
pea 0
|
|
pushword brad
|
|
_LongDivide ; x*x*a/(b*b)
|
|
pla
|
|
sta 1,s
|
|
pushword arad
|
|
_Multiply ; x*x*a*a/(b*b)
|
|
pulllong temp
|
|
|
|
spacelong ; for Multiply...
|
|
lda Q_Point
|
|
sec
|
|
sbc midy
|
|
|
|
bpl yok
|
|
|
|
eor #$ffff
|
|
inc a
|
|
|
|
yok pha
|
|
pha
|
|
_Multiply
|
|
|
|
addlong s,temp,temp
|
|
|
|
cmpl a2,temp
|
|
bge inoval
|
|
|
|
notinoval stz init
|
|
bra done
|
|
|
|
inoval moveword #1,init
|
|
|
|
done RETURN
|
|
ENDP
|
|
END
|
|
|