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

1 line
12 KiB
ArmAsm
Executable File

load 'macros.dump'
include 'driver.equ'
include 'pl.equ'
;-----------------------------------------------
;
; Imported addresses
;
;-----------------------------------------------
IMPORT D_BeachBall
IMPORT D_GetStats
IMPORT D_GetWdth
IMPORT D_GrowLHandle
IMPORT D_MustHandle
IMPORT D_SelectFont
IMPORT T_CurColor
IMPORT T_CurFont
IMPORT T_CurIndent
IMPORT T_CurRulBits
IMPORT T_CurRulPtr
IMPORT T_CurStyle
IMPORT T_CurStyleSize
IMPORT T_GetParPtr
IMPORT T_GetSpacing
IMPORT T_LockRuler
IMPORT T_MaxAscent
IMPORT T_MaxDescent
IMPORT T_MulLine
IMPORT T_UnlockRuler
;------------------------------------------------------------------------------
;
; T_CountSpaces (TextPtr:l,Offset:w,MaxOffset:w) : TabStop:w,Spaces:w
;
T_CountSpaces PROC EXPORT
;Using T_TextEqu
INPUT TextPtr:l,Offset:w,MaxOffset:w
OUTPUT TabStop:w,Spaces:w
BEGIN
stz Spaces
stz TabStop
ldy Offset
CharLoop cpy MaxOffset
bge Exit
lda [TextPtr],y
iny
and #$ff
cmp #SPACE+1
bge CharLoop
cmp #5
bge ChkTab
asl a
tax
jmp (JumpTable,x)
ChkTab
cmp #9
beq DoTab
cmp #13
beq Exit
cmp #32
beq DoSpace
bra Charloop
DoSpace inc Spaces
bra CharLoop
DoTab bra CharLoop
Skip2 iny
Skip1 iny
bra CharLoop
Exit dey
lda [TextPtr],y
and #$ff
cmp #SPACE
bne No
dec Spaces
No RETURN
JumpTable DC.W Exit ; 0
DC.W Skip2 ; 1
DC.W Skip1 ; 2
DC.W Skip1 ; 3
DC.W Skip1 ; 4
ENDP
;-------------------------------------------------------------------------------
;
; T_UseTab (TextPtr:l,Offset:w,CurH:w,MaxH:w,FontId:l,Color:w) : NextH
;
; TextPtr -- Ptr to Q_Text
; Offset -- Offet into Q_Text after tab.
; CurH -- Where Q_Text up to TextPtr ends horiz.
; MaxH -- The right margin
;
; NextH -- -1 -- Try tab on next Q_Line.
; >= 0 -- Where to start putting Q_Text
;
T_UseTab PROC EXPORT
;Using P_Data
;Using T_TextEqu
;Using T_Data
INPUT TextPtr:l,Offset:w,CurH:w,MaxH:w,FontId:l,Color:w
OUTPUT NextH:w
LOCAL RulerPtr:l,FontChanged:w,TabCount:w
LOCAL CurTab:l,TextWidth:w,Room:w,TheChar:w
BEGIN
moveword #-1,NextH
; D_Save these to be restored later
pushword FontId
pushword FontId+2
pushword Color
stz FontChanged
lda T_CurRulBits
and #T_Full+T_left
jeq TreatSpace
movelong T_CurRulPtr,RulerPtr
cmpw CurH,[RulerPtr]:#T_Indent
bge NotIndent
moveword [RulerPtr]:y,CurTab
stz CurTab+2
bra DoTab
NotIndent
; If there are no tab stops, treat as a space
moveword [RulerPtr]:#T_TabCount,TabCount
jeq TreatSpace
; If the first tab stop is greater than MaxH, treat as a space
addwl #T_TabArray,RulerPtr
cmpw [RulerPtr],MaxH
jge TreatSpace
ldx #0
LookTab
cmpw CurH,[RulerPtr]
blt FoundTab
addwl #4,RulerPtr
inx
cpx TabCount
blt LookTab
brl Exit ;Past all tabs, try next Q_Line.
FoundTab
movelong [RulerPtr],CurTab
DoTab
cmpw CurTab,MaxH
bge Exit
sta NextH
lda CurTab+2
beq Exit ;left tab just move over
subword CurTab,CurH,Room
stz TextWidth
CharLoop
moveword [TextPtr]:Offset,a
inc Offset
and #$ff
sta TheChar
cmp #'.'
bne noPer
lda CurTab+2
bpl NormalChar
brl AdjustTab
NoPer
cmp #sp
bcs NormalChar
SpecChar
asl a
tax
jmp (JumpTable,x)
NormalChar
lda FontChanged
beq NoChange
rcall D_SelectFont,in=(FontId:a,FontId+2:x,#0:y)
stz FontChanged
NoChange rcall D_GetWdth,in=(TheChar:a),out=(a:a)
addword a,TextWidth,TextWidth
GotTW
cmp Room
bge MakeCurH
brl CharLoop
AdjustTab
subword Room,TextWidth,a
bpl Okay
lda #0
Okay addword a,CurH,NextH
bra Exit
TreatSpace
rcall D_GetWdth,in=(#SPACE:a),out=(a:a)
addword a,CurH,CurH
cmp MaxH
bge Exit
MakeCurH moveword CurH,NextH
Exit ply
plx
pla
jsl D_SelectFont
RETURN
FChange
moveword [TextPtr]:Offset,FontId
inc Offset
bra ChangeExit
SizeChange
movebyte [TextPtr]:Offset,FontId+3
bra ChangeExit
StyleChange
movebyte [TextPtr]:Offset,FontId+2
bra ChangeExit
ChangeExit
inc Offset
inc FontChanged
brl CharLoop
JumpTable DC.W 0,FChange ;0,1
DC.W StyleChange,SizeChange ;2,3
DC.W ChangeExit,CharLoop ;4,5
DC.W CharLoop,CharLoop ;6,7
DC.W 0,AdjustTab ;8,9
DC.W 0,0 ;a,b
DC.W 0,AdJustTab ;c,d
ENDP
;------------------------------------------------------------------------------
;
; T_CutLine (TextPtr:l,LineNo:w,Offset:w,MaxWidth:w) :
; EndOffset:w,LineWidth:w,HitCR:w
;
T_CutLine PROC EXPORT
;Using P_ObjData
;Using T_Data
;Using T_TextEqu
INPUT TextPtr:l,LineNo:w,Offset:w,MaxWidth:w
OUTPUT EndOffset:w,LineWidth:w,HitCR:w
LOCAL CurWidth:w,Font:w,StyleSize:w
LOCAL MaxAscent:w,MaxDescent:w
LOCAL theChar:w,CharSize:w,FontChanged:w,ValidOffset:w
BEGIN
stz EndOffset
stz CurWidth
stz FontChanged
stz ValidOffset
stz HitCR
lda LineNo
bne NotFirst
moveword T_CurIndent,CurWidth
NotFirst
lda T_CurFont
sta Font
ldx T_CurStyleSize
stx StyleSize
ldy #0
jsl D_SelectFont
rcall D_GetStats,out=(MaxAscent:a,MaxDescent:x)
CharLoop
moveword [TextPtr]:Offset,a
inc Offset
and #$ff
sta theChar
cmp #SPACE+1
blt SpecialCase
ldx FontChanged
beq NoChange
rcall D_SelectFont,in=(Font:a,StyleSize:x,#0:y)
jsl D_GetStats
cmp MaxAscent
blt Smaller1
sta MaxAscent
Smaller1 cpx MaxDescent
blt Smaller2
stx MaxDescent
Smaller2
stz FontChanged
lda theChar
NoChange
cmp #$2D
beq DoHyphen
CheckWidth jsl D_GetWdth
addword a,CurWidth,CurWidth
cmp MaxWidth
bge NoFit
moveword Offset,ValidOffset
bra CharLoop
NoFit lda EndOffset
bne WordBreaks
; went one too far
jsr D_SetStuff
dec EndOffset
lda ValidOffset
beq NoChanges
moveword ValidOffset,EndOffset
NoChanges rcall D_GetWdth,in=(theChar:a),out=(CharSize:a)
subword LineWidth,CharSize,LineWidth
WordBreaks brl EndLine
SpecialCase
cmp #5
bge ChkTab
asl a
tax
jmp (JumpTable,x)
ChkTab
cmp #9
beq DoTab
cmp #13
beq X_DoCR
cmp #32
beq DoSpace
brl Charloop
DoHyphen
rcall D_GetWdth,in=(theChar:a),out=(a:a)
addword a,CurWidth,a
cmp MaxWidth
bge NoFit
sta CurWidth
jsr D_SetStuff
brl CharLoop
DoSpace
jsr D_SetStuff
lda theChar
brl CheckWidth
DoTab
jsr D_SetStuff
in TextPtr:l,Offset:w,CurWidth:w,MaxWidth:w
in StyleSize:w,Font:w,#0:w
out a:w
xcall T_UseTab
bmi TabNext
sta CurWidth
jsr D_SetStuff
brl CharLoop
TabNext dec Offset
jsr D_SetStuff
brl EndLine
X_DoCR
dec Offset
jsr D_SetStuff
inc HitCR
brl EndLine
FontChange moveword [TextPtr]:Offset,Font
inc Offset
bra ChangeExit
StyleChange movebyte [TextPtr]:Offset,StyleSize
bra ChangeExit
SizeChange movebyte [TextPtr]:Offset,StyleSize+1
ChangeExit
inc FontChanged
inc Offset
brl CharLoop
EndLine RETURN
D_SetStuff
moveword Offset,EndOffset
moveword CurWidth,LineWidth
moveword Font,T_CurFont
moveword StyleSize,T_CurStyleSize
moveword MaxAscent,T_MaxAscent
moveword MaxDescent,T_MaxDescent
rts
JumpTable DC.W CharLoop ; 0
DC.W FontChange ; 1
DC.W StyleChange ; 2
DC.W SizeChange ; 3
DC.W ChangeExit ; 4
ENDP
;----------------------------------------------------------------------------
;
; T_CutParag (ObjHdl:l; ParagNo:w; VertPos:w) : EndObjHdl:l,EndVertPos:w
;
; Works on T_CurParHdl.
T_CutParag PROC EXPORT
;Using P_ObjData
;Using T_Data
;Using T_TextEqu
INPUT ObjHdl:l,ParagNo:w,VertPos:w
OUTPUT EndObjHdl:l,EndVertPos:w
ERROR Err
LOCAL ObjPtr:l,ParagPtr:l,TextHdl:l,TextPtr:l
LOCAL NextObj:l,LinesHdl:l,LinePtr:l,Room:w
LOCAL LineCount:w,MaxWidth:w,MaxVert:w,ParHeight:w,LineHeight:w
LOCAL Offset:w,EndOffset:w,LineWidth:w,LineFont:l,HitCR:w
BEGIN
stz Err
stz ParHeight
stz LineCount
moveword #20,Room
call D_MustHandle,in=(#20*T_LineInfoSize:l,#attrLocked+attrPurge1:w),out=LinesHdl:l
movelong [LinesHdl],LinePtr
movelong [ObjHdl],ObjPtr
subword [ObjPtr]:#P_TRect+6,[ObjPtr]:#P_TRect+2,MaxWidth
subword [ObjPtr]:#P_TRect+4,[ObjPtr]:#P_TRect,MaxVert
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
rcall T_LockRuler,in=(ax:ax)
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
movelong ObjHdl,[ParagPtr]:#T_ObjHdl
moveword VertPos,[ParagPtr]:#T_ParStart
movelong [ParagPtr]:#T_TextBlock,TextHdl
tool _HLock,in=(TextHdl:l)
movelong [TextHdl],TextPtr
moveword [ParagPtr]:#T_ParOffset,a
addwl a,TextPtr
movelong [TextPtr],T_CurFont
rcall D_SelectFont,in=(T_CurFont:a,T_CurStyle:x,#0:y)
moveword #T_ParHeader,Offset
LineLoop
movelong T_CurFont,LineFont
CutLine
in TextPtr:l,LineCount:w,Offset:w,MaxWidth:w
out EndOffset:w,LineWidth:w,HitCR:w
xcall T_CutLine
rcall T_GetSpacing,in=(T_CurRulBits:a,T_MaxAscent:x,T_MaxDescent:y)
addword a,T_MaxAscent,a
addword a,T_MaxDescent,LineHeight
addword a,VertPos,a
cmp MaxVert
bge NextObject
jsr SetLine
lda HitCR
beq LineLoop
ToDone brl Done
NextObject
movelong [ObjHdl],ObjPtr
movelong [ObjPtr]:#P_NThread,NextObj
cpzl NextObj
bne NextOkay
cmpw VertPos,MaxVert
bge OverFlow
moveword ParagNo,[ObjPtr]:#P_EndParag
moveword LineCount,[ObjPtr]:#P_EndLine
bra OverFlow
NextOkay
moveword ParagNo,[ObjPtr]:#P_EndParag
moveword LineCount,[ObjPtr]:#P_EndLine
movelong NextObj,ObjHdl
movelong [ObjHdl],ObjPtr
moveword ParagNo,[ObjPtr]:#P_StartParag
moveword LineCount,[ObjPtr]:#P_StartLine
subword [ObjPtr]:#P_TRect+6,[ObjPtr]:#P_TRect+2,MaxWidth
subword [ObjPtr]:#P_TRect+4,[ObjPtr]:#P_TRect,MaxVert
stz VertPos
movelong LineFont,T_CurFont
brl CutLine
OverFlow
jsr SetLine
Done
movelong ObjHdl,EndObjHdl
moveword VertPos,EndVertPos
rcall T_MulLine,in=(LineCount:a),out=(a:a)
tool _SetHandleSize,in=(#0:w,a:w,LinesHdl:l)
call T_UnlockRuler
tool _HUnlock,in=(TextHdl:l)
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
moveword ParHeight,[ParagPtr]:#T_ParHeight
moveword LineCount,[ParagPtr]:#T_LineCount
movelong LinesHdl,[ParagPtr]:#T_LinesHdl
Exit
RETURN
SetLine
cmpw LineCount,Room
blt NoGrow
addword LineCount,#20,a
jsl T_MulLine
call D_GrowLHandle,in=(#0:w,a:w,LinesHdl:l),out=LinePtr:l,err=Err
jcs LocExit
rcall T_MulLine,in=(LineCount:a)
addwl a,LinePtr
NoGrow
addword LineHeight,VertPos,VertPos
addword LineHeight,ParHeight,ParHeight
inc LineCount
moveword Offset,[LinePtr]:#T_Offset
subword EndOffset,Offset,[LinePtr]:#T_Length
moveword LineWidth,[LinePtr]:#T_LineWidth
shortm
moveword T_MaxAscent,[LinePtr]:#T_Ascent
moveword T_MaxDescent,[LinePtr]:#T_Descent
longm
moveword EndOffset,Offset
addwl #T_LineInfoSize,LinePtr
LocExit rts
ENDP
;-------------------------------------------------------------------------------
;
; T_RecutParag (ObjHdl:l,ParagNo:w;StartVert:w) : EndObjHdl:l,EndVert:w
;
T_RecutParag PROC EXPORT
;Using T_Data
;Using T_TextEqu
;Using P_ObjData
INPUT ObjHdl:l,ParagNo:w,StartVert:w
OUTPUT EndObjHdl:l,EndVert:w
LOCAL ParagPtr:l,ParHeight:w,LinesHdl:l
BEGIN
jsl D_BeachBall
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
movelong [ParagPtr]:#T_LinesHdl,LinesHdl
cpzl LinesHdl
beq NoDispose
tool _DisposeHandle,in=(LinesHdl:l)
NoDispose
in ObjHdl:l,ParagNo:w,StartVert:w
out EndObjHdl:l,EndVert:w
xcall T_CutParag
rcall T_GetParPtr,in=(ParagNo:a),out=(ParagPtr:ax)
tool _HUnlock,in=([ParagPtr]:#T_LinesHdl:l)
RETURN
ENDP
;------------------------------------------------------------------------------;
;
; T_TrackFont (TextPtr:l, StopOffset:w)
;
; Track a font from the start of the paragragh pointed to by TextPtr
;
T_TrackFont PROC EXPORT
;Using T_Data
;Using T_TextEqu
INPUT TextPtr:l,StopOffset:w
BEGIN
moveword [TextPtr]:#T_ParFont,T_CurFont
moveword [TextPtr]:#T_ParStyle,T_CurStyleSize
moveword [TextPtr]:#T_ParColor,a
and #$ff
sta T_CurColor
ldy #T_ParHeader
CharLoop
cpy StopOffset
bge Exit
lda [TextPtr],y
iny
and #$ff
cmp #T_ColorChange+1
bge CharLoop
asl a
tax
jmp (JumpTable,x)
FontChange
moveword [TextPtr]:y,T_CurFont
iny
iny
bra CharLoop
StyleChange
shortm
moveword [TextPtr]:y,T_CurStyleSize
longm
iny
bra CharLoop
SizeChange
shortm
moveword [TextPtr]:y,T_CurStyleSize+1
longm
iny
bra CharLoop
ColorChange
shortm
moveword [TextPtr]:y,T_CurColor
longm
iny
bra CharLoop
Exit RETURN
JumpTable DC.W Exit
DC.W FontChange
DC.W StyleChange
DC.W SizeChange
DC.W ColorChange
ENDP
END