// @(#) $Header: /home/abrown/public_html/first/first2003chs/software/simulator/RCS/pbtest0.c,v 2.4 2006/12/14 19:40:16 abrown Exp $

/***********************************************************************
  * Copyright (C) 2002, 2003  Allen Brown
  * 
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  * 
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  * 
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the
  *   Free Software Foundation, Inc.
  *   59 Temple Place, Suite 330
  *   Boston, MA  02111-1307  USA
  * 
  * To contact the author of this software:
  *   Allen Brown
  *   PO Box J
  *   Corvallis, OR
  * 
  *   http://brown.armoredpenguin.com/~abrown/contact.html
  ***********************************************************************/
#include "pb.h"
#include <stdio.h>
int main()
{
  // Test pb_math functions outside of the simulator.
  int errors=0;

  // Declarations
  pbvalue constant3842=3842;
  struct pbnumber nw={&nw.value,0x55aa,16,0,"nw"};	// nw VAR WORD (initial val=21930)
  struct pbnumber nwb0={&nw.value,0,8,0,"nwb0"};	// nwb0 VAR nw.byte0
  struct pbnumber nwb1={&nw.value,0,8,8,"nwb1"};	// nwb1 VAR nw.byte1
  struct pbnumber value17={&value17.value,17,16,0,"constant17"};
  struct pbnumber nx={&nx.value,0,16,0,"nx"};
  struct pbnumber nxb0={&nx.value,0,8,0,"nxb0"};	// nxb0 VAR nx.byte0
  struct pbnumber nxb1={&nx.value,0,8,8,"nxb1"};	// nxb1 VAR nx.byte1
  struct pbnumber ny={&ny.value,0,16,0,"ny"};
  struct pbnumber nyb0={&ny.value,0,8,0,"nyb0"};	// nyb0 VAR ny.byte0
  struct pbnumber nyb1={&ny.value,0,8,8,"nyb1"};	// nyb1 VAR ny.byte1
  // Action

  // Check simple masking
  (void) makemask( 0, 4, 8 );
  // Create a static
  (void) makepbnumber( &value17.value, 0, 16, 0, "con" );
  printnumber("printnumber: nw=",nw,";\n"); fflush(stdout);
  errors += assertpbnumber( makepbnumber( &value17.value, 0, (pbi)16, (pbi)0, "con" ),
			    makepbnumber( 0, 17, (pbi)16, (pbi)0, "CON" ), "56" );
  // Simple Assignments
  pblet(nwb1,nwb0,"1");	// nwb0=17  (or 0x11) and
  printnumber("printnumber: nw=",nw,";\n"); fflush(stdout);
  errors += assertpbnumber( nwb1, makepbnumber( 0, 0xaaaa, (pbi)8, (pbi)8, "nwb1" ),"60" );
  pblet(nwb0,value17,"2");	// nwb0=17  (or 0x11)
  errors += assertpbnumber( nwb0, makepbnumber( 0, 0xaa11, (pbi)8, (pbi)0, "nwb0" ),"62" );
  pblet(nwb1,makepbconst(5,16,"constant5"),"3");	// nwb1=5
  errors += assertpbnumber( nwb1, makepbnumber( 0, 0x0511, (pbi)8, (pbi)8, "nwb1" ),"64" );
  // Check it
  printnumber("printnumber: nw=",nw,";\n"); fflush(stdout);
  printnumber("makepbnumber=",makepbnumber(0, 45454,(pbi)16,(pbi)0,"makenum2"),";\n"); fflush(stdout);
  // Assign again.
  pblet(nw,makepbnumber(&constant3842,0,(pbi)16,(pbi)0,"constant3842"),"4"); // nw=f02
  printnumber("nw=",nw,";\n"); fflush(stdout);
  errors += assertpbnumber( nw, makepbnumber( 0, 0xf02, (pbi)16, (pbi)0, "nw" ),"71" );

  // pbbnot() and pbabs()
  pblet(nw,pbbnot(nw),"5");
  printnumber("nw=",nw,";\n"); fflush(stdout);
  errors += assertpbnumber( nw, makepbnumber( 0, 0xf0fd, (pbi)16, (pbi)0, "nw" ),"76" );

  pblet(nw,pbabs(nw),"6");
  printnumber("nw=",nw,";\n"); fflush(stdout);
  errors += assertpbnumber( nw, makepbnumber( 0, 3843, (pbi)16, (pbi)0, "nw" ),"81 abs" );

  pblet(nw,pbabs(makepbconst(65476,16,"c65476")),"6.1");
  printnumber("nw=",nw,";\n"); fflush(stdout);
  errors += assertpbnumber( nw, makepbnumber( 0, 60, (pbi)16, (pbi)0, "nw" ),"81 abs" );

  pblet(nw,pbabs(makepbconst(60,16,"c60")),"6.2");
  printnumber("nw=",nw,";\n"); fflush(stdout);
  errors += assertpbnumber( nw, makepbnumber( 0, 60, (pbi)16, (pbi)0, "nw" ),"81 abs" );

  pblet(nw,makepbconst(2560,16,"constant2560"),"7");	// nw=2560
  pblet(nx,makepbconst(4,16,"constant4"),"8");	// nw=4

  // pbadd(), pbsub(), pbmul(), pbdiv()
  pblet(ny,pbadd(nw,nx),"9");			// ny=nw+nx
  errors += assertpbnumber( ny, makepbnumber( 0, 2564, 16, 0, "ny" ),"88" );

  pblet(ny,pbsub(nw,nx),"10");			// ny=nw-nx
  errors += assertpbnumber( ny, makepbnumber( 0, 2556, 16, 0, "ny" ),"91" );

  pblet(ny,pbmul(nw,nx),"11");			// ny=nw*nx
  errors += assertpbnumber( ny, makepbnumber( 0, 10240, 16, 0, "ny" ),"94" );

  pblet(ny,pbdiv(nw,nx),"12");			// ny=nw/nx
  errors += assertpbnumber( ny, makepbnumber( 0, 640, 16, 0, "ny" ),"97" );

  pblet(nw,makepbconst(0x0d0e,16,"constant3342"),"13");	// nw=3342
  pblet(nx,makepbconst(0xfead,16,"constant65197"),"14");	// nw=65197
  // pbmin, pbmax
  pblet(ny,pbmin(nw,nx),"15");			// ny=greater(nw,nx)
  errors += assertpbnumber( ny, makepbnumber( 0, 65197, 16, 0, "ny" ),"103" );
  pblet(ny,pbmin(nx,nw),"16");			// ny=greater(nw,nx)
  errors += assertpbnumber( ny, makepbnumber( 0, 65197, 16, 0, "ny" ),"105" );

  pblet(ny,pbmax(nw,nx),"17");			// ny=lessor(nw,nx)
  errors += assertpbnumber( ny, makepbnumber( 0, 3342, 16, 0, "ny" ),"108" );
  pblet(ny,pbmax(nx,nw),"18");			// ny=lessor(nw,nx)
  errors += assertpbnumber( ny, makepbnumber( 0, 3342, 16, 0, "ny" ),"110" );

  // pbshl(), pbshr()
  pblet(ny,pbshl(nw,makepbnumber(0,2,16,0,"c2")),"18.1");
  errors += assertpbnumber( ny, makepbnumber( 0, 0x3438, 16, 0, "ny" ),"111" );
  pblet(ny,pbshr(nw,makepbnumber(0,2,16,0,"c2")),"18.2");
  errors += assertpbnumber( ny, makepbnumber( 0, 0x0343, 16, 0, "ny" ),"112" );

  // pbband(), pbbor()
  pblet(ny,pbband(nw,nx),"19");			// ny=nw & nx
  errors += assertpbnumber( ny, makepbnumber( 0, 0xc0c, 16, 0, "ny" ),"114" );

  pblet(ny,pbbor(nw,nx),"20");			// ny=nw | nx
  errors += assertpbnumber( ny, makepbnumber( 0, 0xffaf, 16, 0, "ny" ),"117" );

  pblet(nx,makepbconst(4,16,"constant4"),"21");	// nw=4
  // pbput(), pbget()
  pbput(nx,ny);			// put nx,ny ' nx is pointer
  pbget(nx,nw);			// get nx,nw ' nx is pointer
  errors += assertpbnumber( nw, makepbnumber( 0, 0xffaf, 16, 0, "nw" ),"123" );

  pblet(nw,makepbconst(0x0d0e,16,"constant3342"),"22");	// nw=3342
  pblet(nx,makepbconst(0xfead,16,"constant65197"),"23");	// nw=65197
  // pbeq(), pblt(), pble(), pbgt(), pbge(), pbne()
  pblet(ny,pbeq(nw,nx),"24");			// ny=(nw == nx)
  errors += assertpbnumber( ny, makepbnumber( 0, 0, 16, 0, "ny" ),"129" );
  pblet(ny,pbeq(nx,nw),"25");			// ny=(nx == nw)
  errors += assertpbnumber( ny, makepbnumber( 0, 0, 16, 0, "ny" ),"131" );
  pblet(ny,pbeq(nw,nw),"26");			// ny=(nw == nw)
  errors += assertpbnumber( ny, makepbnumber( 0, 1, 16, 0, "ny" ),"133" );

  pblet(ny,pblt(nw,nx),"27");			// ny=(nw < nx)
  errors += assertpbnumber( ny, makepbnumber( 0, 1, 16, 0, "ny" ),"136" );
  pblet(ny,pblt(nx,nw),"28");			// ny=(nx < nw)
  errors += assertpbnumber( ny, makepbnumber( 0, 0, 16, 0, "ny" ),"138" );
  pblet(ny,pblt(nw,nw),"29");			// ny=(nw < nw)
  errors += assertpbnumber( ny, makepbnumber( 0, 0, 16, 0, "ny" ),"140" );

  pblet(ny,pble(nw,nx),"30");			// ny=(nw <= nx)
  errors += assertpbnumber( ny, makepbnumber( 0, 1, 16, 0, "ny" ),"143" );
  pblet(ny,pble(nx,nw),"31");			// ny=(nx <= nw)
  errors += assertpbnumber( ny, makepbnumber( 0, 0, 16, 0, "ny" ),"145" );
  pblet(ny,pble(nw,nw),"32");			// ny=(nw <= nw)
  errors += assertpbnumber( ny, makepbnumber( 0, 1, 16, 0, "ny" ),"147" );

  pblet(ny,pbgt(nw,nx),"33");			// ny=(nw > nx)
  errors += assertpbnumber( ny, makepbnumber( 0, 0, 16, 0, "ny" ),"150" );
  pblet(ny,pbgt(nx,nw),"34");			// ny=(nx > nw)
  errors += assertpbnumber( ny, makepbnumber( 0, 1, 16, 0, "ny" ),"152" );
  pblet(ny,pbgt(nw,nw),"35");			// ny=(nw > nw)
  errors += assertpbnumber( ny, makepbnumber( 0, 0, 16, 0, "ny" ),"154" );

  pblet(ny,pbge(nw,nx),"36");			// ny=(nw >= nx)
  errors += assertpbnumber( ny, makepbnumber( 0, 0, 16, 0, "ny" ),"157" );
  pblet(ny,pbge(nx,nw),"37");			// ny=(nx >= nw)
  errors += assertpbnumber( ny, makepbnumber( 0, 1, 16, 0, "ny" ),"159" );
  pblet(ny,pbge(nw,nw),"38");			// ny=(nw >= nw)
  errors += assertpbnumber( ny, makepbnumber( 0, 1, 16, 0, "ny" ),"161" );

  pblet(ny,pbne(nw,nx),"39");			// ny=(nw != nx)
  errors += assertpbnumber( ny, makepbnumber( 0, 1, 16, 0, "ny" ),"164" );
  pblet(ny,pbne(nx,nw),"40");			// ny=(nx != nw)
  errors += assertpbnumber( ny, makepbnumber( 0, 1, 16, 0, "ny" ),"166" );
  pblet(ny,pbne(nw,nw),"41");			// ny=(nw != nw)
  errors += assertpbnumber( ny, makepbnumber( 0, 0, 16, 0, "ny" ),"168" );

  // pblor(), pbland()
  pblet(ny,pblor(pbeq(nw,nx),pbeq(nw,nw)),"42");	// ny=(0 || 1)
  errors += assertpbnumber( ny, makepbnumber( 0, 1, 16, 0, "ny" ),"172" );
  pblet(ny,pblor(pbeq(nw,nw),pbeq(nw,nw)),"43");	// ny=(1 || 1)
  errors += assertpbnumber( ny, makepbnumber( 0, 1, 16, 0, "ny" ),"174" );
  pblet(ny,pblor(pbeq(nw,nw),pbeq(nw,nx)),"44");	// ny=(1 || 0)
  errors += assertpbnumber( ny, makepbnumber( 0, 1, 16, 0, "ny" ),"176" );
  pblet(ny,pblor(pbeq(nw,nx),pbeq(nw,nx)),"45");	// ny=(0 || 0)
  errors += assertpbnumber( ny, makepbnumber( 0, 0, 16, 0, "ny" ),"178" );

  pblet(ny,pbland(pbeq(nw,nx),pbeq(nw,nw)),"46");	// ny=(0 && 1)
  errors += assertpbnumber( ny, makepbnumber( 0, 0, 16, 0, "ny" ),"181" );
  pblet(ny,pbland(pbeq(nw,nw),pbeq(nw,nw)),"47");	// ny=(1 && 1)
  errors += assertpbnumber( ny, makepbnumber( 0, 1, 16, 0, "ny" ),"183" );
  pblet(ny,pbland(pbeq(nw,nw),pbeq(nw,nx)),"48");	// ny=(1 && 0)
  errors += assertpbnumber( ny, makepbnumber( 0, 0, 16, 0, "ny" ),"185" );
  pblet(ny,pbland(pbeq(nw,nx),pbeq(nw,nx)),"49");	// ny=(0 && 0)
  errors += assertpbnumber( ny, makepbnumber( 0, 0, 16, 0, "ny" ),"187" );


  exit(errors);
} // main

