17B1 OPT opt 17B1 .error 17B1 CB .exit RETF 17B2 .sort 17B2 8C D8 mov ax,ds 17B4 8C C3 mov bx,es 17B6 8E C0 mov es,ax 17B8 8E DB mov ds,bx 17BA 26 80 7E 01 05 cmp byte ptr es:[bp+1],5 17BF 75 F0 jnz error 17C1 26 8B 5E 02 mov bx,es:[bp+2] 17C5 80 7F FD 01 cmp byte ptr [bx-3],1 17C9 75 E6 jnz error 17CB 8B 47 FE mov ax,[bx-2] 17CE ; 17CE 8B D6 mov dx,si 17D0 22 F2 and dh,dl 17D2 ; 17D2 BF FF FF mov di,&FFFF 17D5 D1 EF .rotate shr di,1 17D7 3B C7 cmp ax,di 17D9 72 FA jc rotate 17DB 8B C8 mov cx,ax 17DD D1 E0 shl ax,1 17DF D1 E0 shl ax,1 17E1 03 C1 add ax,cx 17E3 2E A3 E5 18 mov cs:[end],ax 17E7 ; 17E7 .loop 17E7 D1 EF shr di,1 17E9 2E 89 3E E9 18 mov cs:[spacer],di 17EE 8B C7 mov ax,di 17F0 D1 E0 shl ax,1 17F2 D1 E0 shl ax,1 17F4 03 F8 add di,ax 17F6 74 B9 jz exit 17F8 33 F6 xor si,si 17FA 2E 89 36 E7 18 mov cs:[item],si 17FF .cmpare 17FF ; 17FF ;si,di = offsets to elements to compare 17FF ; dh = &FF if big model 17FF ;ds|bx = base of array to be sorted 17FF ; 17FF E8 6A 00 call ifcp 1802 73 48 jnc OK 1804 .swap 1804 ; 1804 ;si,di = offsets to elements to swap 1804 ;es|bp = address of parameter block 1804 ; dh = &FF if big model 1804 ; ds = es if small model 1804 ; 1804 1E push ds 1805 53 push bx 1806 55 push bp 1807 26 8A 4E 00 mov cl,es:[bp] 180B 32 ED xor ch,ch 180D 45 inc bp 180E 80 FE FF cmp dh,&FF 1811 45 .swap1 inc bp 1812 26 8B 5E 00 mov bx,es:[bp] 1816 72 07 jc small1 1818 83 C5 02 add bp,2 181B 26 8E 5E 00 mov ds,es:[bp] 181F 8B 00 .small1 mov ax,[bx+si] 1821 87 01 xchg ax,[bx+di] 1823 89 00 mov [bx+si],ax 1825 8B 40 02 mov ax,[bx+si+2] 1828 87 41 02 xchg ax,[bx+di+2] 182B 89 40 02 mov [bx+si+2],ax 182E 8A 40 04 mov al,[bx+si+4] 1831 86 41 04 xchg al,[bx+di+4] 1834 88 40 04 mov [bx+si+4],al 1837 45 inc bp 1838 45 inc bp 1839 E2 D6 loop swap1 183B 5D pop bp 183C 5B pop bx 183D 1F pop ds 183E ; 183E 8B C7 mov ax,di 1840 2B C6 sub ax,si 1842 3B F0 cmp si,ax 1844 72 06 jc OK 1846 8B FE mov di,si 1848 2B F0 sub si,ax 184A .cmpare1 184A EB B3 jmps cmpare 184C ; 184C .OK 184C 2B FE sub di,si 184E 2E 8B 36 E7 18 mov si,cs:[item] 1853 83 C6 05 add si,5 1856 2E 89 36 E7 18 mov cs:[item],si 185B 03 FE add di,si 185D 2E 3B 3E E5 18 cmp di,cs:[end] 1862 72 E6 jc cmpare1 1864 2E 8B 3E E9 18 mov di,cs:[spacer] 1869 E9 7B FF jmp loop 186C ; 186C .ifcp 186C 8A 41 03 mov al,[bx+di+3] 186F 32 40 03 xor al,[bx+si+3] 1872 78 15 js ifcp7 1874 8A 40 04 mov al,[bx+si+4] 1877 0A C0 or al,al 1879 75 21 jnz ifcp1 187B 3A 41 04 cmp al,[bx+di+4] 187E 74 0F jz ifcp6 1880 87 F7 xchg si,di 1882 E8 17 00 call ifcp1 1885 87 F7 xchg si,di 1887 F5 cmc 1888 C3 ret 1889 ; 1889 .ifcp7 1889 8A 41 03 mov al,[bx+di+3] 188C D0 D0 rcl al,1 188E C3 ret 188F ; 188F .ifcp6 188F 8B 41 02 mov ax,[bx+di+2] 1892 3B 40 02 cmp ax,[bx+si+2] 1895 75 4D jnz fcpret 1897 8B 01 mov ax,[bx+di] 1899 3B 00 cmp ax,[bx+si] 189B C3 ret 189C ; 189C .ifcp1 189C F6 41 03 80 test byte ptr [bx+di+3],&80 18A0 74 05 jz ifcp2 18A2 E8 02 00 call ifcp2 18A5 F5 cmc 18A6 C3 ret 18A7 ; 18A7 .ifcp2 18A7 8A 51 04 mov dl,[bx+di+4] 18AA 8B 49 02 mov cx,[bx+di+2] 18AD 8B 01 mov ax,[bx+di] 18AF 0A D2 or dl,dl 18B1 75 25 jnz ifcp3 18B3 50 push ax 18B4 0B C1 or ax,cx 18B6 58 pop ax 18B7 74 1F jz ifcp3 18B9 B2 9F mov dl,159 18BB 0A ED or ch,ch 18BD 9C pushf 18BE 79 0A jns ifcp4 18C0 F7 D8 neg ax 18C2 F7 D1 not cx 18C4 F5 cmc 18C5 83 D1 00 adc cx,0 18C8 78 08 js ifcp5 18CA .ifcp4 18CA FE CA dec dl 18CC D1 E0 shl ax,1 18CE 13 C9 adc cx,cx 18D0 79 F8 jns ifcp4 18D2 .ifcp5 18D2 9D popf 18D3 78 03 js ifcp3 18D5 80 E5 7F and ch,&7F 18D8 .ifcp3 18D8 3A 50 04 cmp dl,[bx+si+4] 18DB 75 07 jnz fcpret 18DD 3B 48 02 cmp cx,[bx+si+2] 18E0 75 02 jnz fcpret 18E2 3B 00 cmp ax,[bx+si] 18E4 .fcpret 18E4 C3 ret 18E5 ; 18E5 00 00 .end DW 0 18E7 00 00 .item DW 0 18E9 00 00 .spacer DW 0