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