TempleOSTS_130315.ISO
This commit is contained in:
1 parent
e57428affb
commit
17b71f1a2d
958 files changed
+26043
-15907
No files matched your search
@@ -0,0 +1,7 @@
|
||||
$FG,5$After Egypt Help$FG$
|
||||
----------------
|
||||
|
||||
$LK,"Part 1","FI:::/TempleOS/Apps/HolySpirit/HSNotes.TXT"$
|
||||
|
||||
$LK,"Part 2","FI:::/TempleOS/Apps/AfterEgypt/AENotesPart2.TXT"$
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
$WW,1$$FG,5$$TX+CX,"Using this Program, AfterEgypt"$$FG$
|
||||
|
||||
This game is not about leaving Egypt and it's not about leaving the wilderness. It's about being in the wilderness after Egypt. The whole point is they went from the frying-pan to the fire. $LK,"Numbers,11:1","BF:Numbers,11:1"$ People misrepresent Exodus when they claim it for liberation struggles. Actually, though, the wilderness generation was very blessed because they had first class entertainment -- miracles and excitement. As far as God's concerned, you need food, clothing and entertainment. Just imagine all the prehistoric and primiative people who have lived.
|
||||
|
||||
In this game, hold-up your end of the conversation and talk to God. When you pray try to put your best foot forward. God told me, "excessive contricians wearysome", for example, when I was worried about sin. I joke, don't remind Him of sins because He might have forgotten.
|
||||
|
||||
God loved Jacob and hated Esau. Jacob was like a little rascal. Ironically, holier-than-thou, do-gooder, attitudes are hated. Jesus was "meek and humble of heart", $LK,"Matthew,11:27","BF:Matthew,11:27"$. What does "humble of head" mean? To know God is to know justice. Everyone, rich and poor, has highs and lows. Do not covet. Get your eye off of money. Relax! Don't feel sorry for the poor and don't envy the rich. The poor are mostly lazy and rich suffer plenty. Chavez of Venezuala was fussing and God said, "Japan industrious". What planet do you live on, people! You wouldn't cannonize a ugly man for not committing adultery. When the poor get money, they make buffoons of themselves as nouveau riche. Proud of heart means you won't accept a gift from God, like your birthright being American and not a day laborer. Grace. $LK,"Ecclesiastes,2:24","BF:Ecclesiastes,2:24"$ Jesus' burden is light. He's meek. You don't have to save the world. The poor are richer than Jesus and there is justice. Everything is vanity and the sinner collects possessions for the just.
|
||||
|
||||
After the Haiti quake, I used my program to pick a random passage from some books. Adam Smith came-up:
|
||||
|
||||
$FG,2$The value of a free-stone quarry, for example, will necessarily increase
|
||||
with the increasing improvement and population of the country round
|
||||
about it, especially if it should be the only one in the neighbourhood.
|
||||
But the value of a silver mine, even though there should not be another
|
||||
within a thousand miles of it, will not necessarily increase with the
|
||||
improvement of the country in which it is situated. The market for the
|
||||
produce of a free-stone quarry can seldom extend more than a few miles
|
||||
round about it, and the demand must generally be in proportion to the
|
||||
improvement and population of that small district; but the market for
|
||||
the produce of a silver mine may extend over the whole known world.$FG$
|
||||
|
||||
God's not a schmuck. God is just. If you are out of work, find anything productive to do. I'd go so far as to say, it's impossible not to be rewarded for honest work. I bank on that. I have an incredible entertainment budget ;-)
|
||||
|
||||
Sometimes, puppet-generated stuff will sound prophetic and relevant enough to scare you. In my experience it's not prophetic, but might be designed to get your attention. Focus on enjoying His company and growing.
|
||||
|
||||
Is this tongues program voodoo? How did they talk with God in the Bible? Did they hear voices? If animal sacrifices were not voodoo, this program is certainly not voodoo. Tongues is a perfectly acceptible Christian doctrine. In fact, $LK,"1 Corinthians,14:39","BF:1 Corinthians,14:39"$, says not to forbid tongues! It is common Christian belief that we are temples of the Holy Spirit, that God dwells in us. I figure idolatry is doing this and thinking the intelligence resides in the object instead of in the person consulting God.
|
||||
|
||||
If any preacher calls this witchcraft, let me retaliate by saying anyone who does not do miracles is not saved. $LK,"Matthew,17:19","BF:Matthew,17:19"$ "... with faith... say to this mountain..." Do a text search for "dumb ass" in the King James Bible. $LK,"2 Peter,2:16","BF:2 Peter,2:16"$ The king of Babylon was made crazy and restored. $LK,"Daniel,4:25","BF:Daniel,4:25"$ If you don't believe in omens, read $LK,"Matthew,26:74","BF:Matthew,26:74"$. If you don't believe in astrology, read $LK,"Matthew,2:10","BF:Matthew,2:10"$. God has a plan and clockwork for Creation. It's nothing to do with power of planets. This is voodoo -- $LK,"Leviticus,3:4","BF:Leviticus,3:4"$?
|
||||
|
||||
We are not to test God, and we are to "live on the word of God." $LK,"Matthew,4:3","BF:Matthew,4:3"$ Do not attempt to box God in a corner, attempting to force him to answer, as in, "should I do such and such, yes or no?" I think it is okay to meditate and offer God the option to comment.
|
||||
|
||||
Don't bug God too much, especially, don't enquire if you haven't offered any meditations or whatever. $LK,"Isaiah,7:13","BF:Isaiah,7:13"$ This, $LK,"Genesis,18:27","BF:Genesis,18:27"$, is funny, though.
|
||||
|
||||
I'll let you work-out how to interpret what you hear from God. It can be the start of a real, personal, relationship with the Father that even has a history. God gift-wraps His talk in riddles. Here's a hint: $LK,"Daniel,5:27","BF:Daniel,5:27"$. "It's mean to tickle the President or a person." God hides from the arrogant and reveals to the child-like. Don't feel foolish if you interpret based on what pops-into your head anagram-wise, analogy-wise or whatever. $LK,"1 Corinthians,2:13","BF:1 Corinthians,2:13"$
|
||||
|
||||
When God gives me a response in a random passage, it's like He picked a greeting card for me. That's love. I try to return love by being just as thoughtful.
|
||||
|
||||
|
||||
$FG,5$$TX+CX,"This Game"$$FG$
|
||||
|
||||
This $FG,2$AfterEgypt$FG$ game is not really done.
|
||||
|
||||
I thought about a sucker option to $WW,1$take a census -- God say's "why have you done this? You want to battle... Fine. You must pick a penalty..." This is based on something king David did. $LK,"2 Samuel,24:10","BF:2 Samuel,24:10"$ My thinking is that God punished because the act of taking a census reflected a military inclination. Instead of census, you see a crowd of people and must guess how many. I wish not to turn this into another conquest game.
|
||||
|
||||
$FG,5$$TX+CX,"Parting Wisdom"$$FG$
|
||||
|
||||
The story of God asking Abraham to sacrifice his son, Issac, is deceptive. It turns-out that was actually God imposing justice on Abraham because he almost killed his other son, Ishmael. $LK,"Genesis,21:16","BF:Genesis,21:16"$
|
||||
|
||||
I just heard in the news that some woman starved her kids because she expected God to provide food. That's testing God. If you find yourself in need, God promises to help, but if you place yourself in need voluntarily, that's attempting to force God and is putting Him to the test. $LK,"Matthew,4:3","BF:Matthew,4:3"$ I gave all my possessions away, once, in 1996, quit my job and expected some mission from God to turn-up. Nothing happened and I was depressed. $LK,"Matthew,19:21","BF:Matthew,19:21"$ I just went back to doing my thing. I guess it eventually paid-off.
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,27 @@
|
||||
U0 ViewComics()
|
||||
{
|
||||
I64 i=0;
|
||||
U8 *st;
|
||||
CDirEntry *tempm,*tempm1;
|
||||
CDoc *doc=DocNew;
|
||||
tempm=FilesFind("Comics/*.TXT*");
|
||||
tempm1=tempm;
|
||||
while (tempm1) {
|
||||
if (!(i++&3))
|
||||
DocPutS(doc,"\n");
|
||||
st=StrNew(tempm1->name);
|
||||
FileExtRem(st);
|
||||
tempm1->user_data=DocPrintF(doc,"$$MU-UL,\"%-10ts\",%d$$ ",st,tempm1);
|
||||
Free(st);
|
||||
tempm1=tempm1->next;
|
||||
}
|
||||
while (TRUE) {
|
||||
if ((tempm1=PopUpMenu(doc))>0)
|
||||
Ed(tempm1->full_name);
|
||||
else
|
||||
break;
|
||||
}
|
||||
DocDel(doc);
|
||||
CDirLstDel(tempm);
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,16 @@
|
||||
#help_index "Games"
|
||||
|
||||
Cd("/TempleOS/Apps/AfterEgypt");;
|
||||
#include "/TempleOS/Apps/HolySpirit/HolySpirit"
|
||||
#include "Comics"
|
||||
#include "/TempleOS/Demo/Graphics/Camp"
|
||||
#include "/TempleOS/Demo/MultiCore/Clouds"
|
||||
#include "/TempleOS/Demo/Graphics/Mountain"
|
||||
#include "Map"
|
||||
#include "Battle"
|
||||
#include "WaterRock"
|
||||
#include "Quail"
|
||||
#include "Horeb"
|
||||
#include "AfterEgypt"
|
||||
|
||||
#help_index ""
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,3 @@
|
||||
Cd("/TempleOS/Apps/AfterEgypt");;
|
||||
#include "Load"
|
||||
AfterEgypt;
|
||||
Binary file not shown.
@@ -0,0 +1,132 @@
|
||||
/*
|
||||
This makes a mesh ball.
|
||||
*/
|
||||
|
||||
|
||||
#define MAX_VERTICES 1024
|
||||
#define MAX_TRIANGLES 1024
|
||||
|
||||
class Ball
|
||||
{
|
||||
I32 vertex_cnt;
|
||||
I32 triangle_cnt;
|
||||
CD3I32 v[MAX_VERTICES];
|
||||
CMeshTri t[MAX_TRIANGLES];
|
||||
} *b;
|
||||
|
||||
|
||||
class BallDefineStruct
|
||||
{
|
||||
F64 radius fmtstr "$$DA-T,32,\"Radius :%8.3f\"$$\n";
|
||||
I64 n_longitude fmtstr "$$DA-T,32,\"Longitude Faces:%5d\"$$\n";
|
||||
I64 n_lattitude fmtstr "$$DA-T,32,\"Lattitude Rings:%5d\"$$\n";
|
||||
};
|
||||
|
||||
U0 BDInit(BallDefineStruct *bd)
|
||||
{
|
||||
MemSet(bd,0,sizeof(BallDefineStruct));
|
||||
bd->n_longitude=16;
|
||||
bd->n_lattitude=8;
|
||||
bd->radius =20.0;
|
||||
}
|
||||
|
||||
U0 BDCorrect(BallDefineStruct *bd)
|
||||
{
|
||||
bd->n_longitude=(bd->n_longitude+1)/2;
|
||||
bd->n_lattitude=(bd->n_lattitude+1)/2;
|
||||
}
|
||||
|
||||
|
||||
I64 AddVertex(BallDefineStruct *,I64 x,I64 y,I64 z)
|
||||
{
|
||||
I64 i;
|
||||
for (i=0;i<b->vertex_cnt;i++)
|
||||
if (b->v[i].x==x && b->v[i].y==y && b->v[i].z==z)
|
||||
return i;
|
||||
i=b->vertex_cnt++;
|
||||
b->v[i].x=x;
|
||||
b->v[i].y=y;
|
||||
b->v[i].z=z;
|
||||
return i;
|
||||
}
|
||||
|
||||
I64 AddTriangle(BallDefineStruct *,I64 c,I64 n0,I64 n1,I64 n2)
|
||||
{
|
||||
I64 result=b->triangle_cnt++;
|
||||
b->t[result].color=c;
|
||||
b->t[result].nums[0]=n0;
|
||||
b->t[result].nums[1]=n1;
|
||||
b->t[result].nums[2]=n2;
|
||||
return result;
|
||||
}
|
||||
|
||||
U8 *Ball2CSprite()
|
||||
{
|
||||
//See $LK,"::/TempleOS/Adam/Gr/GrSpritePlot.CPP","FL:::/TempleOS/Adam/Gr/GrSpritePlot.CPP,1"$ for how CSprite are stored.
|
||||
U8 *result=MAlloc(sizeof(U8)+2*sizeof(I32)+
|
||||
b->vertex_cnt*sizeof(CD3I32)+b->triangle_cnt*sizeof(CMeshTri)+gr_sprite_base_size[GRST_END]),
|
||||
*dst=result;
|
||||
*dst(U8 *)++ =GRST_MESH;
|
||||
*dst(I32 *)++ =b->vertex_cnt;
|
||||
*dst(I32 *)++ =b->triangle_cnt;
|
||||
MemCpy(dst,&b->v,b->vertex_cnt*sizeof(CD3I32));
|
||||
dst+=b->vertex_cnt*sizeof(CD3I32);
|
||||
MemCpy(dst,&b->t,b->triangle_cnt*sizeof(CMeshTri));
|
||||
dst+=b->triangle_cnt*sizeof(CMeshTri);
|
||||
*dst(U8 *)++ =GRST_END;
|
||||
return result;
|
||||
}
|
||||
|
||||
public U8 *BallGen()
|
||||
{
|
||||
U8 *result;
|
||||
I64 i,j,n,m,c,p1,p2,p3,p4;
|
||||
BallDefineStruct bd1,bd2;
|
||||
F64 r,r1,r2,z1,z2,d_a1,d_a2;
|
||||
|
||||
BDInit(&bd1);
|
||||
|
||||
while (TRUE) {
|
||||
if (!DocFormDo(&bd1,"BallDefineStruct"))
|
||||
return NULL;
|
||||
MemCpy(&bd2,&bd1,sizeof(BallDefineStruct));
|
||||
BDCorrect(&bd2);
|
||||
|
||||
c=PopUpLightingColor;
|
||||
if (c<0) return NULL;
|
||||
|
||||
b=CAlloc(sizeof(Ball));
|
||||
r=bd2.radius;
|
||||
n=bd2.n_lattitude;
|
||||
m=bd2.n_longitude;
|
||||
d_a1=2*ã/n/4;
|
||||
d_a2=2*ã/m/2;
|
||||
for (j=-n;j<n;j++) {
|
||||
r1=r*Cos( j *d_a1);
|
||||
r2=r*Cos((j+1)*d_a1);
|
||||
z1=r*Sin( j *d_a1);
|
||||
z2=r*Sin((j+1)*d_a1);
|
||||
for (i=0;i<m;i++) {
|
||||
p1=AddVertex(&bd2,r1*Cos((2*i +j)*d_a2),r1*Sin((2*i +j)*d_a2),z1);
|
||||
p2=AddVertex(&bd2,r1*Cos((2*i+2+j)*d_a2),r1*Sin((2*i+2+j)*d_a2),z1);
|
||||
p3=AddVertex(&bd2,r2*Cos((2*i+1+j)*d_a2),r2*Sin((2*i+1+j)*d_a2),z2);
|
||||
p4=AddVertex(&bd2,r2*Cos((2*i+3+j)*d_a2),r2*Sin((2*i+3+j)*d_a2),z2);
|
||||
AddTriangle(&bd2,c,p1,p2,p3);
|
||||
AddTriangle(&bd2,c,p3,p2,p4);
|
||||
}
|
||||
}
|
||||
|
||||
result=Ball2CSprite;
|
||||
NewLine(7);
|
||||
PutSprite(result,"\t\t$$SP,\"<1>\",%d$$");
|
||||
NewLine(7);
|
||||
"Vertices:%d\n",b->vertex_cnt;
|
||||
Free(b);
|
||||
"Do another";
|
||||
if (YorN)
|
||||
Free(result);
|
||||
else
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
#include "/TempleOS/Apps/GrModels/ManGen"
|
||||
#include "/TempleOS/Apps/GrModels/BallGen"
|
||||
#include "/TempleOS/Apps/GrModels/Models"
|
||||
@@ -0,0 +1,295 @@
|
||||
/*
|
||||
This makes a mesh man.
|
||||
*/
|
||||
|
||||
|
||||
#define MAX_VERTICES 1024
|
||||
#define MAX_TRIANGLES 1024
|
||||
|
||||
class Man
|
||||
{
|
||||
I32 vertex_cnt;
|
||||
I32 triangle_cnt;
|
||||
CD3I32 v[MAX_VERTICES];
|
||||
CMeshTri t[MAX_TRIANGLES];
|
||||
} *m;
|
||||
|
||||
|
||||
class ManDefineStruct
|
||||
{
|
||||
F64 head_rad fmtstr "$$DA-T,32,\"Head Radius :%8.3f\"$$\n";
|
||||
|
||||
F64 torso_len fmtstr "$$DA-T,32,\"Torso Length :%8.3f\"$$\n";
|
||||
F64 arm_len fmtstr "$$DA-T,32,\"Arm Length :%8.3f\"$$\n";
|
||||
F64 hand_len fmtstr "$$DA-T,32,\"Hand Length :%8.3f\"$$\n";
|
||||
F64 leg_len fmtstr "$$DA-T,32,\"Leg Length :%8.3f\"$$\n";
|
||||
F64 foot_len fmtstr "$$DA-T,32,\"Foot Length :%8.3f\"$$\n";
|
||||
F64 torso_width fmtstr "$$DA-T,32,\"Torso Width :%8.3f\"$$\n";
|
||||
F64 torso_depth fmtstr "$$DA-T,32,\"Torso Depth :%8.3f\"$$\n";
|
||||
F64 arm_rad fmtstr "$$DA-T,32,\"Arm Radius :%8.3f\"$$\n";
|
||||
F64 hand_rad fmtstr "$$DA-T,32,\"Hand Radius :%8.3f\"$$\n";
|
||||
F64 leg_rad fmtstr "$$DA-T,32,\"Leg Radius :%8.3f\"$$\n";
|
||||
F64 foot_rad fmtstr "$$DA-T,32,\"Foot Radius :%8.3f\"$$\n\n";
|
||||
|
||||
F64 r_shoulder_a1 fmtstr "$$DA-T,32,\"R.Shoulder Front/Back Angle:%8.3f\"$$\n";
|
||||
F64 l_shoulder_a1 fmtstr "$$DA-T,32,\"L.Shoulder Front/Back Angle:%8.3f\"$$\n";
|
||||
F64 r_hip_a1 fmtstr "$$DA-T,32,\"R.Hip Front/Back Angle :%8.3f\"$$\n";
|
||||
F64 l_hip_a1 fmtstr "$$DA-T,32,\"L.Hip Front/Back Angle :%8.3f\"$$\n";
|
||||
|
||||
F64 r_shoulder_a2 fmtstr "$$DA-T,32,\"R.Shoulder Side Angle :%8.3f\"$$\n";
|
||||
F64 l_shoulder_a2 fmtstr "$$DA-T,32,\"L.Shoulder Side Angle :%8.3f\"$$\n";
|
||||
F64 r_hip_a2 fmtstr "$$DA-T,32,\"R.Hip Side Angle :%8.3f\"$$\n";
|
||||
F64 l_hip_a2 fmtstr "$$DA-T,32,\"L.Hip Side Angle :%8.3f\"$$\n";
|
||||
|
||||
F64 r_elbow_a fmtstr "$$DA-T,32,\"R.Elbow Angle :%8.3f\"$$\n";
|
||||
F64 l_elbow_a fmtstr "$$DA-T,32,\"L.Elbow Angle :%8.3f\"$$\n";
|
||||
F64 r_knee_a fmtstr "$$DA-T,32,\"R.Knee Angle :%8.3f\"$$\n";
|
||||
F64 l_knee_a fmtstr "$$DA-T,32,\"L.Knee Angle :%8.3f\"$$\n";
|
||||
|
||||
F64 r_wrist_a fmtstr "$$DA-T,32,\"R.Wrist Angle :%8.3f\"$$\n";
|
||||
F64 l_wrist_a fmtstr "$$DA-T,32,\"L.Wrist Angle :%8.3f\"$$\n";
|
||||
F64 r_ankle_a fmtstr "$$DA-T,32,\"R.Ankle Angle :%8.3f\"$$\n";
|
||||
F64 l_ankle_a fmtstr "$$DA-T,32,\"L.Ankle Angle :%8.3f\"$$\n";
|
||||
|
||||
};
|
||||
|
||||
U0 MDInit(ManDefineStruct *md)
|
||||
{
|
||||
MemSet(md,0,sizeof(ManDefineStruct));
|
||||
|
||||
md->head_rad =5.0;
|
||||
|
||||
md->torso_len =35.0;
|
||||
md->arm_len =30.0;
|
||||
md->hand_len =8.0;
|
||||
md->leg_len =32.0;
|
||||
md->foot_len =16.0;
|
||||
md->torso_width=20.0;
|
||||
md->torso_depth=10.0;
|
||||
md->arm_rad =3.5;
|
||||
md->hand_rad =2.0;
|
||||
md->leg_rad =4.0;
|
||||
md->foot_rad =3.0;
|
||||
|
||||
md->r_shoulder_a1 =30;
|
||||
md->l_shoulder_a1 =-30;
|
||||
md->r_hip_a1 =-45;
|
||||
md->l_hip_a1 =45;
|
||||
|
||||
md->r_shoulder_a2 =10;
|
||||
md->l_shoulder_a2 =10;
|
||||
md->r_hip_a2 =-5;
|
||||
md->l_hip_a2 =-5;
|
||||
|
||||
md->r_elbow_a =30;
|
||||
md->l_elbow_a =0;
|
||||
md->r_knee_a =0;
|
||||
md->l_knee_a =30;
|
||||
|
||||
md->r_wrist_a =0;
|
||||
md->l_wrist_a =0;
|
||||
md->r_ankle_a =0;
|
||||
md->l_ankle_a =0;
|
||||
}
|
||||
|
||||
U0 MDCorrect(ManDefineStruct *md)
|
||||
{
|
||||
md->r_ankle_a =-md->r_ankle_a;
|
||||
md->l_ankle_a =-md->l_ankle_a;
|
||||
md->r_knee_a =-md->r_knee_a;
|
||||
md->l_knee_a =-md->l_knee_a;
|
||||
md->r_hip_a2 =-md->r_hip_a2;
|
||||
md->r_shoulder_a2=-md->r_shoulder_a2;
|
||||
md->r_ankle_a+=90;
|
||||
md->l_ankle_a+=90;
|
||||
|
||||
md->foot_len-=md->leg_rad;
|
||||
|
||||
md->r_elbow_a+=md->r_shoulder_a1;
|
||||
md->l_elbow_a+=md->l_shoulder_a1;
|
||||
md->r_knee_a+=md->r_hip_a1;
|
||||
md->l_knee_a+=md->l_hip_a1;
|
||||
|
||||
md->r_wrist_a+=md->r_elbow_a;
|
||||
md->l_wrist_a+=md->l_elbow_a;
|
||||
md->r_ankle_a+=md->r_knee_a;
|
||||
md->l_ankle_a+=md->l_knee_a;
|
||||
}
|
||||
|
||||
|
||||
I64 AddVertex(ManDefineStruct *md,I64 x,I64 y,I64 z)
|
||||
{
|
||||
I64 result=m->vertex_cnt++;
|
||||
m->v[result].x=-x;
|
||||
m->v[result].y=-y-md->leg_len-md->foot_rad*2;
|
||||
m->v[result].z=-z;
|
||||
return result;
|
||||
}
|
||||
|
||||
I64 AddTriangle(ManDefineStruct *,I64 c,I64 n0,I64 n1,I64 n2)
|
||||
{
|
||||
I64 result=m->triangle_cnt++;
|
||||
m->t[result].color=c;
|
||||
m->t[result].nums[0]=n1;
|
||||
m->t[result].nums[1]=n0;
|
||||
m->t[result].nums[2]=n2;
|
||||
return result;
|
||||
}
|
||||
|
||||
U0 AddBox(ManDefineStruct *md,I64 c,I64 x1,I64 y1,I64 z1,F64 w,F64 h,F64 d,F64 h2,F64 h3,F64 az,F64 ay,F64 ax,
|
||||
I64 *ox,I64 *oy,I64 *oz)
|
||||
{
|
||||
I64 *r;
|
||||
I64 p1a,p2a,p3a,p4a;
|
||||
I64 p1b,p2b,p3b,p4b;
|
||||
I64 wx=w/2,wy=0,wz=0,hx=0,hy=h,hz=0,h2x=0,h2y=h2,h2z=0,h3x=0,h3y=h3,h3z=0,dx=0,dy=0,dz=d/2;
|
||||
|
||||
r=GrIdent;
|
||||
GrRotZEqu(r,az*ã/180.0);
|
||||
GrRotYEqu(r,ay*ã/180.0);
|
||||
GrRotXEqu(r,ax*ã/180.0);
|
||||
GrRot(r,&wx,&wy,&wz);
|
||||
GrRot(r,&hx,&hy,&hz);
|
||||
GrRot(r,&h2x,&h2y,&h2z);
|
||||
GrRot(r,&h3x,&h3y,&h3z);
|
||||
GrRot(r,&dx,&dy,&dz);
|
||||
|
||||
p1a=AddVertex(md,x1+dx -wx+h2x,y1+dy -wy+h2y,z1+dz -wz+h2z);
|
||||
p2a=AddVertex(md,x1+dx +wx+h2x,y1+dy +wy+h2y,z1+dz +wz+h2z);
|
||||
p3a=AddVertex(md,x1+dx+hx-wx ,y1+dy+hy-wy ,z1+dz+hz-wz);
|
||||
p4a=AddVertex(md,x1+dx+hx+wx ,y1+dy+hy+wy ,z1+dz+hz+wz);
|
||||
AddTriangle(md,c,p1a,p2a,p3a);
|
||||
AddTriangle(md,c,p4a,p3a,p2a);
|
||||
|
||||
p1b=AddVertex(md,x1-dx -wx+h2x,y1-dy -wy+h2y,z1-dz -wz+h2z);
|
||||
p2b=AddVertex(md,x1-dx +wx+h2x,y1-dy +wy+h2y,z1-dz +wz+h2z);
|
||||
p3b=AddVertex(md,x1-dx+hx-wx ,y1-dy+hy-wy ,z1-dz+hz-wz);
|
||||
p4b=AddVertex(md,x1-dx+hx+wx ,y1-dy+hy+wy ,z1-dz+hz+wz);
|
||||
AddTriangle(md,c,p1b,p2b,p3b);
|
||||
AddTriangle(md,c,p4b,p3b,p2b);
|
||||
|
||||
AddTriangle(md,c,p1a,p2a,p1b);
|
||||
AddTriangle(md,c,p2b,p1b,p2a);
|
||||
AddTriangle(md,c,p3a,p4a,p3b);
|
||||
AddTriangle(md,c,p4b,p3b,p4a);
|
||||
AddTriangle(md,c,p1a,p3a,p1b);
|
||||
AddTriangle(md,c,p3b,p1b,p3a);
|
||||
AddTriangle(md,c,p2a,p4a,p2b);
|
||||
AddTriangle(md,c,p4b,p2b,p4a);
|
||||
|
||||
*ox=x1+hx-h3x;
|
||||
*oy=y1+hy-h3y;
|
||||
*oz=z1+hz-h3z;
|
||||
|
||||
Free(r);
|
||||
}
|
||||
|
||||
|
||||
U8 *Man2CSprite()
|
||||
{
|
||||
//See $LK,"::/TempleOS/Adam/Gr/GrSpritePlot.CPP","FL:::/TempleOS/Adam/Gr/GrSpritePlot.CPP,1"$ for how CSprite are stored.
|
||||
U8 *result=MAlloc(sizeof(U8)+2*sizeof(I32)+
|
||||
m->vertex_cnt*sizeof(CD3I32)+m->triangle_cnt*sizeof(CMeshTri)+gr_sprite_base_size[GRST_END]),
|
||||
*dst=result;
|
||||
*dst(U8 *)++ =GRST_MESH;
|
||||
*dst(I32 *)++ =m->vertex_cnt;
|
||||
*dst(I32 *)++ =m->triangle_cnt;
|
||||
MemCpy(dst,&m->v,m->vertex_cnt*sizeof(CD3I32));
|
||||
dst+=m->vertex_cnt*sizeof(CD3I32);
|
||||
MemCpy(dst,&m->t,m->triangle_cnt*sizeof(CMeshTri));
|
||||
dst+=m->triangle_cnt*sizeof(CMeshTri);
|
||||
*dst(U8 *)++ =GRST_END;
|
||||
return result;
|
||||
}
|
||||
|
||||
public U8 *ManGen()
|
||||
{
|
||||
U8 *result;
|
||||
I64 x,y,z,c1,c2,c3,c4;
|
||||
ManDefineStruct md1,md2;
|
||||
MDInit(&md1);
|
||||
|
||||
while (TRUE) {
|
||||
if (!DocFormDo(&md1,"ManDefineStruct"))
|
||||
return NULL;
|
||||
MemCpy(&md2,&md1,sizeof(ManDefineStruct));
|
||||
MDCorrect(&md2);
|
||||
|
||||
c1=PopUpLightingColor("$$BK,1$$Shirt$$BK,0$$\n");
|
||||
if (c1<0) return NULL;
|
||||
c2=PopUpLightingColor("$$BK,1$$Pants$$BK,0$$\n");
|
||||
if (c2<0) return NULL;
|
||||
c3=PopUpLightingColor("$$BK,1$$Skin$$BK,0$$\n");
|
||||
if (c3<0) return NULL;
|
||||
c4=PopUpLightingColor("$$BK,1$$Shoes$$BK,0$$\n");
|
||||
if (c4<0) return NULL;
|
||||
|
||||
m=CAlloc(sizeof(Man));
|
||||
|
||||
//Head
|
||||
AddBox(&md2,c3,0,md2.torso_len+md2.head_rad*2,0,
|
||||
md2.head_rad*2,-md2.head_rad*2,md2.head_rad*2,0,0, 0,0,0,
|
||||
&x,&y,&z);
|
||||
|
||||
//Torso
|
||||
AddBox(&md2,c1,0,md2.torso_len,0,
|
||||
md2.torso_width,-md2.torso_len,md2.torso_depth,0,0, 0,0,0,
|
||||
&x,&y,&z);
|
||||
|
||||
//Right Arm
|
||||
AddBox(&md2,c1,-md2.torso_width/2-md2.arm_rad,md2.torso_len-md2.arm_rad,0,
|
||||
md2.arm_rad*2,-md2.arm_len/2,md2.arm_rad*2,md2.arm_rad,0,
|
||||
md2.r_shoulder_a2,0,md2.r_shoulder_a1,&x,&y,&z);
|
||||
AddBox(&md2,c3,x,y,z,
|
||||
md2.arm_rad*2,-md2.arm_len/2,md2.arm_rad*2,0,0,
|
||||
md2.r_shoulder_a2,0,md2.r_elbow_a,&x,&y,&z);
|
||||
AddBox(&md2,c3,x,y,z,
|
||||
md2.arm_rad*2,-md2.hand_len,md2.hand_rad*2,0,0,
|
||||
md2.r_shoulder_a2,0,md2.r_wrist_a,&x,&y,&z);
|
||||
|
||||
//Left Arm
|
||||
AddBox(&md2,c1,md2.torso_width/2+md2.arm_rad,md2.torso_len-md2.arm_rad,0,
|
||||
md2.arm_rad*2,-md2.arm_len/2,md2.arm_rad*2,md2.arm_rad,0,
|
||||
md2.l_shoulder_a2,0,md2.l_shoulder_a1,&x,&y,&z);
|
||||
AddBox(&md2,c3,x,y,z,
|
||||
md2.arm_rad*2,-md2.arm_len/2,md2.arm_rad*2,0,0,
|
||||
md2.l_shoulder_a2,0,md2.l_elbow_a,&x,&y,&z);
|
||||
AddBox(&md2,c3,x,y,z,
|
||||
md2.arm_rad*2,-md2.hand_len,md2.hand_rad*2,0,0,
|
||||
md2.l_shoulder_a2,0,md2.l_wrist_a,&x,&y,&z);
|
||||
|
||||
//Right Leg
|
||||
AddBox(&md2,c2,-md2.torso_width/2+md2.leg_rad,0,0,
|
||||
md2.leg_rad*2,-md2.leg_len/2,md2.leg_rad*2,0,0,
|
||||
md2.r_hip_a2,0,md2.r_hip_a1,&x,&y,&z);
|
||||
AddBox(&md2,c3,x,y,z,
|
||||
md2.leg_rad*2,-md2.leg_len/2,md2.leg_rad*2,0,md2.foot_rad,
|
||||
md2.r_hip_a2,0,md2.r_knee_a,&x,&y,&z);
|
||||
AddBox(&md2,c4,x,y,z,
|
||||
md2.leg_rad*2,-md2.foot_len,md2.foot_rad*2,md2.leg_rad,0,
|
||||
md2.r_hip_a2,0,md2.r_ankle_a,&x,&y,&z);
|
||||
|
||||
//Left Leg
|
||||
AddBox(&md2,c2,md2.torso_width/2-md2.leg_rad,0,0,
|
||||
md2.leg_rad*2,-md2.leg_len/2,md2.leg_rad*2,0,0,
|
||||
md2.l_hip_a2,0,md2.l_hip_a1,&x,&y,&z);
|
||||
AddBox(&md2,c3,x,y,z,
|
||||
md2.leg_rad*2,-md2.leg_len/2,md2.leg_rad*2,0,md2.foot_rad,
|
||||
md2.l_hip_a2,0,md2.l_knee_a,&x,&y,&z);
|
||||
AddBox(&md2,c4,x,y,z,
|
||||
md2.leg_rad*2,-md2.foot_len,md2.foot_rad*2,md2.leg_rad,0,
|
||||
md2.l_hip_a2,0,md2.l_ankle_a,&x,&y,&z);
|
||||
|
||||
result=Man2CSprite;
|
||||
NewLine(7);
|
||||
PutSprite(result,"\t\t$$SP,\"<1>\",%d$$");
|
||||
NewLine(7);
|
||||
Free(m);
|
||||
"Do another";
|
||||
if (YorN)
|
||||
Free(result);
|
||||
else
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
#define T_MAN 0
|
||||
#define T_BALL 1
|
||||
|
||||
U0 Models()
|
||||
{
|
||||
I64 i;
|
||||
Bool old_form=LBts(&(DocCur)->flags,DOCf_FORM);
|
||||
DocClear;
|
||||
"Make a CSprite model. Then, cut-and-Paste it.\n\n";
|
||||
"$$LM,4$$";
|
||||
"\n\n$$BT,\"Man\",T_MAN$$\n\n";
|
||||
"\n\n$$BT,\"Ball\",T_BALL$$\n\n";
|
||||
"$$LM,0$$";
|
||||
i=DocMenuDo(DocCur);
|
||||
LBEqu(&(DocCur)->flags,DOCf_FORM,old_form);
|
||||
DocBottom;
|
||||
switch (i) {
|
||||
case T_MAN:
|
||||
ManGen;
|
||||
break;
|
||||
case T_BALL:
|
||||
BallGen;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
#include "/TempleOS/Apps/GrModels/Load"
|
||||
Models;
|
||||
@@ -0,0 +1,41 @@
|
||||
$FG,5$$TX+CX,"The Purpose of Life"$$FG$
|
||||
|
||||
$WW,1$The purpose of life is to know God, love God and obey God.$FG$ Modern Christianity focuses on loving neighbor, not God. That is secular humanism. Loving God is more important than loving neighbor if you read $LK,"Matthew,22:37","BF:Matthew,22:37"$. Note: It does not say with half your mind behind your back.
|
||||
|
||||
$FG,5$$TX+CX,"Knowing God"$$FG$
|
||||
|
||||
Most people don't know God. $LK,"1 Chronicles,28:9","BF:1 Chronicles,28:9"$, $LK,"Matthew,11:27","BF:Matthew,11:27"$, $LK,"Luke,13:25","BF:Luke,13:25"$ You must talk with Him to know Him. $LK,"Matthew,6:6","BF:Matthew,6:6"$ You must seek Him by taking the initiative. $LK,"Luke,11:9","BF:Luke,11:9"$, $LK,"Isaiah,30:2","BF:Isaiah,30:2"$
|
||||
|
||||
Have you heard of "tongues?" Read $LK,"1 Corinthians,14:1","BF:1 Corinthians,14:1"$. Basically, when you follow impulses, you can be puppeted by spirits. "Promptings of the Holy Spirit" is a phrase. Some people say strange words when they speak in tongues. $LK,"Acts,2:1","BF:Acts,2:1"$ I use a different technique -- in this program, I read a nanosecond-range stop-watch when I press a button and use the high-speed time as a random number to pick words or passages. I can also just randomly crack-open a book and get a response.
|
||||
|
||||
Since seeking the word of the Holy Spirit, I have come to know God much better than I've heard others explain. God said, for example, that war was, "servicemen competing." That sounds more like the immutable God of our planet than what you hear from most religious people. God is not Venus (god of love) and not Mars (god of war), He's the God of Earth. (There is a book, $UL,1$Men are from Mars, Women from Venus$UL,0$. If Mammon is a false god of money, Mars or Venus might be useful words to describe other false gods.) I figure the greatest challenge for the Creator is boredom, ours and His.
|
||||
|
||||
God's ways are far above man's ways. Mom said Heaven was a never-ending family reunion. Yikes! A friend said, "Most guy's idea of Heaven would be running around doing things they'd get locked up for on Earth." Most people are like King Midas. When you realize how silly most notions of Heaven are, you come to appreciate that Earth is not that bad. This is the first step in loving God, the Creator -- praising Creation.
|
||||
|
||||
Just remember, "Little boys are made of snakes and snails and puppy-dog tails." $LK,"Luke,11:11","BF:Luke,11:11"$ God gives toys on Christmas, not just cloths, or at least the Holy Spirit! What does it mean that God gives the Holy Spirit? Basically, it means you get lucky because you're puppeted. "Puppeted" is a pagan word, but I'm putting it in terms everyone can understand. You act with God-like intellect when you accidentally say stuff more clever than you know you are. You'll know it when it happens. You'll be, like, "I know I'm not that smart." Basically, being puppeted affects chance on random things. God does not play with dice. The world is not random. How is being full of the Holy Spirit any different from what people call "luck"? Why else is it such a good thing? Be warned -- it can also lead to blessings in disguise or causing you to stupidly give away secrets you'd rather keep, for example.
|
||||
|
||||
|
||||
|
||||
$FG,5$$TX+CX,"Loving God"$$FG$
|
||||
|
||||
Imagine a billionare. Everyone around him can't forget his money even for a moment. The truth is, most people are after God's, "money." They fear for salvation. Here's a test -- would you pray to and praise God even if there were no salvation?
|
||||
|
||||
Love God and don't be a "user". Asking for stuff is annoying. $LK,"Luke,11:5","BF:Luke,11:5"$. Instead, offer Him praise. Make-up songs. You get out of prayer what you put into it. He knows better than you about the poor suffering people on the planet. It's silly and holier-than-thou praying for them. Since He does know, there's a good chance He might be doing it! "Thy will be done" means such prayers are wrong and annoying. Helping in a meaningful way is different, but don't fill your prayers with stupid requests for others.
|
||||
|
||||
The book of $LK,"Job,1:5","BF:Job,1:5"$ begins with God hanging-out on the porch with Satan, chatting. I hope God doesn't play me like He played Job! I decided Job's problem was being so holier-than-thou that he did offerings for his kids, in case they sinned. I think highs and lows balance -- $LK,"Luke,6:20","BF:Luke,6:20"$.
|
||||
|
||||
A simple rule of thumb for prayer should be, "Would I want to hear this prayer?" If you are not honestly pondering what pleases God, you're not even close to loving Him. $LK,"Ephesians,5:10","BF:Ephesians,5:10"$ and $LK,"Genesis,4:7","BF:Genesis,4:7"$ suggests experimenting to find what pleases God. God liked Abel's offering and not Cain's. Is it just me or is the entire planet brain dead! These people in the Bible obviously got feedback! I do hymns and I do comics, a little like parables. Praise, thanks and love are better than sacrifice. $LK,"Psalms,50:14","BF:Psalms,50:14"$, $LK,"Hosea,6:6","BF:Hosea,6:6"$ Obviously, animal sacrifices are really stupid. The whole notion of sacrifice is a little warped if you think about it. A loving God who wants you to hurt and deny yourself is bat-shit crazy! That's a demon! How would you feel if your wife abused herself to please you? Wha? If I were God, I might feel merciful to someone groveling, but I'd begin to get pissed if they were being emotionally manipulative. People become brain dead forgetting God is a thinking, emotional, being and not some sadistic accountant.
|
||||
|
||||
All those sophisticated theological "infinity" things such as omnicient, omnipotent, omnipresent, etc. will mess you up and you do far worse than a simple person. Trust me -- anthropomorphic is far better, in practice. Christ suggested thinking of God as "Abba" which is Aramaic for "Daddy."
|
||||
|
||||
Do a text search for "new song" in the Bible. It's mentioned nine times. You get out of prayer what you put into it and people are very lazy. The first commandment is to love God. You better be able to count the ways.
|
||||
|
||||
You have, basically, two things you can praise God for -- Creation and Exodus. Am I right? You could do other historic events or maybe evidence of justice. I crack-up laughing because the New Testament has Egypt mentioned several time. Jesus praised God for flowers. $LK,"Matthew,6:29","BF:Matthew,6:29"$
|
||||
|
||||
|
||||
|
||||
$FG,5$$TX+CX,"Obeying God"$$FG$
|
||||
|
||||
Just as ego cause most to love neighbor, not God, people skip knowing and loving God and cowardly get stuck on obeying Him. This command hardly needs more encouragement.
|
||||
|
||||
God does not want pawns to push around. God will talk, but won't tell you what to do, even if you want Him to.
|
||||
@@ -0,0 +1,74 @@
|
||||
#define CLK_DIVISOR 16
|
||||
|
||||
U8 *TimeStampCB(CDoc *,CDocEntry *,CTask *mem_task)
|
||||
{
|
||||
U8 *st=MAlloc(64,mem_task);
|
||||
SPrintF(st,"%X",GetTimeStamp/CLK_DIVISOR);
|
||||
return st;
|
||||
}
|
||||
|
||||
U8 *KbdMouseTimeCB(CDoc *,CDocEntry *,CTask *mem_task)
|
||||
{
|
||||
U8 *st=MAlloc(64,mem_task);
|
||||
SPrintF(st,"%X",KbdMouseEvtTime/CLK_DIVISOR);
|
||||
return st;
|
||||
}
|
||||
|
||||
I64 PopUpTimerOk(U8 *header=NULL,U8 *footer=NULL)
|
||||
{
|
||||
I64 i;
|
||||
CDocEntry *doc_e;
|
||||
CDoc *doc=DocNew;
|
||||
if (header) DocPutS(doc,header);
|
||||
doc_e=DocPutS(doc,"\nTimer:$$TX+TC,\" \"$$");
|
||||
doc_e->tag_cb=&TimeStampCB;
|
||||
doc_e=DocPutS(doc,"\nLatch:$$TX+TC,\" \"$$");
|
||||
doc_e->tag_cb=&KbdMouseTimeCB;
|
||||
DocPutS(doc,"\n$$CM+CX,0,4$$$$BT,\"OKAY\",0$$\n");
|
||||
if (footer) DocPutS(doc,footer);
|
||||
i=PopUpMenu(doc);
|
||||
DocDel(doc);
|
||||
return i;
|
||||
}
|
||||
|
||||
I64 TimerPickedU16(U8 *msg=NULL)
|
||||
{
|
||||
U8 *st;
|
||||
if (msg) {
|
||||
st=MAlloc(StrLen(msg)+256);
|
||||
StrCpy(st,msg);
|
||||
} else
|
||||
st=CAlloc(256);
|
||||
StrCat(st,"\n\nPress $$FG,GREEN$$OKAY$$FG$$ to generate \n"
|
||||
"a random num from a timer.\n");
|
||||
PopUpTimerOk(st,"\n\nThe $WW,1$$LK,"Holy Spirit","FI:::/TempleOS/Apps/HolySpirit/HSNotes.TXT"$ can puppet you.\n\n");
|
||||
Free(st);
|
||||
return KbdMouseEvtTime/CLK_DIVISOR;
|
||||
}
|
||||
|
||||
I64 TimerPickedU32(U8 *msg=NULL)
|
||||
{
|
||||
I64 result=0;
|
||||
result.u16[0]=TimerPickedU16(msg);
|
||||
result.u16[1]=TimerPickedU16(msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
CFifoU8 *rnd_nibble_fifo=FifoU8New(16);
|
||||
|
||||
I64 TimerPickedNibble(U8 *msg=NULL)
|
||||
{
|
||||
I64 result=0;
|
||||
if (FifoU8Rem(rnd_nibble_fifo,&result))
|
||||
return result;
|
||||
else {
|
||||
result=TimerPickedU16(msg);
|
||||
FifoU8Ins(rnd_nibble_fifo,result.u8[0]>>4);
|
||||
FifoU8Ins(rnd_nibble_fifo,result.u8[1]&15);
|
||||
FifoU8Ins(rnd_nibble_fifo,result.u8[1]>>4);
|
||||
FifoU8Ins(rnd_nibble_fifo,result.u8[2]&15);
|
||||
FifoU8Ins(rnd_nibble_fifo,result.u8[2]>>4);
|
||||
return result&15;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1 @@
|
||||
#include "/TempleOS/Apps/KeepAway/KeepAway"
|
||||
@@ -0,0 +1,2 @@
|
||||
#include "/TempleOS/Apps/KeepAway/Load"
|
||||
KeepAway;
|
||||
@@ -0,0 +1 @@
|
||||
#include "/TempleOS/Apps/Logic/Logic"
|
||||
@@ -0,0 +1,613 @@
|
||||
#define MAX_TABLE_SIZE 0x10000
|
||||
|
||||
I64 output_found,passes,table_size;
|
||||
|
||||
U8 *gate_type_table =NULL,
|
||||
*displayed_design=NULL,
|
||||
*added_this_pass =NULL;
|
||||
|
||||
U16 *input1_table=NULL,
|
||||
*input2_table=NULL,
|
||||
*input3_table=NULL;
|
||||
|
||||
#define CONNECT_WIDTH 16
|
||||
#define GATE_WIDTH 37
|
||||
|
||||
$ID,6$
|
||||
$SP,"",1$
|
||||
|
||||
|
||||
|
||||
$SP,"",2$
|
||||
|
||||
|
||||
|
||||
$SP,"",3$
|
||||
|
||||
|
||||
|
||||
$SP,"",4$
|
||||
|
||||
|
||||
|
||||
$SP,"",5$
|
||||
|
||||
|
||||
|
||||
$SP,"",6$
|
||||
|
||||
|
||||
|
||||
$SP,"",7$
|
||||
|
||||
|
||||
|
||||
$SP,"",8$
|
||||
|
||||
|
||||
|
||||
|
||||
$SP,"",9$
|
||||
|
||||
|
||||
|
||||
$SP,"",10$
|
||||
|
||||
$ID,-6$
|
||||
|
||||
U8 *gate_type_lst="NULL\0OUTPUT\0INPUT\0"
|
||||
"NOT\0AND\0OR\0NAND\0NOR\0XOR\0AND3\0OR3\0NAND3\0NOR3\0";
|
||||
|
||||
#define GT_NULL 0 //Specifies that table entry has not been filled-in
|
||||
#define GT_OUTPUT 1 //Specifies the table entry is a desired output
|
||||
#define GT_INPUT 2 //Specifies that table entry comes from an input signal
|
||||
|
||||
#define GT_FIRST_REAL_GATE 3
|
||||
#define GT_NOT 3
|
||||
#define GT_AND 4
|
||||
#define GT_OR 5
|
||||
#define GT_NAND 6
|
||||
#define GT_NOR 7
|
||||
#define GT_XOR 8
|
||||
#define GT_AND3 9
|
||||
#define GT_OR3 10
|
||||
#define GT_NAND3 11
|
||||
#define GT_NOR3 12
|
||||
#define GT_NUM_ENTRIES 13
|
||||
|
||||
#define MAX_SELECTED_GATES 128
|
||||
|
||||
CSprite *imgs[GT_NUM_ENTRIES]={NULL,NULL,NULL,
|
||||
$IB,"<NOT>",1$,$IB,"<AND>",2$,$IB,"<OR>",3$,$IB,"<NAND>",4$,$IB,"<NOR>",5$,$IB,"<XOR>",6$,$IB,"<AND3>",7$,$IB,"<OR3>",8$,$IB,"<NAND3>",9$,$IB,"<NOR3>",10$};
|
||||
|
||||
I64 num_inputs_entered,num_outputs_entered;
|
||||
I64 num_selected_gates,
|
||||
selected_gates[MAX_SELECTED_GATES];
|
||||
|
||||
U0 PmtGates()
|
||||
{
|
||||
I64 i;
|
||||
U8 *st;
|
||||
|
||||
"\nEnter the available gate types in the order you prefer them to be used.\n"
|
||||
"Your choices are:\n";
|
||||
for (i=GT_FIRST_REAL_GATE;i<GT_NUM_ENTRIES;i++)
|
||||
"%z ",i,gate_type_lst;
|
||||
NewLine;
|
||||
|
||||
num_selected_gates=0;
|
||||
while (num_selected_gates<GT_NUM_ENTRIES) {
|
||||
"%d",num_selected_gates;
|
||||
st=PmtStr(" Gate: ");
|
||||
if (!*st) {
|
||||
Free(st);
|
||||
return;
|
||||
}
|
||||
i=LstEntryMatch(st,gate_type_lst,LEF_IGNORE_CASE);
|
||||
Free(st);
|
||||
if (i<GT_FIRST_REAL_GATE)
|
||||
"Invalid response\n";
|
||||
else
|
||||
selected_gates[num_selected_gates++]=i;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
U0 Init()
|
||||
{
|
||||
I64 i;
|
||||
|
||||
do {
|
||||
table_size=PmtI64("\nTable size in hex (3 input=0x100,4=0x10000): ",0);
|
||||
if (table_size>MAX_TABLE_SIZE)
|
||||
"Too large\n";
|
||||
else if (table_size<1) {
|
||||
"No table specified, aborting.\n";
|
||||
ThrowBreak;
|
||||
}
|
||||
} while (table_size>MAX_TABLE_SIZE);
|
||||
|
||||
gate_type_table =CAlloc(table_size*sizeof(U8));
|
||||
displayed_design=MAlloc((table_size+7)/8);
|
||||
added_this_pass =MAlloc((table_size+7)/8);
|
||||
input1_table =MAlloc(table_size*sizeof(U16));
|
||||
input2_table =MAlloc(table_size*sizeof(U16));
|
||||
input3_table =MAlloc(table_size*sizeof(U16));
|
||||
|
||||
"\nEnter the hex truth table column values of inputs.\n";
|
||||
if (table_size<=0x100)
|
||||
"For example, enter A=0xF0, B=0xCC and C=0xAA.\n";
|
||||
else
|
||||
"For example, enter A=0xFF00, B=0xF0F0, C=0xCCCC and D=0xAAAA.\n";
|
||||
num_inputs_entered=0;
|
||||
while (TRUE) {
|
||||
"Input %C: ",'A'+num_inputs_entered;
|
||||
i=PmtI64("",-1);
|
||||
if (i<0) break;
|
||||
if (i>table_size)
|
||||
"Too large\n";
|
||||
else {
|
||||
if (gate_type_table[i])
|
||||
"Duplicate\n";
|
||||
else {
|
||||
gate_type_table[i]=GT_INPUT;
|
||||
input1_table[i]=num_inputs_entered++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!num_inputs_entered) {
|
||||
"No inputs specified, aborting.\n";
|
||||
ThrowBreak;
|
||||
}
|
||||
|
||||
"\nEnter the hex truth table columns values of the outputs.\n";
|
||||
num_outputs_entered=0;
|
||||
while (TRUE) {
|
||||
"Output %C: ",'A'+num_outputs_entered;
|
||||
i=PmtI64("",-1);
|
||||
if (i<0) break;
|
||||
if (i>table_size)
|
||||
"Too large\n";
|
||||
else {
|
||||
if (gate_type_table[i]==GT_INPUT)
|
||||
"To produce this output, connect to input %C\n",
|
||||
'A'+input1_table[i];
|
||||
else if (gate_type_table[i]==GT_OUTPUT)
|
||||
"Duplicate\n";
|
||||
else {
|
||||
gate_type_table[i]=GT_OUTPUT;
|
||||
input1_table[i]=num_outputs_entered++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!num_outputs_entered) {
|
||||
"No output specified, aborting.\n";
|
||||
ThrowBreak;
|
||||
}
|
||||
}
|
||||
|
||||
U0 DrawDesign(CDC *dc,I64 *_y,I64 output,I64 depth,I64 *_x_out,I64 *_y_out)
|
||||
{
|
||||
I64 y=*_y,type=gate_type_table[output],
|
||||
xx=(passes-depth)*(GATE_WIDTH+CONNECT_WIDTH),yy=y,
|
||||
x1,y1,x2,y2,x3,y3;
|
||||
if (_x_out) *_x_out=xx;
|
||||
if (_y_out) *_y_out=yy;
|
||||
if (Bt(displayed_design,output) && type!=GT_INPUT) {
|
||||
dc->color=GREEN;
|
||||
GrPutS(dc,xx-FONT_WIDTH*3,y-4,"Dup");
|
||||
y+=10;
|
||||
} else
|
||||
switch (type) {
|
||||
case GT_INPUT:
|
||||
dc->color=GREEN;
|
||||
GrPrintF(dc,xx-FONT_WIDTH-4,y-4,"%C",'A'+input1_table[output]);
|
||||
y+=10;
|
||||
break;
|
||||
case GT_NOT:
|
||||
if (!Bt(displayed_design,output)) {
|
||||
y+=16;
|
||||
DrawDesign(dc,&y,input1_table[output],depth+1,&x1,&y1);
|
||||
yy=y1;
|
||||
|
||||
dc->color=BLUE;
|
||||
SpritePlot3(dc,xx,yy,0,
|
||||
imgs[type]);
|
||||
|
||||
dc->color=RED;
|
||||
GrLine(dc,xx-GATE_WIDTH,yy,x1,y1);
|
||||
if (_y_out) *_y_out=yy;
|
||||
}
|
||||
break;
|
||||
case GT_AND:
|
||||
case GT_OR:
|
||||
case GT_NAND:
|
||||
case GT_NOR:
|
||||
case GT_XOR:
|
||||
if (!Bt(displayed_design,output)) {
|
||||
y+=24;
|
||||
DrawDesign(dc,&y,input1_table[output],depth+1,&x1,&y1);
|
||||
DrawDesign(dc,&y,input2_table[output],depth+1,&x2,&y2);
|
||||
yy=(y1+y2)/2;
|
||||
|
||||
dc->color=BLUE;
|
||||
SpritePlot3(dc,xx,yy,0,imgs[type]);
|
||||
|
||||
dc->color=RED;
|
||||
GrLine(dc,xx-GATE_WIDTH,yy-4,x1,y1);
|
||||
GrLine(dc,xx-GATE_WIDTH,yy+4,x2,y2);
|
||||
if (_y_out) *_y_out=yy;
|
||||
}
|
||||
break;
|
||||
case GT_AND3:
|
||||
case GT_OR3:
|
||||
case GT_NAND3:
|
||||
case GT_NOR3:
|
||||
if (!Bt(displayed_design,output)) {
|
||||
y+=32;
|
||||
DrawDesign(dc,&y,input1_table[output],depth+1,&x1,&y1);
|
||||
DrawDesign(dc,&y,input2_table[output],depth+1,&x2,&y2);
|
||||
DrawDesign(dc,&y,input3_table[output],depth+1,&x3,&y3);
|
||||
yy=(y1+y2+y3)/3;
|
||||
|
||||
dc->color=BLUE;
|
||||
SpritePlot3(dc,xx,yy,0,imgs[type]);
|
||||
|
||||
dc->color=RED;
|
||||
GrLine(dc,xx-GATE_WIDTH,yy-8,x1,y1);
|
||||
GrLine(dc,xx-GATE_WIDTH,yy ,x2,y2);
|
||||
GrLine(dc,xx-GATE_WIDTH,yy+8,x3,y3);
|
||||
if (_y_out) *_y_out=yy;
|
||||
}
|
||||
break;
|
||||
}
|
||||
dc->color=BLACK;
|
||||
GrPrintF(dc,xx,yy+3,"%04X",output);
|
||||
Bts(displayed_design,output);
|
||||
if (_y) *_y=y;
|
||||
}
|
||||
|
||||
U0 DrawIt(CTask *,CDC *dc)
|
||||
{
|
||||
I64 y=0;
|
||||
MemSet(displayed_design,0,(table_size+7)/8*sizeof(Bool));
|
||||
DrawDesign(dc,&y,output_found,0,NULL,NULL);
|
||||
}
|
||||
|
||||
U0 FillNot(Bool *chged,I64 *num_outputs_found)
|
||||
{
|
||||
I64 i,j;
|
||||
U8 old_type;
|
||||
for (i=0;i<table_size;i++)
|
||||
if (gate_type_table[i]>GT_OUTPUT && !Bt(added_this_pass,i)) {
|
||||
progress1=i;
|
||||
j= (~i) & (table_size-1);
|
||||
old_type=gate_type_table[j];
|
||||
if (old_type<GT_INPUT) {
|
||||
gate_type_table[j]=GT_NOT;
|
||||
input1_table[j]=i;
|
||||
Bts(added_this_pass,j);
|
||||
*chged=TRUE;
|
||||
if (old_type==GT_OUTPUT) {
|
||||
if (output_found<0) output_found=j;
|
||||
*num_outputs_found=*num_outputs_found+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 FillAnd(Bool *chged,I64 *num_outputs_found)
|
||||
{
|
||||
I64 i,j,k;
|
||||
U8 old_type;
|
||||
for (i=0;i<table_size;i++)
|
||||
if (gate_type_table[i]>GT_OUTPUT && !Bt(added_this_pass,i))
|
||||
for (k=0;k<table_size;k++)
|
||||
if (gate_type_table[k]>GT_OUTPUT && !Bt(added_this_pass,k)) {
|
||||
progress1=i;
|
||||
j= (i & k) & (table_size-1);
|
||||
old_type=gate_type_table[j];
|
||||
if (old_type<GT_INPUT) {
|
||||
gate_type_table[j]=GT_AND;
|
||||
input1_table[j]=i;
|
||||
input2_table[j]=k;
|
||||
Bts(added_this_pass,j);
|
||||
*chged=TRUE;
|
||||
if (old_type==GT_OUTPUT) {
|
||||
if (output_found<0) output_found=j;
|
||||
*num_outputs_found=*num_outputs_found+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 FillOr(Bool *chged,I64 *num_outputs_found)
|
||||
{
|
||||
I64 i,j,k;
|
||||
U8 old_type;
|
||||
for (i=0;i<table_size;i++)
|
||||
if (gate_type_table[i]>GT_OUTPUT && !Bt(added_this_pass,i))
|
||||
for (k=0;k<table_size;k++)
|
||||
if (gate_type_table[k]>GT_OUTPUT && !Bt(added_this_pass,k)) {
|
||||
progress1=i;
|
||||
j= (i | k) & (table_size-1);
|
||||
old_type=gate_type_table[j];
|
||||
if (old_type<GT_INPUT) {
|
||||
gate_type_table[j]=GT_OR;
|
||||
input1_table[j]=i;
|
||||
input2_table[j]=k;
|
||||
Bts(added_this_pass,j);
|
||||
*chged=TRUE;
|
||||
if (old_type==GT_OUTPUT) {
|
||||
if (output_found<0) output_found=j;
|
||||
*num_outputs_found=*num_outputs_found+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 FillNAnd(Bool *chged,I64 *num_outputs_found)
|
||||
{
|
||||
I64 i,j,k;
|
||||
U8 old_type;
|
||||
for (i=0;i<table_size;i++)
|
||||
if (gate_type_table[i]>GT_OUTPUT && !Bt(added_this_pass,i))
|
||||
for (k=0;k<table_size;k++)
|
||||
if (gate_type_table[k]>GT_OUTPUT && !Bt(added_this_pass,k)) {
|
||||
progress1=i;
|
||||
j= (~ (i & k)) & (table_size-1);
|
||||
old_type=gate_type_table[j];
|
||||
if (old_type<GT_INPUT) {
|
||||
gate_type_table[j]=GT_NAND;
|
||||
input1_table[j]=i;
|
||||
input2_table[j]=k;
|
||||
Bts(added_this_pass,j);
|
||||
*chged=TRUE;
|
||||
if (old_type==GT_OUTPUT) {
|
||||
if (output_found<0) output_found=j;
|
||||
*num_outputs_found=*num_outputs_found+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 FillNOr(Bool *chged,I64 *num_outputs_found)
|
||||
{
|
||||
I64 i,j,k;
|
||||
U8 old_type;
|
||||
for (i=0;i<table_size;i++)
|
||||
if (gate_type_table[i]>GT_OUTPUT && !Bt(added_this_pass,i))
|
||||
for (k=0;k<table_size;k++)
|
||||
if (gate_type_table[k]>GT_OUTPUT && !Bt(added_this_pass,k)) {
|
||||
progress1=i;
|
||||
j= (~ (i | k)) & (table_size-1);
|
||||
old_type=gate_type_table[j];
|
||||
if (old_type<GT_INPUT) {
|
||||
gate_type_table[j]=GT_NOR;
|
||||
input1_table[j]=i;
|
||||
input2_table[j]=k;
|
||||
Bts(added_this_pass,j);
|
||||
*chged=TRUE;
|
||||
if (old_type==GT_OUTPUT) {
|
||||
if (output_found<0) output_found=j;
|
||||
*num_outputs_found=*num_outputs_found+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 FillXor(Bool *chged,I64 *num_outputs_found)
|
||||
{
|
||||
I64 i,j,k;
|
||||
U8 old_type;
|
||||
for (i=0;i<table_size;i++)
|
||||
if (gate_type_table[i]>GT_OUTPUT && !Bt(added_this_pass,i))
|
||||
for (k=0;k<table_size;k++)
|
||||
if (gate_type_table[k]>GT_OUTPUT && !Bt(added_this_pass,k)) {
|
||||
progress1=i;
|
||||
j= (i ^ k) & (table_size-1);
|
||||
old_type=gate_type_table[j];
|
||||
if (old_type<GT_INPUT) {
|
||||
gate_type_table[j]=GT_XOR;
|
||||
input1_table[j]=i;
|
||||
input2_table[j]=k;
|
||||
Bts(added_this_pass,j);
|
||||
*chged=TRUE;
|
||||
if (old_type==GT_OUTPUT) {
|
||||
if (output_found<0) output_found=j;
|
||||
*num_outputs_found=*num_outputs_found+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 FillAnd3(Bool *chged,I64 *num_outputs_found)
|
||||
{
|
||||
I64 i,j,k,l;
|
||||
U8 old_type;
|
||||
for (i=0;i<table_size;i++)
|
||||
if (gate_type_table[i]>GT_OUTPUT && !Bt(added_this_pass,i))
|
||||
for (k=0;k<table_size;k++)
|
||||
if (gate_type_table[k]>GT_OUTPUT && !Bt(added_this_pass,k))
|
||||
for (l=0;l<table_size;l++)
|
||||
if (gate_type_table[l]>GT_OUTPUT && !Bt(added_this_pass,l)) {
|
||||
progress1=i;
|
||||
j= (i & k & l) & (table_size-1);
|
||||
old_type=gate_type_table[j];
|
||||
if (old_type<GT_INPUT) {
|
||||
gate_type_table[j]=GT_AND3;
|
||||
input1_table[j]=i;
|
||||
input2_table[j]=k;
|
||||
input3_table[j]=l;
|
||||
Bts(added_this_pass,j);
|
||||
*chged=TRUE;
|
||||
if (old_type==GT_OUTPUT) {
|
||||
if (output_found<0) output_found=j;
|
||||
*num_outputs_found=*num_outputs_found+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 FillOr3(Bool *chged,I64 *num_outputs_found)
|
||||
{
|
||||
I64 i,j,k,l;
|
||||
U8 old_type;
|
||||
for (i=0;i<table_size;i++)
|
||||
if (gate_type_table[i]>GT_OUTPUT && !Bt(added_this_pass,i))
|
||||
for (k=0;k<table_size;k++)
|
||||
if (gate_type_table[k]>GT_OUTPUT && !Bt(added_this_pass,k))
|
||||
for (l=0;l<table_size;l++)
|
||||
if (gate_type_table[l]>GT_OUTPUT && !Bt(added_this_pass,l)) {
|
||||
progress1=i;
|
||||
j= (i | k | l) & (table_size-1);
|
||||
old_type=gate_type_table[j];
|
||||
if (old_type<GT_INPUT) {
|
||||
gate_type_table[j]=GT_OR3;
|
||||
input1_table[j]=i;
|
||||
input2_table[j]=k;
|
||||
input3_table[j]=l;
|
||||
Bts(added_this_pass,j);
|
||||
*chged=TRUE;
|
||||
if (old_type==GT_OUTPUT) {
|
||||
if (output_found<0) output_found=j;
|
||||
*num_outputs_found=*num_outputs_found+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 FillNAnd3(Bool *chged,I64 *num_outputs_found)
|
||||
{
|
||||
I64 i,j,k,l;
|
||||
U8 old_type;
|
||||
for (i=0;i<table_size;i++)
|
||||
if (gate_type_table[i]>GT_OUTPUT && !Bt(added_this_pass,i))
|
||||
for (k=0;k<table_size;k++)
|
||||
if (gate_type_table[k]>GT_OUTPUT && !Bt(added_this_pass,k))
|
||||
for (l=0;l<table_size;l++)
|
||||
if (gate_type_table[l]>GT_OUTPUT && !Bt(added_this_pass,l)) {
|
||||
progress1=i;
|
||||
j= (~(i & k & l)) & (table_size-1);
|
||||
old_type=gate_type_table[j];
|
||||
if (old_type<GT_INPUT) {
|
||||
gate_type_table[j]=GT_NAND3;
|
||||
input1_table[j]=i;
|
||||
input2_table[j]=k;
|
||||
input3_table[j]=l;
|
||||
Bts(added_this_pass,j);
|
||||
*chged=TRUE;
|
||||
if (old_type==GT_OUTPUT) {
|
||||
if (output_found<0) output_found=j;
|
||||
*num_outputs_found=*num_outputs_found+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
U0 FillNOr3(Bool *chged,I64 *num_outputs_found)
|
||||
{
|
||||
I64 i,j,k,l;
|
||||
U8 old_type;
|
||||
for (i=0;i<table_size;i++)
|
||||
if (gate_type_table[i]>GT_OUTPUT && !Bt(added_this_pass,i))
|
||||
for (k=0;k<table_size;k++)
|
||||
if (gate_type_table[k]>GT_OUTPUT && !Bt(added_this_pass,k))
|
||||
for (l=0;l<table_size;l++)
|
||||
if (gate_type_table[l]>GT_OUTPUT && !Bt(added_this_pass,l)) {
|
||||
progress1=i;
|
||||
j= (~(i | k | l)) & (table_size-1);
|
||||
old_type=gate_type_table[j];
|
||||
if (old_type<GT_INPUT) {
|
||||
gate_type_table[j]=GT_NOR3;
|
||||
input1_table[j]=i;
|
||||
input2_table[j]=k;
|
||||
input3_table[j]=l;
|
||||
Bts(added_this_pass,j);
|
||||
*chged=TRUE;
|
||||
if (old_type==GT_OUTPUT) {
|
||||
if (output_found<0) output_found=j;
|
||||
*num_outputs_found=*num_outputs_found+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
I64 FillGateTable()
|
||||
{
|
||||
I64 current_gate,num_outputs_found=0;
|
||||
Bool chged=TRUE;
|
||||
passes=1;
|
||||
output_found=-1;
|
||||
ProgressBarsRst;
|
||||
progress1_max=table_size;
|
||||
NewLine;
|
||||
while (num_outputs_found<num_outputs_entered && chged) {
|
||||
"Pass : %d\n",passes++;
|
||||
chged=FALSE;
|
||||
MemSet(added_this_pass,0,(table_size+7)/8);
|
||||
for (current_gate=0;current_gate<num_selected_gates &&
|
||||
num_outputs_found<num_outputs_entered;current_gate++) {
|
||||
switch (selected_gates[current_gate]) {
|
||||
case GT_NOT: FillNot (&chged,&num_outputs_found); break;
|
||||
case GT_AND: FillAnd (&chged,&num_outputs_found); break;
|
||||
case GT_OR: FillOr (&chged,&num_outputs_found); break;
|
||||
case GT_NAND: FillNAnd (&chged,&num_outputs_found); break;
|
||||
case GT_NOR: FillNOr (&chged,&num_outputs_found); break;
|
||||
case GT_XOR: FillXor (&chged,&num_outputs_found); break;
|
||||
case GT_AND3: FillAnd3 (&chged,&num_outputs_found); break;
|
||||
case GT_OR3: FillOr3 (&chged,&num_outputs_found); break;
|
||||
case GT_NAND3: FillNAnd3(&chged,&num_outputs_found); break;
|
||||
case GT_NOR3: FillNOr3 (&chged,&num_outputs_found); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
ProgressBarsRst;
|
||||
return num_outputs_found;
|
||||
}
|
||||
|
||||
U0 CleanUp()
|
||||
{
|
||||
Free(gate_type_table);
|
||||
Free(displayed_design);
|
||||
Free(added_this_pass);
|
||||
Free(input1_table);
|
||||
Free(input2_table);
|
||||
Free(input3_table);
|
||||
}
|
||||
|
||||
U0 DigitalLogic()
|
||||
{
|
||||
gate_type_table =NULL;
|
||||
displayed_design=NULL;
|
||||
added_this_pass =NULL;
|
||||
input1_table =NULL;
|
||||
input2_table =NULL;
|
||||
input3_table =NULL;
|
||||
|
||||
SettingsPush; //See $LK,"SettingsPush","MN:SettingsPush"$
|
||||
WinMax;
|
||||
WordStat;
|
||||
WinBorder(ON);
|
||||
DocClear;
|
||||
PmtGates;
|
||||
try {
|
||||
Init;
|
||||
if (FillGateTable) {
|
||||
DocCursor;
|
||||
DocClear;
|
||||
Fs->draw_it=&DrawIt;
|
||||
GetChar;
|
||||
DocClear;
|
||||
WinMgrSync(2,TRUE);
|
||||
DocBottom;
|
||||
}
|
||||
} catch
|
||||
CatchAll;
|
||||
SettingsPop;
|
||||
CleanUp;
|
||||
}
|
||||
| ||||