home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CBM Funet Archive
/
cbm-funet-archive-2003.iso
/
cbm
/
firmware
/
computers
/
plus4
/
pla.c
< prev
next >
Wrap
C/C++ Source or Header
|
2002-07-02
|
3KB
|
118 lines
/** pROGRAM TO CONVERT LOGIC EQUATIONS
* OF 16 INPUTS AND 8 OUTPUTS
* TO A 64-KILOBYTE TRUTH TABLE.
* @AUTHOR mARKO m{$e4}KEL{$e4} (mARKO.mAKELA@NIC.FUNET.FI)
* @DATE 2ND jULY 2002
*
* cOMPILATION:
*CC -O PLA PLA.C
* eXAMPLE USAGE:
*./PLA {$7c} DIFF - PLA-DUMP.BIN
* OR
*./PLA {$7c} OD -aX -T X1
* OR
*./PLA {$7c} CKSUM
* OR
*./PLA > PLA-DUMP.BIN
*
* tHE FOLLOWING pERL 5 CODE EXTRACTS OUTPUT f7 FROM A TRUTH TABLE DUMP:
* PERL -E 'UNDEF $/;$_=<>;S/(.)/CHR(ORD($1)&128)/GE;PRINT' < PLA-DUMP.BIN
*
* tO GENERATE ONLY SELECTED OUTPUTS WITH THIS PROGRAM,
* YOU MAY AS WELL COMMENT OUT SOME LINES IN THE MAIN FUNCTION.
*/
#INCLUDE <STDIO.H>
/** eXTRACT AN INPUT BIT
* @PARAM BTHE BIT TO BE EXTRACTED
* @RETURNNONZERO IF THE INPUT BIT B IS SET
*/
#DEFINE i(B) (!!((I) & (1 << B)))
/** @NAME tHE INPUT SIGNALS OF THE PLUS/4 pla.
* bASED ON INFORMATION AT
* HTTP://WWW.FUNET.FI/PUB/CBM/FIRMWARE/COMPUTERS/PLUS4/PLA.TXT
* COMPOSED BY wILLIAM lEVAK. */
/*@{$7b}*/
#DEFINEi0_f7i(0)
#DEFINE phi0i(1)
#DEFINE a15i(2)
#DEFINE a4i(3)
#DEFINE a5i(4)
#DEFINE a6i(5)
#DEFINE a7i(6)
#DEFINE a12i(7)
#DEFINE muxi(8)
#DEFINE a14i(9)
#DEFINE a8i(10)
#DEFINE a9i(11)
#DEFINE a13i(12)
#DEFINE a11i(13)
#DEFINE a10i(14)
#DEFINE ras_i(15)
/*@{$7d}*/
/** @NAME tHE OUTPUT SIGNALS OF THE PLUS/4 pla.
* rEVERSE ENGINEERED FROM THE SCRATCH
* BY mARKO m{$e4}KEL{$e4} ON 2ND jULY 2002
* FROM A DUMP PROVIDED BY wILLIAM lEVAK.
* tHE EQUATIONS ARE IN DISJUNCTIVE NORMAL FORM (dnf).
* (aLL OTHERS EXCEPT i0_f7 ARE ALSO IN CONJUNCTIVE NORMAL FORM (cnf).)
* oPERATORS:!XNEGATION OF X: NOT X
* X {$7c}{$7c} YDISJUNCTION: X OR B
* X && YCONJUNCTION: X AND B
*/
/*@{$7b}*/
/* UNUSED_0 WHEN 0111 011X 1001 011X */
#DEFINE f0ras_ {$7c}{$7c} !a10 {$7c}{$7c} !a11 {$7c}{$7c} !a13 {$7c}{$7c} a9 {$7c}{$7c} !a8 {$7c}{$7c} !a14 {$7c}{$7c}\
!a12 {$7c}{$7c} a7 {$7c}{$7c} a6 {$7c}{$7c} !a5 {$7c}{$7c} a4 {$7c}{$7c} !a15 {$7c}{$7c} !phi0
/* phi21 WHEN 0XXX XXXX XXXX XX11 */
#DEFINE f1!ras_ && phi0 && i0_f7
/* user_0 WHEN 0111 011X 1000 1111 */
#DEFINE f2ras_ {$7c}{$7c} !a10 {$7c}{$7c} !a11 {$7c}{$7c} !a13 {$7c}{$7c} a9 {$7c}{$7c} !a8 {$7c}{$7c} !a14 {$7c}{$7c} \
!a12 {$7c}{$7c} a7 {$7c}{$7c} a6 {$7c}{$7c} a5 {$7c}{$7c} !a4 {$7c}{$7c} !a15 {$7c}{$7c} !phi0 {$7c}{$7c} !i0_f7
/* 6551_0 WHEN X111 011X 1000 011X */
#DEFINE f3!a10 {$7c}{$7c} !a11 {$7c}{$7c} !a13 {$7c}{$7c} a9 {$7c}{$7c} !a8 {$7c}{$7c} !a14 {$7c}{$7c}\
!a12 {$7c}{$7c} a7 {$7c}{$7c} a6 {$7c}{$7c} a5 {$7c}{$7c} a4 {$7c}{$7c} !a15 {$7c}{$7c} !phi0
/* addr_clk0 WHEN 1111 011X 1110 1111 */
#DEFINE f4ras_ {$7c}{$7c} !a10 {$7c}{$7c} !a11 {$7c}{$7c} !a13 {$7c}{$7c} a9 {$7c}{$7c} !a8 {$7c}{$7c} !a14 {$7c}{$7c}\
!a12 {$7c}{$7c} !a7 {$7c}{$7c} !a6 {$7c}{$7c} a5 {$7c}{$7c} !a4 {$7c}{$7c} !a15 {$7c}{$7c} !phi0 {$7c}{$7c} !i0_f7
/* keyport_0 WHEN 0111 011X 1001 1111 */
#DEFINE f5ras_ {$7c}{$7c} !a10 {$7c}{$7c} !a11 {$7c}{$7c} !a13 {$7c}{$7c} a9 {$7c}{$7c} !a8 {$7c}{$7c} !a14 {$7c}{$7c}\
!a12 {$7c}{$7c} a7 {$7c}{$7c} a6 {$7c}{$7c} !a5 {$7c}{$7c} !a4 {$7c}{$7c} !a15 {$7c}{$7c} !phi0 {$7c}{$7c} !i0_f7
/* kernal_1 WHEN X111 001X 1XXX X1XX */
#DEFINE f6a10 && a11 && a13 && !a9 && !a8 && a14 &&\
a12 && a15
/* i0_f71 WHEN XXXX XXX1 XXXX XXXX OR
WHEN 0XXX XXXX XXXX XX11 */
#DEFINE f7mux {$7c}{$7c} (f1)
/*@{$7d}*/
/** tHE MAIN PROGRAM
* @PARAM ARGCCOMMAND LINE ARGUMENT COUNT
* @PARAM ARGVCOMMAND LINE ARGUMENT VECTOR
* @RETURNZERO ON SUCCESSFULL TERMINATION
*/
INT
MAIN (INT ARGC, CHAR** ARGV)
{$7b}
/** tHE INPUT COMBINATION, AT LEAST 16 BITS */
REGISTER UNSIGNED INT I = 0;
DO {$7b}
/** tHE OUTPUT COMBINATION, 8 BITS */
REGISTER UNSIGNED CHAR O = 0;
IF (f0) O {$7c}= 1 << 0;
IF (f1) O {$7c}= 1 << 1;
IF (f2) O {$7c}= 1 << 2;
IF (f3) O {$7c}= 1 << 3;
IF (f4) O {$7c}= 1 << 4;
IF (f5) O {$7c}= 1 << 5;
IF (f6) O {$7c}= 1 << 6;
IF (f7) O {$7c}= 1 << 7;
PUTCHAR (O);
{$7d}
WHILE (++I & 0XFFFF);
RETURN 0;
{$7d}