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

1 line
12 KiB
ArmAsm
Executable File

load 'macros.dump'
include 'driver.equ'
include 'pl.equ'
;-----------------------------------------------
;
; Imported addresses
;
;-----------------------------------------------
IMPORT D_BitMapChanged
IMPORT D_BitMapPtr
IMPORT D_ClearBitMap
IMPORT D_Deref
IMPORT P_AddThreadRgn
IMPORT P_CheckHand
IMPORT P_ContentRect
IMPORT P_CurrentWin
IMPORT P_DoThread
IMPORT P_DrawContent
IMPORT P_DrawHandles
IMPORT P_ErrorAlert
IMPORT P_FixMenus
IMPORT P_FixSpecRect
IMPORT P_HideTabs
IMPORT P_KillUndo
IMPORT P_Page
IMPORT P_PageMode
IMPORT P_Placing
IMPORT P_ThreadDir
IMPORT P_ThreadHdl
IMPORT D_RectZap
IMPORT T_BlinkCaret
IMPORT T_Click
IMPORT T_GetParPtr
IMPORT T_InvSelect
IMPORT T_NewParHdl
IMPORT T_OffThread
IMPORT T_PadThread
IMPORT T_Pt2Offset
IMPORT T_RecutParag
;-----------------------------------------------
;
; Forward addresses and entries
;
;-----------------------------------------------
ENTRY T_CInterval
ENTRY T_CaretDrawn
ENTRY T_CaretTime
ENTRY T_ClickCount
ENTRY T_ClipThread
ENTRY T_CurParHdl
ENTRY T_Editing
ENTRY T_FontFlags
ENTRY T_ReThread
ENTRY T_Refresh
ENTRY T_RulDrawn
ENTRY T_TextSelect
ENTRY T_ThreadRgn
;-----------------------------------------------------------------------------
;
; T_New (ObjHdl:l,ParagHdl:l)
;
; Returns any errors. ObjHdl should be X_Locked when T_New is called.
T_New PROC EXPORT
;Using P_Data
;Using P_ObjData
;Using T_Data
;Using T_TextEqu
input ObjHdl:l,ParagHdl:l
local ObjPtr:l,ParagPtr:l,PThread:l,ReThreadHdl:l,TempPtr:l
error Err
begin
stz Err
movelong [ObjHdl],ObjPtr
call P_FixSpecRect,in=(ObjPtr:l)
; Make a D_New parag array if neccessary
cpzl ParagHdl
bne ThreadExists
call T_NewParHdl,out=(ParagHdl:l),err=(Err)
jcs Exit
ThreadExists movelong ParagHdl,[ObjPtr]:#P_ParagHdl
moveword P_Page,[ObjPtr]:#P_PageNo
moveword #0,[ObjPtr]:#P_NThread
moveword a,[ObjPtr]:#P_NThread+2
moveword a,[ObjPtr]:#P_PThread
moveword a,[ObjPtr]:#P_PThread+2
; Do threading
lda P_Placing
beq NoThread
cpzl P_ThreadHdl
beq NoThread
rcall D_Deref,in=(P_ThreadHdl:ax),out=(TempPtr:ax)
cmpw [TempPtr]:#P_PageNo,P_Page
bne NoHand1
call P_DrawHandles,in=(TempPtr:l)
NoHand1
call P_DoThread,in=(P_ThreadHdl:l,ObjHdl:l,P_ThreadDir:w)
cmpw [TempPtr]:#P_PageNo,P_Page
bne NoHand2
call P_DrawHandles,in=(TempPtr:l)
NoHand2
tool _HUnlock,in=(P_ThreadHdl:l)
NoThread
; Setup and rethread
movelong [ObjPtr]:#P_PThread,PThread
cpzl PThread
bne PrevExists
movelong ObjHdl,ReThreadHdl
movelong [ParagHdl],ParagPtr
movelong ObjHdl,[ParagPtr]:#T_ObjHdl
lda #0
moveword a,[ParagPtr]:#T_ParStart
moveword a,[ObjPtr]:#P_StartParag
moveword a,[ObjPtr]:#P_StartLine
lda #$FFFF
moveword a,[ObjPtr]:#P_EndParag
moveword a,[ObjPtr]:#P_EndLine
bra Done
PrevExists
movelong PThread,ReThreadHdl
Done
call T_ReThread,in=(ReThreadHdl:l)
Exit return
ENDP
;-------------------------------------------------------------------------------
;
; T_ReThread (ObjHdl:l)
;
T_ReThread PROC EXPORT
;Using P_ObjData
;Using T_Data
;Using T_TextEqu
input ObjHdl:l
local ObjPtr:l,ParagHdl:l,ParagPtr:l
local ParagNo:w,ParagCount:w,VertPos:w
error Err
begin +b
stz Err
; D_Save on stack
pushlong T_CurParHdl
movelong [ObjHdl],ObjPtr
movelong [ObjPtr]:#P_ParagHdl,ParagHdl
movelong ParagHdl,T_CurParHdl
rcall T_GetParPtr,in=(#0:a),out=(ParagPtr:ax)
moveword [ParagPtr],ParagCount
cpzl [ObjPtr]:#P_PThread
bne NotStart
lda #0
moveword a,[ObjPtr]:#P_StartParag
moveword a,[ObjPtr]:#P_StartLine
sta ParagNo
sta VertPos
bra ParagLoop
NotStart
moveword [ObjPtr]:#P_StartParag,ParagNo
bpl NotEnd
moveword ParagCount,ParagNo
NotEnd
lda ParagNo
beq NoDec
dec ParagNo
NoDec
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
movelong [ParagPtr]:#T_ObjHdl,ObjHdl
moveword [ParagPtr]:#T_ParStart,VertPos
ParagLoop
in ObjHdl:l,ParagNo:w,VertPos:w
out ObjHdl:l,VertPos:w
xcall T_RecutParag
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
tool _DisposeHandle,in=([ParagPtr]:#T_LinesHdl:l)
movelong #0,[ParagPtr]:#T_LinesHdl
moveword [ParagPtr]:#T_LineCount,a
inc ParagNo
cmpw ParagNo,ParagCount
blt ParagLoop
call T_PadThread,in=(ObjHdl:l,VertPos:w)
; Restore from stack
Done
pulllong T_CurParHdl
return
ENDP
;-----------------------------------------------------------------------------
;
; T_Activate (ObjHdl:l,Pt:l) : Drawn:w
;
; ThePoint should be in local coordinates.
;
T_Activate PROC EXPORT
;Using P_Data
;Using P_ObjData
;Using T_Data
input ObjHdl:l,Pt:l
output Drawn:w
local ObjPtr:l,Start:l,End:l
local NewParag:w,NewOffset:w,NewLine:w,NewPixs:w
begin
stz Drawn
lda P_PageMode
jne Exit
call P_CheckHand,in=(#$8000:l)
bcc Cont
call P_ErrorAlert,in=(#1:w)
brl Exit
Cont
movelong [ObjHdl],ObjPtr
movelong [ObjPtr]:#P_StartParag,Start
movelong [ObjPtr]:#P_EndParag,End
movelong [ObjPtr]:#P_ParagHdl,T_CurParHdl
inc T_Editing
stz T_ClickCount
stz T_TextSelect
stzl T_RulDrawn
tool _GetCaretTime,out=(T_CInterval:l)
tool _SetPort,in=(P_CurrentWin:l)
call P_KillUndo
cmpl Start,End
beq Deactivate
in ObjHdl:l,Pt:l
out NewParag:w,NewOffset:w,NewLine:w,NewPixs:w
xcall T_Pt2Offset
call T_OffThread,in=(NewParag:w,NewLine:w),out=(a:w)
bne Deactivate
tool _NewRgn,out=(T_ThreadRgn:l)
call T_ClipThread,in=(ObjHdl:l)
jsl T_Refresh
call T_Click,in=(ObjHdl:l,Pt:l,#0:w,#0:w)
inc Drawn
Exit return
Deactivate
stz T_Editing
stzl T_CurParHdl
bra Exit
ENDP
;-----------------------------------------------------------------------------
;
; T_Deactivate (Refresh:w,OffScreen:w)
;
; Refresh - Refreshes the screen if true.
T_Deactivate PROC EXPORT
;Using P_Data
;Using P_ObjData
;Using T_Data
input Refresh:w,OffScreen:w
begin
lda T_Editing
beq Exit
jsl P_KillUndo
jsl T_InvSelect
jsl P_HideTabs
stz T_Editing
stz T_FontFlags
stzl T_CurParHdl
tool _DisposeRgn,in=(T_ThreadRgn:l)
lda Refresh
beq DoMenus
lda OffScreen
beq On
jsl T_Refresh
bra DoMenus
On call P_DrawContent,in=(#P_ContentRect:l,#0:w)
DoMenus jsl P_FixMenus
Exit return
ENDP
;------------------------------------------------------------------------------
;
; T_ClipThread (ObjHdl:l)
;
T_ClipThread PROC EXPORT
;Using P_ObjData
;Using T_Data
input ObjHdl:l
local ThreadHdl:l,ThreadPtr:l,PThread:l
begin
lda T_Editing
beq Exit
cpzl [ObjHdl]
bne DoIt ;if zero not valid
tool _SetEmptyRgn,in=(T_ThreadRgn:l)
bra Exit
DoIt
movelong ObjHdl,ThreadHdl
Loop
movelong [ThreadHdl],ThreadPtr
movelong [ThreadPtr]:#P_PThread,PThread
cpzl PThread
beq EndLoop
movelong PThread,ThreadHdl
bra Loop
EndLoop
tool _SetEmptyRgn,in=(T_ThreadRgn:l)
call P_AddThreadRgn,in=(ThreadHdl:l,T_ThreadRgn:l)
Exit return
ENDP
;-----------------------------------------------------------------------------
;
; T_Refresh ()
;
T_Refresh PROC EXPORT
;Using P_Data
;Using P_ObjData
;Using T_Data
;Using D_GlobalData
local Port:l,Q_Rect:r
begin
movelong P_CurrentWin,Port
pushlong [Port]:#2 ;D_Save BitMap Ptr
movelong >D_BitMapPtr,[Port]:#2
moverect P_ContentRect,Q_Rect
tool _LocalToGlobal,in=(!Q_Rect:l)
tool _LocalToGlobal,in=(!Q_Rect+4:l)
call D_ClearBitMap,in=(!Q_Rect:l)
call P_DrawContent,in=(#P_ContentRect:l,#0:w)
tool _HideCursor
call D_RectZap,in=(!Q_Rect:l)
tool _ShowCursor
pulllong [Port]:#2 ;Restore BitMap Ptr
moveword #1,>D_BitMapChanged
return
ENDP
;-----------------------------------------------------------------------------
;
; T_Idle (TickCount:l)
;
T_Idle PROC EXPORT
;Using P_Data
;Using T_Data
input TickCount:l
local Diff:l,CTime:l
begin
lda T_TextSelect
bne Exit
sublong TickCount,T_CaretTime,Diff
cmpl Diff,T_CInterval
bcc Exit
movelong TickCount,T_CaretTime
jsl T_BlinkCaret
lda T_CaretDrawn
eor #1
sta T_CaretDrawn
Exit return
ENDP
;------------------------------------------------------------------------------
;
; T_Data
;
T_Data PROC EXPORT
EXPORT T_Editing
EXPORT T_CurParHdl
EXPORT T_TextSelect
EXPORT T_RulDrawn
EXPORT T_RulObj
EXPORT T_ThreadRgn
EXPORT T_CurRulHdl
EXPORT T_CurRulPtr
EXPORT T_CurRulBits
EXPORT T_CurIndent
EXPORT T_Dot
EXPORT T_DotParag
EXPORT T_DotOffset
EXPORT T_DotLine
EXPORT T_DotPixs
EXPORT T_DotObj
EXPORT T_Mark
EXPORT T_MarkParag
EXPORT T_MarkOffset
EXPORT T_MarkLine
EXPORT T_MarkPixs
EXPORT T_MarkObj
EXPORT T_FontFlags
EXPORT T_NewFont
EXPORT T_NewAddStyle
EXPORT T_NewSubStyle
EXPORT T_NewSize
EXPORT T_NewColor
EXPORT T_CurFont
EXPORT T_CurStyleSize
EXPORT T_CurStyle
EXPORT T_CurSize
EXPORT T_CurColor
EXPORT T_MaxAscent
EXPORT T_MaxDescent
EXPORT T_ScalePort
EXPORT T_ScaleLocInfo
EXPORT T_ScaleRect
EXPORT T_LastPos
EXPORT T_LastParag
EXPORT T_LastOffset
EXPORT T_CInterval
EXPORT T_CaretTime
EXPORT T_CaretDrawn
EXPORT T_ClickCount
EXPORT T_BrkFlag
T_Editing DS.B 2 ; True if editing
T_CurParHdl DS.B 4 ; Current thread being operated on
T_TextSelect DS.B 2 ; True if Q_Text is selected
T_RulDrawn DS.B 4 ; Current ruler drawn
T_RulObj DS.B 4 ; Object T_RulDraw is in
T_ThreadRgn DS.B 4 ; Rgn for thread being edited
T_CurRulHdl DS.B 4 ;Vars set by T_LockRuler
T_CurRulPtr DS.B 4
T_CurRulBits DS.B 2
T_CurIndent DS.B 2
T_Dot
T_DotParag DS.B 2
T_DotOffset DS.B 2
T_DotLine DS.B 2
T_DotPixs DS.B 2
T_DotObj DS.B 4
T_Mark
T_MarkParag DS.B 2
T_MarkOffset DS.B 2
T_MarkLine DS.B 2
T_MarkPixs DS.B 2
T_MarkObj DS.B 4
T_FontFlags DS.B 2
T_NewFont DS.B 2 ;The D_New font
T_NewAddStyle DS.B 2 ;D_New styles to add
T_NewSubStyle DS.B 2 ;D_New styles to subtract
T_NewSize DS.B 2 ;D_New Size
T_NewColor DS.B 2 ;NewColor
T_CurFont DS.B 2
T_CurStyleSize
T_CurStyle DS.B 1
T_CurSize DS.B 1
T_CurColor DS.B 2
T_MaxAscent DS.B 2
T_MaxDescent DS.B 2
T_ScalePort DS.B 4
T_ScaleLocInfo DC.W $80 ;PortSCB
DC.L 0 ;PixelImagePtr
DC.W 320 ;Width
T_ScaleRect DC.W 0,0,100,1280 ;BoundsRect
T_LastPos ; ; Last caret position
T_LastParag DS.B 2
T_LastOffset DS.B 2
T_CInterval DS.B 4 ; Time between caret blinks
T_CaretTime DC.L 0 ; Last time caret was drawn
T_CaretDrawn DC.W 0
T_ClickCount DS.B 2
T_BrkFlag DC.W 0
ENDP
;-----------------------------------------------------------------------------
; T_TextEqu
T_TextEqu PROC EXPORT
; Paragraph Info
; RulerInfo
; Q_Line Info
; Q_Text Block Header
; RulBits stuff
ENDP
;-----------------------------------------------------------------------------
;
; ParagHdl --> ParagCount
; Array [1..ParagCount] of ParagInfo
;
; ParagInfo
; TextBlock : long; -- Handle to Q_Text block
; ParOffset : word; -- Offset within Q_Text block
; ParStart : word; -- Top pixel count of paragraph
; RulerHdl : long; -- Handle to ruler
; ParHeight : word; -- Pixel height of paragraph
; LinesHdl : long; -- Handle to lines array
; LineCount : word; -- Number of lines
; ObjHdl : long; -- Object with first Q_Line of parag.
;
;
; RulerInfo
; ParsUsing : word;
; RulBits : word;
; NotUsed : word;
; TabCount : word; ; Does not include Indent.
; Indent : long;
; TabArray : 40 bytes
;
;
;
; LineInfo
; Offset : word;
; Length : word;
; LineWidth : word;
; Ascent : byte;
; Descent : byte;
;
END