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