1 ; **************************************************************************** 2 ; bin2db2.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'bin2db2.prg') 3 ; ---------------------------------------------------------------------------- 4 ; BIN2DB2.PRG ! 'sysseek', 'sysread', 'syswrite' TEST program for TRDOS 386 ! 5 ; 6 ; 06/11/2016 7 ; 8 ; [ Last Modification: 06/11/2016 ] 9 ; 10 ; **************************************************************************** 11 12 ; 16/10/2016 13 ; 29/04/2016 14 ; TRDOS 386 system calls (temporary list!) 15 _ver equ 0 16 _exit equ 1 17 _fork equ 2 18 _read equ 3 19 _write equ 4 20 _open equ 5 21 _close equ 6 22 _wait equ 7 23 _creat equ 8 24 _link equ 9 25 _unlink equ 10 26 _exec equ 11 27 _chdir equ 12 28 _time equ 13 29 _mkdir equ 14 30 _chmod equ 15 31 _chown equ 16 32 _break equ 17 33 _stat equ 18 34 _seek equ 19 35 _tell equ 20 36 _mount equ 21 37 _umount equ 22 38 _setuid equ 23 39 _getuid equ 24 40 _stime equ 25 41 _quit equ 26 42 _intr equ 27 43 _fstat equ 28 44 _emt equ 29 45 _mdate equ 30 46 _video equ 31 47 _audio equ 32 48 _timer equ 33 49 _sleep equ 34 50 _msg equ 35 51 _geterr equ 36 52 _rsvd1 equ 37 53 _pri equ 38 54 _rele equ 39 55 _fff equ 40 56 _fnf equ 41 57 58 %macro sys 1-4 59 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 60 ; 03/09/2015 61 ; 13/04/2015 62 ; Retro UNIX 386 v1 system call. 63 %if %0 >= 2 64 mov ebx, %2 65 %if %0 >= 3 66 mov ecx, %3 67 %if %0 = 4 68 mov edx, %4 69 %endif 70 %endif 71 %endif 72 mov eax, %1 73 ;int 30h 74 int 40h ; TRDOS 386 (TRDOS v2.0) 75 %endmacro 76 77 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 78 ; sys systemcall (eax) , , 79 80 [BITS 32] ; We need 32-bit intructions for protected mode 81 82 [ORG 0] 83 84 START_CODE: 85 00000000 89E6 mov esi, esp 86 00000002 AD lodsd 87 00000003 83F802 cmp eax, 2 ; two arguments (program file name & binary file name) 88 00000006 0F8293010000 jb prg_msg ; nothing to do 89 0000000C 741F je short a_1 90 0000000E 83F804 cmp eax, 4 91 00000011 0F8288010000 jb prg_msg ; wrong arguments (offset and byte count are needed) 92 93 00000017 FE05[25040000] inc byte [args] 94 0000001D 8B4608 mov eax, [esi+8] ; offset 95 00000020 A3[28040000] mov [arg_offset], eax 96 00000025 8B460C mov eax, [esi+12] ; byte count 97 00000028 A3[2C040000] mov [arg_bcount], eax 98 a_1: 99 0000002D AD lodsd ; program file name address 100 0000002E AD lodsd ; binary file name address (file to be read) 101 ; EAX = arg2 ; file name address 102 103 open_bin_file: 104 sys _open, eax, 0 ; open for reading 104 <1> 104 <1> 104 <1> 104 <1> 104 <1> %if %0 >= 2 104 0000002F 89C3 <1> mov ebx, %2 104 <1> %if %0 >= 3 104 00000031 B900000000 <1> mov ecx, %3 104 <1> %if %0 = 4 104 <1> mov edx, %4 104 <1> %endif 104 <1> %endif 104 <1> %endif 104 00000036 B805000000 <1> mov eax, %1 104 <1> 104 0000003B CD40 <1> int 40h 105 0000003D 0F828A010000 jc open_error 106 107 00000043 A3[30040000] mov [fhandle], eax ; file handle/index number 108 109 00000048 29C0 sub eax, eax 110 0000004A 48 dec eax 111 0000004B A3[3C040000] mov [fbcount], eax ; 0FFFFFFFFh ; byte count 112 113 00000050 803D[25040000]00 cmp byte [args], 0 114 00000057 7651 jna short a_2 115 116 00000059 BF[38040000] mov edi, foffset 117 0000005E 8B35[28040000] mov esi, [arg_offset] 118 119 00000064 E8C9010000 call check_and_set_numbers 120 00000069 0F8271010000 jc args_error 121 0000006F C605[25040000]01 mov byte [args], 1 ; reset 122 00000076 BF[3C040000] mov edi, fbcount 123 0000007B 8B35[2C040000] mov esi, [arg_bcount] 124 00000081 E8AC010000 call check_and_set_numbers 125 00000086 0F8254010000 jc args_error 126 127 sys _seek, [fhandle], [foffset], 0 127 <1> 127 <1> 127 <1> 127 <1> 127 <1> %if %0 >= 2 127 0000008C 8B1D[30040000] <1> mov ebx, %2 127 <1> %if %0 >= 3 127 00000092 8B0D[38040000] <1> mov ecx, %3 127 <1> %if %0 = 4 127 00000098 BA00000000 <1> mov edx, %4 127 <1> %endif 127 <1> %endif 127 <1> %endif 127 0000009D B813000000 <1> mov eax, %1 127 <1> 127 000000A2 CD40 <1> int 40h 128 000000A4 0F8208010000 jc seek_error ; disk read or memory allocation error 129 a_2: 130 000000AA C605[24040000]0E mov byte [color], 0Eh ; Yellow 131 000000B1 BE[F8030000] mov esi, msg_reading 132 000000B6 E865010000 call print_msg 133 134 read_file: 135 sys _read, [fhandle], BUFFER, [fbcount] 135 <1> 135 <1> 135 <1> 135 <1> 135 <1> %if %0 >= 2 135 000000BB 8B1D[30040000] <1> mov ebx, %2 135 <1> %if %0 >= 3 135 000000C1 B9[40040000] <1> mov ecx, %3 135 <1> %if %0 = 4 135 000000C6 8B15[3C040000] <1> mov edx, %4 135 <1> %endif 135 <1> %endif 135 <1> %endif 135 000000CC B803000000 <1> mov eax, %1 135 <1> 135 000000D1 CD40 <1> int 40h 136 000000D3 0F821B010000 jc rw_error ; disk read or memory allocation error 137 138 000000D9 A3[34040000] mov [fsize], eax ; file size (read bytes) 139 140 000000DE E831010000 call print_msg_ok 141 142 close_bin_file: 143 sys _close, [fhandle] ; close file 143 <1> 143 <1> 143 <1> 143 <1> 143 <1> %if %0 >= 2 143 000000E3 8B1D[30040000] <1> mov ebx, %2 143 <1> %if %0 >= 3 143 <1> mov ecx, %3 143 <1> %if %0 = 4 143 <1> mov edx, %4 143 <1> %endif 143 <1> %endif 143 <1> %endif 143 000000E9 B806000000 <1> mov eax, %1 143 <1> 143 000000EE CD40 <1> int 40h 144 145 convert_byte_to_db: 146 000000F0 BE[40040000] mov esi, BUFFER 147 000000F5 89F2 mov edx, esi 148 000000F7 0315[34040000] add edx, [fsize] 149 000000FD 89D7 mov edi, edx 150 151 000000FF 31C9 xor ecx, ecx 152 c_0: 153 00000101 B108 mov cl, 8 154 c_1: 155 00000103 66B86462 mov ax, 'db' 156 00000107 66AB stosw 157 00000109 B020 mov al, ' ' 158 0000010B AA stosb 159 c_2: 160 0000010C AC lodsb 161 0000010D E8B7010000 call hex 162 00000112 3C39 cmp al, '9' 163 00000114 7604 jna short c_3 164 165 00000116 C60730 mov byte [edi], '0' 166 00000119 47 inc edi 167 c_3: 168 0000011A 66AB stosw 169 0000011C B068 mov al, 'h' 170 0000011E AA stosb 171 172 0000011F FF0D[34040000] dec dword [fsize] 173 00000125 7414 jz short c_5 174 175 00000127 FEC9 dec cl 176 00000129 7408 jz short c_4 177 178 0000012B 66B82C20 mov ax, ', ' 179 0000012F 66AB stosw 180 00000131 EBD9 jmp short c_2 181 c_4: 182 00000133 66B80D0A mov ax, 0A0Dh 183 00000137 66AB stosw 184 00000139 EBC6 jmp short c_0 185 c_5: 186 0000013B 66B80D0A mov ax, 0A0Dh 187 0000013F 66AB stosw 188 189 create_txt_file: 190 sys _creat, txt_file, 0 ; create (normal) file 190 <1> 190 <1> 190 <1> 190 <1> 190 <1> %if %0 >= 2 190 00000141 BB[19040000] <1> mov ebx, %2 190 <1> %if %0 >= 3 190 00000146 B900000000 <1> mov ecx, %3 190 <1> %if %0 = 4 190 <1> mov edx, %4 190 <1> %endif 190 <1> %endif 190 <1> %endif 190 0000014B B808000000 <1> mov eax, %1 190 <1> 190 00000150 CD40 <1> int 40h 191 00000152 7272 jc short create_error 192 193 00000154 A3[30040000] mov [fhandle], eax 194 195 00000159 C605[24040000]0B mov byte [color], 0Bh ; Light Cyan 196 00000160 BE[06040000] mov esi, msg_writing 197 00000165 E8B6000000 call print_msg 198 199 0000016A 29D7 sub edi, edx ; file size 200 ; edx = start address of the text 201 202 sys _write, [fhandle], edx, edi ; write to 'BIN2DB.TXT' 202 <1> 202 <1> 202 <1> 202 <1> 202 <1> %if %0 >= 2 202 0000016C 8B1D[30040000] <1> mov ebx, %2 202 <1> %if %0 >= 3 202 00000172 89D1 <1> mov ecx, %3 202 <1> %if %0 = 4 202 00000174 89FA <1> mov edx, %4 202 <1> %endif 202 <1> %endif 202 <1> %endif 202 00000176 B804000000 <1> mov eax, %1 202 <1> 202 0000017B CD40 <1> int 40h 203 0000017D 7275 jc short rw_error ; disk write (or free space) error 204 205 0000017F E890000000 call print_msg_ok 206 207 sys _close, [fhandle] ; close file 207 <1> 207 <1> 207 <1> 207 <1> 207 <1> %if %0 >= 2 207 00000184 8B1D[30040000] <1> mov ebx, %2 207 <1> %if %0 >= 3 207 <1> mov ecx, %3 207 <1> %if %0 = 4 207 <1> mov edx, %4 207 <1> %endif 207 <1> %endif 207 <1> %endif 207 0000018A B806000000 <1> mov eax, %1 207 <1> 207 0000018F CD40 <1> int 40h 208 209 00000191 C605[24040000]07 mov byte [color], 07h ; Light Gray (Default Color) 210 00000198 BE[EA030000] mov esi, nextline 211 0000019D EB05 jmp short print_nl 212 213 prg_msg: 214 0000019F BE[F1020000] mov esi, msg_program 215 print_nl: 216 000001A4 E877000000 call print_msg 217 terminate: 218 sys _exit ; INT 40h 218 <1> 218 <1> 218 <1> 218 <1> 218 <1> %if %0 >= 2 218 <1> mov ebx, %2 218 <1> %if %0 >= 3 218 <1> mov ecx, %3 218 <1> %if %0 = 4 218 <1> mov edx, %4 218 <1> %endif 218 <1> %endif 218 <1> %endif 218 000001A9 B801000000 <1> mov eax, %1 218 <1> 218 000001AE CD40 <1> int 40h 219 here: 220 000001B0 EBFE jmp short here 221 222 seek_error: 223 sys _close, [fhandle] ; close file 223 <1> 223 <1> 223 <1> 223 <1> 223 <1> %if %0 >= 2 223 000001B2 8B1D[30040000] <1> mov ebx, %2 223 <1> %if %0 >= 3 223 <1> mov ecx, %3 223 <1> %if %0 = 4 223 <1> mov edx, %4 223 <1> %endif 223 <1> %endif 223 <1> %endif 223 000001B8 B806000000 <1> mov eax, %1 223 <1> 223 000001BD CD40 <1> int 40h 224 000001BF BE[C3030000] mov esi, msg_seek_error 225 000001C4 EB0C jmp short open_create_error 226 create_error: 227 000001C6 BE[D7030000] mov esi, msg_create_error 228 000001CB EB05 jmp short open_create_error 229 open_error: 230 000001CD BE[83030000] mov esi, msg_open_error 231 open_create_error: 232 000001D2 C605[24040000]0C mov byte [color], 0Ch ; Light Red 233 000001D9 E842000000 call print_msg ; INT 31h 234 000001DE EBC9 jmp short terminate 235 236 args_error: 237 sys _close, [fhandle] ; close file 237 <1> 237 <1> 237 <1> 237 <1> 237 <1> %if %0 >= 2 237 000001E0 8B1D[30040000] <1> mov ebx, %2 237 <1> %if %0 >= 3 237 <1> mov ecx, %3 237 <1> %if %0 = 4 237 <1> mov edx, %4 237 <1> %endif 237 <1> %endif 237 <1> %endif 237 000001E6 B806000000 <1> mov eax, %1 237 <1> 237 000001EB CD40 <1> int 40h 238 000001ED BE[97030000] mov esi, msg_args_error 239 000001F2 EBDE jmp short open_create_error 240 241 rw_error: 242 sys _close, [fhandle] ; close file 242 <1> 242 <1> 242 <1> 242 <1> 242 <1> %if %0 >= 2 242 000001F4 8B1D[30040000] <1> mov ebx, %2 242 <1> %if %0 >= 3 242 <1> mov ecx, %3 242 <1> %if %0 = 4 242 <1> mov edx, %4 242 <1> %endif 242 <1> %endif 242 <1> %endif 242 000001FA B806000000 <1> mov eax, %1 242 <1> 242 000001FF CD40 <1> int 40h 243 00000201 C605[24040000]0C mov byte [color], 0Ch ; Light Red 244 00000208 BE[ED030000] mov esi, msg_error 245 0000020D E80E000000 call print_msg ; INT 31h 246 00000212 EB95 jmp short terminate 247 248 print_msg_ok: 249 00000214 C605[24040000]0A mov byte [color], 0Ah ; Light Green 250 0000021B BE[14040000] mov esi, msg_ok 251 print_msg: 252 00000220 0FB61D[24040000] movzx ebx, byte [color] ; text color (bl) 253 ; video page 0 (bh) 254 00000227 B40E mov ah, 0Eh ; teletype output (write tty) 255 00000229 AC lodsb 256 _p_nextchar: 257 0000022A CD31 int 31h 258 0000022C AC lodsb 259 0000022D 20C0 and al, al 260 0000022F 75F9 jnz short _p_nextchar 261 00000231 C3 retn 262 263 check_and_set_numbers: 264 ; edi = number (destination) address 265 ; esi = argument address (offset or byte count) 266 ; ecx = 0 267 00000232 89F3 mov ebx, esi 268 00000234 31C0 xor eax, eax 269 00000236 8907 mov [edi], eax ; 0 ; reset 270 00000238 B102 mov cl, 2 271 b_0: 272 0000023A AC lodsb 273 0000023B 3C30 cmp al, '0' 274 0000023D 7238 jb short b_4 275 0000023F 3C39 cmp al, '9' 276 00000241 76F7 jna short b_0 277 00000243 840D[25040000] test [args], cl ; 2 278 00000249 7506 jnz short b_1 ; 2 or 3 279 0000024B 880D[25040000] mov [args], cl ; 2 280 b_1: 281 00000251 24DF and al, 0DFh 282 00000253 3C41 cmp al, 'A' 283 00000255 7216 jb short b_err 284 00000257 3C46 cmp al, 'F' 285 00000259 76DF jna short b_0 286 0000025B 3C48 cmp al, 'H' 287 0000025D 750D jne short b_2 288 0000025F 380D[25040000] cmp [args], cl ; 2 289 00000265 7705 ja short b_2 ; double 'H' !? 290 00000267 43 inc ebx 291 00000268 39F3 cmp ebx, esi ; 1 digit at least 292 0000026A 7202 jb short b_3 293 b_2: ; Error ! (Invalid numeric chars) 294 0000026C F9 stc ; 1st char is 'h' or 'H' 295 b_err: 296 0000026D C3 retn 297 b_3: 298 0000026E 4B dec ebx 299 ;mov byte [args], 3 ; 'H' 300 0000026F FE05[25040000] inc byte [args] 301 00000275 EBC3 jmp short b_0 302 b_4: 303 00000277 3C00 cmp al, 0 304 00000279 77F1 ja short b_2 305 306 0000027B 89DE mov esi, ebx 307 0000027D 380D[25040000] cmp [args], cl ; 2 308 00000283 74E7 je short b_2 ; last char isn't 'H' 309 00000285 771E ja short b_7 310 311 b_5: ; decimal number input 312 00000287 AC lodsb 313 00000288 20C0 and al, al 314 0000028A 7418 jz short b_6 315 316 0000028C 88C1 mov cl, al 317 318 0000028E B80A000000 mov eax, 10 319 00000293 8B17 mov edx, [edi] 320 00000295 F7E2 mul edx 321 00000297 09D2 or edx, edx 322 00000299 75D1 jnz short b_2 323 0000029B 8907 mov [edi], eax 324 325 0000029D 80E930 sub cl, '0' 326 000002A0 010F add [edi], ecx 327 000002A2 73E3 jnc short b_5 328 b_6: 329 000002A4 C3 retn 330 331 b_7: ; hexadecimal number input 332 000002A5 AC lodsb 333 000002A6 3C39 cmp al, '9' 334 000002A8 760A jna short b_8 335 000002AA 24DF and al, 0DFh 336 000002AC 3C48 cmp al, 'H' 337 000002AE 74F4 je short b_6 338 339 000002B0 2C37 sub al, 'A'-10 340 000002B2 EB02 jmp short b_9 341 b_8: 342 000002B4 2C30 sub al, '0' 343 b_9: 344 000002B6 8B1F mov ebx, [edi] 345 000002B8 21DB and ebx, ebx 346 000002BA 7405 jz short b_10 347 000002BC C1E304 shl ebx, 4 ; * 16 for next digit 348 000002BF 72E3 jc short b_6 349 b_10: 350 000002C1 01C3 add ebx, eax 351 000002C3 72DF jc short b_6 352 000002C5 891F mov [edi], ebx 353 000002C7 EBDC jmp short b_7 354 355 hex: 356 000002C9 0FB6D8 movzx ebx, al 357 000002CC C0EB04 shr bl, 4 358 000002CF 8A9B[E1020000] mov bl, [ebx+hexchrs] 359 000002D5 86D8 xchg bl, al 360 000002D7 80E30F and bl, 0Fh 361 000002DA 8AA3[E1020000] mov ah, [ebx+hexchrs] 362 000002E0 C3 retn 363 364 hexchrs: 365 000002E1 303132333435363738- db '0123456789ABCDEF' 365 000002EA 39414243444546 366 367 ;----------------------------------------------------------------- 368 ; messages 369 ;----------------------------------------------------------------- 370 371 msg_program: 372 000002F1 0D0A db 0Dh, 0Ah 373 000002F3 42494E324442322E50- db "BIN2DB2.PRG /// TRDOS 386 sysseek & syswrite test program" 373 000002FC 5247202F2F2F205452- 373 00000305 444F53203338362073- 373 0000030E 79737365656B202620- 373 00000317 737973777269746520- 373 00000320 746573742070726F67- 373 00000329 72616D 374 0000032C 0D0A db 0Dh, 0Ah 375 0000032E 6279204572646F6761- db "by Erdogan Tan, 06/11/2016", 0Dh, 0Ah 375 00000337 6E2054616E2C203036- 375 00000340 2F31312F323031360D- 375 00000349 0A 376 0000034A 0D0A db 0Dh, 0Ah 377 0000034C 55736167653A204249- db "Usage: BIN2DB2 <> <>" 377 00000355 4E32444232203C6669- 377 0000035E 6C65206E616D653E20- 377 00000367 3C3C6F66667365743E- 377 00000370 3E203C3C6279746520- 377 00000379 636F756E743E3E 378 00000380 0D0A00 db 0Dh, 0Ah, 0 379 380 msg_open_error: 381 00000383 0D0A db 0Dh, 0Ah 382 00000385 7379736F70656E2065- db 'sysopen error !' 382 0000038E 72726F722021 383 00000394 0D0A00 db 0Dh, 0Ah, 0 384 385 msg_args_error: 386 00000397 0D0A db 0Dh, 0Ah 387 00000399 617267756D656E7420- db 'argument (offset or byte count) error !' 387 000003A2 286F6666736574206F- 387 000003AB 72206279746520636F- 387 000003B4 756E7429206572726F- 387 000003BD 722021 388 000003C0 0D0A00 db 0Dh, 0Ah, 0 389 390 msg_seek_error: 391 000003C3 0D0A db 0Dh, 0Ah 392 000003C5 7379737365656B2065- db 'sysseek error !' 392 000003CE 72726F722021 393 000003D4 0D0A00 db 0Dh, 0Ah, 0 394 395 msg_create_error: 396 000003D7 0D0A db 0Dh, 0Ah 397 000003D9 737973637265617465- db 'syscreate error !' 397 000003E2 206572726F722021 398 nextline: 399 000003EA 0D0A00 db 0Dh, 0Ah, 0 400 401 msg_error: 402 000003ED 4552524F522021200D- db 'ERROR ! ', 0Dh, 0Ah, 0 402 000003F6 0A00 403 404 msg_reading: 405 000003F8 0D0A db 0Dh, 0Ah 406 000003FA 52656164696E672E2E- db 'Reading... ', 0 406 00000403 2E2000 407 408 msg_writing: 409 00000406 0D0A db 0Dh, 0Ah 410 00000408 57726974696E672E2E- db 'Writing... ', 0 410 00000411 2E2000 411 412 msg_ok: 413 00000414 4F4B2E2000 db 'OK. ', 0 414 415 txt_file: 416 00000419 42494E3244422E5458- db 'BIN2DB.TXT', 0 416 00000422 5400 417 418 00000424 0F color: db 0Fh ; White 419 420 00000425 00 args: db 0 ; offset & byte count 421 422 bss: 423 424 ABSOLUTE bss 425 426 00000426 alignb 4 427 428 00000428 arg_offset: resd 1 429 0000042C arg_bcount: resd 1 430 431 00000430 fhandle: resd 1 432 00000434 fsize: resd 1 433 434 00000438 foffset: resd 1 435 0000043C fbcount: resd 1 436 437 BUFFER: