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) , , 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