     1                                  ; ****************************************************************************
     2                                  ; bin2hex.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'bin2hex.prg')
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; BIN2HEX.PRG ! 'sysopen', 'sysread', 'syswrite' TEST program for TRDOS 386 !
     5                                  ;
     6                                  ; 05/11/2016
     7                                  ;
     8                                  ; [ Last Modification: 05/11/2016 ]
     9                                  ;
    10                                  ; ****************************************************************************
    11                                  ; BIN2DB.PRG (05/11/2016)
    12                                  
    13                                  ; 16/10/2016
    14                                  ; 29/04/2016
    15                                  ; TRDOS 386 system calls (temporary list!)
    16                                  _ver 	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                                  _video 	equ 31
    48                                  _audio	equ 32
    49                                  _timer	equ 33
    50                                  _sleep	equ 34
    51                                  _msg    equ 35
    52                                  _geterr	equ 36
    53                                  _rsvd1	equ 37
    54                                  _pri	equ 38
    55                                  _rele	equ 39
    56                                  _fff	equ 40
    57                                  _fnf	equ 41
    58                                  
    59                                  %macro sys 1-4
    60                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    61                                      ; 03/09/2015	
    62                                      ; 13/04/2015
    63                                      ; Retro UNIX 386 v1 system call.		
    64                                      %if %0 >= 2   
    65                                          mov ebx, %2
    66                                          %if %0 >= 3    
    67                                              mov ecx, %3
    68                                              %if %0 = 4
    69                                                 mov edx, %4   
    70                                              %endif
    71                                          %endif
    72                                      %endif
    73                                      mov eax, %1
    74                                      ;int 30h
    75                                      int 40h ; TRDOS 386 (TRDOS v2.0)		   
    76                                  %endmacro
    77                                  
    78                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    79                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    80                                  
    81                                  [BITS 32] ; We need 32-bit intructions for protected mode
    82                                  
    83                                  [ORG 0] 
    84                                  
    85                                  START_CODE:
    86 00000000 89E6                    	mov	esi, esp
    87 00000002 AD                      	lodsd
    88 00000003 83F802                  	cmp	eax, 2 ; two arguments (program file name & binary file name)
    89 00000006 0F82F8000000            	jb	prg_msg ; nothing to do
    90                                  
    91 0000000C AD                      	lodsd ; program file name address 
    92 0000000D AD                      	lodsd ; binary file name address (file to be read)
    93                                  	; EAX = arg2 ; file name address
    94                                  
    95                                  open_bin_file:
    96                                  	sys	_open, eax, 0 ; open for reading
    96                              <1> 
    96                              <1> 
    96                              <1> 
    96                              <1> 
    96                              <1>  %if %0 >= 2
    96 0000000E 89C3                <1>  mov ebx, %2
    96                              <1>  %if %0 >= 3
    96 00000010 B900000000          <1>  mov ecx, %3
    96                              <1>  %if %0 = 4
    96                              <1>  mov edx, %4
    96                              <1>  %endif
    96                              <1>  %endif
    96                              <1>  %endif
    96 00000015 B805000000          <1>  mov eax, %1
    96                              <1> 
    96 0000001A CD40                <1>  int 40h
    97 0000001C 0F82FC000000            	jc	open_error
    98                                  
    99 00000022 A3[4C020000]            	mov	[fhandle], eax ; file handle/index number
   100                                  
   101 00000027 C605[49020000]0E        	mov	byte [color], 0Eh ; Yellow
   102 0000002E BE[1C020000]            	mov	esi, msg_reading
   103 00000033 E825010000              	call	print_msg
   104                                  
   105                                  read_file:
   106                                  	sys	_read, [fhandle], BUFFER, 0FFFFFFFFh ; read all bytes 
   106                              <1> 
   106                              <1> 
   106                              <1> 
   106                              <1> 
   106                              <1>  %if %0 >= 2
   106 00000038 8B1D[4C020000]      <1>  mov ebx, %2
   106                              <1>  %if %0 >= 3
   106 0000003E B9[54020000]        <1>  mov ecx, %3
   106                              <1>  %if %0 = 4
   106 00000043 BAFFFFFFFF          <1>  mov edx, %4
   106                              <1>  %endif
   106                              <1>  %endif
   106                              <1>  %endif
   106 00000048 B803000000          <1>  mov eax, %1
   106                              <1> 
   106 0000004D CD40                <1>  int 40h
   107 0000004F 0F82DC000000             	jc	rw_error	; disk read or memory allocation error
   108                                  
   109 00000055 A3[50020000]            	mov	[fsize], eax ; file size (read bytes)
   110                                  
   111 0000005A E8F2000000              	call	print_msg_ok
   112                                  
   113                                  close_bin_file:
   114                                  	sys	_close, [fhandle] ; close file
   114                              <1> 
   114                              <1> 
   114                              <1> 
   114                              <1> 
   114                              <1>  %if %0 >= 2
   114 0000005F 8B1D[4C020000]      <1>  mov ebx, %2
   114                              <1>  %if %0 >= 3
   114                              <1>  mov ecx, %3
   114                              <1>  %if %0 = 4
   114                              <1>  mov edx, %4
   114                              <1>  %endif
   114                              <1>  %endif
   114                              <1>  %endif
   114 00000065 B806000000          <1>  mov eax, %1
   114                              <1> 
   114 0000006A CD40                <1>  int 40h
   115                                  
   116                                  convert_byte_to_hex:
   117 0000006C BE[54020000]            	mov	esi, BUFFER
   118 00000071 89F2                    	mov	edx, esi
   119 00000073 0315[50020000]          	add	edx, [fsize]
   120 00000079 89D7                    	mov	edi, edx 
   121                                  
   122 0000007B 31C9                    	xor	ecx, ecx
   123                                  c_0:
   124 0000007D B110                    	mov	cl, 16
   125                                  c_1:
   126 0000007F AC                      	lodsb
   127 00000080 E8EA000000              	call	hex
   128 00000085 66AB                    	stosw
   129                                  
   130 00000087 FF0D[50020000]          	dec	dword [fsize]
   131 0000008D 7411                    	jz	short c_3
   132                                  
   133 0000008F FEC9                    	dec	cl
   134 00000091 7405                    	jz	short c_2
   135                                  
   136 00000093 B020                    	mov	al, ' ' ; 20h
   137 00000095 AA                      	stosb
   138 00000096 EBE7                    	jmp	short c_1
   139                                  c_2:
   140 00000098 66B80D0A                	mov 	ax, 0A0Dh
   141 0000009C 66AB                    	stosw
   142 0000009E EBDD                    	jmp	short c_0
   143                                  c_3:
   144 000000A0 66B80D0A                	mov 	ax, 0A0Dh
   145 000000A4 66AB                    	stosw
   146                                  
   147                                  create_hex_file:
   148                                  	sys	_creat, hex_file, 0 ; create (normal) file
   148                              <1> 
   148                              <1> 
   148                              <1> 
   148                              <1> 
   148                              <1>  %if %0 >= 2
   148 000000A6 BB[3D020000]        <1>  mov ebx, %2
   148                              <1>  %if %0 >= 3
   148 000000AB B900000000          <1>  mov ecx, %3
   148                              <1>  %if %0 = 4
   148                              <1>  mov edx, %4
   148                              <1>  %endif
   148                              <1>  %endif
   148                              <1>  %endif
   148 000000B0 B808000000          <1>  mov eax, %1
   148                              <1> 
   148 000000B5 CD40                <1>  int 40h
   149 000000B7 725E                    	jc	short create_error
   150                                  
   151 000000B9 A3[4C020000]            	mov	[fhandle], eax
   152                                  
   153 000000BE C605[49020000]0B        	mov	byte [color], 0Bh ; Light Cyan
   154 000000C5 BE[2A020000]            	mov	esi, msg_writing
   155 000000CA E88E000000              	call	print_msg
   156                                  
   157 000000CF 29D7                    	sub	edi, edx ; file size 
   158                                  	; edx = start address of the text
   159                                  
   160                                  	sys	_write, [fhandle], edx, edi ; write to 'BIN2HEX.HEX' 
   160                              <1> 
   160                              <1> 
   160                              <1> 
   160                              <1> 
   160                              <1>  %if %0 >= 2
   160 000000D1 8B1D[4C020000]      <1>  mov ebx, %2
   160                              <1>  %if %0 >= 3
   160 000000D7 89D1                <1>  mov ecx, %3
   160                              <1>  %if %0 = 4
   160 000000D9 89FA                <1>  mov edx, %4
   160                              <1>  %endif
   160                              <1>  %endif
   160                              <1>  %endif
   160 000000DB B804000000          <1>  mov eax, %1
   160                              <1> 
   160 000000E0 CD40                <1>  int 40h
   161 000000E2 724D                     	jc	short rw_error  ; disk write (or free space) error
   162                                  
   163 000000E4 E868000000              	call	print_msg_ok
   164                                  
   165                                  	sys	_close, [fhandle] ; close file
   165                              <1> 
   165                              <1> 
   165                              <1> 
   165                              <1> 
   165                              <1>  %if %0 >= 2
   165 000000E9 8B1D[4C020000]      <1>  mov ebx, %2
   165                              <1>  %if %0 >= 3
   165                              <1>  mov ecx, %3
   165                              <1>  %if %0 = 4
   165                              <1>  mov edx, %4
   165                              <1>  %endif
   165                              <1>  %endif
   165                              <1>  %endif
   165 000000EF B806000000          <1>  mov eax, %1
   165                              <1> 
   165 000000F4 CD40                <1>  int 40h
   166                                  
   167 000000F6 C605[49020000]07        	mov	byte [color], 07h ; Light Gray (Default Color)
   168 000000FD BE[0E020000]            	mov	esi, nextline
   169 00000102 EB05                    	jmp	short print_nl
   170                                  
   171                                  prg_msg:
   172 00000104 BE[97010000]            	mov	esi, msg_program
   173                                  print_nl:
   174 00000109 E84F000000              	call	print_msg	
   175                                  terminate:
   176                                  	sys 	_exit			   ; INT 40h
   176                              <1> 
   176                              <1> 
   176                              <1> 
   176                              <1> 
   176                              <1>  %if %0 >= 2
   176                              <1>  mov ebx, %2
   176                              <1>  %if %0 >= 3
   176                              <1>  mov ecx, %3
   176                              <1>  %if %0 = 4
   176                              <1>  mov edx, %4
   176                              <1>  %endif
   176                              <1>  %endif
   176                              <1>  %endif
   176 0000010E B801000000          <1>  mov eax, %1
   176                              <1> 
   176 00000113 CD40                <1>  int 40h
   177                                  here:
   178 00000115 EBFE                    	jmp	short here
   179                                  
   180                                  create_error:
   181 00000117 BE[FB010000]            	mov	esi, msg_create_error
   182 0000011C EB05                    	jmp	short open_create_error
   183                                  open_error:
   184 0000011E BE[E7010000]            	mov	esi, msg_open_error
   185                                  open_create_error:
   186 00000123 C605[49020000]0C        	mov	byte [color], 0Ch ; Light Red
   187 0000012A E82E000000              	call	print_msg		   ; INT 31h
   188 0000012F EBDD                    	jmp	short terminate	
   189                                  
   190                                  rw_error:
   191                                  	sys	_close, [fhandle] ; close file
   191                              <1> 
   191                              <1> 
   191                              <1> 
   191                              <1> 
   191                              <1>  %if %0 >= 2
   191 00000131 8B1D[4C020000]      <1>  mov ebx, %2
   191                              <1>  %if %0 >= 3
   191                              <1>  mov ecx, %3
   191                              <1>  %if %0 = 4
   191                              <1>  mov edx, %4
   191                              <1>  %endif
   191                              <1>  %endif
   191                              <1>  %endif
   191 00000137 B806000000          <1>  mov eax, %1
   191                              <1> 
   191 0000013C CD40                <1>  int 40h
   192 0000013E C605[49020000]0C        	mov	byte [color], 0Ch ; Light Red
   193 00000145 BE[11020000]            	mov	esi, msg_error
   194 0000014A E80E000000              	call	print_msg		   ; INT 31h
   195 0000014F EBBD                    	jmp	short terminate
   196                                  
   197                                  print_msg_ok:
   198 00000151 C605[49020000]0A        	mov	byte [color], 0Ah ; Light Green
   199 00000158 BE[38020000]            	mov	esi, msg_ok
   200                                  print_msg:
   201 0000015D 0FB61D[49020000]        	movzx	ebx, byte [color] ; text color (bl)
   202                                  		               ; video page 0 (bh)
   203 00000164 B40E                    	mov	ah, 0Eh ; teletype output (write tty)
   204 00000166 AC                      	lodsb
   205                                  _p_nextchar:
   206 00000167 CD31                    	int	31h
   207 00000169 AC                      	lodsb
   208 0000016A 20C0                    	and	al, al
   209 0000016C 75F9                    	jnz	short _p_nextchar
   210 0000016E C3                      	retn
   211                                  
   212                                  hex:
   213 0000016F 0FB6D8                  	movzx	ebx, al
   214 00000172 C0EB04                  	shr	bl, 4
   215 00000175 8A9B[87010000]          	mov	bl, [ebx+hexchrs] 	 	
   216 0000017B 86D8                    	xchg	bl, al
   217 0000017D 80E30F                  	and	bl, 0Fh
   218 00000180 8AA3[87010000]          	mov	ah, [ebx+hexchrs] 
   219 00000186 C3                      	retn
   220                                  
   221                                  hexchrs:
   222 00000187 303132333435363738-     	db '0123456789ABCDEF'
   222 00000190 39414243444546     
   223                                  
   224                                  ;-----------------------------------------------------------------
   225                                  ;  messages
   226                                  ;-----------------------------------------------------------------
   227                                  
   228                                  msg_program:
   229 00000197 0D0A                    	db 0Dh, 0Ah
   230 00000199 42494E324845582E50-     	db "BIN2HEX.PRG /// TRDOS 386 syswrite test program"
   230 000001A2 5247202F2F2F205452-
   230 000001AB 444F53203338362073-
   230 000001B4 797377726974652074-
   230 000001BD 6573742070726F6772-
   230 000001C6 616D               
   231 000001C8 0D0A                    	db 0Dh, 0Ah
   232 000001CA 6279204572646F6761-     	db "by Erdogan Tan, 05/11/2016", 0Dh, 0Ah, 0
   232 000001D3 6E2054616E2C203035-
   232 000001DC 2F31312F323031360D-
   232 000001E5 0A00               
   233                                  
   234                                  msg_open_error:
   235 000001E7 0D0A                    	db 0Dh, 0Ah
   236 000001E9 7379736F70656E2065-     	db 'sysopen error !'
   236 000001F2 72726F722021       
   237 000001F8 0D0A00                  	db 0Dh, 0Ah, 0
   238                                  
   239                                  msg_create_error:
   240 000001FB 0D0A                    	db 0Dh, 0Ah
   241 000001FD 737973637265617465-     	db 'syscreate error !'
   241 00000206 206572726F722021   
   242                                  nextline:
   243 0000020E 0D0A00                  	db 0Dh, 0Ah, 0
   244                                  
   245                                  msg_error:
   246 00000211 4552524F522021200D-     	db 'ERROR ! ', 0Dh, 0Ah, 0
   246 0000021A 0A00               
   247                                  
   248                                  msg_reading:
   249 0000021C 0D0A                    	db 0Dh, 0Ah
   250 0000021E 52656164696E672E2E-     	db 'Reading... ', 0
   250 00000227 2E2000             
   251                                  
   252                                  msg_writing:
   253 0000022A 0D0A                    	db 0Dh, 0Ah
   254 0000022C 57726974696E672E2E-     	db 'Writing... ', 0
   254 00000235 2E2000             
   255                                  
   256                                  msg_ok:
   257 00000238 4F4B2E2000              	db 'OK. ', 0
   258                                  
   259                                  hex_file:
   260 0000023D 42494E324845582E48-     	db 'BIN2HEX.HEX', 0
   260 00000246 455800             
   261                                  
   262 00000249 0F                      color:	db 0Fh ; White
   263                                  
   264                                  bss:
   265                                  
   266                                  ABSOLUTE bss
   267                                  
   268 0000024A <res 00000002>          alignb 4
   269                                  
   270 0000024C <res 00000004>          fhandle: resd 1
   271 00000250 <res 00000004>          fsize:	 resd 1
   272                                  
   273                                  BUFFER:	
