     1                                  ; ****************************************************************************
     2                                  ; pushtest.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'pushtest.prg')
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; PUSHTEST.PRG ! TEST program !
     5                                  ;
     6                                  ; 10/08/2016
     7                                  ;
     8                                  ; ****************************************************************************
     9                                  
    10                                  ; 01/03/2017
    11                                  ; 16/10/2016
    12                                  ; 29/04/2016
    13                                  ; TRDOS 386 system calls (temporary list!)
    14                                  _ver 	equ 0
    15                                  _exit 	equ 1
    16                                  _fork 	equ 2
    17                                  _read 	equ 3
    18                                  _write	equ 4
    19                                  _open	equ 5
    20                                  _close 	equ 6
    21                                  _wait 	equ 7
    22                                  _creat 	equ 8
    23                                  _link 	equ 9
    24                                  _unlink	equ 10
    25                                  _exec	equ 11
    26                                  _chdir	equ 12
    27                                  _time 	equ 13
    28                                  _mkdir 	equ 14
    29                                  _chmod	equ 15
    30                                  _chown	equ 16
    31                                  _break	equ 17
    32                                  _stat	equ 18
    33                                  _seek	equ 19
    34                                  _tell 	equ 20
    35                                  _mount	equ 21
    36                                  _umount	equ 22
    37                                  _setuid	equ 23
    38                                  _getuid	equ 24
    39                                  _stime	equ 25
    40                                  _quit	equ 26	
    41                                  _intr	equ 27
    42                                  _fstat	equ 28
    43                                  _emt 	equ 29
    44                                  _mdate 	equ 30
    45                                  _video 	equ 31
    46                                  _audio	equ 32
    47                                  _timer	equ 33
    48                                  _sleep	equ 34
    49                                  _msg    equ 35
    50                                  _geterr	equ 36
    51                                  _fpsave	equ 37
    52                                  _pri	equ 38
    53                                  _rele	equ 39
    54                                  _fff	equ 40
    55                                  _fnf	equ 41
    56                                  _alloc	equ 42
    57                                  _dalloc equ 43
    58                                  _calbac equ 44	
    59                                  
    60                                  %macro sys 1-4
    61                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    62                                      ; 03/09/2015	
    63                                      ; 13/04/2015
    64                                      ; Retro UNIX 386 v1 system call.		
    65                                      %if %0 >= 2   
    66                                          mov ebx, %2
    67                                          %if %0 >= 3    
    68                                              mov ecx, %3
    69                                              %if %0 = 4
    70                                                 mov edx, %4   
    71                                              %endif
    72                                          %endif
    73                                      %endif
    74                                      mov eax, %1
    75                                      ;int 30h
    76                                      int 40h ; TRDOS 386 (TRDOS v2.0)		   
    77                                  %endmacro
    78                                  
    79                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    80                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    81                                  
    82                                  [BITS 32] ; We need 32-bit intructions for protected mode
    83                                  
    84                                  [ORG 0] 
    85                                  
    86                                  START_CODE:
    87 00000000 89E5                    	mov	ebp, esp
    88 00000002 6689EB                  	mov	bx, bp
    89 00000005 6653                    	push	bx
    90 00000007 66391C24                	cmp 	word [esp], bx
    91 0000000B 7518                    	jne	short _1
    92                                  
    93                                  	sys	_msg, msg_ok1, 255, 0Fh	
    93                              <1> 
    93                              <1> 
    93                              <1> 
    93                              <1> 
    93                              <1>  %if %0 >= 2
    93 0000000D BB[92010000]        <1>  mov ebx, %2
    93                              <1>  %if %0 >= 3
    93 00000012 B9FF000000          <1>  mov ecx, %3
    93                              <1>  %if %0 = 4
    93 00000017 BA0F000000          <1>  mov edx, %4
    93                              <1>  %endif
    93                              <1>  %endif
    93                              <1>  %endif
    93 0000001C B823000000          <1>  mov eax, %1
    93                              <1> 
    93 00000021 CD40                <1>  int 40h
    94                                  
    95 00000023 EB16                    	jmp	 short _1_ok
    96                                  _1:	
    97                                  	sys	_msg, msg_err1, 255, 0Fh	
    97                              <1> 
    97                              <1> 
    97                              <1> 
    97                              <1> 
    97                              <1>  %if %0 >= 2
    97 00000025 BB[5E020000]        <1>  mov ebx, %2
    97                              <1>  %if %0 >= 3
    97 0000002A B9FF000000          <1>  mov ecx, %3
    97                              <1>  %if %0 = 4
    97 0000002F BA0F000000          <1>  mov edx, %4
    97                              <1>  %endif
    97                              <1>  %endif
    97                              <1>  %endif
    97 00000034 B823000000          <1>  mov eax, %1
    97                              <1> 
    97 00000039 CD40                <1>  int 40h
    98                                  _1_ok:
    99 0000003B 89EB                    	mov	ebx, ebp
   100 0000003D 83EB04                  	sub	ebx, 4
   101 00000040 39E3                    	cmp	ebx, esp
   102 00000042 7518                    	jne	short _2
   103                                  
   104                                  	sys	_msg, msg_ok2, 255, 0Fh	
   104                              <1> 
   104                              <1> 
   104                              <1> 
   104                              <1> 
   104                              <1>  %if %0 >= 2
   104 00000044 BB[B5010000]        <1>  mov ebx, %2
   104                              <1>  %if %0 >= 3
   104 00000049 B9FF000000          <1>  mov ecx, %3
   104                              <1>  %if %0 = 4
   104 0000004E BA0F000000          <1>  mov edx, %4
   104                              <1>  %endif
   104                              <1>  %endif
   104                              <1>  %endif
   104 00000053 B823000000          <1>  mov eax, %1
   104                              <1> 
   104 00000058 CD40                <1>  int 40h
   105                                  
   106 0000005A EB35                    	jmp	short _2_ok
   107                                  _2:
   108 0000005C 83C302                  	add	ebx, 2
   109 0000005F 39E3                    	cmp	ebx, esp
   110 00000061 7418                    	je	short _2_err
   111                                  
   112                                  	sys	_msg, msg_err, 255, 0Fh	
   112                              <1> 
   112                              <1> 
   112                              <1> 
   112                              <1> 
   112                              <1>  %if %0 >= 2
   112 00000063 BB[95030000]        <1>  mov ebx, %2
   112                              <1>  %if %0 >= 3
   112 00000068 B9FF000000          <1>  mov ecx, %3
   112                              <1>  %if %0 = 4
   112 0000006D BA0F000000          <1>  mov edx, %4
   112                              <1>  %endif
   112                              <1>  %endif
   112                              <1>  %endif
   112 00000072 B823000000          <1>  mov eax, %1
   112                              <1> 
   112 00000077 CD40                <1>  int 40h
   113                                  
   114 00000079 EB16                    	jmp	short _2_ok
   115                                  _2_err:
   116                                  	sys	_msg, msg_err2, 255, 0Fh	
   116                              <1> 
   116                              <1> 
   116                              <1> 
   116                              <1> 
   116                              <1>  %if %0 >= 2
   116 0000007B BB[86020000]        <1>  mov ebx, %2
   116                              <1>  %if %0 >= 3
   116 00000080 B9FF000000          <1>  mov ecx, %3
   116                              <1>  %if %0 = 4
   116 00000085 BA0F000000          <1>  mov edx, %4
   116                              <1>  %endif
   116                              <1>  %endif
   116                              <1>  %endif
   116 0000008A B823000000          <1>  mov eax, %1
   116                              <1> 
   116 0000008F CD40                <1>  int 40h
   117                                  _2_ok:
   118 00000091 665B                    	pop	bx
   119                                  
   120 00000093 66FF35[90010000]        	push	word [numara]
   121 0000009A 66813C24D204            	cmp	word [esp], 1234
   122 000000A0 7518                    	jne	short _3
   123                                  
   124                                  	sys	_msg, msg_ok3, 255, 0Fh	
   124                              <1> 
   124                              <1> 
   124                              <1> 
   124                              <1> 
   124                              <1>  %if %0 >= 2
   124 000000A2 BB[D6010000]        <1>  mov ebx, %2
   124                              <1>  %if %0 >= 3
   124 000000A7 B9FF000000          <1>  mov ecx, %3
   124                              <1>  %if %0 = 4
   124 000000AC BA0F000000          <1>  mov edx, %4
   124                              <1>  %endif
   124                              <1>  %endif
   124                              <1>  %endif
   124 000000B1 B823000000          <1>  mov eax, %1
   124                              <1> 
   124 000000B6 CD40                <1>  int 40h
   125                                  
   126 000000B8 EB16                    	jmp	short _3_ok
   127                                  _3:
   128                                  	sys	_msg, msg_err2, 255, 0Fh
   128                              <1> 
   128                              <1> 
   128                              <1> 
   128                              <1> 
   128                              <1>  %if %0 >= 2
   128 000000BA BB[86020000]        <1>  mov ebx, %2
   128                              <1>  %if %0 >= 3
   128 000000BF B9FF000000          <1>  mov ecx, %3
   128                              <1>  %if %0 = 4
   128 000000C4 BA0F000000          <1>  mov edx, %4
   128                              <1>  %endif
   128                              <1>  %endif
   128                              <1>  %endif
   128 000000C9 B823000000          <1>  mov eax, %1
   128                              <1> 
   128 000000CE CD40                <1>  int 40h
   129                                  _3_ok:
   130 000000D0 89EB                    	mov	ebx, ebp
   131 000000D2 83EB04                  	sub	ebx, 4
   132 000000D5 39E3                    	cmp	ebx, esp
   133 000000D7 7518                    	jne	short _4
   134                                  
   135                                  	sys	_msg, msg_ok4, 255, 0Fh	
   135                              <1> 
   135                              <1> 
   135                              <1> 
   135                              <1> 
   135                              <1>  %if %0 >= 2
   135 000000D9 BB[06020000]        <1>  mov ebx, %2
   135                              <1>  %if %0 >= 3
   135 000000DE B9FF000000          <1>  mov ecx, %3
   135                              <1>  %if %0 = 4
   135 000000E3 BA0F000000          <1>  mov edx, %4
   135                              <1>  %endif
   135                              <1>  %endif
   135                              <1>  %endif
   135 000000E8 B823000000          <1>  mov eax, %1
   135                              <1> 
   135 000000ED CD40                <1>  int 40h
   136                                  
   137 000000EF EB35                    	jmp	short _4_ok
   138                                  _4:
   139 000000F1 83C302                  	add	ebx, 2
   140 000000F4 39E3                    	cmp	ebx, esp
   141 000000F6 7418                    	je	short _4_err
   142                                  
   143                                  	sys	_msg, msg_err, 255, 0Fh	
   143                              <1> 
   143                              <1> 
   143                              <1> 
   143                              <1> 
   143                              <1>  %if %0 >= 2
   143 000000F8 BB[95030000]        <1>  mov ebx, %2
   143                              <1>  %if %0 >= 3
   143 000000FD B9FF000000          <1>  mov ecx, %3
   143                              <1>  %if %0 = 4
   143 00000102 BA0F000000          <1>  mov edx, %4
   143                              <1>  %endif
   143                              <1>  %endif
   143                              <1>  %endif
   143 00000107 B823000000          <1>  mov eax, %1
   143                              <1> 
   143 0000010C CD40                <1>  int 40h
   144                                  
   145 0000010E EB16                    	jmp	short _4_ok
   146                                  _4_err:
   147                                  	sys	_msg, msg_err4, 255, 0Fh	
   147                              <1> 
   147                              <1> 
   147                              <1> 
   147                              <1> 
   147                              <1>  %if %0 >= 2
   147 00000110 BB[F7020000]        <1>  mov ebx, %2
   147                              <1>  %if %0 >= 3
   147 00000115 B9FF000000          <1>  mov ecx, %3
   147                              <1>  %if %0 = 4
   147 0000011A BA0F000000          <1>  mov edx, %4
   147                              <1>  %endif
   147                              <1>  %endif
   147                              <1>  %endif
   147 0000011F B823000000          <1>  mov eax, %1
   147                              <1> 
   147 00000124 CD40                <1>  int 40h
   148                                  _4_ok:
   149 00000126 5B                      	pop	ebx
   150 00000127 81FBD2040000            	cmp	ebx, 1234
   151 0000012D 7518                    	jne	short _5
   152                                  
   153                                  	sys	_msg, msg_ok5, 255, 0Fh
   153                              <1> 
   153                              <1> 
   153                              <1> 
   153                              <1> 
   153                              <1>  %if %0 >= 2
   153 0000012F BB[32020000]        <1>  mov ebx, %2
   153                              <1>  %if %0 >= 3
   153 00000134 B9FF000000          <1>  mov ecx, %3
   153                              <1>  %if %0 = 4
   153 00000139 BA0F000000          <1>  mov edx, %4
   153                              <1>  %endif
   153                              <1>  %endif
   153                              <1>  %endif
   153 0000013E B823000000          <1>  mov eax, %1
   153                              <1> 
   153 00000143 CD40                <1>  int 40h
   154                                  
   155 00000145 EB36                    	jmp	short _5_ok
   156                                  _5:
   157 00000147 53                      	push	ebx
   158                                  	sys	_msg, msg_err5, 255, 0Fh
   158                              <1> 
   158                              <1> 
   158                              <1> 
   158                              <1> 
   158                              <1>  %if %0 >= 2
   158 00000148 BB[3E030000]        <1>  mov ebx, %2
   158                              <1>  %if %0 >= 3
   158 0000014D B9FF000000          <1>  mov ecx, %3
   158                              <1>  %if %0 = 4
   158 00000152 BA0F000000          <1>  mov edx, %4
   158                              <1>  %endif
   158                              <1>  %endif
   158                              <1>  %endif
   158 00000157 B823000000          <1>  mov eax, %1
   158                              <1> 
   158 0000015C CD40                <1>  int 40h
   159 0000015E 665B                    	pop	bx
   160 00000160 6681FBD204              	cmp	bx, 1234
   161 00000165 7516                    	jne	short _5_ok
   162                                  	sys	_msg, msg_ok6, 255, 0Fh
   162                              <1> 
   162                              <1> 
   162                              <1> 
   162                              <1> 
   162                              <1>  %if %0 >= 2
   162 00000167 BB[6C030000]        <1>  mov ebx, %2
   162                              <1>  %if %0 >= 3
   162 0000016C B9FF000000          <1>  mov ecx, %3
   162                              <1>  %if %0 = 4
   162 00000171 BA0F000000          <1>  mov edx, %4
   162                              <1>  %endif
   162                              <1>  %endif
   162                              <1>  %endif
   162 00000176 B823000000          <1>  mov eax, %1
   162                              <1> 
   162 0000017B CD40                <1>  int 40h
   163                                  _5_ok:
   164 0000017D B40E                    	mov	ah, 0Eh
   165 0000017F B00D                    	mov	al, 0Dh
   166 00000181 CD31                    	int	31h ; Video Interrupt
   167 00000183 B00A                    	mov	al, 0Ah
   168 00000185 CD31                    	int	31h ; Video Interrupt
   169                                  
   170                                  	sys 	_exit			   ; INT 40h
   170                              <1> 
   170                              <1> 
   170                              <1> 
   170                              <1> 
   170                              <1>  %if %0 >= 2
   170                              <1>  mov ebx, %2
   170                              <1>  %if %0 >= 3
   170                              <1>  mov ecx, %3
   170                              <1>  %if %0 = 4
   170                              <1>  mov edx, %4
   170                              <1>  %endif
   170                              <1>  %endif
   170                              <1>  %endif
   170 00000187 B801000000          <1>  mov eax, %1
   170                              <1> 
   170 0000018C CD40                <1>  int 40h
   171                                  here:
   172 0000018E EBFE                    	jmp	short here
   173                                  
   174                                  ;-----------------------------------------------------------------
   175                                  ;  DATA
   176                                  ;-----------------------------------------------------------------
   177                                  
   178                                  numara:	
   179 00000190 D204                    	dw	1234
   180                                  
   181                                  ;-----------------------------------------------------------------
   182                                  ;  messages
   183                                  ;-----------------------------------------------------------------
   184                                  
   185                                  msg_ok1:
   186 00000192 0D0A                    	db	0Dh, 0Ah
   187 00000194 4F4B20212028707573-     	db	'OK ! (push bx : word [esp] = bx)'
   187 0000019D 68206278203A20776F-
   187 000001A6 7264205B6573705D20-
   187 000001AF 3D20627829         
   188 000001B4 00                      	db	0
   189                                  msg_ok2:
   190 000001B5 0D0A                    	db	0Dh, 0Ah
   191 000001B7 4F4B20212028707573-     	db	'OK ! (push bx : esp = esp - 4)'
   191 000001C0 68206278203A206573-
   191 000001C9 70203D20657370202D-
   191 000001D2 203429             
   192 000001D5 00                      	db	0
   193                                  msg_ok3:
   194 000001D6 0D0A                    	db	0Dh, 0Ah
   195 000001D8 4F4B20212028707573-     	db	'OK ! (push word [numara] : word [esp] = 1234)'
   195 000001E1 6820776F7264205B6E-
   195 000001EA 756D6172615D203A20-
   195 000001F3 776F7264205B657370-
   195 000001FC 5D203D203132333429 
   196 00000205 00                      	db	0
   197                                  msg_ok4:
   198 00000206 0D0A                    	db	0Dh, 0Ah
   199 00000208 4F4B20212028707573-     	db	'OK ! (push word [numara] : esp = esp - 4)'
   199 00000211 6820776F7264205B6E-
   199 0000021A 756D6172615D203A20-
   199 00000223 657370203D20657370-
   199 0000022C 202D203429         
   200 00000231 00                      	db	0
   201                                  msg_ok5:
   202 00000232 0D0A                    	db	0Dh, 0Ah
   203 00000234 4F4B20212028706F70-     	db	'OK ! (pop ebx  : ebx = 1234 = [numara])'
   203 0000023D 2065627820203A2065-
   203 00000246 6278203D2031323334-
   203 0000024F 203D205B6E756D6172-
   203 00000258 615D29             
   204 0000025B 0D0A00                  	db	0Dh, 0Ah, 0
   205                                  
   206                                  msg_err1:
   207 0000025E 0D0A                    	db	0Dh, 0Ah
   208 00000260 20204572726F722021-     	db	'  Error ! (push bx : word [esp] = bx)'
   208 00000269 202870757368206278-
   208 00000272 203A20776F7264205B-
   208 0000027B 6573705D203D206278-
   208 00000284 29                 
   209 00000285 00                      	db	0
   210                                  
   211                                  msg_err2:
   212 00000286 0D0A                    	db	0Dh, 0Ah
   213 00000288 20204572726F722021-     	db	'  Error ! (push bx : esp = esp - 4) : (( esp = esp - 2 ))'
   213 00000291 202870757368206278-
   213 0000029A 203A20657370203D20-
   213 000002A3 657370202D20342920-
   213 000002AC 3A2028282065737020-
   213 000002B5 3D20657370202D2032-
   213 000002BE 202929             
   214 000002C1 00                      	db	0
   215                                  
   216                                  msg_err3:
   217 000002C2 0D0A                    	db	0Dh, 0Ah
   218 000002C4 20204572726F722021-     	db	'  Error ! (push word [numara] : word [esp] = 1234)'
   218 000002CD 20287075736820776F-
   218 000002D6 7264205B6E756D6172-
   218 000002DF 615D203A20776F7264-
   218 000002E8 205B6573705D203D20-
   218 000002F1 3132333429         
   219 000002F6 00                      	db	0
   220                                  
   221                                  msg_err4:
   222 000002F7 0D0A                    	db	0Dh, 0Ah
   223 000002F9 20204572726F722021-     	db	'  Error ! (push word [numara] : esp = esp - 4) : (( esp = esp - 2 ))'
   223 00000302 20287075736820776F-
   223 0000030B 7264205B6E756D6172-
   223 00000314 615D203A2065737020-
   223 0000031D 3D20657370202D2034-
   223 00000326 29203A202828206573-
   223 0000032F 70203D20657370202D-
   223 00000338 2032202929         
   224 0000033D 00                      	db	0
   225                                  msg_err5:
   226 0000033E 0D0A                    	db	0Dh, 0Ah
   227 00000340 20204572726F722021-     	db	'  Error ! (pop ebx : ebx = 1234 = [numara])'
   227 00000349 2028706F7020656278-
   227 00000352 203A20656278203D20-
   227 0000035B 31323334203D205B6E-
   227 00000364 756D6172615D29     
   228 0000036B 00                      	db	0
   229                                  msg_ok6:
   230 0000036C 0D0A                    	db	0Dh, 0Ah
   231 0000036E 4F4B20212028706F70-     	db	'OK ! (pop bx : bx = 1234 = [numara])'
   231 00000377 206278203A20627820-
   231 00000380 3D2031323334203D20-
   231 00000389 5B6E756D6172615D29 
   232 00000392 0D0A00                  	db	0Dh, 0Ah, 0
   233                                  msg_err:
   234 00000395 0D0A20204552524F52-     	db	0Dh, 0Ah, '  ERROR !', 0
   234 0000039E 202100             
