1 ; **************************************************************************** 2 ; bin2hex.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'bin2hex.prg') 3 ; ---------------------------------------------------------------------------- 4 ; BIN2HEX.PRG ! 'sysopen', 'sysread', 'syswrite' TEST program for TRDOS 386 ! 5 ; 6 ; 05/11/2016 7 ; 8 ; [ Last Modification: 05/11/2016 ] 9 ; 10 ; **************************************************************************** 11 ; BIN2DB.PRG (05/11/2016) 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] ; We need 32-bit intructions for protected mode 82 83 [ORG 0] 84 85 START_CODE: 86 00000000 89E6 mov esi, esp 87 00000002 AD lodsd 88 00000003 83F802 cmp eax, 2 ; two arguments (program file name & binary file name) 89 00000006 0F82F8000000 jb prg_msg ; nothing to do 90 91 0000000C AD lodsd ; program file name address 92 0000000D AD lodsd ; binary file name address (file to be read) 93 ; EAX = arg2 ; 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 0F82FC000000 jc open_error 98 99 00000022 A3[4C020000] mov [fhandle], eax ; file handle/index number 100 101 00000027 C605[49020000]0E mov byte [color], 0Eh ; Yellow 102 0000002E BE[1C020000] mov esi, msg_reading 103 00000033 E825010000 call print_msg 104 105 read_file: 106 sys _read, [fhandle], BUFFER, 0FFFFFFFFh ; read all bytes 106 <1> 106 <1> 106 <1> 106 <1> 106 <1> %if %0 >= 2 106 00000038 8B1D[4C020000] <1> mov ebx, %2 106 <1> %if %0 >= 3 106 0000003E B9[54020000] <1> mov ecx, %3 106 <1> %if %0 = 4 106 00000043 BAFFFFFFFF <1> mov edx, %4 106 <1> %endif 106 <1> %endif 106 <1> %endif 106 00000048 B803000000 <1> mov eax, %1 106 <1> 106 0000004D CD40 <1> int 40h 107 0000004F 0F82DC000000 jc rw_error ; disk read or memory allocation error 108 109 00000055 A3[50020000] mov [fsize], eax ; file size (read bytes) 110 111 0000005A E8F2000000 call print_msg_ok 112 113 close_bin_file: 114 sys _close, [fhandle] ; close file 114 <1> 114 <1> 114 <1> 114 <1> 114 <1> %if %0 >= 2 114 0000005F 8B1D[4C020000] <1> mov ebx, %2 114 <1> %if %0 >= 3 114 <1> mov ecx, %3 114 <1> %if %0 = 4 114 <1> mov edx, %4 114 <1> %endif 114 <1> %endif 114 <1> %endif 114 00000065 B806000000 <1> mov eax, %1 114 <1> 114 0000006A CD40 <1> int 40h 115 116 convert_byte_to_hex: 117 0000006C BE[54020000] mov esi, BUFFER 118 00000071 89F2 mov edx, esi 119 00000073 0315[50020000] add edx, [fsize] 120 00000079 89D7 mov edi, edx 121 122 0000007B 31C9 xor ecx, ecx 123 c_0: 124 0000007D B110 mov cl, 16 125 c_1: 126 0000007F AC lodsb 127 00000080 E8EA000000 call hex 128 00000085 66AB stosw 129 130 00000087 FF0D[50020000] dec dword [fsize] 131 0000008D 7411 jz short c_3 132 133 0000008F FEC9 dec cl 134 00000091 7405 jz short c_2 135 136 00000093 B020 mov al, ' ' ; 20h 137 00000095 AA stosb 138 00000096 EBE7 jmp short c_1 139 c_2: 140 00000098 66B80D0A mov ax, 0A0Dh 141 0000009C 66AB stosw 142 0000009E EBDD jmp short c_0 143 c_3: 144 000000A0 66B80D0A mov ax, 0A0Dh 145 000000A4 66AB stosw 146 147 create_hex_file: 148 sys _creat, hex_file, 0 ; create (normal) file 148 <1> 148 <1> 148 <1> 148 <1> 148 <1> %if %0 >= 2 148 000000A6 BB[3D020000] <1> mov ebx, %2 148 <1> %if %0 >= 3 148 000000AB B900000000 <1> mov ecx, %3 148 <1> %if %0 = 4 148 <1> mov edx, %4 148 <1> %endif 148 <1> %endif 148 <1> %endif 148 000000B0 B808000000 <1> mov eax, %1 148 <1> 148 000000B5 CD40 <1> int 40h 149 000000B7 725E jc short create_error 150 151 000000B9 A3[4C020000] mov [fhandle], eax 152 153 000000BE C605[49020000]0B mov byte [color], 0Bh ; Light Cyan 154 000000C5 BE[2A020000] mov esi, msg_writing 155 000000CA E88E000000 call print_msg 156 157 000000CF 29D7 sub edi, edx ; file size 158 ; edx = start address of the text 159 160 sys _write, [fhandle], edx, edi ; write to 'BIN2HEX.HEX' 160 <1> 160 <1> 160 <1> 160 <1> 160 <1> %if %0 >= 2 160 000000D1 8B1D[4C020000] <1> mov ebx, %2 160 <1> %if %0 >= 3 160 000000D7 89D1 <1> mov ecx, %3 160 <1> %if %0 = 4 160 000000D9 89FA <1> mov edx, %4 160 <1> %endif 160 <1> %endif 160 <1> %endif 160 000000DB B804000000 <1> mov eax, %1 160 <1> 160 000000E0 CD40 <1> int 40h 161 000000E2 724D jc short rw_error ; disk write (or free space) error 162 163 000000E4 E868000000 call print_msg_ok 164 165 sys _close, [fhandle] ; close file 165 <1> 165 <1> 165 <1> 165 <1> 165 <1> %if %0 >= 2 165 000000E9 8B1D[4C020000] <1> mov ebx, %2 165 <1> %if %0 >= 3 165 <1> mov ecx, %3 165 <1> %if %0 = 4 165 <1> mov edx, %4 165 <1> %endif 165 <1> %endif 165 <1> %endif 165 000000EF B806000000 <1> mov eax, %1 165 <1> 165 000000F4 CD40 <1> int 40h 166 167 000000F6 C605[49020000]07 mov byte [color], 07h ; Light Gray (Default Color) 168 000000FD BE[0E020000] mov esi, nextline 169 00000102 EB05 jmp short print_nl 170 171 prg_msg: 172 00000104 BE[97010000] mov esi, msg_program 173 print_nl: 174 00000109 E84F000000 call print_msg 175 terminate: 176 sys _exit ; INT 40h 176 <1> 176 <1> 176 <1> 176 <1> 176 <1> %if %0 >= 2 176 <1> mov ebx, %2 176 <1> %if %0 >= 3 176 <1> mov ecx, %3 176 <1> %if %0 = 4 176 <1> mov edx, %4 176 <1> %endif 176 <1> %endif 176 <1> %endif 176 0000010E B801000000 <1> mov eax, %1 176 <1> 176 00000113 CD40 <1> int 40h 177 here: 178 00000115 EBFE jmp short here 179 180 create_error: 181 00000117 BE[FB010000] mov esi, msg_create_error 182 0000011C EB05 jmp short open_create_error 183 open_error: 184 0000011E BE[E7010000] mov esi, msg_open_error 185 open_create_error: 186 00000123 C605[49020000]0C mov byte [color], 0Ch ; Light Red 187 0000012A E82E000000 call print_msg ; INT 31h 188 0000012F EBDD jmp short terminate 189 190 rw_error: 191 sys _close, [fhandle] ; close file 191 <1> 191 <1> 191 <1> 191 <1> 191 <1> %if %0 >= 2 191 00000131 8B1D[4C020000] <1> mov ebx, %2 191 <1> %if %0 >= 3 191 <1> mov ecx, %3 191 <1> %if %0 = 4 191 <1> mov edx, %4 191 <1> %endif 191 <1> %endif 191 <1> %endif 191 00000137 B806000000 <1> mov eax, %1 191 <1> 191 0000013C CD40 <1> int 40h 192 0000013E C605[49020000]0C mov byte [color], 0Ch ; Light Red 193 00000145 BE[11020000] mov esi, msg_error 194 0000014A E80E000000 call print_msg ; INT 31h 195 0000014F EBBD jmp short terminate 196 197 print_msg_ok: 198 00000151 C605[49020000]0A mov byte [color], 0Ah ; Light Green 199 00000158 BE[38020000] mov esi, msg_ok 200 print_msg: 201 0000015D 0FB61D[49020000] movzx ebx, byte [color] ; text color (bl) 202 ; video page 0 (bh) 203 00000164 B40E mov ah, 0Eh ; teletype output (write tty) 204 00000166 AC lodsb 205 _p_nextchar: 206 00000167 CD31 int 31h 207 00000169 AC lodsb 208 0000016A 20C0 and al, al 209 0000016C 75F9 jnz short _p_nextchar 210 0000016E C3 retn 211 212 hex: 213 0000016F 0FB6D8 movzx ebx, al 214 00000172 C0EB04 shr bl, 4 215 00000175 8A9B[87010000] mov bl, [ebx+hexchrs] 216 0000017B 86D8 xchg bl, al 217 0000017D 80E30F and bl, 0Fh 218 00000180 8AA3[87010000] mov ah, [ebx+hexchrs] 219 00000186 C3 retn 220 221 hexchrs: 222 00000187 303132333435363738- db '0123456789ABCDEF' 222 00000190 39414243444546 223 224 ;----------------------------------------------------------------- 225 ; messages 226 ;----------------------------------------------------------------- 227 228 msg_program: 229 00000197 0D0A db 0Dh, 0Ah 230 00000199 42494E324845582E50- db "BIN2HEX.PRG /// TRDOS 386 syswrite test program" 230 000001A2 5247202F2F2F205452- 230 000001AB 444F53203338362073- 230 000001B4 797377726974652074- 230 000001BD 6573742070726F6772- 230 000001C6 616D 231 000001C8 0D0A db 0Dh, 0Ah 232 000001CA 6279204572646F6761- db "by Erdogan Tan, 05/11/2016", 0Dh, 0Ah, 0 232 000001D3 6E2054616E2C203035- 232 000001DC 2F31312F323031360D- 232 000001E5 0A00 233 234 msg_open_error: 235 000001E7 0D0A db 0Dh, 0Ah 236 000001E9 7379736F70656E2065- db 'sysopen error !' 236 000001F2 72726F722021 237 000001F8 0D0A00 db 0Dh, 0Ah, 0 238 239 msg_create_error: 240 000001FB 0D0A db 0Dh, 0Ah 241 000001FD 737973637265617465- db 'syscreate error !' 241 00000206 206572726F722021 242 nextline: 243 0000020E 0D0A00 db 0Dh, 0Ah, 0 244 245 msg_error: 246 00000211 4552524F522021200D- db 'ERROR ! ', 0Dh, 0Ah, 0 246 0000021A 0A00 247 248 msg_reading: 249 0000021C 0D0A db 0Dh, 0Ah 250 0000021E 52656164696E672E2E- db 'Reading... ', 0 250 00000227 2E2000 251 252 msg_writing: 253 0000022A 0D0A db 0Dh, 0Ah 254 0000022C 57726974696E672E2E- db 'Writing... ', 0 254 00000235 2E2000 255 256 msg_ok: 257 00000238 4F4B2E2000 db 'OK. ', 0 258 259 hex_file: 260 0000023D 42494E324845582E48- db 'BIN2HEX.HEX', 0 260 00000246 455800 261 262 00000249 0F color: db 0Fh ; White 263 264 bss: 265 266 ABSOLUTE bss 267 268 0000024A alignb 4 269 270 0000024C fhandle: resd 1 271 00000250 fsize: resd 1 272 273 BUFFER: