     1                                  ; ****************************************************************************
     2                                  ; cftest0.s (cftest0.asm) - by Erdogan Tan - 24/04/2022
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; Retro UNIX 8086 v1 - cftest-- create file test
     5                                  ;
     6                                  ; [ Last Modification: 24/04/2022 ]
     7                                  ;
     8                                  ; ****************************************************************************
     9                                  ; Assembler: NASM v2.15
    10                                  ; ((nasm cftest0.s -l cftest0.txt -o cftest0.bin -Z error.txt))
    11                                  ;
    12                                  ; 12/01/2022 (Retro UNIX 386 v1.2)
    13                                  ; 13/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                                  ; 12/01/2022 - Retro UNIX 386 v1.2
    54                                  ; Retro UNIX 386 v2 system calls
    55                                  _setgid	equ 37
    56                                  _getgid	equ 38
    57                                  _sysver	equ 39 ; (get) Retro Unix 386 version
    58                                  
    59                                  ;;;
    60                                  ;ESCKey equ 1Bh
    61                                  ;EnterKey equ 0Dh
    62                                  
    63                                  %macro sys 1-4
    64                                      ; Retro UNIX 8086 v1 system call.
    65                                      %if %0 >= 2   
    66                                          mov bx, %2
    67                                          %if %0 >= 3
    68                                              mov cx, %3
    69                                              %if %0 >= 4
    70                                                 mov dx, %4
    71                                              %endif
    72                                          %endif
    73                                      %endif
    74                                      mov ax, %1
    75                                      int 20h
    76                                  %endmacro
    77                                  
    78                                  ;-----------------------------------------------------------------
    79                                  ;  text - code
    80                                  ;-----------------------------------------------------------------
    81                                  
    82                                  [BITS 16] ; 16-bit (x86 real mode) intructions
    83                                  
    84                                  [ORG 0] 
    85                                  
    86                                  START_CODE:
    87                                  	; 24/04/2022
    88                                  
    89                                  	;mov	esi, esp		
    90                                  	;mov	edi, esi
    91                                  	;lodsd		; number of arguments
    92                                  	;;mov	edi, esi			
    93                                  	;;mov	[argc], eax
    94                                  	;mov	[argc], al
    95                                  
    96                                  	; 22/04/2022
    97 00000000 89E6                    	mov	si, sp
    98 00000002 89F7                    	mov	di, si
    99 00000004 AD                      	lodsw
   100                                  	;;mov	[argc], ax
   101                                  	;mov	[argc], al
   102                                  
   103                                  	;if (argc <> 2) 
   104                                  	;   goto usage;
   105                                  
   106                                  	;cmp	ax, 2
   107 00000005 3C02                    	cmp	al, 2
   108 00000007 742B                    	je	short cf_0
   109 00000009 7706                    	ja	short cf_usage
   110                                  
   111                                  	;sys	_msg, program_msg, 255, 0Fh
   112                                  	; 22/04/2022
   113 0000000B B8[7002]                	mov	ax, program_msg ; asciiz message address
   114 0000000E E80B00                  	call	print_msg
   115                                  cf_usage:
   116                                     	;sys	_msg, usage_msg, 255, 07h
   117 00000011 B8[AD02]                	mov	ax, usage_msg
   118                                  cf_err_exit:
   119                                  cf_ok_exit:
   120 00000014 E80500                  	call	print_msg
   121                                  cf_exit:
   122                                  	sys	_exit	; sys exit
    64                              <1> 
    65                              <1>  %if %0 >= 2
    66                              <1>  mov bx, %2
    67                              <1>  %if %0 >= 3
    68                              <1>  mov cx, %3
    69                              <1>  %if %0 >= 4
    70                              <1>  mov dx, %4
    71                              <1>  %endif
    72                              <1>  %endif
    73                              <1>  %endif
    74 00000017 B80100              <1>  mov ax, %1
    75 0000001A CD20                <1>  int 20h
   123                                  ;hlt:
   124                                  ;	nop
   125                                  ;	nop
   126                                  ;	jmp	short hlt
   127                                  
   128                                  print_msg:
   129                                  	; 22/04/2022
   130                                  	; Modified registers: ax, bx, cx, dx
   131                                  strlen:
   132                                  	; ax = asciiz string address
   133 0000001C 89C3                    	mov	bx, ax
   134 0000001E 4B                      	dec	bx
   135                                  nextchr:
   136 0000001F 43                      	inc	bx
   137 00000020 803F00                  	cmp	byte [bx], 0
   138 00000023 77FA                    	ja	short nextchr
   139                                  	;cmp	[bx], 0Dh
   140                                  	;ja	short nextchr
   141 00000025 29C3                    	sub	bx, ax
   142                                  	; bx = asciiz string length
   143                                  	;retn
   144                                  print_str:
   145 00000027 89DA                    	mov	dx, bx
   146                                  	sys	_write, 1, ax
    64                              <1> 
    65                              <1>  %if %0 >= 2
    66 00000029 BB0100              <1>  mov bx, %2
    67                              <1>  %if %0 >= 3
    68 0000002C 89C1                <1>  mov cx, %3
    69                              <1>  %if %0 >= 4
    70                              <1>  mov dx, %4
    71                              <1>  %endif
    72                              <1>  %endif
    73                              <1>  %endif
    74 0000002E B80400              <1>  mov ax, %1
    75 00000031 CD20                <1>  int 20h
   147                                  
   148 00000033 C3                      	retn
   149                                  
   150                                  cf_0:
   151 00000034 AD                      	lodsw	; bypass argument 1 
   152                                  
   153                                  	sys	_stat, [si], stbuf
    64                              <1> 
    65                              <1>  %if %0 >= 2
    66 00000035 8B1C                <1>  mov bx, %2
    67                              <1>  %if %0 >= 3
    68 00000037 B9[2803]            <1>  mov cx, %3
    69                              <1>  %if %0 >= 4
    70                              <1>  mov dx, %4
    71                              <1>  %endif
    72                              <1>  %endif
    73                              <1>  %endif
    74 0000003A B81200              <1>  mov ax, %1
    75 0000003D CD20                <1>  int 20h
   154 0000003F 7205                    	jc	short cf_1
   155                                  
   156 00000041 B8[C802]                	mov	ax, err_file_exists
   157 00000044 EBCE                    	jmp	short cf_err_exit
   158                                  
   159                                  cf_1:
   160                                  	sys	_creat, [si], 01110b ; rwr-
    64                              <1> 
    65                              <1>  %if %0 >= 2
    66 00000046 8B1C                <1>  mov bx, %2
    67                              <1>  %if %0 >= 3
    68 00000048 B90E00              <1>  mov cx, %3
    69                              <1>  %if %0 >= 4
    70                              <1>  mov dx, %4
    71                              <1>  %endif
    72                              <1>  %endif
    73                              <1>  %endif
    74 0000004B B80800              <1>  mov ax, %1
    75 0000004E CD20                <1>  int 20h
   161 00000050 7305                    	jnc	short cf_2
   162                                  
   163 00000052 B8[E002]                	mov	ax, err_cannot_create
   164 00000055 EBBD                    	jmp	short cf_err_exit
   165                                  
   166                                  cf_2:
   167 00000057 89C6                    	mov	si, ax ; file number
   168                                  
   169                                  	sys	_write, si, iobuf, textsize
    64                              <1> 
    65                              <1>  %if %0 >= 2
    66 00000059 89F3                <1>  mov bx, %2
    67                              <1>  %if %0 >= 3
    68 0000005B B9[8000]            <1>  mov cx, %3
    69                              <1>  %if %0 >= 4
    70 0000005E BAEF01              <1>  mov dx, %4
    71                              <1>  %endif
    72                              <1>  %endif
    73                              <1>  %endif
    74 00000061 B80400              <1>  mov ax, %1
    75 00000064 CD20                <1>  int 20h
   170 00000066 730C                    	jnc	short cf_3	
   171                                  
   172                                  	sys	_close, si
    64                              <1> 
    65                              <1>  %if %0 >= 2
    66 00000068 89F3                <1>  mov bx, %2
    67                              <1>  %if %0 >= 3
    68                              <1>  mov cx, %3
    69                              <1>  %if %0 >= 4
    70                              <1>  mov dx, %4
    71                              <1>  %endif
    72                              <1>  %endif
    73                              <1>  %endif
    74 0000006A B80600              <1>  mov ax, %1
    75 0000006D CD20                <1>  int 20h
   173                                  
   174 0000006F B8[0103]                	mov	ax, err_write
   175 00000072 EBA0                    	jmp	short cf_err_exit
   176                                  
   177                                  	; eof
   178                                  cf_3:
   179                                  	sys	_close, si
    64                              <1> 
    65                              <1>  %if %0 >= 2
    66 00000074 89F3                <1>  mov bx, %2
    67                              <1>  %if %0 >= 3
    68                              <1>  mov cx, %3
    69                              <1>  %if %0 >= 4
    70                              <1>  mov dx, %4
    71                              <1>  %endif
    72                              <1>  %endif
    73                              <1>  %endif
    74 00000076 B80600              <1>  mov ax, %1
    75 00000079 CD20                <1>  int 20h
   180                                  	
   181 0000007B B8[1803]                	mov	ax, ok_msg
   182 0000007E EB94                    	jmp	short cf_ok_exit
   183                                  	
   184                                  ;-----------------------------------------------------------------
   185                                  ;  data - initialized data
   186                                  ;-----------------------------------------------------------------
   187                                  
   188                                  ;;argc:	dd 0
   189                                  ;argc:	db 0
   190                                  
   191 00000080 0D0A                    iobuf:	db 0Dh, 0Ah
   192 00000082 417420746865206D6F-     	db "At the moment, you are reading 'Create File Test (cftest)' "
   192 0000008B 6D656E742C20796F75-
   192 00000094 206172652072656164-
   192 0000009D 696E67202743726561-
   192 000000A6 74652046696C652054-
   192 000000AF 657374202863667465-
   192 000000B8 7374292720         
   193 000000BD 70726F6772616D206F-     	db "program output. I have written this test utility/program "
   193 000000C6 75747075742E204920-
   193 000000CF 686176652077726974-
   193 000000D8 74656E207468697320-
   193 000000E1 74657374207574696C-
   193 000000EA 6974792F70726F6772-
   193 000000F3 616D20             
   194 000000F6 666F7220756E646572-     	db "for understanding cp -copy file- failure reason while "
   194 000000FF 7374616E64696E6720-
   194 00000108 6370202D636F707920-
   194 00000111 66696C652D20666169-
   194 0000011A 6C7572652072656173-
   194 00000123 6F6E207768696C6520 
   195 0000012C 6372656174696E6720-     	db "creating a new file in any directory. So, I will understand"
   195 00000135 61206E65772066696C-
   195 0000013E 6520696E20616E7920-
   195 00000147 6469726563746F7279-
   195 00000150 2E20536F2C20492077-
   195 00000159 696C6C20756E646572-
   195 00000162 7374616E64         
   196 00000167 207468617420726574-     	db " that retro unix 8086 create file system call is defective "
   196 00000170 726F20756E69782038-
   196 00000179 303836206372656174-
   196 00000182 652066696C65207379-
   196 0000018B 7374656D2063616C6C-
   196 00000194 206973206465666563-
   196 0000019D 7469766520         
   197 000001A2 6F72206E6F742E2028-     	db "or not. ('cp' utility uses sysread and syswrite systems calls "
   197 000001AB 27637027207574696C-
   197 000001B4 697479207573657320-
   197 000001BD 737973726561642061-
   197 000001C6 6E6420737973777269-
   197 000001CF 74652073797374656D-
   197 000001D8 732063616C6C7320   
   198 000001E0 20746F676574686572-     	db " together in a loop. It was difficult to understand if "
   198 000001E9 20696E2061206C6F6F-
   198 000001F2 702E20497420776173-
   198 000001FB 20646966666963756C-
   198 00000204 7420746F20756E6465-
   198 0000020D 727374616E64206966-
   198 00000216 20                 
   199 00000217 746865206661696C75-     	db "the failure/freezing occurs at create stage or r/w stage.)"
   199 00000220 72652F667265657A69-
   199 00000229 6E67206F6363757273-
   199 00000232 206174206372656174-
   199 0000023B 65207374616765206F-
   199 00000244 7220722F7720737461-
   199 0000024D 67652E29           
   200 00000251 0D0A0D0A                	db  0Dh, 0Ah, 0Dh, 0Ah
   201 00000255 4572646F67616E2054-     	db "Erdogan Tan - 24/04/2022"
   201 0000025E 616E202D2032342F30-
   201 00000267 342F32303232       
   202 0000026D 0D0A00                  	db 0Dh, 0Ah, 0
   203                                  
   204                                  textsize equ ($-iobuf) - 1		
   205                                  	
   206                                  ; ----------------------------------------------------------------
   207                                  
   208                                  program_msg:
   209 00000270 0D0A                    	db  0Dh, 0Ah
   210 00000272 526574726F20554E49-     	db  'Retro UNIX v1 CREATE FILE TEST by Erdogan TAN - 24/04/2022'
   210 0000027B 582076312043524541-
   210 00000284 54452046494C452054-
   210 0000028D 455354206279204572-
   210 00000296 646F67616E2054414E-
   210 0000029F 202D2032342F30342F-
   210 000002A8 32303232           
   211                                  	;db 0Dh, 0Ah
   212 000002AC 00                      	db  0
   213                                  usage_msg:
   214 000002AD 0D0A                    	db  0Dh, 0Ah
   215 000002AF 55736167653A206366-     	db  'Usage: cftest filename'
   215 000002B8 746573742066696C65-
   215 000002C1 6E616D65           
   216                                  nextline:
   217 000002C5 0D0A00                  	db  0Dh, 0Ah, 0
   218                                  
   219                                  err_file_exists:
   220 000002C8 0D0A                    	db 0Dh, 0Ah
   221 000002CA 6366746573743A2066-     	db 'cftest: file exists !'
   221 000002D3 696C65206578697374-
   221 000002DC 732021             
   222 000002DF 00                      	db 0
   223                                  err_cannot_create:
   224 000002E0 0D0A                    	db 0Dh, 0Ah
   225 000002E2 6366746573743A2063-     	db 'cftest: cannot create file !'
   225 000002EB 616E6E6F7420637265-
   225 000002F4 6174652066696C6520-
   225 000002FD 21                 
   226 000002FE 0D0A00                  	db 0Dh, 0Ah, 0
   227                                  
   228                                  err_write:
   229 00000301 6366746573743A2077-     	db 'cftest: write error.'
   229 0000030A 72697465206572726F-
   229 00000313 722E               
   230 00000315 0D0A00                  	db 0Dh, 0Ah, 0
   231                                  
   232                                  ok_msg:
   233 00000318 0D0A                    	db  0Dh, 0Ah
   234 0000031A 6366746573743A204F-     	db  'cftest: OK.'
   234 00000323 4B2E               
   235 00000325 0D0A00                  	db  0Dh, 0Ah, 0
   236                                  
   237                                  ;errors: db 0
   238                                  
   239                                  ;-----------------------------------------------------------------
   240                                  ;  bss - uninitialized data
   241                                  ;-----------------------------------------------------------------
   242                                  
   243                                  align 2
   244                                  
   245                                  bss_start:
   246                                  
   247                                  ABSOLUTE bss_start
   248                                  
   249                                  ;fnum:	resw 1
   250                                  
   251 00000328 <res 22h>               stbuf: resb 34
