mirror of
https://github.com/antoinevignau/source.git
synced 2024-06-01 00:41:39 +00:00
1 line
11 KiB
ArmAsm
Executable File
1 line
11 KiB
ArmAsm
Executable File
|
|
load 'macros.dump'
|
|
include 'driver.equ'
|
|
include 'pl.equ'
|
|
|
|
;-----------------------------------------------
|
|
;
|
|
; Imported addresses
|
|
;
|
|
;-----------------------------------------------
|
|
|
|
IMPORT X_CopyOneHandle
|
|
IMPORT D_Deref
|
|
IMPORT Local2TextObj
|
|
IMPORT P_ContentRect
|
|
IMPORT P_DrawATab
|
|
IMPORT P_HRulRect
|
|
IMPORT P_PL2Local
|
|
IMPORT P_PortRect
|
|
IMPORT P_Traverse
|
|
IMPORT P_VRulRect
|
|
IMPORT P_VisRuler
|
|
IMPORT D_Set4Pat
|
|
IMPORT T_ChangeRuls
|
|
IMPORT T_DotObj
|
|
IMPORT T_DotParag
|
|
IMPORT T_Editing
|
|
IMPORT T_GetParPtr
|
|
IMPORT TextObj2Local
|
|
IMPORT D_UnLock
|
|
|
|
;-----------------------------------------------
|
|
;
|
|
; Forward addresses and entries
|
|
;
|
|
;-----------------------------------------------
|
|
|
|
ENTRY P_DragTab
|
|
ENTRY P_DrawTabwell
|
|
|
|
|
|
|
|
|
|
;---------------------------------------------------------------------------
|
|
;
|
|
; P_EraseTabs
|
|
;
|
|
; erase all of the tabs
|
|
|
|
P_EraseTabs PROC EXPORT
|
|
;Using P_Data
|
|
;Using P_RulerData
|
|
|
|
local tmprect:r
|
|
begin
|
|
|
|
lda P_VisRuler
|
|
beq Exit
|
|
|
|
call D_Set4Pat,in=(#LightYellow:w)
|
|
|
|
moveword #P_TabWBottom-6,tmprect
|
|
moveword #P_TabWBottom-1,tmprect+4
|
|
moveword P_ContentRect+2,tmprect+2
|
|
moveword P_ContentRect+6,tmprect+6
|
|
|
|
tool _ClipRect,in=(!tmprect:l)
|
|
tool _PaintRect,in=(!tmprect:l)
|
|
|
|
_PenNormal
|
|
tool _ClipRect,in=(#P_ContentRect:l)
|
|
|
|
Exit RETURN
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
;---------------------------------------------------------------------------
|
|
;
|
|
; P_EraseTabwell
|
|
;
|
|
|
|
P_EraseTabwell PROC EXPORT
|
|
;Using P_Data
|
|
;Using P_RulerData
|
|
|
|
local tmprect:r
|
|
begin
|
|
|
|
lda P_VisRuler
|
|
beq Exit
|
|
|
|
call D_Set4Pat,in=(#LightYellow:w)
|
|
|
|
moveword #P_TabWTop,tmprect
|
|
moveword P_VRulRect+2,tmprect+2
|
|
moveword #P_TabWBottom-1,tmprect+4
|
|
subword P_VRulRect+6,#2,tmprect+6
|
|
|
|
tool _ClipRect,in=(!tmprect:l)
|
|
tool _PaintRect,in=(!tmprect:l)
|
|
|
|
_PenNormal
|
|
tool _ClipRect,in=(#P_ContentRect:l)
|
|
|
|
Exit RETURN
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
;---------------------------------------------------------------------------
|
|
;
|
|
; P_HideTabs (erase the Tabwell and any active tabs)
|
|
;
|
|
|
|
P_HideTabs PROC EXPORT
|
|
|
|
call P_EraseTabwell
|
|
call P_EraseTabs
|
|
rtl
|
|
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
|
|
;---------------------------------------------------------------------------
|
|
;
|
|
; P_DrawTabs
|
|
;
|
|
|
|
P_DrawTabs PROC EXPORT
|
|
;Using P_RulerData
|
|
;Using P_Data
|
|
;Using T_Data
|
|
;Using T_TextEqu
|
|
|
|
local count:w,ptr:l,offset:w,tmp:l,objhdl:l,hoffset:w
|
|
local rulerhdl:l
|
|
begin
|
|
|
|
lda P_VisRuler
|
|
jeq exit
|
|
lda T_Editing
|
|
jeq exit
|
|
|
|
rcall T_GetParPtr,in=(T_DotParag:a),out=(ptr:ax)
|
|
movelong [ptr]:#T_RulerHdl,RulerHdl
|
|
|
|
rcall D_Deref,in=(RulerHdl:ax),out=(ptr:ax)
|
|
|
|
cmpw [ptr]:#T_TabCount,#P_MaxTabcount
|
|
bge DidTabwell
|
|
|
|
call P_DrawTabwell
|
|
|
|
DidTabwell tool _ClipRect,in=(#P_HRulRect:l)
|
|
|
|
moveword [ptr]:#T_TabCount,count
|
|
|
|
addwl #T_Indent,ptr
|
|
|
|
stz offset
|
|
tabloop pushlong #-1
|
|
call TextObj2Local,in=([ptr]:offset:w,#0:w),out=(:w,y:w)
|
|
pushword #P_HRulTop+P_HRulWdth-6
|
|
inc offset
|
|
inc offset
|
|
pushword [ptr]:offset
|
|
call P_DrawATab,in=(:l,:l,:w)
|
|
|
|
addword offset,#2,offset
|
|
dec count
|
|
bpl tabloop
|
|
|
|
tool _ClipRect,in=(#P_ContentRect:l)
|
|
|
|
rcall D_UnLock,in=(RulerHdl:ax)
|
|
|
|
exit return
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
|
|
;---------------------------------------------------------------------------
|
|
;
|
|
; P_DrawTabwell ()
|
|
;
|
|
|
|
P_DrawTabwell PROC EXPORT
|
|
;Using P_RulerData
|
|
;Using P_Data
|
|
;Using T_Data
|
|
;Using T_TextEqu
|
|
|
|
begin
|
|
|
|
tool _ClipRect,in=(#P_PortRect:l)
|
|
|
|
; Draw the 3 in the Tabwell.
|
|
|
|
addword P_VRulRect+2,#8,a
|
|
and #$FFFE
|
|
call P_DrawATab,in=(#-1:l,a:w,#P_TabWTop+5:w,#P_LeftTab:w)
|
|
|
|
addword P_VRulRect+2,#18,a
|
|
and #$FFFE
|
|
call P_DrawATab,in=(#-1:l,a:w,#P_TabWTop+5:w,#P_DecimalTab:w)
|
|
|
|
addword P_VRulRect+2,#28,a
|
|
and #$FFFE
|
|
call P_DrawATab,in=(#-1:l,a:w,#P_TabWTop+5:w,#P_RightTab:w)
|
|
|
|
tool _ClipRect,in=(#P_ContentRect:l)
|
|
|
|
RETURN
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
;---------------------------------------------------------------------------
|
|
;
|
|
; P_MoveTabs (Pt:l) : Moved:w
|
|
;
|
|
; pt is local
|
|
|
|
P_MoveTabs PROC EXPORT
|
|
;Using T_Data
|
|
;Using P_Data
|
|
;Using T_TextEqu
|
|
;Using P_ObjData
|
|
;Using P_RulerData
|
|
|
|
input ThePt:l
|
|
output moved:w
|
|
|
|
local ParagPtr:l,RulerHdl:l,RulerPtr:l
|
|
local TabsHdl:l,TabsPtr:l,TabArray:l,TabType:w
|
|
local tmprect:r,tabcount:w,tmp:l,ptr:l
|
|
local tmptab:l,tmpptr:l,arrayhdl:l,hoffset:w
|
|
local leftside:w,rightside:w,offset:w
|
|
error err
|
|
|
|
begin
|
|
|
|
moverect P_ContentRect,tmprect
|
|
moveword P_PortRect,tmprect
|
|
moveword P_VRulRect+2,tmprect+2
|
|
|
|
tool _ClipRect,in=(!tmprect:l)
|
|
|
|
|
|
stz moved
|
|
|
|
rcall T_GetParPtr,in=(T_DotParag:a),out=(ParagPtr:ax)
|
|
movelong [ParagPtr]:#T_RulerHdl,RulerHdl
|
|
call X_CopyOneHandle,in=(RulerHdl:l),out=(TabsHdl:l)
|
|
rcall D_Deref,in=(TabsHdl:ax),out=(TabsPtr:ax)
|
|
moveword [TabsPtr]:#T_TabCount,tabcount
|
|
addlong #T_Indent,TabsPtr,TabArray
|
|
|
|
|
|
call TextObj2Local,in=(#0:w,#0:w),out=(leftside:w,y:w)
|
|
bpl DoRightSide
|
|
|
|
moveword #0,leftside
|
|
|
|
DoRightSide
|
|
|
|
movelong T_DotObj,tmp
|
|
movelong [tmp],ptr
|
|
|
|
rcall P_PL2Local,in=([ptr]:#P_RLeft:x)
|
|
call Local2TextObj,in=(x:w,#0:w),out=(hoffset:w,a:w)
|
|
|
|
rcall P_PL2Local,in=([ptr]:#P_RRight:x),out=(a:x)
|
|
and #$FFFE
|
|
sta rightside
|
|
|
|
movelong !tabarray,arrayhdl
|
|
|
|
|
|
|
|
; Check for D_MouseDown in tab-Q_Rect
|
|
|
|
moverect P_HRulRect,tmprect
|
|
moveword #10,tmprect
|
|
tool _PtInRect,in=(!ThePt:l,!tmprect:l),out=(a:w)
|
|
jeq CkTabwell
|
|
|
|
; See if mouse was down on a tab
|
|
|
|
call Local2TextObj,in=(ThePt:l),out=(ThePt:l)
|
|
|
|
subword ThePt+2,#4,tmp
|
|
|
|
lda tabcount
|
|
ina
|
|
sta tmp+2
|
|
in arrayhdl:l,tmp:w,#4:w,tmp+2:w
|
|
out offset:w
|
|
xcall P_Traverse
|
|
|
|
lsr a
|
|
lsr a
|
|
cmp tmp+2
|
|
jge Exit
|
|
|
|
movelong [tabarray]:offset,tmptab
|
|
|
|
addword #5,ThePt+2,a
|
|
and #$FFFE
|
|
cmp tmptab
|
|
jlt Exit
|
|
|
|
; Foundit!!
|
|
lda offset
|
|
bne DoNormTab
|
|
|
|
lda tabcount
|
|
beq CheckMax
|
|
|
|
; use the first tab as the rightmost bounds.
|
|
call TextObj2Local,in=([tabarray]:#4:w,#0:w),out=(a:w,y:w)
|
|
subword a,#P_MinTabDist,rightside
|
|
|
|
CheckMax cmpw P_ContentRect+6,rightside
|
|
bge CheckMin
|
|
sta rightside
|
|
|
|
CheckMin cmpw P_ContentRect+2,leftside
|
|
blt DoOldDrag
|
|
sta leftside
|
|
bra DoOldDrag
|
|
|
|
DoNormTab addlong a,tabarray,ptr
|
|
addlong ptr,#4,s
|
|
pushlong ptr
|
|
lda Tabcount
|
|
asl a
|
|
asl a
|
|
pushword #0
|
|
subword a,offset,s
|
|
_BlockMove
|
|
dec TabCount
|
|
|
|
addword P_VRulRect+2,#2,leftside
|
|
subword P_ContentRect+6,#2,rightside
|
|
|
|
DoOldDrag call TextObj2Local,in=(tmptab:w,#0:w),out=(ThePt:l)
|
|
moveword #P_TabWBottom-6,ThePt
|
|
; Erase the old one...
|
|
call P_DrawATab,in=(ThePt:l,#-1:l,#0:w)
|
|
|
|
moveword tabcount,tmp
|
|
|
|
lda offset
|
|
not a
|
|
|
|
in a:w,leftside:w,rightside:w,ThePt:l
|
|
in tabarray:l,tabcount:w,tmptab+2:w
|
|
out tabcount:w
|
|
xcall P_DragTab
|
|
|
|
|
|
lda tabcount
|
|
cmp #P_MaxTabCount-1
|
|
bne NoDraw
|
|
cmp tmp
|
|
bne NoDraw
|
|
call P_DrawTabwell ; We've removed the 10th tab
|
|
NoDraw brl DoStore
|
|
|
|
|
|
|
|
CkTabwell cmpw tabcount,#P_MaxTabCount
|
|
jge Exit
|
|
|
|
addword P_VRulRect+2,#2,leftside
|
|
subword P_ContentRect+6,#2,rightside
|
|
|
|
moveword P_HRulRect,tmprect
|
|
moveword P_VRulRect+2,tmprect+2
|
|
movelong P_ContentRect,tmprect+4
|
|
|
|
tool _PtInRect,in=(!ThePt:l,!tmprect:l),out=(a:w)
|
|
jeq Exit
|
|
|
|
moveword #2,tmprect
|
|
moveword #11,tmprect+4
|
|
|
|
addword P_VRulRect+2,#3,tmprect+2
|
|
addword P_VRulRect+2,#13,tmprect+6
|
|
tool _PtInRect,in=(!ThePt:l,!tmprect:l),out=(a:w)
|
|
beq CkDec
|
|
|
|
moveword #P_LeftTab,TabType
|
|
bra DoDrag
|
|
|
|
|
|
CkDec moveword tmprect+6,tmprect+2
|
|
addword P_VRulRect+2,#23,tmprect+6
|
|
tool _PtInRect,in=(!ThePt:l,!tmprect:l),out=(a:w)
|
|
beq CkRight
|
|
|
|
moveword #P_DecimalTab,TabType
|
|
bra DoDrag
|
|
|
|
|
|
CkRight moveword tmprect+6,tmprect+2
|
|
addword P_VRulRect+2,#33,tmprect+6
|
|
tool _PtInRect,in=(!ThePt:l,!tmprect:l),out=(a:w)
|
|
beq Exit
|
|
|
|
moveword #P_RightTab,TabType
|
|
|
|
DoDrag
|
|
in #0:w,leftside:w,rightside:w,ThePt:l
|
|
in tabarray:l,tabcount:w,TabType:w
|
|
out a:w
|
|
xcall P_DragTab
|
|
|
|
cmp tabcount
|
|
beq Exit
|
|
sta tabcount
|
|
|
|
|
|
DoStore moveword tabcount,[TabsPtr]:#T_Tabcount
|
|
inc moved
|
|
|
|
cmpw tabcount,#P_MaxTabcount
|
|
blt StillThere
|
|
call P_EraseTabwell
|
|
StillThere
|
|
|
|
|
|
tool _ClipRect,in=(#P_ContentRect:l)
|
|
|
|
movelong [RulerHdl],RulerPtr
|
|
ldy #T_Indent
|
|
cmpw [RulerPtr]:y,[TabsPtr]:y
|
|
beq ChTabs
|
|
call T_ChangeRuls,in=(#T_ChangeIndent:w,[TabsPtr]:#T_Indent:w,#0:l)
|
|
bra Exit
|
|
|
|
ChTabs
|
|
call T_ChangeRuls,in=(#T_ChangeTabs:w,#0:w,TabsHdl:l)
|
|
|
|
|
|
Exit
|
|
tool _DisposeHandle,in=(TabsHdl:l)
|
|
tool _ClipRect,in=(#P_ContentRect:l)
|
|
|
|
return
|
|
ENDP
|
|
|
|
|
|
|
|
|
|
;---------------------------------------------------------------------------
|
|
;
|
|
; P_DragTab
|
|
;
|
|
|
|
P_DragTab PROC EXPORT
|
|
;Using P_RulerData
|
|
;Using P_Data
|
|
;Using T_Data
|
|
;Using T_TextEqu
|
|
|
|
input izitindent:w,minhorz:w,maxhorz:w,oldpt:l
|
|
input array:l,count:w,type:w
|
|
output newcount:w
|
|
|
|
local ThePt:l,TabPt:l,arrayhdl:l,tmprect:r
|
|
local offset:w,ptr:l,tmp:l
|
|
begin
|
|
|
|
moveword count,newcount
|
|
movelong !array,arrayhdl
|
|
|
|
_HideCursor
|
|
|
|
moveword #-50,oldpt
|
|
|
|
dragloop tool _GetMouse,in=(!ThePt:l)
|
|
lda ThePt+2
|
|
bpl CheckMax
|
|
lda #0
|
|
|
|
CheckMax cmp maxhorz
|
|
blt CheckMin
|
|
moveword maxhorz,ThePt+2
|
|
|
|
CheckMin cmp minhorz
|
|
bge DoConvert
|
|
moveword minhorz,ThePt+2
|
|
|
|
DoConvert jsr FixPt
|
|
call Local2TextObj,in=(ThePt:l),out=(TabPt:l)
|
|
|
|
lda izitindent
|
|
bne DrawIt
|
|
|
|
cmpw #P_TabWBottom-6,ThePt ; Not in the ruler.
|
|
bne DrawIt
|
|
|
|
; Do nearness checking for other tabs, incl indent
|
|
lda TabPt+2 ; Not in the textobj
|
|
bmi DrawIt
|
|
|
|
DoSearch addword count,#1,tmp+2
|
|
subword TabPt+2,#P_MinTabDist,tmp
|
|
|
|
in arrayhdl:l,tmp:w,#4:w,tmp+2:w
|
|
out offset:w
|
|
xcall P_Traverse
|
|
|
|
lsr a
|
|
lsr a
|
|
cmp tmp+2
|
|
bge DrawIt
|
|
|
|
subword [array]:offset,TabPt+2,a
|
|
abs a
|
|
cmp #P_MinTabDist
|
|
bge DrawIt
|
|
movelong oldpt,ThePt ; There's a tab to the right
|
|
bra D_SkipIt
|
|
|
|
DrawIt cmpl ThePt,oldpt
|
|
beq ContLoop
|
|
call P_DrawATab,in=(oldpt:l,ThePt:l,type:w)
|
|
ContLoop movelong ThePt,oldpt
|
|
D_SkipIt tool _StillDown,in=(#0:w),out=(a:w)
|
|
jne dragloop
|
|
|
|
call Local2TextObj,in=(ThePt:l),out=(TabPt:l)
|
|
|
|
; Check to see if it's in a valid location & accept or reject it.
|
|
lda izitindent
|
|
beq CkValid
|
|
|
|
moveword TabPt+2,[array]
|
|
brl Accept
|
|
|
|
CkValid lda TabPt+2 ; if it's to the left of the obj.
|
|
jmi Reject
|
|
|
|
cmpw #P_TabWBottom-6,ThePt ; if it's out of the ruler.
|
|
jne Reject
|
|
|
|
cmpw TabPt+2,[array] ; It's to the left of the indent
|
|
jlt Reject
|
|
|
|
|
|
subword a,#P_MinTabDist,tmp ; In the indent's 'space'
|
|
jmi Reject
|
|
|
|
|
|
; See if it's on top of another tab's space (incl the indent).
|
|
addword count,#1,tmp+2
|
|
|
|
in arrayhdl:l,tmp:w,#4:w,tmp+2:w
|
|
out offset:w
|
|
xcall P_Traverse
|
|
|
|
lsr a
|
|
lsr a
|
|
cmp tmp+2 ; It's the last tab.
|
|
bge DoInsert
|
|
|
|
subword [array]:offset,TabPt+2,a
|
|
abs a
|
|
cmp #P_MinTabDist
|
|
blt Reject ; There's a tab too D_Close
|
|
|
|
; insert it.
|
|
DoInsert inc newcount
|
|
in arrayhdl:l,TabPt+2:w,#4:w,newcount:w
|
|
out a:w
|
|
xcall P_Traverse
|
|
bne DoMove
|
|
lda #4
|
|
DoMove sta offset
|
|
|
|
addlong a,array,ptr
|
|
pushlong ptr
|
|
addlong #4,ptr,s
|
|
pushword #0
|
|
lda newcount
|
|
asl a
|
|
asl a
|
|
subword a,offset,s
|
|
_BlockMove
|
|
|
|
moveword TabPt+2,[ptr]
|
|
moveword type,[ptr]:#2
|
|
|
|
bra accept
|
|
|
|
Reject call P_DrawATab,in=(ThePt:l,#-50:w,#-50:w,type:w)
|
|
bra exit
|
|
|
|
|
|
|
|
Accept call P_DrawATab,in=(ThePt:l,#-1:l,type:w)
|
|
|
|
moverect P_ContentRect,tmprect
|
|
stz tmprect
|
|
tool _ClipRect,in=(!tmprect:l)
|
|
call P_DrawATab,in=(#-1:l,ThePt:l,type:w)
|
|
|
|
exit _ShowCursor
|
|
|
|
return
|
|
|
|
|
|
;------------------------
|
|
; FixPt
|
|
;
|
|
|
|
FixPt lda ThePt+2
|
|
and #$FFFE
|
|
sta ThePt+2
|
|
|
|
lda izitindent
|
|
bne FixDrag
|
|
|
|
lda ThePt
|
|
bpl CkVert
|
|
|
|
stz ThePt
|
|
|
|
CkVert subword ThePt,#3,a
|
|
bmi FixDrag
|
|
cmp P_HRulRect+4
|
|
bge GotIt
|
|
|
|
FixDrag moveword #P_TabWBottom-6,ThePt
|
|
GotIt rts
|
|
|
|
ENDP
|
|
END
|
|
|