antoine-source/appleworksgs/PL/Src/CLICK.S

1 line
9.3 KiB
ArmAsm
Executable File
Raw Blame History

load 'macros.dump'
include 'driver.equ'
include 'pl.equ'
;-----------------------------------------------
;
; Imported addresses
;
;-----------------------------------------------
IMPORT D_IsAlphaNum
IMPORT D_IsDigit
IMPORT D_IsLetter
IMPORT P_KillUndo
IMPORT P_Local2PL
IMPORT P_TrackCursor
IMPORT T_ClickCount
IMPORT T_Dot
IMPORT T_DotLine
IMPORT T_DotObj
IMPORT T_DotOffset
IMPORT T_DotParag
IMPORT T_DotPixs
IMPORT T_DrawRuler
IMPORT T_EraseCaret
IMPORT T_GetLinePtr
IMPORT T_GetTextPtr
IMPORT T_InvSelect
IMPORT T_InvertArea
IMPORT T_JunkLeft
IMPORT T_JunkRight
IMPORT T_LastOffset
IMPORT T_LastParag
IMPORT T_Mark
IMPORT T_MarkLine
IMPORT T_MarkObj
IMPORT T_MarkOffset
IMPORT T_MarkParag
IMPORT T_MarkPixs
IMPORT T_NextChar
IMPORT T_Offset2Pix
IMPORT T_Pt2Offset
IMPORT T_TextSelect
;-----------------------------------------------
;
; Forward addresses and entries
;
;-----------------------------------------------
ENTRY T_InWord
ENTRY T_SelectLine
ENTRY T_SelectWord
ENTRY T_WordBounds
;--------------------------------------------------------------------------
;
; T_SwapDotMark ()
;
T_SwapDotMark PROC EXPORT
;Using T_Data
lda T_DotParag
ldx T_MarkParag
sta T_MarkParag
stx T_DotParag
lda T_DotOffset
ldx T_MarkOffset
sta T_MarkOffset
stx T_DotOffset
lda T_DotLine
ldx T_MarkLine
sta T_MarkLine
stx T_DotLine
lda T_DotPixs
ldx T_MarkPixs
sta T_MarkPixs
stx T_DotPixs
pushlong T_DotObj
movelong T_MarkObj,T_DotObj
pulllong T_MarkObj
rtl
ENDP
;------------------------------------------------------------------------------;
;
; T_Click (ObjHdl:l; Pt:l; ModFlags:w; Click:w)
;
; ThePoint should be in local coordinates.
T_Click PROC EXPORT
;Using P_Data
;Using P_ObjData
;Using T_Data
;Using T_TextEqu
INPUT ObjHdl:l,Pt:l,ModFlags:w,Click:w
LOCAL ObjPtr:l
LOCAL NewParag:w,NewLine:w,NewOffset:w,NewPixs:w,NewObj:l
LOCAL EndPixs:w,EndPos:w,StartPixs:w,StartPos:w
BEGIN
jsl P_KillUndo
jsl T_EraseCaret
in ObjHdl:l,Pt:l
out NewParag:w,NewOffset:w,NewLine:w,NewPixs:w
xcall T_Pt2Offset
movelong ObjHdl,NewObj
lda Click
cmp #1
jeq SingleClick
cmpw NewParag,T_LastParag
bne SingleClick
cmpw NewOffset,T_LastOffset
bne SingleClick
lda T_ClickCount
beq SingleClick
cmp #1
beq DoubleClick
TripleClick
inc T_ClickCount
inc T_TextSelect
jsl T_InvSelect
spacelong
spacelong
pushword NewParag
pushword NewLine
jsl T_SelectLine
bra InitSelect
DoubleClick
inc T_ClickCount
inc T_TextSelect
jsl T_InvSelect
spacelong
spacelong
pushword NewParag
pushword NewOffset
pushword NewLine
jsl T_SelectWord
InitSelect pullword T_MarkPixs
pullword T_MarkOffset
pullword T_DotPixs
pullword T_DotOffset
moveword NewParag,T_DotParag
moveword a,T_MarkParag
moveword NewLine,T_DotLine
moveword a,T_MarkLine
inc T_TextSelect
jsl T_InvSelect
brl DragLoop
SingleClick
moveword #1,T_ClickCount
lda ModFlags
and #ShiftKey
beq ShiftUp
lda T_TextSelect
beq _NoSelect
cmpw NewParag,T_DotParag
blt Swap
cmpw NewOffset,T_DotOffset
bge ToAdd
Swap jsl T_SwapDotMark
ToAdd
brl AddSelect
_NoSelect
movelong T_Dot,T_Mark
movelong T_Dot+4,T_Mark+4
movelong T_Dot+8,T_Mark+8
brl AddSelect
ShiftUp
jsl T_InvSelect
moveword NewParag,T_DotParag
sta T_MarkParag
moveword NewOffset,T_DotOffset
sta T_MarkOffset
moveword NewLine,T_DotLine
sta T_MarkLine
moveword NewPixs,T_DotPixs
sta T_MarkPixs
movelong NewObj,T_DotObj
movelong NewObj,T_MarkObj
DragLoop
tool _StillDown,in=(#0:w),out=(a:w)
jeq Up
tool _GetMouse,in=(!Pt:l)
call P_TrackCursor,in=(!Pt:l)
rcall P_Local2PL,in=(Pt:ax),out=(Pt:ax)
in ObjHdl:l,Pt:l
out NewParag:w,NewOffset:w,NewLine:w,NewPixs:w
xcall T_Pt2Offset
lda T_ClickCount
cmp #1
beq AddSelect
cmp #2
beq ByWord
ByLine
spacelong
spacelong
pushword NewParag
pushword NewLine
jsl T_SelectLine
bra SetNew
ByWord
spacelong
spacelong
pushword NewParag
pushword NewOffset
pushword NewLine
jsl T_SelectWord
SetNew pullword EndPixs
pullword EndPos
pullword StartPixs
pullword StartPos
cmpw StartPos,T_Dot
blt GoingUp
moveword EndPos,NewOffset
moveword EndPixs,NewPixs
bra AddSelect
GoingUp moveword StartPos,NewOffset
moveword StartPixs,NewPixs
AddSelect
in T_MarkObj:l,T_MarkParag:w,T_MarkLine:w,T_MarkPixs:w
in NewObj:l,NewParag:w,NewLine:w,NewPixs:w
xcall T_InvertArea
movelong NewObj,T_MarkObj
moveword NewParag,T_MarkParag
moveword NewOffset,T_MarkOffset
moveword NewLine,T_MarkLine
moveword NewPixs,T_MarkPixs
brl DragLoop
Up
moveword NewOffset,T_LastOffset
moveword NewParag,T_LastParag
stz T_TextSelect
cmpw T_DotParag,T_MarkParag
beq SameParag
blt InOrder
bra DoSwap
SameParag
rcall T_JunkRight,in=(T_DotParag:a,T_DotOffset:x)
sta T_DotOffset
cmpw T_DotOffset,T_MarkOffset
beq NoSelect2
blt InOrder
DoSwap jsl T_SwapDotMark
InOrder inc T_TextSelect
rcall T_JunkLeft,in=(T_MarkParag:a,T_MarkOffset:x)
sta T_MarkOffset
; Cmpw T_DotOffSet,#T_ParHeader
; bne DoJunkLeft
rcall T_JunkRight,in=(T_DotParag:a,T_DotOffset:x)
sta T_DotOffset
bra DoRuler
NoSelect2
DoJunkLeft
rcall T_JunkLeft,in=(T_DotParag:a,T_DotOffset:x)
sta T_DotOffset
DoRuler
call T_DrawRuler
Exit RETURN
ENDP
;------------------------------------------------------------------------------
;
; T_SelectWord (Parag:w,Pos:w,Q_Line:w): StartPos:w,StartPixs:w,EndPos:w,EndPixs:w
;
T_SelectWord PROC EXPORT
;Using T_Data
INPUT Parag:w,Pos:w,Q_Line:w
OUTPUT StartPos:w,StartPixs:w,EndPos:w,EndPixs:w
BEGIN
in Parag:w,Pos:w,Q_Line:w
out StartPos:w,EndPos:w
xcall T_WordBounds
in T_DotObj:l,Parag:w,StartPos:w,Q_Line:w
out StartPixs:w
xcall T_Offset2Pix
in T_DotObj:l,Parag:w,EndPos:w,Q_Line:w
out EndPixs:w
xcall T_Offset2Pix
Exit RETURN
ENDP
;-----------------------------------------------------------------------------
;
;
; T_WordBounds (ParagNo:w,Offset:w,LineNo:w) : StartOffset:w,EndOffset:w
;
; 'Word' is explicitly defined in Apple's Human Interface
; Guidelines, with the exception that words are
; necessarily confined to a single Q_Line.
;
T_WordBounds PROC EXPORT
;Using T_Data
;Using T_TextEqu
INPUT ParagNo:w,Offset:w,LineNo:w
OUTPUT StartOffset:w,EndOffset:w
LOCAL LinePtr:l,TextPtr:l,CurOffset:w,Started:w
LOCAL GotLetter:w,GotDigit:w
BEGIN
rcall T_GetLinePtr,in=(ParagNo:a,LineNo:x),out=(LinePtr:ax)
moveword [LinePtr],StartOffset
addword a,[LinePtr]:#T_Length,EndOffset
rcall T_GetTextPtr,in=(ParagNo:a),out=(TextPtr:ax)
moveword StartOffset,CurOffset
stz Started
ldy StartOffset
lda [TextPtr],y
and #$ff
cmp #CR
jeq GotWord
; Loop through the characters in the current Q_Line
CLoop jsl T_InWord
bcs NotNormal
stz GotLetter
stz GotDigit
jsl D_IsLetter
bcs NotLetter
inc GotLetter
bra NotDigit
NotLetter jsl D_IsDigit
bcs NotDigit
inc GotDigit
NotDigit lda Started ; am I in the middle of a word?
jne GetNext
inc Started ; if not, I am now!
bra GotStart
notnormal cmp #''''
beq @1
cmp #'<EFBFBD>'
bne notapostrophe
@1
lda GotDigit
ora GotLetter
beq Alone
rcall T_NextChar,in=(ParagNo:a,CurOffset:x),out=(a:y)
lda [TextPtr],y
and #$ff
jsl D_IsDigit
bcc GetNext
jsl D_IsLetter
bcc GetNext
bra Alone
NotApostrophe cmp #'.'
bne NotPeriod
rcall T_NextChar,in=(ParagNo:a,CurOffset:x),out=(a:y)
lda [TextPtr],y
and #$ff
jsl D_IsDigit
bcs Alone
lda Started
bne GetNext
inc Started
bra GotStart
NotPeriod cmp #','
bne NotComma
lda GotDigit
beq Alone
rcall T_NextChar,in=(ParagNo:a,CurOffset:x),out=(a:y)
lda [TextPtr],y
and #$ff
jsl D_IsDigit
bcc GetNext
NotComma
cmp #$CA ; non-breaking space.
bne alone
lda Started
bne GetNext
inc Started
bra GotStart
Alone stz Started
GotStart ldy CurOffset
cpy Offset
bge GotWord
sty StartOffset
GetNext ldy CurOffset
cpy EndOffset ; have I reached the end of the Q_Line?
bgt GotWord ; if so, stop no matter what.
rcall T_NextChar,in=(ParagNo:a,CurOffset:x),out=(CurOffset:a)
tay
lda [TextPtr],y
and #$ff
cmp #CR ; repeat unless at the end of the
jne CLoop ; current paragraph.
GotWord
moveword CurOffset,EndOffset
RETURN
ENDP
;------------------------------------------------------------------------------
;
; Can the char in A be part of a word (no matter what)? ;
;
T_InWord PROC EXPORT
jsl D_IsAlphaNum
bcc yes_w
cmp #'-'
beq yes_w
cmp #'$'
beq yes_w
cmp #'%'
beq yes_w
cmp #'<EFBFBD>'
beq yes_w
cmp #'<EFBFBD>'
beq yes_w
cmp #'<EFBFBD>'
beq yes_w
cmp #'<EFBFBD>'
beq yes_w
sec
rtl
yes_w
clc
rtl
ENDP
;------------------------------------------------------------------------------
;
; T_SelectLine (ParagNo:w,LineNo:w) : StartPos:w,StartPixs:w,EndPos:w,EndPixs:w
;
T_SelectLine PROC EXPORT
;Using T_TextEqu
;Using T_Data
INPUT ParagNo:w,LineNo:w
OUTPUT StartPos:w,StartPixs:w,EndPos:w,EndPixs:w
LOCAL LinePtr:l
BEGIN
rcall T_GetLinePtr,in=(ParagNo:a,LineNo:x),out=(LinePtr:ax)
moveword [LinePtr],StartPos
addword a,[LinePtr]:#T_Length,EndPos
in T_DotObj:l,ParagNo:w,EndPos:w,LineNo:w
out EndPixs:w
xcall T_Offset2Pix
stz StartPixs
RETURN
ENDP
END