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

1 line
5.6 KiB
ArmAsm
Executable File

load 'macros.dump'
include 'driver.equ'
include 'pl.equ'
;-----------------------------------------------
;
; Imported addresses
;
;-----------------------------------------------
IMPORT X_CopyOneHandle
IMPORT D_MainZPage
IMPORT D_NeedHand
IMPORT P_BuildUndo
IMPORT P_DefJust
IMPORT P_DefSpacing
IMPORT P_DrawTabs
IMPORT P_EraseTabs
IMPORT T_DotObj
IMPORT T_DotParag
IMPORT T_Editing
IMPORT T_EraseCaret
IMPORT T_GetParPtr
IMPORT T_MarkParag
IMPORT T_RulDrawn
IMPORT T_RulObj
IMPORT T_TextSelect
IMPORT T_UpdatePars
;-----------------------------------------------
;
; Forward addresses and entries
;
;-----------------------------------------------
ENTRY T_ClearRulers
ENTRY T_SetRulers
;------------------------------------------------------------------------------
;
; T_UseRuler (RulerHdl:ax)
;
T_UseRuler PROC EXPORT
;Using D_GlobalData
RulerHdl equ 0
RulerPtr equ 4
phd
pha
lda >D_MainZPage
tcd
pla
movelong ax,RulerHdl
movelong [RulerHdl],RulerPtr
lda [RulerPtr]
inc a
sta [RulerPtr]
pld
rtl
ENDP
;------------------------------------------------------------------------------
;
; T_UsUseRuler (RulerHdl:ax)
;
T_UnUseRuler PROC EXPORT
;Using D_GlobalData
;Using T_Data
RulerHdl equ 0
RulerPtr equ 4
phd
pha
lda >D_MainZPage
tcd
pla
movelong ax,RulerHdl
movelong [RulerHdl],RulerPtr
lda [RulerPtr]
dec a
sta [RulerPtr]
bne Exit
cmpl RulerHdl,T_RulDrawn
bne Okay
stzl T_RulDrawn
Okay tool _DisposeHandle,in=(RulerHdl:l)
Exit pld
rtl
ENDP
;------------------------------------------------------------------------------
;
; T_NewRuler() : RulerHdl:l
;
T_NewRuler PROC EXPORT
;Using P_Data
;Using T_TextEqu
;Using D_GlobalData
OUTPUT RulerHdl:l
LOCAL RulerPtr:l
ERROR Err
BEGIN
call D_NeedHand,in=(#T_RulerInfoSize:l),out=(RulerHdl:l),err=(Err)
movelong [RulerHdl],RulerPtr
moveword #1,[RulerPtr]:#T_ParsUsing
lda P_DefJust
ora P_DefSpacing
moveword a,[RulerPtr]:#T_RulBits
moveword #0,[RulerPtr]:#T_TabCount
moveword #0,[RulerPtr]:#T_Indent
moveword #P_IndentTab,[RulerPtr]:#T_Indent+2
RETURN
ENDP
;------------------------------------------------------------------------------
;
; T_DrawRuler ()
;
T_DrawRuler PROC EXPORT
;Using T_Data
;Using T_TextEqu
LOCAL ParagPtr:l,RulerHdl:l
BEGIN
lda T_Editing
beq Exit
rcall T_GetParPtr,in=(T_DotParag:a),out=(ParagPtr:ax)
movelong [ParagPtr]:#T_RulerHdl,RulerHdl
cmpl T_DotObj,T_RulObj
bne DrawIt
cmpl RulerHdl,T_RulDrawn
beq Exit
DrawIt
movelong T_DotObj,T_RulObj
movelong RulerHdl,T_RulDrawn
call P_EraseTabs
call P_DrawTabs
Exit RETURN
ENDP
;------------------------------------------------------------------------------
;
; T_ChangeRuls (ModType:w,Data:w,TabList:l)
;
T_ChangeRuls PROC EXPORT
;Using P_Data
;Using T_TextEqu
;Using T_Data
INPUT ModType:w,Data:w,TabList:l
LOCAL CurPar:w,ParagPtr:l,NewRuler:l,NewPtr:l,TabPtr:l
LOCAL RulerHdl:l
BEGIN
call P_BuildUndo,in=(#0:w)
lda T_TextSelect
bne Range
call T_EraseCaret
moveword T_DotParag,T_MarkParag
Range
moveword T_DotParag,CurPar
ParLoop
rcall T_GetParPtr,in=(CurPar:a),out=(ParagPtr:ax)
movelong [ParagPtr]:#T_RulerHdl,RulerHdl
lda RulerHdl+2
and #T_MarkBit
bne NextParag
call X_CopyOneHandle,in=(RulerHdl:l),out=(NewRuler:l)
movelong [NewRuler],NewPtr
moveword #0,[NewPtr] ;ParsUsing set by T_SetRulers
lda ModType
asl a
tax
jsr (ModTable,x)
in NewRuler:l,RulerHdl:l,CurPar:w,T_MarkParag:w,#1:w
xcall T_SetRulers
NextParag
inc CurPar
cmpw T_MarkParag,CurPar
bge ParLoop
call T_ClearRulers,in=(T_DotParag:w,T_MarkParag:w)
call T_UpdatePars,in=(T_DotParag:w,T_MarkParag:w)
RETURN
ModTable
DC.W Spacing
DC.W Justif
DC.W Indent
DC.W Tabs
Spacing
ldy #T_RulBits
lda [NewPtr],y
and #T_NoSpacing
ora Data
sta [NewPtr],y
rts
Justif
ldy #T_RulBits
lda [NewPtr],y
and #T_NoJust
ora Data
sta [NewPtr],y
rts
Indent
moveword Data,[NewPtr]:#T_Indent
rts
Tabs
movelong [TabList],TabPtr
ldy #T_TabCount
moveword [TabPtr]:y,[NewPtr]:y
addlong #T_TabArray,TabPtr,s
addlong #T_TabArray,NewPtr,s
pushlong #P_MaxTabCount*4
_BlockMove
rts
ENDP
;------------------------------------------------------------------------------
;
; T_SetRulers (NewRuler:l,OldRuler:l,FirstPar:w,LastPar:w,UnUse:w)
;
; The NewRuler is marked in every paragraph record that uses its.
; DisposeRuler is called for every paragraph that is no longer using
; OldRuler if UnUse is set.
T_SetRulers PROC EXPORT
;Using T_TextEqu
INPUT NewRuler:l,OldRuler:l,FirstPar:w,LastPar:w,UnUse:w
LOCAL ParagPtr:l,ParsUsing:w,RulerHdl:l,RPtr:l
BEGIN
lda NewRuler+2
ora #T_MarkBit
sta NewRuler+2
stz ParsUsing
ParLoop
rcall T_GetParPtr,in=(FirstPar:a),out=(ParagPtr:ax)
movelong [ParagPtr]:#T_RulerHdl,RulerHdl
cmpl RulerHdl,OldRuler
bne NextPar
inc ParsUsing
lda UnUse
beq SetIt
rcall T_UnUseRuler,in=(RulerHdl:ax)
SetIt movelong NewRuler,[ParagPtr]:#T_RulerHdl
NextPar
inc FirstPar
cmpw LastPar,FirstPar
bge ParLoop
movelong [NewRuler],RPtr
moveword ParsUsing,[RPtr]
RETURN
ENDP
;------------------------------------------------------------------------------
;
; T_ClearRulers (FirstPar:w,LastPar:w)
;
; Clears the marks in the ruler hdls.
T_ClearRulers PROC EXPORT
;Using T_TextEqu
INPUT FirstPar:w,LastPar:w
LOCAL ParagPtr:l
BEGIN
ParLoop
rcall T_GetParPtr,in=(FirstPar:a),out=(ParagPtr:ax)
ldy #T_RulerHdl+2
moveword [ParagPtr]:y,a
and #$7FFF
moveword a,[ParagPtr]:y
inc FirstPar
cmpw LastPar,FirstPar
bge ParLoop
RETURN
ENDP
END