⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listsort.s01

📁 炬力方案176*132软件源码,适用于AK1025
💻 S01
字号:
	NAME	listsort(17)
	RSEG	APC_LIST_FUN2(0)
	EXTERN	SetDspMips
	PUBLIC	compare_string
	PUBLIC	list_sort
	PUBLIC	shortsort
	PUBLIC	swap
	EXTERN	?CLZ80B_4_04_L00
	EXTERN	?US_DIV_L02
	EXTERN	?S_MUL_L02
	EXTERN	?BANK_CALL_DIRECT_L08
	EXTERN	?BANK_FAST_LEAVE_L08
	RSEG	APC_LIST_FUN2
compare_string:
; 1.	#include "musiclist.h"
; 2.	#define  COMPARELEN  30
; 3.	#define CUTOFF 8                           
; 4.	#pragma codeseg(APC_LIST_FUN2)            
; 5.	int compare_string(char *string1,char *string2)
; 6.	{
	PUSH	IY
	PUSH	IX
	LD	IX,0
	ADD	IX,SP
	PUSH	BC
	PUSH	DE
	LD	HL,65524
	ADD	HL,SP
	LD	SP,HL
; 7.	    int i;                           
; 8.	    int *filenum_1 = (int*) string1;
; 9.	    int *filenum_2 = (int*) string2;     
; 10.	    unsigned int  string1_location =*filenum_1;
	EX	DE,HL
	LD	B,(HL)
	LD	(IX-10),B
	INC	HL
	LD	H,(HL)
	LD	(IX-9),H
; 11.	    unsigned int  string2_location = *filenum_2;
	LD	L,C
	LD	H,(IX-1)
	LD	B,(HL)
	LD	(IX-12),B
	INC	HL
	LD	H,(HL)
	LD	(IX-11),H
; 12.	    char  *string1_start =(char*)(string1_location*OneFileInfor+IDMStartAddress+2);
	LD	L,(IX-10)
	LD	H,(IX-9)
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	LD	BC,16386
	ADD	HL,BC
	LD	(IX-16),L
	LD	(IX-15),H
; 13.	    char  *string2_start =(char*)(string2_location*OneFileInfor+IDMStartAddress+2);
	LD	L,(IX-12)
	LD	H,(IX-11)
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,HL
	ADD	HL,BC
	PUSH	HL
	POP	IY
; 14.	    for(i=0;i<COMPARELEN;i++)
	XOR	A
	LD	(IX-14),A
	LD	(IX-13),A
?0003:
	LD	BC,32798
	LD	L,(IX-14)
	LD	H,(IX-13)
	LD	A,B
	XOR	H
	LD	H,A
	SBC	HL,BC
	JR	NC,?0002
?0004:
; 15.	    {
; 16.	        if((*string1_start)>(*string2_start))        //string1>string2 
	LD	L,(IX-16)
	LD	H,(IX-15)
	LD	A,(IY+0)
	CP	(HL)
	JR	NC,?0007
?0006:
; 17.	          return 1;                   
	LD	HL,1
	JR	?0014
?0007:
; 18.	        else if((*string1_start)<(*string2_start))     //string1<string2   
	LD	A,(HL)
	CP	(IY+0)
	JR	NC,?0009
?0008:
; 19.	        return -1;
	LD	HL,65535
	JR	?0014
?0009:
; 20.	      
; 21.	      if((*string1_start)==0 && (*string2_start)==0)  //提前结束
	XOR	A
	OR	(HL)
	JR	NZ,?0011
	OR	(IY+0)
	JR	Z,?0002
?0013:
?0012:
?0010:
; 22.	          break;
?0011:
; 23.	        string1_start++;
	INC	(IX-16)
	JR	NZ,?0065
	INC	(IX-15)
?0065:
; 24.	        string2_start++;                
	INC	(IX-14)
	INC	IY
	JR	NZ,?0003
	INC	(IX-13)
	JR	?0003
?0002:
; 25.	    }
; 26.	    return  0;                         //string1 和 string2 相等    
	LD	HL,0
; 27.	}  
?0014:
	LD	SP,IX
	POP	IX
	POP	IY
	JP	LWRD ?BANK_FAST_LEAVE_L08
swap:
; 28.	 
; 29.	void  swap(char *a, char *b)
; 30.	{
	PUSH	IY
	PUSH	IX
	PUSH	AF
	PUSH	BC
	POP	IX
	PUSH	DE
	POP	IY
; 31.	    unsigned char tmp;
; 32.	    unsigned char counter=2;
	LD	HL,0
	ADD	HL,SP
	LD	(HL),2
; 33.	    if ( a != b )
	EX	DE,HL
	AND	A
	SBC	HL,BC
	JR	Z,?0017
?0015:
?0018:
; 34.	        while(counter--)  //只交换序号
	LD	HL,0
	ADD	HL,SP
	LD	B,(HL)
	DEC	(HL)
	INC	B
	DEC	B
	JR	Z,?0017
?0019:
; 35.	        {
; 36.	            tmp = *a;
	LD	B,(IY+0)
; 37.	            *a = *b;
	LD	C,(IX+0)
	LD	(IY+0),C
; 38.	            *b = tmp;
	LD	(IX+0),B
; 39.	            a++;
; 40.	            b++;
; 41.	        }
; 42.	}  
	INC	IX
	INC	IY
	JR	?0015
?0017:
?0016:
	POP	HL
	POP	IX
	POP	IY
	JP	LWRD ?BANK_FAST_LEAVE_L08
shortsort:
; 43.	
; 44.	void  shortsort (char *lo,char *hi,unsigned int width )
; 45.	{
	PUSH	IY
	PUSH	IX
	LD	IX,0
	ADD	IX,SP
	PUSH	BC
	PUSH	DE
	PUSH	AF
?0021:
; 46.	    char *p, *max;
; 47.	    while (hi > lo) {
	LD	C,(IX-2)
	LD	B,(IX-1)
	LD	L,(IX-4)
	LD	H,(IX-3)
	AND	A
	SBC	HL,BC
	JP	NC,?0020
?0022:
; 48.	        max = lo;
	LD	L,(IX-4)
	LD	H,(IX-3)
	PUSH	HL
	POP	IY
; 49.	        for (p = lo+width; p <= hi; p += width) {
	LD	L,(IX+8)
	LD	H,(IX+9)
	LD	C,(IX-4)
	LD	B,(IX-3)
	ADD	HL,BC
	LD	(IX-6),L
	LD	(IX-5),H
?0024:
	LD	C,(IX-6)
	LD	B,(IX-5)
	LD	L,(IX-2)
	LD	H,(IX-1)
	AND	A
	SBC	HL,BC
	JR	C,?0023
?0025:
; 50.	            if (compare_string(p, max) > 0) {
	PUSH	IY
	POP	BC
	LD	E,(IX-6)
	LD	D,(IX-5)
	LD	A,BYTE3 compare_string
	LD	HL,LWRD compare_string
	CALL	LWRD ?BANK_CALL_DIRECT_L08
	LD	C,L
	LD	B,H
	LD	HL,0
	OR	128
	SBC	HL,BC
	JP	PO,?0068
	XOR	H
?0068:
	JP	P,?0028
?0027:
; 51.	                max = p;
	LD	L,(IX-6)
	LD	H,(IX-5)
	PUSH	HL
	POP	IY
?0028:
	LD	HL,0
	ADD	HL,SP
	LD	A,(HL)
	ADD	A,(IX+8)
	LD	(HL),A
	INC	HL
	LD	A,(HL)
	ADC	A,(IX+9)
	LD	(HL),A
	JR	?0024
?0023:
; 52.	            }
; 53.	        }
; 54.	        swap(max, hi);
	LD	C,(IX-2)
	LD	B,(IX-1)
	CALL	LWRD ?0077
; 55.	        hi -= width;
	LD	HL,4
	ADD	HL,SP
	LD	A,(HL)
	SUB	(IX+8)
	LD	(HL),A
	INC	HL
	LD	A,(HL)
	SBC	A,(IX+9)
	LD	(HL),A
; 56.	    }
; 57.	}
	JP	LWRD ?0021
?0020:
	JP	LWRD ?0014
?0077:
	PUSH	IY
	POP	DE
?0078:
	LD	A,BYTE3 swap
	LD	HL,LWRD swap
	JP	LWRD ?BANK_CALL_DIRECT_L08
list_sort:
; 58.	
; 59.	void  list_sort(char *base, unsigned short num, unsigned int width)
; 60.	{
	PUSH	IY
	PUSH	IX
	LD	IX,0
	ADD	IX,SP
	PUSH	BC
	PUSH	DE
	LD	HL,65404
	ADD	HL,SP
	LD	SP,HL
; 61.	    char *lo, *hi;               
; 62.	    char *mid;                   
; 63.	    char *loguy, *higuy;         
; 64.	    unsigned short size;             
; 65.	    char *lostk[30], *histk[30];
; 66.	    int stkptr;                  
; 67.	    if (num < 2 || width == 0)
	LD	BC,2
	LD	L,(IX-2)
	LD	H,(IX-1)
	AND	A
	SBC	HL,BC
	JP	C,?0063
	LD	A,(IX+8)
	OR	(IX+9)
	JP	Z,?0063
?0031:
?0032:
?0029:
?0030:
; 68.	        return;                 // nothing to do  
; 69.	    stkptr = 0;                 // initialize stack   
; 70.	    lo = base;
	EX	DE,HL
	PUSH	HL
	POP	IY
; 71.	    hi = (char *)base + width * (num-1);        // initialize limits
	LD	HL,6
	ADD	HL,SP
	PUSH	HL
	LD	HL,65535
	LD	C,(IX-2)
	LD	B,(IX-1)
	ADD	HL,BC
	LD	C,L
	LD	B,H
	LD	E,(IX+8)
	LD	D,(IX+9)
	CALL	LWRD ?S_MUL_L02
	LD	L,(IX-4)
	LD	H,(IX-3)
	ADD	HL,DE
	LD	C,L
	LD	B,H
	POP	HL
	LD	(HL),C
	INC	HL
	LD	(HL),B
	LD	HL,0
	ADD	HL,SP
	XOR	A
	LD	(HL),A
	INC	HL
	LD	(HL),A
?0033:
; 72.	recurse:
; 73.	      output8(REG4E_RTC_WATCH_DOG, input8(REG4E_RTC_WATCH_DOG) | 0x08);
	IN	A,(78)
	SET	3,A
	OUT	(78),A
; 74.	    size = (hi - lo) / width + 1;        // number of el's to sort  
	PUSH	IY
	POP	BC
	LD	HL,6
	ADD	HL,SP
	LD	D,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,D
	AND	A
	SBC	HL,BC
	EX	DE,HL
	LD	C,(IX+8)
	LD	B,(IX+9)
	CALL	LWRD ?US_DIV_L02
	INC	DE
; 75.	      if (size <= CUTOFF) {
	LD	C,E
	LD	B,D
	LD	HL,8
	AND	A
	SBC	HL,BC
	JR	C,?0035
?0034:
; 76.	        shortsort(lo, hi, width);   //冒泡法排序
	LD	L,(IX+8)
	LD	H,(IX+9)
	PUSH	HL
	LD	HL,8
	ADD	HL,SP
	LD	C,(HL)
	INC	HL
	LD	B,(HL)
	PUSH	IY
	POP	DE
	LD	A,BYTE3 shortsort
	LD	HL,LWRD shortsort
	CALL	LWRD ?BANK_CALL_DIRECT_L08
	POP	HL
; 77.	    }
; 78.	    else {
	JP	LWRD ?0061
?0035:
; 79.	        mid = lo + (size / 2) * width;      // find middle element  
	SRL	B
	RR	C
	LD	E,(IX+8)
	LD	D,(IX+9)
	CALL	LWRD ?S_MUL_L02
	PUSH	IY
	POP	HL
	ADD	HL,DE
; 80.	        swap(mid, lo);               //swap it to beginning of array  
	PUSH	IY
	POP	BC
	EX	DE,HL
	CALL	LWRD ?0078
; 81.	        loguy = lo;
	LD	HL,4
	ADD	HL,SP
	PUSH	IY
	POP	BC
	LD	(HL),C
	INC	HL
	LD	(HL),B
; 82.	        higuy = hi + width;
	DEC	HL
	DEC	HL
	DEC	HL
	PUSH	HL
	LD	L,(IX+8)
	LD	H,(IX+9)
	PUSH	HL
	LD	HL,10
	ADD	HL,SP
	LD	C,(HL)
	INC	HL
	LD	B,(HL)
	POP	HL
	ADD	HL,BC
	LD	C,L
	LD	B,H
	POP	HL
	LD	(HL),C
	INC	HL
	LD	(HL),B
?0038:
; 83.	        for (;;) {
?0041:
; 84.	            do  {
; 85.	                loguy += width;
	LD	HL,4
	ADD	HL,SP
	LD	A,(HL)
	ADD	A,(IX+8)
	LD	(HL),A
	INC	HL
	LD	A,(HL)
	ADC	A,(IX+9)
	LD	(HL),A
; 86.	            } while (loguy <= hi && compare_string(loguy, lo) <= 0);
	DEC	HL
	LD	C,(HL)
	LD	B,A
	INC	HL
	INC	HL
	LD	D,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,D
	AND	A
	SBC	HL,BC
	JR	C,?0039
	PUSH	IY
	POP	BC
	LD	HL,4
	ADD	HL,SP
	LD	E,(HL)
	LD	D,A
	LD	A,BYTE3 compare_string
	LD	HL,LWRD compare_string
	CALL	LWRD ?BANK_CALL_DIRECT_L08
	LD	C,L
	LD	B,H
	LD	HL,0
	OR	128
	SBC	HL,BC
	JP	PO,?0070
	XOR	H
?0070:
	JP	P,?0038
?0039:
?0046:
; 87.	            do  {
; 88.	                higuy -= width;
	LD	HL,2
	ADD	HL,SP
	LD	A,(HL)
	SUB	(IX+8)
	LD	(HL),A
	INC	HL
	LD	A,(HL)
	SBC	A,(IX+9)
	LD	(HL),A
; 89.	            } while (higuy > lo && compare_string(higuy, lo) >= 0);
	DEC	HL
	LD	C,(HL)
	LD	B,A
	PUSH	IY
	POP	HL
	AND	A
	SBC	HL,BC
	JR	NC,?0044
	PUSH	IY
	POP	BC
	LD	HL,2
	ADD	HL,SP
	LD	E,(HL)
	LD	D,A
	LD	A,BYTE3 compare_string
	LD	HL,LWRD compare_string
	CALL	LWRD ?BANK_CALL_DIRECT_L08
	BIT	7,H
	JR	Z,?0039
?0044:
; 90.	            
; 91.	            if (higuy < loguy)
	LD	HL,4
	ADD	HL,SP
	LD	C,(HL)
	INC	HL
	LD	B,(HL)
	DEC	HL
	DEC	HL
	DEC	HL
	LD	D,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,D
	AND	A
	SBC	HL,BC
	LD	HL,2
	JR	C,?0037
?0049:
; 92.	                break;
?0050:
; 93.	            swap(loguy, higuy);
	ADD	HL,SP
	LD	C,D
	INC	HL
	LD	B,(HL)
	INC	HL
	LD	E,(HL)
	INC	HL
	LD	D,(HL)
	CALL	LWRD ?0078
	JP	LWRD ?0038
?0037:
; 94.	        }
; 95.	        swap(lo, higuy);     // put partition element in place  
	ADD	HL,SP
	LD	C,D
	INC	HL
	LD	B,(HL)
	CALL	LWRD ?0077
; 96.	        if ( higuy - 1 - lo >= hi - loguy ) {
	LD	HL,4
	ADD	HL,SP
	LD	C,(HL)
	INC	HL
	LD	B,(HL)
	INC	HL
	LD	D,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,D
	AND	A
	SBC	HL,BC
	LD	C,L
	LD	B,H
	PUSH	IY
	POP	DE
	LD	HL,2
	ADD	HL,SP
	LD	A,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,A
	DEC	HL
	AND	A
	SBC	HL,DE
	OR	128
	SBC	HL,BC
	JP	PO,?0071
	XOR	H
?0071:
	JP	M,?0052
?0051:
; 97.	            if (lo + width < higuy) {
	LD	L,(IX+8)
	LD	H,(IX+9)
	PUSH	IY
	POP	BC
	ADD	HL,BC
	PUSH	HL
	LD	HL,4
	ADD	HL,SP
	LD	C,(HL)
	INC	HL
	LD	B,(HL)
	POP	HL
	AND	A
	SBC	HL,BC
	JR	NC,?0072
?0053:
; 98.	                lostk[stkptr] = lo;
	LD	HL,0
	ADD	HL,SP
	LD	B,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,B
	ADD	HL,HL
	PUSH	HL
	LD	HL,74
	ADD	HL,SP
	LD	C,L
	LD	B,H
	POP	HL
	ADD	HL,BC
	PUSH	IY
	POP	BC
	LD	(HL),C
	INC	HL
	LD	(HL),B
; 99.	                histk[stkptr] = higuy - width;
	LD	HL,0
	ADD	HL,SP
	LD	B,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,B
	ADD	HL,HL
	PUSH	HL
	LD	HL,14
	ADD	HL,SP
	LD	C,L
	LD	B,H
	POP	HL
	ADD	HL,BC
	PUSH	HL
	LD	C,(IX+8)
	LD	B,(IX+9)
	LD	HL,4
	ADD	HL,SP
	LD	D,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,D
	AND	A
	SBC	HL,BC
	LD	C,L
	LD	B,H
	POP	HL
	LD	(HL),C
	INC	HL
	LD	(HL),B
; 100.	                ++stkptr;
	LD	HL,0
	ADD	HL,SP
	INC	(HL)
	INC	HL
	JR	NZ,?0072
	INC	(HL)
?0072:
?0054:
; 101.	            }                           //save big recursion for later  
; 102.	            
; 103.	            if (loguy < hi) {
	LD	HL,6
	ADD	HL,SP
	LD	C,(HL)
	INC	HL
	LD	B,(HL)
	DEC	HL
	DEC	HL
	DEC	HL
	LD	D,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,D
	AND	A
	SBC	HL,BC
	JP	NC,?0061
?0055:
; 104.	                lo = loguy;
	LD	HL,4
	ADD	HL,SP
	LD	B,D
	INC	HL
	LD	H,(HL)
	LD	L,B
	PUSH	HL
	POP	IY
; 105.	                goto recurse;           // do small recursion  
	JP	LWRD ?0033
?0056:
; 106.	            }
; 107.	        }
; 108.	        else {
?0052:
; 109.	            if (loguy < hi) {
	LD	HL,6
	ADD	HL,SP
	LD	C,(HL)
	INC	HL
	LD	B,(HL)
	DEC	HL
	DEC	HL
	DEC	HL
	LD	D,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,D
	AND	A
	SBC	HL,BC
	JR	NC,?0073
?0058:
; 110.	                lostk[stkptr] = loguy;
	LD	HL,0
	ADD	HL,SP
	LD	B,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,B
	ADD	HL,HL
	PUSH	HL
	LD	HL,74
	ADD	HL,SP
	LD	C,L
	LD	B,H
	POP	HL
	ADD	HL,BC
	PUSH	HL
	LD	HL,6
	ADD	HL,SP
	LD	C,D
	INC	HL
	LD	B,(HL)
	POP	HL
	LD	(HL),C
	INC	HL
	LD	(HL),B
; 111.	                histk[stkptr] = hi;
	LD	HL,0
	ADD	HL,SP
	LD	B,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,B
	ADD	HL,HL
	PUSH	HL
	LD	HL,14
	ADD	HL,SP
	LD	C,L
	LD	B,H
	POP	HL
	ADD	HL,BC
	PUSH	HL
	LD	HL,8
	ADD	HL,SP
	LD	C,(HL)
	INC	HL
	LD	B,(HL)
	POP	HL
	LD	(HL),C
	INC	HL
	LD	(HL),B
; 112.	                ++stkptr;               //save big recursion for later  
	LD	HL,0
	ADD	HL,SP
	INC	(HL)
	INC	HL
	JR	NZ,?0073
	INC	(HL)
?0073:
?0059:
; 113.	            }
; 114.	            
; 115.	            if (lo + width < higuy) {
	LD	L,(IX+8)
	LD	H,(IX+9)
	PUSH	IY
	POP	BC
	ADD	HL,BC
	PUSH	HL
	LD	HL,4
	ADD	HL,SP
	LD	C,(HL)
	INC	HL
	LD	B,(HL)
	POP	HL
	AND	A
	SBC	HL,BC
	JR	NC,?0061
?0060:
; 116.	                hi = higuy - width;
	LD	HL,6
	ADD	HL,SP
	PUSH	HL
	LD	C,(IX+8)
	LD	B,(IX+9)
	LD	HL,4
	ADD	HL,SP
	LD	D,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,D
	AND	A
	SBC	HL,BC
	LD	C,L
	LD	B,H
	JR	?0074
; 117.	                goto recurse;           // do small recursion  
?0061:
?0057:
?0036:
; 118.	            }
; 119.	        }
; 120.	    }
; 121.	    --stkptr;
	LD	HL,0
	ADD	HL,SP
	LD	C,(HL)
	INC	HL
	LD	B,(HL)
	DEC	BC
	LD	(HL),B
	DEC	HL
	LD	(HL),C
; 122.	    if (stkptr >= 0) {
	BIT	7,B
	JR	NZ,?0063
?0062:
; 123.	        lo = lostk[stkptr];
	LD	B,C
	INC	HL
	LD	H,(HL)
	LD	L,B
	ADD	HL,HL
	PUSH	HL
	LD	HL,74
	ADD	HL,SP
	LD	C,L
	LD	B,H
	POP	HL
	ADD	HL,BC
	LD	B,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,B
	PUSH	HL
	POP	IY
; 124.	        hi = histk[stkptr];
	LD	HL,6
	ADD	HL,SP
	PUSH	HL
	LD	HL,2
	ADD	HL,SP
	LD	B,(HL)
	INC	HL
	LD	H,(HL)
	LD	L,B
	ADD	HL,HL
	PUSH	HL
	LD	HL,16
	ADD	HL,SP
	LD	C,L
	LD	B,H
	POP	HL
	ADD	HL,BC
	LD	C,(HL)
	INC	HL
	LD	B,(HL)
?0074:
	POP	HL
	LD	(HL),C
	INC	HL
	LD	(HL),B
; 125.	        goto recurse;           // pop subarray from stack 
	JP	LWRD ?0033
?0063:
; 126.	    }
; 127.	    else
; 128.	        return;                 /* all subarrays done */
; 129.	}
?0064:
	JP	LWRD ?0014
	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -