mirror of
https://github.com/antoinevignau/source.git
synced 2025-01-08 13:29:45 +00:00
1 line
9.3 KiB
ArmAsm
Executable File
1 line
9.3 KiB
ArmAsm
Executable File
|
||
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
|
||
|