mirror of
https://github.com/antoinevignau/source.git
synced 2025-01-04 04:31:04 +00:00
1 line
13 KiB
Plaintext
Executable File
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
|
|
|