     1                                  ; ****************************************************************************
     2                                  ; args386.s (args.s) - Retro Unix 386 v1 - sys exec & shell argument list test
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; RETRO UNIX 386 (Retro Unix == Turkish Rational Unix)
     5                                  ; Operating System Project (v0.2) by ERDOGAN TAN (Beginning: 24/12/2013)
     6                                  ;
     7                                  ; [ Last Modification: 11/10/2015 ]
     8                                  ;
     9                                  ; ****************************************************************************
    10                                  ; Assembler: NASM 2.11
    11                                  
    12                                  ; 09/10/2015
    13                                  ; 08/10/2015 
    14                                  
    15                                  ; UNIX v1 system calls
    16                                  _rele 	equ 0
    17                                  _exit 	equ 1
    18                                  _fork 	equ 2
    19                                  _read 	equ 3
    20                                  _write	equ 4
    21                                  _open	equ 5
    22                                  _close 	equ 6
    23                                  _wait 	equ 7
    24                                  _creat 	equ 8
    25                                  _link 	equ 9
    26                                  _unlink	equ 10
    27                                  _exec	equ 11
    28                                  _chdir	equ 12
    29                                  _time 	equ 13
    30                                  _mkdir 	equ 14
    31                                  _chmod	equ 15
    32                                  _chown	equ 16
    33                                  _break	equ 17
    34                                  _stat	equ 18
    35                                  _seek	equ 19
    36                                  _tell 	equ 20
    37                                  _mount	equ 21
    38                                  _umount	equ 22
    39                                  _setuid	equ 23
    40                                  _getuid	equ 24
    41                                  _stime	equ 25
    42                                  _quit	equ 26	
    43                                  _intr	equ 27
    44                                  _fstat	equ 28
    45                                  _emt 	equ 29
    46                                  _mdate 	equ 30
    47                                  _stty 	equ 31
    48                                  _gtty	equ 32
    49                                  _ilgins	equ 33
    50                                  _sleep	equ 34 ; Retro UNIX 8086 v1 feature only !
    51                                  _msg	equ 35 ; Retro UNIX 386 v1 feature only !
    52                                  _geterr	equ 36 ; Retro UNIX 386 v1 feature only !
    53                                  
    54                                  %macro sys 1-4
    55                                      ; Retro UNIX 386 v1 system call.		
    56                                      %if %0 >= 2   
    57                                          mov ebx, %2
    58                                          %if %0 >= 3    
    59                                              mov ecx, %3
    60                                              %if %0 = 4
    61                                                 mov edx, %4   
    62                                              %endif
    63                                          %endif
    64                                      %endif
    65                                      mov eax, %1
    66                                      int 30h	   
    67                                  %endmacro
    68                                  
    69                                  ; Retro UNIX 386 v1 system call format:
    70                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    71                                  
    72                                  [BITS 32] ; We need 32-bit intructions for protected mode
    73                                  
    74                                  [ORG 0] 
    75                                  
    76                                  START_CODE:
    77                                  	sys _msg, version, 255, 0Ah
    78                              <1> 
    79                              <1>  %if %0 >= 2
    80 00000000 BB[7F000000]        <1>  mov ebx, %2
    81                              <1>  %if %0 >= 3
    82 00000005 B9FF000000          <1>  mov ecx, %3
    83                              <1>  %if %0 = 4
    84 0000000A BA0A000000          <1>  mov edx, %4
    85                              <1>  %endif
    86                              <1>  %endif
    87                              <1>  %endif
    88 0000000F B823000000          <1>  mov eax, %1
    89 00000014 CD30                <1>  int 30h
    90 00000016 89E6                    	mov esi, esp
    91 00000018 AD                      	lodsd
    92 00000019 21C0                    	and eax, eax
    93 0000001B 744B                    	jz  short terminate
    94 0000001D 89C5                    	mov ebp, eax
    95                                  nextarg:
    96 0000001F FE05[7B000000]          	inc byte [argn]
    97                                  	sys _msg, args, 255, 0Eh
    98                              <1> 
    99                              <1>  %if %0 >= 2
   100 00000025 BB[71000000]        <1>  mov ebx, %2
   101                              <1>  %if %0 >= 3
   102 0000002A B9FF000000          <1>  mov ecx, %3
   103                              <1>  %if %0 = 4
   104 0000002F BA0E000000          <1>  mov edx, %4
   105                              <1>  %endif
   106                              <1>  %endif
   107                              <1>  %endif
   108 00000034 B823000000          <1>  mov eax, %1
   109 00000039 CD30                <1>  int 30h
   110 0000003B AD                      	lodsd
   111                                  	sys _msg, eax, 255, 0Fh
   112                              <1> 
   113                              <1>  %if %0 >= 2
   114 0000003C 89C3                <1>  mov ebx, %2
   115                              <1>  %if %0 >= 3
   116 0000003E B9FF000000          <1>  mov ecx, %3
   117                              <1>  %if %0 = 4
   118 00000043 BA0F000000          <1>  mov edx, %4
   119                              <1>  %endif
   120                              <1>  %endif
   121                              <1>  %endif
   122 00000048 B823000000          <1>  mov eax, %1
   123 0000004D CD30                <1>  int 30h
   124 0000004F 4D                      	dec ebp
   125 00000050 75CD                    	jnz short nextarg
   126                                  	sys _msg, nexline, 2, 07h
   127                              <1> 
   128                              <1>  %if %0 >= 2
   129 00000052 BB[CE000000]        <1>  mov ebx, %2
   130                              <1>  %if %0 >= 3
   131 00000057 B902000000          <1>  mov ecx, %3
   132                              <1>  %if %0 = 4
   133 0000005C BA07000000          <1>  mov edx, %4
   134                              <1>  %endif
   135                              <1>  %endif
   136                              <1>  %endif
   137 00000061 B823000000          <1>  mov eax, %1
   138 00000066 CD30                <1>  int 30h
   139                                  terminate: 
   140                                  	sys _exit
   141                              <1> 
   142                              <1>  %if %0 >= 2
   143                              <1>  mov ebx, %2
   144                              <1>  %if %0 >= 3
   145                              <1>  mov ecx, %3
   146                              <1>  %if %0 = 4
   147                              <1>  mov edx, %4
   148                              <1>  %endif
   149                              <1>  %endif
   150                              <1>  %endif
   151 00000068 B801000000          <1>  mov eax, %1
   152 0000006D CD30                <1>  int 30h
   153                                  halt:
   154 0000006F EBFE                    	jmp short halt
   155                                  args:
   156 00000071 0D0A                    	db 0Dh, 0Ah
   157 00000073 417267756D656E74        	db 'Argument'
   158                                  argn:
   159 0000007B 30                      	db '0'
   160 0000007C 3A20                    	db ': '
   161 0000007E 00                      	db 0
   162                                  version:
   163 0000007F 0D0A                    	db 0Dh, 0Ah
   164 00000081 0D0A                    	db 0Dh, 0Ah
   165 00000083 526574726F20554E49-     	db 'Retro UNIX 386 v1 - Argument List Test Program'
   166 0000008C 582033383620763120-
   167 00000095 2D20417267756D656E-
   168 0000009E 74204C697374205465-
   169 000000A7 73742050726F677261-
   170 000000B0 6D                 
   171 000000B1 0D0A                    	db 0Dh, 0Ah
   172 000000B3 6279204572646F6761-     	db 'by Erdogan Tan - 09/10/2015'
   173 000000BC 6E2054616E202D2030-
   174 000000C5 392F31302F32303135 
   175                                  nexline:
   176 000000CE 0D0A00                  	db 0Dh, 0Ah, 0
