     1                                  ; ****************************************************************************
     2                                  ; bin2db.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'bin2db.prg')
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; BIN2DB.PRG ! 'sysopen', 'sysread', 'syswrite' TEST program for TRDOS 386 !
     5                                  ;
     6                                  ; 25/10/2016
     7                                  ;
     8                                  ; [ Last Modification: 05/11/2016 ]
     9                                  ;
    10                                  ; ****************************************************************************
    11                                  
    12                                  ; 16/10/2016
    13                                  ; 29/04/2016
    14                                  ; TRDOS 386 system calls (temporary list!)
    15                                  _ver 	equ 0
    16                                  _exit 	equ 1
    17                                  _fork 	equ 2
    18                                  _read 	equ 3
    19                                  _write	equ 4
    20                                  _open	equ 5
    21                                  _close 	equ 6
    22                                  _wait 	equ 7
    23                                  _creat 	equ 8
    24                                  _link 	equ 9
    25                                  _unlink	equ 10
    26                                  _exec	equ 11
    27                                  _chdir	equ 12
    28                                  _time 	equ 13
    29                                  _mkdir 	equ 14
    30                                  _chmod	equ 15
    31                                  _chown	equ 16
    32                                  _break	equ 17
    33                                  _stat	equ 18
    34                                  _seek	equ 19
    35                                  _tell 	equ 20
    36                                  _mount	equ 21
    37                                  _umount	equ 22
    38                                  _setuid	equ 23
    39                                  _getuid	equ 24
    40                                  _stime	equ 25
    41                                  _quit	equ 26	
    42                                  _intr	equ 27
    43                                  _fstat	equ 28
    44                                  _emt 	equ 29
    45                                  _mdate 	equ 30
    46                                  _video 	equ 31
    47                                  _audio	equ 32
    48                                  _timer	equ 33
    49                                  _sleep	equ 34
    50                                  _msg    equ 35
    51                                  _geterr	equ 36
    52                                  _rsvd1	equ 37
    53                                  _pri	equ 38
    54                                  _rele	equ 39
    55                                  _fff	equ 40
    56                                  _fnf	equ 41
    57                                  
    58                                  %macro sys 1-4
    59                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    60                                      ; 03/09/2015	
    61                                      ; 13/04/2015
    62                                      ; Retro UNIX 386 v1 system call.		
    63                                      %if %0 >= 2   
    64                                          mov ebx, %2
    65                                          %if %0 >= 3    
    66                                              mov ecx, %3
    67                                              %if %0 = 4
    68                                                 mov edx, %4   
    69                                              %endif
    70                                          %endif
    71                                      %endif
    72                                      mov eax, %1
    73                                      ;int 30h
    74                                      int 40h ; TRDOS 386 (TRDOS v2.0)		   
    75                                  %endmacro
    76                                  
    77                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    78                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    79                                  
    80                                  [BITS 32] ; We need 32-bit intructions for protected mode
    81                                  
    82                                  [ORG 0] 
    83                                  
    84                                  START_CODE:
    85 00000000 89E6                    	mov	esi, esp
    86 00000002 AD                      	lodsd
    87 00000003 83F802                  	cmp	eax, 2 ; two arguments (program file name & binary file name)
    88 00000006 0F820F010000            	jb	prg_msg ; nothing to do
    89                                  
    90 0000000C AD                      	lodsd ; program file name address 
    91 0000000D AD                      	lodsd ; binary file name address (file to be read)
    92                                  	; EAX = arg2 ; file name address
    93                                  
    94                                  open_bin_file:
    95                                  	sys	_open, eax, 0 ; open for reading
    95                              <1> 
    95                              <1> 
    95                              <1> 
    95                              <1> 
    95                              <1>  %if %0 >= 2
    95 0000000E 89C3                <1>  mov ebx, %2
    95                              <1>  %if %0 >= 3
    95 00000010 B900000000          <1>  mov ecx, %3
    95                              <1>  %if %0 = 4
    95                              <1>  mov edx, %4
    95                              <1>  %endif
    95                              <1>  %endif
    95                              <1>  %endif
    95 00000015 B805000000          <1>  mov eax, %1
    95                              <1> 
    95 0000001A CD40                <1>  int 40h
    96 0000001C 0F8213010000            	jc	open_error
    97                                  
    98 00000022 A3[60020000]            	mov	[fhandle], eax ; file handle/index number
    99                                  
   100 00000027 C605[5E020000]0E        	mov	byte [color], 0Eh ; Yellow
   101 0000002E BE[32020000]            	mov	esi, msg_reading
   102 00000033 E83C010000              	call	print_msg
   103                                  
   104                                  read_file:
   105                                  	sys	_read, [fhandle], BUFFER, 0FFFFFFFFh ; read all bytes 
   105                              <1> 
   105                              <1> 
   105                              <1> 
   105                              <1> 
   105                              <1>  %if %0 >= 2
   105 00000038 8B1D[60020000]      <1>  mov ebx, %2
   105                              <1>  %if %0 >= 3
   105 0000003E B9[68020000]        <1>  mov ecx, %3
   105                              <1>  %if %0 = 4
   105 00000043 BAFFFFFFFF          <1>  mov edx, %4
   105                              <1>  %endif
   105                              <1>  %endif
   105                              <1>  %endif
   105 00000048 B803000000          <1>  mov eax, %1
   105                              <1> 
   105 0000004D CD40                <1>  int 40h
   106 0000004F 0F82F3000000             	jc	rw_error	; disk read or memory allocation error
   107                                  
   108 00000055 A3[64020000]            	mov	[fsize], eax ; file size (read bytes)
   109                                  
   110 0000005A E809010000              	call	print_msg_ok
   111                                  
   112                                  close_bin_file:
   113                                  	sys	_close, [fhandle] ; close file
   113                              <1> 
   113                              <1> 
   113                              <1> 
   113                              <1> 
   113                              <1>  %if %0 >= 2
   113 0000005F 8B1D[60020000]      <1>  mov ebx, %2
   113                              <1>  %if %0 >= 3
   113                              <1>  mov ecx, %3
   113                              <1>  %if %0 = 4
   113                              <1>  mov edx, %4
   113                              <1>  %endif
   113                              <1>  %endif
   113                              <1>  %endif
   113 00000065 B806000000          <1>  mov eax, %1
   113                              <1> 
   113 0000006A CD40                <1>  int 40h
   114                                  
   115                                  convert_byte_to_db:
   116 0000006C BE[68020000]            	mov	esi, BUFFER
   117 00000071 89F2                    	mov	edx, esi
   118 00000073 0315[64020000]          	add	edx, [fsize]
   119 00000079 89D7                    	mov	edi, edx 
   120                                  
   121 0000007B 31C9                    	xor	ecx, ecx
   122                                  c_0:
   123 0000007D B108                    	mov	cl, 8
   124                                  c_1:
   125 0000007F 66B86462                	mov	ax, 'db'
   126 00000083 66AB                    	stosw
   127 00000085 B020                    	mov	al, ' '
   128 00000087 AA                      	stosb
   129                                  c_2: 
   130 00000088 AC                      	lodsb
   131 00000089 E8F8000000              	call	hex
   132 0000008E 3C39                    	cmp	al, '9'
   133 00000090 7604                    	jna	short c_3	
   134                                  
   135 00000092 C60730                  	mov	byte [edi], '0'
   136 00000095 47                      	inc	edi
   137                                  c_3:
   138 00000096 66AB                    	stosw
   139 00000098 B068                    	mov	al, 'h'
   140 0000009A AA                      	stosb
   141                                  
   142 0000009B FF0D[64020000]          	dec	dword [fsize]
   143 000000A1 7414                    	jz	short c_5
   144                                  
   145 000000A3 FEC9                    	dec	cl
   146 000000A5 7408                    	jz	short c_4
   147                                  
   148 000000A7 66B82C20                	mov	ax, ', '
   149 000000AB 66AB                    	stosw
   150 000000AD EBD9                    	jmp	short c_2
   151                                  c_4:
   152 000000AF 66B80D0A                	mov 	ax, 0A0Dh
   153 000000B3 66AB                    	stosw
   154 000000B5 EBC6                    	jmp	short c_0
   155                                  c_5:
   156 000000B7 66B80D0A                	mov 	ax, 0A0Dh
   157 000000BB 66AB                    	stosw
   158                                  
   159                                  create_txt_file:
   160                                  	sys	_creat, txt_file, 0 ; create (normal) file
   160                              <1> 
   160                              <1> 
   160                              <1> 
   160                              <1> 
   160                              <1>  %if %0 >= 2
   160 000000BD BB[53020000]        <1>  mov ebx, %2
   160                              <1>  %if %0 >= 3
   160 000000C2 B900000000          <1>  mov ecx, %3
   160                              <1>  %if %0 = 4
   160                              <1>  mov edx, %4
   160                              <1>  %endif
   160                              <1>  %endif
   160                              <1>  %endif
   160 000000C7 B808000000          <1>  mov eax, %1
   160                              <1> 
   160 000000CC CD40                <1>  int 40h
   161 000000CE 725E                    	jc	short create_error
   162                                  
   163 000000D0 A3[60020000]            	mov	[fhandle], eax
   164                                  
   165 000000D5 C605[5E020000]0B        	mov	byte [color], 0Bh ; Light Cyan
   166 000000DC BE[40020000]            	mov	esi, msg_writing
   167 000000E1 E88E000000              	call	print_msg
   168                                  
   169 000000E6 29D7                    	sub	edi, edx ; file size 
   170                                  	; edx = start address of the text
   171                                  
   172                                  	sys	_write, [fhandle], edx, edi ; write to 'BIN2DB.TXT' 
   172                              <1> 
   172                              <1> 
   172                              <1> 
   172                              <1> 
   172                              <1>  %if %0 >= 2
   172 000000E8 8B1D[60020000]      <1>  mov ebx, %2
   172                              <1>  %if %0 >= 3
   172 000000EE 89D1                <1>  mov ecx, %3
   172                              <1>  %if %0 = 4
   172 000000F0 89FA                <1>  mov edx, %4
   172                              <1>  %endif
   172                              <1>  %endif
   172                              <1>  %endif
   172 000000F2 B804000000          <1>  mov eax, %1
   172                              <1> 
   172 000000F7 CD40                <1>  int 40h
   173 000000F9 724D                     	jc	short rw_error  ; disk write (or free space) error
   174                                  
   175 000000FB E868000000              	call	print_msg_ok
   176                                  
   177                                  	sys	_close, [fhandle] ; close file
   177                              <1> 
   177                              <1> 
   177                              <1> 
   177                              <1> 
   177                              <1>  %if %0 >= 2
   177 00000100 8B1D[60020000]      <1>  mov ebx, %2
   177                              <1>  %if %0 >= 3
   177                              <1>  mov ecx, %3
   177                              <1>  %if %0 = 4
   177                              <1>  mov edx, %4
   177                              <1>  %endif
   177                              <1>  %endif
   177                              <1>  %endif
   177 00000106 B806000000          <1>  mov eax, %1
   177                              <1> 
   177 0000010B CD40                <1>  int 40h
   178                                  
   179 0000010D C605[5E020000]07        	mov	byte [color], 07h ; Light Gray (Default Color)
   180 00000114 BE[24020000]            	mov	esi, nextline
   181 00000119 EB05                    	jmp	short print_nl
   182                                  
   183                                  prg_msg:
   184 0000011B BE[AE010000]            	mov	esi, msg_program
   185                                  print_nl:
   186 00000120 E84F000000              	call	print_msg	
   187                                  terminate:
   188                                  	sys 	_exit			   ; INT 40h
   188                              <1> 
   188                              <1> 
   188                              <1> 
   188                              <1> 
   188                              <1>  %if %0 >= 2
   188                              <1>  mov ebx, %2
   188                              <1>  %if %0 >= 3
   188                              <1>  mov ecx, %3
   188                              <1>  %if %0 = 4
   188                              <1>  mov edx, %4
   188                              <1>  %endif
   188                              <1>  %endif
   188                              <1>  %endif
   188 00000125 B801000000          <1>  mov eax, %1
   188                              <1> 
   188 0000012A CD40                <1>  int 40h
   189                                  here:
   190 0000012C EBFE                    	jmp	short here
   191                                  
   192                                  create_error:
   193 0000012E BE[11020000]            	mov	esi, msg_create_error
   194 00000133 EB05                    	jmp	short open_create_error
   195                                  open_error:
   196 00000135 BE[FD010000]            	mov	esi, msg_open_error
   197                                  open_create_error:
   198 0000013A C605[5E020000]0C        	mov	byte [color], 0Ch ; Light Red
   199 00000141 E82E000000              	call	print_msg		   ; INT 31h
   200 00000146 EBDD                    	jmp	short terminate	
   201                                  
   202                                  rw_error:
   203                                  	sys	_close, [fhandle] ; close file
   203                              <1> 
   203                              <1> 
   203                              <1> 
   203                              <1> 
   203                              <1>  %if %0 >= 2
   203 00000148 8B1D[60020000]      <1>  mov ebx, %2
   203                              <1>  %if %0 >= 3
   203                              <1>  mov ecx, %3
   203                              <1>  %if %0 = 4
   203                              <1>  mov edx, %4
   203                              <1>  %endif
   203                              <1>  %endif
   203                              <1>  %endif
   203 0000014E B806000000          <1>  mov eax, %1
   203                              <1> 
   203 00000153 CD40                <1>  int 40h
   204 00000155 C605[5E020000]0C        	mov	byte [color], 0Ch ; Light Red
   205 0000015C BE[27020000]            	mov	esi, msg_error
   206 00000161 E80E000000              	call	print_msg		   ; INT 31h
   207 00000166 EBBD                    	jmp	short terminate
   208                                  
   209                                  print_msg_ok:
   210 00000168 C605[5E020000]0A        	mov	byte [color], 0Ah ; Light Green
   211 0000016F BE[4E020000]            	mov	esi, msg_ok
   212                                  print_msg:
   213 00000174 0FB61D[5E020000]        	movzx	ebx, byte [color] ; text color (bl)
   214                                  		               ; video page 0 (bh)
   215 0000017B B40E                    	mov	ah, 0Eh ; teletype output (write tty)
   216 0000017D AC                      	lodsb
   217                                  _p_nextchar:
   218 0000017E CD31                    	int	31h
   219 00000180 AC                      	lodsb
   220 00000181 20C0                    	and	al, al
   221 00000183 75F9                    	jnz	short _p_nextchar
   222 00000185 C3                      	retn
   223                                  
   224                                  hex:
   225 00000186 0FB6D8                  	movzx	ebx, al
   226 00000189 C0EB04                  	shr	bl, 4
   227 0000018C 8A9B[9E010000]          	mov	bl, [ebx+hexchrs] 	 	
   228 00000192 86D8                    	xchg	bl, al
   229 00000194 80E30F                  	and	bl, 0Fh
   230 00000197 8AA3[9E010000]          	mov	ah, [ebx+hexchrs] 
   231 0000019D C3                      	retn
   232                                  
   233                                  hexchrs:
   234 0000019E 303132333435363738-     	db '0123456789ABCDEF'
   234 000001A7 39414243444546     
   235                                  
   236                                  ;-----------------------------------------------------------------
   237                                  ;  messages
   238                                  ;-----------------------------------------------------------------
   239                                  
   240                                  msg_program:
   241 000001AE 0D0A                    	db 0Dh, 0Ah
   242 000001B0 42494E3244422E5052-     	db "BIN2DB.PRG /// TRDOS 386 syswrite test program"
   242 000001B9 47202F2F2F20545244-
   242 000001C2 4F5320333836207379-
   242 000001CB 737772697465207465-
   242 000001D4 73742070726F677261-
   242 000001DD 6D                 
   243 000001DE 0D0A                    	db 0Dh, 0Ah
   244 000001E0 6279204572646F6761-     	db "by Erdogan Tan, 05/11/2016", 0Dh, 0Ah, 0
   244 000001E9 6E2054616E2C203035-
   244 000001F2 2F31312F323031360D-
   244 000001FB 0A00               
   245                                  
   246                                  msg_open_error:
   247 000001FD 0D0A                    	db 0Dh, 0Ah
   248 000001FF 7379736F70656E2065-     	db 'sysopen error !'
   248 00000208 72726F722021       
   249 0000020E 0D0A00                  	db 0Dh, 0Ah, 0
   250                                  
   251                                  msg_create_error:
   252 00000211 0D0A                    	db 0Dh, 0Ah
   253 00000213 737973637265617465-     	db 'syscreate error !'
   253 0000021C 206572726F722021   
   254                                  nextline:
   255 00000224 0D0A00                  	db 0Dh, 0Ah, 0
   256                                  
   257                                  msg_error:
   258 00000227 4552524F522021200D-     	db 'ERROR ! ', 0Dh, 0Ah, 0
   258 00000230 0A00               
   259                                  
   260                                  msg_reading:
   261 00000232 0D0A                    	db 0Dh, 0Ah
   262 00000234 52656164696E672E2E-     	db 'Reading... ', 0
   262 0000023D 2E2000             
   263                                  
   264                                  msg_writing:
   265 00000240 0D0A                    	db 0Dh, 0Ah
   266 00000242 57726974696E672E2E-     	db 'Writing... ', 0
   266 0000024B 2E2000             
   267                                  
   268                                  msg_ok:
   269 0000024E 4F4B2E2000              	db 'OK. ', 0
   270                                  
   271                                  txt_file:
   272 00000253 42494E3244422E5458-     	db 'BIN2DB.TXT', 0
   272 0000025C 5400               
   273                                  
   274 0000025E 0F                      color:	db 0Fh ; White
   275                                  
   276                                  bss:
   277                                  
   278                                  ABSOLUTE bss
   279                                  
   280 0000025F <res 00000001>          alignb 4
   281                                  
   282 00000260 <res 00000004>          fhandle: resd 1
   283 00000264 <res 00000004>          fsize:	 resd 1
   284                                  
   285                                  BUFFER:	
