fork download
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5.  
  6. #define true 1
  7. #define false 0
  8. typedef unsigned char Char;
  9.  
  10.  
  11. Char p[2000]; /* This is memory */
  12. int programLength;
  13. int littleEndian = true;
  14. int num_words;
  15.  
  16. int* eax;
  17. int* ecx;
  18. int* edx;
  19. int* ebx;
  20. int* esi;
  21. int* edi;
  22. int* esp;
  23. int* ebp;
  24.  
  25. int pc;
  26. int codes; /* status, condition codes[3]; control and status flags */
  27.  
  28. void setup()
  29. {
  30. /* get the file from arc */
  31. eax = malloc(sizeof(int*));
  32. ecx = malloc(sizeof(int*));
  33. edx = malloc(sizeof(int*));
  34. ebx = malloc(sizeof(int*));
  35. esi = malloc(sizeof(int*));
  36. edi = malloc(sizeof(int*));
  37. esp = malloc(sizeof(int*));
  38. ebp = malloc(sizeof(int*));
  39. *eax = *ecx = *edx = *ebx = *esi = *edi = *esp = *ebp = pc = 0;
  40. printf("setup done");
  41. }
  42. Char aToH(Char x)
  43. {
  44. if(x > '/' && x < ':')
  45. x=(Char) (x-48);
  46. else
  47. {
  48. if(x>'`' && x<'g')
  49. x=(Char) (x-87);
  50. }
  51. return x;
  52. }
  53.  
  54. int FASCII(Char z[])
  55. {
  56. int b=0;
  57. programLength=0;
  58. if(*z=='\0')
  59. {
  60. printf("NO CHARS\n");
  61. return 1;
  62. }
  63. else
  64. {
  65. for(int a=0; z[a]!='\0'; a++)
  66. {
  67. Char s=aToH(z[a]);
  68. Char t=aToH(z[a+1]);
  69. p[b]=(Char) (s << 4|t);
  70. printf("%x ", p[b] & 0xff);
  71. a++;
  72. b++;
  73. }
  74. programLength = b;
  75. }
  76. printf("\n");
  77. return 0;
  78. }
  79.  
  80. /* Zero flag operations */
  81. void setZF()
  82. {
  83. codes = codes | 64; /* sets the 01000000 flag */
  84. printf(" ZF flag set");
  85. }
  86.  
  87.  
  88. void clearZF()
  89. {/* clears 10111111 flag */
  90. // if set, clear
  91. // if clear, clear
  92. codes= codes & 64;
  93. }
  94.  
  95. int getZF()
  96. {
  97. if((codes & 63) == 64)
  98. return 1;
  99. return 0;
  100. }
  101.  
  102.  
  103.  
  104. /* Sign Flag operations */
  105. void setSF()
  106. {
  107. codes = codes | 32; /* sets the 00100000 flag */
  108. printf(" SF flag set");
  109. }
  110.  
  111. void clearSF()
  112. {
  113. codes = codes & 32;
  114. }
  115.  
  116. void clearOF()
  117. {
  118. codes = codes & 16;
  119. }
  120.  
  121. void clearFlags()
  122. {
  123. clearSF();
  124. clearZF();
  125. clearOF();
  126. }
  127.  
  128. int getSF()
  129. {
  130. if((codes & 32) == 32)
  131. return 1;
  132. return 0;
  133. }
  134.  
  135. /* Overflow flag operations */
  136. void setOF()
  137. {
  138. codes = codes | 16; /* sets the 00010000 flag */
  139. printf(" OF flag set");
  140. }
  141.  
  142.  
  143.  
  144. int getOF()
  145. {
  146. if((codes & 16) == 16 )
  147. return 1;
  148. return 0;
  149. }
  150.  
  151. void clearStatus()
  152. {
  153. codes = codes & (255 - 15); /* 11110000 - clears last four bits */
  154. }
  155.  
  156. /* Status code operations (last four bits) */
  157. void setAOK()
  158. {
  159. clearStatus();
  160. codes = codes | 1; /* sets 00000001 */
  161. printf(" set status = AOK");
  162. }
  163.  
  164. void setHLT()
  165. {
  166. clearStatus();
  167. codes = codes | 2; /* sets 00000010 */
  168. printf(" set status = HLT");
  169. }
  170.  
  171. void setADR()
  172. {
  173. clearStatus();
  174. codes = codes | 3; /* sets 00000011 */
  175. printf(" set status = ADR");
  176. }
  177.  
  178. void setINS()
  179. {
  180. clearStatus();
  181. codes = codes | 4; /* sets 00000010 */
  182. printf(" set status = INS");
  183. }
  184.  
  185. int getStatus()
  186. {
  187. return codes & 0xf0;
  188. }
  189.  
  190. /*
  191.  * Prints out the values of the registers */
  192. void printRegisters()
  193. {
  194. printf("\teax: %x, ", *eax);
  195. printf("ecx: %x, ", *ecx);
  196. printf("edx: %x, ", *edx);
  197. printf("ebx: %x, ", *ebx);
  198. printf("esi: %x, ", *esi);
  199. printf("edi: %x, ", *edi);
  200. printf("esp: %x, ", *esp);
  201. printf("ebp: %x, ", *ebp);
  202. printf("PC: %x, ", pc);
  203. }
  204.  
  205. /* Generates an error then exits the program */
  206. void error(Char words[], int pc)
  207. {
  208. for(int a=0; words[a] != '\0'; a++)
  209. printf("%c", words[a]);
  210. exit(0);
  211. }
  212.  
  213. /* Assembly instructions */
  214. /**
  215.  * halt 00
  216.  */
  217. void halt()
  218. {
  219. printf("halt");
  220. setHLT();
  221. pc+=1;
  222. printRegisters();
  223. exit(0);
  224. }
  225.  
  226.  
  227. /**
  228.  * nop 10
  229.  */
  230. void nop()
  231. {
  232. printf("nop");
  233. pc+=1;
  234. }
  235.  
  236.  
  237. /**
  238.  ** Gets an integer value from four chars ( based on big * endian or little
  239.  * endian encoding)
  240.  *
  241.  */
  242. int getVal(Char a, Char b, Char c, Char d)
  243. {
  244. int val;
  245. if(littleEndian)
  246. {
  247. val=a;
  248. val=val | b << 8;
  249. val=val | c << 16;
  250. val=val | d << 32;
  251. }
  252. else
  253. {
  254. val=a;
  255. val=val | b << 4;
  256. val=val | c << 8;
  257. val=val | d << 16;
  258. }
  259. return val;
  260. }
  261.  
  262. /*
  263. Computes the register from the first part of the Char
  264. passed in. Returns a pointer to the register given
  265. character code as input.
  266. 0 eax; 1 ecx; 2 edx; 3 ebx
  267. 4 esp; 5ebp; 7 edi
  268. F No register
  269.  */
  270. int* r1(Char a)
  271. {
  272. switch(a & 0xf0)
  273. {
  274. case 0x00:
  275. return eax;
  276. case 0x10:
  277. return ecx;
  278. case 0x20:
  279. return edx;
  280. case 0x30:
  281. return ebx;
  282. case 0x40:
  283. return esp;
  284. case 0x50:
  285. return ebp;
  286. case 0x60:
  287. return esi;
  288. case 0x70:
  289. return edi;
  290. default:
  291. printf("Error determining register value. pc=%x", pc);
  292. }
  293. return eax; /* shouldn't be hit */
  294. }
  295.  
  296.  
  297. /*
  298. Computes the register from the second part of the Char
  299. passed in. Returns a pointer to the register given
  300. character code as input.
  301. 0 eax; 1 ecx; 2 edx; 3 ebx
  302. 4 esp; 5 ebp; 6 esi; 7 edi
  303. F No register
  304.  */
  305. int* r2(Char a)
  306. {
  307. switch(a & 0x0f)
  308. {
  309. case 0x00:
  310. return eax;
  311. case 0x01:
  312. return ecx;
  313. case 0x02:
  314. return edx;
  315. case 0x03:
  316. return ebx;
  317. case 0x04:
  318. return esp;
  319. case 0x05:
  320. return ebp;
  321. case 0x06:
  322. return esi;
  323. case 0x07:
  324. return edi;
  325. default:
  326. printf("Error determining register value. pc=%x", pc);
  327. }
  328. return eax; /* shouldn't be hit */
  329. }
  330.  
  331.  
  332. /**
  333.  * rrmov1 rA, rB 20 rArB
  334.  */
  335. void rrmov1(Char reg)
  336. {
  337. int* src = r1(reg);
  338. int* dst = r2(reg);
  339. *dst = *src;
  340. printf("rrmov1 %s, %s: (%x)", src, dst, *dst);
  341. pc+=2;
  342. }
  343.  
  344. /**
  345.  * cmov1e rA, rB 21 rArB
  346.  */
  347. void cmov1e(Char reg)
  348. {
  349. int* src = r1(reg);
  350. int* dst = r2(reg);
  351. if(getZF() ==1 || getSF() != getOF())
  352. {
  353. *dst = *src;
  354. printf("cmov1e %s, %s: (%x moved)", src, dst, *dst);
  355. }
  356. else
  357. printf("cmov1e %s, %s: (%x not moved)", src, dst, *dst);
  358. pc+=2;
  359. }
  360.  
  361. /**
  362.  * cmov1 rA, rB 22 rArB
  363.  */
  364. void cmov1(Char reg)
  365. {
  366. int* src = r1(reg);
  367. int* dst = r2(reg);
  368. if(getSF() != getOF())
  369. {
  370. *dst = *src;
  371. printf("cmov1 %s, %s: (%x moved)", src, dst, *dst);
  372. }
  373. else
  374. printf("cmov1 %s, %s: (%x not moved)", src, dst, *dst);
  375. pc+=2;
  376. }
  377.  
  378. /**
  379.  * cmove rA, rB 23 rArB
  380.  */
  381. void cmove(Char reg)
  382. {
  383. int* src = r1(reg);
  384. int* dst = r2(reg);
  385. if(getZF() ==1)
  386. {
  387. *dst = *src;
  388. printf("cmove %s, %s: (%x moved)", src, dst, *dst);
  389. }
  390. else
  391. printf("cmove %s, %s: (%x not moved)", src, dst, *dst);
  392. pc+=2;
  393. }
  394.  
  395. /**
  396.  * cmovne rA, rB 24 rArB
  397.  */
  398. void cmovne(Char reg)
  399. {
  400. int* src = r1(reg);
  401. int* dst = r2(reg);
  402. if(getZF() == 0)
  403. {
  404. *dst = *src;
  405. printf("cmovne %s, %s: (%x moved)", src, dst, *dst);
  406. }
  407. else
  408. printf("cmovne %s, %s: (%x not moved)", src, dst, *dst);
  409. pc+=2;
  410. }
  411.  
  412. /**
  413.  * cmovge rA, rB 21 5ArB
  414.  */
  415. void cmovge(Char reg)
  416. {
  417. int* src = r1(reg);
  418. int* dst = r2(reg);
  419. if(getSF() == getZF())
  420. {
  421. dst = src;
  422. printf("cmovge %s, %s: (%x moved)", src, dst, *dst);
  423. }
  424. else
  425. printf("cmovge %s, %s: (%x not moved)", src, dst, *dst);
  426. pc+=2;
  427. }
  428.  
  429. /**
  430.  * cmovg rA, rB 26 rArB
  431.  */
  432. void cmovg(Char reg)
  433. {
  434. int* src = r1(reg);
  435. int* dst = r2(reg);
  436. if(getSF() ==0 || getZF() == 0)
  437. {
  438. dst = src;
  439. printf("cmovg %s, %s: (%x moved)", src, dst, *dst);
  440. }
  441. else
  442. printf("cmovg %s, %s: (%x not moved)", src, dst, *dst);
  443. pc+=2;
  444. }
  445.  
  446. /**
  447.  * irmov1 V, rb 30 FrB Va Vb Vc Vd
  448.  */
  449. void irmov1(int val, Char reg)
  450. {
  451. int* rB = r2(reg);
  452. *rB = val;
  453. printf("irmov1 %s, %x", rB, *rB & 0xffff);
  454. pc+=6;
  455. }
  456.  
  457. /**
  458.  * rmmov1 rA, D(rB) 40 rArB Da Db Dc Dd
  459.  */
  460. void rmmov1(Char reg, int offset)
  461. {
  462. int* rA = r1(reg);
  463. int* rB = r2(reg);
  464. loadVal(*rA, *rB + offset);
  465. printf("rmmov1 %s, %x(%x)", rA, offset & 0xffff, *rB & 0xffff);
  466. pc+=6;
  467. }
  468.  
  469. /**
  470.  * mrmov1 D(rB), rA 50 rArB Da Db Dc Dd
  471.  */
  472. void mrmov1(Char reg, int offset)
  473. {
  474. int* rA = r1(reg);
  475. int* rB = r2(reg);
  476. *rA = p[*rB + offset];
  477. printf("mrmov1 %x(%s), %s: (%x)", offset & 0xffff, rB, rA, *rA);
  478. pc+=6;
  479. }
  480.  
  481. /**
  482.  * add1 rA, rB 60 rArB
  483.  */
  484. void add1(Char reg)
  485. {
  486. int* src = r1(reg);
  487. int* dst = r2(reg);
  488. int* tmp = *dst;
  489. *dst = *dst + *src;
  490. printf("add1 %s, %s: (%x)", dst, src, *dst);
  491. setFlags(*tmp, *src, *dst);
  492. pc+=2;
  493. }
  494.  
  495. /**
  496.  * sub1 rA, rB 61 rArB
  497.  */
  498. void sub1(Char reg)
  499. {
  500. int* src = r1(reg);
  501. int* dst = r2(reg);
  502. int* tmp = *dst;
  503. *dst = *dst - *src;
  504. printf("sub1 %s, %s: (%x)", dst, src, *dst);
  505. pc+=2;
  506. }
  507.  
  508. /**
  509.  * and1 rA, rB 62 rArB
  510.  */
  511. void and1(Char reg)
  512. {
  513. int *src = r1(reg);
  514. int *dst = r2(reg);
  515. int *tmp = dst;
  516. *dst = *dst & *src;
  517. printf("and1 %s, %s: (%x)", dst, src, *dst);
  518. setFlags(*tmp, *src, *dst);
  519. pc+=2;
  520. }
  521.  
  522. /**
  523.  * xor1 rA, rB 63 rArB
  524.  */
  525. void xor1(Char reg)
  526. {
  527. int *src = r1(reg);
  528. int *dst = r2(reg);
  529. int *tmp = dst;
  530. *dst = *dst ^ *src;
  531. printf("xor1 %s, %s: (%x)", dst, src, *dst);
  532. setFlags(*tmp, *src, *dst);
  533. pc+=2;
  534. }
  535.  
  536. /**
  537.  * jmp Dest 70 Da Db Dc Dd
  538.  */
  539. void jmp(int dest)
  540. {
  541. printf("jmp %x", dest);
  542. pc=dest;
  543. printf(" (pc=%x)", dest);
  544. pc+=5;
  545. }
  546.  
  547. /**
  548.  * j1e Dest 71 Da Db Dc Dd
  549.  */
  550. void j1e(int dest)
  551. {
  552. printf("j1e %x", dest);
  553. if(getZF()==1 || getSF()!=getOF())
  554. {
  555. pc=dest;
  556. printf(" (pc=%x)", dest);
  557. }
  558. else
  559. {
  560. printf(" (no)");
  561. pc+=5;
  562. }
  563. }
  564.  
  565. /**
  566.  * j1 Dest 72 Da Db Dc Dd
  567.  */
  568. void j1(int dest)
  569. {
  570. printf("j1 %x", dest);
  571. if(getZF()!=getOF())
  572. {
  573. pc=dest;
  574. printf(" (pc=%x)", dest);
  575. }
  576. else
  577. {
  578. printf(" (no)");
  579. pc+=5;
  580. }
  581. }
  582.  
  583. /**
  584.  * je Dest 73 Da Db Dc Dd
  585.  */
  586. void je(int dest)
  587. {
  588. printf("je %x", dest);
  589. if(getZF()==1)
  590. {
  591. pc=dest;
  592. printf(" (tak)");
  593. }
  594. else
  595. {
  596. printf(" (no)");
  597. pc+=5;
  598. }
  599. }
  600.  
  601. /**
  602.  * jne Dest 74 Da Db Dc Dd
  603.  */
  604. void jne(int dest)
  605. {
  606. printf("jne %x", dest);
  607. if(getZF()==0)
  608. {
  609. pc=dest;
  610. printf(" (pc=%x)", pc & 0xff);
  611. }
  612. else
  613. {
  614. printf(" (not taken)");
  615. pc+=5;
  616. }
  617. }
  618.  
  619. /**
  620.  * jge Dest 75 Da Db Dc Dd
  621.  */
  622. void jge(int dest)
  623. {
  624. printf("jge %x", dest);
  625. if(getZF()==getSF())
  626. {
  627. pc=dest;
  628. printf(" (pc=%x)", dest);
  629. }
  630. else
  631. {
  632. printf(" (no)");
  633. pc+=5;
  634. }
  635. }
  636.  
  637. /**
  638.  * jg Dest 76 Da Db Dc Dd
  639.  */
  640. void jg(int dest)
  641. {
  642. printf("jg %x", dest);
  643. if(getZF()==0 && getSF()==0)
  644. {
  645. pc=dest;
  646. printf(" (pc=%x)", dest);
  647. }
  648. else
  649. {
  650. printf(" (no)");
  651. pc+=5;
  652. }
  653. }
  654.  
  655. /**
  656. * call 80 Da Db Dc Dd
  657. */
  658. void call(int addr)
  659. {
  660. printf("call %x", addr);
  661. /* make entry on stack */
  662. /* push old pc onto stack */
  663. doPsh(pc);
  664. pc=addr;
  665. }
  666.  
  667. /* ret 90 */
  668. void ret()
  669. {
  670. printf("ret");
  671. pc=p[*esp];
  672. *esp=*esp+0x4; /* restore pc from stack */
  673. pc+=5; /* for how many chars it took to call */
  674. }
  675.  
  676. void doPsh(int val)
  677. {
  678. *esp=*esp-4; /* make entry on the stack */
  679. loadVal(val, *esp);
  680. }
  681.  
  682. /* push1 rA A0 rAF */
  683. void push1(Char reg)
  684. {
  685. int *rA = r1(reg);
  686. printf("push1 %x", *rA);
  687. pc+=2;
  688. doPsh(*rA);
  689. }
  690.  
  691. void loadVal(int val, int addr)
  692. {
  693. p[addr] = (Char) (val & 0xf000);
  694. p[addr+1] = (Char) (val & 0x0f00);
  695. p[addr+2] = (Char) (val & 0x00f0);
  696. p[addr+3] = (Char) (val & 0x000f);
  697. }
  698.  
  699. /* pop1 rA B0 rAF */
  700. void pop1(Char reg)
  701. {
  702. int *rA=r1(reg);
  703. *rA=p[*esp]; /* pull top stack value into rA */
  704. *esp=*esp+0x4; /* remove entry from the stack */
  705. printf("pop1 %s %x", rA, *rA);
  706. pc+=2;
  707. }
  708.  
  709. int printMemory(int start)
  710. {
  711. int words_on_screen = 1000;
  712. for(int i=start; i< start+words_on_screen; i++)
  713. {
  714. if(i==(0%4))
  715. printf(" ");
  716. printf("%x\t", p[i]);
  717. }
  718. return 0;
  719. }
  720.  
  721. /* Decodes the string of Char-sized characters and executes them */
  722. int decode(Char p[])
  723. {
  724. /*
  725.   take the first Char
  726.   - determine how many operands
  727.   - call function with right operands
  728.   */
  729. for(pc=0; pc< programLength;)
  730. {
  731.  
  732. printf("\n0x%x:\t", pc & 0xff);
  733. switch(p[pc] & 0xf0)
  734. {
  735. case 0x00:
  736. {
  737. if((p[pc] & 0x0f) == 0x0)
  738. {
  739. printf("%x\t\t", p[pc]);
  740. halt();
  741. }
  742. else
  743. printf("Error interpreting halt at pc=%x", pc);
  744. break;
  745. }
  746. case 0x10:
  747. {
  748. if((p[pc] & 0x0f) == 0x0)
  749. {
  750. printf("%x\t\t", p[pc]);
  751. nop();
  752. }
  753. else
  754. printf("Error interpreting nop at pc=%x", pc);
  755. break;
  756. }
  757. case 0x20:
  758. {
  759. printf("%x %x \t\t", p[pc] & 0xff, p[pc+1] & 0xff);
  760. Char reg=p[pc+1];
  761. /* 1=4, mov
  762.   rrmov1 rA, rb 20 rArB
  763.   cmov1e rA, rb 21 rArB
  764.   cmov1 rA, rb 22 rArB
  765.   cmove rA, rb 23 rArB
  766.   cmovne rA, rb 24 rArB
  767.   cmovge rA, rb 25 rArB
  768.   cmovg rA, rb 26 rArB
  769.   */
  770. switch(p[pc] & 0x0f)
  771. {
  772. case 0x0:
  773. rrmov1(reg);
  774. break;
  775. case 0x1:
  776. cmov1e(reg);
  777. break;
  778. case 0x2:
  779. cmov1(reg);
  780. break;
  781. case 0x3:
  782. cmove(reg);
  783. break;
  784. case 0x4:
  785. cmovne(reg);
  786. break;
  787. case 0x5:
  788. cmovge(reg);
  789. break;
  790. case 0x6:
  791. cmovg(reg);
  792. break;
  793. default:
  794. setINS();
  795. printf("Error interpretinf mov at pc=%x", pc);
  796. break;
  797. }
  798. break;
  799. }
  800. case 0x30:
  801. {
  802. /* l=8, irmov1 */
  803. /* irmov1 V,rb 30 FrB V[4] */
  804. if((p[pc] & 0x0f) == 0x0)
  805. {
  806. printf("%x %x %x %x %x %x\t",
  807. p[pc] & 0xff,
  808. p[pc+1] && 0xff,
  809. p[pc+2] && 0xff,
  810. p[pc+3] && 0xff,
  811. p[pc+4] && 0xff,
  812. p[pc+5] && 0xff);
  813. int val=getVal(p[pc+2], p[pc+3], p[pc+4], p[pc+5]);
  814. Char reg=p[pc+1];
  815. irmov1(val, reg);
  816. }
  817. else
  818. {
  819. setINS();
  820. printf("Error interpreting irmov1 at pc=%x", pc);
  821. }
  822. break;
  823. }
  824. case 0x40:
  825. {
  826. /* 1=8, rmmov1 */
  827. /* rmmov1 rA, D(rB) 40 rArB D[4] */
  828. if((p[pc] & 0x0f) == 0x0)
  829. {
  830. printf("%x %x %x %x %x %x\t", p[pc] & 0xff, p[pc+1] & 0xff,
  831. p[pc+2] & 0xff, p[pc+3], p[pc+4], p[pc+5]);
  832. int data=getVal(p[pc+2], p[pc+3], p[pc+4], p[pc+5]);
  833. rmmov1(p[pc+1], data);
  834. }
  835. else
  836. {
  837. setINS();
  838. printf("Error interpreting rrmov1 at pc=%x", pc);
  839. }
  840. break;
  841. }
  842. case 0x50:
  843. {
  844. /* 1=8, mrmov1 */
  845. /* mrmov1 D(rB), rA 50 rArB D[4] */
  846. if((p[pc] & 0x0f) == 0x0)
  847. {
  848. printf("%x %x %x %x %x %x\t", p[pc] & 0xff, p[pc+1] & 0xff,
  849. p[pc+2] & 0xff, p[pc+3] & 0xff, p[pc+4] & 0xff, p[pc+5] & 0xff);
  850. int data=getVal(p[pc+2], p[pc+3], p[pc+4], p[pc+5]);
  851. mrmov1(p[pc+1], data);
  852. }
  853. else
  854. {
  855. setINS();
  856. printf("Error interpreting mrmov1 at pc=%x", pc);
  857. }
  858. break;
  859. }
  860. case 0x60:
  861. {
  862. printf("%x %x \t\t", p[pc] & 0xff, p[pc+1] & 0xff);
  863. Char reg=p[pc+1];
  864. /* 1=4, op */
  865. /*
  866.   add1 rA, rB 60 rArB
  867.   sub1 rA, rB 61 rArB
  868.   and1 rA, rB 62 rArB
  869.   xor1 rA, rB 63 rArB
  870.   */
  871. switch(p[pc] & 0x0f)
  872. {
  873. case 0x0:
  874. add1(reg);
  875. break;
  876. case 0x1:
  877. sub1(reg);
  878. break;
  879. case 0x2:
  880. and1(reg);
  881. break;
  882. case 0x3:
  883. xor1(reg);
  884. break;
  885. default:
  886. setINS();
  887. printf("Problem parsing op at pc=%x", pc);
  888. break;
  889. }
  890. break;
  891. }
  892. case 0x70:
  893. {
  894. /* 1=8, jmps */
  895. printf("%x %x %x %x %x\t", p[pc] & 0xff, p[pc+1] & 0xff,
  896. p[pc+2] & 0xff, p[pc+3] & 0xff, p[pc+4] & 0xff);
  897. int dest=getVal(p[pc+1], p[pc+2], p[pc+3], p[pc+4]);
  898. /*
  899.   jmp Dest 70 Dest[4]
  900.   j1e Dest 71 Dest[4]
  901.   j1 Dest 72 Dest[4]
  902.   je Dest 73 Dest[4]
  903.   jne Dest 74 Dest[4]
  904.   jge Dest 75 Dest[4]
  905.   jg Dest 76 Dest[4]
  906.   */
  907. switch(p[pc] & 0x0f)
  908. {
  909. case 0x0:
  910. jmp(dest);
  911. break;
  912. case 0x1:
  913. j1e(dest);
  914. break;
  915. case 0x2:
  916. j1(dest);
  917. break;
  918. case 0x3:
  919. je(dest);
  920. break;
  921. case 0x4:
  922. jne(dest);
  923. break;
  924. case 0x5:
  925. jge(dest);
  926. break;
  927. case 0x6:
  928. jg(dest);
  929. break;
  930. default:
  931. setINS();
  932. printf("Error interpreting jump at pc=%x", pc);
  933. break;
  934. }
  935. break;
  936. }
  937. case 0x80:
  938. {
  939. /* 1=8, call */
  940. /* call 80 Dest[4] */
  941. if((p[pc] & 0x0f) == 0x0)
  942. {
  943. printf("%x %x %x %x %x\t", p[pc] & 0xff, p[pc+1] & 0xff,
  944. p[pc+2] & 0xff, p[pc+3] & 0xff, p[pc+4] & 0xff);
  945. int dest=getVal(p[pc+1], p[pc+2], p[pc+3], p[pc+4]);
  946. call(dest);
  947. }
  948. else
  949. {
  950. setINS();
  951. printf("Error interpreting call at pc=%x", pc);
  952. }
  953. break;
  954. }
  955. case 0x90:
  956. {
  957. /* 1=2, ret */
  958. /* ret 90 */
  959. if((p[pc] & 0x0f) == 0x0)
  960. {
  961. printf("%x \t\t", p[pc] & 0xff);
  962. ret();
  963. }
  964. else
  965. {
  966. setINS();
  967. printf("Error interpreting ret at pc=%x", pc);
  968. }
  969. break;
  970. }
  971. case 0xa0:
  972. {
  973. /* 1=4, push */
  974. /* push1 rA A0 rAF */
  975. if((p[pc] & 0x0f) == 0x0)
  976. {
  977. printf("%x %x \t\t", p[pc] & 0xff, p[pc+1] & 0xff);
  978. push1((Char) (p[pc+1] & 0xf0));
  979. }
  980. else
  981. {
  982. setINS();
  983. printf("Error interpreting push1 at pc=%x", pc);
  984. }
  985. break;
  986. }
  987. case 0xb0:
  988. {
  989. /* 1=4, pop1 */
  990. /* pop1 rA B0 rAF */
  991. if((p[pc] & 0x0f) == 0x0)
  992. {
  993. printf("%x %x \t\t", p[pc] & 0xff, p[pc+1] & 0xff);
  994. pop1((Char)(p[pc+1] & 0xf0));
  995. }
  996. else
  997. {
  998. setINS();
  999. printf("Error interpreting pop1 at pc=%x", pc);
  1000. }
  1001. break;
  1002. }
  1003. default:
  1004. {
  1005. setINS();
  1006. printf("Error interpreting instruction at pc=%x", pc);
  1007. }
  1008. }
  1009. }
  1010. printRegisters();
  1011. return 0;
  1012. }
  1013.  
  1014. void setFlags(int a, int b, int result)
  1015. {
  1016. clearFlags();
  1017. if (result == 0)
  1018. setZF();
  1019. if (result < 0)
  1020. setSF();
  1021. if (((a & 128) == 128 && (b & 128) == 128 & (result & 128) == 0) ||
  1022. ((a & 128) == 0 && (b & 128) == 0 & (result & 128) == 128))
  1023. setOF();
  1024. }
  1025.  
  1026. /* Program start */
  1027. int main(int argv, char* argc[])
  1028. {
  1029.  
  1030. for(int p=1; p<argv; p++)
  1031. printf("%s", argc[p]);
  1032.  
  1033. setup();
  1034.  
  1035. if(argv<1)
  1036. printf("Enter the name:");
  1037. else
  1038. {
  1039.  
  1040. FILE *fp;
  1041. Char *buf;
  1042. long fLen;
  1043.  
  1044. fp = fopen(argc[1], "rb");
  1045. fseek(fp, 0, SEEK_END);
  1046. fLen = ftell(fp);
  1047. rewind(fp);
  1048. buf = (Char *)malloc((fLen+1)*sizeof(Char));
  1049. fread(buf, fLen, 1, fp);
  1050. fclose(fp);
  1051.  
  1052. FASCII(buf);
  1053.  
  1054. decode(buf);*/
  1055. }
  1056. return 0;
  1057. }
  1058.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
testing
compilation info
prog.c: In function ‘getVal’:
prog.c:250:17: warning: left shift count >= width of type [-Wshift-count-overflow]
     val=val | d << 32;
                 ^~
prog.c: In function ‘rrmov1’:
prog.c:340:19: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
   printf("rrmov1 %s, %s: (%x)", src, dst, *dst);
                   ^
prog.c:340:23: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
   printf("rrmov1 %s, %s: (%x)", src, dst, *dst);
                       ^
prog.c: In function ‘cmov1e’:
prog.c:354:21: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("cmov1e %s, %s: (%x moved)", src, dst, *dst);
                     ^
prog.c:354:25: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
     printf("cmov1e %s, %s: (%x moved)", src, dst, *dst);
                         ^
prog.c:357:25: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
         printf("cmov1e %s, %s: (%x not moved)", src, dst, *dst);
                         ^
prog.c:357:29: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
         printf("cmov1e %s, %s: (%x not moved)", src, dst, *dst);
                             ^
prog.c: In function ‘cmov1’:
prog.c:371:20: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("cmov1 %s, %s: (%x moved)", src, dst, *dst);
                    ^
prog.c:371:24: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
     printf("cmov1 %s, %s: (%x moved)", src, dst, *dst);
                        ^
prog.c:374:24: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
         printf("cmov1 %s, %s: (%x not moved)", src, dst, *dst);
                        ^
prog.c:374:28: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
         printf("cmov1 %s, %s: (%x not moved)", src, dst, *dst);
                            ^
prog.c: In function ‘cmove’:
prog.c:388:20: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("cmove %s, %s: (%x moved)", src, dst, *dst);
                    ^
prog.c:388:24: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
     printf("cmove %s, %s: (%x moved)", src, dst, *dst);
                        ^
prog.c:391:24: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
         printf("cmove %s, %s: (%x not moved)", src, dst, *dst);
                        ^
prog.c:391:28: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
         printf("cmove %s, %s: (%x not moved)", src, dst, *dst);
                            ^
prog.c: In function ‘cmovne’:
prog.c:405:21: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("cmovne %s, %s: (%x moved)", src, dst, *dst);
                     ^
prog.c:405:25: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
     printf("cmovne %s, %s: (%x moved)", src, dst, *dst);
                         ^
prog.c:408:25: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
         printf("cmovne %s, %s: (%x not moved)", src, dst, *dst);
                         ^
prog.c:408:29: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
         printf("cmovne %s, %s: (%x not moved)", src, dst, *dst);
                             ^
prog.c: In function ‘cmovge’:
prog.c:422:21: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("cmovge %s, %s: (%x moved)", src, dst, *dst);
                     ^
prog.c:422:25: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
     printf("cmovge %s, %s: (%x moved)", src, dst, *dst);
                         ^
prog.c:425:25: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
         printf("cmovge %s, %s: (%x not moved)", src, dst, *dst);
                         ^
prog.c:425:29: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
         printf("cmovge %s, %s: (%x not moved)", src, dst, *dst);
                             ^
prog.c: In function ‘cmovg’:
prog.c:439:20: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
     printf("cmovg %s, %s: (%x moved)", src, dst, *dst);
                    ^
prog.c:439:24: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
     printf("cmovg %s, %s: (%x moved)", src, dst, *dst);
                        ^
prog.c:442:24: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
         printf("cmovg %s, %s: (%x not moved)", src, dst, *dst);
                        ^
prog.c:442:28: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
         printf("cmovg %s, %s: (%x not moved)", src, dst, *dst);
                            ^
prog.c: In function ‘irmov1’:
prog.c:453:19: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
   printf("irmov1 %s, %x", rB, *rB & 0xffff);
                   ^
prog.c: In function ‘rmmov1’:
prog.c:464:3: warning: implicit declaration of function ‘loadVal’ [-Wimplicit-function-declaration]
   loadVal(*rA, *rB + offset);
   ^~~~~~~
prog.c:465:19: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
   printf("rmmov1 %s, %x(%x)", rA, offset & 0xffff, *rB & 0xffff);
                   ^
prog.c: In function ‘mrmov1’:
prog.c:477:22: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
   printf("mrmov1 %x(%s), %s: (%x)", offset & 0xffff, rB, rA, *rA);
                      ^
prog.c:477:27: warning: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int *’ [-Wformat=]
   printf("mrmov1 %x(%s), %s: (%x)", offset & 0xffff, rB, rA, *rA);
                           ^
prog.c: In function ‘add1’:
prog.c:488:14: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
   int* tmp = *dst;
              ^
prog.c:490:17: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
   printf("add1 %s, %s: (%x)", dst, src, *dst);
                 ^
prog.c:490:21: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
   printf("add1 %s, %s: (%x)", dst, src, *dst);
                     ^
prog.c:491:3: warning: implicit declaration of function ‘setFlags’ [-Wimplicit-function-declaration]
   setFlags(*tmp, *src, *dst);
   ^~~~~~~~
prog.c: In function ‘sub1’:
prog.c:502:14: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
   int* tmp = *dst;
              ^
prog.c:504:17: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
   printf("sub1 %s, %s: (%x)", dst, src, *dst);
                 ^
prog.c:504:21: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
   printf("sub1 %s, %s: (%x)", dst, src, *dst);
                     ^
prog.c:502:8: warning: unused variable ‘tmp’ [-Wunused-variable]
   int* tmp = *dst;
        ^~~
prog.c: In function ‘and1’:
prog.c:517:17: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
   printf("and1 %s, %s: (%x)", dst, src, *dst);
                 ^
prog.c:517:21: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
   printf("and1 %s, %s: (%x)", dst, src, *dst);
                     ^
prog.c: In function ‘xor1’:
prog.c:531:17: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
   printf("xor1 %s, %s: (%x)", dst, src, *dst);
                 ^
prog.c:531:21: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘int *’ [-Wformat=]
   printf("xor1 %s, %s: (%x)", dst, src, *dst);
                     ^
prog.c: In function ‘call’:
prog.c:663:3: warning: implicit declaration of function ‘doPsh’ [-Wimplicit-function-declaration]
   doPsh(pc);
   ^~~~~
prog.c: At top level:
prog.c:676:6: warning: conflicting types for ‘doPsh’
 void doPsh(int val)
      ^~~~~
prog.c:663:3: note: previous implicit declaration of ‘doPsh’ was here
   doPsh(pc);
   ^~~~~
prog.c:691:6: warning: conflicting types for ‘loadVal’
 void loadVal(int val, int addr)
      ^~~~~~~
prog.c:464:3: note: previous implicit declaration of ‘loadVal’ was here
   loadVal(*rA, *rB + offset);
   ^~~~~~~
prog.c: In function ‘pop1’:
prog.c:705:17: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int *’ [-Wformat=]
   printf("pop1 %s %x", rA, *rA);
                 ^
prog.c: At top level:
prog.c:1014:6: warning: conflicting types for ‘setFlags’
 void setFlags(int a, int b, int result)
      ^~~~~~~~
prog.c:491:3: note: previous implicit declaration of ‘setFlags’ was here
   setFlags(*tmp, *src, *dst);
   ^~~~~~~~
prog.c: In function ‘setFlags’:
prog.c:1021:45: warning: suggest parentheses around comparison in operand of ‘&’ [-Wparentheses]
         if (((a & 128) == 128 &&  (b & 128) == 128 &  (result & 128) == 0) ||
                                   ~~~~~~~~~~^~~~~~
prog.c:1022:45: warning: suggest parentheses around comparison in operand of ‘&’ [-Wparentheses]
             ((a & 128) == 0   &&  (b & 128) == 0   &  (result & 128) == 128))
                                   ~~~~~~~~~~^~~~
prog.c: In function ‘main’:
prog.c:1054:18: error: expected expression before ‘/’ token
     decode(buf);*/
                  ^
stdout
Standard output is empty