mirror of
https://github.com/antoinevignau/source.git
synced 2025-02-08 04:30:38 +00:00
1 line
10 KiB
Plaintext
Executable File
1 line
10 KiB
Plaintext
Executable File
|
|
LOAD 'Macros.dump'
|
|
|
|
INCLUDE 'SS.equ'
|
|
|
|
INCLUDE 'Driver.equ'
|
|
INCLUDE 'Heap.aii.i'
|
|
|
|
;-----------------------------------------------
|
|
;
|
|
; Imported addresses
|
|
;
|
|
;-----------------------------------------------
|
|
|
|
IMPORT D_AlertBox
|
|
IMPORT D_MemoryError
|
|
|
|
IMPORT X_DialogFromScrap
|
|
IMPORT X_GetScrap
|
|
IMPORT X_SSScTypes
|
|
|
|
IMPORT S_AcceptCell
|
|
IMPORT S_ActiveWindow
|
|
IMPORT S_AddCellToChangedList
|
|
IMPORT S_BadPasteMsg
|
|
IMPORT S_BuildSimpleUndo
|
|
IMPORT S_CalculateSheet
|
|
IMPORT S_ChkCellProtect
|
|
IMPORT S_ClearCell
|
|
IMPORT S_CurBRMost
|
|
IMPORT S_CurBRSelect
|
|
IMPORT S_CurEditFlag
|
|
IMPORT S_CurLEHandle
|
|
IMPORT S_CurTLSelect
|
|
IMPORT S_DoChecks
|
|
IMPORT S_DrawLocation
|
|
IMPORT S_ExtraData
|
|
IMPORT S_ExtraDataMsg
|
|
IMPORT S_FixLE
|
|
IMPORT S_GetCellPtr
|
|
IMPORT S_GetDirDlog
|
|
IMPORT S_GetSSScrap
|
|
IMPORT S_HiliteCells
|
|
IMPORT S_PasteValueMsg
|
|
IMPORT S_ProtectedCell
|
|
IMPORT S_ProtectedCellMsg
|
|
IMPORT S_PutSSScrap
|
|
IMPORT S_QTraverse
|
|
IMPORT S_RedrawCellRange
|
|
IMPORT S_ScrapBR
|
|
IMPORT S_ScrapBottom
|
|
IMPORT S_ScrapBuffer
|
|
IMPORT S_ScrapLeft
|
|
IMPORT S_ScrapOrgCell
|
|
IMPORT S_ScrapRight
|
|
IMPORT S_ScrapTL
|
|
IMPORT S_ScrapTop
|
|
IMPORT S_ScrapValue2String
|
|
IMPORT S_SetBRMostCell
|
|
IMPORT S_SetUndoOn
|
|
IMPORT S_SwapIn
|
|
|
|
;----------------------------------------------------------------------------
|
|
; S_PasteValues
|
|
;
|
|
|
|
S_PasteValues PROC EXPORT
|
|
;Using S_ScrapData
|
|
;Using S_CurrentData
|
|
;Using X_ClipData
|
|
;Using SANEequs
|
|
;Using S_ErrorData
|
|
;Using S_ProtectData
|
|
|
|
local ContentIndex:l,Cell:l,CellPtr:l
|
|
local ScrapHandle:l,Buffer:l,SFlag:w
|
|
local TLCell:l,BRCell:l,ScrapLimit:l
|
|
local ContentPtr:l
|
|
local TypeCell:w,Format:l
|
|
local LCell:l,RCell:l,StringPtr:l
|
|
local ContentStart:l,ContentSize:l,CellSize:w
|
|
local ScrapSize:l,ValueSize:l
|
|
error ErrorFlag
|
|
BEGIN +b
|
|
|
|
stz ErrorFlag
|
|
stz ContentIndex
|
|
stz ContentIndex+2
|
|
|
|
Call X_GetScrap,in=(#X_SSScTypes:l),out=(SFlag:w,ScrapHandle:l)
|
|
beq needScrap
|
|
|
|
MoveLong [ScrapHandle],Buffer
|
|
|
|
MoveWord [Buffer]:#S_ScrapParseCode,a
|
|
beq goodScrap
|
|
|
|
needScrap
|
|
Call D_AlertBox,in=(#OkBox:w,#S_PasteValueMsg:l),out=(a:w)
|
|
|
|
lda SFlag
|
|
jeq Quit
|
|
brl Exit
|
|
|
|
goodScrap
|
|
Call S_SwapIn,in=(S_ActiveWindow:l)
|
|
|
|
MoveWord S_CurEditFlag,a
|
|
and #S_EditingBit
|
|
beq notLE
|
|
|
|
Call X_DialogFromScrap
|
|
Tool _LEPaste,in=(S_CurLEHandle:l)
|
|
|
|
brl Exit
|
|
|
|
notLE
|
|
MoveWord S_CurTLSelect,S_ScrapTop
|
|
|
|
AddWord a,[Buffer]:#S_ScrapRows,a
|
|
dec a
|
|
sta S_ScrapBottom
|
|
|
|
MoveWord S_CurTLSelect+2,S_ScrapLeft
|
|
|
|
AddWord a,[Buffer]:#S_ScrapCols,a
|
|
dec a
|
|
sta S_ScrapRight
|
|
|
|
; Is it on the spread sheet ;
|
|
|
|
cmp #703
|
|
bge badPaste
|
|
|
|
CmpWord S_ScrapBottom,#10000
|
|
blt chkProtect
|
|
|
|
badPaste
|
|
Call D_AlertBox,in=(#OkBox:w,#S_BadPasteMsg:l),out=(a:w)
|
|
brl Exit
|
|
|
|
chkProtect
|
|
; Call D_SetCursor,in=(#WatchCursor:w)
|
|
|
|
stz S_ProtectedCell
|
|
stz S_ExtraData
|
|
|
|
in S_ScrapTL:l,S_ScrapBR:l,#S_ChkCellProtect:l
|
|
XCall S_QTraverse
|
|
|
|
bcc chkOtherData
|
|
|
|
Call D_AlertBox,in=(#OkBox:w,#S_ProtectedCellMsg:l),out=(a:w)
|
|
brl Exit
|
|
|
|
chkOtherData
|
|
lda S_ExtraData
|
|
beq DoPaste
|
|
|
|
Call D_AlertBox,in=(#OkCancelBox:w,#S_ExtraDataMsg:l),out=(a:w)
|
|
|
|
cmp #OK
|
|
beq DoPaste
|
|
brl Exit
|
|
|
|
DoPaste
|
|
PushLong S_ScrapTL
|
|
PushLong S_ScrapBR
|
|
|
|
in S_ScrapTL:l,S_ScrapBR:l
|
|
XCall S_BuildSimpleUndo,err=ErrorFlag
|
|
|
|
PullLong S_ScrapBR
|
|
PullLong S_ScrapTL
|
|
jcs pasteError
|
|
|
|
MoveLong ScrapHandle,S_ScrapBuffer
|
|
MoveLong [ScrapHandle],Buffer
|
|
|
|
; do Paste ;
|
|
|
|
SubLong S_ScrapTL,#$10001,S_ScrapOrgCell
|
|
MoveLong [Buffer]:#S_ScrapSize,ScrapLimit
|
|
|
|
MoveWord #S_ScrapCells,ScrapSize
|
|
stz ScrapSize+2
|
|
|
|
MoveLong S_ScrapTL,TLCell
|
|
MoveLong S_ScrapBR,BRCell
|
|
|
|
in TLCell:l,BRCell:l,#S_ClearCell:l
|
|
XCall S_QTraverse,err=ErrorFlag
|
|
jcs Exit
|
|
|
|
stz ValueSize+2
|
|
stz ContentStart+2
|
|
stz ContentSize+2
|
|
|
|
CmpLong ScrapSize,ScrapLimit
|
|
jge chkRedraw
|
|
|
|
|
|
|
|
pasteLoop
|
|
AddLong [ScrapHandle],ScrapSize,Buffer
|
|
|
|
; Figure cell location ;
|
|
|
|
AddLong [Buffer]:#S_ScrapCellLoc,S_ScrapOrgCell,Cell
|
|
|
|
; Get the content of the cell ;
|
|
|
|
MoveWord [Buffer]:#S_ScrapValueSize,a
|
|
and #$00FF
|
|
sta ValueSize
|
|
|
|
AddWord a,#S_ScrapValue,ContentStart
|
|
|
|
MoveWord [Buffer]:#S_ScrapCellSize,CellSize
|
|
SubWord a,ContentStart,ContentSize
|
|
|
|
; Check the format for the cell type ;
|
|
|
|
MoveLong [Buffer]:#S_ScrapFormat,Format
|
|
|
|
MoveWord Format,a
|
|
and #S_CellType
|
|
sta TypeCell
|
|
|
|
jeq copyContent ; cell type text
|
|
|
|
cmp #S_CellTypeValue
|
|
beq noContent
|
|
|
|
cmp #S_CellTypeTextForm
|
|
beq copyValueText
|
|
|
|
; Must be a value formula ;
|
|
|
|
in Buffer:l
|
|
out ContentIndex:l,TypeCell:w
|
|
XCall S_ScrapValue2String,err=ErrorFlag
|
|
jcs pasteError
|
|
|
|
lda Format
|
|
and #$FFFF-S_CellType
|
|
ora TypeCell ; this might be formula
|
|
sta Format ; if NA, ERROR, INF, etc.
|
|
|
|
brl createCell
|
|
|
|
noContent
|
|
stz ContentIndex
|
|
stz ContentIndex+2
|
|
brl createCell
|
|
|
|
copyValueText
|
|
AddLong Buffer,#S_ScrapValueSize,StringPtr
|
|
MoveWord [StringPtr],a
|
|
and #$00FF
|
|
|
|
inc a
|
|
sta ContentSize
|
|
stz ContentSize+2
|
|
|
|
H_NewBlock ContentSize,ContentIndex,ContentPtr,err=ErrorFlag
|
|
jcs pasteError
|
|
|
|
AddLong Buffer,#S_ScrapValueSize,s
|
|
Tool _BlockMove,in=(:l,ContentPtr:l,ContentSize:l)
|
|
|
|
lda Format
|
|
and #$FFFF-S_CellType
|
|
; ora #S_CellTypeText ;= 0
|
|
sta Format
|
|
|
|
bra createCell
|
|
|
|
copyContent
|
|
H_NewBlock ContentSize,ContentIndex,ContentPtr,err=ErrorFlag
|
|
jcs pasteError
|
|
|
|
AddLong [ScrapHandle],ScrapSize,Buffer
|
|
|
|
AddLong ContentStart,Buffer,s
|
|
PushLong ContentPtr
|
|
PushLong ContentSize
|
|
Tool _BlockMove
|
|
|
|
; Get a New cell ;
|
|
|
|
createCell
|
|
in Cell:l,Format:l,ContentIndex:l
|
|
out LCell:l,RCell:l
|
|
XCall S_AcceptCell,err=ErrorFlag
|
|
jcs pasteError
|
|
|
|
; Store the last calculated value ;
|
|
|
|
in Cell:l
|
|
out CellPtr:l
|
|
XCall S_GetCellPtr
|
|
|
|
AddLong [ScrapHandle],ScrapSize,Buffer
|
|
|
|
lda Format
|
|
and #S_CellType
|
|
beq setTextValue
|
|
|
|
AddLong Buffer,#S_ScrapValue,s
|
|
AddLong CellPtr,#S_CellValue,s
|
|
Tool FX2X,in=(:l,:l)
|
|
bra wrapup
|
|
|
|
setTextValue
|
|
MoveLong ContentIndex,[CellPtr]:#S_CellValue
|
|
|
|
wrapUp
|
|
Call S_AddCellToChangedList,in=(Cell:l)
|
|
|
|
lda RCell+2
|
|
cmp S_ScrapRight
|
|
blt OKright
|
|
|
|
sta S_ScrapRight
|
|
|
|
OKright
|
|
lda LCell+2
|
|
cmp S_ScrapLeft
|
|
bge fixSize
|
|
|
|
sta S_ScrapLeft
|
|
|
|
fixSize
|
|
lda CellSize
|
|
AddLong a,ScrapSize,ScrapSize
|
|
|
|
CmpLong ScrapSize,ScrapLimit
|
|
bge chkRedraw
|
|
brl pasteLoop
|
|
|
|
pasteError
|
|
Call D_MemoryError
|
|
|
|
; Redraw the necessary cells ;
|
|
|
|
chkRedraw
|
|
Call S_FixLE
|
|
|
|
redraw
|
|
in S_ScrapTL:l,S_ScrapBR:l
|
|
XCall S_RedrawCellRange
|
|
|
|
Call S_SetUndoOn,in=(#S_UndoPasteValuesType:w)
|
|
|
|
lda S_CurEditFlag
|
|
and #S_ManCalcBit
|
|
bne Exit
|
|
|
|
Call S_CalculateSheet
|
|
|
|
Exit
|
|
Tool _DisposeHandle,in=(ScrapHandle:l)
|
|
|
|
Quit
|
|
RETURN
|
|
ENDP
|
|
|
|
;---------------------------------------------------------------------------
|
|
; S_SelectAll
|
|
;
|
|
|
|
S_SelectAll PROC EXPORT
|
|
;Using S_CurrentData
|
|
|
|
BEGIN +b
|
|
|
|
Call S_SwapIn,in=(S_ActiveWindow:l)
|
|
|
|
MoveWord S_CurEditFlag,a
|
|
and #S_EditingBit
|
|
beq findRange
|
|
|
|
Tool _LEGetTextLen,in=(S_CurLEHandle:l),out=(x:w)
|
|
Tool _LESetSelect,in=(#0:w,x:w,S_CurLEHandle:l)
|
|
bra Exit
|
|
|
|
findRange
|
|
lda S_CurEditFlag
|
|
and #S_BRMostBit
|
|
beq BRset
|
|
|
|
Call S_SetBRMostCell,in=(#0:w)
|
|
|
|
lda #S_BRMostBit
|
|
trb S_CurEditFlag
|
|
|
|
BRset
|
|
Call S_HiliteCells
|
|
|
|
MoveWord #1,S_CurTLSelect
|
|
sta S_CurTLSelect+2
|
|
MoveLong S_CurBRMost,S_CurBRSelect
|
|
|
|
Call S_HiliteCells
|
|
Call S_DoChecks
|
|
|
|
Call S_FixLE
|
|
Call S_DrawLocation
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
|
|
;-----------------------------------------------------------------------------
|
|
; S_Fill
|
|
;
|
|
|
|
S_Fill PROC EXPORT
|
|
;Using S_ScrapData
|
|
;Using S_CurrentData
|
|
;Using S_ErrorData
|
|
|
|
local TLCell:l,LMost:w,RMost:w
|
|
error ErrFlag
|
|
BEGIN +b
|
|
|
|
stz ErrFlag
|
|
|
|
Call S_SwapIn,in=(S_ActiveWindow:l)
|
|
|
|
lda S_CurEditFlag
|
|
and #S_EditingBit
|
|
jne Exit
|
|
|
|
stzl S_ScrapBuffer
|
|
|
|
MoveLong S_CurTLSelect,TLCell
|
|
|
|
MoveWord S_CurTLSelect+2,LMost
|
|
MoveWord S_CurBRSelect+2,RMost
|
|
|
|
CmpWord S_CurTLSelect,S_CurBRSelect
|
|
jeq chkFillCols
|
|
|
|
CmpWord S_CurTLSelect+2,S_CurBRSelect+2
|
|
beq fillRows
|
|
|
|
; Put dialog for choosing row or column fill here ;
|
|
|
|
; direction: 0==Cancel,1==Left,2==Right,3==Up,4==Down
|
|
|
|
Call S_GetDirDlog,in=(#0:w),out=(a:w)
|
|
|
|
jeq Exit ; = cancel
|
|
|
|
cmp #2 ; = right
|
|
jeq chkFillCols
|
|
|
|
cmp #4 ; = down
|
|
jne Exit
|
|
|
|
fillRows
|
|
CmpWord S_CurTLSelect,S_CurBRSelect
|
|
jeq Exit
|
|
|
|
; Call D_SetCursor,in=(#WatchCursor:w)
|
|
|
|
PushWord TLCell+2
|
|
lda TLCell
|
|
inc a
|
|
pha
|
|
|
|
in S_CurBRSelect:l,#S_ChkCellProtect:l
|
|
XCall S_QTraverse
|
|
|
|
bcc contRFill
|
|
|
|
Call D_AlertBox,in=(#OkBox:w,#S_ProtectedCellMsg:l),out=(a:w)
|
|
brl Exit
|
|
|
|
contRFill
|
|
PushWord TLCell+2
|
|
lda TLCell
|
|
inc a
|
|
pha
|
|
Call S_BuildSimpleUndo,in=(:l,S_CurBRSelect:l),err=ErrFlag
|
|
bcs cantFill
|
|
|
|
in S_CurTLSelect:l,S_CurBRSelect+2:w,S_CurTLSelect:w
|
|
out S_ScrapBuffer:l
|
|
XCall S_GetSSScrap,err=ErrFlag
|
|
bcs cantFill
|
|
|
|
pasteRowLoop
|
|
inc TLCell
|
|
|
|
MoveLong TLCell,S_ScrapTL
|
|
Call S_PutSSScrap,err=ErrFlag
|
|
bcs cantFill
|
|
|
|
CmpWord S_ScrapLeft,LMost
|
|
bge chkRight1
|
|
|
|
sta LMost
|
|
|
|
chkRight1
|
|
CmpWord S_ScrapRight,RMost
|
|
blt cont1
|
|
|
|
sta RMost
|
|
|
|
cont1
|
|
CmpWord TLCell,S_CurBRSelect
|
|
blt pasteRowLoop
|
|
brl redraw
|
|
|
|
cantFill
|
|
Call D_MemoryError
|
|
brl redraw
|
|
|
|
chkFillCols
|
|
CmpWord S_CurTLSelect+2,S_CurBRSelect+2
|
|
jeq Exit
|
|
|
|
; Call D_SetCursor,in=(#WatchCursor:w)
|
|
|
|
lda TLCell+2
|
|
inc a
|
|
pha
|
|
PushWord TLCell
|
|
|
|
in S_CurBRSelect:l,#S_ChkCellProtect:l
|
|
XCall S_QTraverse
|
|
|
|
bcc contCFill
|
|
|
|
Call D_AlertBox,in=(#OkBox:w,#S_ProtectedCellMsg:l),out=(a:w)
|
|
brl Exit
|
|
|
|
contCFill
|
|
lda TLCell+2
|
|
inc a
|
|
pha
|
|
PushWord TLCell
|
|
Call S_BuildSimpleUndo,in=(:l,S_CurBRSelect:l),err=ErrFlag
|
|
bcs cantFill2
|
|
|
|
fillCols
|
|
in S_CurTLSelect:l,S_CurTLSelect+2:w,S_CurBRSelect:w
|
|
out S_ScrapBuffer:l
|
|
XCall S_GetSSScrap,err=ErrFlag
|
|
bcc pasteColLoop
|
|
|
|
cantFill2
|
|
brl cantFill
|
|
|
|
pasteColLoop
|
|
inc TLCell+2
|
|
|
|
MoveLong TLCell,S_ScrapTL
|
|
Call S_PutSSScrap,err=ErrFlag
|
|
bcs cantFill2
|
|
|
|
CmpWord S_ScrapLeft,LMost
|
|
bge chkRight2
|
|
|
|
sta LMost
|
|
|
|
chkRight2
|
|
CmpWord S_ScrapRight,RMost
|
|
blt cont2
|
|
|
|
sta RMost
|
|
|
|
cont2
|
|
CmpWord TLCell+2,S_CurBRSelect+2
|
|
blt pasteColLoop
|
|
|
|
redraw
|
|
in LMost:w,S_CurTLSelect:w,RMost:w,S_CurBRSelect:w
|
|
XCall S_RedrawCellRange
|
|
|
|
Call S_SetUndoOn,in=(#S_UndoFillType:w)
|
|
|
|
lda S_CurEditFlag
|
|
and #S_ManCalcBit
|
|
bne killHandle
|
|
|
|
Call S_CalculateSheet
|
|
|
|
killHandle
|
|
lda S_ScrapBuffer
|
|
ora S_ScrapBuffer+2
|
|
beq Exit
|
|
|
|
Tool _DisposeHandle,in=(S_ScrapBuffer:l)
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
END
|
|
|