antoine-source/appleworksgs/SS/Src/Update.aii
2023-03-04 03:45:20 +01:00

1 line
13 KiB
Plaintext
Executable File

LOAD 'Macros.dump'
INCLUDE 'SS.equ'
; INCLUDE 'Driver.equ'
; INCLUDE 'Heap.aii.i'
;-----------------------------------------------
;
; Imported addresses
;
;-----------------------------------------------
IMPORT D_FastMult
IMPORT S_CellWidth
IMPORT S_ColLabRect
IMPORT S_CurBScrl
IMPORT S_CurContHt
IMPORT S_CurContRect
IMPORT S_CurContWd
IMPORT S_CurContXpt
IMPORT S_CurContYpt
IMPORT S_CurEditRect
IMPORT S_CurLEHandle
IMPORT S_CurMaxTLCell
IMPORT S_CurTLCell
IMPORT S_CurVPageSize
IMPORT S_DrawBorders
IMPORT S_DrawBothTitles
IMPORT S_DrawColLabels
IMPORT S_DrawColTitles
IMPORT S_DrawRegion
IMPORT S_DrawRowLabels
IMPORT S_DrawRowTitles
IMPORT S_RowLabRect
IMPORT S_SetVertLines
IMPORT S_SwapIn
IMPORT S_WhichCell
;-----------------------------------------------
;
; Forward addresses and entries
;
;-----------------------------------------------
ENTRY S_ScrlUpdate
;-------------------------------------------------------------------------;
; S_HScrlAction ( PartCode:word, ControlHandle:long ): Result:word
;
;
S_HScrlAction PROC EXPORT
;Using S_CurrentData
input PartCode:w,ControlHandle:l
output Result:w
local MaxColumn:w,Workspace:w,Value:w,Temp:w
local ScrollRect:r,UpdateRgn:l,dh:w
BEGIN +b
; Determine if the part is the thumb, or meaningless.
lda PartCode
cmp #5
blt Exit
cmp #9
bge Exit
; Get the scroll bars current value.
out Value:w
in ControlHandle:l
XTool _GetCtlValue
; Call the appropriate subroutine depending on which partcode
; is passed.
lda PartCode
sec
sbc #5
asl a
tax
jsr (HScrollTable,x)
Exit Return
HScrollTable
DC.W hScrlLf
DC.W hScrlRt
DC.W hPageLf
DC.W hPageRt
;-----------------------------------------------------------------------------
; All of the entry points must make sure that dh contains the
; number of Pixels to scroll, value contains the New value for
; the scroll bar, and Temp contains the New column for the New
; TLCell
hScrlLf
lda S_CurTLCell+2
dec a
sta Temp
jeq quit
Call S_CellWidth,in=(a:w),out=(dh:w)
dec Value
jmp hScrollRect
hPageLf
SubWord S_CurContWd,S_CurContXpt,Workspace
lda S_CurTLCell+2
sta Temp
stz dh
bra cond1
loop1
Call S_CellWidth,in=(Temp:w),out=(a:w)
AddWord a,dh,a
cmp Workspace
bge full1
sta dh
dec Value
cond1 dec Temp
bne loop1
endloop1
inc Temp
lda dh
jeq quit
jmp hScrollRect
full1
tay ; a = next divider
inc Temp
lda dh
jne hScrollRect
MoveWord y,dh
dec Value
dec Temp
jmp hScrollRect
;------------------------------------------
hScrlRt
MoveWord S_CurTLCell+2,Temp
CmpWord S_CurMaxTLCell+2,Temp
jeq quit
Call S_CellWidth,in=(Temp:w),out=(a:w)
eor #$FFFF ; make a 2's comp neg number
inc a
sta dh
inc Temp
inc Value
jmp hScrollRect
hPageRt
MoveWord S_CurMaxTLCell+2,MaxColumn
SubWord S_CurContXpt,S_CurContWd,Workspace
stz dh
MoveWord S_CurTLCell+2,Temp
bra cond2
loop2
Call S_CellWidth,in=(Temp:w),out=(:w)
SubWord dh,s,a
cmp Workspace
blt full2
beq full2
sta dh
inc Value
inc Temp
cond2
CmpWord Temp,MaxColumn
blt loop2
endloop2
lda dh
jeq quit
jmp hScrollRect
full2
tay ; a = next divider
lda dh
bne hScrollRect
MoveWord y,dh
inc Value
inc Temp
;------------------------------------------
hScrollRect
MoveWord Temp,S_CurTLCell+2
Tool _SetCtlValue,in=(Value:w,ControlHandle:l)
MoveWord #S_EditHeight+2,ScrollRect
AddWord S_CurContXpt,#2,ScrollRect+2
MoveLong S_CurContRect+4,ScrollRect+4
Tool _NewRgn,out=(UpdateRgn:l)
Tool _ScrollRect,in=(!ScrollRect:l,dh:w,#0:w,UpdateRgn:l)
Call S_ScrlUpdate,in=(UpdateRgn:l)
Tool _DisposeRgn,in=(UpdateRgn:l)
quit
rts
ENDP
;-------------------------------------------------------------------------;
; S_ScrlUpdate ( Region:l )
;
; S_ScrlUpdate will Update the current graf port after scrolling has been
; done, according to the current sheet.
S_ScrlUpdate PROC EXPORT
;Using S_CurrentData
input Region:l
local FCell:l,LCell:l,Xpt:w,Ypt:w,RgnPtr:l
local Xpt2:w,Ypt2:w,OldClipRgn:l
local OffBottom:w,OffRight:w,Rect:r,RectPtr:l
BEGIN
Tool _EmptyRgn,in=(Region:l),out=(a:w)
jne Exit
Tool _NewRgn,out=(OldClipRgn:l)
Tool _GetClip,in=(OldClipRgn:l)
Tool _SetClip,in=(Region:l)
stz OffBottom
stz OffRight
MoveLong [Region],RgnPtr
; Determine the range to Update, and their coordinates ;
in [RgnPtr]:#2:l
out FCell:l,Xpt:w,Ypt:w
XCall S_WhichCell
; in [RgnPtr]:#6:l
; out LCell:l,Xpt2:w,Ypt2:w
; XCall S_WhichCell
SpaceLong
SpaceWord
SpaceWord
MoveWord [RgnPtr]:#8,a ; The right and bottom sides
cmp #2
blt push1
cmp S_CurContWd
bge push1
dec a ; of the Region are shortened
dec a ; so that on left and up
push1
pha ; scrolling, only the number
MoveWord [RgnPtr]:#6,a ; rows or cols inserted are
beq push2
cmp S_CurContHt
bge push2
dec a ; drawn.
; dec a ; (mistake)
push2
pha
jsl S_WhichCell
PullWord Ypt2
PullWord Xpt2
PullLong LCell
; Check to see if either the right or bottom edges show ;
lda LCell
cmp #10000 ; first non-row
blt OK1
sta OffBottom
MoveWord #9999,LCell
OK1
lda LCell+2
cmp #$02BF ; first non-col
blt OK2
sta OffRight
MoveWord #$02BE,LCell+2
OK2
; Make the second coordinates Point to the bottom right corner,
; instead of the top right.
lda OffBottom
bne skip1
AddWord Ypt2,#S_RowHeight,Ypt2
skip1
lda OffRight
bne skip2
Call S_CellWidth,in=(LCell+2:w),out=(:w)
AddWord s,Xpt2,Xpt2
skip2
; Redraw any label Rects necessary ;
; MoveWord S_CurContWd,S_ColLabRect+6
Tool _RectInRgn,in=(#S_ColLabRect:l,Region:l),out=(a:w)
beq skip3
in Xpt:w,FCell+2:w,LCell+2:w
XCall S_DrawColLabels
skip3
MoveLong !Rect,RectPtr
MoveWord #S_EditHeight+S_ColLabelHeight,Rect
MoveWord S_CurContXpt,Rect+2
MoveWord S_CurContYpt,Rect+4
MoveWord S_CurContWd,Rect+6
Tool _RectInRgn,in=(RectPtr:l,Region:l),out=(a:w)
beq skip4
in Xpt:w,FCell+2:w,LCell+2:w
XCall S_DrawColTitles
skip4
MoveWord #S_EditHeight,Rect
stz Rect+2
MoveWord S_CurContYpt,Rect+4
MoveWord S_CurContXpt,Rect+6
Tool _RectInRgn,in=(RectPtr:l,Region:l),out=(a:w)
beq skip5
Call S_DrawBothTitles
skip5
; MoveWord S_CurContHt,S_RowLabRect+4
Tool _RectInRgn,in=(#S_RowLabRect:l,Region:l),out=(a:w)
beq skip6
in Ypt:w,FCell:w,LCell:w
XCall S_DrawRowLabels
skip6
MoveWord S_CurContYpt,Rect
MoveWord #S_NumLabelWidth,Rect+2
MoveWord S_CurContHt,Rect+4
MoveWord S_CurContXpt,Rect+6
Tool _RectInRgn,in=(RectPtr:l,Region:l),out=(a:w)
beq skip7
in Ypt:w,FCell:w,LCell:w
XCall S_DrawRowTitles
skip7
; Draw the cells ;
lda OffRight
ora OffBottom
beq borderDone
in OffRight:w,OffBottom:w,Xpt2:w,Ypt2:w
XCall S_DrawBorders
borderDone
in Xpt2:w,Ypt2:w,Xpt:w,Ypt:w
in FCell:l,LCell:l,#1:w
in S_CurContXpt:w
XCall S_DrawRegion
; Clean Up ;
Tool _SetClip,in=(OldClipRgn:l)
Tool _DisposeRgn,in=(OldClipRgn:l)
Exit
RETURN
ENDP
;-------------------------------------------------------------------------;
; S_Thumb ( Control:l )
;
; S_Thumb will handle moving the thumb in any of the scroll bars.
S_Thumb PROC EXPORT
;Using S_CurrentData
input Control:l
local ScrollRect:r,UpdateRgn:l,CtrlValue:w
local dh:w,dv:w,OldTLRow:w,OldTLCol:w,WorkCol:w
local negDH:w
BEGIN
stz negDH
stz dh
stz dv
Tool _GetCtlValue,in=(Control:l),out=(CtrlValue:w)
; Determine which scroll bar has been affected ;
CmpLong Control,S_CurBScrl
beq doHthumb
doVthumb
; Reset S_CurTLCell and set the Update Region ;
MoveWord S_CurTLCell,OldTLRow
lda CtrlValue
inc a
sta S_CurTLCell
SubWord a,OldTLRow,a
jeq Exit
eor #-1 ; negate the answer
inc a
tay ; calculate dv
ldx #S_RowHeight
Call D_FastMult
sta dv
lda S_CurContYpt
inc a
sta ScrollRect
stz ScrollRect+2
brl rgnSet
doHthumb
; Reset S_CurTLCell and set the Update Region ;
MoveWord S_CurTLCell+2,OldTLCol
lda CtrlValue
inc a
sta S_CurTLCell+2
cmp OldTLCol
jeq Exit
blt includeDest
; The original TLCell is to the left
inc negDH
tax
MoveWord OldTLCol,WorkCol
stx OldTLCol
bra startLoop
; The New TLCell is to the left
includeDest
sta WorkCol
startLoop
Call S_CellWidth,in=(WorkCol:w),out=(dh:w)
hLoop
inc WorkCol
CmpWord WorkCol,OldTLCol
beq doneLoop
Call S_CellWidth,in=(WorkCol:w),out=(:w)
AddWord s,dh,dh
cmp S_CurContWd
blt hLoop
doneLoop
lda negDH
beq finishHthumb
lda dh ; negate dh
eor #-1
inc a
sta dh
finishHthumb
Call S_SetVertLines
MoveWord #S_EditHeight+2,ScrollRect
AddWord S_CurContXpt,#2,ScrollRect+2
rgnSet
MoveLong S_CurContRect+4,ScrollRect+4
; Do the content Update ;
Tool _NewRgn,out=(UpdateRgn:l)
Tool _ScrollRect,in=(!ScrollRect:l,dh:w,dv:w,UpdateRgn:l)
Call S_ScrlUpdate,in=(UpdateRgn:l)
Tool _DisposeRgn,in=(UpdateRgn:l)
Exit RETURN
ENDP
;-------------------------------------------------------------------------;
; S_UpdateDoc ( Window:l )
;
; S_UpdateDoc will Update the given window.
S_UpdateDoc PROC EXPORT
;Using S_CurrentData
input Window:l
local ClipRect:r
local ClipRgn:l,LongTemp:l,SUpdateRgn:l
BEGIN +b
; Swap in sheet to Update ;
Call S_SwapIn,in=(Window:l)
; Draw the controls ;
Tool _DrawControls,in=(Window:l)
Tool _EraseRect,in=(#S_CurEditRect:l)
Tool _LEUpdate,in=(S_CurLEHandle:l)
; Draw the Seperator Line between the edit field and the sheet ;
Tool _SetPenSize,in=(#S_ThickPen:l)
Tool _MoveTo,in=(#0:w,#S_EditHeight:w)
AddWord S_CurContWd,#S_GrowWidth,s
Tool _LineTo,in=(:w,#S_EditHeight:w)
Tool _SetPenSize,in=(#S_NormalPen:l)
; Everything drawn after this Point must be clipped to the
; content area
Tool _NewRgn,out=(ClipRgn:l)
; Tool _GetClip,in=(ClipRgn:l)
Tool _GetVisRgn,in=(ClipRgn:l)
MoveWord #S_EditHeight+2,ClipRect
stz ClipRect+2
MoveWord S_CurContHt,ClipRect+4
MoveWord S_CurContWd,ClipRect+6
Tool _NewRgn,out=(SUpdateRgn:l)
Tool _RectRgn,in=(SUpdateRgn:l,!ClipRect:l)
Tool _SectRgn,in=(SUpdateRgn:l,ClipRgn:l,SUpdateRgn:l)
Call S_ScrlUpdate,in=(SUpdateRgn:l)
; Clean up ;
; Tool _SetClip,in=(ClipRgn:l)
Tool _DisposeRgn,in=(ClipRgn:l)
Tool _DisposeRgn,in=(SUpdateRgn:l)
RETURN
ENDP
;-------------------------------------------------------------------------;
; S_VScrlAction ( PartCode:word, ControlHandle:long ): Result:word
;
;
S_VScrlAction PROC EXPORT
;Using S_CurrentData
input PartCode:w,ControlHandle:l
output Result:w
local MaxValue:w,ViewSize:w,DataSize:w,Value:w
local ScrollSize:w,ScrollRect:r,UpdateRgn:l,dv:w
BEGIN +b
; Determine if the part is the thumb, or meaningless.
lda PartCode
cmp #5
blt Exit
cmp #9
bge Exit
; Determine the maximum value for the scroll bar.
lda S_CurMaxTLCell
dec a
sta MaxValue
; Get the scroll bars current value.
in ControlHandle:l
out Value:w
XTool _GetCtlValue
; Call the appropriate subroutine depending on which partcode
; is passed.
lda PartCode
sec
sbc #5
asl a
tax
jsr (VScrollTable,x)
Exit Return
VScrollTable
DC.W vScrlUp
DC.W vScrlDn
DC.W vPageUp
DC.W vPageDn
;-----------------------------------------------------------------------------
vScrlUp
lda #1
bra vUpMain
vPageUp
lda S_CurVPageSize
vUpMain ; 'a' contains number of
sta ScrollSize ; rows to scroll up
lda Value
jeq quit
cmp ScrollSize
blt vupto0
SubWord a,ScrollSize,Value
bra vScrollRect
vupto0
sta ScrollSize
stz Value
bra vScrollRect
;------------------------------------------
vScrlDn lda #1
bra vDnMain
vPageDn lda S_CurVPageSize
vDnMain ; 'a' contains the number
sta ScrollSize ; of rows to scroll down
lda Value
cmp MaxValue
jeq quit
AddWord a,ScrollSize,a
cmp MaxValue
bge vdntoend
sta Value
bra vdnnormal
vdntoend
SubWord MaxValue,Value,ScrollSize
MoveWord MaxValue,Value
vdnnormal
lda ScrollSize
eor #$FFFF ; dn -> negative disp.
inc a
sta ScrollSize
;------------------------------------------
; ScrollSize contains the number of rows to scroll, and
; Value contains the New value for the scroll control.
vScrollRect
; Multiply the number of rows to scroll by #S_RowHeight.
; This multiply works for negative numbers, too.
ldy ScrollSize
ldx #S_RowHeight
Call D_FastMult
sta dv
; Update the window variables ;
SubWord S_CurTLCell,ScrollSize,S_CurTLCell
Tool _SetCtlValue,in=(Value:w,ControlHandle:l)
; Scroll the contents of the window ;
lda S_CurContYpt
inc a
sta ScrollRect
stz ScrollRect+2
MoveLong S_CurContRect+4,ScrollRect+4
Tool _NewRgn,out=(UpdateRgn:l)
Tool _ScrollRect,in=(!ScrollRect:l,#0:w,dv:w,UpdateRgn:l)
Call S_ScrlUpdate,in=(UpdateRgn:l)
Tool _DisposeRgn,in=(UpdateRgn:l)
quit rts
ENDP
END