mirror of
https://github.com/antoinevignau/source.git
synced 2025-01-04 04:31:04 +00:00
1 line
25 KiB
Plaintext
Executable File
1 line
25 KiB
Plaintext
Executable File
|
|
LOAD 'Macros.dump'
|
|
|
|
INCLUDE 'SS.equ'
|
|
|
|
INCLUDE 'Driver.equ'
|
|
INCLUDE ':::Scrap:Scrap.equ'
|
|
INCLUDE 'Heap.aii.i'
|
|
INCLUDE 'Eval.aii.i'
|
|
|
|
;-----------------------------------------------
|
|
;
|
|
; Imported addresses
|
|
;
|
|
;-----------------------------------------------
|
|
|
|
IMPORT D_AlertBox
|
|
IMPORT D_BeachBall
|
|
IMPORT D_BitMapChanged
|
|
IMPORT D_BitMapPtr
|
|
IMPORT D_GrowHandle
|
|
IMPORT D_MemoryError
|
|
IMPORT D_NeedHand
|
|
IMPORT D_SetFileChanged
|
|
IMPORT D_SetUndoStr
|
|
|
|
IMPORT X_DialogFromScrap
|
|
IMPORT X_DisposeScrap
|
|
IMPORT X_PostScrap
|
|
|
|
IMPORT S_AcceptCell
|
|
IMPORT S_ActiveWindow
|
|
IMPORT S_AddCellToChangedList
|
|
IMPORT S_BadPasteMsg
|
|
IMPORT S_BuildSimpleUndo
|
|
IMPORT S_CalculateSheet
|
|
IMPORT S_CellWidth
|
|
IMPORT S_ChkCellProtect
|
|
IMPORT S_CurBRSelect
|
|
IMPORT S_CurContHt
|
|
IMPORT S_CurContWd
|
|
IMPORT S_CurContXpt
|
|
IMPORT S_CurContYpt
|
|
IMPORT S_CurDefFormat
|
|
IMPORT S_CurEditFlag
|
|
IMPORT S_CurEditRect
|
|
IMPORT S_CurHeap
|
|
IMPORT S_CurLEHandle
|
|
IMPORT S_CurTLSelect
|
|
IMPORT S_CurWindow
|
|
IMPORT S_ErrorFormula
|
|
IMPORT S_ErrorFormulaLength
|
|
IMPORT S_ExtraData
|
|
IMPORT S_ExtraDataMsg
|
|
IMPORT S_FixLE
|
|
IMPORT S_GetCellIndex
|
|
IMPORT S_GetRealCell
|
|
IMPORT S_INFFormula
|
|
IMPORT S_INFFormulaLength
|
|
IMPORT S_NAFormula
|
|
IMPORT S_NAFormulaLength
|
|
IMPORT S_NegINFFormula
|
|
IMPORT S_NegINFFormulaLength
|
|
IMPORT S_NewLineEdit
|
|
IMPORT S_ParseText
|
|
IMPORT S_ProtectedCell
|
|
IMPORT S_ProtectedCellMsg
|
|
IMPORT S_QTraverse
|
|
IMPORT S_RedrawCellRange
|
|
IMPORT S_RemoveCell
|
|
IMPORT S_SetUndoOn
|
|
IMPORT S_SwapIn
|
|
IMPORT S_SwapOut
|
|
IMPORT S_UndoHandle
|
|
IMPORT S_UndoNames
|
|
IMPORT S_UndoType
|
|
IMPORT S_WhichCell
|
|
|
|
;-----------------------------------------------
|
|
;
|
|
; Forward addresses and entries
|
|
;
|
|
;-----------------------------------------------
|
|
|
|
ENTRY S_AddBufferToScrap
|
|
ENTRY S_CheckFormula
|
|
ENTRY S_ClearCell
|
|
ENTRY S_CopyFrame
|
|
ENTRY S_CopyRect
|
|
ENTRY S_GetSSScrap
|
|
ENTRY S_Image
|
|
ENTRY S_PutSSScrap
|
|
ENTRY S_ScrapBR
|
|
ENTRY S_ScrapLeft
|
|
ENTRY S_ScrapRight
|
|
ENTRY S_ScrapTL
|
|
ENTRY S_SetImage
|
|
|
|
;-------------------------------------------------------------------------;
|
|
; S_Clear
|
|
;
|
|
; S_Clear will clear the currently selected item(s) from the active
|
|
; document.
|
|
|
|
S_Clear PROC EXPORT
|
|
;Using S_ScrapData
|
|
;Using S_CurrentData
|
|
;Using S_ProtectData
|
|
;Using S_ErrorData
|
|
|
|
error ErrFlag
|
|
BEGIN +b
|
|
|
|
stz ErrFlag
|
|
|
|
Call S_SwapIn,in=(S_ActiveWindow:l)
|
|
|
|
lda S_CurEditFlag
|
|
and #S_EditingBit
|
|
beq notLE
|
|
|
|
Tool _LEDelete,in=(S_CurLEHandle:l)
|
|
brl Exit
|
|
|
|
notLE
|
|
in S_CurTLSelect:l,S_CurBRSelect:l,#S_ChkCellProtect:l
|
|
XCall S_QTraverse
|
|
|
|
bcc contClear
|
|
|
|
Call D_AlertBox,in=(#OkBox:w,#S_ProtectedCellMsg:l),out=(a:w)
|
|
brl Exit
|
|
|
|
contClear
|
|
MoveLong S_CurTLSelect,S_ScrapTL
|
|
MoveLong S_CurBRSelect,S_ScrapBR
|
|
|
|
in S_CurTLSelect:l,S_CurBRSelect:l
|
|
XCall S_BuildSimpleUndo,err=ErrFlag
|
|
bcs memError
|
|
|
|
Call S_QTraverse,in=(S_ScrapTL:l,S_ScrapBR:l,#S_ClearCell:l)
|
|
bcc redraw
|
|
|
|
memError
|
|
Call D_MemoryError
|
|
|
|
redraw
|
|
ldx #0
|
|
Call S_NewLineEdit,in=(x:w,x:w)
|
|
|
|
in S_ScrapTL:l,S_ScrapBR:l
|
|
XCall S_RedrawCellRange
|
|
|
|
Call S_SetUndoOn,in=(#S_UndoClearType:w)
|
|
|
|
lda S_CurEditFlag
|
|
and #S_ManCalcBit
|
|
bne Exit
|
|
|
|
Call S_CalculateSheet
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
|
|
;-------------------------------------------------------------------------
|
|
;
|
|
;
|
|
|
|
S_ClearCell PROC EXPORT
|
|
;Using S_ScrapData
|
|
|
|
input Cell:l,CellIndex:l
|
|
error ErrorFlag
|
|
BEGIN
|
|
|
|
; Note: cells will be added to ChangedList in S_RemoveCell
|
|
|
|
; Another Note: There is no need to execute this code on pad or empty
|
|
; cells. Put in branch around in that case.
|
|
|
|
ldx #S_CellTypeEmpty
|
|
in Cell:l,x:w,x:w,x:w,x:w
|
|
out :l,:l
|
|
XCall S_AcceptCell,err=ErrorFlag
|
|
|
|
fixLRCells
|
|
pla
|
|
pla
|
|
cmp S_ScrapRight
|
|
blt OKright
|
|
|
|
sta S_ScrapRight
|
|
|
|
OKright
|
|
pla
|
|
pla
|
|
cmp S_ScrapLeft
|
|
bge Exit
|
|
|
|
sta S_ScrapLeft
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
|
|
;-------------------------------------------------------------------------;
|
|
; S_Copy (Window:l): ImageRoutine:l, Type:w, Scrap:l
|
|
;
|
|
; S_Copy will perform a copy of the currently selected item(s) in the given
|
|
; document. The output routine draws an image of the scrap for dragging and
|
|
; is defined:
|
|
;
|
|
; ImageRoutine(where:L) - draws the shape at where
|
|
;
|
|
; The routine should use the current port and penmode (don't change either).
|
|
; Pass back a 0 type for no scrap.
|
|
|
|
S_Copy PROC EXPORT
|
|
;Using S_CurrentData
|
|
;Using X_ClipData
|
|
|
|
input Window:l
|
|
output ImageRoutine:l,SType:w,ScrapHandle:l
|
|
local ScrapLen:l,LEScrapHandle:l
|
|
error ErrorFlag
|
|
BEGIN +b
|
|
|
|
stz ErrorFlag
|
|
|
|
Call S_SwapIn,in=(Window:l)
|
|
|
|
MoveWord #0,SType
|
|
|
|
Call S_SetImage,in=(S_CurTLSelect:l,S_CurBRSelect:l)
|
|
MoveLong #S_Image,ImageRoutine
|
|
|
|
lda S_CurEditFlag
|
|
and #S_EditingBit
|
|
beq notLE
|
|
|
|
Tool _LECopy,in=(S_CurLEHandle:l),err=ErrorFlag
|
|
jcs Exit
|
|
|
|
Tool _LEGetScrapLen,out=(a:w)
|
|
beq Exit
|
|
|
|
sta ScrapLen
|
|
stz ScrapLen+2
|
|
|
|
in ScrapLen:l
|
|
out ScrapHandle:l
|
|
XCall D_NeedHand,err=ErrorFlag
|
|
bcs Exit
|
|
|
|
Tool _LEScrapHandle,out=(LEScrapHandle:l),err=ErrorFlag
|
|
|
|
in [LEScrapHandle]:l,[ScrapHandle]:l,ScrapLen:l
|
|
XTool _BlockMove
|
|
|
|
MoveWord #AsciiText,SType
|
|
bra Exit
|
|
|
|
notLE
|
|
in S_CurTLSelect:l,S_CurBRSelect:l
|
|
out ScrapHandle:l
|
|
XCall S_GetSSScrap,err=ErrorFlag
|
|
bcs Exit
|
|
|
|
MoveWord #SSScrap,SType
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
|
|
;---------------------------------------------------------------------
|
|
|
|
S_ScrapData PROC EXPORT
|
|
|
|
EXPORT S_ScrapOrgCell
|
|
EXPORT S_ScrapTL
|
|
EXPORT S_ScrapTop
|
|
EXPORT S_ScrapLeft
|
|
EXPORT S_ScrapBR
|
|
EXPORT S_ScrapBottom
|
|
EXPORT S_ScrapRight
|
|
EXPORT S_ScrapBufferSize
|
|
EXPORT S_ScrapHandleSize
|
|
EXPORT S_ScrapHandle
|
|
EXPORT S_ScrapBuffer
|
|
EXPORT S_ScrapParse
|
|
EXPORT S_ScrapPasteType
|
|
|
|
S_ScrapOrgCell DS.B 4
|
|
|
|
S_ScrapTL
|
|
S_ScrapTop DS.B 2
|
|
S_ScrapLeft DS.B 2
|
|
|
|
S_ScrapBR
|
|
S_ScrapBottom DS.B 2
|
|
S_ScrapRight DS.B 2
|
|
|
|
S_ScrapBufferSize DS.B 4
|
|
S_ScrapHandleSize DS.B 4
|
|
|
|
S_ScrapHandle DS.B 4
|
|
|
|
S_ScrapBuffer DS.B 4
|
|
S_ScrapParse DS.B 2
|
|
S_ScrapPasteType DS.B 2
|
|
|
|
ENDP
|
|
|
|
;-------------------------------------------------------------------------;
|
|
; S_Cut (Window:l): ImageRoutine:l
|
|
;
|
|
; S_Cut will perform a cut of the currently selected item(s) in the given
|
|
; document. The output routine draws an image of the scrap for dragging and
|
|
; is defined:
|
|
;
|
|
; ImageRoutine(where:L) - draws the shape at where
|
|
;
|
|
; The routine should use the current port and penmode (don't change either).
|
|
; Pass back a 0 for no scrap.
|
|
|
|
S_Cut PROC EXPORT
|
|
;Using S_CurrentData
|
|
;Using S_UndoData
|
|
|
|
input Window:l
|
|
output ImageRoutine:l
|
|
local SType:w,ScrapHandle:l
|
|
error ErrFlag
|
|
BEGIN +b
|
|
|
|
stz ErrFlag
|
|
|
|
in Window:l
|
|
out ImageRoutine:l,SType:w,ScrapHandle:l
|
|
XCall S_Copy,err=ErrFlag
|
|
bcs Exit
|
|
|
|
lda SType
|
|
beq Exit
|
|
|
|
Call X_PostScrap,in=(SType:w,ScrapHandle:l)
|
|
|
|
|
|
Call S_Clear,err=ErrFlag
|
|
|
|
; some manipulation is needed here to get right undo string
|
|
|
|
lda S_UndoHandle
|
|
ora S_UndoHandle+2
|
|
beq Exit
|
|
|
|
MoveWord #S_UndoCutType,S_UndoType
|
|
|
|
asl a
|
|
asl a
|
|
tax
|
|
PushLong S_UndoNames:x
|
|
|
|
Call D_SetUndoStr,in=(:l,S_CurWindow:l)
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
|
|
;-------------------------------------------------------------------------;
|
|
; S_Paste ( Window:l, Scrap:l, Type:w, Paste:w, Where:l)
|
|
;
|
|
; The input are:
|
|
; - Window, which window to paste in, usually the active one
|
|
; - Scrap, a handle to the data, dispose of it when you're done
|
|
; - Type, the type of scrap that is being passed.
|
|
; - Paste, What type 0 - from menu 1-directional (look at where)
|
|
; 2 - from import
|
|
; - Where, where paste was if Paste was type 1
|
|
; Return any memory errors.
|
|
|
|
S_Paste PROC EXPORT
|
|
;Using S_ScrapData
|
|
;Using S_CurrentData
|
|
;Using S_ProtectData
|
|
;Using S_ErrorData
|
|
;Using X_ClipData
|
|
|
|
input Window:l,Scrap:l,Type:w,Paste:w,Where:l
|
|
local Buffer:l,Rect:r,PasteType:w
|
|
local ContentIndex:l,CellPtr:l
|
|
error ErrorFlag
|
|
BEGIN +b
|
|
|
|
stz ErrorFlag
|
|
stz ContentIndex
|
|
stz ContentIndex+2
|
|
|
|
stz PasteType
|
|
|
|
Cmpword Type,#SSScrap
|
|
beq doSSScrap
|
|
|
|
inc ErrorFlag
|
|
brl Exit
|
|
|
|
doSSScrap
|
|
Call S_SwapIn,in=(Window:l)
|
|
|
|
MoveLong Scrap,S_ScrapBuffer
|
|
MoveWord Paste,S_ScrapPasteType
|
|
|
|
CmpWord Paste,#1
|
|
jne normal ; menu paste same as import
|
|
|
|
; Put directional paste code here ;
|
|
|
|
MoveWord S_CurEditFlag,a
|
|
and #S_EditingBit
|
|
beq notLE
|
|
|
|
Tool _PtInRect,in=(!Where:l,#S_CurEditRect:l),out=(a:w)
|
|
beq endBranch
|
|
|
|
Call X_DialogFromScrap
|
|
Tool _LEPaste,in=(S_CurLEHandle:l)
|
|
|
|
endBranch
|
|
brl Exit
|
|
|
|
notLE
|
|
MoveWord S_CurContYpt,Rect
|
|
MoveWord S_CurContXpt,Rect+2
|
|
MoveWord S_CurContHt,Rect+4
|
|
MoveWord S_CurContWd,Rect+6
|
|
|
|
Tool _PtInRect,in=(!Where:l,!Rect:l),out=(a:w)
|
|
beq endBranch
|
|
|
|
in Where:l
|
|
out S_ScrapTL:l,Where:l
|
|
XCall S_WhichCell
|
|
|
|
bra fixScrapRange
|
|
|
|
; CmpWord S_ScrapTop,#10000
|
|
; jge Exit
|
|
;
|
|
; CmpWord S_ScrapLeft,#$02BF
|
|
; blt fixScrapRange
|
|
; brl Exit
|
|
|
|
; Set up for normal SS scrap ;
|
|
|
|
normal
|
|
MoveWord S_CurEditFlag,a
|
|
and #S_EditingBit
|
|
beq notLE2
|
|
|
|
Call X_DialogFromScrap
|
|
Tool _LEPaste,in=(S_CurLEHandle:l)
|
|
|
|
brl Exit
|
|
|
|
notLE2
|
|
MoveLong S_CurTLSelect,S_ScrapTL
|
|
|
|
fixScrapRange
|
|
MoveLong [Scrap],Buffer
|
|
|
|
AddWord S_ScrapLeft,[Buffer]:#S_ScrapCols,a
|
|
dec a
|
|
sta S_ScrapRight
|
|
|
|
cmp #703
|
|
bge badPaste
|
|
|
|
AddWord S_ScrapTop,[Buffer]:#S_ScrapRows,a
|
|
dec a
|
|
sta S_ScrapBottom
|
|
|
|
cmp #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
|
|
|
|
; PushLong S_ScrapTL
|
|
;
|
|
; AddWord S_ScrapLeft,[Buffer]:#S_ScrapCols,a
|
|
;; dec a
|
|
; pha
|
|
;
|
|
; AddWord S_ScrapTop,[Buffer]:#S_ScrapRows,a
|
|
; dec a
|
|
; pha
|
|
|
|
in S_ScrapTL:l,S_ScrapBR:l
|
|
in #S_ChkCellProtect:l ;two longs on stack
|
|
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
|
|
; Call D_SetCursor,in=(#WatchCursor:w)
|
|
|
|
lda Paste
|
|
bne setImport
|
|
|
|
MoveWord #S_UndoPasteType,PasteType
|
|
bra contSetUndo
|
|
|
|
setImport
|
|
cmp #1
|
|
beq doHotPaste
|
|
|
|
MoveWord #S_UndoImportType,PasteType
|
|
bra contSetUndo
|
|
|
|
doHotPaste
|
|
Call D_SetFileChanged,in=(Window:l)
|
|
|
|
CmpLong Window,S_ActiveWindow
|
|
bne doPaste2
|
|
|
|
MoveWord #S_UndoPasteType,PasteType
|
|
|
|
contSetUndo
|
|
; MoveLong [Scrap],Buffer
|
|
;
|
|
; PushLong S_CurTLSelect
|
|
; AddWord S_ScrapLeft,[Buffer]:#S_ScrapCols,a
|
|
; dec a
|
|
; pha
|
|
; AddWord S_ScrapTop,[Buffer]:#S_ScrapRows,a
|
|
; dec a
|
|
; pha
|
|
|
|
PushLong S_ScrapTL
|
|
|
|
in S_ScrapTL:l,S_ScrapBR:l
|
|
XCall S_BuildSimpleUndo,err=ErrorFlag
|
|
|
|
PullLong S_ScrapTL
|
|
bcs memError
|
|
|
|
doPaste2
|
|
MoveLong Scrap,S_ScrapBuffer
|
|
MoveWord Paste,S_ScrapPasteType
|
|
|
|
Call S_PutSSScrap,err=ErrorFlag
|
|
|
|
memError
|
|
Call S_FixLE
|
|
|
|
in S_ScrapTL:l,S_ScrapBR:l
|
|
XCall S_RedrawCellRange
|
|
|
|
lda PasteType
|
|
beq chkCalc
|
|
|
|
Call S_SetUndoOn,in=(PasteType:w)
|
|
|
|
chkCalc
|
|
|
|
; Stick code here to see if Appleworks Open should calculate ;
|
|
|
|
lda S_CurEditFlag
|
|
and #S_ManCalcBit
|
|
bne savePaste
|
|
|
|
Call S_CalculateSheet
|
|
|
|
savePaste
|
|
CmpLong S_ActiveWindow,S_CurWindow
|
|
beq Exit
|
|
|
|
Call S_SwapOut
|
|
|
|
Exit
|
|
Call X_DisposeScrap,in=(Type:w,Scrap:l)
|
|
|
|
RETURN
|
|
ENDP
|
|
|
|
;-----------------------------------------------------------------------------
|
|
; S_Image(where) draws an image of the copied cells.
|
|
|
|
S_Image PROC EXPORT
|
|
;Using S_ImageData
|
|
|
|
input Where:l
|
|
BEGIN +b
|
|
|
|
MoveLong Where,S_CopyRect
|
|
AddLong Where,S_CopyFrame,S_CopyRect+4
|
|
Tool _FrameRect,in=(#S_CopyRect:l)
|
|
|
|
RETURN
|
|
ENDP
|
|
|
|
;-----------------------------------
|
|
|
|
S_ImageData PROC EXPORT
|
|
|
|
EXPORT S_CopyRect
|
|
EXPORT S_CopyFrame
|
|
|
|
S_CopyRect DS.B 8
|
|
S_CopyFrame DS.B 4
|
|
|
|
ENDP
|
|
|
|
;-----------------------------------
|
|
|
|
S_SetImage PROC EXPORT
|
|
;Using S_ImageData
|
|
;Using S_CurrentData
|
|
|
|
input TLCell:l,BRCell:l
|
|
local MaxHeight:w,MaxWidth:w
|
|
BEGIN
|
|
|
|
SubWord S_CurContHt,S_CurContYpt,MaxHeight
|
|
SubWord S_CurContWd,S_CurContXpt,MaxWidth
|
|
|
|
SubWord BRCell,TLCell,a
|
|
inc a
|
|
|
|
cmp #35
|
|
bge setCurHt
|
|
|
|
asl a
|
|
sta S_CopyFrame
|
|
asl a
|
|
asl a
|
|
AddWord a,S_CopyFrame,S_CopyFrame
|
|
|
|
cmp MaxHeight
|
|
blt setWidth
|
|
|
|
setCurHt
|
|
MoveWord MaxHeight,S_CopyFrame
|
|
|
|
setWidth
|
|
SubWord BRCell+2,TLCell+2,a
|
|
inc a
|
|
|
|
cmp #35
|
|
bge setCurWd
|
|
|
|
stz S_CopyFrame+2
|
|
|
|
wdLoop
|
|
Call S_CellWidth,in=(BRCell+2:w),out=(a:w)
|
|
|
|
AddWord a,S_CopyFrame+2,S_CopyFrame+2
|
|
cmp MaxWidth
|
|
bge setCurWd
|
|
|
|
dec BRCell+2
|
|
CmpWord BRCell+2,TLCell+2
|
|
bge wdLoop
|
|
bra Exit
|
|
|
|
setCurWd
|
|
MoveWord MaxWidth,S_CopyFrame+2
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
|
|
;---------------------------------------------------------------------------
|
|
; S_GetScrapCell
|
|
;
|
|
|
|
S_GetScrapCell PROC EXPORT
|
|
;Using S_ScrapData
|
|
;Using S_CurrentData
|
|
;Using SANEequs
|
|
|
|
input Cell:l,CellIndex:l
|
|
local Buffer:l,ContentSize:l,CellSize:w
|
|
local CellPtr:l,ContentPtr:l,Format:w
|
|
error ErrorFlag
|
|
BEGIN
|
|
|
|
stz ErrorFlag
|
|
|
|
CmpWord S_ScrapBufferSize,#$7800
|
|
blt bufferOK
|
|
|
|
Call S_AddBufferToScrap,err=ErrorFlag
|
|
jcs Exit
|
|
|
|
bufferOK
|
|
H_GetBlockPtr CellIndex,CellPtr
|
|
|
|
MoveWord [CellPtr]:#S_CellFormat,Format
|
|
jmi Exit
|
|
|
|
AddLong S_ScrapBuffer,S_ScrapBufferSize,Buffer
|
|
|
|
; Store the location ;
|
|
|
|
SubWord Cell,S_ScrapOrgCell,a
|
|
inc a
|
|
MoveWord a,[Buffer]:#S_ScrapCellLoc
|
|
|
|
iny
|
|
iny
|
|
SubWord Cell+2,S_ScrapOrgCell+2,a
|
|
inc a
|
|
sta [Buffer],y
|
|
|
|
; Store the format information ;
|
|
|
|
MoveWord Format,[Buffer]:#S_ScrapFormat
|
|
|
|
MoveWord [CellPtr]:#S_CellFormat+2,a
|
|
and #$FFFF-S_CellProtect-S_CellCircular
|
|
MoveWord a,[Buffer]:#S_ScrapFormat+2
|
|
|
|
|
|
MoveWord #S_ScrapValueSize,CellSize
|
|
|
|
; Store the last calculated value ;
|
|
|
|
lda Format
|
|
and #S_CellTypeValue
|
|
jne getSane
|
|
|
|
CmpLong [CellPtr]:#S_CellValue,[CellPtr]:#S_CellContent
|
|
bne getString
|
|
|
|
MoveWord #0,[Buffer]:#S_ScrapValueSize
|
|
inc CellSize
|
|
brl getContent
|
|
|
|
getString
|
|
H_GetBlockPtr [CellPtr]:#S_CellValue,ContentPtr
|
|
|
|
lda [ContentPtr]
|
|
and #$00FF
|
|
inc a
|
|
sta ContentSize
|
|
stz ContentSize+2
|
|
|
|
PushLong ContentPtr
|
|
AddLong Buffer,#S_ScrapValueSize,s
|
|
PushLong ContentSize
|
|
Tool _BlockMove
|
|
|
|
AddWord ContentSize,CellSize,CellSize
|
|
bra getContent
|
|
|
|
getSane
|
|
MoveWord #10,[Buffer]:#S_ScrapValueSize
|
|
|
|
AddLong CellPtr,#S_CellValue,s
|
|
AddLong Buffer,#S_ScrapValue,s
|
|
Tool FX2X,in=(:l,:l)
|
|
|
|
AddWord #11,CellSize,CellSize
|
|
|
|
; Store the content of the cell ;
|
|
|
|
getContent
|
|
H_GetBlockSize [CellPtr]:#S_CellContent,ContentSize
|
|
|
|
lda ContentSize+2
|
|
ora ContentSize
|
|
beq storeSize
|
|
|
|
H_GetBlockPtr [CellPtr]:#S_CellContent,ContentPtr
|
|
|
|
PushLong ContentPtr
|
|
lda CellSize
|
|
AddLong a,Buffer,s
|
|
PushLong ContentSize
|
|
Tool _BlockMove
|
|
|
|
; Store the cell size ;
|
|
|
|
storeSize
|
|
AddWord CellSize,ContentSize,[Buffer]:#S_ScrapCellSize
|
|
AddLong a,S_ScrapBufferSize,S_ScrapBufferSize
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
|
|
;---------------------------------------------------------------------------
|
|
;
|
|
;
|
|
|
|
S_ScrapValue2String PROC EXPORT
|
|
;Using S_CurrentData
|
|
;Using S_FormulaData
|
|
;Using SANEequs
|
|
|
|
input Buffer:l
|
|
output ContentIndex:l,CellType:w
|
|
local ContentPtr:l,StringPtr:l,ContentSize:l
|
|
local FormatPtr:l,ValuePtr:l
|
|
error ErrFlag
|
|
BEGIN
|
|
|
|
stz ErrFlag
|
|
MoveWord #S_CellTypeValue,CellType
|
|
|
|
AddLong Buffer,#S_ScrapFormat,FormatPtr
|
|
|
|
lda [FormatPtr]
|
|
and #S_CellInvalid
|
|
beq chkInf
|
|
|
|
MoveWord #S_CellTypeFormula,CellType
|
|
|
|
lda [FormatPtr]
|
|
and #S_CellError
|
|
beq doNa
|
|
|
|
MoveLong #S_ErrorFormula,StringPtr
|
|
MoveLong #S_ErrorFormulaLength,ContentSize
|
|
brl saveContent
|
|
|
|
doNa
|
|
MoveLong #S_NAFormula,StringPtr
|
|
MoveLong #S_NAFormulaLength,ContentSize
|
|
brl saveContent
|
|
|
|
chkInf
|
|
AddLong Buffer,#S_ScrapValue,ValuePtr
|
|
|
|
Tool FCLASSX,in=(ValuePtr:l)
|
|
|
|
txa
|
|
and #$00FF
|
|
cmp #$00FE
|
|
bne doValue
|
|
|
|
MoveWord #S_CellTypeFormula,CellType
|
|
|
|
txa
|
|
bmi doNegInf
|
|
|
|
MoveLong #S_INFFormula,StringPtr
|
|
MoveLong #S_INFFormulaLength,ContentSize
|
|
bra saveContent
|
|
|
|
doNegInf
|
|
MoveLong #S_NegINFFormula,StringPtr
|
|
MoveLong #S_NegINFFormulaLength,ContentSize
|
|
bra saveContent
|
|
|
|
doValue
|
|
stz ContentIndex
|
|
stz ContentIndex+2
|
|
brl Exit
|
|
|
|
saveContent
|
|
H_NewBlock ContentSize,ContentIndex,ContentPtr,err=ErrFlag
|
|
bcs Exit
|
|
|
|
Tool _BlockMove,in=(StringPtr:l,ContentPtr:l,ContentSize:l)
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
|
|
;---------------------------------------------------------------------------
|
|
; S_GetSSScrap
|
|
;
|
|
|
|
S_GetSSScrap PROC EXPORT
|
|
;Using D_GlobalData
|
|
;Using S_ScrapData
|
|
|
|
input TLCell:l,BRCell:l
|
|
output ScrapHandle:l
|
|
local Buffer:l,ScrapPtr:l
|
|
error ErrFlag
|
|
BEGIN
|
|
|
|
stz ErrFlag
|
|
|
|
MoveWord #1,>D_BitMapChanged
|
|
|
|
lda >D_BitMapPtr+2
|
|
tax
|
|
lda >D_BitMapPtr
|
|
|
|
MoveLong ax,Buffer
|
|
MoveLong ax,S_ScrapBuffer
|
|
|
|
SubWord BRCell,TLCell,a
|
|
inc a
|
|
MoveWord a,[Buffer]:#S_ScrapRows
|
|
|
|
SubWord BRCell+2,TLCell+2,a
|
|
inc a
|
|
MoveWord a,[Buffer]:#S_ScrapCols
|
|
|
|
MoveWord #0,[Buffer]:#S_ScrapParseCode
|
|
|
|
MoveWord #S_ScrapCells,S_ScrapBufferSize
|
|
stz S_ScrapBufferSize+2
|
|
|
|
stz S_ScrapHandle
|
|
stz S_ScrapHandle+2
|
|
|
|
stz S_ScrapHandleSize
|
|
stz S_ScrapHandleSize+2
|
|
|
|
MoveLong TLCell,S_ScrapOrgCell
|
|
|
|
in TLCell:l,BRCell:l,#S_GetScrapCell:l
|
|
XCall S_QTraverse,err=ErrFlag
|
|
bcs Exit
|
|
|
|
Call S_AddBufferToScrap,err=ErrFlag
|
|
bcs Exit
|
|
|
|
MoveLong S_ScrapHandle,ScrapHandle
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
|
|
;------------------------------------------------------------------------------
|
|
;
|
|
;
|
|
|
|
S_AddBufferToScrap PROC EXPORT
|
|
;Using S_ScrapData
|
|
|
|
local ScrapHandle:l,NewSize:l,ScrapPtr:l
|
|
error ErrFlag
|
|
BEGIN
|
|
|
|
stz ErrFlag
|
|
|
|
MoveLong S_ScrapHandle,ScrapHandle
|
|
|
|
lda ScrapHandle
|
|
ora ScrapHandle+2
|
|
bne resizeHandle
|
|
|
|
MoveLong S_ScrapBufferSize,ax
|
|
MoveLong ax,NewSize
|
|
Call D_NeedHand,in=(ax:l),out=(ax:l),err=ErrFlag
|
|
jcs Exit
|
|
|
|
MoveLong ax,S_ScrapHandle
|
|
MoveLong ax,ScrapHandle
|
|
bra moveData
|
|
|
|
resizeHandle
|
|
AddLong S_ScrapHandleSize,S_ScrapBufferSize,NewSize
|
|
Call D_GrowHandle,in=(NewSize:l,ScrapHandle:l),err=ErrFlag
|
|
bcc moveData
|
|
|
|
Tool _DisposeHandle,in=(ScrapHandle:l)
|
|
bra Exit
|
|
|
|
moveData
|
|
MoveLong [ScrapHandle],ScrapPtr
|
|
|
|
PushLong S_ScrapBuffer
|
|
AddLong ScrapPtr,S_ScrapHandleSize,s
|
|
PushLong S_ScrapBufferSize
|
|
XTool _BlockMove
|
|
|
|
MoveWord NewSize,[ScrapPtr]:#S_ScrapSize
|
|
sta S_ScrapHandleSize
|
|
|
|
MoveWord NewSize+2,[ScrapPtr]:#S_ScrapSize+2
|
|
sta S_ScrapHandleSize+2
|
|
|
|
stz S_ScrapBufferSize
|
|
stz S_ScrapBufferSize+2
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
|
|
;---------------------------------------------------------------------------
|
|
;
|
|
;
|
|
|
|
S_PutSSScrap PROC EXPORT
|
|
;Using S_ScrapData
|
|
;Using S_CurrentData
|
|
;Using SANEEqus
|
|
|
|
local TLCell:l,BRCell:l,ScrapLimit:l
|
|
local Cell:l,CellIndex:l,CellPtr:l
|
|
|
|
local ContentIndex:l,ContentPtr:l
|
|
local Buffer:l,TypeCell:w,Format:l
|
|
local LCell:l,RCell:l,StringPtr:l,ScrapHandle:l
|
|
local ParseCode:w
|
|
|
|
local ContentStart:l,ContentSize:l,CellSize:w
|
|
local ScrapSize:l,ValueSize:l
|
|
error ErrorFlag
|
|
BEGIN
|
|
|
|
stz ErrorFlag
|
|
|
|
MoveLong S_ScrapBuffer,ScrapHandle
|
|
MoveLong [ScrapHandle],Buffer
|
|
|
|
AddWord S_ScrapTop,[Buffer]:#S_ScrapRows,a
|
|
dec a
|
|
sta S_ScrapBottom
|
|
|
|
AddWord S_ScrapLeft,[Buffer]:#S_ScrapCols,a
|
|
dec a
|
|
sta S_ScrapRight
|
|
|
|
SubLong S_ScrapTL,#$10001,S_ScrapOrgCell
|
|
|
|
; Determine Parse Code ;
|
|
|
|
MoveWord [Buffer]:#S_ScrapParseCode,ParseCode
|
|
|
|
; do Paste ;
|
|
|
|
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 Exit
|
|
|
|
|
|
pasteLoop
|
|
Call D_BeachBall
|
|
|
|
stz ContentIndex
|
|
stz ContentIndex+2
|
|
|
|
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
|
|
|
|
|
|
CmpWord ParseCode,#2
|
|
jlt semiParsed
|
|
|
|
|
|
SpaceWord
|
|
SpaceLong
|
|
|
|
; This cludge makes A1 references refer to top,left of Paste ;
|
|
; when it is an import of ascii file. ;
|
|
|
|
CmpWord S_ScrapPasteType,#2
|
|
bne notImport
|
|
|
|
SubLong Cell,S_ScrapOrgCell,s
|
|
bra contNotParsed
|
|
|
|
notImport
|
|
PushLong Cell
|
|
contNotParsed
|
|
|
|
|
|
PushLong ScrapHandle
|
|
lda ContentStart
|
|
inc a
|
|
AddLong a,ScrapSize,s
|
|
SubWord ContentSize,#1,s
|
|
PushLong #DRec
|
|
PushWord #1
|
|
|
|
Call S_ParseText,err=ErrorFlag
|
|
|
|
PullLong ContentIndex
|
|
PullWord TypeCell
|
|
jcs Exit
|
|
|
|
lda S_CurDefFormat
|
|
and #$FFFF-S_CellType
|
|
ora TypeCell
|
|
sta Format
|
|
|
|
MoveWord S_CurDefFormat+2,Format+2
|
|
|
|
CmpWord TypeCell,#S_CellTypeValue
|
|
jne createCell
|
|
|
|
Tool FDEC2X,in=(#DRec:l,#Number:l)
|
|
brl createCell
|
|
|
|
; Scrap is either semi-parsed or fully - parsed ;
|
|
|
|
semiParsed
|
|
MoveLong [Buffer]:#S_ScrapFormat,Format
|
|
|
|
MoveWord Format,a
|
|
and #S_CellType
|
|
sta TypeCell
|
|
|
|
beq jmpCopyContent ; cell type text
|
|
|
|
and #S_CellTypeTextForm ; any formula
|
|
jeq createCell ; must be a value
|
|
|
|
lda ParseCode
|
|
bne parseFormula
|
|
|
|
jmpCopyContent
|
|
brl copyContent
|
|
|
|
|
|
parseFormula
|
|
|
|
; Scrap is semi - parsed ;
|
|
|
|
; These come from AppleWorks and may never have calculated ;
|
|
; text fields. ;
|
|
|
|
SpaceLong
|
|
|
|
lda ContentStart
|
|
inc a
|
|
AddLong a,Buffer,s
|
|
|
|
lda ContentSize
|
|
dec a
|
|
pha
|
|
|
|
PushLong Cell
|
|
PushWord #1
|
|
Call E_ParseFormula,err=ErrorFlag
|
|
PullLong ContentIndex
|
|
jcc createCell
|
|
|
|
lda Format
|
|
and #$FFFF-S_CellType-S_CellInvalid-S_CellError
|
|
; ora #S_CellTypeText ; = 0
|
|
sta Format
|
|
|
|
stz TypeCell
|
|
|
|
; The Content field has the correct content ;
|
|
|
|
copyContent
|
|
H_NewBlock ContentSize,ContentIndex,ContentPtr,err=ErrorFlag
|
|
jcs Exit
|
|
|
|
AddLong [ScrapHandle],ScrapSize,Buffer
|
|
|
|
AddLong Buffer,ContentStart,s
|
|
PushLong ContentPtr
|
|
PushLong ContentSize
|
|
Tool _BlockMove
|
|
|
|
lda Format
|
|
and #S_CellTypeTextForm
|
|
beq createCell
|
|
|
|
; If this is an SS formula, make sure that all cell references ;
|
|
; are within the spreadsheet. ;
|
|
|
|
Call S_CheckFormula,in=(Cell:l,ContentPtr:l)
|
|
|
|
; Get a New cell ;
|
|
|
|
createCell
|
|
in Cell:l,Format:l,ContentIndex:l
|
|
out LCell:l,RCell:l
|
|
XCall S_AcceptCell,err=ErrorFlag
|
|
jcs Exit
|
|
|
|
; Store the last calculated value ;
|
|
|
|
AddLong [ScrapHandle],ScrapSize,Buffer
|
|
|
|
in Cell:l
|
|
out CellIndex:l
|
|
XCall S_GetCellIndex
|
|
|
|
H_GetBlockPtr CellIndex,CellPtr
|
|
|
|
lda TypeCell
|
|
and #S_CellTypeValue
|
|
beq textInValue
|
|
|
|
CmpWord ParseCode,#2
|
|
bne valueInScrap
|
|
|
|
lda TypeCell
|
|
and #S_CellTypeTextForm ; any formula
|
|
jne wrapUp
|
|
|
|
PushLong #Number
|
|
bra moveNumber
|
|
|
|
valueInScrap
|
|
AddLong Buffer,#S_ScrapValue,s
|
|
|
|
moveNumber
|
|
AddLong CellPtr,#S_CellValue,s
|
|
Tool FX2X,in=(:l,:l)
|
|
brl wrapUp
|
|
|
|
textInValue
|
|
lda TypeCell
|
|
jeq setValue ; type = Text
|
|
|
|
AddWord ValueSize,#1,ValueSize
|
|
|
|
H_NewBlock ValueSize,ContentIndex,ContentPtr,err=ErrorFlag
|
|
bcc okTextValue
|
|
|
|
; No Space for text value ;
|
|
|
|
H_GetBlockPtr CellIndex,CellPtr
|
|
|
|
lda Format
|
|
and #$FFFF-S_CellType
|
|
ora #S_CellTypeFormula
|
|
MoveWord a,[CellPtr]:#S_CellFormat
|
|
|
|
Call S_RemoveCell,in=(Cell:l)
|
|
brl Exit
|
|
|
|
okTextValue
|
|
AddLong [ScrapHandle],ScrapSize,Buffer
|
|
|
|
AddLong Buffer,#S_ScrapValueSize,s
|
|
PushLong ContentPtr
|
|
PushLong ValueSize
|
|
Tool _BlockMove
|
|
|
|
H_GetBlockPtr CellIndex,CellPtr
|
|
|
|
setValue
|
|
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
|
|
jlt pasteLoop
|
|
|
|
Exit
|
|
RETURN
|
|
|
|
DRec DS.B 33
|
|
Number DS.B 10
|
|
|
|
ENDP
|
|
|
|
;-----------------------------------------------------------------------------
|
|
;
|
|
;
|
|
|
|
S_CheckFormula PROC EXPORT
|
|
|
|
input Cell:l,FormulaPtr:l
|
|
local Start:w,Stop:w,RealCell:l
|
|
BEGIN
|
|
|
|
MoveWord [FormulaPtr]:#E_FormulaCells,Stop
|
|
MoveWord #E_FormulaData,Start
|
|
|
|
CmpWord Start,Stop
|
|
jge Exit
|
|
|
|
dependLoop
|
|
SpaceLong
|
|
AddWord Start,#3,y
|
|
PushWord [FormulaPtr]:y
|
|
dey
|
|
dey
|
|
PushWord [FormulaPtr]:y
|
|
dey
|
|
lda [FormulaPtr],y
|
|
and #$00FF
|
|
pha
|
|
PushLong Cell
|
|
Call S_GetRealCell
|
|
PullLong RealCell
|
|
|
|
lda RealCell
|
|
beq trashIt
|
|
|
|
cmp #10000
|
|
bge trashIt
|
|
|
|
lda RealCell+2
|
|
beq trashIt
|
|
|
|
cmp #703
|
|
blt nextDepend
|
|
|
|
trashIt
|
|
ldy Start
|
|
iny
|
|
MoveLong #S_NotACell,[FormulaPtr]:y
|
|
|
|
nextDepend
|
|
AddWord Start,#5,Start
|
|
|
|
cmp Stop
|
|
jlt dependLoop
|
|
|
|
Exit
|
|
RETURN
|
|
ENDP
|
|
END
|
|
|