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

1 line
12 KiB
ArmAsm
Executable File

load 'macros.dump'
include 'driver.equ'
include 'pl.equ'
;-----------------------------------------------
;
; Imported addresses
;
;-----------------------------------------------
IMPORT D_GetWdth
IMPORT P_ContentRect
IMPORT P_CurrentWin
IMPORT P_Fix2Int
IMPORT P_H
IMPORT P_Page
IMPORT P_V
IMPORT D_SelectFont
IMPORT T_CaretDrawn
IMPORT T_CountSpaces
IMPORT T_CurFont
IMPORT T_CurIndent
IMPORT T_CurRulBits
IMPORT T_CurSize
IMPORT T_CurStyle
IMPORT T_DotLine
IMPORT T_DotObj
IMPORT T_DotOffset
IMPORT T_DotParag
IMPORT T_DotPixs
IMPORT T_GetLinePtr
IMPORT T_GetObject
IMPORT T_GetParPtr
IMPORT T_GetRulBits
IMPORT T_GetSpacing
IMPORT T_LockRuler
IMPORT T_TopLine
IMPORT T_TrackFont
IMPORT T_UnlockRuler
IMPORT T_UseTab
;-----------------------------------------------
;
; Forward addresses and entries
;
;-----------------------------------------------
ENTRY T_Pix2Offset
;------------------------------------------------------------------------------
;
; T_GetStart (LineWidth:w,MaxWidth:w,NoIndent:w) : StartWidth:w
;
; Returns the starting horiz offset for a Q_Line of Q_Text, using the current
; ruler information.
T_GetStart PROC EXPORT
;Using T_Data
;Using T_TextEqu
INPUT LineWidth:w,MaxWidth:w,NoIndent:w
OUTPUT StartWidth:w
BEGIN
stz StartWidth
lda T_CurRulBits
and #T_Center
bne DoCenter
lda T_CurRulBits
and #T_Right
beq DoIndent
DoRight subword MaxWidth,LineWidth,StartWidth
bra DoIndent
DoCenter subword MaxWidth,LineWidth,a
lsr a
sta StartWidth
DoIndent
lda NoIndent
bne Exit
addword StartWidth,T_CurIndent,StartWidth
Exit RETURN
ENDP
;-------------------------------------------------------------------------
;
; T_Pt2Offset (ObjHdl:l,Pt:l) : ParagNo:w,Offset:w,LineNo:w,Q_Pixels:w
;
T_Pt2Offset PROC EXPORT
;Using P_ObjData
;Using T_TextEqu
;Using T_Data
INPUT ObjHdl:l,Pt:l
OUTPUT ParagNo:w,Offset:w,LineNo:w,Q_Pixels:w
LOCAL ObjPtr:l,ParagPtr:l,LinePtr:l
LOCAL EndParag:w,EndLine:w,ParagCount:w,LineCount:w,Q_Rect:r
LOCAL RulBits:w,TotHeight:w,Leading:w,Ascent:w,Descent:w
LOCAL MaxWidth:w
BEGIN
movelong [ObjHdl],ObjPtr
moveword [ObjPtr]:#P_StartParag,ParagNo
moveword [ObjPtr]:#P_StartLine,LineNo
moveword [ObjPtr]:#P_EndParag,EndParag
moveword [ObjPtr]:#P_EndLine,EndLine
moverect [ObjPtr]:#P_TRect,Q_Rect
subword Pt,Q_Rect,Pt
subword Pt+2,Q_Rect+2,Pt+2
subword Q_Rect+6,Q_Rect+2,MaxWidth
rcall T_GetParPtr,in=(#0:a),out=(ParagPtr:ax)
moveword [ParagPtr],ParagCount
stz TotHeight
; Find the Q_Line and the parag
ParagLoop
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
moveword [ParagPtr]:#T_LineCount,LineCount
rcall T_GetRulBits,in=(ParagNo:a),out=(RulBits:a)
rcall T_GetLinePtr,in=(ParagNo:a,LineNo:x),out=(LinePtr:ax)
LineLoop
cmpw ParagNo,EndParag
blt CheckCount
cmpw LineNo,EndLine
blt CheckCount
brl PastEnd
CheckCount
cmpw LineNo,LineCount
bge NextParag
moveword [LinePtr]:#T_Ascent,a
and #$ff
sta Ascent
moveword [LinePtr]:#T_Descent,a
and #$ff
sta Descent
rcall T_GetSpacing,in=(RulBits:a,Ascent:x,Descent:y),out=(a:a)
addword a,Ascent,a
addword a,Descent,a
addword a,TotHeight,TotHeight
scmpw a,Pt
bge FindPixels
addwl #T_LineInfoSize,LinePtr
inc LineNo
bra LineLoop
NextParag
stz LineNo
inc ParagNo
cmpw ParagNo,ParagCount
bge PastEnd
addwl #T_ParInfoSize,ParagPtr
brl ParagLoop
PastEnd
moveword MaxWidth,Pt+2
lda LineNo
bne Skip
lda ParagNo
beq FindPixels
dec ParagNo
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
moveword [ParagPtr]:#T_LineCount,LineNo
Skip dec LineNo
FindPixels
in ParagNo:w,LineNo:w,Pt+2:w,MaxWidth:w
out Offset:w,Q_Pixels:w
xcall T_Pix2Offset
RETURN
ENDP
;------------------------------------------------------------------------------
;
; T_Pix2Offset (ParagNo:w,LineNo:w,Pix:w,MaxWidth:w) : Offset:w,Q_Pixels:w
;
;
T_Pix2Offset PROC EXPORT
;Using T_Data
;Using T_TextEqu
INPUT ParagNo:w,LineNo:w,Pix:w,MaxWidth:w
OUTPUT Offset:w,Q_Pixels:w
LOCAL ParagPtr:l,TextHdl:l,TextPtr:l,LinePtr:l
LOCAL LineCount:w,MaxOffset:w,LineWidth:w
LOCAL Width:l,NextWidth:l,SpaceExtra:l
LOCAL FontChanged:w,Spaces:w,TabStop:w
BEGIN
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
rcall T_LockRuler,in=(ax:ax)
moveword [ParagPtr]:#T_LineCount,LineCount
movelong [ParagPtr]:#T_TextBlock,TextHdl
tool _HLock,in=(TextHdl:l)
movelong [TextHdl],TextPtr
moveword [ParagPtr]:#T_ParOffset,a
addwl a,TextPtr
rcall T_GetLinePtr,in=(ParagNo:a,LineNo:x),out=(LinePtr:ax)
moveword [LinePtr]:#T_Offset,Offset
addword a,[LinePtr]:#T_Length,MaxOffset
moveword [LinePtr]:#T_LineWidth,LineWidth
stz FontChanged
stzl SpaceExtra
stzl Width
call T_GetStart,in=(LineWidth:w,MaxWidth:w,LineNo:w),out=(a:w)
sta Width+2
lda Pix
jmi SetPixs
lda T_CurRulBits
and #T_Full
beq NotFull
dec LineCount
cmpw LineNo,LineCount
bge NotFull
in TextPtr:l,Offset:w,MaxOffset:w
out TabStop:w,Spaces:w
xcall T_CountSpaces
lda Spaces
beq NotFull
spacelong
subword MaxWidth,LineWidth,s
pushword Spaces
_FixRatio
pulllong SpaceExtra
NotFull
call T_TrackFont,in=(TextPtr:l,Offset:w)
rcall D_SelectFont,in=(T_CurFont:a,T_CurStyle:x,#0:y)
CharLoop
cmpw Offset,MaxOffset
jge SetPixs
moveword [TextPtr]:Offset,a
inc Offset
and #$ff
cmp #T_MaxChange+1
bge NormalChar
inc FontChanged
asl a
tax
jmp (JumpTable,x)
NormalChar ldx FontChanged
beq NoChange
pha
rcall D_SelectFont,in=(T_CurFont:a,T_CurStyle:x,#0:y)
pla
stz FontChanged
NoChange
cmp #SPACE
beq DoSpace
cmp #TAB
beq DoTab
cmp #CR
beq FoundIt
jsl D_GetWdth
sta NextWidth+2
stz NextWidth
brl CheckIt
DoSpace
moveword SpaceExtra,NextWidth
rcall D_GetWdth,in=(#SPACE:a),out=(a:a)
addword a,SpaceExtra+2,NextWidth+2
brl CheckIt
DoTab
in TextPtr:l,Offset:w,Width+2:w,MaxWidth:w
in T_CurFont:l,#0:w
out a:w
xcall T_UseTab
bmi FoundIt
subword a,Width+2,NextWidth+2
stz NextWidth
bra CheckIt
CheckIt
rcall P_Fix2Int,in=(NextWidth:ax),out=(a:a)
lsr a
addword a,Width+2,a
cmp Pix
bge FoundIt
addlong Width,NextWidth,Width
brl CharLoop
FoundIt dec Offset
SetPixs rcall P_Fix2Int,in=(Width:ax),out=(a:a)
cmp MaxWidth
blt StorePixs
lda MaxWidth
StorePixs sta Q_Pixels
call T_UnlockRuler
tool _HUnlock,in=(TextHdl:l)
Exit
RETURN
JumpTable DC.W CharLoop
DC.W FontChange
DC.W StyleChange
DC.W SizeChange
DC.W ChangeExit
DC.W CharLoop
DC.W CharLoop
DC.W CharLoop
FontChange
moveword [TextPtr]:Offset,T_CurFont
inc Offset
bra ChangeExit
StyleChange
movebyte [TextPtr]:Offset,T_CurStyle
bra ChangeExit
SizeChange
movebyte [TextPtr]:Offset,T_CurSize
bra ChangeExit
ChangeExit
inc Offset
brl CharLoop
ENDP
;------------------------------------------------------------------------------;
;
; T_Offset2Pix (ObjHdl:l,ParagNo:w,StopOffset:w,LineNo:w) : Pixs:w
;
T_Offset2Pix PROC EXPORT
;Using P_ObjData
;Using T_TextEqu
;Using T_Data
INPUT ObjHdl:l,ParagNo:w,StopOffset:w,LineNo:w
OUTPUT Pixs:w
LOCAL ParagPtr:l,LinePtr:l,TextHdl:l,TextPtr:l,ObjPtr:l
LOCAL LineCount:w,MaxWidth:w
LOCAL CurOffset:w,MaxOffset:w,LineWidth:w
LOCAL Width:l,SpaceExtra:l
LOCAL Spaces:w,TabStop:w,FontChanged:w
BEGIN
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
rcall T_LockRuler,in=(ax:ax)
rcall T_GetLinePtr,in=(ParagNo:a,LineNo:x),out=(LinePtr:ax)
movelong [ParagPtr]:#T_TextBlock,TextHdl
moveword [ParagPtr]:#T_LineCount,LineCount
moveword [LinePtr]:#T_Offset,CurOffset
addword a,[LinePtr]:#T_Length,MaxOffset
moveword [LinePtr]:#T_LineWidth,LineWidth
tool _HLock,in=(TextHdl:l)
movelong [TextHdl],TextPtr
moveword [ParagPtr]:#T_ParOffset,a
addwl a,TextPtr
stzl Width
stzl SpaceExtra
movelong [ObjHdl],ObjPtr
subword [ObjPtr]:#P_TRect+6,[ObjPtr]:#P_TRect+2,MaxWidth
in LineWidth:w,MaxWidth:w,LineNo:w
out Width+2:w
xcall T_GetStart
lda T_CurRulBits
and #T_Full
beq NotFull
dec LineCount
cmpw LineNo,LineCount
bge NotFull
in TextPtr:l,CurOffset:w,MaxOffset:w
out TabStop:w,Spaces:w
xcall T_CountSpaces
lda Spaces
beq NotFull
spacelong
subword MaxWidth,LineWidth,s
pushword Spaces
_FixRatio
pulllong SpaceExtra
NotFull
call T_TrackFont,in=(TextPtr:l,CurOffset:w)
rcall D_SelectFont,in=(T_CurFont:a,T_CurStyle:x,#0:y)
CharLoop
cmpw CurOffset,StopOffset
jge Done
moveword [TextPtr]:CurOffset,a
inc CurOffset
and #$ff
cmp #T_MaxChange+1
blt SpecialCase
ldx FontChanged
beq NoChange
pha
rcall D_SelectFont,in=(T_CurFont:a,T_CurStyle:x,#0:y)
pla
stz FontChanged
NoChange
cmp #SPACE
beq DoSpace
cmp #TAB
beq DoTab
cmp #CR
beq Done
jsl D_GetWdth
addword a,Width+2,Width+2
bra CharLoop
DoSpace
rcall D_GetWdth,in=(#SPACE:a),out=(a:a)
addword a,Width+2,Width+2
addlong Width,SpaceExtra,Width
bra CharLoop
DoTab
in TextPtr:l,CurOffset:w,Width+2:w,MaxWidth:w
in T_CurFont:l,#0:w
out a:w
xcall T_UseTab
bmi Done
sta Width+2
brl CharLoop
SpecialCase
inc FontChanged
asl a
tax
jmp (JumpTable,x)
Done rcall P_Fix2Int,in=(Width:ax),out=(Width+2:a)
SetPixs
cmpw Width+2,MaxWidth
blt StorePixs
lda MaxWidth
StorePixs sta Pixs
call T_UnlockRuler
tool _HUnlock,in=(TextHdl:l)
RETURN
JumpTable DC.W Done
DC.W FontChange
DC.W StyleChange
DC.W SizeChange
DC.W ChangeExit
DC.W CharLoop
DC.W CharLoop
DC.W CharLoop
FontChange
moveword [TextPtr]:CurOffset,T_CurFont
inc CurOffset
bra ChangeExit
StyleChange
movebyte [TextPtr]:CurOffset,T_CurStyle
bra ChangeExit
SizeChange
movebyte [TextPtr]:CurOffset,T_CurSize
bra ChangeExit
ChangeExit
inc CurOffset
brl CharLoop
ENDP
;------------------------------------------------------------------------------
;
; T_Offset2Line (ParagNo:w,Offset:w) : ObjHdl:l,LineNo:w
;
T_Offset2Line PROC EXPORT
;Using P_ObjData
;Using T_Data
;Using T_TextEqu
INPUT ParagNo:w,Offset:w
OUTPUT ObjHdl:l,LineNo:w
LOCAL LinePtr:l
BEGIN
rcall T_GetLinePtr,in=(ParagNo:a,#0:x),out=(LinePtr:ax)
stz LineNo
LineLoop addword [LinePtr],[LinePtr]:#T_Length,a
cmpw a,Offset
bge EndLoop
addwl #T_LineInfoSize,LinePtr
inc LineNo
bra LineLoop
EndLoop
call T_GetObject,in=(ParagNo:w,LineNo:w),out=(ObjHdl:l)
Exit RETURN
ENDP
;------------------------------------------------------------------------------;
;
; T_BlinkCaret ()
;
T_BlinkCaret PROC EXPORT
;Using P_Data
;Using P_ObjData
;Using T_Data
;Using T_TextEqu
LOCAL ParagPtr:l,LinePtr:l,ObjHdl:l,ObjPtr:l
LOCAL RTop:w,RLeft:w,Top:w,Height:w,Ascent:w,Descent:w
BEGIN
tool _SetPort,in=(P_CurrentWin:l)
movelong T_DotObj,ObjHdl
movelong [ObjHdl],ObjPtr
cmpw [ObjPtr]:#P_PageNo,P_Page
jne Exit
moveword [ObjPtr]:#P_TRect,RTop
moveword [ObjPtr]:#P_TRect+2,RLeft
call T_TopLine,in=(T_DotParag:w,T_DotLine:w),out=(a:l,Top:w)
rcall T_GetLinePtr,in=(T_DotParag:a,T_DotLine:x),out=(LinePtr:ax)
moveword [LinePtr]:#T_Ascent,a
and #$ff
sta Ascent
moveword [LinePtr]:#T_Descent,a
and #$ff
sta Descent
addword a,Ascent,Height
rcall T_GetParPtr,in=(T_DotParag:a),out=(ParagPtr:ax)
rcall T_GetRulBits,in=(T_DotParag:a),out=(a:a)
rcall T_GetSpacing,in=(a:a,Ascent:x,Descent:y),out=(a:a)
addword a,Top,Top
in T_DotObj:l,T_DotParag:w,T_DotOffset:w,T_DotLine:w
out T_DotPixs:w
xcall T_Offset2Pix
addword P_ContentRect+2,RLeft,a
subword a,P_H,a
addword a,T_DotPixs,s
addword P_ContentRect,RTop,a
subword a,P_V,a
addword a,Top,s
_MoveTo
tool _SetPenMode,in=(#notXOR:w)
tool _Line,in=(#0:w,Height:w)
tool _SetPenMode,in=(#0:w)
Exit RETURN
ENDP
;------------------------------------------------------------------------------
;
; T_EraseCaret ()
;
; Erases the caret if necessary.
T_EraseCaret PROC EXPORT
;Using T_Data
lda T_CaretDrawn
beq Exit
jsl T_BlinkCaret
stz T_CaretDrawn
Exit rtl
ENDP
END