     1                                  ; ****************************************************************************
     2                                  ; db2bin.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'db2bin.prg')
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; DB2BIN.PRG ! 'sysopen', 'sysread', 'syswrite' TEST program for TRDOS 386 !
     5                                  ;
     6                                  ; 03/11/2016
     7                                  ;
     8                                  ; [ Last Modification: 05/11/2016 ]
     9                                  ;
    10                                  ; ****************************************************************************
    11                                  ; Note: This program is inverse of the BIN2DB.PRG (03/11/2016, 'bin2db.s')
    12                                  
    13                                  
    14                                  ; 16/10/2016
    15                                  ; 29/04/2016
    16                                  ; TRDOS 386 system calls (temporary list!)
    17                                  _ver 	equ 0
    18                                  _exit 	equ 1
    19                                  _fork 	equ 2
    20                                  _read 	equ 3
    21                                  _write	equ 4
    22                                  _open	equ 5
    23                                  _close 	equ 6
    24                                  _wait 	equ 7
    25                                  _creat 	equ 8
    26                                  _link 	equ 9
    27                                  _unlink	equ 10
    28                                  _exec	equ 11
    29                                  _chdir	equ 12
    30                                  _time 	equ 13
    31                                  _mkdir 	equ 14
    32                                  _chmod	equ 15
    33                                  _chown	equ 16
    34                                  _break	equ 17
    35                                  _stat	equ 18
    36                                  _seek	equ 19
    37                                  _tell 	equ 20
    38                                  _mount	equ 21
    39                                  _umount	equ 22
    40                                  _setuid	equ 23
    41                                  _getuid	equ 24
    42                                  _stime	equ 25
    43                                  _quit	equ 26	
    44                                  _intr	equ 27
    45                                  _fstat	equ 28
    46                                  _emt 	equ 29
    47                                  _mdate 	equ 30
    48                                  _video 	equ 31
    49                                  _audio	equ 32
    50                                  _timer	equ 33
    51                                  _sleep	equ 34
    52                                  _msg    equ 35
    53                                  _geterr	equ 36
    54                                  _rsvd1	equ 37
    55                                  _pri	equ 38
    56                                  _rele	equ 39
    57                                  _fff	equ 40
    58                                  _fnf	equ 41
    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 89E6                    	mov	esi, esp
    88 00000002 AD                      	lodsd
    89 00000003 83F802                  	cmp	eax, 2 ; two arguments (program file name & text file name)
    90 00000006 0F8226030000            	jb	prg_msg ; nothing to do
    91                                  
    92 0000000C AD                      	lodsd ; program file name address 
    93 0000000D AD                      	lodsd ; text file name address (file to be read)
    94                                  	; EAX = arg2 ; file name address
    95                                  
    96                                  open_txt_file:
    97                                  	sys	_open, eax, 0 ; open for reading
    97                              <1> 
    97                              <1> 
    97                              <1> 
    97                              <1> 
    97                              <1>  %if %0 >= 2
    97 0000000E 89C3                <1>  mov ebx, %2
    97                              <1>  %if %0 >= 3
    97 00000010 B900000000          <1>  mov ecx, %3
    97                              <1>  %if %0 = 4
    97                              <1>  mov edx, %4
    97                              <1>  %endif
    97                              <1>  %endif
    97                              <1>  %endif
    97 00000015 B805000000          <1>  mov eax, %1
    97                              <1> 
    97 0000001A CD40                <1>  int 40h
    98 0000001C 0F822A030000            	jc	open_error
    99                                  
   100 00000022 A3[78040000]            	mov	[fhandle], eax ; file handle/index number
   101                                  
   102 00000027 C605[75040000]0E        	mov	byte [color], 0Eh ; Yellow
   103 0000002E BE[2D040000]            	mov	esi, msg_reading
   104 00000033 E853030000              	call	print_msg
   105                                  
   106                                  read_file:
   107                                  	sys	_read, [fhandle], BUFFER, 0FFFFFFFFh ; read all bytes 
   107                              <1> 
   107                              <1> 
   107                              <1> 
   107                              <1> 
   107                              <1>  %if %0 >= 2
   107 00000038 8B1D[78040000]      <1>  mov ebx, %2
   107                              <1>  %if %0 >= 3
   107 0000003E B9[80040000]        <1>  mov ecx, %3
   107                              <1>  %if %0 = 4
   107 00000043 BAFFFFFFFF          <1>  mov edx, %4
   107                              <1>  %endif
   107                              <1>  %endif
   107                              <1>  %endif
   107 00000048 B803000000          <1>  mov eax, %1
   107                              <1> 
   107 0000004D CD40                <1>  int 40h
   108 0000004F 0F820A030000             	jc	rw_error	; disk read or memory allocation error
   109                                  
   110 00000055 A3[7C040000]            	mov	[fsize], eax ; file size (read bytes)
   111                                  
   112 0000005A E820030000              	call	print_msg_ok
   113                                  
   114                                  close_txt_file:
   115                                  	sys	_close, [fhandle] ; close file
   115                              <1> 
   115                              <1> 
   115                              <1> 
   115                              <1> 
   115                              <1>  %if %0 >= 2
   115 0000005F 8B1D[78040000]      <1>  mov ebx, %2
   115                              <1>  %if %0 >= 3
   115                              <1>  mov ecx, %3
   115                              <1>  %if %0 = 4
   115                              <1>  mov edx, %4
   115                              <1>  %endif
   115                              <1>  %endif
   115                              <1>  %endif
   115 00000065 B806000000          <1>  mov eax, %1
   115                              <1> 
   115 0000006A CD40                <1>  int 40h
   116                                  
   117 0000006C C605[75040000]0F        	mov	byte [color], 0Fh ; White
   118 00000073 BE[3B040000]            	mov	esi, msg_checking
   119 00000078 E80E030000              	call	print_msg
   120                                  
   121 0000007D BE[80040000]            	mov	esi, BUFFER
   122 00000082 8B0D[7C040000]          	mov	ecx, [fsize]
   123 00000088 28E4                    	sub	ah, ah  ; 0
   124 0000008A 89F7                    	mov	edi, esi
   125 0000008C 01CF                    	add	edi, ecx
   126                                  chk_db_0:
   127 0000008E AC                      	lodsb
   128 0000008F 3C64                    	cmp	al, 'd'
   129 00000091 746F                    	je	short chk_db_6
   130 00000093 3C44                    	cmp	al, 'D'
   131 00000095 746B                    	je	short chk_db_6
   132 00000097 3C3B                    	cmp	al, ';' ; comment line
   133 00000099 0F8439010000            	je	chk_db_17
   134 0000009F 3C09                    	cmp	al, 09h ; TAB key
   135 000000A1 740C                    	je	short chk_db_1
   136 000000A3 3C20                    	cmp	al, 20h ; SPACE
   137 000000A5 7408                    	je	short chk_db_1
   138 000000A7 3C0D                    	cmp	al, 0Dh
   139 000000A9 740B                    	je	short chk_db_2
   140 000000AB 3C0A                    	cmp	al, 0Ah
   141 000000AD 7423                    	je	short chk_db_3
   142                                  
   143                                  chk_db_1:
   144 000000AF E2DD                    	loop	chk_db_0
   145 000000B1 E904020000              	jmp	write_to_bin_file
   146                                  
   147                                  chk_db_2:
   148 000000B6 80FC68                  	cmp	ah, 'h'
   149 000000B9 74F4                    	je	short chk_db_1
   150 000000BB 80FC48                  	cmp	ah, 'H'
   151 000000BE 74EF                    	je	short chk_db_1
   152 000000C0 80FC0A                  	cmp	ah, 0Ah
   153 000000C3 7429                    	je	short chk_db_4
   154 000000C5 80FC00                  	cmp	ah, 0
   155 000000C8 0F859E020000            	jne	chk_error
   156 000000CE 88C4                    	mov	ah, al ; 0Dh
   157 000000D0 EBDD                    	jmp	short chk_db_1
   158                                  
   159                                  chk_db_3:
   160 000000D2 80FC0D                  	cmp	ah, 0Dh
   161 000000D5 7417                    	je	short chk_db_4
   162 000000D7 80FC68                  	cmp	ah, 'h'
   163 000000DA 74D3                    	je	short chk_db_1
   164 000000DC 80FC48                  	cmp	ah, 'H'
   165 000000DF 74CE                    	je	short chk_db_1
   166 000000E1 80FC00                  	cmp	ah, 0
   167 000000E4 0F8582020000            	jne	chk_error
   168 000000EA 88C4                    	mov	ah, al ; 0Ah
   169 000000EC EBC1                    	jmp	short chk_db_1
   170                                  
   171                                  chk_db_4:
   172 000000EE B400                    	mov	ah, 0
   173 000000F0 EBBD                    	jmp	short chk_db_1
   174                                  
   175                                  chk_db_5: ; al  = 'd'
   176 000000F2 88C4                    	mov	ah, al
   177 000000F4 AC                      	lodsb
   178 000000F5 3C62                    	cmp	al, 'b'
   179 000000F7 742C                    	je	short chk_db_9
   180 000000F9 3C42                    	cmp	al, 'B'
   181 000000FB 7428                    	je	short chk_db_9
   182 000000FD E96A020000              	jmp	chk_error	
   183                                  
   184                                  chk_db_6:
   185 00000102 E2EE                    	loop	chk_db_5
   186 00000104 E963020000              	jmp	chk_error
   187                                  
   188                                  chk_db_7:
   189 00000109 AC                      	lodsb
   190 0000010A 3C20                    	cmp	al, 20h ; space
   191 0000010C 751E                    	jne	short chk_db_10
   192 0000010E E2F9                    	loop	chk_db_7
   193 00000110 E9A5010000              	jmp	write_to_bin_file
   194                                  
   195                                  chk_db_8:
   196 00000115 AC                      	lodsb
   197 00000116 3C20                    	cmp	al, 20h ; space
   198 00000118 0F854E020000            	jne	chk_error
   199 0000011E E2E9                    	loop	chk_db_7
   200 00000120 E947020000              	jmp	chk_error
   201                                  
   202                                  chk_db_9: ; al  = 'b'
   203 00000125 E2EE                    	loop	chk_db_8
   204 00000127 E940020000              	jmp	chk_error
   205                                  
   206                                  chk_db_10:
   207 0000012C 0F823B010000            	jb	chk_db_24
   208 00000132 3C30                    	cmp	al, '0'
   209 00000134 0F82A5000000            	jb	chk_db_18
   210 0000013A 3C39                    	cmp	al, '9'
   211 0000013C 7649                    	jna	short chk_db_11
   212 0000013E 3C41                    	cmp	al, 'A'
   213 00000140 0F828E000000            	jb	chk_db_16
   214 00000146 3C46                    	cmp	al, 'F'
   215 00000148 763D                    	jna	short chk_db_11
   216 0000014A 3C61                    	cmp	al, 'a'
   217 0000014C 0F821A020000            	jb	chk_error
   218 00000152 3C66                    	cmp	al, 'f'
   219 00000154 7631                    	jna	short chk_db_11
   220                                  
   221 00000156 80FC30                  	cmp	ah, '0' ; numeric chars
   222 00000159 0F850D020000            	jne	chk_error
   223 0000015F 24DF                    	and	al, 0DFh ; capital letter
   224 00000161 3C48                    	cmp	al, 'H'
   225 00000163 0F8503020000            	jne	chk_error
   226 00000169 3825[77040000]          	cmp	[Digit2], ah  ;'0'
   227 0000016F 0F8389000000            	jnb	chk_db_19
   228 00000175 A0[76040000]            	mov	al, [Digit1]
   229 0000017A 8825[76040000]          	mov	[Digit1], ah  ;'0'
   230 00000180 A2[77040000]            	mov	[Digit2], al
   231 00000185 EB77                    	jmp	short chk_db_19
   232                                  
   233                                  chk_db_11:
   234 00000187 B430                    	mov 	ah, '0'
   235 00000189 3825[76040000]          	cmp	[Digit1], ah ;'0'
   236 0000018F 7709                    	ja	short chk_db_12
   237 00000191 7424                    	je	short chk_db_14
   238                                  
   239 00000193 A2[76040000]            	mov	[Digit1], al
   240 00000198 EB11                    	jmp	short chk_db_13
   241                                  
   242                                  chk_db_12:
   243 0000019A 3825[77040000]          	cmp	[Digit2], ah ;'0'
   244 000001A0 0F83C6010000            	jnb	chk_error
   245                                  
   246 000001A6 A2[77040000]            	mov	[Digit2], al
   247                                  chk_db_13:
   248                                  	;loop	chk_db_7
   249 000001AB 49                      	dec	ecx
   250 000001AC 0F8557FFFFFF            	jnz	chk_db_7
   251 000001B2 E9B5010000              	jmp	chk_error
   252                                  	
   253                                  chk_db_14:
   254 000001B7 3825[77040000]          	cmp	[Digit2], ah ; '0'
   255 000001BD 760E                    	jna	short chk_db_15
   256 000001BF 8A25[77040000]          	mov	ah, [Digit2]
   257 000001C5 8825[76040000]          	mov	[Digit1], ah ; 'A'..'F', 'a'..'f'
   258 000001CB B430                    	mov	ah, '0'
   259                                  chk_db_15:
   260 000001CD A2[77040000]            	mov	[Digit2], al
   261 000001D2 EBD7                    	jmp	short chk_db_13
   262                                  
   263                                  chk_db_16:
   264 000001D4 3C3B                    	cmp	al, ';' ; comment line
   265 000001D6 7507                    	jne	short chk_db_18
   266                                  chk_db_17:
   267 000001D8 E258                    	loop	chk_db_20
   268 000001DA E9DB000000              	jmp	write_to_bin_file
   269                                  
   270                                  chk_db_18:
   271 000001DF 3C2C                    	cmp	al, ',' 
   272 000001E1 0F8585010000            	jne	chk_error
   273                                  	;and	ah, 0DFh
   274                                  	;cmp	ah, 'H'
   275 000001E7 80FC68                  	cmp	ah, 'h'
   276 000001EA 0F857C010000            	jne	chk_error
   277 000001F0 49                      	dec	ecx
   278 000001F1 0F8475010000            	jz	chk_error
   279 000001F7 88C4                    	mov	ah, al
   280 000001F9 E90BFFFFFF              	jmp	chk_db_7
   281                                  
   282                                  chk_db_19:
   283 000001FE A0[76040000]            	mov	al, [Digit1]
   284                                  	;cmp	al, '0'
   285                                  	;jb	chk_error
   286 00000203 8A25[77040000]          	mov	ah, [Digit2]
   287                                  	;cmp	ah, '0'
   288                                  	;jb	chk_error
   289                                  
   290 00000209 E88F010000              	call	calc_number
   291 0000020E 86E0                    	xchg	ah, al
   292 00000210 C0E404                  	shl	ah, 4 ; * 16
   293 00000213 E885010000              	call	calc_number
   294                                  	;and	al, 0Fh
   295 00000218 08E0                    	or	al, ah
   296 0000021A AA                      	stosb
   297                                  
   298                                  	;mov	byte [Digit1], 0
   299                                  	;mov	byte [Digit2], 0
   300                                  
   301 0000021B 6631C0                  	xor	ax, ax
   302 0000021E 66A3[76040000]          	mov	[Digit1], ax
   303                                  
   304 00000224 B468                    	mov	ah, 'h'
   305                                  
   306                                  	;loop	chk_db_7	
   307 00000226 49                      	dec	ecx
   308 00000227 0F85DCFEFFFF            	jnz	chk_db_7
   309                                  	
   310 0000022D E988000000              	jmp	write_to_bin_file
   311                                  	
   312                                  chk_db_20:
   313 00000232 3C20                    	cmp	al, 20h
   314 00000234 7330                    	jnb	short chk_db_22
   315 00000236 3C09                    	cmp	al, 09h ; TAB key
   316 00000238 742C                    	je	short chk_db_22
   317 0000023A B40D                    	mov	ah, 0Dh
   318 0000023C 3C0A                    	cmp	al, 0Ah
   319 0000023E 740D                    	je	short chk_db_21
   320 00000240 B40A                    	mov	ah, 0Ah
   321 00000242 3C0D                    	cmp	al, 0Dh
   322 00000244 7407                    	je	short chk_db_21
   323 00000246 E222                    	loop	chk_db_23
   324 00000248 E91F010000              	jmp	chk_error
   325                                  
   326                                  chk_db_21:
   327 0000024D 49                      	dec	ecx
   328 0000024E 0F8418010000            	jz	chk_error
   329 00000254 AC                      	lodsb
   330 00000255 38E0                    	cmp	al, ah
   331 00000257 0F850F010000            	jne	chk_error
   332 0000025D 49                      	dec	ecx
   333 0000025E 0F852AFEFFFF            	jnz	chk_db_0
   334 00000264 EB54                    	jmp	write_to_bin_file
   335                                  
   336                                  chk_db_22:	
   337 00000266 E202                    	loop	chk_db_23 		
   338 00000268 EB50                    	jmp	short write_to_bin_file
   339                                  
   340                                  chk_db_23:
   341 0000026A AC                      	lodsb
   342 0000026B EBC5                    	jmp	short chk_db_20
   343                                  
   344                                  chk_db_24:
   345 0000026D 3C0A                    	cmp	al, 0Ah
   346 0000026F 7527                    	jne	short chk_db_27
   347 00000271 80FC0D                  	cmp	ah, 0Dh
   348 00000274 7417                    	je	short chk_db_26
   349 00000276 80FC68                  	cmp	ah, 'h'
   350                                  	;je	short chk_db_25
   351                                  	;cmp	ah, 'H'
   352 00000279 0F85ED000000            	jne	chk_error
   353                                  
   354                                  chk_db_25:
   355 0000027F 88C4                    	mov	ah, al
   356                                  
   357                                  	;loop	chk_db_7
   358 00000281 49                      	dec	ecx
   359 00000282 0F8581FEFFFF            	jnz	chk_db_7	
   360                                  
   361 00000288 E9DF000000              	jmp	chk_error
   362                                  
   363                                  chk_db_26:
   364 0000028D B400                    	mov	ah, 0
   365                                  	
   366                                  	;loop	chk_db_0
   367 0000028F 49                      	dec	ecx
   368 00000290 0F85F8FDFFFF            	jnz	chk_db_0
   369                                  
   370 00000296 EB22                    	jmp	short write_to_bin_file
   371                                  
   372                                  chk_db_27:
   373 00000298 3C0D                    	cmp	al, 0Dh
   374 0000029A 750F                    	jne	short chk_db_28
   375 0000029C 80FC0A                  	cmp	ah, 0Ah
   376 0000029F 74EC                    	je	short chk_db_26
   377 000002A1 80FC68                  	cmp	ah, 'h'
   378                                  	;je	short chk_db_25
   379                                  	;cmp	ah, 'H'
   380 000002A4 74D9                    	je	short chk_db_25
   381                                  
   382 000002A6 E9C1000000              	jmp	chk_error
   383                                  
   384                                  chk_db_28:
   385 000002AB 3C09                    	cmp	al, 09h ; TAB key
   386 000002AD 0F85B9000000            	jne	chk_error
   387                                  	
   388                                  	;loop	chk_db_7
   389                                  	
   390 000002B3 49                      	dec	ecx
   391 000002B4 0F854FFEFFFF            	jnz	chk_db_7
   392                                  	
   393                                  	;jmp	short write_to_bin_file
   394                                  
   395                                  write_to_bin_file:
   396 000002BA B9[80040000]            	mov	ecx, BUFFER
   397 000002BF 030D[7C040000]          	add	ecx, [fsize]
   398 000002C5 39CF                    	cmp	edi, ecx
   399 000002C7 0F869F000000            	jna	chk_error ; ZERO file size
   400                                  
   401 000002CD E8AD000000              	call	print_msg_ok
   402                                  
   403 000002D2 89CA                    	mov	edx, ecx ; 1st byte of converted data
   404                                  	
   405                                  create_bin_file:
   406                                  	sys	_creat, bin_file, 0 ; create (normal) file
   406                              <1> 
   406                              <1> 
   406                              <1> 
   406                              <1> 
   406                              <1>  %if %0 >= 2
   406 000002D4 BB[6A040000]        <1>  mov ebx, %2
   406                              <1>  %if %0 >= 3
   406 000002D9 B900000000          <1>  mov ecx, %3
   406                              <1>  %if %0 = 4
   406                              <1>  mov edx, %4
   406                              <1>  %endif
   406                              <1>  %endif
   406                              <1>  %endif
   406 000002DE B808000000          <1>  mov eax, %1
   406                              <1> 
   406 000002E3 CD40                <1>  int 40h
   407 000002E5 725E                    	jc	short create_error
   408                                  
   409 000002E7 A3[78040000]            	mov	[fhandle], eax
   410                                  
   411 000002EC C605[75040000]0B        	mov	byte [color], 0Bh ; Light Cyan
   412 000002F3 BE[57040000]            	mov	esi, msg_writing
   413 000002F8 E88E000000              	call	print_msg
   414                                  
   415 000002FD 29D7                    	sub	edi, edx ; file size 
   416                                  	; edx = start address of the text
   417                                  
   418                                  	sys	_write, [fhandle], edx, edi ; write to 'DB2BIN.BIN' 
   418                              <1> 
   418                              <1> 
   418                              <1> 
   418                              <1> 
   418                              <1>  %if %0 >= 2
   418 000002FF 8B1D[78040000]      <1>  mov ebx, %2
   418                              <1>  %if %0 >= 3
   418 00000305 89D1                <1>  mov ecx, %3
   418                              <1>  %if %0 = 4
   418 00000307 89FA                <1>  mov edx, %4
   418                              <1>  %endif
   418                              <1>  %endif
   418                              <1>  %endif
   418 00000309 B804000000          <1>  mov eax, %1
   418                              <1> 
   418 0000030E CD40                <1>  int 40h
   419 00000310 724D                     	jc	short rw_error  ; disk write (or free space) error
   420                                  
   421 00000312 E868000000              	call	print_msg_ok
   422                                  
   423                                  	sys	_close, [fhandle] ; close file
   423                              <1> 
   423                              <1> 
   423                              <1> 
   423                              <1> 
   423                              <1>  %if %0 >= 2
   423 00000317 8B1D[78040000]      <1>  mov ebx, %2
   423                              <1>  %if %0 >= 3
   423                              <1>  mov ecx, %3
   423                              <1>  %if %0 = 4
   423                              <1>  mov edx, %4
   423                              <1>  %endif
   423                              <1>  %endif
   423                              <1>  %endif
   423 0000031D B806000000          <1>  mov eax, %1
   423                              <1> 
   423 00000322 CD40                <1>  int 40h
   424                                  
   425 00000324 C605[75040000]07        	mov	byte [color], 07h ; Light Gray (Default Color)
   426 0000032B BE[1F040000]            	mov	esi, nextline
   427 00000330 EB05                    	jmp	short print_nl
   428                                  
   429                                  prg_msg:
   430 00000332 BE[A9030000]            	mov	esi, msg_program
   431                                  print_nl:
   432 00000337 E84F000000              	call	print_msg	
   433                                  terminate:
   434                                  	sys 	_exit			   ; INT 40h
   434                              <1> 
   434                              <1> 
   434                              <1> 
   434                              <1> 
   434                              <1>  %if %0 >= 2
   434                              <1>  mov ebx, %2
   434                              <1>  %if %0 >= 3
   434                              <1>  mov ecx, %3
   434                              <1>  %if %0 = 4
   434                              <1>  mov edx, %4
   434                              <1>  %endif
   434                              <1>  %endif
   434                              <1>  %endif
   434 0000033C B801000000          <1>  mov eax, %1
   434                              <1> 
   434 00000341 CD40                <1>  int 40h
   435                                  here:
   436 00000343 EBFE                    	jmp	short here
   437                                  
   438                                  create_error:
   439 00000345 BE[0C040000]            	mov	esi, msg_create_error
   440 0000034A EB05                    	jmp	short open_create_error
   441                                  open_error:
   442 0000034C BE[F8030000]            	mov	esi, msg_open_error
   443                                  open_create_error:
   444 00000351 C605[75040000]0C        	mov	byte [color], 0Ch ; Light Red
   445 00000358 E82E000000              	call	print_msg		   ; INT 31h
   446 0000035D EBDD                    	jmp	short terminate	
   447                                  
   448                                  rw_error:
   449                                  	sys	_close, [fhandle] ; close file
   449                              <1> 
   449                              <1> 
   449                              <1> 
   449                              <1> 
   449                              <1>  %if %0 >= 2
   449 0000035F 8B1D[78040000]      <1>  mov ebx, %2
   449                              <1>  %if %0 >= 3
   449                              <1>  mov ecx, %3
   449                              <1>  %if %0 = 4
   449                              <1>  mov edx, %4
   449                              <1>  %endif
   449                              <1>  %endif
   449                              <1>  %endif
   449 00000365 B806000000          <1>  mov eax, %1
   449                              <1> 
   449 0000036A CD40                <1>  int 40h
   450                                  chk_error:
   451 0000036C C605[75040000]0C        	mov	byte [color], 0Ch ; Light Red
   452 00000373 BE[22040000]            	mov	esi, msg_error
   453 00000378 E80E000000              	call	print_msg		   ; INT 31h
   454 0000037D EBBD                    	jmp	short terminate
   455                                  
   456                                  print_msg_ok:
   457 0000037F C605[75040000]0A        	mov	byte [color], 0Ah ; Light Green
   458 00000386 BE[65040000]            	mov	esi, msg_ok
   459                                  print_msg:
   460 0000038B 0FB61D[75040000]        	movzx	ebx, byte [color] ; text color (bl)
   461                                  		               ; video page 0 (bh)
   462 00000392 B40E                    	mov	ah, 0Eh ; teletype output (write tty)
   463 00000394 AC                      	lodsb
   464                                  _p_nextchar:
   465 00000395 CD31                    	int	31h
   466 00000397 AC                      	lodsb
   467 00000398 20C0                    	and	al, al
   468 0000039A 75F9                    	jnz	short _p_nextchar
   469 0000039C C3                      	retn
   470                                  
   471                                  calc_number:
   472                                  	; AL = numeric character
   473 0000039D 3C39                    	cmp	al, '9'
   474 0000039F 7703                    	ja	short calc_num1
   475 000003A1 2C30                    	sub	al, '0'
   476 000003A3 C3                      	retn
   477                                  calc_num1:
   478 000003A4 24DF                    	and	al, 0DFh ; convert to capital letter
   479 000003A6 2C37                    	sub	al, 'A'-10
   480 000003A8 C3                      	retn
   481                                  
   482                                  
   483                                  ;-----------------------------------------------------------------
   484                                  ;  messages
   485                                  ;-----------------------------------------------------------------
   486                                  
   487                                  msg_program:
   488 000003A9 0D0A                    	db 0Dh, 0Ah
   489 000003AB 44423242494E2E5052-     	db "DB2BIN.PRG /// TRDOS 386 syswrite test program"
   489 000003B4 47202F2F2F20545244-
   489 000003BD 4F5320333836207379-
   489 000003C6 737772697465207465-
   489 000003CF 73742070726F677261-
   489 000003D8 6D                 
   490 000003D9 0D0A                    	db 0Dh, 0Ah
   491 000003DB 6279204572646F6761-     	db "by Erdogan Tan, 05/11/2016", 0Dh, 0Ah, 0
   491 000003E4 6E2054616E2C203035-
   491 000003ED 2F31312F323031360D-
   491 000003F6 0A00               
   492                                  
   493                                  msg_open_error:
   494 000003F8 0D0A                    	db 0Dh, 0Ah
   495 000003FA 7379736F70656E2065-     	db 'sysopen error !'
   495 00000403 72726F722021       
   496 00000409 0D0A00                  	db 0Dh, 0Ah, 0
   497                                  
   498                                  msg_create_error:
   499 0000040C 0D0A                    	db 0Dh, 0Ah
   500 0000040E 737973637265617465-     	db 'syscreate error !'
   500 00000417 206572726F722021   
   501                                  nextline:
   502 0000041F 0D0A00                  	db 0Dh, 0Ah, 0
   503                                  
   504                                  msg_error:
   505 00000422 4552524F522021200D-     	db 'ERROR ! ', 0Dh, 0Ah, 0
   505 0000042B 0A00               
   506                                  
   507                                  msg_reading:
   508 0000042D 0D0A                    	db 0Dh, 0Ah
   509 0000042F 52656164696E672E2E-     	db 'Reading... ', 0
   509 00000438 2E2000             
   510                                  
   511                                  msg_checking:
   512 0000043B 0D0A                    	db 0Dh, 0Ah
   513 0000043D 436865636B696E6720-     	db 'Checking & Converting... ', 0
   513 00000446 2620436F6E76657274-
   513 0000044F 696E672E2E2E2000   
   514                                  
   515                                  msg_writing:
   516 00000457 0D0A                    	db 0Dh, 0Ah
   517 00000459 57726974696E672E2E-     	db 'Writing... ', 0
   517 00000462 2E2000             
   518                                  
   519                                  msg_ok:
   520 00000465 4F4B2E2000              	db 'OK. ', 0
   521                                  
   522                                  bin_file:
   523 0000046A 44423242494E2E4249-     	db 'DB2BIN.BIN', 0
   523 00000473 4E00               
   524                                  
   525 00000475 0F                      color:	db 0Fh ; White
   526                                  
   527                                  Digit1:
   528 00000476 00                      	db 0
   529                                  Digit2:
   530 00000477 00                      	db 0
   531                                  
   532                                  bss:
   533                                  
   534                                  ABSOLUTE bss
   535                                  
   536                                  alignb 4
   537                                  
   538 00000478 <res 00000004>          fhandle: resd 1
   539 0000047C <res 00000004>          fsize:	 resd 1
   540                                  
   541                                  
   542                                  BUFFER:	
