This OS-independent macrolibrary can be included to 32bit programs written in EuroAssembler.
The library contains macroinstructions which sort data in memory.
sort16 HEAD
ShellSort %MACRO TablePtr,NrOfRecords,RecordSize,CallbackProc
PUSHW %CallbackProc,%RecordSize,%NrOfRecords,%NrOfRecords,%TablePtr
CALL ShellSort16@RT::
ShellSort16@RT:: PROC1
PUSHAW
MOV BP,SP
%ShellSortTablePtr %SET BP+18
%ShellSortNrOfRecords %SET BP+20
%ShellSortRecordNr %SET BP+22
%ShellSortRecordSize %SET BP+24
%ShellSortCallbackProc %SET BP+26
.10: SARW [%ShellSortNrOfRecords],1
JNG .90:
MOV CX,[%ShellSortRecordNr]
SUB CX,[%ShellSortNrOfRecords]
MOV BX,1
.20: MOV SI,BX
.30: MOV DI,SI
ADD DI,[%ShellSortNrOfRecords]
PUSH SI,DI
MOV AX,SI
DEC AX
MULW [%ShellSortRecordSize]
ADD AX,[%ShellSortTablePtr]
MOV SI,AX
MOV AX,DI
DEC AX
MULW [%ShellSortRecordSize]
ADD AX,[%ShellSortTablePtr]
MOV DI,AX
CALL [%ShellSortCallbackProc]
POP DI,SI
JNC .40:
SUB SI,[%ShellSortNrOfRecords]
JA .30:
.40: INC BX
CMP BX,CX
JNA .20:
JMP .10:
.90: POPAW
RET 5*2
ENDPROC1 ShellSort16@RT::
%ENDMACRO ShellSort
ENDHEAD sort16