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

1 line
6.7 KiB
Plaintext
Executable File

LOAD 'Macros.dump'
INCLUDE 'SS.equ'
; INCLUDE 'Driver.equ'
INCLUDE 'Heap.aii.i'
;-----------------------------------------------
;
; Imported addresses
;
;-----------------------------------------------
IMPORT D_GrowHandle
IMPORT D_NeedHand
IMPORT S_CurRowBlock
;-----------------------------------------------
;
; Forward addresses and entries
;
;-----------------------------------------------
ENTRY S_GetKeyIndex
ENTRY S_GetRowStructIndex
ENTRY S_SetKeyIndex
ENTRY S_SetRowStructIndex
;---------------------------------------------------------------------------
; S_SetCellTableEntry
;
S_SetCellTableEntry PROC EXPORT
;Using S_CurrentData
input Cell:l,NewCellIndex:l
local OldRowIndex:l,NewRowIndex:l
error ErrorFlag
BEGIN
stz ErrorFlag
in Cell:w
out OldRowIndex:l
XCall S_GetRowStructIndex
in Cell+2:w,OldRowIndex:l,NewCellIndex:l
out NewRowIndex:l
XCall S_SetKeyIndex,err=ErrorFlag
bcs Exit
CmpLong OldRowIndex,NewRowIndex
beq Exit
in Cell:w,NewRowIndex:l
XCall S_SetRowStructIndex,err=ErrorFlag
bcs killNewRow
lda OldRowIndex
ora OldRowIndex+2
beq Exit
Tool _DisposeHandle,in=(OldRowIndex:l)
bra Exit
killNewRow
Tool _DisposeHandle,in=(NewRowIndex:l)
Exit
RETURN
ENDP
;---------------------------------------------------------------------------
; S_GetCellTableEntry( Cell:l ) : Index:l
;
S_GetCellTableEntry PROC EXPORT
;Using S_CurrentData
input Cell:l
output Index:l
BEGIN
StructPtr equ Index
in Cell:w
out StructPtr:l
XCall S_GetRowStructIndex
ora StructPtr
beq Exit
in Cell+2:w,StructPtr:l
out Index:l
XCall S_GetKeyIndex
Exit
RETURN
ENDP
;---------------------------------------------------------------------------
; S_GetCellIndex( Cell:l ) : CellIndex:l
;
S_GetCellIndex PROC EXPORT
;Using S_CurrentData
input Cell:l
output CellIndex:l
BEGIN
Call S_GetCellTableEntry,in=(Cell:l),out=(CellIndex:l)
and #S_CellTableFlags
beq Exit
stzl CellIndex
Exit
RETURN
ENDP
;---------------------------------------------------------------------------
; S_GetCellPtr( Cell:l ) : CellPtr:l
;
S_GetCellPtr PROC EXPORT
;Using S_CurrentData
input Cell:l
output CellPtr:l
BEGIN +b
CellIndex equ CellPtr
in Cell:l
out CellIndex:l
XCall S_GetCellIndex
ora CellIndex
beq Exit ; return 0 if cell doesn't exist
H_GetBlockPtr CellIndex,CellPtr
Exit
RETURN
ENDP
;---------------------------------------------------------------------------
; S_GetKeyIndex( Key:w,Struct:l ) : Index:l
;
S_GetKeyIndex PROC EXPORT
;Using S_CurrentData
input Key:w,Struct:l
output Index:l
BEGIN
StructPtr equ Struct
; MoveLong [Struct],ax
ldy #2
lda [Struct],y
tax
lda [Struct]
sta StructPtr
stx StructPtr+2
CmpWord Key,[StructPtr]:#S_KeyMax
bge notFound
SubWord a,[StructPtr]:#S_KeyMin,a
blt notFound
asl a
asl a
AddWord a,#S_KeyArray,y
MoveLong [StructPtr]:y,Index
bra Exit
notFound
stz Index
stz Index+2
Exit
RETURN
ENDP
;---------------------------------------------------------------------------
; S_SetKeyIndex
;
S_SetKeyIndex PROC EXPORT
;Using S_CurrentData
input Key:w,OldStructIndex:l,NewIndex:l
output StructIndex:l
local StructPtr:l,Min:w,Max:w,ZeroMin:w,ZeroMax:w
local NewSize:w
error ErrorFlag
BEGIN
S_Key2StructDefault equ 26
stz ErrorFlag
MoveWord OldStructIndex,StructIndex
MoveWord OldStructIndex+2,StructIndex+2
ora OldStructIndex
jne structExists
lda NewIndex
ora NewIndex+2
jeq Exit
in #S_Key2StructDefault:l
out StructIndex:l
XCall D_NeedHand,err=ErrorFlag
jcs Exit
MoveLong [StructIndex],StructPtr
MoveWord #S_Key2StructDefault,[StructPtr]
MoveWord Key,[StructPtr]:#S_KeyMin
inc a
MoveWord a,[StructPtr]:#S_KeyMax
MoveLong NewIndex,[StructPtr]:#S_KeyArray
brl Exit
structExists
MoveLong [OldStructIndex],StructPtr
CmpWord Key,[StructPtr]:#S_KeyMax
bge notFoundMax
SubWord a,[StructPtr]:#S_KeyMin,a
blt notFoundMin
asl a
asl a
AddWord a,#S_KeyArray,y
; Put the New index over the last one, it is up to the caller
; to dispose of the old one.
MoveLong NewIndex,[StructPtr]:y
brl Exit
notFoundMax
ldy #S_KeyMin
MoveWord [StructPtr]:y,Min
lda Key
inc a
sta Max
SubWord a,[StructPtr]:y,a
asl a
asl a
AddWord a,#S_KeyArray,ZeroMax
SubWord [StructPtr]:#S_KeyMax,[StructPtr]:#S_KeyMin,a
asl a
asl a
AddWord a,#S_KeyArray,ZeroMin
bra loadIndex
notFoundMin
eor #$FFFF
inc a
asl a
asl a
AddWord a,#S_KeyArray,ZeroMax
MoveWord #S_KeyArray,ZeroMin
MoveWord Key,Min
MoveWord [StructPtr]:#S_KeyMax,Max
loadIndex
lda NewIndex
ora NewIndex+2
jeq Exit
SubWord Max,Min,a
asl a
asl a
AddWord a,#S_KeyArray,a
cmp [StructPtr]
blt OKsize
AddWord a,#S_Key2StructDefault,NewSize
in #0:w,NewSize:w,OldStructIndex:l
XCall D_GrowHandle,err=ErrorFlag
bcs Exit
MoveLong [OldStructIndex],StructPtr
MoveWord NewSize,[StructPtr]
OKsize
CmpWord ZeroMin,#S_KeyArray
bne OKfix
AddLong a,StructPtr,s
lda ZeroMax
AddLong a,StructPtr,s
pea 0
SubWord [StructPtr]:#S_KeyMax,[StructPtr]:#S_KeyMin,a
asl a
asl a
pha
Tool _BlockMove,in=(:l,:l,:l)
OKfix
lda #0
ldy ZeroMin
zeroLoop
sta [StructPtr],y
iny
iny
cpy ZeroMax
blt zeroLoop
MoveWord Min,[StructPtr]:#S_KeyMin
MoveWord Max,[StructPtr]:#S_KeyMax
SubWord Key,Min,a
asl a
asl a
AddWord a,#S_KeyArray,y
MoveLong NewIndex,[StructPtr]:y
Exit
RETURN
ENDP
;--------------------------------------------------------------------------
; S_GetRowStructIndex( Row:w ) Index:l
;
S_GetRowStructIndex PROC EXPORT
;Using S_CurrentData
input Row:w
output StructIndex:l
BEGIN
stz StructIndex
stz StructIndex+2
lda S_CurRowBlock
ora S_CurRowBlock+2
beq Exit
in Row:w,S_CurRowBlock:l
out StructIndex:l
XCall S_GetKeyIndex
Exit
RETURN
ENDP
;--------------------------------------------------------------------------
; S_SetRowStructIndex( Row:w,Index:l )
;
S_SetRowStructIndex PROC EXPORT
;Using S_CurrentData
input Row:w,RowIndex:l
local NewRowBlock:l
error ErrorFlag
BEGIN
stz ErrorFlag
in Row:w,S_CurRowBlock:l,RowIndex:l
out NewRowBlock:l
XCall S_SetKeyIndex,err=ErrorFlag
bcs Exit
CmpLong S_CurRowBlock,NewRowBlock
beq Exit
lda S_CurRowBlock
ora S_CurRowBlock+2
beq oldGone
Tool _DisposeHandle,in=(S_CurRowBlock:l)
oldGone
MoveLong NewRowBlock,S_CurRowBlock
Exit
RETURN
ENDP
END