1 ; **************************************************************************** 2 ; hex2bin.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'hex2bin.prg') 3 ; ---------------------------------------------------------------------------- 4 ; HEX2BIN.PRG ! 'sysopen', 'sysread', 'syswrite' TEST program for TRDOS 386 ! 5 ; 6 ; 05/11/2016 7 ; 8 ; [ Last Modification: 06/11/2016 ] 9 ; 10 ; **************************************************************************** 11 ; Note: This program is inverse of the BIN2HEX.PRG (05/11/2016, 'bin2hex.s') 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 & hex file name) 89 00000006 0F826A010000 jb prg_msg ; nothing to do 90 91 0000000C AD lodsd ; program file name address 92 0000000D AD lodsd ; text file name address (file to be read) 93 ; EAX = arg2 ; file name address 94 95 open_hex_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 0F826E010000 jc open_error 98 99 00000022 A3[94020000] mov [fhandle], eax ; file handle/index number 100 101 00000027 C605[8F020000]0E mov byte [color], 0Eh ; Yellow 102 0000002E BE[46020000] mov esi, msg_reading 103 00000033 E877010000 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[94020000] <1> mov ebx, %2 106 <1> %if %0 >= 3 106 0000003E B9[9C020000] <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 726A jc rw_error ; disk read or memory allocation error 108 109 00000051 A3[98020000] mov [fsize], eax ; file size (read bytes) 110 111 00000056 E848010000 call print_msg_ok 112 113 close_hex_file: 114 sys _close, [fhandle] ; close file 114 <1> 114 <1> 114 <1> 114 <1> 114 <1> %if %0 >= 2 114 0000005B 8B1D[94020000] <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 00000061 B806000000 <1> mov eax, %1 114 <1> 114 00000066 CD40 <1> int 40h 115 116 00000068 C605[8F020000]0F mov byte [color], 0Fh ; White 117 0000006F BE[54020000] mov esi, msg_checking 118 00000074 E836010000 call print_msg 119 120 00000079 BE[9C020000] mov esi, BUFFER 121 0000007E 8B0D[98020000] mov ecx, [fsize] 122 00000084 28E4 sub ah, ah ; 0 123 00000086 89F7 mov edi, esi 124 00000088 01CF add edi, ecx 125 0000008A 29D2 sub edx, edx 126 chk_hex_0: 127 0000008C B210 mov dl, 16 128 chk_hex_1: 129 0000008E E84B000000 call chk_hex_2 130 00000093 88C4 mov ah, al 131 00000095 49 dec ecx 132 00000096 7430 jz short chk_error 133 00000098 E841000000 call chk_hex_2 134 0000009D C0E404 shl ah, 4 ; * 16 135 ;and al, 0Fh 136 000000A0 08E0 or al, ah 137 000000A2 AA stosb 138 000000A3 49 dec ecx 139 000000A4 7458 jz short write_to_bin_file 140 000000A6 AC lodsb 141 000000A7 4A dec edx 142 000000A8 754E jnz short chk_hex_5 143 144 000000AA 3C0D cmp al, 0Dh 145 000000AC 751A jne short chk_error 146 000000AE 49 dec ecx 147 000000AF 7417 jz short chk_error 148 000000B1 AC lodsb 149 000000B2 3C0A cmp al, 0Ah 150 000000B4 7512 jne short chk_error 151 000000B6 49 dec ecx 152 000000B7 75D3 jnz short chk_hex_0 153 000000B9 EB43 jmp write_to_bin_file 154 155 rw_error: 156 sys _close, [fhandle] ; close file 156 <1> 156 <1> 156 <1> 156 <1> 156 <1> %if %0 >= 2 156 000000BB 8B1D[94020000] <1> mov ebx, %2 156 <1> %if %0 >= 3 156 <1> mov ecx, %3 156 <1> %if %0 = 4 156 <1> mov edx, %4 156 <1> %endif 156 <1> %endif 156 <1> %endif 156 000000C1 B806000000 <1> mov eax, %1 156 <1> 156 000000C6 CD40 <1> int 40h 157 chk_error: 158 000000C8 C605[8F020000]0C mov byte [color], 0Ch ; Light Red 159 000000CF BE[3B020000] mov esi, msg_error 160 000000D4 E8D6000000 call print_msg ; INT 31h 161 000000D9 E9A2000000 jmp terminate 162 163 chk_hex_2: 164 000000DE AC lodsb 165 000000DF 3C39 cmp al, '9' 166 000000E1 7707 ja short chk_hex_3 167 000000E3 3C30 cmp al, '0' 168 000000E5 720E jb short chk_hex_4 169 000000E7 2C30 sub al, '0' 170 000000E9 C3 retn 171 chk_hex_3: 172 000000EA 3C41 cmp al, 'A' 173 000000EC 7207 jb short chk_hex_4 174 000000EE 3C46 cmp al, 'F' 175 000000F0 7703 ja short chk_hex_4 176 000000F2 2C37 sub al, 'A'-10 177 000000F4 C3 retn 178 chk_hex_4: 179 000000F5 58 pop eax ; return address 180 000000F6 EBD0 jmp short chk_error 181 182 chk_hex_5: 183 000000F8 3C20 cmp al, 20h 184 000000FA 75CC jne short chk_error 185 000000FC E290 loop chk_hex_1 186 ;jmp write_to_bin_file 187 188 write_to_bin_file: 189 000000FE B9[9C020000] mov ecx, BUFFER 190 00000103 030D[98020000] add ecx, [fsize] 191 00000109 39CF cmp edi, ecx 192 0000010B 76BB jna chk_error ; ZERO file size 193 194 0000010D E891000000 call print_msg_ok 195 196 00000112 89CA mov edx, ecx ; 1st byte of converted data 197 198 create_bin_file: 199 sys _creat, bin_file, 0 ; create (normal) file 199 <1> 199 <1> 199 <1> 199 <1> 199 <1> %if %0 >= 2 199 00000114 BB[83020000] <1> mov ebx, %2 199 <1> %if %0 >= 3 199 00000119 B900000000 <1> mov ecx, %3 199 <1> %if %0 = 4 199 <1> mov edx, %4 199 <1> %endif 199 <1> %endif 199 <1> %endif 199 0000011E B808000000 <1> mov eax, %1 199 <1> 199 00000123 CD40 <1> int 40h 200 00000125 7262 jc short create_error 201 202 00000127 A3[94020000] mov [fhandle], eax 203 204 0000012C C605[8F020000]0B mov byte [color], 0Bh ; Light Cyan 205 00000133 BE[70020000] mov esi, msg_writing 206 00000138 E872000000 call print_msg 207 208 0000013D 29D7 sub edi, edx ; file size 209 ; edx = start address of the text 210 211 sys _write, [fhandle], edx, edi ; write to 'DB2BIN.BIN' 211 <1> 211 <1> 211 <1> 211 <1> 211 <1> %if %0 >= 2 211 0000013F 8B1D[94020000] <1> mov ebx, %2 211 <1> %if %0 >= 3 211 00000145 89D1 <1> mov ecx, %3 211 <1> %if %0 = 4 211 00000147 89FA <1> mov edx, %4 211 <1> %endif 211 <1> %endif 211 <1> %endif 211 00000149 B804000000 <1> mov eax, %1 211 <1> 211 0000014E CD40 <1> int 40h 212 00000150 0F8265FFFFFF jc rw_error ; disk write (or free space) error 213 214 00000156 E848000000 call print_msg_ok 215 216 sys _close, [fhandle] ; close file 216 <1> 216 <1> 216 <1> 216 <1> 216 <1> %if %0 >= 2 216 0000015B 8B1D[94020000] <1> mov ebx, %2 216 <1> %if %0 >= 3 216 <1> mov ecx, %3 216 <1> %if %0 = 4 216 <1> mov edx, %4 216 <1> %endif 216 <1> %endif 216 <1> %endif 216 00000161 B806000000 <1> mov eax, %1 216 <1> 216 00000166 CD40 <1> int 40h 217 218 00000168 C605[8F020000]07 mov byte [color], 07h ; Light Gray (Default Color) 219 0000016F BE[38020000] mov esi, nextline 220 00000174 EB05 jmp short print_nl 221 222 prg_msg: 223 00000176 BE[C1010000] mov esi, msg_program 224 print_nl: 225 0000017B E82F000000 call print_msg 226 terminate: 227 sys _exit ; INT 40h 227 <1> 227 <1> 227 <1> 227 <1> 227 <1> %if %0 >= 2 227 <1> mov ebx, %2 227 <1> %if %0 >= 3 227 <1> mov ecx, %3 227 <1> %if %0 = 4 227 <1> mov edx, %4 227 <1> %endif 227 <1> %endif 227 <1> %endif 227 00000180 B801000000 <1> mov eax, %1 227 <1> 227 00000185 CD40 <1> int 40h 228 here: 229 00000187 EBFE jmp short here 230 231 create_error: 232 00000189 BE[25020000] mov esi, msg_create_error 233 0000018E EB05 jmp short open_create_error 234 open_error: 235 00000190 BE[11020000] mov esi, msg_open_error 236 open_create_error: 237 00000195 C605[8F020000]0C mov byte [color], 0Ch ; Light Red 238 0000019C E80E000000 call print_msg ; INT 31h 239 000001A1 EBDD jmp short terminate 240 241 print_msg_ok: 242 000001A3 C605[8F020000]0A mov byte [color], 0Ah ; Light Green 243 000001AA BE[7E020000] mov esi, msg_ok 244 print_msg: 245 000001AF 0FB61D[8F020000] movzx ebx, byte [color] ; text color (bl) 246 ; video page 0 (bh) 247 000001B6 B40E mov ah, 0Eh ; teletype output (write tty) 248 000001B8 AC lodsb 249 _p_nextchar: 250 000001B9 CD31 int 31h 251 000001BB AC lodsb 252 000001BC 20C0 and al, al 253 000001BE 75F9 jnz short _p_nextchar 254 000001C0 C3 retn 255 256 ;----------------------------------------------------------------- 257 ; messages 258 ;----------------------------------------------------------------- 259 260 msg_program: 261 000001C1 0D0A db 0Dh, 0Ah 262 000001C3 4845583242494E2E50- db "HEX2BIN.PRG /// TRDOS 386 syswrite test program" 262 000001CC 5247202F2F2F205452- 262 000001D5 444F53203338362073- 262 000001DE 797377726974652074- 262 000001E7 6573742070726F6772- 262 000001F0 616D 263 000001F2 0D0A db 0Dh, 0Ah 264 000001F4 6279204572646F6761- db "by Erdogan Tan, 06/11/2016", 0Dh, 0Ah, 0 264 000001FD 6E2054616E2C203036- 264 00000206 2F31312F323031360D- 264 0000020F 0A00 265 266 msg_open_error: 267 00000211 0D0A db 0Dh, 0Ah 268 00000213 7379736F70656E2065- db 'sysopen error !' 268 0000021C 72726F722021 269 00000222 0D0A00 db 0Dh, 0Ah, 0 270 271 msg_create_error: 272 00000225 0D0A db 0Dh, 0Ah 273 00000227 737973637265617465- db 'syscreate error !' 273 00000230 206572726F722021 274 nextline: 275 00000238 0D0A00 db 0Dh, 0Ah, 0 276 277 msg_error: 278 0000023B 4552524F522021200D- db 'ERROR ! ', 0Dh, 0Ah, 0 278 00000244 0A00 279 280 msg_reading: 281 00000246 0D0A db 0Dh, 0Ah 282 00000248 52656164696E672E2E- db 'Reading... ', 0 282 00000251 2E2000 283 284 msg_checking: 285 00000254 0D0A db 0Dh, 0Ah 286 00000256 436865636B696E6720- db 'Checking & Converting... ', 0 286 0000025F 2620436F6E76657274- 286 00000268 696E672E2E2E2000 287 288 msg_writing: 289 00000270 0D0A db 0Dh, 0Ah 290 00000272 57726974696E672E2E- db 'Writing... ', 0 290 0000027B 2E2000 291 292 msg_ok: 293 0000027E 4F4B2E2000 db 'OK. ', 0 294 295 bin_file: 296 00000283 4845583242494E2E42- db 'HEX2BIN.BIN', 0 296 0000028C 494E00 297 298 0000028F 0F color: db 0Fh ; White 299 300 Digit1: 301 00000290 00 db 0 302 Digit2: 303 00000291 00 db 0 304 305 bss: 306 307 ABSOLUTE bss 308 309 00000292 alignb 4 310 311 00000294 fhandle: resd 1 312 00000298 fsize: resd 1 313 314 315 BUFFER: