📄 listsort.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 + -