1 ; **************************************************************************** 2 ; bin2db.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'bin2db.prg') 3 ; ---------------------------------------------------------------------------- 4 ; BIN2DB.PRG ! 'sysopen', 'sysread', 'syswrite' TEST program for TRDOS 386 ! 5 ; 6 ; 25/10/2016 7 ; 8 ; [ Last Modification: 05/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 0F820F010000 jb prg_msg ; nothing to do 89 90 0000000C AD lodsd ; program file name address 91 0000000D AD lodsd ; binary file name address (file to be read) 92 ; EAX = arg2 ; file name address 93 94 open_bin_file: 95 sys _open, eax, 0 ; open for reading 95 <1> 95 <1> 95 <1> 95 <1> 95 <1> %if %0 >= 2 95 0000000E 89C3 <1> mov ebx, %2 95 <1> %if %0 >= 3 95 00000010 B900000000 <1> mov ecx, %3 95 <1> %if %0 = 4 95 <1> mov edx, %4 95 <1> %endif 95 <1> %endif 95 <1> %endif 95 00000015 B805000000 <1> mov eax, %1 95 <1> 95 0000001A CD40 <1> int 40h 96 0000001C 0F8213010000 jc open_error 97 98 00000022 A3[60020000] mov [fhandle], eax ; file handle/index number 99 100 00000027 C605[5E020000]0E mov byte [color], 0Eh ; Yellow 101 0000002E BE[32020000] mov esi, msg_reading 102 00000033 E83C010000 call print_msg 103 104 read_file: 105 sys _read, [fhandle], BUFFER, 0FFFFFFFFh ; read all bytes 105 <1> 105 <1> 105 <1> 105 <1> 105 <1> %if %0 >= 2 105 00000038 8B1D[60020000] <1> mov ebx, %2 105 <1> %if %0 >= 3 105 0000003E B9[68020000] <1> mov ecx, %3 105 <1> %if %0 = 4 105 00000043 BAFFFFFFFF <1> mov edx, %4 105 <1> %endif 105 <1> %endif 105 <1> %endif 105 00000048 B803000000 <1> mov eax, %1 105 <1> 105 0000004D CD40 <1> int 40h 106 0000004F 0F82F3000000 jc rw_error ; disk read or memory allocation error 107 108 00000055 A3[64020000] mov [fsize], eax ; file size (read bytes) 109 110 0000005A E809010000 call print_msg_ok 111 112 close_bin_file: 113 sys _close, [fhandle] ; close file 113 <1> 113 <1> 113 <1> 113 <1> 113 <1> %if %0 >= 2 113 0000005F 8B1D[60020000] <1> mov ebx, %2 113 <1> %if %0 >= 3 113 <1> mov ecx, %3 113 <1> %if %0 = 4 113 <1> mov edx, %4 113 <1> %endif 113 <1> %endif 113 <1> %endif 113 00000065 B806000000 <1> mov eax, %1 113 <1> 113 0000006A CD40 <1> int 40h 114 115 convert_byte_to_db: 116 0000006C BE[68020000] mov esi, BUFFER 117 00000071 89F2 mov edx, esi 118 00000073 0315[64020000] add edx, [fsize] 119 00000079 89D7 mov edi, edx 120 121 0000007B 31C9 xor ecx, ecx 122 c_0: 123 0000007D B108 mov cl, 8 124 c_1: 125 0000007F 66B86462 mov ax, 'db' 126 00000083 66AB stosw 127 00000085 B020 mov al, ' ' 128 00000087 AA stosb 129 c_2: 130 00000088 AC lodsb 131 00000089 E8F8000000 call hex 132 0000008E 3C39 cmp al, '9' 133 00000090 7604 jna short c_3 134 135 00000092 C60730 mov byte [edi], '0' 136 00000095 47 inc edi 137 c_3: 138 00000096 66AB stosw 139 00000098 B068 mov al, 'h' 140 0000009A AA stosb 141 142 0000009B FF0D[64020000] dec dword [fsize] 143 000000A1 7414 jz short c_5 144 145 000000A3 FEC9 dec cl 146 000000A5 7408 jz short c_4 147 148 000000A7 66B82C20 mov ax, ', ' 149 000000AB 66AB stosw 150 000000AD EBD9 jmp short c_2 151 c_4: 152 000000AF 66B80D0A mov ax, 0A0Dh 153 000000B3 66AB stosw 154 000000B5 EBC6 jmp short c_0 155 c_5: 156 000000B7 66B80D0A mov ax, 0A0Dh 157 000000BB 66AB stosw 158 159 create_txt_file: 160 sys _creat, txt_file, 0 ; create (normal) file 160 <1> 160 <1> 160 <1> 160 <1> 160 <1> %if %0 >= 2 160 000000BD BB[53020000] <1> mov ebx, %2 160 <1> %if %0 >= 3 160 000000C2 B900000000 <1> mov ecx, %3 160 <1> %if %0 = 4 160 <1> mov edx, %4 160 <1> %endif 160 <1> %endif 160 <1> %endif 160 000000C7 B808000000 <1> mov eax, %1 160 <1> 160 000000CC CD40 <1> int 40h 161 000000CE 725E jc short create_error 162 163 000000D0 A3[60020000] mov [fhandle], eax 164 165 000000D5 C605[5E020000]0B mov byte [color], 0Bh ; Light Cyan 166 000000DC BE[40020000] mov esi, msg_writing 167 000000E1 E88E000000 call print_msg 168 169 000000E6 29D7 sub edi, edx ; file size 170 ; edx = start address of the text 171 172 sys _write, [fhandle], edx, edi ; write to 'BIN2DB.TXT' 172 <1> 172 <1> 172 <1> 172 <1> 172 <1> %if %0 >= 2 172 000000E8 8B1D[60020000] <1> mov ebx, %2 172 <1> %if %0 >= 3 172 000000EE 89D1 <1> mov ecx, %3 172 <1> %if %0 = 4 172 000000F0 89FA <1> mov edx, %4 172 <1> %endif 172 <1> %endif 172 <1> %endif 172 000000F2 B804000000 <1> mov eax, %1 172 <1> 172 000000F7 CD40 <1> int 40h 173 000000F9 724D jc short rw_error ; disk write (or free space) error 174 175 000000FB E868000000 call print_msg_ok 176 177 sys _close, [fhandle] ; close file 177 <1> 177 <1> 177 <1> 177 <1> 177 <1> %if %0 >= 2 177 00000100 8B1D[60020000] <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 00000106 B806000000 <1> mov eax, %1 177 <1> 177 0000010B CD40 <1> int 40h 178 179 0000010D C605[5E020000]07 mov byte [color], 07h ; Light Gray (Default Color) 180 00000114 BE[24020000] mov esi, nextline 181 00000119 EB05 jmp short print_nl 182 183 prg_msg: 184 0000011B BE[AE010000] mov esi, msg_program 185 print_nl: 186 00000120 E84F000000 call print_msg 187 terminate: 188 sys _exit ; INT 40h 188 <1> 188 <1> 188 <1> 188 <1> 188 <1> %if %0 >= 2 188 <1> mov ebx, %2 188 <1> %if %0 >= 3 188 <1> mov ecx, %3 188 <1> %if %0 = 4 188 <1> mov edx, %4 188 <1> %endif 188 <1> %endif 188 <1> %endif 188 00000125 B801000000 <1> mov eax, %1 188 <1> 188 0000012A CD40 <1> int 40h 189 here: 190 0000012C EBFE jmp short here 191 192 create_error: 193 0000012E BE[11020000] mov esi, msg_create_error 194 00000133 EB05 jmp short open_create_error 195 open_error: 196 00000135 BE[FD010000] mov esi, msg_open_error 197 open_create_error: 198 0000013A C605[5E020000]0C mov byte [color], 0Ch ; Light Red 199 00000141 E82E000000 call print_msg ; INT 31h 200 00000146 EBDD jmp short terminate 201 202 rw_error: 203 sys _close, [fhandle] ; close file 203 <1> 203 <1> 203 <1> 203 <1> 203 <1> %if %0 >= 2 203 00000148 8B1D[60020000] <1> mov ebx, %2 203 <1> %if %0 >= 3 203 <1> mov ecx, %3 203 <1> %if %0 = 4 203 <1> mov edx, %4 203 <1> %endif 203 <1> %endif 203 <1> %endif 203 0000014E B806000000 <1> mov eax, %1 203 <1> 203 00000153 CD40 <1> int 40h 204 00000155 C605[5E020000]0C mov byte [color], 0Ch ; Light Red 205 0000015C BE[27020000] mov esi, msg_error 206 00000161 E80E000000 call print_msg ; INT 31h 207 00000166 EBBD jmp short terminate 208 209 print_msg_ok: 210 00000168 C605[5E020000]0A mov byte [color], 0Ah ; Light Green 211 0000016F BE[4E020000] mov esi, msg_ok 212 print_msg: 213 00000174 0FB61D[5E020000] movzx ebx, byte [color] ; text color (bl) 214 ; video page 0 (bh) 215 0000017B B40E mov ah, 0Eh ; teletype output (write tty) 216 0000017D AC lodsb 217 _p_nextchar: 218 0000017E CD31 int 31h 219 00000180 AC lodsb 220 00000181 20C0 and al, al 221 00000183 75F9 jnz short _p_nextchar 222 00000185 C3 retn 223 224 hex: 225 00000186 0FB6D8 movzx ebx, al 226 00000189 C0EB04 shr bl, 4 227 0000018C 8A9B[9E010000] mov bl, [ebx+hexchrs] 228 00000192 86D8 xchg bl, al 229 00000194 80E30F and bl, 0Fh 230 00000197 8AA3[9E010000] mov ah, [ebx+hexchrs] 231 0000019D C3 retn 232 233 hexchrs: 234 0000019E 303132333435363738- db '0123456789ABCDEF' 234 000001A7 39414243444546 235 236 ;----------------------------------------------------------------- 237 ; messages 238 ;----------------------------------------------------------------- 239 240 msg_program: 241 000001AE 0D0A db 0Dh, 0Ah 242 000001B0 42494E3244422E5052- db "BIN2DB.PRG /// TRDOS 386 syswrite test program" 242 000001B9 47202F2F2F20545244- 242 000001C2 4F5320333836207379- 242 000001CB 737772697465207465- 242 000001D4 73742070726F677261- 242 000001DD 6D 243 000001DE 0D0A db 0Dh, 0Ah 244 000001E0 6279204572646F6761- db "by Erdogan Tan, 05/11/2016", 0Dh, 0Ah, 0 244 000001E9 6E2054616E2C203035- 244 000001F2 2F31312F323031360D- 244 000001FB 0A00 245 246 msg_open_error: 247 000001FD 0D0A db 0Dh, 0Ah 248 000001FF 7379736F70656E2065- db 'sysopen error !' 248 00000208 72726F722021 249 0000020E 0D0A00 db 0Dh, 0Ah, 0 250 251 msg_create_error: 252 00000211 0D0A db 0Dh, 0Ah 253 00000213 737973637265617465- db 'syscreate error !' 253 0000021C 206572726F722021 254 nextline: 255 00000224 0D0A00 db 0Dh, 0Ah, 0 256 257 msg_error: 258 00000227 4552524F522021200D- db 'ERROR ! ', 0Dh, 0Ah, 0 258 00000230 0A00 259 260 msg_reading: 261 00000232 0D0A db 0Dh, 0Ah 262 00000234 52656164696E672E2E- db 'Reading... ', 0 262 0000023D 2E2000 263 264 msg_writing: 265 00000240 0D0A db 0Dh, 0Ah 266 00000242 57726974696E672E2E- db 'Writing... ', 0 266 0000024B 2E2000 267 268 msg_ok: 269 0000024E 4F4B2E2000 db 'OK. ', 0 270 271 txt_file: 272 00000253 42494E3244422E5458- db 'BIN2DB.TXT', 0 272 0000025C 5400 273 274 0000025E 0F color: db 0Fh ; White 275 276 bss: 277 278 ABSOLUTE bss 279 280 0000025F alignb 4 281 282 00000260 fhandle: resd 1 283 00000264 fsize: resd 1 284 285 BUFFER: