1 ; **************************************************************************** 2 ; qsort.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'qsort.prg') 3 ; ---------------------------------------------------------------------------- 4 ; QSORT.PRG ! Sorting Method TEST program ! 5 ; 6 ; 07/04/2017 7 ; 8 ; [ Last Modification: 07/04/2017 ] 9 ; 10 ; Assembler: NASM 2.11 11 ; **************************************************************************** 12 13 ; 01/03/2017 14 ; 16/10/2016 15 ; 29/04/2016 16 ; TRDOS 386 system calls (temporary list!) 17 _ver equ 0 18 _exit equ 1 19 _fork equ 2 20 _read equ 3 21 _write equ 4 22 _open equ 5 23 _close equ 6 24 _wait equ 7 25 _creat equ 8 26 _link equ 9 27 _unlink equ 10 28 _exec equ 11 29 _chdir equ 12 30 _time equ 13 31 _mkdir equ 14 32 _chmod equ 15 33 _chown equ 16 34 _break equ 17 35 _stat equ 18 36 _seek equ 19 37 _tell equ 20 38 _mount equ 21 39 _umount equ 22 40 _setuid equ 23 41 _getuid equ 24 42 _stime equ 25 43 _quit equ 26 44 _intr equ 27 45 _fstat equ 28 46 _emt equ 29 47 _mdate equ 30 48 _video equ 31 49 _audio equ 32 50 _timer equ 33 51 _sleep equ 34 52 _msg equ 35 53 _geterr equ 36 54 _fpsave equ 37 55 _pri equ 38 56 _rele equ 39 57 _fff equ 40 58 _fnf equ 41 59 _alloc equ 42 60 _dalloc equ 43 61 _calbac equ 44 62 63 %macro sys 1-4 64 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 65 ; 03/09/2015 66 ; 13/04/2015 67 ; Retro UNIX 386 v1 system call. 68 %if %0 >= 2 69 mov ebx, %2 70 %if %0 >= 3 71 mov ecx, %3 72 %if %0 = 4 73 mov edx, %4 74 %endif 75 %endif 76 %endif 77 mov eax, %1 78 ;int 30h 79 int 40h ; TRDOS 386 (TRDOS v2.0) 80 %endmacro 81 82 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 83 ; sys systemcall (eax) , , 84 85 [BITS 32] 86 87 [ORG 0] 88 89 ;============================================================================= 90 ; CODE 91 ;============================================================================= 92 93 [BITS 32] ; 80386 Protected Mode (32 bit) intructions 94 95 [ORG 0] 96 97 start: 98 sys _msg, prg_msg, 255, 0Fh 98 <1> 98 <1> 98 <1> 98 <1> 98 <1> %if %0 >= 2 98 00000000 BB[D5000000] <1> mov ebx, %2 98 <1> %if %0 >= 3 98 00000005 B9FF000000 <1> mov ecx, %3 98 <1> %if %0 = 4 98 0000000A BA0F000000 <1> mov edx, %4 98 <1> %endif 98 <1> %endif 98 <1> %endif 98 0000000F B823000000 <1> mov eax, %1 98 <1> 98 00000014 CD40 <1> int 40h 99 100 00000016 BE[1E010000] mov esi, SData 101 0000001B 56 push esi 102 0000001C BF[4E010000] mov edi, SData_End 103 00000021 57 push edi 104 00000022 E849000000 call qsort 105 106 00000027 BE[1E010000] mov esi, SData 107 0000002C BF[4E010000] mov edi, SData_End 108 _1: 109 00000031 AD lodsd 110 00000032 E87B000000 call decimal 111 sys _msg, decimal_num_str, 255, 0Eh 111 <1> 111 <1> 111 <1> 111 <1> 111 <1> %if %0 >= 2 111 00000037 BB[14010000] <1> mov ebx, %2 111 <1> %if %0 >= 3 111 0000003C B9FF000000 <1> mov ecx, %3 111 <1> %if %0 = 4 111 00000041 BA0E000000 <1> mov edx, %4 111 <1> %endif 111 <1> %endif 111 <1> %endif 111 00000046 B823000000 <1> mov eax, %1 111 <1> 111 0000004B CD40 <1> int 40h 112 0000004D 39FE cmp esi, edi 113 0000004F 76E0 jna short _1 114 115 sys _msg, _nextline, 3, 07h 115 <1> 115 <1> 115 <1> 115 <1> 115 <1> %if %0 >= 2 115 00000051 BB[52010000] <1> mov ebx, %2 115 <1> %if %0 >= 3 115 00000056 B903000000 <1> mov ecx, %3 115 <1> %if %0 = 4 115 0000005B BA07000000 <1> mov edx, %4 115 <1> %endif 115 <1> %endif 115 <1> %endif 115 00000060 B823000000 <1> mov eax, %1 115 <1> 115 00000065 CD40 <1> int 40h 116 terminate: 117 sys _exit ; INT 40h 117 <1> 117 <1> 117 <1> 117 <1> 117 <1> %if %0 >= 2 117 <1> mov ebx, %2 117 <1> %if %0 >= 3 117 <1> mov ecx, %3 117 <1> %if %0 = 4 117 <1> mov edx, %4 117 <1> %endif 117 <1> %endif 117 <1> %endif 117 00000067 B801000000 <1> mov eax, %1 117 <1> 117 0000006C CD40 <1> int 40h 118 here: 119 0000006E EBFE jmp short here 120 121 ; OMNISCENT.ASM (sncomni.s) 122 ;*********************************************** 123 ;* descript. : recursive index quicksort * 124 ;* parameter : l,r:stack left and right border * 125 ;* sideeffect: ax,bx,cx,dx,si,di * 126 ;* back : none * 127 ;*********************************************** 128 129 ; Derived from source code of 'OMNISCENT.ASM' by Dirk Küppers 130 ; SNC_OMNI.COM (MSDOS) intro file, 1997 131 132 qsort: 133 00000070 58 pop eax ; get address 134 00000071 59 pop ecx ; get 2. param r 135 00000072 5B pop ebx ; get 1. param l 136 00000073 50 push eax ; store address 137 138 00000074 39D9 cmp ecx, ebx 139 ;jle short QSendrek 140 00000076 7639 jna short QSendrek 141 00000078 89DE mov esi, ebx 142 0000007A 89CF mov edi, ecx 143 0000007C 8B16 mov edx, dword [esi] 144 0000007E EB09 jmp short QSwhile2 145 QSrepeat: 146 00000080 3916 QSwhile1: cmp dword [esi], edx 147 ;jle short QSwhile2 148 00000082 7605 jna short QSwhile2 149 00000084 83C604 add esi, 4 150 00000087 EBF7 jmp short QSwhile1 151 QSwhile2: 152 00000089 3917 cmp dword [edi], edx 153 ;jnl short QSwhile2e 154 0000008B 7305 jae short QSwhile2e 155 0000008D 83EF04 sub edi, 4 156 00000090 EBF7 jmp short QSwhile2 157 QSwhile2e: 158 00000092 39FE cmp esi, edi 159 ;jg short QSnoswap 160 ;jg short _QSnoswap 161 00000094 770D ja short _QSnoswap 162 00000096 AD lodsd 163 00000097 8707 xchg eax, dword [edi] 164 00000099 8946FC mov dword [esi-4], eax 165 0000009C 83EF04 sub edi, 4 166 QSnoswap: 167 0000009F 39FE cmp esi, edi 168 ;jle short QSrepeat 169 000000A1 76DD jna short QSrepeat 170 _QSnoswap: 171 000000A3 56 push esi 172 000000A4 51 push ecx 173 000000A5 53 push ebx 174 000000A6 57 push edi 175 000000A7 E8C4FFFFFF call qsort 176 000000AC E8BFFFFFFF call qsort 177 QSendrek: 178 000000B1 C3 retn 179 180 181 decimal: 182 ; Input: 183 ; eax = binary number 184 ; Output: 185 ; decimal number str at offset _number 186 ; 187 000000B2 89E5 mov ebp, esp 188 000000B4 B90A000000 mov ecx, 10 189 _2: 190 000000B9 31D2 xor edx, edx 191 000000BB F7F1 div ecx 192 000000BD 52 push edx 193 000000BE 21C0 and eax, eax 194 000000C0 75F7 jnz short _2 195 000000C2 BB[16010000] mov ebx, _number 196 _3: 197 000000C7 58 pop eax 198 000000C8 0430 add al, '0' 199 000000CA 8803 mov [ebx], al 200 000000CC 43 inc ebx 201 000000CD 39EC cmp esp, ebp 202 000000CF 72F6 jb short _3 203 000000D1 C60300 mov byte [ebx], 0 204 000000D4 C3 retn 205 206 207 ;============================================================================= 208 ; DATA 209 ;============================================================================= 210 211 prg_msg: 212 000000D5 4552444F47414E2054- db 'ERDOGAN TAN - TRDOS 386 Sorting Test - QSORT.PRG' 212 000000DE 414E202D205452444F- 212 000000E7 532033383620536F72- 212 000000F0 74696E672054657374- 212 000000F9 202D2051534F52542E- 212 00000102 505247 213 00000105 0D0A db 0Dh, 0Ah 214 00000107 30372F30342F323031- db '07/04/2017' 214 00000110 37 215 00000111 0D0A db 0Dh, 0Ah 216 00000113 00 db 0 217 218 decimal_num_str: 219 00000114 0D0A db 0Dh, 0Ah 220 00000116 30303030303030 _number: db '0000000' 221 0000011D 00 db 0 222 223 0000011E 18B80000 SData: dd 47128 224 00000122 718E1300 dd 1281649 225 00000126 042C0000 dd 11268 226 0000012A 0F000000 dd 15 227 0000012E 75020000 dd 629 228 00000132 8A080000 dd 2186 229 00000136 421A5900 dd 5839426 230 0000013A 7C040D00 dd 853116 231 0000013E 78630100 dd 91000 232 00000142 E8030000 dd 1000 233 00000146 64000000 dd 100 234 0000014A 08020000 dd 520 235 0000014E 10270000 SData_End: dd 10000 236 _nextline: 237 00000152 0D0A00 db 0Dh, 0Ah, 0 238 239 bss_end: