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: 31/10/2016 ] 10 ; 11 ; **************************************************************************** 12 13 ; 16/10/2016 14 ; 29/04/2016 15 ; TRDOS 386 system calls (temporary list!) 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 _creat equ 8 25 _link equ 9 26 _unlink equ 10 27 _exec equ 11 28 _chdir equ 12 29 _time equ 13 30 _mkdir equ 14 31 _chmod equ 15 32 _chown equ 16 33 _break equ 17 34 _stat equ 18 35 _seek equ 19 36 _tell equ 20 37 _mount equ 21 38 _umount equ 22 39 _setuid equ 23 40 _getuid equ 24 41 _stime equ 25 42 _quit equ 26 43 _intr equ 27 44 _fstat equ 28 45 _emt equ 29 46 _mdate 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 _rsvd1 equ 37 54 _pri equ 38 55 _rele equ 39 56 _fff equ 40 57 _fnf equ 41 58 59 %macro sys 1-4 60 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 61 ; 03/09/2015 62 ; 13/04/2015 63 ; Retro UNIX 386 v1 system call. 64 %if %0 >= 2 65 mov ebx, %2 66 %if %0 >= 3 67 mov ecx, %3 68 %if %0 = 4 69 mov edx, %4 70 %endif 71 %endif 72 %endif 73 mov eax, %1 74 ;int 30h 75 int 40h ; TRDOS 386 (TRDOS v2.0) 76 %endmacro 77 78 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 79 ; sys systemcall (eax) , , 80 81 [BITS 32] ; 80386 protected mode (32 bit instructions) 82 83 [ORG 0] ; virtual start address = 0 84 85 START_CODE: 86 00000000 89E6 mov esi, esp 87 00000002 AD lodsd 88 00000003 83F803 cmp eax, 3 ; two arguments (program file name & binary file name) 89 00000006 0F82F3000000 jb prg_msg ; nothing to do 90 91 0000000C AD lodsd ; program file name address 92 0000000D AD lodsd ; binary file name address (source file to be read) 93 ; EAX = arg2 ; source file name address 94 95 open_bin_file: 96 sys _open, eax, 0 ; open for reading 96 <1> 96 <1> 96 <1> 96 <1> 96 <1> %if %0 >= 2 96 0000000E 89C3 <1> mov ebx, %2 96 <1> %if %0 >= 3 96 00000010 B900000000 <1> mov ecx, %3 96 <1> %if %0 = 4 96 <1> mov edx, %4 96 <1> %endif 96 <1> %endif 96 <1> %endif 96 00000015 B805000000 <1> mov eax, %1 96 <1> 96 0000001A CD40 <1> int 40h 97 0000001C 0F82F7000000 jc open_error 98 99 00000022 A3[80020000] mov [fhandle1], eax ; file handle/index number 100 101 00000027 AD lodsd 102 ; EAX = arg3 ; destination file name address 103 104 00000028 A3[88020000] mov [dfname_addr], eax 105 106 sys _open, eax, 1 ; open for writing 106 <1> 106 <1> 106 <1> 106 <1> 106 <1> %if %0 >= 2 106 0000002D 89C3 <1> mov ebx, %2 106 <1> %if %0 >= 3 106 0000002F B901000000 <1> mov ecx, %3 106 <1> %if %0 = 4 106 <1> mov edx, %4 106 <1> %endif 106 <1> %endif 106 <1> %endif 106 00000034 B805000000 <1> mov eax, %1 106 <1> 106 00000039 CD40 <1> int 40h 107 0000003B 7310 jnc short _1 108 109 0000003D 83F802 cmp eax, 2 ; file not found ? 110 00000040 0F85D3000000 jne open_error 111 112 00000046 30C0 xor al, al ; eax = 0 113 00000048 A3[84020000] mov [fhandle2], eax ; file handle/index number 114 _1: 115 0000004D C605[7C020000]0E mov byte [color], 0Eh ; Yellow 116 00000054 BE[5B020000] mov esi, msg_reading 117 00000059 E809010000 call print_msg 118 119 read_file: 120 sys _read, [fhandle1], BUFFER, 0FFFFFFFFh ; read all bytes 120 <1> 120 <1> 120 <1> 120 <1> 120 <1> %if %0 >= 2 120 0000005E 8B1D[80020000] <1> mov ebx, %2 120 <1> %if %0 >= 3 120 00000064 B9[90020000] <1> mov ecx, %3 120 <1> %if %0 = 4 120 00000069 BAFFFFFFFF <1> mov edx, %4 120 <1> %endif 120 <1> %endif 120 <1> %endif 120 0000006E B803000000 <1> mov eax, %1 120 <1> 120 00000073 CD40 <1> int 40h 121 00000075 0F82B1000000 jc r_error ; disk read or memory allocation error 122 123 0000007B A3[8C020000] mov [fsize], eax ; file size (read bytes) 124 125 00000080 E8D6000000 call print_msg_ok 126 127 close_bin_file: 128 sys _close, [fhandle1] ; close file 128 <1> 128 <1> 128 <1> 128 <1> 128 <1> %if %0 >= 2 128 00000085 8B1D[80020000] <1> mov ebx, %2 128 <1> %if %0 >= 3 128 <1> mov ecx, %3 128 <1> %if %0 = 4 128 <1> mov edx, %4 128 <1> %endif 128 <1> %endif 128 <1> %endif 128 0000008B B806000000 <1> mov eax, %1 128 <1> 128 00000090 CD40 <1> int 40h 129 130 00000092 833D[84020000]00 cmp dword [fhandle2], 0 131 00000099 7719 ja short _2 132 133 create_txt_file: 134 sys _creat, [dfname_addr], 0 ; create (normal) file 134 <1> 134 <1> 134 <1> 134 <1> 134 <1> %if %0 >= 2 134 0000009B 8B1D[88020000] <1> mov ebx, %2 134 <1> %if %0 >= 3 134 000000A1 B900000000 <1> mov ecx, %3 134 <1> %if %0 = 4 134 <1> mov edx, %4 134 <1> %endif 134 <1> %endif 134 <1> %endif 134 000000A6 B808000000 <1> mov eax, %1 134 <1> 134 000000AB CD40 <1> int 40h 135 000000AD 7263 jc short create_error 136 137 000000AF A3[84020000] mov [fhandle2], eax 138 _2: 139 000000B4 C605[7C020000]0B mov byte [color], 0Bh ; Light Cyan 140 000000BB BE[69020000] mov esi, msg_writing 141 000000C0 E8A2000000 call print_msg 142 143 sys _write, [fhandle2], BUFFER, [fsize] ; write to destination 143 <1> 143 <1> 143 <1> 143 <1> 143 <1> %if %0 >= 2 143 000000C5 8B1D[84020000] <1> mov ebx, %2 143 <1> %if %0 >= 3 143 000000CB B9[90020000] <1> mov ecx, %3 143 <1> %if %0 = 4 143 000000D0 8B15[8C020000] <1> mov edx, %4 143 <1> %endif 143 <1> %endif 143 <1> %endif 143 000000D6 B804000000 <1> mov eax, %1 143 <1> 143 000000DB CD40 <1> int 40h 144 000000DD 725C jc short w_error ; disk write (or free space) error 145 146 000000DF E877000000 call print_msg_ok 147 148 sys _close, [fhandle2] ; close file 148 <1> 148 <1> 148 <1> 148 <1> 148 <1> %if %0 >= 2 148 000000E4 8B1D[84020000] <1> mov ebx, %2 148 <1> %if %0 >= 3 148 <1> mov ecx, %3 148 <1> %if %0 = 4 148 <1> mov edx, %4 148 <1> %endif 148 <1> %endif 148 <1> %endif 148 000000EA B806000000 <1> mov eax, %1 148 <1> 148 000000EF CD40 <1> int 40h 149 150 000000F1 C605[7C020000]07 mov byte [color], 07h ; Light Gray (Default Color) 151 000000F8 BE[4D020000] mov esi, nextline 152 000000FD EB05 jmp short print_nl 153 154 prg_msg: 155 000000FF BE[A1010000] mov esi, msg_program 156 print_nl: 157 00000104 E85E000000 call print_msg 158 terminate: 159 sys _exit ; INT 40h 159 <1> 159 <1> 159 <1> 159 <1> 159 <1> %if %0 >= 2 159 <1> mov ebx, %2 159 <1> %if %0 >= 3 159 <1> mov ecx, %3 159 <1> %if %0 = 4 159 <1> mov edx, %4 159 <1> %endif 159 <1> %endif 159 <1> %endif 159 00000109 B801000000 <1> mov eax, %1 159 <1> 159 0000010E CD40 <1> int 40h 160 here: 161 00000110 EBFE jmp short here 162 163 create_error: 164 00000112 BE[3A020000] mov esi, msg_create_error 165 00000117 EB05 jmp short open_create_error 166 open_error: 167 00000119 BE[26020000] mov esi, msg_open_error 168 open_create_error: 169 0000011E C605[7C020000]0C mov byte [color], 0Ch ; Light Red 170 00000125 E83D000000 call print_msg ; INT 31h 171 0000012A EBDD jmp short terminate 172 173 r_error: 174 sys _close, [fhandle1] ; close file 174 <1> 174 <1> 174 <1> 174 <1> 174 <1> %if %0 >= 2 174 0000012C 8B1D[80020000] <1> mov ebx, %2 174 <1> %if %0 >= 3 174 <1> mov ecx, %3 174 <1> %if %0 = 4 174 <1> mov edx, %4 174 <1> %endif 174 <1> %endif 174 <1> %endif 174 00000132 B806000000 <1> mov eax, %1 174 <1> 174 00000137 CD40 <1> int 40h 175 00000139 EB0D jmp short rw_error 176 w_error: 177 sys _close, [fhandle2] ; close file 177 <1> 177 <1> 177 <1> 177 <1> 177 <1> %if %0 >= 2 177 0000013B 8B1D[84020000] <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 00000141 B806000000 <1> mov eax, %1 177 <1> 177 00000146 CD40 <1> int 40h 178 rw_error: 179 00000148 C605[7C020000]0C mov byte [color], 0Ch ; Light Red 180 0000014F BE[50020000] mov esi, msg_error 181 00000154 E80E000000 call print_msg ; INT 31h 182 00000159 EBAE jmp short terminate 183 184 print_msg_ok: 185 0000015B C605[7C020000]0A mov byte [color], 0Ah ; Light Green 186 00000162 BE[77020000] mov esi, msg_ok 187 print_msg: 188 00000167 0FB61D[7C020000] movzx ebx, byte [color] ; text color (bl) 189 ; video page 0 (bh) 190 0000016E B40E mov ah, 0Eh ; teletype output (write tty) 191 00000170 AC lodsb 192 _p_nextchar: 193 00000171 CD31 int 31h 194 00000173 AC lodsb 195 00000174 20C0 and al, al 196 00000176 75F9 jnz short _p_nextchar 197 00000178 C3 retn 198 199 hex: 200 00000179 0FB6D8 movzx ebx, al 201 0000017C C0EB04 shr bl, 4 202 0000017F 8A9B[91010000] mov bl, [ebx+hexchrs] 203 00000185 86D8 xchg bl, al 204 00000187 80E30F and bl, 0Fh 205 0000018A 8AA3[91010000] mov ah, [ebx+hexchrs] 206 00000190 C3 retn 207 208 hexchrs: 209 00000191 303132333435363738- db '0123456789ABCDEF' 209 0000019A 39414243444546 210 211 ;----------------------------------------------------------------- 212 ; messages 213 ;----------------------------------------------------------------- 214 215 msg_program: 216 000001A1 0D0A db 0Dh, 0Ah 217 000001A3 46494C45434F50592E- db "FILECOPY.PRG /// TRDOS 386 syswrite test program" 217 000001AC 505247202F2F2F2054- 217 000001B5 52444F532033383620- 217 000001BE 737973777269746520- 217 000001C7 746573742070726F67- 217 000001D0 72616D 218 000001D3 0D0A db 0Dh, 0Ah 219 000001D5 6279204572646F6761- db "by Erdogan Tan, 31/10/2016", 0Dh, 0Ah 219 000001DE 6E2054616E2C203331- 219 000001E7 2F31302F323031360D- 219 000001F0 0A 220 000001F1 0D0A db 0Dh, 0Ah 221 000001F3 55736167653A204649- db 'Usage: FILECOPY ' 221 000001FC 4C45434F5059203C53- 221 00000205 6F757263652046696C- 221 0000020E 653E203C4465737469- 221 00000217 6E6174696F6E204669- 221 00000220 6C653E 222 00000223 0D0A00 db 0Dh, 0Ah, 0 223 224 msg_open_error: 225 00000226 0D0A db 0Dh, 0Ah 226 00000228 7379736F70656E2065- db 'sysopen error !' 226 00000231 72726F722021 227 00000237 0D0A00 db 0Dh, 0Ah, 0 228 229 msg_create_error: 230 0000023A 0D0A db 0Dh, 0Ah 231 0000023C 737973637265617465- db 'syscreate error !' 231 00000245 206572726F722021 232 nextline: 233 0000024D 0D0A00 db 0Dh, 0Ah, 0 234 235 msg_error: 236 00000250 4552524F522021200D- db 'ERROR ! ', 0Dh, 0Ah, 0 236 00000259 0A00 237 238 msg_reading: 239 0000025B 0D0A db 0Dh, 0Ah 240 0000025D 52656164696E672E2E- db 'Reading... ', 0 240 00000266 2E2000 241 242 msg_writing: 243 00000269 0D0A db 0Dh, 0Ah 244 0000026B 57726974696E672E2E- db 'Writing... ', 0 244 00000274 2E2000 245 246 msg_ok: 247 00000277 4F4B2E2000 db 'OK. ', 0 248 249 0000027C 0F color: db 0Fh ; White 250 251 bss: 252 253 ABSOLUTE bss 254 255 0000027D alignb 4 256 257 00000280 fhandle1: resd 1 258 00000284 fhandle2: resd 1 259 00000288 dfname_addr: resd 1 260 0000028C fsize: resd 1 261 262 BUFFER: