home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cbm / firmware / computers / plus4 / pla.c < prev    next >
C/C++ Source or Header  |  2002-07-02  |  3KB  |  118 lines

  1. /** pROGRAM TO CONVERT LOGIC EQUATIONS
  2.  * OF 16 INPUTS AND 8 OUTPUTS
  3.  * TO A 64-KILOBYTE TRUTH TABLE.
  4.  * @AUTHOR mARKO m{$e4}KEL{$e4} (mARKO.mAKELA@NIC.FUNET.FI)
  5.  * @DATE 2ND jULY 2002
  6.  *
  7.  * cOMPILATION:
  8.  *CC -O PLA PLA.C
  9.  * eXAMPLE USAGE:
  10.  *./PLA {$7c} DIFF - PLA-DUMP.BIN
  11.  * OR
  12.  *./PLA {$7c} OD -aX -T X1
  13.  * OR
  14.  *./PLA {$7c} CKSUM
  15.  * OR
  16.  *./PLA > PLA-DUMP.BIN
  17.  *
  18.  * tHE FOLLOWING pERL 5 CODE EXTRACTS OUTPUT f7 FROM A TRUTH TABLE DUMP:
  19.  * PERL -E 'UNDEF $/;$_=<>;S/(.)/CHR(ORD($1)&128)/GE;PRINT' < PLA-DUMP.BIN
  20.  *
  21.  * tO GENERATE ONLY SELECTED OUTPUTS WITH THIS PROGRAM,
  22.  * YOU MAY AS WELL COMMENT OUT SOME LINES IN THE MAIN FUNCTION.
  23.  */
  24.  
  25. #INCLUDE <STDIO.H>
  26.  
  27. /** eXTRACT AN INPUT BIT
  28.  * @PARAM BTHE BIT TO BE EXTRACTED
  29.  * @RETURNNONZERO IF THE INPUT BIT B IS SET
  30.  */
  31. #DEFINE i(B) (!!((I) & (1 << B)))
  32.  
  33. /** @NAME tHE INPUT SIGNALS OF THE PLUS/4 pla.
  34.  * bASED ON INFORMATION AT
  35.  * HTTP://WWW.FUNET.FI/PUB/CBM/FIRMWARE/COMPUTERS/PLUS4/PLA.TXT
  36.  * COMPOSED BY wILLIAM lEVAK. */
  37. /*@{$7b}*/
  38. #DEFINEi0_f7i(0)
  39. #DEFINE phi0i(1)
  40. #DEFINE a15i(2)
  41. #DEFINE a4i(3)
  42. #DEFINE a5i(4)
  43. #DEFINE a6i(5)
  44. #DEFINE a7i(6)
  45. #DEFINE a12i(7)
  46. #DEFINE muxi(8)
  47. #DEFINE a14i(9)
  48. #DEFINE a8i(10)
  49. #DEFINE a9i(11)
  50. #DEFINE a13i(12)
  51. #DEFINE a11i(13)
  52. #DEFINE a10i(14)
  53. #DEFINE ras_i(15)
  54. /*@{$7d}*/
  55.  
  56. /** @NAME tHE OUTPUT SIGNALS OF THE PLUS/4 pla.
  57.  * rEVERSE ENGINEERED FROM THE SCRATCH
  58.  * BY mARKO m{$e4}KEL{$e4} ON 2ND jULY 2002
  59.  * FROM A DUMP PROVIDED BY wILLIAM lEVAK.
  60.  * tHE EQUATIONS ARE IN DISJUNCTIVE NORMAL FORM (dnf).
  61.  * (aLL OTHERS EXCEPT i0_f7 ARE ALSO IN CONJUNCTIVE NORMAL FORM (cnf).)
  62.  * oPERATORS:!XNEGATION OF X: NOT X
  63.  * X {$7c}{$7c} YDISJUNCTION: X OR B
  64.  * X && YCONJUNCTION: X AND B
  65.  */
  66. /*@{$7b}*/
  67. /* UNUSED_0 WHEN 0111 011X 1001 011X */
  68. #DEFINE f0ras_ {$7c}{$7c} !a10 {$7c}{$7c} !a11 {$7c}{$7c} !a13 {$7c}{$7c} a9 {$7c}{$7c} !a8 {$7c}{$7c} !a14 {$7c}{$7c}\
  69. !a12 {$7c}{$7c} a7 {$7c}{$7c} a6 {$7c}{$7c} !a5 {$7c}{$7c} a4 {$7c}{$7c} !a15 {$7c}{$7c} !phi0
  70. /* phi21 WHEN 0XXX XXXX XXXX XX11 */
  71. #DEFINE f1!ras_ && phi0 && i0_f7
  72. /* user_0 WHEN 0111 011X 1000 1111 */
  73. #DEFINE f2ras_ {$7c}{$7c} !a10 {$7c}{$7c} !a11 {$7c}{$7c} !a13 {$7c}{$7c} a9 {$7c}{$7c} !a8 {$7c}{$7c} !a14 {$7c}{$7c} \
  74. !a12 {$7c}{$7c} a7 {$7c}{$7c} a6 {$7c}{$7c} a5 {$7c}{$7c} !a4 {$7c}{$7c} !a15 {$7c}{$7c} !phi0 {$7c}{$7c} !i0_f7
  75. /* 6551_0 WHEN X111 011X 1000 011X */
  76. #DEFINE f3!a10 {$7c}{$7c} !a11 {$7c}{$7c} !a13 {$7c}{$7c} a9 {$7c}{$7c} !a8 {$7c}{$7c} !a14 {$7c}{$7c}\
  77. !a12 {$7c}{$7c} a7 {$7c}{$7c} a6 {$7c}{$7c} a5 {$7c}{$7c} a4 {$7c}{$7c} !a15 {$7c}{$7c} !phi0
  78. /* addr_clk0 WHEN 1111 011X 1110 1111 */
  79. #DEFINE f4ras_ {$7c}{$7c} !a10 {$7c}{$7c} !a11 {$7c}{$7c} !a13 {$7c}{$7c} a9 {$7c}{$7c} !a8 {$7c}{$7c} !a14 {$7c}{$7c}\
  80. !a12 {$7c}{$7c} !a7 {$7c}{$7c} !a6 {$7c}{$7c} a5 {$7c}{$7c} !a4 {$7c}{$7c} !a15 {$7c}{$7c} !phi0 {$7c}{$7c} !i0_f7
  81. /* keyport_0 WHEN 0111 011X 1001 1111 */
  82. #DEFINE f5ras_ {$7c}{$7c} !a10 {$7c}{$7c} !a11 {$7c}{$7c} !a13 {$7c}{$7c} a9 {$7c}{$7c} !a8 {$7c}{$7c} !a14 {$7c}{$7c}\
  83. !a12 {$7c}{$7c} a7 {$7c}{$7c} a6 {$7c}{$7c} !a5 {$7c}{$7c} !a4 {$7c}{$7c} !a15 {$7c}{$7c} !phi0 {$7c}{$7c} !i0_f7
  84. /* kernal_1 WHEN X111 001X 1XXX X1XX */
  85. #DEFINE f6a10 && a11 && a13 && !a9 && !a8 && a14 &&\
  86. a12 && a15
  87. /* i0_f71 WHEN XXXX XXX1 XXXX XXXX OR
  88.   WHEN 0XXX XXXX XXXX XX11 */
  89. #DEFINE f7mux {$7c}{$7c} (f1)
  90. /*@{$7d}*/
  91.  
  92. /** tHE MAIN PROGRAM
  93.  * @PARAM ARGCCOMMAND LINE ARGUMENT COUNT
  94.  * @PARAM ARGVCOMMAND LINE ARGUMENT VECTOR
  95.  * @RETURNZERO ON SUCCESSFULL TERMINATION
  96.  */
  97. INT
  98. MAIN (INT ARGC, CHAR** ARGV)
  99. {$7b}
  100.   /** tHE INPUT COMBINATION, AT LEAST 16 BITS */
  101.   REGISTER UNSIGNED INT I = 0;
  102.   DO {$7b}
  103.     /** tHE OUTPUT COMBINATION, 8 BITS */
  104.     REGISTER UNSIGNED CHAR O = 0;
  105.     IF (f0) O {$7c}= 1 << 0;
  106.     IF (f1) O {$7c}= 1 << 1;
  107.     IF (f2) O {$7c}= 1 << 2;
  108.     IF (f3) O {$7c}= 1 << 3;
  109.     IF (f4) O {$7c}= 1 << 4;
  110.     IF (f5) O {$7c}= 1 << 5;
  111.     IF (f6) O {$7c}= 1 << 6;
  112.     IF (f7) O {$7c}= 1 << 7;
  113.     PUTCHAR (O);
  114.   {$7d}
  115.   WHILE (++I & 0XFFFF);
  116.   RETURN 0;
  117. {$7d}
  118.