1 ; **************************************************************************** 2 ; db2bin.s (TRDOS 386, TRDOS v2.0 - sample binary file, 'db2bin.prg') 3 ; ---------------------------------------------------------------------------- 4 ; DB2BIN.PRG ! 'sysopen', 'sysread', 'syswrite' TEST program for TRDOS 386 ! 5 ; 6 ; 03/11/2016 7 ; 8 ; [ Last Modification: 05/11/2016 ] 9 ; 10 ; **************************************************************************** 11 ; Note: This program is inverse of the BIN2DB.PRG (03/11/2016, 'bin2db.s') 12 13 14 ; 16/10/2016 15 ; 29/04/2016 16 ; TRDOS 386 system calls (temporary list!) 17 _ver equ 0 18 _exit equ 1 19 _fork equ 2 20 _read equ 3 21 _write equ 4 22 _open equ 5 23 _close equ 6 24 _wait equ 7 25 _creat equ 8 26 _link equ 9 27 _unlink equ 10 28 _exec equ 11 29 _chdir equ 12 30 _time equ 13 31 _mkdir equ 14 32 _chmod equ 15 33 _chown equ 16 34 _break equ 17 35 _stat equ 18 36 _seek equ 19 37 _tell equ 20 38 _mount equ 21 39 _umount equ 22 40 _setuid equ 23 41 _getuid equ 24 42 _stime equ 25 43 _quit equ 26 44 _intr equ 27 45 _fstat equ 28 46 _emt equ 29 47 _mdate equ 30 48 _video equ 31 49 _audio equ 32 50 _timer equ 33 51 _sleep equ 34 52 _msg equ 35 53 _geterr equ 36 54 _rsvd1 equ 37 55 _pri equ 38 56 _rele equ 39 57 _fff equ 40 58 _fnf equ 41 59 60 %macro sys 1-4 61 ; 29/04/2016 - TRDOS 386 (TRDOS v2.0) 62 ; 03/09/2015 63 ; 13/04/2015 64 ; Retro UNIX 386 v1 system call. 65 %if %0 >= 2 66 mov ebx, %2 67 %if %0 >= 3 68 mov ecx, %3 69 %if %0 = 4 70 mov edx, %4 71 %endif 72 %endif 73 %endif 74 mov eax, %1 75 ;int 30h 76 int 40h ; TRDOS 386 (TRDOS v2.0) 77 %endmacro 78 79 ; TRDOS 386 (and Retro UNIX 386 v1) system call format: 80 ; sys systemcall (eax) , , 81 82 [BITS 32] ; We need 32-bit intructions for protected mode 83 84 [ORG 0] 85 86 START_CODE: 87 00000000 89E6 mov esi, esp 88 00000002 AD lodsd 89 00000003 83F802 cmp eax, 2 ; two arguments (program file name & text file name) 90 00000006 0F8226030000 jb prg_msg ; nothing to do 91 92 0000000C AD lodsd ; program file name address 93 0000000D AD lodsd ; text file name address (file to be read) 94 ; EAX = arg2 ; file name address 95 96 open_txt_file: 97 sys _open, eax, 0 ; open for reading 97 <1> 97 <1> 97 <1> 97 <1> 97 <1> %if %0 >= 2 97 0000000E 89C3 <1> mov ebx, %2 97 <1> %if %0 >= 3 97 00000010 B900000000 <1> mov ecx, %3 97 <1> %if %0 = 4 97 <1> mov edx, %4 97 <1> %endif 97 <1> %endif 97 <1> %endif 97 00000015 B805000000 <1> mov eax, %1 97 <1> 97 0000001A CD40 <1> int 40h 98 0000001C 0F822A030000 jc open_error 99 100 00000022 A3[78040000] mov [fhandle], eax ; file handle/index number 101 102 00000027 C605[75040000]0E mov byte [color], 0Eh ; Yellow 103 0000002E BE[2D040000] mov esi, msg_reading 104 00000033 E853030000 call print_msg 105 106 read_file: 107 sys _read, [fhandle], BUFFER, 0FFFFFFFFh ; read all bytes 107 <1> 107 <1> 107 <1> 107 <1> 107 <1> %if %0 >= 2 107 00000038 8B1D[78040000] <1> mov ebx, %2 107 <1> %if %0 >= 3 107 0000003E B9[80040000] <1> mov ecx, %3 107 <1> %if %0 = 4 107 00000043 BAFFFFFFFF <1> mov edx, %4 107 <1> %endif 107 <1> %endif 107 <1> %endif 107 00000048 B803000000 <1> mov eax, %1 107 <1> 107 0000004D CD40 <1> int 40h 108 0000004F 0F820A030000 jc rw_error ; disk read or memory allocation error 109 110 00000055 A3[7C040000] mov [fsize], eax ; file size (read bytes) 111 112 0000005A E820030000 call print_msg_ok 113 114 close_txt_file: 115 sys _close, [fhandle] ; close file 115 <1> 115 <1> 115 <1> 115 <1> 115 <1> %if %0 >= 2 115 0000005F 8B1D[78040000] <1> mov ebx, %2 115 <1> %if %0 >= 3 115 <1> mov ecx, %3 115 <1> %if %0 = 4 115 <1> mov edx, %4 115 <1> %endif 115 <1> %endif 115 <1> %endif 115 00000065 B806000000 <1> mov eax, %1 115 <1> 115 0000006A CD40 <1> int 40h 116 117 0000006C C605[75040000]0F mov byte [color], 0Fh ; White 118 00000073 BE[3B040000] mov esi, msg_checking 119 00000078 E80E030000 call print_msg 120 121 0000007D BE[80040000] mov esi, BUFFER 122 00000082 8B0D[7C040000] mov ecx, [fsize] 123 00000088 28E4 sub ah, ah ; 0 124 0000008A 89F7 mov edi, esi 125 0000008C 01CF add edi, ecx 126 chk_db_0: 127 0000008E AC lodsb 128 0000008F 3C64 cmp al, 'd' 129 00000091 746F je short chk_db_6 130 00000093 3C44 cmp al, 'D' 131 00000095 746B je short chk_db_6 132 00000097 3C3B cmp al, ';' ; comment line 133 00000099 0F8439010000 je chk_db_17 134 0000009F 3C09 cmp al, 09h ; TAB key 135 000000A1 740C je short chk_db_1 136 000000A3 3C20 cmp al, 20h ; SPACE 137 000000A5 7408 je short chk_db_1 138 000000A7 3C0D cmp al, 0Dh 139 000000A9 740B je short chk_db_2 140 000000AB 3C0A cmp al, 0Ah 141 000000AD 7423 je short chk_db_3 142 143 chk_db_1: 144 000000AF E2DD loop chk_db_0 145 000000B1 E904020000 jmp write_to_bin_file 146 147 chk_db_2: 148 000000B6 80FC68 cmp ah, 'h' 149 000000B9 74F4 je short chk_db_1 150 000000BB 80FC48 cmp ah, 'H' 151 000000BE 74EF je short chk_db_1 152 000000C0 80FC0A cmp ah, 0Ah 153 000000C3 7429 je short chk_db_4 154 000000C5 80FC00 cmp ah, 0 155 000000C8 0F859E020000 jne chk_error 156 000000CE 88C4 mov ah, al ; 0Dh 157 000000D0 EBDD jmp short chk_db_1 158 159 chk_db_3: 160 000000D2 80FC0D cmp ah, 0Dh 161 000000D5 7417 je short chk_db_4 162 000000D7 80FC68 cmp ah, 'h' 163 000000DA 74D3 je short chk_db_1 164 000000DC 80FC48 cmp ah, 'H' 165 000000DF 74CE je short chk_db_1 166 000000E1 80FC00 cmp ah, 0 167 000000E4 0F8582020000 jne chk_error 168 000000EA 88C4 mov ah, al ; 0Ah 169 000000EC EBC1 jmp short chk_db_1 170 171 chk_db_4: 172 000000EE B400 mov ah, 0 173 000000F0 EBBD jmp short chk_db_1 174 175 chk_db_5: ; al = 'd' 176 000000F2 88C4 mov ah, al 177 000000F4 AC lodsb 178 000000F5 3C62 cmp al, 'b' 179 000000F7 742C je short chk_db_9 180 000000F9 3C42 cmp al, 'B' 181 000000FB 7428 je short chk_db_9 182 000000FD E96A020000 jmp chk_error 183 184 chk_db_6: 185 00000102 E2EE loop chk_db_5 186 00000104 E963020000 jmp chk_error 187 188 chk_db_7: 189 00000109 AC lodsb 190 0000010A 3C20 cmp al, 20h ; space 191 0000010C 751E jne short chk_db_10 192 0000010E E2F9 loop chk_db_7 193 00000110 E9A5010000 jmp write_to_bin_file 194 195 chk_db_8: 196 00000115 AC lodsb 197 00000116 3C20 cmp al, 20h ; space 198 00000118 0F854E020000 jne chk_error 199 0000011E E2E9 loop chk_db_7 200 00000120 E947020000 jmp chk_error 201 202 chk_db_9: ; al = 'b' 203 00000125 E2EE loop chk_db_8 204 00000127 E940020000 jmp chk_error 205 206 chk_db_10: 207 0000012C 0F823B010000 jb chk_db_24 208 00000132 3C30 cmp al, '0' 209 00000134 0F82A5000000 jb chk_db_18 210 0000013A 3C39 cmp al, '9' 211 0000013C 7649 jna short chk_db_11 212 0000013E 3C41 cmp al, 'A' 213 00000140 0F828E000000 jb chk_db_16 214 00000146 3C46 cmp al, 'F' 215 00000148 763D jna short chk_db_11 216 0000014A 3C61 cmp al, 'a' 217 0000014C 0F821A020000 jb chk_error 218 00000152 3C66 cmp al, 'f' 219 00000154 7631 jna short chk_db_11 220 221 00000156 80FC30 cmp ah, '0' ; numeric chars 222 00000159 0F850D020000 jne chk_error 223 0000015F 24DF and al, 0DFh ; capital letter 224 00000161 3C48 cmp al, 'H' 225 00000163 0F8503020000 jne chk_error 226 00000169 3825[77040000] cmp [Digit2], ah ;'0' 227 0000016F 0F8389000000 jnb chk_db_19 228 00000175 A0[76040000] mov al, [Digit1] 229 0000017A 8825[76040000] mov [Digit1], ah ;'0' 230 00000180 A2[77040000] mov [Digit2], al 231 00000185 EB77 jmp short chk_db_19 232 233 chk_db_11: 234 00000187 B430 mov ah, '0' 235 00000189 3825[76040000] cmp [Digit1], ah ;'0' 236 0000018F 7709 ja short chk_db_12 237 00000191 7424 je short chk_db_14 238 239 00000193 A2[76040000] mov [Digit1], al 240 00000198 EB11 jmp short chk_db_13 241 242 chk_db_12: 243 0000019A 3825[77040000] cmp [Digit2], ah ;'0' 244 000001A0 0F83C6010000 jnb chk_error 245 246 000001A6 A2[77040000] mov [Digit2], al 247 chk_db_13: 248 ;loop chk_db_7 249 000001AB 49 dec ecx 250 000001AC 0F8557FFFFFF jnz chk_db_7 251 000001B2 E9B5010000 jmp chk_error 252 253 chk_db_14: 254 000001B7 3825[77040000] cmp [Digit2], ah ; '0' 255 000001BD 760E jna short chk_db_15 256 000001BF 8A25[77040000] mov ah, [Digit2] 257 000001C5 8825[76040000] mov [Digit1], ah ; 'A'..'F', 'a'..'f' 258 000001CB B430 mov ah, '0' 259 chk_db_15: 260 000001CD A2[77040000] mov [Digit2], al 261 000001D2 EBD7 jmp short chk_db_13 262 263 chk_db_16: 264 000001D4 3C3B cmp al, ';' ; comment line 265 000001D6 7507 jne short chk_db_18 266 chk_db_17: 267 000001D8 E258 loop chk_db_20 268 000001DA E9DB000000 jmp write_to_bin_file 269 270 chk_db_18: 271 000001DF 3C2C cmp al, ',' 272 000001E1 0F8585010000 jne chk_error 273 ;and ah, 0DFh 274 ;cmp ah, 'H' 275 000001E7 80FC68 cmp ah, 'h' 276 000001EA 0F857C010000 jne chk_error 277 000001F0 49 dec ecx 278 000001F1 0F8475010000 jz chk_error 279 000001F7 88C4 mov ah, al 280 000001F9 E90BFFFFFF jmp chk_db_7 281 282 chk_db_19: 283 000001FE A0[76040000] mov al, [Digit1] 284 ;cmp al, '0' 285 ;jb chk_error 286 00000203 8A25[77040000] mov ah, [Digit2] 287 ;cmp ah, '0' 288 ;jb chk_error 289 290 00000209 E88F010000 call calc_number 291 0000020E 86E0 xchg ah, al 292 00000210 C0E404 shl ah, 4 ; * 16 293 00000213 E885010000 call calc_number 294 ;and al, 0Fh 295 00000218 08E0 or al, ah 296 0000021A AA stosb 297 298 ;mov byte [Digit1], 0 299 ;mov byte [Digit2], 0 300 301 0000021B 6631C0 xor ax, ax 302 0000021E 66A3[76040000] mov [Digit1], ax 303 304 00000224 B468 mov ah, 'h' 305 306 ;loop chk_db_7 307 00000226 49 dec ecx 308 00000227 0F85DCFEFFFF jnz chk_db_7 309 310 0000022D E988000000 jmp write_to_bin_file 311 312 chk_db_20: 313 00000232 3C20 cmp al, 20h 314 00000234 7330 jnb short chk_db_22 315 00000236 3C09 cmp al, 09h ; TAB key 316 00000238 742C je short chk_db_22 317 0000023A B40D mov ah, 0Dh 318 0000023C 3C0A cmp al, 0Ah 319 0000023E 740D je short chk_db_21 320 00000240 B40A mov ah, 0Ah 321 00000242 3C0D cmp al, 0Dh 322 00000244 7407 je short chk_db_21 323 00000246 E222 loop chk_db_23 324 00000248 E91F010000 jmp chk_error 325 326 chk_db_21: 327 0000024D 49 dec ecx 328 0000024E 0F8418010000 jz chk_error 329 00000254 AC lodsb 330 00000255 38E0 cmp al, ah 331 00000257 0F850F010000 jne chk_error 332 0000025D 49 dec ecx 333 0000025E 0F852AFEFFFF jnz chk_db_0 334 00000264 EB54 jmp write_to_bin_file 335 336 chk_db_22: 337 00000266 E202 loop chk_db_23 338 00000268 EB50 jmp short write_to_bin_file 339 340 chk_db_23: 341 0000026A AC lodsb 342 0000026B EBC5 jmp short chk_db_20 343 344 chk_db_24: 345 0000026D 3C0A cmp al, 0Ah 346 0000026F 7527 jne short chk_db_27 347 00000271 80FC0D cmp ah, 0Dh 348 00000274 7417 je short chk_db_26 349 00000276 80FC68 cmp ah, 'h' 350 ;je short chk_db_25 351 ;cmp ah, 'H' 352 00000279 0F85ED000000 jne chk_error 353 354 chk_db_25: 355 0000027F 88C4 mov ah, al 356 357 ;loop chk_db_7 358 00000281 49 dec ecx 359 00000282 0F8581FEFFFF jnz chk_db_7 360 361 00000288 E9DF000000 jmp chk_error 362 363 chk_db_26: 364 0000028D B400 mov ah, 0 365 366 ;loop chk_db_0 367 0000028F 49 dec ecx 368 00000290 0F85F8FDFFFF jnz chk_db_0 369 370 00000296 EB22 jmp short write_to_bin_file 371 372 chk_db_27: 373 00000298 3C0D cmp al, 0Dh 374 0000029A 750F jne short chk_db_28 375 0000029C 80FC0A cmp ah, 0Ah 376 0000029F 74EC je short chk_db_26 377 000002A1 80FC68 cmp ah, 'h' 378 ;je short chk_db_25 379 ;cmp ah, 'H' 380 000002A4 74D9 je short chk_db_25 381 382 000002A6 E9C1000000 jmp chk_error 383 384 chk_db_28: 385 000002AB 3C09 cmp al, 09h ; TAB key 386 000002AD 0F85B9000000 jne chk_error 387 388 ;loop chk_db_7 389 390 000002B3 49 dec ecx 391 000002B4 0F854FFEFFFF jnz chk_db_7 392 393 ;jmp short write_to_bin_file 394 395 write_to_bin_file: 396 000002BA B9[80040000] mov ecx, BUFFER 397 000002BF 030D[7C040000] add ecx, [fsize] 398 000002C5 39CF cmp edi, ecx 399 000002C7 0F869F000000 jna chk_error ; ZERO file size 400 401 000002CD E8AD000000 call print_msg_ok 402 403 000002D2 89CA mov edx, ecx ; 1st byte of converted data 404 405 create_bin_file: 406 sys _creat, bin_file, 0 ; create (normal) file 406 <1> 406 <1> 406 <1> 406 <1> 406 <1> %if %0 >= 2 406 000002D4 BB[6A040000] <1> mov ebx, %2 406 <1> %if %0 >= 3 406 000002D9 B900000000 <1> mov ecx, %3 406 <1> %if %0 = 4 406 <1> mov edx, %4 406 <1> %endif 406 <1> %endif 406 <1> %endif 406 000002DE B808000000 <1> mov eax, %1 406 <1> 406 000002E3 CD40 <1> int 40h 407 000002E5 725E jc short create_error 408 409 000002E7 A3[78040000] mov [fhandle], eax 410 411 000002EC C605[75040000]0B mov byte [color], 0Bh ; Light Cyan 412 000002F3 BE[57040000] mov esi, msg_writing 413 000002F8 E88E000000 call print_msg 414 415 000002FD 29D7 sub edi, edx ; file size 416 ; edx = start address of the text 417 418 sys _write, [fhandle], edx, edi ; write to 'DB2BIN.BIN' 418 <1> 418 <1> 418 <1> 418 <1> 418 <1> %if %0 >= 2 418 000002FF 8B1D[78040000] <1> mov ebx, %2 418 <1> %if %0 >= 3 418 00000305 89D1 <1> mov ecx, %3 418 <1> %if %0 = 4 418 00000307 89FA <1> mov edx, %4 418 <1> %endif 418 <1> %endif 418 <1> %endif 418 00000309 B804000000 <1> mov eax, %1 418 <1> 418 0000030E CD40 <1> int 40h 419 00000310 724D jc short rw_error ; disk write (or free space) error 420 421 00000312 E868000000 call print_msg_ok 422 423 sys _close, [fhandle] ; close file 423 <1> 423 <1> 423 <1> 423 <1> 423 <1> %if %0 >= 2 423 00000317 8B1D[78040000] <1> mov ebx, %2 423 <1> %if %0 >= 3 423 <1> mov ecx, %3 423 <1> %if %0 = 4 423 <1> mov edx, %4 423 <1> %endif 423 <1> %endif 423 <1> %endif 423 0000031D B806000000 <1> mov eax, %1 423 <1> 423 00000322 CD40 <1> int 40h 424 425 00000324 C605[75040000]07 mov byte [color], 07h ; Light Gray (Default Color) 426 0000032B BE[1F040000] mov esi, nextline 427 00000330 EB05 jmp short print_nl 428 429 prg_msg: 430 00000332 BE[A9030000] mov esi, msg_program 431 print_nl: 432 00000337 E84F000000 call print_msg 433 terminate: 434 sys _exit ; INT 40h 434 <1> 434 <1> 434 <1> 434 <1> 434 <1> %if %0 >= 2 434 <1> mov ebx, %2 434 <1> %if %0 >= 3 434 <1> mov ecx, %3 434 <1> %if %0 = 4 434 <1> mov edx, %4 434 <1> %endif 434 <1> %endif 434 <1> %endif 434 0000033C B801000000 <1> mov eax, %1 434 <1> 434 00000341 CD40 <1> int 40h 435 here: 436 00000343 EBFE jmp short here 437 438 create_error: 439 00000345 BE[0C040000] mov esi, msg_create_error 440 0000034A EB05 jmp short open_create_error 441 open_error: 442 0000034C BE[F8030000] mov esi, msg_open_error 443 open_create_error: 444 00000351 C605[75040000]0C mov byte [color], 0Ch ; Light Red 445 00000358 E82E000000 call print_msg ; INT 31h 446 0000035D EBDD jmp short terminate 447 448 rw_error: 449 sys _close, [fhandle] ; close file 449 <1> 449 <1> 449 <1> 449 <1> 449 <1> %if %0 >= 2 449 0000035F 8B1D[78040000] <1> mov ebx, %2 449 <1> %if %0 >= 3 449 <1> mov ecx, %3 449 <1> %if %0 = 4 449 <1> mov edx, %4 449 <1> %endif 449 <1> %endif 449 <1> %endif 449 00000365 B806000000 <1> mov eax, %1 449 <1> 449 0000036A CD40 <1> int 40h 450 chk_error: 451 0000036C C605[75040000]0C mov byte [color], 0Ch ; Light Red 452 00000373 BE[22040000] mov esi, msg_error 453 00000378 E80E000000 call print_msg ; INT 31h 454 0000037D EBBD jmp short terminate 455 456 print_msg_ok: 457 0000037F C605[75040000]0A mov byte [color], 0Ah ; Light Green 458 00000386 BE[65040000] mov esi, msg_ok 459 print_msg: 460 0000038B 0FB61D[75040000] movzx ebx, byte [color] ; text color (bl) 461 ; video page 0 (bh) 462 00000392 B40E mov ah, 0Eh ; teletype output (write tty) 463 00000394 AC lodsb 464 _p_nextchar: 465 00000395 CD31 int 31h 466 00000397 AC lodsb 467 00000398 20C0 and al, al 468 0000039A 75F9 jnz short _p_nextchar 469 0000039C C3 retn 470 471 calc_number: 472 ; AL = numeric character 473 0000039D 3C39 cmp al, '9' 474 0000039F 7703 ja short calc_num1 475 000003A1 2C30 sub al, '0' 476 000003A3 C3 retn 477 calc_num1: 478 000003A4 24DF and al, 0DFh ; convert to capital letter 479 000003A6 2C37 sub al, 'A'-10 480 000003A8 C3 retn 481 482 483 ;----------------------------------------------------------------- 484 ; messages 485 ;----------------------------------------------------------------- 486 487 msg_program: 488 000003A9 0D0A db 0Dh, 0Ah 489 000003AB 44423242494E2E5052- db "DB2BIN.PRG /// TRDOS 386 syswrite test program" 489 000003B4 47202F2F2F20545244- 489 000003BD 4F5320333836207379- 489 000003C6 737772697465207465- 489 000003CF 73742070726F677261- 489 000003D8 6D 490 000003D9 0D0A db 0Dh, 0Ah 491 000003DB 6279204572646F6761- db "by Erdogan Tan, 05/11/2016", 0Dh, 0Ah, 0 491 000003E4 6E2054616E2C203035- 491 000003ED 2F31312F323031360D- 491 000003F6 0A00 492 493 msg_open_error: 494 000003F8 0D0A db 0Dh, 0Ah 495 000003FA 7379736F70656E2065- db 'sysopen error !' 495 00000403 72726F722021 496 00000409 0D0A00 db 0Dh, 0Ah, 0 497 498 msg_create_error: 499 0000040C 0D0A db 0Dh, 0Ah 500 0000040E 737973637265617465- db 'syscreate error !' 500 00000417 206572726F722021 501 nextline: 502 0000041F 0D0A00 db 0Dh, 0Ah, 0 503 504 msg_error: 505 00000422 4552524F522021200D- db 'ERROR ! ', 0Dh, 0Ah, 0 505 0000042B 0A00 506 507 msg_reading: 508 0000042D 0D0A db 0Dh, 0Ah 509 0000042F 52656164696E672E2E- db 'Reading... ', 0 509 00000438 2E2000 510 511 msg_checking: 512 0000043B 0D0A db 0Dh, 0Ah 513 0000043D 436865636B696E6720- db 'Checking & Converting... ', 0 513 00000446 2620436F6E76657274- 513 0000044F 696E672E2E2E2000 514 515 msg_writing: 516 00000457 0D0A db 0Dh, 0Ah 517 00000459 57726974696E672E2E- db 'Writing... ', 0 517 00000462 2E2000 518 519 msg_ok: 520 00000465 4F4B2E2000 db 'OK. ', 0 521 522 bin_file: 523 0000046A 44423242494E2E4249- db 'DB2BIN.BIN', 0 523 00000473 4E00 524 525 00000475 0F color: db 0Fh ; White 526 527 Digit1: 528 00000476 00 db 0 529 Digit2: 530 00000477 00 db 0 531 532 bss: 533 534 ABSOLUTE bss 535 536 alignb 4 537 538 00000478 fhandle: resd 1 539 0000047C fsize: resd 1 540 541 542 BUFFER: