     1                                  ; ****************************************************************************
     2                                  ; readfile.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'readfile.prg')
     3                                  ; ----------------------------------------------------------------------------
     4                                  ; READFILE.PRG ! 'sysopen' and 'sysread' TEST program for TRDOS 386 !
     5                                  ;
     6                                  ; 11/10/2016
     7                                  ;
     8                                  ; [ Last Modification: 13/10/2016 ]
     9                                  ;
    10                                  ; ****************************************************************************
    11                                  ;
    12                                  ; 29/04/2016
    13                                  ; TRDOS 386 system calls (temporary list!)
    14                                  _ver 	equ 0
    15                                  _exit 	equ 1
    16                                  _fork 	equ 2
    17                                  _read 	equ 3
    18                                  _write	equ 4
    19                                  _open	equ 5
    20                                  _close 	equ 6
    21                                  _wait 	equ 7
    22                                  _creat 	equ 8
    23                                  _link 	equ 9
    24                                  _unlink	equ 10
    25                                  _exec	equ 11
    26                                  _chdir	equ 12
    27                                  _time 	equ 13
    28                                  _mkdir 	equ 14
    29                                  _chmod	equ 15
    30                                  _chown	equ 16
    31                                  _break	equ 17
    32                                  _stat	equ 18
    33                                  _seek	equ 19
    34                                  _tell 	equ 20
    35                                  _mount	equ 21
    36                                  _umount	equ 22
    37                                  _setuid	equ 23
    38                                  _getuid	equ 24
    39                                  _stime	equ 25
    40                                  _quit	equ 26	
    41                                  _intr	equ 27
    42                                  _fstat	equ 28
    43                                  _emt 	equ 29
    44                                  _mdate 	equ 30
    45                                  _stty 	equ 31
    46                                  _gtty	equ 32
    47                                  _ilgins	equ 33
    48                                  _sleep	equ 34
    49                                  _msg    equ 35
    50                                  
    51                                  %macro sys 1-4
    52                                      ; 29/04/2016 - TRDOS 386 (TRDOS v2.0)	
    53                                      ; 03/09/2015	
    54                                      ; 13/04/2015
    55                                      ; Retro UNIX 386 v1 system call.		
    56                                      %if %0 >= 2   
    57                                          mov ebx, %2
    58                                          %if %0 >= 3    
    59                                              mov ecx, %3
    60                                              %if %0 = 4
    61                                                 mov edx, %4   
    62                                              %endif
    63                                          %endif
    64                                      %endif
    65                                      mov eax, %1
    66                                      ;int 30h
    67                                      int 40h ; TRDOS 386 (TRDOS v2.0)		   
    68                                  %endmacro
    69                                  
    70                                  ; TRDOS 386 (and Retro UNIX 386 v1) system call format:
    71                                  ; sys systemcall (eax) <arg1 (ebx)>, <arg2 (ecx)>, <arg3 (edx)>
    72                                  
    73                                  [BITS 32] ; We need 32-bit intructions for protected mode
    74                                  
    75                                  [ORG 0] 
    76                                  
    77                                  START_CODE:
    78 00000000 89E6                    	mov	esi, esp
    79 00000002 AD                      	lodsd
    80 00000003 83F802                  	cmp	eax, 2 ; two arguments (program file name & text file name)
    81 00000006 0F8289000000            	jb	prg_msg
    82 0000000C AD                      	lodsd ; program file name address 
    83 0000000D AD                      	lodsd ; text file name address
    84 0000000E 50                      	push	eax ; arg2 ; file name
    85                                  
    86                                  	sys	_open, eax, 0 ; open for reading
    87                              <1> 
    88                              <1> 
    89                              <1> 
    90                              <1> 
    91                              <1>  %if %0 >= 2
    92 0000000F 89C3                <1>  mov ebx, %2
    93                              <1>  %if %0 >= 3
    94 00000011 B900000000          <1>  mov ecx, %3
    95                              <1>  %if %0 = 4
    96                              <1>  mov edx, %4
    97                              <1>  %endif
    98                              <1>  %endif
    99                              <1>  %endif
   100 00000016 B805000000          <1>  mov eax, %1
   101                              <1> 
   102 0000001B CD40                <1>  int 40h
   103 0000001D 0F828A000000            	jc	open_error
   104                                  
   105 00000023 A3[E6000000]            	mov	[fhandle], eax ; file handle/index number
   106                                  
   107                                  	sys	_msg, msg_reading, 255, 0Ah ; Green
   108                              <1> 
   109                              <1> 
   110                              <1> 
   111                              <1> 
   112                              <1>  %if %0 >= 2
   113 00000028 BB[7D010000]        <1>  mov ebx, %2
   114                              <1>  %if %0 >= 3
   115 0000002D B9FF000000          <1>  mov ecx, %3
   116                              <1>  %if %0 = 4
   117 00000032 BA0A000000          <1>  mov edx, %4
   118                              <1>  %endif
   119                              <1>  %endif
   120                              <1>  %endif
   121 00000037 B823000000          <1>  mov eax, %1
   122                              <1> 
   123 0000003C CD40                <1>  int 40h
   124                                  
   125 0000003E 58                      	pop	eax
   126                                  
   127                                  	sys	_msg, eax, 255, 0Ch ; Red
   128                              <1> 
   129                              <1> 
   130                              <1> 
   131                              <1> 
   132                              <1>  %if %0 >= 2
   133 0000003F 89C3                <1>  mov ebx, %2
   134                              <1>  %if %0 >= 3
   135 00000041 B9FF000000          <1>  mov ecx, %3
   136                              <1>  %if %0 = 4
   137 00000046 BA0C000000          <1>  mov edx, %4
   138                              <1>  %endif
   139                              <1>  %endif
   140                              <1>  %endif
   141 0000004B B823000000          <1>  mov eax, %1
   142                              <1> 
   143 00000050 CD40                <1>  int 40h
   144                                  
   145 00000052 BE[7A010000]            	mov	esi, nextline
   146 00000057 E87A000000              	call	print_msg
   147                                  
   148                                  
   149                                  	sys	_read, [fhandle], BUFFER, 0FFFFFFFFh ; read count = 4 Giga Bytes
   150                              <1> 
   151                              <1> 
   152                              <1> 
   153                              <1> 
   154                              <1>  %if %0 >= 2
   155 0000005C 8B1D[E6000000]      <1>  mov ebx, %2
   156                              <1>  %if %0 >= 3
   157 00000062 B9[8C010000]        <1>  mov ecx, %3
   158                              <1>  %if %0 = 4
   159 00000067 BAFFFFFFFF          <1>  mov edx, %4
   160                              <1>  %endif
   161                              <1>  %endif
   162                              <1>  %endif
   163 0000006C B803000000          <1>  mov eax, %1
   164                              <1> 
   165 00000071 CD40                <1>  int 40h
   166                                  					       ; read count = file size
   167 00000073 7255                     	jc	short read_error ; disk read or memory allocation error			
   168                                  
   169                                  show_text:
   170 00000075 BE[8C010000]            	mov	esi, BUFFER
   171 0000007A E857000000              	call	print_msg
   172                                  
   173                                  cf_terminate:
   174                                  	sys	_close, [fhandle] ; close file
   175                              <1> 
   176                              <1> 
   177                              <1> 
   178                              <1> 
   179                              <1>  %if %0 >= 2
   180 0000007F 8B1D[E6000000]      <1>  mov ebx, %2
   181                              <1>  %if %0 >= 3
   182                              <1>  mov ecx, %3
   183                              <1>  %if %0 = 4
   184                              <1>  mov edx, %4
   185                              <1>  %endif
   186                              <1>  %endif
   187                              <1>  %endif
   188 00000085 B806000000          <1>  mov eax, %1
   189                              <1> 
   190 0000008A CD40                <1>  int 40h
   191                                  
   192                                  terminate:
   193                                  	sys 	_exit			   ; INT 40h
   194                              <1> 
   195                              <1> 
   196                              <1> 
   197                              <1> 
   198                              <1>  %if %0 >= 2
   199                              <1>  mov ebx, %2
   200                              <1>  %if %0 >= 3
   201                              <1>  mov ecx, %3
   202                              <1>  %if %0 = 4
   203                              <1>  mov edx, %4
   204                              <1>  %endif
   205                              <1>  %endif
   206                              <1>  %endif
   207 0000008C B801000000          <1>  mov eax, %1
   208                              <1> 
   209 00000091 CD40                <1>  int 40h
   210                                  here:
   211 00000093 EBFE                    	jmp	short here
   212                                  
   213                                  prg_msg:
   214                                  	sys	_msg, msg_program, 255, 0Fh ; White
   215                              <1> 
   216                              <1> 
   217                              <1> 
   218                              <1> 
   219                              <1>  %if %0 >= 2
   220 00000095 BB[EA000000]        <1>  mov ebx, %2
   221                              <1>  %if %0 >= 3
   222 0000009A B9FF000000          <1>  mov ecx, %3
   223                              <1>  %if %0 = 4
   224 0000009F BA0F000000          <1>  mov edx, %4
   225                              <1>  %endif
   226                              <1>  %endif
   227                              <1>  %endif
   228 000000A4 B823000000          <1>  mov eax, %1
   229                              <1> 
   230 000000A9 CD40                <1>  int 40h
   231 000000AB EBDF                    	jmp	short terminate
   232                                  
   233                                  open_error:
   234 000000AD 50                      	push	eax
   235 000000AE BE[43010000]            	mov	esi, msg_open_error
   236 000000B3 E81E000000              	call	print_msg		   ; INT 31h
   237 000000B8 58                      	pop	eax
   238 000000B9 83F802                  	cmp	eax, 2
   239 000000BC 75CE                    	jne	short terminate
   240 000000BE BE[57010000]            	mov	esi, msg_not_found
   241 000000C3 E80E000000              	call	print_msg		   ; INT 31h
   242 000000C8 EBC2                    	jmp	short terminate	
   243                                  
   244                                  read_error:
   245 000000CA BE[6C010000]            	mov	esi, msg_read_error
   246 000000CF E802000000              	call	print_msg		   ; INT 31h
   247 000000D4 EBA9                    	jmp	short cf_terminate
   248                                  
   249                                  print_msg:
   250 000000D6 BB0E000000              	mov	ebx, 0Eh       ; yellow characters (bl)
   251                                  		               ; video page 0 (bh)
   252                                  	;mov	ah, 0Eh ; teletype output (write tty)
   253 000000DB 88DC                    	mov	ah, bl
   254 000000DD AC                      	lodsb
   255                                  _1:
   256 000000DE CD31                    	int	31h
   257 000000E0 AC                      	lodsb
   258 000000E1 20C0                    	and	al, al
   259 000000E3 75F9                    	jnz	short _1
   260                                  _2:
   261 000000E5 C3                      	retn
   262                                  
   263 000000E6 00000000                fhandle: dd 0
   264                                  
   265                                  ;-----------------------------------------------------------------
   266                                  ;  messages
   267                                  ;-----------------------------------------------------------------
   268                                  
   269                                  msg_program:
   270 000000EA 0D0A                    	db 0Dh, 0Ah
   271 000000EC 5245414446494C452E-     	db "READFILE.PRG /// TRDOS 386 sysopen, sysread test program"
   272 000000F5 505247202F2F2F2054-
   273 000000FE 52444F532033383620-
   274 00000107 7379736F70656E2C20-
   275 00000110 737973726561642074-
   276 00000119 6573742070726F6772-
   277 00000122 616D               
   278 00000124 0D0A                    	db 0Dh, 0Ah
   279 00000126 6279204572646F6761-     	db "by Erdogan Tan, 13/10/2016", 0Dh, 0Ah, 0
   280 0000012F 6E2054616E2C203133-
   281 00000138 2F31302F323031360D-
   282 00000141 0A00               
   283                                  msg_open_error:
   284 00000143 0D0A                    	db 0Dh, 0Ah
   285 00000145 7379736F70656E2065-     	db 'sysopen error !'
   286 0000014E 72726F722021       
   287 00000154 0D0A00                  	db 0Dh, 0Ah, 0
   288                                  msg_not_found:
   289 00000157 0D0A                    	db 0Dh, 0Ah
   290 00000159 66696C65206E6F7420-     	db 'file not found !'
   291 00000162 666F756E642021     
   292 00000169 0D0A00                  	db 0Dh, 0Ah, 0
   293                                  msg_read_error:
   294 0000016C 0D0A                    	db 0Dh, 0Ah
   295 0000016E 72656164206572726F-     	db 'read error !'
   296 00000177 722021             
   297                                  nextline:
   298 0000017A 0D0A00                  	db 0Dh, 0Ah, 0
   299                                  msg_reading:
   300 0000017D 0D0A                    	db 0Dh, 0Ah
   301 0000017F 72656164696E672066-     	db 'reading file '
   302 00000188 696C6520           
   303                                  ;bss
   304                                  
   305                                  BUFFER:
   306 0000018C 0000                    	dw 0
