1 ; **************************************************************************** 2 ; filecopy.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'filecopy.prg') 3 ; ---------------------------------------------------------------------------- 4 ; FILECOPY.PRG ! 'sysopen', 'sysread', 'syscreate', 'syswrite' 5 ; TEST program for TRDOS 386 ! 6 ; 7 ; 31/10/2016 8 ; 9 ; [ Last Modification: 13/01/2026 ] 10 ; 11 ; **************************************************************************** 12 13 ; 14/07/2020 14 ; 31/12/2017 15 ; TRDOS 386 (v2.0) system calls 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 _create equ 8 25 _rename equ 9 26 _delete equ 10 27 _exec equ 11 28 _chdir equ 12 29 _time equ 13 30 _mkdir equ 14 31 _chmod equ 15 32 _rmdir equ 16 33 _break equ 17 34 _drive equ 18 35 _seek equ 19 36 _tell equ 20 37 _memory equ 21 38 _prompt equ 22 39 _path equ 23 40 _env equ 24 41 _stime equ 25 42 _quit equ 26 43 _intr equ 27 44 _dir equ 28 45 _emt equ 29 46 _ldrvt 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 _fpstat equ 37 54 _pri equ 38 55 _rele equ 39 56 _fff equ 40 57 _fnf equ 41 58 _alloc equ 42 59 _dalloc equ 43 60 _calbac equ 44 61 _dma equ 45 62 63 %macro sys 1-4 64 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 65 ; 03/09/2015 66 ; 13/04/2015 67 ; Retro UNIX 386 v1 system call. 68 %if %0 >= 2 69 mov ebx, %2 70 %if %0 >= 3 71 mov ecx, %3 72 %if %0 = 4 73 mov edx, %4 74 %endif 75 %endif 76 %endif 77 mov eax, %1 78 ;int 30h 79 int 40h ; TRDOS 386 (TRDOS v2.0) 80 %endmacro 81 82 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 83 ; sys systemcall (eax) , , 84 85 [BITS 32] ; 80386 protected mode (32 bit instructions) 86 87 [ORG 0] ; virtual start address = 0 88 89 START_CODE: 90 00000000 89E6 mov esi, esp 91 00000002 AD lodsd 92 00000003 83F803 cmp eax, 3 ; two arguments (program file name & binary file name) 93 00000006 0F823C010000 jb prg_msg ; nothing to do 94 95 0000000C AD lodsd ; program file name address 96 0000000D AD lodsd ; binary file name address (source file to be read) 97 ; EAX = arg2 ; source file name address 98 99 open_bin_file: 100 sys _open, eax, 0 ; open for reading 64 <1> 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 0000000E 89C3 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 00000010 B900000000 <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000015 B805000000 <1> mov eax, %1 78 <1> 79 0000001A CD40 <1> int 40h 101 0000001C 0F8240010000 jc open_error 102 103 00000022 A3[F8020000] mov [fhandle1], eax ; file handle/index number 104 105 00000027 AD lodsd 106 ; EAX = arg3 ; destination file name address 107 108 00000028 A3[00030000] mov [dfname_addr], eax 109 110 sys _open, eax, 1 ; open for writing 64 <1> 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 0000002D 89C3 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 0000002F B901000000 <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000034 B805000000 <1> mov eax, %1 78 <1> 79 00000039 CD40 <1> int 40h 111 ; 13/01/2026 112 0000003B 7259 jc short _1 113 114 ; 13/01/2026 115 ; eax = file number 116 sys _close, eax ; close file 64 <1> 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 0000003D 89C3 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 0000003F B806000000 <1> mov eax, %1 78 <1> 79 00000044 CD40 <1> int 40h 117 118 ;;;; 119 00000046 BE[C6020000] mov esi, Msg_DoYouWantOverWriteFile 120 0000004B E860010000 call print_msg 121 122 00000050 8B35[00030000] mov esi, [dfname_addr] ; file (path) name 123 00000056 E855010000 call print_msg 124 125 0000005B BE[E5020000] mov esi, Msg_YesNo 126 00000060 E84B010000 call print_msg 127 128 ask_for_owr_again: 129 ; Y/N ? 130 ; read a character 131 00000065 B400 mov ah, 0 132 00000067 CD32 int 32h 133 134 00000069 3C1B cmp al, 1Bh ; ESCape ? 135 0000006B 7416 je short response_no ; yes 136 137 0000006D 24DF and al, 0DFh 138 0000006F 3C59 cmp al, 'Y' 139 00000071 750C jne short check_for_no 140 141 00000073 BE[EF020000] mov esi, msg_yes 142 00000078 E833010000 call print_msg 143 144 0000007D EB20 jmp short read_file 145 146 check_for_no: 147 0000007F 3C4E cmp al, 'N' 148 00000081 75E2 jne short ask_for_owr_again 149 response_no: 150 00000083 66C705[F0020000]4E- mov word [msg_no], 'No' 150 0000008B 6F 151 0000008C BE[F0020000] mov esi, msg_no 152 ;call print_msg 153 ;jmp terminate 154 00000091 E9B7000000 jmp print_nl 155 ;;;; 156 157 _1: 158 00000096 83F802 cmp eax, 2 ; file not found ? 159 00000099 0F85C3000000 jne open_error 160 161 read_file: 162 0000009F C605[C5020000]0E mov byte [color], 0Eh ; Yellow 163 164 000000A6 BE[A4020000] mov esi, msg_reading 165 000000AB E800010000 call print_msg 166 167 sys _read, [fhandle1], BUFFER, 0FFFFFFFFh ; read all bytes 64 <1> 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 000000B0 8B1D[F8020000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 000000B6 B9[08030000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 000000BB BAFFFFFFFF <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 000000C0 B803000000 <1> mov eax, %1 78 <1> 79 000000C5 CD40 <1> int 40h 168 000000C7 0F82A8000000 jc r_error ; disk read or memory allocation error 169 170 000000CD A3[04030000] mov [fsize], eax ; file size (read bytes) 171 172 000000D2 E8CD000000 call print_msg_ok 173 174 close_bin_file: 175 sys _close, [fhandle1] ; close file 64 <1> 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 000000D7 8B1D[F8020000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 000000DD B806000000 <1> mov eax, %1 78 <1> 79 000000E2 CD40 <1> int 40h 176 177 create_or_owr_file: 178 sys _create, [dfname_addr], 0 ; create (normal) file 64 <1> 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 000000E4 8B1D[00030000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 000000EA B900000000 <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 000000EF B808000000 <1> mov eax, %1 78 <1> 79 000000F4 CD40 <1> int 40h 179 000000F6 7263 jc short create_error 180 181 000000F8 A3[FC020000] mov [fhandle2], eax 182 _2: 183 000000FD C605[C5020000]0B mov byte [color], 0Bh ; Light Cyan 184 00000104 BE[B2020000] mov esi, msg_writing 185 00000109 E8A2000000 call print_msg 186 187 sys _write, [fhandle2], BUFFER, [fsize] ; write to destination 64 <1> 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 0000010E 8B1D[FC020000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 00000114 B9[08030000] <1> mov ecx, %3 72 <1> %if %0 = 4 73 00000119 8B15[04030000] <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 0000011F B804000000 <1> mov eax, %1 78 <1> 79 00000124 CD40 <1> int 40h 188 00000126 725C jc short w_error ; disk write (or free space) error 189 190 00000128 E877000000 call print_msg_ok 191 192 sys _close, [fhandle2] ; close file 64 <1> 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 0000012D 8B1D[FC020000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000133 B806000000 <1> mov eax, %1 78 <1> 79 00000138 CD40 <1> int 40h 193 194 0000013A C605[C5020000]07 mov byte [color], 07h ; Light Gray (Default Color) 195 00000141 BE[96020000] mov esi, nextline 196 00000146 EB05 jmp short print_nl 197 198 prg_msg: 199 00000148 BE[EA010000] mov esi, msg_program 200 print_nl: 201 0000014D E85E000000 call print_msg 202 terminate: 203 sys _exit ; INT 40h 64 <1> 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 <1> mov ebx, %2 70 <1> %if %0 >= 3 71 <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 00000152 B801000000 <1> mov eax, %1 78 <1> 79 00000157 CD40 <1> int 40h 204 here: 205 00000159 EBFE jmp short here 206 207 create_error: 208 0000015B BE[83020000] mov esi, msg_create_error 209 00000160 EB05 jmp short open_create_error 210 open_error: 211 00000162 BE[6F020000] mov esi, msg_open_error 212 open_create_error: 213 00000167 C605[C5020000]0C mov byte [color], 0Ch ; Light Red 214 0000016E E83D000000 call print_msg ; INT 31h 215 00000173 EBDD jmp short terminate 216 217 r_error: 218 sys _close, [fhandle1] ; close file 64 <1> 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 00000175 8B1D[F8020000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 0000017B B806000000 <1> mov eax, %1 78 <1> 79 00000180 CD40 <1> int 40h 219 00000182 EB0D jmp short rw_error 220 w_error: 221 sys _close, [fhandle2] ; close file 64 <1> 65 <1> 66 <1> 67 <1> 68 <1> %if %0 >= 2 69 00000184 8B1D[FC020000] <1> mov ebx, %2 70 <1> %if %0 >= 3 71 <1> mov ecx, %3 72 <1> %if %0 = 4 73 <1> mov edx, %4 74 <1> %endif 75 <1> %endif 76 <1> %endif 77 0000018A B806000000 <1> mov eax, %1 78 <1> 79 0000018F CD40 <1> int 40h 222 rw_error: 223 00000191 C605[C5020000]0C mov byte [color], 0Ch ; Light Red 224 00000198 BE[99020000] mov esi, msg_error 225 0000019D E80E000000 call print_msg ; INT 31h 226 000001A2 EBAE jmp short terminate 227 228 print_msg_ok: 229 000001A4 C605[C5020000]0A mov byte [color], 0Ah ; Light Green 230 000001AB BE[C0020000] mov esi, msg_ok 231 print_msg: 232 000001B0 0FB61D[C5020000] movzx ebx, byte [color] ; text color (bl) 233 ; video page 0 (bh) 234 000001B7 B40E mov ah, 0Eh ; teletype output (write tty) 235 000001B9 AC lodsb 236 _p_nextchar: 237 000001BA CD31 int 31h 238 000001BC AC lodsb 239 000001BD 20C0 and al, al 240 000001BF 75F9 jnz short _p_nextchar 241 000001C1 C3 retn 242 243 hex: 244 000001C2 0FB6D8 movzx ebx, al 245 000001C5 C0EB04 shr bl, 4 246 000001C8 8A9B[DA010000] mov bl, [ebx+hexchrs] 247 000001CE 86C3 xchg bl, al 248 000001D0 80E30F and bl, 0Fh 249 000001D3 8AA3[DA010000] mov ah, [ebx+hexchrs] 250 000001D9 C3 retn 251 252 hexchrs: 253 000001DA 303132333435363738- db '0123456789ABCDEF' 253 000001E3 39414243444546 254 255 ;----------------------------------------------------------------- 256 ; messages 257 ;----------------------------------------------------------------- 258 259 msg_program: 260 000001EA 0D0A db 0Dh, 0Ah 261 000001EC 46494C45434F50592E- db "FILECOPY.PRG /// TRDOS 386 syswrite test program" 261 000001F5 505247202F2F2F2054- 261 000001FE 52444F532033383620- 261 00000207 737973777269746520- 261 00000210 746573742070726F67- 261 00000219 72616D 262 0000021C 0D0A db 0Dh, 0Ah 263 0000021E 6279204572646F6761- db "by Erdogan Tan, 13/01/2026", 0Dh, 0Ah 263 00000227 6E2054616E2C203133- 263 00000230 2F30312F323032360D- 263 00000239 0A 264 0000023A 0D0A db 0Dh, 0Ah 265 0000023C 55736167653A204649- db 'Usage: FILECOPY ' 265 00000245 4C45434F5059203C53- 265 0000024E 6F757263652046696C- 265 00000257 653E203C4465737469- 265 00000260 6E6174696F6E204669- 265 00000269 6C653E 266 0000026C 0D0A00 db 0Dh, 0Ah, 0 267 268 msg_open_error: 269 0000026F 0D0A db 0Dh, 0Ah 270 00000271 7379736F70656E2065- db 'sysopen error !' 270 0000027A 72726F722021 271 00000280 0D0A00 db 0Dh, 0Ah, 0 272 273 msg_create_error: 274 00000283 0D0A db 0Dh, 0Ah 275 00000285 737973637265617465- db 'syscreate error !' 275 0000028E 206572726F722021 276 nextline: 277 00000296 0D0A00 db 0Dh, 0Ah, 0 278 279 msg_error: 280 00000299 4552524F522021200D- db 'ERROR ! ', 0Dh, 0Ah, 0 280 000002A2 0A00 281 282 msg_reading: 283 000002A4 0D0A db 0Dh, 0Ah 284 000002A6 52656164696E672E2E- db 'Reading... ', 0 284 000002AF 2E2000 285 286 msg_writing: 287 000002B2 0D0A db 0Dh, 0Ah 288 000002B4 57726974696E672E2E- db 'Writing... ', 0 288 000002BD 2E2000 289 290 msg_ok: 291 000002C0 4F4B2E2000 db 'OK. ', 0 292 293 000002C5 0F color: db 0Fh ; White 294 295 ; 13/01/2026 296 Msg_DoYouWantOverWriteFile: 297 000002C6 446F20796F75207761- db 'Do you want to overwrite file ',0 297 000002CF 6E7420746F206F7665- 297 000002D8 727772697465206669- 297 000002E1 6C652000 298 Msg_YesNo: 299 000002E5 2028592F4E29203F20- db ' (Y/N) ? ', 0 299 000002EE 00 300 msg_yes: 301 000002EF 59 db 'Y' 302 msg_no: 303 000002F0 657320 db 'es ' 304 000002F3 0D0A00 db 0Dh, 0Ah, 0 305 306 bss: 307 308 ABSOLUTE bss 309 310 000002F6 ???? alignb 4 311 312 000002F8 ???????? fhandle1: resd 1 313 000002FC ???????? fhandle2: resd 1 314 00000300 ???????? dfname_addr: resd 1 315 00000304 ???????? fsize: resd 1 316 317 BUFFER: