     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) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    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 Kppers
   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:
