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

1 line
29 KiB
ArmAsm
Executable File

load 'macros.dump'
include 'driver.equ'
include 'pl.equ'
;-----------------------------------------------
;
; Imported addresses
;
;-----------------------------------------------
IMPORT D_GrowHandle
IMPORT D_MainZPage
IMPORT D_NeedHand
IMPORT P_ChangePage
IMPORT P_ContentRect
IMPORT P_DefFont
IMPORT P_DefSize
IMPORT P_DefStyle
IMPORT P_H
IMPORT P_Page
IMPORT P_V
IMPORT T_CurColor
IMPORT T_CurFont
IMPORT T_CurIndent
IMPORT T_CurParHdl
IMPORT T_CurRulBits
IMPORT T_CurRulHdl
IMPORT T_CurRulPtr
IMPORT T_CutParag
IMPORT T_Deactivate
IMPORT T_DotLine
IMPORT T_DotObj
IMPORT T_DotOffset
IMPORT T_DotParag
IMPORT T_DotPixs
IMPORT T_DrawRuler
IMPORT T_EraseCaret
IMPORT T_FontFlags
IMPORT T_InsertFont
IMPORT T_LessRoom
IMPORT T_MakeRoom
IMPORT T_MarkLine
IMPORT T_MarkObj
IMPORT T_MarkOffset
IMPORT T_MarkParag
IMPORT T_MarkPixs
IMPORT T_NewAddStyle
IMPORT T_NewColor
IMPORT T_NewFont
IMPORT T_NewRuler
IMPORT T_NewSize
IMPORT T_Offset2Line
IMPORT T_Offset2Pix
IMPORT T_TextSelect
IMPORT T_TrackFont
IMPORT T_UnUseRuler
;-----------------------------------------------
;
; Forward addresses and entries
;
;-----------------------------------------------
ENTRY T_LineHeight
ENTRY T_OffThread
;---------------------------------------------------------------------------
; T_MulLine
;
T_MulLine PROC EXPORT
asl a
asl a
asl a
rtl
ENDP
;---------------------------------------------------------------------------
; T_MulParag
;
T_MulParag PROC EXPORT
asl a
asl a
asl a
pha
asl a
clc
adc 1,s
plx
rtl
ENDP
;-------------------------------------------------------------------------------
;
; T_GetParPtr (ParagNo:a) : ParagPtr:ax
;
; Operates on the current thread. The ParagHdl is not X_Locked down.
T_GetParPtr PROC EXPORT
;Using T_Data
;Using T_TextEqu
;Using D_GlobalData
ParagHdl equ 0
ParagPtr equ 4
phd
pha
lda >D_MainZPage
tcd
movelong T_CurParHdl,ParagHdl
movelong [ParagHdl],ParagPtr
pla
jsl T_MulParag
addwl a,ParagPtr
movelong ParagPtr,ax
pld
rtl
ENDP
;-------------------------------------------------------------------------------
;
; T_GetTextPtr (ParagNo:a) : TextPtr:ax
;
; Operates on the current thread. The TextHdl is not X_Locked down.
T_GetTextPtr PROC EXPORT
;Using T_Data
;Using T_TextEqu
;Using D_GlobalData
ParagHdl equ 0
ParagPtr equ 4
TextHdl equ 8
TextPtr equ 12
phd
pha
lda >D_MainZPage
tcd
movelong T_CurParHdl,ParagHdl
movelong [ParagHdl],ParagPtr
pla
jsl T_MulParag
addwl a,ParagPtr
movelong [ParagPtr]:#T_TextBlock,TextHdl
movelong [TextHdl],TextPtr
moveword [ParagPtr]:#T_ParOffset,a
addwl a,TextPtr
movelong TextPtr,ax
pld
rtl
ENDP
;-------------------------------------------------------------------------------
;
; T_GetRulBits (ParagNo:a) : RulBits:a
;
; Operates on the current thread.
T_GetRulBits PROC EXPORT
;Using T_Data
;Using T_TextEqu
;Using D_GlobalData
ParagPtr equ 20
RulerHdl equ 24
RulerPtr equ 28
phd
pha
lda >D_MainZPage
tcd
pla
rcall T_GetParPtr,in=(a:a),out=(ParagPtr:ax)
movelong [ParagPtr]:#T_RulerHdl,RulerHdl
movelong [RulerHdl],RulerPtr
moveword [RulerPtr]:#T_RulBits,a
pld
rtl
ENDP
;-----------------------------------------------------------------------------
;
; T_GetSpacing (RulBits:a; Ascent:x; Descent:y) : Spacing:a
;
T_GetSpacing PROC EXPORT
;Using T_Data
;Using T_TextEqu
;Using D_GlobalData
RulBits equ 0
Ascent equ 2
Descent equ 4
TextHeight equ 6
phd
pha
lda >D_MainZPage
tcd
stx Ascent
sty Descent
pullword RulBits
and #T_CustSpace
bne Custom
lda RulBits
and #T_Single
bne Single
lda RulBits
and #T_Double
bne Double
Triple
addword Ascent,#2,a
bra Exit
Double
lda Ascent
lsr a
addword a,#2,a
bra Exit
Single
lda #1
bra Exit
Custom
addword Ascent,Descent,TextHeight
lda RulBits
xba
and #T_GetCustSpace
inc a ; 1-64
subword a,TextHeight,a
bpl Exit
NoSpace lda #0
Exit
pld
rtl
ENDP
;------------------------------------------------------------------------------
;
; T_LockRuler (ParagPtr:ax)
;
T_LockRuler PROC EXPORT
;Using D_GlobalData
;Using T_Data
;Using T_TextEqu
ParagPtr equ 0
RulerHdl equ 4
RulerPtr equ 8
phd
pha
lda >D_MainZPage
tcd
pla
movelong ax,ParagPtr
movelong [ParagPtr]:#T_RulerHdl,RulerHdl
tool _HLock,in=(RulerHdl:l)
movelong RulerHdl,T_CurRulHdl
movelong [RulerHdl],RulerPtr
movelong RulerPtr,T_CurRulPtr
moveword [RulerPtr]:#T_RulBits,T_CurRulBits
moveword [RulerPtr]:#T_Indent,T_CurIndent
pld
rtl
ENDP
;-----------------------------------------------------------------------------
;
; T_UnlockRuler ()
;
T_UnlockRuler PROC EXPORT
;Using T_Data
tool _HUnlock,in=(T_CurRulHdl:l)
rtl
ENDP
;------------------------------------------------------------------------------
;
; T_GetParSize (ParagNo:a) : ParSize:a
;
; Returns the size of the paragraph in bytes.
;
; All ParOffsets must be correct for this routine to work.
T_GetParSize PROC EXPORT
;Using T_Data
;Using T_TextEqu
;Using D_GlobalData
ParagNo equ 20
ParagPtr equ 22
TempHdl equ 26
TempPtr equ 30
ParOffset equ 34
LastPar equ 36
TextBlock equ 38
phd
pha
lda >D_MainZPage
tcd
pullword ParagNo
rcall T_GetParPtr,in=(a:a),out=(ParagPtr:ax)
moveword [ParagPtr]:#T_ParOffset,ParOffset
movelong [ParagPtr]:#T_TextBlock,TextBlock
movelong T_CurParHdl,TempHdl
movelong [TempHdl],TempPtr
moveword [TempPtr],a
dec a
sta LastPar
cmpw ParagNo,LastPar
bge X_EndBlock
addwl #T_ParInfoSize,ParagPtr
cmpl TextBlock,[ParagPtr]:#T_TextBlock
bne X_EndBlock
moveword [ParagPtr]:#T_ParOffset,a
bra SubIt
X_EndBlock
movelong [TextBlock],TempPtr
moveword [TempPtr]:#T_TextSize,a
SubIt subword a,ParOffset,a
pld
rtl
ENDP
;------------------------------------------------------------------------------
;
; T_LockLines2 (ParagNo:a) : LinesHdl:ax
;
T_LockLines2 PROC EXPORT
;Using T_TextEqu
INPUT ParagNo:w
OUTPUT LinesHdl:l
LOCAL ParagPtr:l
BEGIN
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
movelong [ParagPtr]:#T_LinesHdl,LinesHdl
cpzl LinesHdl
beq _Cut
cpzl [LinesHdl]
beq Purged
tool _HLock,in=(LinesHdl:l)
bra Exit
Purged
tool _DisposeHandle,in=(LinesHdl:l)
_Cut
in [ParagPtr]:#T_ObjHdl:l,ParagNo:w,[ParagPtr]:#T_ParStart:w
out a:l,a:w
xcall T_CutParag
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
movelong [ParagPtr]:#T_LinesHdl,LinesHdl
Exit RETURN
ENDP
;------------------------------------------------------------------------------
;
; T_LockLines (ParagNo:a) : LinesHdl:ax
;
; Returns with the LinesHdl X_Locked.
T_LockLines PROC EXPORT
call T_LockLines2,in=(a:w),out=(ax:l)
rtl
ENDP
;------------------------------------------------------------------------------
;
; T_GetLinePtr2 (ParagNo:w,LineNo:w) : LinePtr:l
;
T_GetLinePtr2 PROC EXPORT
;Using T_Data
;Using T_TextEqu
INPUT ParagNo:w,LineNo:w
OUTPUT LinePtr:l
LOCAL LinesHdl:l
BEGIN
call T_LockLines2,in=(ParagNo:w),out=(LinesHdl:l)
tool _HUnlock,in=(LinesHdl:l)
movelong [LinesHdl],LinePtr
rcall T_MulLine,in=(LineNo:a),out=(a:a)
addwl a,LinePtr
RETURN
ENDP
;------------------------------------------------------------------------------
;
; T_GetLinePtr (ParagNo:a,LineNo:x) : LinePtr:ax
;
T_GetLinePtr PROC EXPORT
;Using T_Data
;Using T_TextEqu
call T_GetLinePtr2,in=(a:w,x:w),out=(ax:l)
rtl
ENDP
;-----------------------------------------------------------------------------
;
; T_EatJunk (TextPtr:ax; Offset:y) : NewOffset:y
;
; Moves Offset past any font changes, such that [TextPtr]:y is a normal
; character.
T_EatJunk PROC EXPORT
;Using T_TextEqu
;Using D_GlobalData
TextPtr equ 0
phd
pha
lda >D_MainZPage
tcd
pla
movelong ax,TextPtr
Loop lda [TextPtr],y
and #$ff
cmp #T_ColorChange+1
bge Exit
iny
iny
cmp #T_FontChange
bne Loop
iny
bra Loop
Exit pld
rtl
ENDP
;------------------------------------------------------------------------------
;
; T_PrevChar (ParagNo:a,Offset:x) : NewOffset:a
;
; Offset must be an offset within the paragraph.
; The NewOffset returned points to the previous character
; or is 0 if at the beginning of a paragraph.
;
T_PrevChar PROC EXPORT
;Using T_Data
;Using T_TextEqu
;Using D_GlobalData
Offset equ 20
TextPtr equ 22
NewOffset equ 26
phd
pha
lda >D_MainZPage
tcd
stx Offset
pla
rcall T_GetTextPtr,in=(a:a),out=(TextPtr:ax)
stz NewOffset
ldy #T_ParHeader
CharLoop cpy Offset
bge Done
lda [TextPtr],y
and #$ff
cmp #T_ColorChange+1
blt Special
sty NewOffset
iny
bra CharLoop
Special
iny
asl a
tax
jmp (JumpTable,x)
SkipTwo iny
SkipOne iny
bra CharLoop
Done lda NewOffset
Exit pld
rtl
JumpTable
DC.W CharLoop
DC.W SkipTwo
DC.W SkipOne
DC.W SkipOne
DC.W SkipOne
ENDP
;------------------------------------------------------------------------------
;
; T_NextChar (ParagNo:a,Offset:x) : NewOffset:a
;
; Offset must be an offset within the paragraph.
; NewOffset is set to 0 if the next character is not in the paragraph.
T_NextChar PROC EXPORT
;Using T_Data
;Using T_TextEqu
;Using D_GlobalData
ParagNo equ 20
Offset equ 22
TextPtr equ 24
NewOffset equ 28
HitFirst equ 30
phd
pha
lda >D_MainZPage
clc
adc #64
tcd
stx Offset
pla
sta ParagNo
jsl T_GetTextPtr
movelong ax,TextPtr
ldy Offset
jsl T_EatJunk
moveword [TextPtr]:y,a
and #$ff
cmp #CR
beq IsCr
iny
movelong TextPtr,ax
jsl T_EatJunk
tya
Exit pld
rtl
IsCR lda #0
bra Exit
ENDP
;------------------------------------------------------------------------------
;
; T_JunkLeft (ParagNo:a,Offset:x) : NewOffset:a
;
T_JunkLeft PROC EXPORT
;Using T_TextEqu
jsl T_PrevChar
cmp #0
beq AtStart
inc a
rtl
AtStart lda #T_ParHeader
rtl
ENDP
;------------------------------------------------------------------------------
;
; T_JunkRight (ParagNo:a,Offset:x) : NewOffset:a
;
T_JunkRight PROC EXPORT
phx
jsl T_GetTextPtr
ply
jsl T_EatJunk
tya
rtl
ENDP
;------------------------------------------------------------------------------
;
; T_GetObjBound (ObjPtr:l,Start:w) : Par:w,Offset:w
;
; Returns the offset to the start or end of the Q_Text in a Q_Text object.
; If the Q_Text object is empty, the last par and offset are returned.
T_GetObjBound PROC EXPORT
;Using P_ObjData
;Using T_Data
;Using T_TextEqu
INPUT ObjPtr:l,Start:w
OUTPUT Par:w,Offset:w
LOCAL ParagHdl:l,ParagPtr:l,LastPar:w
LOCAL LinePtr:l,Q_Line:w,LineCount:w
BEGIN
movelong T_CurParHdl,ParagHdl
movelong [ParagHdl],ParagPtr
moveword [ParagPtr],a
dec a
sta LastPar
lda Start
beq DoEnd
moveword [ObjPtr]:#P_StartParag,Par
jmi DoLastPar
moveword [ObjPtr]:#P_StartLine,Q_Line
rcall T_GetLinePtr,in=(Par:a,Q_Line:x),out=(LinePtr:ax)
moveword [LinePtr],Offset
brl Exit
DoEnd
moveword [ObjPtr]:#P_EndParag,Par
bmi DoLastPar
moveword [ObjPtr]:#P_EndLine,a
bne NotFirst
lda Par
beq Zero
dec Par
rcall T_GetParPtr,in=(Par:a),out=(ParagPtr:ax)
moveword [ParagPtr]:#T_LineCount,a
NotFirst dec a
Zero sta Q_Line
rcall T_GetParPtr,in=(Par:a),out=(ParagPtr:ax)
subword [ParagPtr]:#T_LineCount,#1,LineCount
rcall T_GetLinePtr,in=(Par:a,Q_Line:x),out=(LinePtr:ax)
addword [LinePtr],[LinePtr]:#T_Length,Offset
cmpw Q_Line,LineCount
blt Exit
cmpw Par,LastPar
bge Exit
inc Par
moveword #7,Offset
bra Exit
DoLastPar
moveword LastPar,Par
rcall T_GetParPtr,in=(a:a),out=(ParagPtr:ax)
moveword [ParagPtr]:#T_LineCount,a
dec a
tax
rcall T_GetLinePtr,in=(Par:a,x:x),out=(LinePtr:ax)
addword [LinePtr],[LinePtr]:#T_Length,Offset
Exit
RETURN
ENDP
;------------------------------------------------------------------------------
;
; T_NewParHdl () : ParagHdl:l
;
; Returns any memory errors.
T_NewParHdl PROC EXPORT
;Using P_Data
;Using P_ObjData
;Using T_Data
;Using T_TextEqu
OUTPUT ParagHdl:l
ERROR Err
LOCAL RulerHdl:l,TextHdl:l,TextPtr:l,ParagPtr:l
BEGIN
; Make RulerHdl
call T_NewRuler,out=(RulerHdl:l),err=(Err)
jcs Exit
; Make TextBlock
call D_NeedHand,in=(#T_ParHeader+5:l),out=(TextHdl:l),err=(Err)
jcs DisposeRuler
movelong [TextHdl],TextPtr
lda #T_ParHeader+5
moveword a,[TextPtr]
moveword a,[TextPtr]:#2
moveword P_DefFont,[TextPtr]:#4
shortm
moveword P_DefStyle,[TextPtr]:#6
moveword P_DefSize,[TextPtr]:#7
moveword #0,[TextPtr]:#8
moveword #CR,[TextPtr]:#11
longm
; Init ParagHdl
call D_NeedHand,in=(#T_ParInfoSize+2:l),out=(ParagHdl:l),err=(Err)
jcs DisposeText
movelong [ParagHdl],ParagPtr
moveword #1,[ParagPtr]
movelong TextHdl,[ParagPtr]:#T_TextBlock
moveword #4,[ParagPtr]:#T_ParOffset
movelong RulerHdl,[ParagPtr]:#T_RulerHdl
lda #0
moveword a,[ParagPtr]:#T_LinesHdl
moveword a,[ParagPtr]:#T_LinesHdl+2
Exit RETURN
DisposeText tool _DisposeHandle,in=(TextHdl:l)
DisposeRuler tool _DisposeHandle,in=(RulerHdl:l)
bra Exit
ENDP
;------------------------------------------------------------------------------
;
; T_OffsetPCount (ObjHdl:l,Change:w)
;
; Offsets the starting paragraph for all the objects in
; the thread after ObjHdl by adding Change to them.
T_OffsetPCount PROC EXPORT
;Using P_ObjData
INPUT ObjHdl:l,Change:w
LOCAL ObjPtr:l
BEGIN
movelong [ObjHdl],ObjPtr
Loop movelong [ObjPtr]:#P_NThread,ObjHdl
cpzl ObjHdl
beq Exit
movelong [ObjHdl],ObjPtr
ldy #P_StartParag
addword Change,[ObjPtr]:y,[ObjPtr]:y
movelong [ObjPtr]:#P_NThread,ObjHdl
bra Loop
Exit RETURN
ENDP
;------------------------------------------------------------------------------
;
; T_OffsetPars (ParagNo:w,Change:w)
;
; Offsets the paragraph offsets for the rest of the paragraphs in
; the same Q_Text block as ParagNo.
T_OffsetPars PROC EXPORT
;Using T_Data
;Using T_TextEqu
INPUT ParagNo:w,Change:w
LOCAL ParagPtr:l,TextBlock:l,ParCount:w
BEGIN
rcall T_GetParPtr,in=(#0:a),out=(ParagPtr:ax)
moveword [ParagPtr],ParCount
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
movelong [ParagPtr]:#T_TextBlock,TextBlock
ParLoop inc ParagNo
cmpw ParagNo,ParCount
bge Exit
addwl #T_ParInfoSize,ParagPtr
cmpl TextBlock,[ParagPtr]:#T_TextBlock
bne Exit
ldy #T_ParOffset
moveword [ParagPtr]:y,a
addword a,Change,[ParagPtr]:y
bra ParLoop
Exit RETURN
ENDP
;------------------------------------------------------------------------------
;
; T_NewPars (ParagNo:w,Count:w)
;
; This routine makes space for the ParagInfo records in the array.
; The paragraphs themselves are uninitialized and inserted before
; ParagNo. This operation occurs on the current thread.
T_NewPars PROC EXPORT
;Using T_Data
INPUT ParagNo:w,Change:w
LOCAL ParagHdl:l,ParagPtr:l,OldCount:w,NewCount:w
ERROR Err
BEGIN
tool _HUnlock,in=(T_CurParHdl:l)
movelong T_CurParHdl,ParagHdl
movelong [ParagHdl],ParagPtr
moveword [ParagPtr],OldCount
addword a,Change,NewCount
jsl T_MulParag
addword a,#2,a ;Two extra bytes for count
call D_GrowHandle,in=(#0:w,a:w,ParagHdl:l),err=(Err)
bcs Exit
movelong [ParagHdl],ParagPtr
moveword NewCount,[ParagPtr]
addwl #2,ParagPtr
lda ParagNo
jsl T_MulParag
addlong a,ParagPtr,s ;Src
addword ParagNo,Change,a
jsl T_MulParag
addlong a,ParagPtr,s ;Dest
subword OldCount,ParagNo,a
jsl T_MulParag
pushword #0
pushword a ;Amount
_BlockMove
Exit RETURN
ENDP
;------------------------------------------------------------------------------
;
; T_DeletePars (ParagNo:w,Change:w)
;
; This routine deletes paragraphs starting at ParagNo. Q_Text
; must be disposed before the LinesHdl and RulerHdl fields.
T_DeletePars PROC EXPORT
;Using T_Data
;Using T_TextEqu
INPUT ParagNo:w,Change:w
LOCAL ParagHdl:l,ParagPtr:l,RulerHdl:l,LinesHdl:l
LOCAL TextBlock:l,FirstBlock:l,LastBlock:l
LOCAL ParagCount:w,CurParag:w,NewCount:w
LOCAL StopParag:w,SrcParag:w,ParSize:w
BEGIN
movelong T_CurParHdl,ParagHdl
lda Change
jeq Exit
rcall T_GetParPtr,in=(#0:a),out=(ParagPtr:ax)
moveword [ParagPtr],ParagCount
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
movelong [ParagPtr]:#T_TextBlock,FirstBlock
addword ParagNo,Change,StopParag
dec a
rcall T_GetParPtr,in=(a:a),out=(ParagPtr:ax)
movelong [ParagPtr]:#T_TextBlock,LastBlock
moveword ParagNo,CurParag
ParLoop
rcall T_GetParPtr,in=(CurParag:a),out=(ParagPtr:ax)
movelong [ParagPtr]:#T_TextBlock,TextBlock
cmpl TextBlock,FirstBlock
beq DeleteChars
cmpl TextBlock,LastBlock
beq DeleteChars
cmpw [ParagPtr]:#T_ParOffset,#4
bne AuxStuff
tool _DisposeHandle,in=(TextBlock:l)
bra AuxStuff
DeleteChars
rcall T_GetParSize,in=(CurParag:a),out=(ParSize:a)
call T_LessRoom,in=(CurParag:w,#0:w,ParSize:w)
AuxStuff
movelong [ParagPtr]:#T_LinesHdl,LinesHdl
cpzl LinesHdl
beq NoLines
tool _DisposeHandle,in=(LinesHdl:l)
NoLines
movelong [ParagPtr]:#T_RulerHdl,RulerHdl
rcall T_UnUseRuler,in=(RulerHdl:ax)
inc CurParag
cmpw CurParag,StopParag
jlt ParLoop
; Fix up paragraph array
FixIt
rcall T_GetParPtr,in=(#0:a),out=(ParagPtr:ax)
subword ParagCount,Change,NewCount
moveword a,[ParagPtr]
addword ParagNo,Change,SrcParag
rcall T_GetParPtr,in=(a:a),out=(ParagPtr:ax)
addlong #2,ParagPtr,s ;Src
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
addlong #2,ParagPtr,s ;Dest
subword ParagCount,SrcParag,a
jsl T_MulParag
pushword #0
pushword a ;Amount
_BlockMove
tool _HUnlock,in=(ParagHdl:l)
lda NewCount
jsl T_MulParag
pushword #0
addword a,#2,s ;Two extra bytes for count
pushlong ParagHdl
jsl D_GrowHandle
Exit RETURN
ENDP
;-------------------------------------------------------------------------------
;
; T_CopyParEnd (ParagNo:w,Offset:w) : Hdl:l
;
; Hdl is a valid textblock with a valid paragraph in it.
T_CopyParEnd PROC EXPORT
;Using T_Data
;Using T_TextEqu
INPUT ParagNo:w,Offset:w
OUTPUT Hdl:l
ERROR Err
LOCAL TextPtr:l,Ptr:l,HdlSize:w,TextSize:w
BEGIN
rcall T_GetParSize,in=(ParagNo:a),out=(a:a)
subword a,Offset,a
sta TextSize
addword a,#T_ParHeader+4,HdlSize
call D_NeedHand,in=(#0:w,HdlSize:w),out=(Hdl:l),err=(Err)
bcs Exit
rcall T_GetTextPtr,in=(ParagNo:a),out=(TextPtr:ax)
call T_TrackFont,in=(TextPtr:l,Offset:w)
movelong [Hdl],Ptr
moveword HdlSize,[Ptr]
moveword HdlSize,[Ptr]:#2
movelong T_CurFont,[Ptr]:#4
moveword T_CurColor,[Ptr]:#4+T_ParColor
addwl Offset,TextPtr
addwl #4+T_ParHeader,Ptr
tool _BlockMove,in=(TextPtr:l,Ptr:l,#0:w,TextSize:w)
Exit RETURN
ENDP
;------------------------------------------------------------------------------
;
; T_PastePar (ParagNo:w,Offset:w,Hdl:l) : CharCount:w
;
; Paste the Q_Text in Hdl at the Offset of ParagNo.
; Hdl must contain a proper textblock with a proper paragraph.
; Disposes the Hdl.
;
T_PastePar PROC EXPORT
;Using T_Data
;Using T_TextEqu
INPUT ParagNo:w,Offset:w,Hdl:l
OUTPUT CharCount:w
ERROR Err
LOCAL TextPtr:l,Ptr:l,TextSize:w,Room:w
LOCAL OrigFont:l,OrigColor:w
BEGIN
stz Err
rcall T_GetTextPtr,in=(ParagNo:a),out=(TextPtr:ax)
call T_TrackFont,in=(TextPtr:l,Offset:w)
movelong T_CurFont,OrigFont
moveword T_CurColor,OrigColor
movelong [Hdl],Ptr
subword [Ptr]:#T_TextSize,#T_ParHeader+5,TextSize ;No CR either
addwl #4,Ptr
moveword [Ptr],T_NewFont
shortm
moveword [Ptr]:#T_ParStyle,T_NewAddStyle
moveword [Ptr]:#T_ParSize,T_NewSize
moveword [Ptr]:#T_ParColor,T_NewColor
longm
call T_MakeRoom,in=(ParagNo:w,Offset:w,TextSize:w)
rcall T_GetTextPtr,in=(ParagNo:a),out=(TextPtr:ax)
addwl Offset,TextPtr
movelong [Hdl],Ptr
addwl #T_ParHeader+4,Ptr
tool _BlockMove,in=(Ptr:l,TextPtr:l,#0:w,TextSize:w)
moveword #$ffff,T_FontFlags
call T_InsertFont,in=(ParagNo:w,Offset:w,#1:w),out=(Room:w)
addword a,Offset,Offset
moveword OrigFont,T_NewFont
shortm
moveword OrigFont+2,T_NewAddStyle
moveword OrigFont+3,T_NewSize
moveword OrigColor,T_NewColor
longm
addword Offset,TextSize,Offset
call T_InsertFont,in=(ParagNo:w,Offset:w,#1:w),out=(a:w)
addword a,TextSize,a
addword a,Room,CharCount
stz T_FontFlags
tool _DisposeHandle,in=(Hdl:l)
RETURN
ENDP
;------------------------------------------------------------------------------
;
; T_GetObject (ParagNo:w,LineNo:w) : ObjHdl:l
;
T_GetObject PROC EXPORT
;Using P_ObjData
;Using T_TextEqu
INPUT ParagNo:w,LineNo:w
OUTPUT ObjHdl:l
LOCAL ParagPtr:l,ObjPtr:l,NextObj:l
BEGIN
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
movelong [ParagPtr]:#T_ObjHdl,ObjHdl
While
cpzl ObjHdl
beq Exit
movelong [ObjHdl],ObjPtr
cmpw ParagNo,[ObjPtr]:#P_EndParag
blt Exit
bne Cont
cmpw LineNo,[ObjPtr]:#P_EndLine
blt Exit
Cont
movelong [ObjPtr]:#P_NThread,ObjHdl
bra While
Exit RETURN
ENDP
;-------------------------------------------------------------------------------
;
; T_TopLine (ParagNo:w,LineNo:w) : ObjHdl:l,VertPos:w
;
T_TopLine PROC EXPORT
;Using P_ObjData
;Using T_Data
;Using T_TextEqu
INPUT ParagNo:w,LineNo:w
OUTPUT ObjHdl:l,VertPos:w
LOCAL ObjPtr:l,ParagPtr:l,CurLine:w
BEGIN
call T_GetObject,in=(ParagNo:w,LineNo:w),out=(ObjHdl:l)
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
movelong [ObjHdl],ObjPtr
cmpw [ObjPtr]:#P_StartParag,ParagNo
beq First
moveword [ParagPtr]:#T_ParStart,VertPos
stz CurLine
bra LineLoop
First
moveword [ObjPtr]:#P_StartLine,CurLine
stz VertPos
LineLoop cmpw CurLine,LineNo
bge Exit
call T_LineHeight,in=(ParagNo:w,CurLine:w),out=(a:w)
addword a,VertPos,VertPos
inc CurLine
bra LineLoop
Exit
RETURN
ENDP
;------------------------------------------------------------------------------
;
; T_LineHeight (ParagNo:w,LineNo:w) : Height:w
;
T_LineHeight PROC EXPORT
;Using T_Data
;Using T_TextEqu
INPUT ParagNo:w,LineNo:w
OUTPUT Height:w
LOCAL LinePtr:l,Ascent:w,Descent:w
BEGIN
rcall T_GetLinePtr,in=(ParagNo:a,LineNo:x),out=(LinePtr:ax)
moveword [LinePtr]:#T_Ascent,a
and #$ff
sta Ascent
moveword [LinePtr]:#T_Descent,a
and #$ff
sta Descent
rcall T_GetRulBits,in=(ParagNo:a),out=(a:a)
rcall T_GetSpacing,in=(a:a,Ascent:x,Descent:y)
addword a,Ascent,a
addword a,Descent,Height
RETURN
ENDP
;-------------------------------------------------------------------------------
;
;T_InvertObj (ObjHdl:l,StartPar:w,StartLine:w,StartPixs:w
; EndPar:w,EndLine:w,EndPixs:w)
T_InvertObj PROC EXPORT
;Using P_ObjData
;Using P_Data
;Using T_Data
;Using T_TextEqu
INPUT ObjHdl:l
INPUT StartPar:w,StartLine:w,StartPixs:w
INPUT EndPar:w,EndLine:w,EndPixs:w
LOCAL ObjPtr:l,ObjRect:r,InvRect:r
LOCAL StartTop:w,StartHeight:w,EndTop:w,EndHeight:w
BEGIN
movelong [ObjHdl],ObjPtr
cmpw [ObjPtr]:#P_PageNo,P_Page
jne Exit
moverect [ObjPtr]:#P_TRect,ObjRect
pushlong !ObjRect
subword P_ContentRect+2,P_H,s
subword P_ContentRect,P_V,s
_OffsetRect
call T_TopLine,in=(StartPar:w,StartLine:w),out=(a:l,StartTop:w)
call T_LineHeight,in=(StartPar:w,StartLine:w),out=(StartHeight:w)
cmpw StartLine,EndLine
bne MultLines
cmpw StartPar,EndPar
bne MultLines
addword ObjRect,StartTop,InvRect
addword a,StartHeight,InvRect+4
addword ObjRect+2,StartPixs,InvRect+2
addword ObjRect+2,EndPixs,InvRect+6
tool _InvertRect,in=(!InvRect:l)
brl Exit
MultLines
call T_TopLine,in=(EndPar:w,EndLine:w),out=(a:l,EndTop:w)
call T_LineHeight,in=(EndPar:w,EndLine:w),out=(EndHeight:w)
addword ObjRect,StartTop,InvRect
addword a,StartHeight,InvRect+4
addword ObjRect+2,StartPixs,InvRect+2
moveword ObjRect+6,InvRect+6
tool _InvertRect,in=(!InvRect:l)
moveword InvRect+4,InvRect
addword ObjRect,EndTop,InvRect+4
cmpw InvRect,InvRect+4
beq NoMiddle
moveword ObjRect+2,InvRect+2
moveword ObjRect+6,InvRect+6
tool _InvertRect,in=(!InvRect:l)
NoMiddle
moveword InvRect+4,InvRect
addword a,EndHeight,InvRect+4
moveword ObjRect+2,InvRect+2
addword a,EndPixs,InvRect+6
tool _InvertRect,in=(!InvRect:l)
Exit
RETURN
ENDP
;-------------------------------------------------------------------------------
;
; T_InvertArea (StartObj:l,StartPar:w,StartLine:w,StartPixs:w,
; EndObj:l,EndPar:w,EndLine:w,EndPixs:w);
;
T_InvertArea PROC EXPORT
;Using P_Data
;Using P_ObjData
;Using T_Data
;Using T_TextEqu
INPUT StartObj:l,StartPar:w,StartLine:w,StartPixs:w
INPUT EndObj:l,EndPar:w,EndLine:w,EndPixs:w
LOCAL CurObj:l,CurPtr:l,ParagPtr:l
LOCAL Par1:w,Line1:w,Pixs1:w,Par2:w,Line2:w,Pixs2:w
BEGIN
cmpw StartPar,EndPar
blt NoSwap
bne Swap
cmpw StartLine,EndLine
blt NoSwap
bne Swap
cmpw StartPixs,EndPixs
blt NoSwap
jeq Exit
Swap
pushlong StartObj
movelong EndObj,StartObj
pulllong EndObj
ldx StartPar
moveword EndPar,StartPar
stx EndPar
ldx StartLine
moveword EndLine,StartLine
stx EndLine
ldx StartPixs
moveword EndPixs,StartPixs
stx EndPixs
NoSwap
movelong StartObj,CurObj
ObjLoop
cpzl CurObj
jeq Exit
movelong [CurObj],CurPtr
cmpl CurObj,StartObj
beq FirstObj
moveword [CurPtr]:#P_StartParag,Par1
moveword [CurPtr]:#P_StartLine,Line1
stz Pixs1
bra SetEnd
FirstObj
moveword StartPar,Par1
moveword StartLine,Line1
moveword StartPixs,Pixs1
SetEnd
cmpl CurObj,EndObj
bne UseEnd
call T_OffThread,in=(EndPar:w,EndLine:w),out=(a:w)
bne UseEnd
moveword EndPar,Par2
moveword EndLine,Line2
moveword EndPixs,Pixs2
bra DoCall
UseEnd
moveword [CurPtr]:#P_EndParag,Par2
moveword [CurPtr]:#P_EndLine,Line2
subword [CurPtr]:#P_TRect+6,[CurPtr]:#P_TRect+2,Pixs2
lda Line2
beq PrevPar
dec Line2
bra DoCall
PrevPar lda Par2
beq DoCall
dec Par2
rcall T_GetParPtr,in=(Par2:a),out=(ParagPtr:ax)
subword [ParagPtr]:#T_LineCount,#1,Line2
DoCall
in CurObj:l,Par1:w,Line1:w,Pixs1:w
in Par2:w,Line2:w,Pixs2:w
xcall T_InvertObj
cmpl CurObj,EndObj
beq Exit
movelong [CurObj],CurPtr
movelong [CurPtr]:#P_NThread,CurObj
brl ObjLoop
Exit RETURN
ENDP
;------------------------------------------------------------------------------;
; T_InvSelect ()
;
; Inverts the area described by the active globals.
T_InvSelect PROC EXPORT
;Using T_Data
lda T_TextSelect
beq @NoSelect
in T_DotObj:l,T_DotParag:w,T_DotOffset:w,T_DotLine:w
out T_DotPixs:w
xcall T_Offset2Pix
in T_MarkObj:l,T_MarkParag:w,T_MarkOffset:w,T_MarkLine:w
out T_MarkPixs:w
xcall T_Offset2Pix
in T_DotObj:l,T_DotParag:w,T_DotLine:w,T_DotPixs:w
in T_MarkObj:l,T_MarkParag:w,T_MarkLine:w,T_MarkPixs:w
xcall T_InvertArea
bra Exit
@NoSelect
jsl T_EraseCaret
Exit rtl
ENDP
;-----------------------------------------------------------------------------
;
; T_OffThread (ParagNo:w,Q_Line:w) : Off:w
;
; Returns true if the position described by the inputs is not in an object.
T_OffThread PROC EXPORT
;Using P_ObjData
;Using T_TextEqu
;Using T_Data
INPUT ParagNo:w,Q_Line:w
OUTPUT Off:w
LOCAL ParagPtr:l,ObjHdl:l,ObjPtr:l
LOCAL EndParag:w,EndLine:w
BEGIN
stz Off
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
movelong [ParagPtr]:#T_ObjHdl,ObjHdl
ObjLoop
movelong [ObjHdl],ObjPtr
moveword [ObjPtr]:#P_EndParag,EndParag
bmi Exit
moveword [ObjPtr]:#P_EndLine,EndLine
cmpw EndParag,ParagNo
blt TryNext
bne Exit
cmpw Q_Line,EndLine
blt Exit
TryNext
movelong [ObjPtr]:#P_NThread,ObjHdl
cpzl ObjHdl
bne ObjLoop
inc Off
Exit RETURN
ENDP
;------------------------------------------------------------------------------
;
; T_MovedDot ()
;
; Call this routine to D_Update the position of the D_Cursor.
T_MovedDot PROC EXPORT
;Using P_Data
;Using P_ObjData
;Using T_Data
;Using T_TextEqu
LOCAL ObjHdl:l,ObjPtr:l
BEGIN
in T_DotParag:w,T_DotOffset:w
out T_DotObj:l,T_DotLine:w
xcall T_Offset2Line
call T_OffThread,in=(T_DotParag:w,T_DotLine:w),out=(a:w)
beq NoDeact
call T_Deactivate,in=(#1:w,#1:w)
bra Exit
NoDeact
lda T_TextSelect
bne DoRul
movelong T_DotObj,ObjHdl
movelong [ObjHdl],ObjPtr
cmpw [ObjPtr]:#P_PageNo,P_Page
beq DoRul
call P_ChangePage,in=(a:w,#1:w)
DoRul
call T_DrawRuler
Exit
RETURN
ENDP
;-------------------------------------------------------------------------------
;
; T_PadThread (ObjHdl:l,VertPos:w)
;
T_PadThread PROC EXPORT
;Using P_Data
;Using P_ObjData
INPUT ObjHdl:l,VertPos:w
LOCAL ObjPtr:l,MaxVert:w
BEGIN
movelong [ObjHdl],ObjPtr
subword [ObjPtr]:#P_TRect+4,[ObjPtr]:#P_TRect,MaxVert
cmpw VertPos,MaxVert
bge Loop
lda #$FFFF
moveword a,[ObjPtr]:#P_EndParag
moveword a,[ObjPtr]:#P_EndLine
Loop
movelong [ObjPtr]:#P_NThread,ObjHdl
cpzl ObjHdl
beq EndLoop
movelong [ObjHdl],ObjPtr
lda #$FFFF
moveword a,[ObjPtr]:#P_StartParag
moveword a,[ObjPtr]:#P_StartLine
moveword a,[ObjPtr]:#P_EndParag
moveword a,[ObjPtr]:#P_EndLine
bra Loop
EndLoop
RETURN
ENDP
END