tag:blogger.com,1999:blog-14749632971856664292024-03-13T07:47:51.884-07:00Cogwheel’s BlogshopRants and Ravings from Cogwheel’s WorkshopCogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.comBlogger51125tag:blogger.com,1999:blog-1474963297185666429.post-50475507729563602282024-02-06T12:55:00.000-08:002024-02-06T12:58:52.832-08:00Snowballs<h1 id="snowballs"></h1>
<p>Our visit to the Sierra Madre Playhouse last Saturday proved to be a
turning point for me. I feel like the static friction is broken, and
this enormous weight I'm trying to push is ever-so-slightly starting to
roll. Here's a sampling of my experiences.</p>
<h2 id="prep-work">Prep Work</h2>
<p>My plans were very modest: I didn't want to cause a scene or do
anything that might draw the wrong kind of attention. I didn't want to
intimidate people by having a camera on, get in their faces, etc. I just
wanted to share information that has been kept from the audience. Then I
want them to form their own opinions on both Frederick Hodges for being
a child molester and Sierra Madre Playhouse for covering for him.</p>
<p>My wife and I (and our little dogs, too) would simply stand out front
and hand out "information about the piano player for today's event". I
made the following flyer with a brief and intentionally shocking
description of my tribulations. The contrast between the cheerful
attitude and the message on the flyer would create cognitive dissonance
that is difficult to put out of mind.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivC-55pGXjMpfsemlotHHZUgkxiXmMYm8_lFJ5SDxPLce48ey310fSjYfJpZVoSs34XakkSkvnGo8A_ktDi32YUhu_CkpTOorpHalA_h5DIwskBY_hH0LWF4BbnZ9XAJ-UXhqpDgoXWrMTaRQ_boAOqfUsFkyXGCPWdeaOeS-4GWE18WQC6szP_XZXWoA/s1411/Screenshot%202024-02-02%20143146.png" style="margin-left: 1em; margin-right: 1em;"><img alt="This is Frederick Hodges (36) and me (15) in 1998, after 4 years of grooming. Quite the spitting image, aren’t I? By this point I was getting too old for him. Two years earlier, he was asking me to give him a blowjob while we were travelling in Paris. Two years before that, when I was 11 years old, we were jumping on the beds in a hotel room playing Grab-the-Foreskin, cheerfully whisper-screaming “No, Ike! Don’t rape me!” This racist child molester will be performing for you today. Frederick was acquitted in 2012 of molesting two other students of his, mostly by assassinating the mother’s character. It sure pays to have excellent lawyers funded by members of the art deco society who refuse to acknowledge the truth. I went public with my story in 2016. There was the usual outpouring of support from friends, family, and occasional passers-by. However, from the ragtime, classic film, and other music communities, all I heard were deafening crickets. Nearly every time I’ve reached out to someone involved in an event with Frederick, they have ignored me, including Sierra Madre Playhouse. Some have outright blocked me, including Lara Gabrielle, this event’s host. Frederick Hodges is a predator and his friends are covering for him." border="0" data-original-height="1411" data-original-width="915" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivC-55pGXjMpfsemlotHHZUgkxiXmMYm8_lFJ5SDxPLce48ey310fSjYfJpZVoSs34XakkSkvnGo8A_ktDi32YUhu_CkpTOorpHalA_h5DIwskBY_hH0LWF4BbnZ9XAJ-UXhqpDgoXWrMTaRQ_boAOqfUsFkyXGCPWdeaOeS-4GWE18WQC6szP_XZXWoA/w416-h640/Screenshot%202024-02-02%20143146.png" width="416" /></a></div><p></p><h2 id="the-free-show">The Free Show</h2>
<p>The opening event of the festival was a free show at Noon. They had
limited seats available so you had to reserve a ticket. I called earlier
in the week to see if I could get tickets, but they were already "sold
out".</p>
<h3 id="back-of-house">Back of House</h3>
<p>We made it to the public parking behind the playhouse just before
11:30 and started unpacking ourselves and the dogs (we drove from Las
Vegas that morning). A quick change of shoes, refill water bottles, make
sure we have the right layers for the weather, grab some flyers out of
the box, etc.</p>
<p>Our parking spot was facing the back side of the playhouse and
surrounding buildings. While we were unpacking I glanced over and
noticed a certain tuxedo-clad blond gentleman making his way towards the
back entrance, escorted by a man with a headset. I'm fairly certain
Frederick saw and recognized me as well. He started whispering to
headset man and they were both looking our way periodically.</p>
<p>I loved this. Whatever anger and sadness I might have felt seeing his
face was drowned out by the feelings of schadenfreude and power. I can
only imagine what his guts must have felt like in that moment we made
eye contact. He could do nothing but wonder what would happen next.</p>
<h3 id="front-of-house">Front of House</h3>
<p>We walked around the corner to the front of the playhouse. There was a
nice large standing area extending out past the sidewalk, with a bench
along its perimeter. What a perfect public easement for exercising
freedom of speech! A handful of people were sitting/standing around
waiting for the doors to open. After we found a spot to sit with the
dogs I got to work.</p>
<p>"Hi, are you here for the film festival?"</p>
<p>"Yes."</p>
<p>"I have some information about the piano player if you'd like."</p>
<p>"Oh sure! Thank you!"</p>
<p>Quickly, everyone outside the building when we got there, including
the security guard and usher, had a copy in hand. I went to sit down
with my wife and dogs, waiting to see how things unfold. Just after
sitting down, I heard the distinct sound of high quality printer paper
crumpling. We looked over and saw a woman get up and throw the flyer
into a trash can.</p>
<p>Most of the other folks tastefully folded the paper and proceeded to
avoid eye contact. This is the response I was expecting, given the
apathy I've received in response to e-mails & social media posts. It
was definitely painful to watch someone make such a clear display of
refusing to even entertain the <i>existence</i> of my message, but in some ways I think it showed everyone else what kind of resistance I've been dealing with.</p>
<p>Another young man arrived and was sitting at the other end of the
bench. I did the whole spiel with him, and left him with a flyer. As I
noticed other nicely dressed people without dogs approaching, I would
repeat this process. Everyone I talked to was eager to take the flyer.</p>
<p>The security guard waved me over to talk, and I obliged. He was very
respectful and kind, and also doing his job. He quietly asked me why I
was doing this instead of trying to have a dialog. I less-than-quietly
answered "because I've been trying to have a dialogue for weeks but
Sierra Madre Playhouse keeps ignoring me". This conversation spilled
over to both the usher and the door woman, and got a bit heated. The
door woman was talking to me from across most of the standing area so it
was basically impossible not to loudly talk about how they're covering
for a child molester.</p>
<p>I guess they felt there was no reasoning with me (and if they're
going to cover for a child molester, there really isn't) so they backed
off. I went and sat down with my wife, waiting for more folks to arrive.</p>
<h3 id="student-body">Student Body</h3>
<p>The young man I mentioned earlier then came over. He struck up a
conversation to express how unbelievable it was and to give his
sympathy. He told us he was here for school credits on recommendation of
one of his teachers, but the free show was sold out. We chatted a bit
about how much trouble I've had getting anyone to show any sign of
empathy and such. He said he was going to let his classmates and teacher
know too and went on his way.</p>
<p>A little while later, the woman sitting to our right got my attention
and said something like "Hey, I just want to let you know I hear you
too. If I wasn't here with a group of friends I probably wouldn't stay".
I get it. She's not there on a mission. She heard my message and that's
all I was after.</p>
<p>The doors finally opened and most of the folks went inside. People
were arriving more frequently, and from the opposite side of where we
were stationed, so we moved to the middle. At this point I was spending
most of my time standing, approaching people cheerfully offering
information about the piano player.</p>
<p>A few times the usher would try to assert himself into the
conversation. "Don't listen to this person, just come this way". He was
by far the most active force in trying to make people ignore my message.
Every time he would dismiss me I would say something like "yeah, he
just wants to cover up the fact that the piano player is a <i>child molester</i>." "Yes, ignore the victim of sexual assault." etc.</p>
<p>These exchanges were always brief. It seems like he just wanted to
get his word in and then he'd back off. But they happened throughout the
day. It went around like this for a few more minutes, then the student
returned.</p>
<p>He had two other friends from film school and his teacher with him,
and they all came back to show me support. The teacher asked for another
copy of the flyer. We all talked a bit more (well within earshot of
others) about the issue for a while. The door woman came out and started
telling them they could come in. The student said he was told earlier
that they were sold out. She said something like "well, some seats may
have cleared up since then. come on inside". Clearly they didn't want us
interacting. The students declined and we chatted a bit longer. They
went on their way and I continued canvassing.</p>
<h3 id="don-t-shock-old-people">Don't Shock Old People</h3>
<p>As Noon approached, more people started showing up in larger clumps.
Apparently some of the folks who already got my flyer had gone to get
food & drink while they waited. As one group returned, one of the
men stepped aside from the line to talk to me. In echoes of my previous
interaction with Andy Senior of the Syncopated Times, he told me
something like "if you're going to come here with this kind of message,
don't go talking about blow jobs and rape with 80- and 90-year-olds."</p>
<p>Let me back up for a minute. In <a href="https://blog.cogwheel.info/2024/01/one-step-forward-two-steps-back.html">my last post</a>,
I had no substantial response when Andy said "The octogenarians and
nonagenarians who subscribe to TST would go into cardiac arrest." But
the more it sat with me, the more ridiculous it sounded. The day before
we left on our trip, I sent him the following message:</p>
<blockquote>
<blockquote>
<p>Now, suppose I published a front-page item with headline "Pianist
Frederick Hodges Accused of Long-Term Sexual Abuse." The octogenarians
and nonagenarians who subscribe to TST would go into cardiac arrest, but
worse, Hodges himself would see it since one of his old lady patrons
sends him a gift subscription. I would get sued to death.</p>
</blockquote>
<p>I just can't get over this paragraph. It is unfathomable to me that a
journalist could hold such views. Let's get the obvious bit out of the
way...</p>
<blockquote>
<p>I would get sued to death.</p>
</blockquote>
<p>Since when were newspapers and magazines held liable for truthfully
and accurately reporting what other people are saying? What grounds
would Frederick have to sue you for merely relaying the fact that I (and
others) have accused him of molesting children? Even if you weren't
protected by freedoms of the press, you still have truth as an absolute
defense against any libel or defamation suit. I'm very familiar with
this fact after the writer you hired hilariously threatened me with a
libel/defamation suit for putting him on a list of people who never
responded to me regarding Frederick.</p>
<p>So no, I don't believe for a second that you're genuinely worried
about being sued. This is a post hoc rationalization because you can't
bring yourself to address your admitted hypocrisy head on. By making
this choice you are covering for a child molester.</p>
<blockquote>
<p>The octogenarians and nonagenarians who subscribe to TST would go into cardiac arrest</p>
</blockquote>
<p>On one hand, this is kind of hilarious. Have you heard of
survivorship bias? Do you really think people would make it to 80 or 90
years old in this world if they couldn't handle a bit of shocking news?</p>
<p>On the other hand, could you be any more condescending? How would
your audience feel knowing you think so little of them? Do you really
think the majority of 80 or 90 year olds are so out of touch with
reality that they can't have empathy for the victim of a child molester?
It's clear that you prioritize keeping your audience in the dark in
order to maximize the economic value you extract from them. I wonder how
they would feel about that?</p>
<p>Has the Streisand Effect ever crossed your mind in this conversation?
This weekend I've got some plans that are likely to drive large volumes
of traffic to my blog, so we'll see where that leads. If by some
miracle you have a change of heart, I'm happy to tell you more about it.</p>
<p>Just to make sure these words continue to ring in your mind: you are making excuses in order to cover for a child molester.</p>
</blockquote>
<p>So with this fresh in my mind, my response to the man who took me
aside was "oh are you saying old people are too weak to hear the truth?"
He gave me a frustrated "there's no reasoning with you" look, said "OK whatever" and walked away. Something about it stuck with me, though.
This will come up later.</p>
<p>People stopped arriving around Noon, and we waited about 5 mins more
before heading back to the car. We had just been driving for 4 hours and
went straight into protest mode, so we needed to unwind a bit (and to
finish our lunch). The student group was at the corner when we were
leaving so we all chatted a bit more on the way back to the car.</p>
<p>At 1:00 we went back to the front of the building to wait for folks
to leave. After 20 mins, only a man and his child left. Maybe the show
ran over or maybe people were just hanging around socializing inside? We
decided to just go check into our motel and come back for the 4:00
show.</p>
<h2 id="the-main-event">The Main Event</h2>
<p>The drive to the theater took a lot longer the second time, so we
arrived a bit later than I hoped (15 mins instead of 30 mins early). The
doors were already open, so there were only a couple people outside
either chatting with the usher or waiting for other friends/family to
arrive. I gave a friendly wave to the security guard who smiled back.</p>
<p>This time it was a paid event, so there was a lady in the box office,
as well as a few other staff members milling about. I meant what I said
about not wanting to be a nuisance, so I didn't bother approaching the
person talking with the usher or the box office lady. At this point, I
don't think anyone affiliated with Sierra Madre Playhouse was unaware of
my presence.</p>
<p>Nothing made this clearer than when, in stark contrast to my
experiences at the Noon show, multiple people refused to even make eye
contact let alone take the info about the piano player. In the tunnel
vision and daze of emotions surrounding the whole day, I'm sure some of
them had been to the previous show and already got my flyer. But there
were others who seemed to have heard through the grapevine.</p>
<p>One person was initially dismissive, saying they worked for Sierra
Madre Playhouse as the director of marketing (probably assuming that I
was part of the event too). When I heard that, I perked up and asked
"oh! in that case, are you aware that the piano player is a child
molester and Sierra Madre Playhouse has been ignoring me for weeks?" She
said "No I hadn't heard that". I asked "do you mind if I give you some
information about it?" and to my surprise she said "yes." I almost
couldn't believe it. I thanked her, and we went about our business.</p>
<h3 id="biases-and-reflections">Biases and Reflections</h3>
<p>When no one was around, I'd go back to sit with my wife and snuggle
the dogs. She shared some feedback that I wasn't expecting. She pointed
out that I was neglecting to hand flyers to the women in some of the
groups. Having been in that tunnel vision semi-dazed state it had
completely escaped me, but upon reflection she was completely right.
Looking back on it, something about what that man said earlier had a lot
more influence on me than I thought or would have liked.</p>
<p>I was subconsciously trying to protect the old ladies just like he
wanted. It took a conscious effort to overcome this, mostly by trying to
fight off the tunnel vision. I tried to make more eye contact, and
offered flyers to everyone. I didn't have this mental block when the
group only consisted of women, or if the group was on the younger end of
the age range. I drew the line at handing them out to children though.</p>
<p>One person started questioning my motives. He asked "why are you doing this instead of talking to the police?"</p>
<p>"I <i>am</i> talking to the police. I contacted the Berkeley PD a couple weeks ago"</p>
<p>"Ok then why are you here doing this?", he said while walking away.</p>
<p>Now having to yell loud enough that he can hear me, "because people
with power can make a difference right now.". I was so frustrated I
threw in a "Duh! Why else would people protest something?" more at the
sky than at the person who had disengaged at this point.</p>
<p>One gentleman I approached said "I already talked with the piano player. It's fine."</p>
<p>"Oh, it's fine that he's a child molester? You're OK with that?"</p>
<p>A couple different gentlemen took the time to read my flyer, and came
back up to return them. One was just being dismissive, saying something
like "thanks, I don't need this." The other took the time to say he was
sorry for what I went through and offered some suggestions like talking
to the police or suing. I mentioned that I have talked to the police
but there's still a lot of questions re: statutes of limitations. But
recently they removed statutes of limitations for <i>civil</i> cases of child sexual abuse. So this is still on the table if I can find money or a pro-bono lawyer.</p>
<h3 id="the-kids-are-alright">The Kids Are Alright</h3>
<p>At some point a woman in a very fancy dress, hair, and hat
approached. I approached her and asked if she'd like some info about the
piano player. She smiled, saying "Thanks, I already know. I'm good with
it." and continued inside. At this point I probably should have, but I
could not believe what I just heard. My blurted-out response was "you
already know he's a child molester and you're OK with it?" I'm really
glad she was near the end of a large-ish crowd of arrivals because I
needed to sit down. My wife told me "well, I <i>was</i> going to compliment her on her dress, but now I just want to throw up on it."</p>
<p>Moments later everything changed. A woman and two teen/young adult
girls came out of the theater and walked up to us. They told me they
wanted me to know they heard me and care about what I went through. They
could not bring themselves to stay in the show knowing what I had
shared with them.</p>
<p>I was so humbled and appreciative I don't have a clear idea what all
was said, but the usher wanted none of this. I don't think I've painted a
complete picture of how much he played the villain's sidekick in this
whole ordeal. Every time he was outside and saw me approaching a group
of people he would actively herd people away, telling them to ignore me.</p>
<p>He's the only one who knows his motivation at the time, but for
whatever reason he decided to intervene. We were facing the entrance on
the bench, so the family had their backs to the door. The usher came and
inserted himself between us, putting his arms out like a stanchion to
guide them away from me. He told them not to interact with me, and asked
them to go back inside to watch the show.</p>
<p>One of the young women chimed in saying something like "Excuse me,
sir, I'm in public and I have the right to talk to whoever I want." They
may have exchanged some more words but I was too blown away by what was
happening for them to stick. He skulked back into the building and I'm
sure the three women could see a transformation in my face. This was one
of those faith-in-humanity restoring moments that happen all too
infrequently. We traded sympathy and gratitude, and they went off to
hopefully enjoy the rest of their night. I'm sure their consciences felt
lighter than most of the other folks at the event.</p>
<p>This put an exclamation mark on a pattern my wife and I had been
noticing: the young ones are here for it, and won't take shit from
anybody. Everyone who stuck in my mind as a particularly egregious
example of refusing to hear the truth had gray hair. The older you are,
the less you seem to care about the human condition.</p>
<p>If the "don't shock old people crowd" are any indication, this seems
to be more generational than age-related. The older generations were
trained to keep their mouths shut, never talk about their family
troubles with strangers, "stand by your man", and all that. I'm so glad
these times are changing. Your family is who you choose and who chooses
you. Everyone should be supported through their mental health struggles.
And shitty people should suffer the consequences of their shitty
actions, regardless of what can be proven beyond a reasonable doubt by a
prosecutor. Victims should be heard.</p>
<p>The show was about to start, so there weren't many more arrivals
after that. My wife and I left to relax in the motel until the next
event at 6:15. On the way we stopped at a roadside fruit stand to buy
some strawberries, and I got to practice my recently acquired (if
significantly limited) Spanish.</p>
<h2 id="the-evening-shows">The Evening Shows</h2>
<p>I got a bit confused by the schedule. There was an event at 6:15, but
it wasn't a separate ticketed event; it was a different part of the
event for folks who came at 4pm. We showed up at 5:45 but the doors were
all locked and the box office was closed. So we went back to the motel
to have dinner before the 8pm show started.</p>
<p>We arrived just about 7:30. The security guard was inside the door
opening it for attendees, and it seems as if people had been coming and
going to/from dinner. A lot of people were inside already, and I
recognized many of the folks coming back to the building. Eventually,
the security guard came outside to keep an eye on us.</p>
<p>There were a handful of groups who hadn't been to the earlier shows
so I still managed to hand out some flyers. One woman actually said "oh I
didn't get one of those earlier". I'm not sure if she was one of the
women I accidentally neglected or if she was just part of a group we
didn't encounter, but I was happy to oblige. But for the most part,
there were far more people who didn't want to engage than at the
previous shows.</p>
<p>Some of the people returning to the show were staff members. I
noticed the box office lady returning, and started to approach her. She
said something like "oh, no thanks. I already know". It had been a long
day and I was feeling a bit drained and frustrated by the
disproportionately negative responses of the evening crowd. I replied
"Oh, you already know and you're happy with that then?". She said "Oh, I
didn't say that. I'm not happy at all". This quickly interrupted my
negative thoughts and I said "Thank you for saying that. A lot of people
I've talked to don't seem so clear on that point."</p>
<p>Then I noticed she was walking with the usher, the pinnacle of folks
who don't seem so clear on that point. I hadn't consciously noticed him
before that. Maybe my mind blocked him out? Maybe it was just the tunnel
vision returning? Either way, he can't change the fact that he saw me
and heard me and knows what I came to say. Whatever his response was in
that moment, he has to go to sleep at night hearing me shout about him
covering for a child molester.</p>
<p>By 8:00, the streets were starting to look empty. No other groups
seemed to be approaching so we started packing up to leave. I went up to
the security guard, thanked him for being respectful and said sorry for
making his job harder. He thanked me and wished us a good evening.</p>
<h2 id="big-victories">Big Victories</h2>
<p>If I haven't made it clear already, I think this trip was a huge win.
I knew going into this that most people would not want to hear the
truth. I was fully prepared for the paper crumpling, the confrontations,
the dismissiveness, the condescension; these are all things I've
encountered in my recent interactions online, and in past experiences
doing activism with my grandmother.</p>
<p>A family walked out of the show because they empathize strongly
enough to be disgusted by the mere presence of Frederick Hodges, the
child molester. The show has been advertised for
at least a month. Who knows what special event they were celebrating,
or how long they've been looking forward to this. All I know is they
heard me.</p>
<p>A group of students spread the word and showed up to support <i>me</i>
instead of Sierra Madre Playhouse. They could have used the door
woman's invitation to score some class credits, but they were having
none of it.</p>
<p>A handful of others expressed their sympathies and concerns, which
was definitely a change of pace from the usual fingers in ears.</p>
<p>But most of all, my message got out. People who didn't want to
confront me had no choice. People who didn't want to hear the truth had
no choice. People who wanted to shut me down failed.</p>
<p>This is how change is made.</p>
<p style="text-align: left;"></p>Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-9589352078344552292024-01-30T15:46:00.000-08:002024-01-31T09:30:59.250-08:00One Step Forward, Two Steps Back<p>This is a follow-up to <a href="https://blog.cogwheel.info/2024/01/friends-of-child-molester.html">Friends of a Child Molester</a></p><p>First some good news...</p><h1 style="text-align: left;">Someone Finally Listened</h1><p style="text-align: left;">For once in the three years I've been actively contacting event organizers, one has finally listened. On January 30, Frederick was scheduled to appear at an event hosted by Piedmont Piano Company. I used the contact form on their website a couple weeks ago and included a link to my blog post.</p><p style="text-align: left;">Last weekend I received an e-mail that has been nearly 8 years in the making:</p><p class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVTlx6QazUeEhZLB1bvGZjXBQ4Dej4RH6TgncXrY5VmVo1DzqaZWc7p5KRluvVq4PKMCGNa03iU2dS9p3TW2prD5kI0_DQ0W4pCpmFCckfe1mwGt1vzGe0hGYJyM4Do0RibfP7k-7VBjtHUmpZVRTSXAawUUeMurx7-dbdY6jdUD2LnosZ0rDHVg7NnHE/s537/Screenshot%202024-01-28%20115532.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="108" data-original-width="537" height="64" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVTlx6QazUeEhZLB1bvGZjXBQ4Dej4RH6TgncXrY5VmVo1DzqaZWc7p5KRluvVq4PKMCGNa03iU2dS9p3TW2prD5kI0_DQ0W4pCpmFCckfe1mwGt1vzGe0hGYJyM4Do0RibfP7k-7VBjtHUmpZVRTSXAawUUeMurx7-dbdY6jdUD2LnosZ0rDHVg7NnHE/s320/Screenshot%202024-01-28%20115532.png" width="320" /></a></p><p style="text-align: left;">This hit me like a ton of bricks. The fluffy kind made of rainbows and bouncy castles and sweet, sweet vengeance. The mixture of schadenfreude, gratitude, and not gonna lie, feeling of power were completely overwhelming. The efforts I'm making are not going to waste!</p><h3 style="text-align: left;">Long Arms <br /></h3><p style="text-align: left;">Tangentially, I reported the abuse to the Berkeley PD last week, in case we're still inside some statutes of limitations. They called again yesterday for a follow up, so those wheels are still turning. Hopefully I'll be hearing from detectives and/or the DA soon.</p><p style="text-align: left;">Of course, reality has a nasty habit of snapping me back...</p><h1 style="text-align: left;">Just Try To Ignore Me</h1><p style="text-align: left;">As I mentioned last time, Sierra Madre Playhouse is featuring Frederick Hodges at a silent film festival February 3rd and 4th. Originally I had sent an e-mail to the author from Broadway World who mentioned the event, as well as contacting Sierra Madre Playhouse through their contact form online.</p><p style="text-align: left;">Since then, I have:</p><ul style="text-align: left;"><li style="text-align: left;">Tweeted about Frederick's appearance at the event, linking to my blog post and @mentioning both Sierra Madre Playhouse and Lara Gabrielle</li><li style="text-align: left;">Sent a Facebook message to the SMP page</li><li style="text-align: left;">Commented on SMP's Facebook posts that mention Frederick's event</li></ul><p>Sadly, they continue the pattern of completely ignoring me. But my efforts did not go completely unnoticed. Facebook awarded me a Top Contributor badge for being an active commenter on their page. 🙃<br /></p><h3 style="text-align: left;">Activism Activation in 5... 4...<br /></h3><p>Well given my new scorched earth approach, and thanks to a master class from my grandmother in how not to be ignored, I've decided to get more active. I'm going to be making an appearance at the upcoming event so they can no longer hide Frederick's monstrous nature from their audience.</p><p>I put together a flyer with a picture of me and Frederick where I look like his spitting image. It gives a brief description of our history together and my struggles to be heard by folks in the ragtime, classic film, and other communities. If Frederick doesn't already feel the walls closing in after today's canceled event, he sure will after this weekend.</p><h3 style="text-align: left;">One Last Chance <br /></h3><p>Since the good news I received, I've been sitting on a tiny inkling of hope that Sierra Madre Playhouse and Lara Gabrielle would hear my pleas and confront the issue. I really want to give them the benefit of the doubt, and don't really <i>love</i> the idea of a single-night trip to a Motel 6 in LA while my job is up in the air and we're packing up to move... However, I went to check on my tweet today and was greeted by this:</p><p class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3DidBZx3utOhY0AJzClWuPrL952GffHqXBOPdWNIIcZnMtA134XqmST_EqNLwyz0O2tMa2MN0WaOY_LivkkkbQwc4CvLPWxzZFWFvOrYNaXndL0r8R7aZwSOG5D91uyzl6QVqrWeZmuyAH_mFmW3j6PDqKyuM2KGkwrd7T59xVXDm0m6s7VGj1Z_XLhc/s962/Screenshot%202024-01-30%20133816.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="834" data-original-width="962" height="277" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3DidBZx3utOhY0AJzClWuPrL952GffHqXBOPdWNIIcZnMtA134XqmST_EqNLwyz0O2tMa2MN0WaOY_LivkkkbQwc4CvLPWxzZFWFvOrYNaXndL0r8R7aZwSOG5D91uyzl6QVqrWeZmuyAH_mFmW3j6PDqKyuM2KGkwrd7T59xVXDm0m6s7VGj1Z_XLhc/s320/Screenshot%202024-01-30%20133816.png" width="320" /></a></p><p style="text-align: left;">So it looks like we're going around <i>this</i> circle again. I can't tell if she doesn't want to accept that a friend of hers could be a monster or if she's financially motivated due to the ticket sales for this event, but damn. This just feels classless.</p><p style="text-align: left;">I look forward to seeing your audience this weekend.<br /></p><h1 style="text-align: left;">The Hypocrisy of AVFilm</h1><p style="text-align: left;">I've tried to reach out again to the folks running AVFilm. On the <a href="https://avfilmpresents.org/board/">page of their board members</a>, I found the following profile:</p><p style="text-align: left;"></p><blockquote><p style="text-align: left;">Hillary Kambour</p><p style="text-align: left;">Vice Chair</p><p style="text-align: left;">Hillary (she/her) is a retired trial and appellate attorney <i>who spend most of her career representing abused, abandoned, and neglected children</i>. Since moving to Dry Creek Valley in 2015, Hillary is busy in her garden, volunteering around the area, running, hiking, and biking, and trying to become proficient in Spanish. [...]<br /></p></blockquote><p style="text-align: left;">(emphasis mine)</p><p style="text-align: left;">After seeing this, I sent the following e-mail on Jan 23. As expected, I have not received a reply.<br /></p><p style="text-align: left;"></p><blockquote><p style="text-align: left;">Hello,</p><p style="text-align: left;">I read on your profile that you
were once an attorney focusing on abused children. I have contacted
AVFilm a few times over the years to let them know that they are hosting
events featuring the child molester Frederick Hodges. Their facebook
page blocked me and everyone I have contacted directly has ignored me.</p><p style="text-align: left;">Is
AVFilm representing your values by refusing to engage with someone who
was abused as a child and continuing to promote a predator?</p><p style="text-align: left;"><a data-saferedirecturl="https://www.google.com/url?q=https://blog.cogwheel.info/2024/01/friends-of-child-molester.html&source=gmail&ust=1706805358180000&usg=AOvVaw0FPHewpdqNreZg2sP6Yl__" href="https://blog.cogwheel.info/2024/01/friends-of-child-molester.html" target="_blank">https://blog.cogwheel.info/<wbr></wbr>2024/01/friends-of-child-<wbr></wbr>molester.html</a></p></blockquote><p style="text-align: left;"><a data-saferedirecturl="https://www.google.com/url?q=https://blog.cogwheel.info/2024/01/friends-of-child-molester.html&source=gmail&ust=1706805358180000&usg=AOvVaw0FPHewpdqNreZg2sP6Yl__" href="https://blog.cogwheel.info/2024/01/friends-of-child-molester.html" target="_blank"></a></p><p></p><h1 style="text-align: left;">The Syncopated Crimes</h1><p style="text-align: left;">In my last post, I mentioned I would follow up on my interactions with Andy Senior. I don't think it's worth re-hashing the entire conversation at this point. However, I think this final email interaction is quite telling.</p><h3 style="text-align: left;">Me:</h3><div style="direction: ltr;"></div><blockquote><p style="text-align: left;">And when are you going to actually report on
the fact that he's a child molester? You with the platform. You, with
all these supposed feelings that, given your inaction, sound more like
you're trying to play the victim in this situation.</p></blockquote><blockquote><p style="text-align: left;">What do you think I've been doing these last
few years if not contacting every venue, event organizer, film society,
etc. when his name comes up? You yourself said it will be hard to get
the message out. Yet here I was contacting
YOU for exactly that. You just want to pass the buck. <br /></p></blockquote><blockquote><p style="text-align: left;">Like literally everyone else I've contacted who has ignored or blocked me.</p></blockquote><div style="direction: ltr;"></div><h3 style="text-align: left;"></h3><h3 style="text-align: left;">Andy:</h3><blockquote><p style="text-align: left;">Matthew, <br /></p></blockquote><blockquote><p style="text-align: left;">I'm replying much against my better judgment since I suspect you'll take what I say and use it against me to spotlight my cowardice and hypocrisy.</p></blockquote><p></p><blockquote><p style="text-align: left;">If I am a victim, the wound is self-inflicted. I single-handedly took on a moribund publication eight years ago and kept it going—not out of any lust for power or money but out of a sense of obligation. That's on me. I felt the niche music community of which I am a part needed a quality publication to provide support and encouragement.</p></blockquote><p></p><blockquote><p style="text-align: left;">Last year I paid out almost $50K to contributors as well as covering printing, mailing, and other expenses. I paid myself nothing. The Syncopated Times is not quite breaking even. My wife and I survive on her pension and Social Security. <br /></p></blockquote><blockquote><p style="text-align: left;">Now, suppose I published a front-page item with headline "Pianist Frederick Hodges Accused of Long-Term Sexual Abuse." The octogenarians and nonagenarians who subscribe to TST would go into cardiac arrest, but worse, Hodges himself would see it since one of his old lady patrons sends him a gift subscription. I would get sued to death. <br /></p></blockquote><blockquote><p style="text-align: left;">If I'm a coward for not wanting to take on that crusade (with predictable results), so be it. I regret that I cannot be your sledgehammer. <br /></p></blockquote><blockquote><p style="text-align: left;">Sincerely, <br /></p></blockquote><blockquote><p style="text-align: left;">Andy Senior<br />Publisher and Editor<br /><i>The Syncopated Times<br /></i><span class="im">Exploring the World of Hot Jazz, Ragtime, and Swing</span> </p></blockquote><h3 style="text-align: left;">Me</h3><blockquote><p style="text-align: left;">Wouldn't want to let morals get in the way of profit. <br /></p></blockquote><blockquote><p style="text-align: left;">I hope you can't sleep at night.</p></blockquote>Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-18182225180255808222024-01-19T09:21:00.000-08:002024-01-19T10:40:15.458-08:00Friends of a Child Molester<p>Nearly eight years ago, I wrote about <a href="https://blog.cogwheel.info/2016/10/on-frederick-hodges.html">my experiences of abuse at the hands of Frederick Hodges</a>. Since then, I have received an outpouring of support from friends, family members, and even strangers.</p><p>At least from people <i>outside</i> the ragtime and classic film communities. I have contacted news outlets, e-zines, article authors, event planners, band members, etc. All but <i>two</i> completely ignored me, and not a single one has made any material changes to their coverage of this monster.</p><p>Now I'm scorched earth angry. It's time to name and shame these friends of a child molester.</p><p>I am not posting any personal contact information here, only links to the content or organizations they've been a part of. Please do not engage in harassment or threats. I want them to change their behavior, not live in fear. Well, except Frederick... May he forever live in fear of who walks behind him.<br /></p>PS: If you have any SEO tips so this post will show up when people search for these organizations, please contact me.<br /><h2 style="text-align: left;">Don Neely's Royal Society Jazz Orchestra and Child Molester Club<br /></h2><p><a href="https://royalsocietyjazzorchestra.com/contact-rsjo.html">https://royalsocietyjazzorchestra.com/contact-rsjo.html</a><br /></p><p>In the ultimate example of "stand by your man", Frederick Hodges has been a part of RSJO since before we met. There is no way in hell these people haven't heard about the accusations. But he's such a good singer and pianist it doesn't matter to them.<br /></p><p>When I contacted them by e-mail or voicemail, they ignored me. When I contacted them on Facebook they blocked me. They are actively waging a campaign of denial.</p><p>Never attribute to malice what can be explained by simple incompetence. But never rule out malice. Maybe he's not the only child molester in their midst... </p><h2 style="text-align: left;">The Syncopated Times, Promoter of Child Molesters</h2><p style="text-align: left;">In 2021 I e-mailed Larry Melton, the author of <a data-saferedirecturl="https://www.google.com/url?q=https://syncopatedtimes.com/from-the-2021-sutter-creek-ragtime-festival/&source=gmail&ust=1705765391221000&usg=AOvVaw2k8r3ELSlL1VIdXwl4Smj1" href="https://syncopatedtimes.com/from-the-2021-sutter-creek-ragtime-festival/" target="_blank">https://syncopatedtimes.com/<wbr></wbr>from-the-2021-sutter-creek-<wbr></wbr>ragtime-festival/</a> - no reply.</p><p style="text-align: left;">In 2022, I e-mailed Brian Sheridan, the author of <a href="https://syncopatedtimes.com/frederick-hodges-sophisticated-syncopation/">https://syncopatedtimes.com/frederick-hodges-sophisticated-syncopation/</a> - no reply. I emailed him again today with a heads up that I was writing this post and he <b>threatened to sue me for libel and defamation</b>.</p><p style="text-align: left;">In 2022 I e-mailed Andy Senior, the co-founder of the site. He is the only one in all these years who took the time to thoughtfully respond. Unfortunately, his thoughts didn't go far enough and to this day he continues to absolve himself of any responsibility for legitimizing Frederick's career.</p><p style="text-align: left;">I'll make a follow-up post detailing the exchange. You can see the <a href="https://www.facebook.com/cogwheel/posts/pfbid02MbipZacs9CSFFxmHeEiK5WUycuCNfnC5hKo4xZQgqY1jdZSadPCkyHjPfMhxmeB4l">latest developments on my Facebook page</a>. TL;DR: not my problem; you should write a book and then maybe people will listen.<br /></p><h2 style="text-align: left;">San Francisco Silent Film Festival Loves Child Molesters<br /></h2><p><a href="https://silentfilm.org/frederick-hodges/">https://silentfilm.org/frederick-hodges/</a></p><p>Sent an e-mail in 2021 - no reply.</p><h2 style="text-align: left;">Petaluma Film Alliance Hosts Child Molesters<br /></h2><p><a href="https://petalumafilmalliance.org/2022-fall-schedule/">https://petalumafilmalliance.org/2022-fall-schedule/</a> <br /></p><p>Sent an e-mail in 2022 - no reply.</p><h2 style="text-align: left;">Art Deco Society of California, Friend to Child Molesters<br /></h2><p><a href="https://www.artdecosocietyofcalifornia.org/music-dance">https://www.artdecosocietyofcalifornia.org/music-dance</a></p><p>Sent an e-mail in 2022 - no reply</p><h2 style="text-align: left;">AVFilm is Hosting a Child Molester</h2><div style="text-align: left;"><a href="https://avfilmpresents.org/staff/">https://avfilmpresents.org/staff/</a></div><div style="text-align: left;"><a href="https://avfilmpresents.org/board/">https://avfilmpresents.org/board/</a> <br /></div><p>They were hosting a classic film night in 2022 where Frederick was playing piano.</p><p>I e-mailed their director of programming, Michael Traina, but didn't receive a reply. <br /><br />I sent a message to their general Facebook account and they blocked me.</p><p>I sent Facebook messages to Tess Aston, Kathryn Hecht, and Hillary Kambour. None replied.<br /></p><p>I e-mailed their general account about the fact that they blocked me on Facebook and they ignored me. <br /></p><p>The event page is no longer available but this is probably just data rot.</p><h2 style="text-align: left;">The Press Democrat Doesn't Care About Child Molesters<br /></h2>I
called the news room regarding his appearance at the AVFilm event. They said someone would get back to me if they wanted
to write about it. I guess they didn't care.<h2 style="text-align: left;">San Mateo Daily Journal Ignores Child Molesters<br /></h2><p><a href="https://www.smdailyjournal.com/news/local/san-mateo-celebrating-central-park-centennial/article_5b67d15a-50fe-11ed-8f22-e7dadf6f201a.html">https://www.smdailyjournal.com/news/local/san-mateo-celebrating-central-park-centennial/article_5b67d15a-50fe-11ed-8f22-e7dadf6f201a.html</a></p><p>Sent an e-mail to the author, Curtis Driscoll, in 2022 - no reply</p><h2 style="text-align: left;">Broadway World - Child Molester at the Sierra Madre Playhouse!</h2><p><a href="https://www.broadwayworld.com/los-angeles/article/Sierra-Madre-Playhouse-Marks-Milestone-Centennial-In-Grand-Style-With-Glittering-Silent-Film-Festival-Honoring-Its-Roots-20240110">https://www.broadwayworld.com/los-angeles/article/Sierra-Madre-Playhouse-Marks-Milestone-Centennial-In-Grand-Style-With-Glittering-Silent-Film-Festival-Honoring-Its-Roots-20240110</a></p><p>Sent an email to the author, A. A. Cristie 8 days ago - no reply</p><p>Used contact us form on Sierra Madre Playhouse site - no reply<br /></p><h2 style="text-align: left;">YouTube Channels With a Child Molester on Piano<br /></h2><div style="text-align: left;">I have left comments on multiple channels with videos of Frederick. The comments have either been ignored or deleted. </div><div style="text-align: left;"> </div><div style="text-align: left;"><a href="https://www.youtube.com/@AlamedaM8">https://www.youtube.com/@AlamedaM8</a></div><div style="text-align: left;"><a href="https://www.youtube.com/@Keeper1st">https://www.youtube.com/@Keeper1st</a></div><div style="text-align: left;"><a href="https://www.youtube.com/@urfavragtimeguy3875">https://www.youtube.com/@urfavragtimeguy3875</a></div><div style="text-align: left;"><a href="https://www.youtube.com/@Ragtimer95">https://www.youtube.com/@Ragtimer95</a></div><div style="text-align: left;"><a href="https://www.youtube.com/@PiotrBarcz">https://www.youtube.com/@PiotrBarcz</a></div><div style="text-align: left;"><a href="https://www.youtube.com/channel/UCcpe7p9ZVb9i0Ws_n82zOWA">https://www.youtube.com/channel/UCcpe7p9ZVb9i0Ws_n82zOWA</a> - Janet Klein, recently appearing in duets with Frederick</div><div style="text-align: left;"><a href="https://www.youtube.com/@GeorgeCollier">https://www.youtube.com/@GeorgeCollier</a> - 831,000 Subscribers. This is someone I'm familiar with for entirely unrelated reasons</div><div style="text-align: left;"><a href="https://www.youtube.com/@Billblom">https://www.youtube.com/@Billblom</a></div><div style="text-align: left;"><a href="https://www.youtube.com/@SFRaeAnn">https://www.youtube.com/@SFRaeAnn</a> </div><div style="text-align: left;"><a href="https://www.youtube.com/@adamgswanson">https://www.youtube.com/@adamgswanson</a></div><div style="text-align: left;"><a href="https://www.youtube.com/@michaellorenzini1276">https://www.youtube.com/@michaellorenzini1276</a><br /></div><div style="text-align: left;"><a href="https://www.youtube.com/@frederickhodges">https://www.youtube.com/@frederickhodges</a> - I'm surprised my comments haven't been deleted</div><div style="text-align: left;"><a href="https://www.youtube.com/@piedmontpianocompany1825">https://www.youtube.com/@piedmontpianocompany1825</a></div><div style="text-align: left;"> </div><div style="text-align: left;"><span><a name='more'></a></span> </div><div style="text-align: left;">And after all that, I'm sure I'm still missing some. There were some websites with contact forms that didn't send me a confirmation e-mail. There are probably some comments that were deleted so now I can't find them in my history. Suffice it to say, I'm batting 0 at the moment and it's time for something to change.<br /></div><span></span>Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-20121935590845893342020-01-18T12:13:00.000-08:002020-01-18T12:13:40.509-08:00TTL Brainfuck Computer Part 9 - Clocking Back In<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-1-intro.html">Part 1</a> (first) - <a href="http://blog.cogwheel.info/2017/06/ttl-brainfuck-computer-part-8-clocking.html">Part 8</a> (prev) - Part 10 (next)<br />
<br />
After sitting in a box for two years over two moves, the BFCPU has re-emerged and progress has resumed!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-PxwOFvkGXgY/XiE8-d1WAMI/AAAAAAAADHk/fQu_6gEqxTk6TqbalZLLdrBAhzGS0FF1QCLcBGAsYHQ/s1600/IMG_20200115_090648253.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1234" data-original-width="1600" height="492" src="https://1.bp.blogspot.com/-PxwOFvkGXgY/XiE8-d1WAMI/AAAAAAAADHk/fQu_6gEqxTk6TqbalZLLdrBAhzGS0FF1QCLcBGAsYHQ/s640/IMG_20200115_090648253.jpg" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<h2>
Before the box </h2>
<br />
Shortly after I posted <a href="http://blog.cogwheel.info/2017/06/ttl-brainfuck-computer-part-8-clocking.html">the last update</a> I incorporated the new clock generator which you can see in the upper-left, though not exactly in the form pictured. There weren't any of the colored wires going over to the right side of the board. I just used a single jumper to connect any of the frequency divider outputs to a final flip-flop at the end.<br />
<br />
The flip-flop served a few purposes:<br />
<ul>
<li>Final divide-by-two stage to make a very slow clock since I didn't have a button anymore</li>
<li>Buffer so the frequency dividers wouldn't have to drive the clocks for everything else on the board</li>
<li>Provides inverted and non-inverted output</li>
</ul>
After that, I connected the program counter to the program ROM address lines.<br />
<br />
Since brainfuck programs only have 8 instructions, I only need 3 bits for the instruction set. I connected the first three data lines of the ROM to some blue LEDs and the unused lines to red ones.<br />
<br />
As a quick sanity check to make sure the chips play well together, I connected the high bit of the ROM data and the manual reset button through a NOR gate to the program counter. Since the ROM is filled with FF in the unwritten areas, this means the program I had written onto it:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">00 01 02 03 +-><</span><br />
<br />
would repeat indefinitely.<br />
<br />
I connected a slow clock to the program counter, and ... nothing. The program counter was all zeros and staying that way. The data lines of the ROM were all off, since the first instruction is 00. If I disconnected bit 7 everything would work. I spent a few days trying to diagnose the problem. I checked voltage levels, I added a buffer between the ROM data line and the reset circuitry, and then looked again at the data sheet.<br />
<br />
If I'm remembering correctly from two years in the future, I discovered that I had not ordered the part that was TTL-compatible. So I spent a bit of time looking into options for level shifting, but my efforts were quickly put on hold.<br />
<br />
I got a new job that was an hour commute each way for only 16 miles of driving, so my available time and mental capacity drained away. We decided to move closer to work, so everything was packed up.<br />
<br />
We never really settled into the first place we moved, and our bedroom had water intrusion from the storms last winter. So we moved again when our lease was up. Fast forward several months, I have yet another new job and I finally finish unpacking most of my boxes.<br />
<br />
<h2>
After the box</h2>
<br />
I got my electronics desk set up and started digging through my neural records to figure out what my next steps would be. At first I went back to looking at logic level shifting solutions, but it would just be a hack for a mistaken purchase. Plus, I was never fully convinced that that was even the problem.<br />
<br />
So I went back to investigating the circuit. I tried passing bit 7 through a bus transceiver before going to the reset line. I checked the current passing through the reset lines of the counters. I checked the voltages coming out of the ROM, the transceiver, the NOR gate, etc. Everything was consistent between bit 7 being attached and not.<br />
<br />
Then I looked at the absolute voltage levels. On the board with the ROM chip I was seeing it dip down to about 4.7 volts, even though the power supply output was reading 5.0. Eventually I narrowed it down to the power line coming into the board. So I soldered up some new leads with some 0.1" headers to provide more low resistance paths to the power supply. It was in vain though. The program counter was still resetting.<br />
<br />
Feeling a bit defeated, I hooked things back up to the scope. This time I looked for a pulse on the ROM data line. Lo and behold, for the 150 nanoseconds that the ROM takes to switch between addresses, the data lines are all high. This means the counter would reset immediately after incrementing to the second instruction!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-t1tvPYUhYd0/XiKPEOw1aYI/AAAAAAAADII/z9BKo_YLncESXwkG0cPh0y_NMRTrF0HbACLcBGAsYHQ/s1600/IMG_20200117_205001473.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://1.bp.blogspot.com/-t1tvPYUhYd0/XiKPEOw1aYI/AAAAAAAADII/z9BKo_YLncESXwkG0cPh0y_NMRTrF0HbACLcBGAsYHQ/s400/IMG_20200117_205001473.jpg" width="400" /></a></div>
<br />
All I had to do was make sure the reset only occurred on the other edge of the clock. Either I misread that the part was incompatible or I'm getting lucky, but everything I'm seeing so far points to the ROM chip working exactly as intended.<br />
<br />
With that problem solved, I was officially making progress once more!<br />
<br />
Of course, restarting isn't what most programs do when they get to
the end. If you write a brainfuck program to compute some result, you
want to see that result. Starting the program from the beginning of non-empty RAM would have unpredictable results.
So I decided to use bit 7 as a halt signal instead. This meant revisitng
the clock circuitry.<br />
<br />
<h2>
Design Time</h2>
<br />
Before getting to that, though, I started thinking more about the high level design. I've had a soft goal of one instruction per clock through this entire process, and I wanted to make sure I worked out the details for the four instructions I'm working on.<br />
<br />
I was watching Robert Baruch's series <a href="https://www.youtube.com/watch?v=AQOXoKQhG3I">Building a 6800 CPU on an FPGA with nMigen</a> and decided to come up with timing diagrams for the clock, ROM outputs, and control signals. As an example, to execute a + instruction, there are three steps:<br />
<ol>
<li>Read and decode the instruction
<ul>
<li>Increment the program counter </li>
<li>Set the RAM to input</li>
<li>Set the data register to output</li>
</ul>
</li>
<li>Pulse the data register's count up line</li>
<li>Pulse the RAM's write line</li>
</ol>
For one instruction per cycle, step 1 needs to happen on the rising edge of every clock. Step 2 has to wait 150 ns for the program ROM to update plus a bit more for that to propagate to the enable signals. Step 3 has to wait however long the count up was pulsed. Then step 1 of the next instruction will have to wait for the RAM write pulse to finish.<br />
<br />
With three different places to wait per cycle, there was no way I could just use the rising and falling edges of the clock. The first obvious thought is to use a three-phase clock, but that would be overkill. I would have six different rising or falling edges per instruction in that case. I only needed one more edge than I already had.<br />
<br />
I decided to add a single phase, delayed by the time it takes to decode an instruction (about 160ns). The instruction is read on phase 0, the data register is incremented on phase 1, and the RAM is written on the falling edge of phase 0. Rather than using pulse generators on the clock edges, I logically combined the two phases into an adder clock and a write clock. Here's the timing diagram for the full program:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-lb91NpfPtyw/XiKl6Fnfl0I/AAAAAAAADIo/-IvqQRiAragPn23njFMNsg0ut9sJTFgFgCEwYBhgL/s1600/Timing.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="547" data-original-width="1600" height="217" src="https://1.bp.blogspot.com/-lb91NpfPtyw/XiKl6Fnfl0I/AAAAAAAADIo/-IvqQRiAragPn23njFMNsg0ut9sJTFgFgCEwYBhgL/s640/Timing.png" width="640" /></a></div>
In order for the phases to overlap correctly, the clock speed has to be a bit slower than half the speed of the decoder (160ns → 320ns). That works out to a bit over 3 MHz. Not too shabby! Though if I really want to push the performance in the future, I can add a third phase for the write clock and optimize the adder->write->next instruction timings.<br />
<br />
For the actual hardware, I looked up some example circuits, and found one built around the <a href="https://www.ti.com/lit/an/sdla006a/sdla006a.pdf">74LS123</a>. This is a pair of delayed pulse circuits that can be wired up to act as a clock phase shifter. All I needed to make it work were some jumper wires, a 5k resistor, and a 10 pF capacitor.<br />
<br />
Now that I knew I had a path to success, I started working on the clock circuitry again.<br />
<br />
<h2>
Muxing it up</h2>
<br />
While I really liked having the ability
to select from a wide range of very accurate clocks, it didn't have a
convenient interface. You had to know or find out by trial and error
which pins on the chips have the clock outputs, which ones are faster
than the others, etc. and manually switch a long jumper wire between
them. As I mentioned earlier, I also lacked the ability to manually
trigger the clock.<br />
<br />
I had 26 different clock signals available from 8.000 MHz to 0.238 Hz. I knew it was going to take an entire section to make a selector, so I shifted the entire right half of the board down by one to make room for a new clock section.<br />
<br />
I found the largest multiplexers in my kit which can combine up to 8 signals into one using a three bit selection. This means I could connect 24 of the clocks to three chips, then use a fourth chip to select from those. So this means there need to be three switches to select the inputs on each of the first three multiplexers, and two switches to select between multiplexers.<br />
<br />
That left 5 inputs open on the final stage and one unused switch. I hooked one up to a wire I can use to select a clock the old way. I hooked the first four inputs up to a manual clock button and the unused switch to the high order selector bit. <br />
<br />
So with the pictured DIP switch, the first switch on the left toggles between step vs run mode (all four manual inputs vs any of the four clock inputs). Skipping one switch, the 3rd and 4th are used to select among the three multiplexers (00, 01, and 10 slowest to fastest) and the manual clock selector wire (11). The final three switches are hooked up to the other three multiplexers. This makes it easy to switch among two different clock speeds and manual mode.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-qME0NYOzHQg/XiK6WamuFCI/AAAAAAAADJA/M1Uo3BQFnSk_-LfaX2h_ksRX9kzrh_0WACLcBGAsYHQ/s1600/IMG_20200113_090529401.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="240" src="https://1.bp.blogspot.com/-qME0NYOzHQg/XiK6WamuFCI/AAAAAAAADJA/M1Uo3BQFnSk_-LfaX2h_ksRX9kzrh_0WACLcBGAsYHQ/s320/IMG_20200113_090529401.jpg" width="320" /></a></div>
<br />
<br />
The final multiplexer output goes into the flip-flop that used to be the last stage of the frequency divider. So this means the clock toggles between high and low each time you press and release the button.<br />
<br />
While moving the boards to accommodate the clock, I also discovered the earlier voltage issues
were from a single wire that had corroded. Replacing it brought the
voltage back up to 4.98 across the board, so I put the old power switch
back and gave it both an "on" and "off" LED.<br />
<br />
<h2>
Back to the drawing board</h2>
<br />
So now I had a nice convenient clock selector and single-step mode, I went back to implementing the phase shifter. I went back to the 74LS123 design doc and verified the parts I would need: 5k resistor and 10 pF capacitor.<br />
<br />
Wait... 10 pF? I think the smallest capacitor I have in my kits is 22 pF and they're all in use keeping the high frequency clocks from ringing. Not only that, but this is a freaking breadboard computer! 10 pF is down in the range where all the large, parallel runs of metal in the slots can make a significant difference. There's no way I would be able to get a reliable result from this. Thankfully I RTFMed before starting to wire it up.<br />
<br />
So my next thought was to find something in my TTL kit with a lot of gates that could be used for a propagation delay. I figured it would be one of the high numbered ones, and the highest I had was <a href="http://www.ti.com/lit/ds/symlink/sn54s373.pdf">74LS374</a>. Well what do you know. Eight flip flops? That's exactly the kind of thing I was looking for. The '374 was edge triggered though, so chaining them together would divide the frequency in half each time. Luckily I also had the '373 which is "transparent" so it would pass along the change immediately.<br />
<br />
Note to self: replace the '93s in the frequency divider with '374s<br />
<br />
I had to use 12 stages (one and a half chips' worth) to get the 160ns delay I was after, but it worked like a charm.<br />
<br />
Next I implemented the clock phase combiner in <a href="https://github.com/reds-heig/logisim-evolution">logisim-evolution</a> and did some boolean algebra to figure out how to use a single kind of gate (NOR or NAND) to reduce the chip count. I wired that up, hooked up a clock fast enough to see the two different phases clearly on the scope, and saw something pretty similar to the timing diagram!<br />
<br />
I had to do a bit of tweaking since the '373's flip-flops seem to respond faster on the falling edge than the rising edge. So at first I was getting a lot less overlap than there should have been. After switching around some of the phases and inverting the logic, it was all working as intended.<br />
<br />
<h2>
It's the final count down!</h2>
<br />
Now that I have the clock pulses I need, the last thing between here and fully executing instructions is the decoder. Figuring out which instruction is loaded is pretty simple. The <a href="https://www.onsemi.com/pub/Collateral/SN74LS155-D.PDF">74LS155</a> takes a 3-bit input and makes one of its 8 outputs low depending on the value. So I just hooked that up to the low three bits of the ROM. You can see the outputs of this selector on the right here:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-kThwQIzXXho/XiK_bg1pjoI/AAAAAAAADJc/YkVyILXSkOIBH_JmAGO-SgdMkbgdzRV_gCLcBGAsYHQ/s1600/IMG_20200113_090524838.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://1.bp.blogspot.com/-kThwQIzXXho/XiK_bg1pjoI/AAAAAAAADJc/YkVyILXSkOIBH_JmAGO-SgdMkbgdzRV_gCLcBGAsYHQ/s400/IMG_20200113_090524838.jpg" width="400" /></a></div>
<br />
Since I want FF to represent halt, all of the data lines go into an 8-bit NAND. I was starting to work out what gates/chips I would need to combine the halt signal with the clocks. Then I realized the flip-flop in the final stage of the clock selector has an input that will stop it from toggling. I just hook the NAND up to that and halt is implemented!<br />
<br />
This is where things stand right now. I just need to send the output of the selector and the correct clock signals over to the other side of the board. I'm optimistic that my next update will have a fully excuting brainfuck program (albeit without loops or I/O).<br />
<br />
Until Part 10!<br />
<br />
<br />
<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-1-intro.html">Part 1</a> (first) - <a href="http://blog.cogwheel.info/2017/06/ttl-brainfuck-computer-part-8-clocking.html">Part 8</a> (prev) - Part 10 (next)Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-42776402495985420982017-10-12T20:14:00.002-07:002017-10-12T20:22:03.915-07:00Lucky breakYesterday we were leaving Lucky (a supermarket) in downtown Hayward. Ahead in the parking lot, right next to our car, a delivery truck began backing out while a group of teenagers was walking behind it. They started waving their hands, slamming on the sides of the truck to get the driver to stop but he kept backing out. The running board hit one of the boys in the shin and he fell over. The driver continued backing up as the fallen boy scrambled away, and the others ran around to the front of the the truck trying to get him to stop.<br />
<br />
The driver finally stopped, sticking partway out into the lot and blocking our car in. At least four other people watched it happen, and they just went to their cars or into the stores and didn't want to get involved. We stood by to make sure the boys had support from witnesses.<br />
<br />
At first the scene was just commotion; the boys understandably were riled up, yelling threats of lawsuits and arrest, filming with their cell phones, taking the license plate number etc.<br />
<br />
<b>Then the driver started to back out again!</b><br />
<br />
This guy hit a minor pedestrian with a commercial truck and was going to leave the scene before any officials arrived. He backed all the way out to the point where he could start driving forward. I stepped in front of the truck and put my body against it as he inched forward. He stopped when I looked in his eyes and pulled out my phone to call 911. The boys started swarming the truck, some joining me in front or going to the back to block his exit, some climbing on the cab roof, etc.<br />
<br />
I told the dispatcher that I was witnessing a hit-and-run in progress, and that we were preventing him from leaving. I gave her my details, the location, etc. and said she was sending some officers.<br />
<br />
The driver sat there with the engine running, blocking the main lane of traffic in the lot. A woman leaving the store complained about her car being blocked in. By this time some of the angst had died down, and my wife suggested we get him to pull back into his original spot.<br />
<br />
We all started to gesture as such, asking him to park again, backing off the front of the truck to give him some room. My wife went up to the driver's window and asked him directly a few times. Eventually we saw him put the truck into gear and he parked, though he left the engine running. The boys sat down on the back of the truck, and a minute or two later the Lucky manager came out.<br />
<br />
He started asking us the usual from those of us at the back of the truck: contact info, what happened, whether we had already called the police. While we were talking with the manager, the driver finally turned off the engine and stepped out.<br />
<br />
When the manager talked to the driver, things turned towards the surreal. We overheard the driver saying something like "they got hit on purpose to get money," blaming them even though he tried to flee the scene. The manager came back and started asking once more about whether we had called the police, and said that he had as well, but that since it was private property they might not come. He asked if the boys were injured, and said that <b>it would be really bad for the driver if the police came.</b><br />
<br />
In near unison, the teenagers, my wife, and I screamed "WHAAT?!!" followed by individual variations of "Are you fucking kidding me? It's going to be bad for HIM? What about the fact that he just hit a pedestrian and tried to leave the scene? He should be arrested!"<br />
<br />
By this point it had been about 10 minutes since I called 911, and with the manager seeming to advocate for the driver, I called the non-emergency police number to check on the status of our call. She asked "aren't they on scene already?" I said no, but started looking around and saw a police car at the corner waiting to turn right.<br />
<br />
Two cars showed up at first. The officers took down my info and account, then one talked to the boys and the other went around to talk to the driver. As another police car arrived, I overheard the officer say to the driver something like "this wouldn't be so bad for you if you had a license."<br />
<br />
In the hopes of planting as few assumptions as possible, I have intentionally omitted any mention of race. But at this point, I can't just say "Everything calmed down for no apparent reason when the third officer arrived." The manager was latino, as was the driver of the truck. The first two officers were white, as were we. The third officer was black, as were the kids.<br />
<br />
Most of the people on the scene noticeably relaxed when he arrived, and various mental circuits that had been shut down in preparation for fight/flight started to fire back up again.<br />
<br />
With our accounts provided to the police and no longer feeling like we were the only ones around who could offer these boys any hope, I realized we were all standing outside in the acrid smoke funneling down from the fires up north. My wife and I had just bought some breathing masks from the hardware store nearby, and figuring that the police would be taking statements for a bit, I went back to buy a few packs for everyone. As I was leaving the store, the boys were walking away from the scene, so I handed them the masks and wished them a good one.<br />
<br />
When I got back to the car, my wife was there holding our dog as the police dispersed and the driver started to leave. Since there were no serious injuries, the police made him report the incident to his company and let him leave without arrest. At one point while I was gone, my wife said one of the white officers asked something like "Well who do you think will win you or the truck?" mirroring the victim blaming of the manager. This just added further insult to injury.<br />
<br />
We sat there for a while reflecting on what happened. There is a lot to feel ambivalent over. When the incident first occurred, the truck was moving slowly enough that the kids might have been able to avoid being hit, but that's a matter for the police/insurance to sort out. When the driver tried to flee there was no doubt that we needed to stay to support the kids.<br />
<br />
When I left to buy the masks, my wife felt helpless in the face of the victim blaming attitude of the cops, but I could see the boys appreciated the gesture. In addition to the victim blaming, the police also treated her with less credibility than me or than when I was around.<br />
<br />
Earlier we were gung ho! "He should be arrested for hit and run." But at the end of the day, I'm glad he wasn't. When I looked into his eyes I saw no malice, only fear.Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-63439561205930735182017-06-22T14:14:00.001-07:002020-01-18T12:16:11.666-08:00TTL Brainfuck Computer Part 8 - Clocking Progress<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-1-intro.html">Part 1</a> (first) - <a href="http://blog.cogwheel.info/2017/06/ttl-brainfuck-computer-part-7-eeprom.html">Part 7</a> (prev) - <a href="http://blog.cogwheel.info/2020/01/ttl-brainfuck-computer-part-9-clocking.html">Part 9</a> (next)<br />
<br />
<span style="font-size: x-small;">Note: there are plenty of pretty pictures below the fold</span><br />
<br />
My pie-in-the-sky goal for the clock speed of this computer was originally 10 MHz. The LS series chips should be capable of 16 MHz, but that's not accounting for the poorly engineered environment of a hobbyist's breadboard computer. I figured 10 MHz would offer enough head room for the chips to cope.<br />
<br />
As it turns out, the limiting factor is the EEPROM, which takes 150ns for the data to be valid after changing the address. If I set the address on the rising edge of the clock and read the data on the falling edge, that would be a period of 300ns or a frequency of 3⅓ MHz. While that's only one third of my original goal, it's well within the range of early personal computers (not that the performance will be remotely comparable).<br />
<br />
So now I actually have a realistic target frequency, which likely can be pushed a dozen or two percentage points beyond spec (hello, overclocking!). Unfortunately the trusty 555 just isn't up to the task.<br />
<br />
First of all, most sources I've read say it's only good up to about 1 MHz. But as an easily adjustable variable frequency (i.e. a single dial), the range and resolution are extremely limited.<br />
<br />
I'm using a 1 M potentiometer right now. In order to have a usable range between, say, 0.5 Hz and 32 KHz, I have to manually switch from a 10 μF capacitor to a 10 nF. I'd need to go down another two orders of magnitude on the capacitor or up two on the resistor to reach 3⅓ MHz, and as I mentioned earlier, that would push the 555 well beyond its limits.<br />
<br />
The adjustment resolution is similarly frustrating. Even though the potentiometer changes resistance linearly, the effect on clock rate highly non-linear. At the low speed end of the dial, a tiny movement makes a large difference in the clock speed. At the high speed end, the duty cycle changes more than the frequency.<br />
<div>
<br /></div>
<div>
<h3>
Duty Dilligence</h3>
<div>
<br /></div>
<div>
Speaking of the duty cycle, in order to keep the time spent on as close as possible to the time spent off, the capacitors and resistors need to be in particular ratios. To get a variable 555 timer with an even duty cycle, you would need both a potentiometer and a variable capacitor, each with an abnormally wide range.</div>
<div>
<br /></div>
<div>
As I mentioned <a href="http://blog.cogwheel.info/2017/06/ttl-brainfuck-computer-part-6.html">in a previous post</a>, the uneven duty cycle means the chips had to respond as if the clock was around 600-700 KHz even though the clock period was only 32 KHz. If I had a 3⅓ MHz clock with an 88% duty cycle, the chips would be seeing a pulse 18ns wide, which is equivalent to ~28 MHz with a 50% duty cycle.<br />
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-p-v6F8Ak010/WUv1x0G8HAI/AAAAAAAAB-E/o6vbLuwx8s0REwm9h48SKyiWgGb4kS6ogCK4BGAYYCw/s1600/IMG_20170621_234713470.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://1.bp.blogspot.com/-p-v6F8Ak010/WUv1x0G8HAI/AAAAAAAAB-E/o6vbLuwx8s0REwm9h48SKyiWgGb4kS6ogCK4BGAYYCw/s640/IMG_20170621_234713470.jpg" width="360" /></a></div>
<br /></div>
<div>
As a quick fix for the duty cycle issue, I switched the inverter on the clock for a 74LS73, using one of the J/K flip-flops in toggle mode as a single-bit counter. Since it changes with each pulse rather than at each clock edge, its output will have a duty cycle as even as the 555's period. However, the period of the flip-flop's output will be half that of the 555, so I replaced the 10 nF capacitor with a 4.7 nF to maintain the frequency range I was used to.</div>
<div>
<br /></div>
<div>
The blue line on the oscilloscope is the output of the 555 timer. You can see how it spends significantly more time on (up) than off (down). The yellow line is the output of the flip-flop. You can see how it rises or falls every time the clock signal falls. Since I'm using a "raw" flip-flop instead of a counter chip, I have access to both the Q and Q' outputs to use as clock and inverted clock. The white and yellow LEDs are connected to them, respectively.</div>
<div>
<br /></div>
<h3>
The Crystal Method</h3>
</div>
<div>
<br /></div>
<div>
One of my first toy projects when I got back into electronics was a slowly shifting RGB mood light on Arduino. The LED itself is on a tiny breadboard and attached to the arduino with 3 signals and ground. I wanted to put the code on an ATTiny on the same board as the LED for a truly minimalist design. The ATTiny requires an external crystal to run at full speed, so I got a crystal assortment from 4 MHz to 25 MHz. I haven't made much progress on that project, but I do have everything I need for a stable, high frequency clock for the BFCPU.</div>
<div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ALfFZifTI84/WUwJsrl3vII/AAAAAAAAB-k/L06pgvFwVXY7uAolWGwQM2HipcDukOEQwCK4BGAYYCw/s1600/clock_closeup.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://4.bp.blogspot.com/-ALfFZifTI84/WUwJsrl3vII/AAAAAAAAB-k/L06pgvFwVXY7uAolWGwQM2HipcDukOEQwCK4BGAYYCw/s640/clock_closeup.jpg" width="332" /></a></div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
<br /></div>
<div>
The metal can on the left is an 8.000 MHz crystal. When it's resonating, it generates a near sine wave at that frequency, but it doesn't provide much current. The nearest chip is a 74HC04 hex inverter. As a CMOS chip, its inputs respond to voltage rather than current, but its outputs can provide a wide range of current. This allows it to act as a gateway between the crystal and the TTL chips. Since the output of the first inverter is part of the crystal feedback circuit, it runs through another inverter to actually provide the 8 MHz clock signal for the rest of the system.<br />
<br />
The other chips on the board are all 74LS93s, the ripple-carry cousins of the '193 counters that make up most of the computer so far. These act as frequency dividers, giving me a selectable clock speed for any power of ½ of 8.000 MHz (4 MHz, 2 MHz, 1 MHz, 500 KHz, etc.), down to 0.4768 Hz, or about one cycle every two seconds. I'm only interested in a single "bit" at a time, so the ripple carry isn't going to be an issue.<br />
<br />
The two 22 pF capacitors on the left corner of the board are part of the crystal resonator. The bypass capacitors straddling the high frequency chips from near to far are 1 nF, 4.7 nF, 10 nF, and 47nF, chosen experimentally to minimize noise on the outputs. There are also a couple of 100 nF capacitors across the power rails closer to the low frequency chips for the same purpose.<br />
<br />
With nothing attached to the clock I was getting some pretty significant ringing in the outputs, sometimes as much as +6 V to -1.5 V peak-to-peak. It turned out to mostly be inductance from the oscilloscope probes, and pretty much disappeared when the clock was attached to other parts of the circuit.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-yiS59GXtS8U/WUwRiQ4ytfI/AAAAAAAAB-0/Z0763Seo4HguJP42_jUONiAQLxYo2WP9ACK4BGAYYCw/s1600/Clocks-and-counters.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="424" src="https://2.bp.blogspot.com/-yiS59GXtS8U/WUwRiQ4ytfI/AAAAAAAAB-0/Z0763Seo4HguJP42_jUONiAQLxYo2WP9ACK4BGAYYCw/s640/Clocks-and-counters.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Poor 555 clock, blinking away in solitude back there</td></tr>
</tbody></table>
<br />
In this shot, the long yellow lead on the left is connected to the 8 MHz output of the CMOS chip, and into the count enable circuitry of the Data Pointer and Data Register. The blue lead/oscilloscope probe is connected to the same signal.<br />
<br />
The Data Pointer is set to count down, as you can see by the red lead going to Vcc just to the left of the blue LEDs. The yellow oscilloscope probe at the top is connected to the low order bit of the Data Pointer, which should be changing at half the period of the clock. Here's the result:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-HlKl1XBaJ6w/WUwTB4I2s6I/AAAAAAAAB_A/LI0yDcIMN1Urf0JnoqGvZteb64aOLRHtwCK4BGAYYCw/s1600/IMG_20170621_233930981.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://4.bp.blogspot.com/-HlKl1XBaJ6w/WUwTB4I2s6I/AAAAAAAAB_A/LI0yDcIMN1Urf0JnoqGvZteb64aOLRHtwCK4BGAYYCw/s640/IMG_20170621_233930981.jpg" width="640" /></a></div>
<br />
The scope is triggering on the clock signal, and you can see the measurement of 8.00029 MHz in the lower right. As expected, the first counter stage is flipping with every pulse. The edges don't quite line up because of the propagation delay in the counters and the NAND gates combining the clock with the control lines. If I had measured the clock at the counter input, the edges would be much closer. I left this running for an hour or so with "infinite persistence" and there wasn't a single glitch. So far so good for pushing the limits of my components!<br />
<br />
One interesting thing to note is that TTL considers anything above 2 V to be a high signal. You can see here that the counter's output reaches just above 3 V, with a slight peak before switching. At lower frequencies, the voltage has some time to build further due to capacitive effects, and generally tops out around 4-4.5 V. You can see the effect of this in the previous image, where the 3 left-most LEDs are noticeably dimmer than the rest. The second bit from the left is the one switching the fastest, and is also the dimmest. You can see the same effect when I enable counting on the data register:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-EnBNMEiv80g/WUwWxbUXazI/AAAAAAAAB_M/tMCgLoPURr4e4zkJ9ahajdnsiFg9wOiqQCK4BGAYYCw/s1600/dimness.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://3.bp.blogspot.com/-EnBNMEiv80g/WUwWxbUXazI/AAAAAAAAB_M/tMCgLoPURr4e4zkJ9ahajdnsiFg9wOiqQCK4BGAYYCw/s640/dimness.jpg" width="384" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
This isn't just an artifact of the camera or variability in LED quality or resistor value (which is also noticeable). If the switching speed were instantaneous, the LED would be spending just as much time on as it is off, so the only reason the brightness would be different is if the amount of current flowing is different. Since the resistance of the LED (plus resistor) is essentially fixed, the only way the current can be different is if the voltage is different.<br />
<br />
Switching speed is <i>not</i> instantaneous, and doesn't change very much with clock speed. At high frequencies, instead of 50% on 50% off, it's more like 40% on, 40% off, 20% somewhere in the middle. This amplifies the effect of the already lower voltage.<br />
<br />
<h3>
Other Updates and Plans</h3>
<br />
The Data Pointer's up/down signals are now connected to the clock and control lines via NAND gates, just like the Data Register. The only buttons left are Clear signals. The Data Pointer doesn't ever load data, the load lines are all tied high.<br />
<br />
In a couple of the pictures above you can see the beginnings of the program side. From top to bottom is the Stack Pointer, Stack RAM, Program Pointer, and Program ROM. I'm in the process of wiring up the Program Pointer to the Program ROM.<br />
<br />
The milestone I'm shooting for next is to have a program in ROM control the Data Pointer and Data Register counters. But first I need to work the new clock design into the computer.<br />
<br />
<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-1-intro.html">Part 1</a> (first) - <a href="http://blog.cogwheel.info/2017/06/ttl-brainfuck-computer-part-7-eeprom.html">Part 7</a> (prev) - <a href="http://blog.cogwheel.info/2020/01/ttl-brainfuck-computer-part-9-clocking.html">Part 9</a> (next)</div>
Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-35584180272024113992017-06-21T07:44:00.000-07:002017-06-22T13:44:10.426-07:00Complaint BreadboardAs much as I have ranted over the first breadboards I used for <a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-1-intro.html">my Brainfuck computer</a>, the company behind them has tried to help. After I left a one-star review on Amazon, they admitted that their manufacturing quality varied and sent me new ones. They were indeed a bit better than the first ones in a few specific ways, so I bumped my review up to three stars.<br />
<br />
Over time, the experience was more unpleasant than first impressions suggested. They couldn't compete with a few other cheap breadboards I've acquired over the years. I won't list my grievances again here, but I decided to go back to a one-star review.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-Md27SgtaOqI/WULQE0yPJJI/AAAAAAAAB7w/d1Lvm6Pdp1ILh-nTrtV75s6kCvFmbL_ZgCK4BGAYYCw/s1600/IMG_20170615_111835031.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="640" src="https://3.bp.blogspot.com/-Md27SgtaOqI/WULQE0yPJJI/AAAAAAAAB7w/d1Lvm6Pdp1ILh-nTrtV75s6kCvFmbL_ZgCK4BGAYYCw/s640/IMG_20170615_111835031.jpg" width="360" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Pile of <strike>sh</strike>... re-assembled boards</td></tr>
</tbody></table>
Earlier this month they sent me an e-mail saying:<br />
<br />
<blockquote class="tr_bq">
Sorry to disturb you again. </blockquote>
<blockquote class="tr_bq">
I read from your review that you were dissatisfied with our breadboard. We sincerely apologize for that and we took your comment very seriously. After strict tests, we have developed a new breadboard which is of better quality. We have sent out 3 new breadboards to your address via China Post which will take about 15-20 days to deliver . The tracking number is [REDACTED] and you can track it here: https://www.17track.net/en ^.^</blockquote>
<blockquote class="tr_bq">
We care very much about how you feel and your review means everything to us. So we’d really appreciate it if you could give us an update review based on the new breadboard and our service. ^.^ </blockquote>
<blockquote class="tr_bq">
Once again I apologize for all the inconvenience caused in this case and I look forward to your reply. Thank you very much!! </blockquote>
<br />
The cynic in me thinks they mean "we found another supplier" when they say "we have developed", but I can't complain about the effort they're putting into making me a satisfied customer. I'm also a sucker for friendly emoji. :)<br />
<br />
After bouncing back and forth between USPS facilities in San Francisco and Oakland for a week, they arrived a couple days ago. Whether the cynic in me turns out to be right or not, these new ones are vastly improved over the originals.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-ECR8Jn6gqWU/WUp9dqaU-oI/AAAAAAAAB9M/cXHuC1A0IigO8GRbG32FOLDvWiMS5JNvwCK4BGAYYCw/s1600/IMG_20170621_065125189.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://3.bp.blogspot.com/-ECR8Jn6gqWU/WUp9dqaU-oI/AAAAAAAAB9M/cXHuC1A0IigO8GRbG32FOLDvWiMS5JNvwCK4BGAYYCw/s640/IMG_20170621_065125189.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Bottom: old Elegoo board. Middle: new Elegoo board. Top: corner of my Brainfuck Computer built with Jameco boards</td></tr>
</tbody></table>
Two things are obvious at first glance: the plastic is much higher quality, both in look and feel, and the silk-screening is clearer. On closer inspection, there seems to be much more consistency in the way the contacts line up with the holes.<br />
<br />
Here is a close up of the old board. You can see several areas where the contacts are directly under the holes. This would block entry of pins unless you put them in at an angle, which might go off to the side of the clip rather than into the center.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-odRc_RjQIJU/WUqAtqIRRSI/AAAAAAAAB9Y/vajUq1pN7yk9E7YLqheGrG16HgwRcN20ACK4BGAYYCw/s1600/blocked-holes.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="347" src="https://4.bp.blogspot.com/-odRc_RjQIJU/WUqAtqIRRSI/AAAAAAAAB9Y/vajUq1pN7yk9E7YLqheGrG16HgwRcN20ACK4BGAYYCw/s400/blocked-holes.jpg" width="400" /></a></div>
<br />
And here is one of the new ones for comparison:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-BmTqAbvvywM/WUqBBYC_XxI/AAAAAAAAB9g/OQnAr_FjxnUrDsKNQBCkGK6WsNsD-5Z8QCK4BGAYYCw/s1600/non-blocked-holes.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="315" src="https://1.bp.blogspot.com/-BmTqAbvvywM/WUqBBYC_XxI/AAAAAAAAB9g/OQnAr_FjxnUrDsKNQBCkGK6WsNsD-5Z8QCK4BGAYYCw/s400/non-blocked-holes.jpg" width="400" /></a></div>
<br />
One thing you might notice is that the contacts are much more visible in the new board when looking at an angle. You can see the bright spots on the left side of the holes on the left part of the board but on the right side of the holes on the right side of the board. This shows both that the contacts are more centered with respect to the holes and that they are closer to the surface of the breadboard.<br />
<br />
Combined, these two fixes should alleviate most of the problems I had with the old ones. Insertion of components with multiple pins is much less frustrating, and retention of components is much better. In particular, these new boards seem to hold onto my DIP and tactile switches just as well as the Jameco boards.<br />
<br />
The new boards also lay much flatter. The old ones had a noticeable curve out of the box, so they would tend to stretch and strain when assembled into a large panel. Here's a video demonstrating the improvements in curvature. Note: I'm using the one old Elegoo board that remained completely intact (I didn't cut the power strip off) to give it the best chances.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/dAXOe7IredU/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/dAXOe7IredU?feature=player_embedded" width="320"></iframe></div>
<br />
To be fair, there are still some problems with consistency. One of the three boards I received has a power rail where one contact in each block of 5 holes is misaligned:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-DJLmhxyBggA/WUqEO1DH33I/AAAAAAAAB9s/bH3sOXruY8MrT_Py3Hy8DlD_M3OD9XY1QCK4BGAYYCw/s1600/alignment.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="270" src="https://3.bp.blogspot.com/-DJLmhxyBggA/WUqEO1DH33I/AAAAAAAAB9s/bH3sOXruY8MrT_Py3Hy8DlD_M3OD9XY1QCK4BGAYYCw/s400/alignment.jpg" width="400" /></a></div>
<br />
I have not yet done any serious testing of their electrical characteristics since I'm not planning to assemble these into another computer. The contacts don't feel quite as eager to grip as the Jameco ones, so your mileage may vary.<br />
<br />
All in all, I'm actually quite glad to have these three new boards. I had been using some of the old ones for a couple side projects, and am eager to transfer them over.<br />
<br />
<h3>
Update 2017-06-22:</h3>
<br />
All in all I'm happy with their performance. While the power connections feel a bit looser than the Jameco boards, the electrical contact seems pretty stable. The board has no problem handling an 8 MHz crystal clock with a 24 stage (6x4 bit counter) TTL frequency divider. There is virtually no noticeable effect on the clock outputs when I jiggle the power leads coming into or jumping across the board. I'm not sure how they'd behave in the bus strip/massive board configuration I'm using for the computer, but so far they look promising.Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-44154981856519150232017-06-14T09:25:00.000-07:002017-06-22T14:15:12.116-07:00TTL Brainfuck Computer Part 7 - EEPROM woes<div>
<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-1-intro.html">Part 1</a> (first) - <a href="http://blog.cogwheel.info/2017/06/ttl-brainfuck-computer-part-6.html">Part 6</a> (prev) - <a href="http://blog.cogwheel.info/2017/06/ttl-brainfuck-computer-part-8-clocking.html">Part 8</a> (next)</div>
<div>
<br /></div>
Another week, another head scratcher. I briefly mentioned past troubles getting an EEPROM writer going with my Arduino. I had another read of <a href="http://datasheet.datasheetarchive.com/originals/distributors/Datasheets-309/85096.pdf">the data sheet</a>, and went about <a href="https://gist.github.com/cogwheel/dcbc965e0294a7ab19a48f36cd469264">rewriting much of the code</a>. I didn't notice any glaring mistakes along the way, but did gain much more confidence that my code was doing what it should be.<br />
<div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-9ZBKuGUrJXk/WUFQvcrMzII/AAAAAAAAB7U/7F3tFNlJMSgQ-oaBZ4gv2UTMcOKt0DDVACK4BGAYYCw/s1600/arduino-eeprom.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://1.bp.blogspot.com/-9ZBKuGUrJXk/WUFQvcrMzII/AAAAAAAAB7U/7F3tFNlJMSgQ-oaBZ4gv2UTMcOKt0DDVACK4BGAYYCw/s640/arduino-eeprom.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Arduino Mega2560 connected to EEPROM</td></tr>
</tbody></table>
<br />
Alas, I still was unable to get any successful data writes onto the chip. I decided to try moving it over to a breadboard with some dip switches for addressing. The address pins are pulled down through 100K resistors, and the other side of the switch is pulled up through 10K resistors. These values should work fine since this is a CMOS chip and I'm not after super fast speeds. They just need to act as a voltage divider not a current source/sink, and I have verified that the voltages are around 4.5 for the high level and 0.3 for the low level.<br />
<br />
The I/O pins are connected to one of my LED modules to show the output of the ROM, and to an 8-bit dip switch for entering data. The output enable and chip enable pins are the blue & yellow jumper wires, respectively, which I manually connect to ground or Vdd.<br />
<br />
The load signal is connected to the common pole of a DPST switch (tucked above the LEDs next to the ROM), with the normally closed position connected to Vdd and normally open connected to ground.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td><a href="http://4.bp.blogspot.com/-DUxaRVPLvMI/WUFQ85ZF0iI/AAAAAAAAB7c/hsoVkzIQHNQJQrNJekYnBXdCp47TWcxEgCK4BGAYYCw/s1600/manual-eeprom.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://4.bp.blogspot.com/-DUxaRVPLvMI/WUFQ85ZF0iI/AAAAAAAAB7c/hsoVkzIQHNQJQrNJekYnBXdCp47TWcxEgCK4BGAYYCw/s640/manual-eeprom.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Manual EEPROM reader/writer after some fixes</td></tr>
</tbody></table>
<br />
The pinout for the EEPROM identical to <a href="https://engineering.purdue.edu/ece362/Homework/PDF/cy7c199.pdf">the RAM chips I'm using</a> (the difference in address line numbers should be immaterial). According to the data sheet, doing a single byte write should have the same steps, as well: Disable output (set OE high), enable the chip (set CE low), and pulse the the Load input low. When the load input goes low, the address is latched; when the load input goes high again, the data is latched.<br />
<br />
The main difference with the RAM chip is the timings. When you issue a write, you have to wait ~5ms for the operation to complete before the data will be readable (and before doing another single-byte write). That's definitely not an issue here since I'm doing this all by hand. Unlike the EEPROM in Ben Eater's computer, this one does not specify a maximum pulse width for the write cycle, so I just have a small RC filter to compensate for switch bounce.<br />
<br />
Enabling output shows the expected 1s everywhere in the factory-fresh ROM. Before I had the data dip switch, to do a write I would:<br />
<ul>
<li>Disable the ROM output</li>
<li>Move the I/O lines from the LED array to ground</li>
<li>Press and release the LOAD button</li>
<li>Move the I/O lines back to the LED array</li>
<li>Enable ROM output</li>
</ul>
<div>
This always resulted in a full bank of lit LEDs, suggesting the write failed. There were no signs of floating inputs to suggest it was rapidly changing addresses. To rule out connection issues, I swapped out the EEPROM for one of the RAM chips. Everything worked as expected.</div>
<br />
By this point I was at a complete loss. I'd gone over the data sheet another few times. I added some bypass capacitors across the power strips near where the ROM connects to power & ground, I made sure the voltages make sense on the address pins and control signals. I used the dip switches to control the output enable pin to verify that the ROM senses the dip switch signals correctly.<br />
<br />
The fact that 2 different software/microcontroller attempts failed, as well as the manual attempts described above, and with the successful test with a RAM chip, it became hard to stand by the "poor craftsman blames his tools" principle... Maybe the data sheet incorrectly omitted a maximum time for the write pulse? Maybe I got a bad batch? Maybe I zapped all four of them them with static? (not likely; I have a grounding strap I touch every time I sit down and have never even noticed a tickle).<br />
<br />
<i>Nearly</i> ready to give up rolling my own, I started googling around for existing Arduino X28C256 EEPROM programming code. I came across <a href="http://www.edaboard.com/thread214138.html">a forum thread</a> where someone said the chips come software write-protected from the supplier, despite the data sheet saying "The X28C256 is shipped from Xicor with the software data protection NOT ENABLED" (<i>emphasis in original</i>).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.memes.at/faces/y_u_no.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://www.memes.at/faces/y_u_no.jpg" data-original-height="800" data-original-width="789" height="200" width="196" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
The Software Data protection feature requires sub-millisecond timing, so I headed back to my Arduino code, refactored things a bit, and set it up to send the unlock signal. It did not work. The data was still all 1s. In a desperate attempt to avoid an even more intense rage face, I gave up for the night.<br />
<br />
The next day it hit me... While the order of the address and data lines is immaterial for normal usage, it is absolutely critical for sending the magic values to do the software unlock. I rearranged the address lines so that they match the pinout (the data already did) and re-ran the unlock. It still failed!<br />
<br />
I need to clarify what I mean by "failing" here: The code that writes some test data reads it back and validates it against the test data. It turns on the Arduino built-in LED if it finds a mismatch. That light came on. I assumed this meant the write failed. Thinking that was a dead end, I put the ROM chip into my manual programmer to do some more investigation.<br />
<br />
Lo and behold, when I enabled the chip, some of the bits were off! Not only that, but they seem to be the correct bits for the capital T in my test data: "This is ...". The next 3 addresses had the telltale "lower case" bit set, and the 5th address in the ROM had only the 32 bit set, which is a space. Apparently my write succeeded but my verification failed.<br />
<br />
After one more pass over my code I finally realized what happened: the test data string in the original version called itself 64 bytes, but it was actually only 60 bytes. Apparently the 3 bytes beyond the end of the string are used for global variables. The writer would write whatever happened to be in those cells to the ROM, then failed verification when it read that value back but the Arduino's memory had changed. Here is the current <a href="https://gist.github.com/cogwheel/dcc8789264711e7d6cfb3957164201d5">code for the EEPROM programmer</a> after fixing that issue.<br />
<br />
I can now reliably unlock and write data to the EEPROM, and the unlocked chip works as expected in the manual programmer. Some further improvements I want to make are to use buttons to control the writing/unlocking and add a lock feature. This way it won't clobber the ROM every time it turns on, and I'll be able to use it to easily lock the chips once I have them programmed to avoid any unintended writes.<br />
<br />
Until then, I've used my manual programmer to write the first program that will run on this computer:<br />
<pre>+-><</pre>
Or in the CPU's encoding:<br />
<pre>0123</pre>
<br />
<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-1-intro.html">Part 1</a> (first) - <a href="http://blog.cogwheel.info/2017/06/ttl-brainfuck-computer-part-6.html">Part 6</a> (prev) - <a href="http://blog.cogwheel.info/2017/06/ttl-brainfuck-computer-part-8-clocking.html">Part 8</a> (next)</div>
Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-59726612411857625172017-06-02T18:30:00.000-07:002017-06-14T09:29:17.936-07:00TTL Brainfuck Computer Part 6 - Breadboards and Puzzles, Old and New<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-1-intro.html">Part 1</a> (first) - <a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-5.html">Part 5</a> (prev) - <a href="http://blog.cogwheel.info/2017/06/ttl-brainfuck-computer-part-7-eeprom.html">Part 7</a> (next)<br />
<h2>
Breadboards</h2>
<div>
<br /></div>
The <a href="https://www.jameco.com/webapp/wcs/stores/servlet/ProductDisplay?langId=-1&storeId=10001&catalogId=10001&productId=20723">new breadboards</a> arrived! At more than three times the price of the old ones and with a one year warranty, I wasn't sure exactly what to expect, but damn. Literally everything about them is an order of magnitude better, right down the quality of the packaging.<br />
<div>
<br />
<a href="http://2.bp.blogspot.com/-w8Vu9IKATW0/WTILwp-zGdI/AAAAAAAAB5s/iRQCb1xdN6YRO5rOQINSAOGJMSY89u7lACK4B/s1600/IMG_20170602_173348606_HDR.jpg" imageanchor="1"><img border="0" height="360" src="https://2.bp.blogspot.com/-w8Vu9IKATW0/WTILwp-zGdI/AAAAAAAAB5s/iRQCb1xdN6YRO5rOQINSAOGJMSY89u7lACK4B/s640/IMG_20170602_173348606_HDR.jpg" width="640" /></a><br />
<br /></div>
<div>
Here's a non-exhaustive list of the major differences:<br />
<div>
<br /></div>
<div>
<ul>
<li>The plastic looks and feels like ABS (think Legos) rather than HDPE (think plastic milk jugs)</li>
<li>The silk screening is much clearer and perfectly aligned with the holes</li>
<li>The boards lay flat by default, even when connected together</li>
<li>There are more plastic connection tabs along the long edge for better stability</li>
<li>There are connection tabs along the short edge so they can connect end-to-end, one in the center, and one on each power rail. This made the bus section of my megaboard much more stable</li>
<li>On visual inspection, none of the holes look like they're obstructed by the clips inside</li>
<li>They include a metal plate to stick on the back, I'm assuming for both shielding and structural support</li>
<li>The warm yellowish color is easier on my eyes under fluorescent/LED lighting. It also makes white wires easier to spot</li>
<li>Even though it's not white, it <i>is</i> completely opaque, so it ends up looking brighter than the white ones.</li>
<li>The double-sided tape is trimmed so it doesn't get in the way of the connection tabs</li>
<li>Pushing leads into the board doesn't push the contacts out through the other side</li>
<li>Actually, the contacts themselves deserve an entire section</li>
</ul>
<div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br /></div>
<h3>
3-2-1 Contact!</h3>
<div>
<br /></div>
<div>
Imagine you grew up eating nothing but USDA choice sirloin. Now imagine going to Morton's or Gallagher's and having, for the first time, 21+ day dry-aged prime ribeye (or filet, if you prefer). This is what it was like the first time I pushed a lead into these breadboards.</div>
<div>
<br /></div>
<div>
At first it takes a little more force than the cheap ones to open the contact. This is a teeny bit annoying for components with long leads, but I found shortening the leads makes the entire breadboard experience better (much less stuff sticking up to accidentally knock over with fat fingers, easier to add more components nearby, etc.).</div>
<div>
<br /></div>
<div>
As long as the lead is going into the plastic hole, it <i>will</i> be captured by the contacts if you apply enough pressure, unlike the old ones. Those would often bend leads even if you push them in straight down & center.</div>
<div>
<br /></div>
<div>
The power rails hold on even more tightly, which again can be somewhat annoying the first time you insert a lead, but the benefits are well worth it. None of the connections show any signs of loosening after working on other pieces of the board. The bus was physically connected to the left half by only 4 wires (2 ground and 2 power) and never showed any signs of shifting.</div>
<div>
<br /></div>
<div>
The corner-to-corner resistance with the <i>minimum</i> number of connections was about 1.5 Ω compared to the 10-20 Ω of the others (I say 10-20, because any slight movement of the old ones would screw up most of the connections).</div>
<div>
<br /></div>
<div>
So yeah. Don't skimp on your breadboards unless you're a masochist.</div>
<div>
<br />
<br />
<h3>
Copy Pasta</h3>
<br />
I spent Thursday evening moving/copying the existing circuitry to the new breadboards. From the experience with the first iteration, I decided to make several changes. Here's the current state:<br />
<br />
<a href="http://3.bp.blogspot.com/-5bAf_K7AQhs/WTIKuUVp5AI/AAAAAAAAB5k/XVskB8PCfZEnoACdergPb3GF52Rov0p4ACK4B/s1600/IMG_20170602_175411432.jpg" imageanchor="1"><img border="0" height="360" src="https://3.bp.blogspot.com/-5bAf_K7AQhs/WTIKuUVp5AI/AAAAAAAAB5k/XVskB8PCfZEnoACdergPb3GF52Rov0p4ACK4B/s640/IMG_20170602_175411432.jpg" width="640" /></a><br />
<br />
I realized I had been orienting the breadboards the wrong way around. All of the power & ground connections had to jump across the ground & power rails. This doesn't have any material effect on the functionality, but it did mean some modules would have to cross wires with another to reach power (aesthetically unpleasant), and all the power jumpers are 1/10" longer than they would otherwise need to be (marginally less cost-effective).<br />
<br />
Because of this change, I had to move the power adapter to the other side of the assembly, which is actually more convenient for the way my desk is set up. I went ahead and brought the clock with it, and I added a couple switches to the clock for manual mode (not connected yet). I also added an inverting buffer to provide both inverted (yellow) & non-inverted (white) clock signals for when that becomes a thing.<br />
<br />
Now all of the components I had working are on the left side of the board, which I'm calling the Data Side. The empty boards on the left will likely end up being the I/O areas. The right side of the board will be the Program Side, and house the program ROM, controller logic, etc.<br />
<br />
I also made an effort to do much flatter, cleaner-looking routes. The thick bundles of wire in the previous version made it difficult to use the LED modules I made to monitor the counters, and it was much harder to follow individual wires between components.<br />
<br />
Speaking of LED modules, I finished cutting the 16-bit one down to size. One of the LEDs has a janky connection. It would be pretty tedious to remove and I'd worry about damaging the ones nearby in the process, so I'm not going to bother for now.<br />
<br />
Since minimal power consumption has never been one of my goals (I'd be using CMOS if it were), and since these breadboards are so much more reliable, I decided to remove one of the tri-state buffer chips (74LS244) from the Data Register and leave the counter inputs always connected to the bus.<br />
<br />
I also modified the color scheme. I was originally planning to use rainbow colors to represent the bit positions of data lines (you can see that in the jumpers connecting the top & bottom bus sections on the old version), but that would get confusing with the colors being used for more general "kinds" of signals. I didn't end up using that, even in the previous build, but when I went to connect the new bus sections, it was a good time to solidify my plans.<br />
<br />
In the previous build, I thought it was pretty clever how the RAM chip had its bi-directional bus interface in green, and the data register had "from bus" as blue and "to bus" as yellow. However, I was disappointed by the lack of orange overall, which you may notice is "my" color (along with blue). So I decided that all connections directly to/from the data bus would be in orange. I was already using orange for the LOAD signal on the counters, so the "load data from the bus" control lines will be the same color as the connections to the bus, which is neat.<br />
<br />
I preserved the meaning of blue and yellow by using yellow to connect the outputs of the counters to the inputs of the tri-state buffers, and blue to "copy" bus signals from the buffer outputs (bus connections) to the counter inputs.<br />
<br />
The borrow/carry signals for both the data register and pointer now use the same colors: green for up, brown for down (rhymes!). I also reversed the order of the counters, such that the most significant counter is on the right. This fits a bit more logically with how the count signal flows from the buttons and avoids a two long run of wires across all the chips.<br />
<br />
This is actually why the RAM address lines look a bit in disarray; there are only 15 address lines and I had the most significant bit of the 16-bit counter connected to the address lines and I DIDN'T have the second-most significant one connected, so the memory would see 2 addresses repeated twice before moving on to the next. The look of the wires is a result of shifting them all over by one.<br />
<br />
<br /></div>
</div>
</div>
<h2>
Old Puzzles</h2>
<div>
<br /></div>
<div>
Swinging back around to the loop optimizations from last time, I had a couple fruitful <a href="https://www.reddit.com/r/programming/comments/6eh51j/brainfuck_breadboard_computer/">discussions</a> on <a href="https://www.reddit.com/r/compsci/comments/6eijl5/breadboard_brainfuck_computer/">Reddit</a> and <a href="https://news.ycombinator.com/item?id=14450945">Hacker News</a>.</div>
<div>
<br /></div>
<div>
The reason I hadn't settled on one way or another is that pre-processing allows me to achieve my performance goals during execution, but it makes the machine into a sort of combined compiler+CPU, rather than "just" a CPU. I feel strongly about both goals and have been struggling with a good way to word this newly discovered principle. The best I have so far is:</div>
<div>
<ul>
<li>Purity - This is a CPU that runs Brainfuck; strong justification is required to do anything a "normal" CPU or Brainfuck wouldn't do</li>
</ul>
<div>
I really don't want to sacrifice purity for performance, but I also don't want to sacrifice performance for purity. Luckily there is a very precise modification I can make to the principles that can give me (nearly) the best of both worlds:</div>
</div>
<div>
<ul>
<li><strike><span style="color: #cc0000;">Constant time execution of each instruction - It should never take more than 3 cycles to execute any instruction</span></strike></li>
<li><span style="color: #3d85c6;">Amortized constant time execution of each instruction - Let <i>i</i> be some instruction at a particular location in a program. Let <i>n</i> be the number of times that instruction has been executed since the program started. Let <i>E<sub>n</sub></i>(<i>i</i>) be the average number of cycles required to execute <i>i</i> <i>n</i> times. The limit of <i>E<sub>n</sub></i>(<i>i</i>) as <i>n</i> approaches infinity must be 3 or less.</span></li>
</ul>
<div>
The "minimal number of execution steps" principle could also be defined in terms of <i>E<sub>n</sub></i>(<i>i</i>), but I think it's clear enough as-is.</div>
</div>
<div>
<br /></div>
<div>
I'm now planning to use a hybrid of the approaches from the previous post. The first time through a loop, if the loop condition is 0, it will skip over the instructions in the loop one at a time. In the process, it will index the start & end locations of the loop and any loops nested inside it. The next time the loop is entered, the indexed location will be used to jump to the end if the loop condition is 0.<br />
<br />
Another advantage of this approach is that it provides an incremental pathway of increasing complexity for implementing the looping logic. I can start with the "pretend NOP" approach for linear time on both [ & ], add the stack-based approach for constant time ], then use the stack RAM as a bi-directional index for amortizing [.<br />
<br />
In a similar vein, I'm also planning to use a data zeroing counter instead of erase-on-reset. The first time a memory location is moved to, it will synthesize a 0 (probably by clearing the data register and scheduling a write to RAM). Unless a program passes over memory locations without ever reading/writing them (a rather silly pessimization in the Brainfuck code), I believe this should match the performance characteristics of pre-zeroed RAM.<br />
<br /></div>
<h2>
New Puzzles</h2>
<div>
<br />
So I got everything hooked up, and after fixing the address lines to RAM, I was still getting some weird issues. I could use the buttons to move up and down in RAM, but at some point the output would stop changing when going down. At first I thought this was just a coincidence; that a bunch of the high memory addresses, by quirk of die process, started out filled with ones on power-up.<br />
<br />
Then I hooked up my 16-bit LED counter and the strangeness intensified. With the counters all starting at zero, count up seems to work as expected. If I hit the LOAD button to fill the counter with 1s (due to floating TTL inputs pulling high), counting up once sets it to zero, and it continues counting from there. However, counting down from zero leaves it at zero. If I count up past zero, it will count down to zero and stop. If I load all ones, it <i>seemed</i> to count down from there.<br />
<br />
Until I realized that it was the most significant bits that were changing each count not the least significant. O.o When those most significant bits counted down below zero, suddenly all the least significant bits lit up, then the count-down would happen in the least-significant counter, until it reached zero. Then the most significant counter would start changing.<br />
<br />
I double checked that borrow/carry-out connected to count down/up of the next chip.<br />
<br />
I checked the continuity of connections between the chip pin entering the breadboard and the signal line entering the breadboard and found nothing wrong.<br />
<br />
I checked the voltage levels of the borrow lines with a multimeter, and they all went low-then-high as expected when I pressed the down button while the data was all zeroes.<br />
<br />
I triple-checked the borrow/carry-to-down/up connections by removing and re-inserting them. Same behavior.<br />
<br />
I verified that the underflow works with the data register (2 chips) by having it count down. All of my assumptions checked out.<br />
<br />
I replaced all the counter chips with brand new ones that came earlier this week and they behaved exactly the same. This also had the effect of quadruple-checking all of the clear, load, borrow, carry, up, & down connections.<br />
<br />
Since a lot of the issues seemed to come from the most significant bit, I swapped out the capacitor on my clock to get a range of ~ 1 to 10KHz and watched "count up" work perfectly over all 16 bits. As soon as i switched to count down, it would quickly hit zero and stop.<br />
<br />
I removed the LED bank and measured the output voltages directly, in case the LED board was causing issues. The outputs all stayed low when I tried counting down.<br />
<br />
I added a 100uF capacitor across the power rail on the board with the counters in case it was a switching issue. Same behavior.<br />
<br />
I rearranged all of the clear/load wires, both to reduce overlap and to double-check their placement, even though they both worked as expected.<br />
<br />
Nothing even hinted at a cause until I removed the borrow/down connection between the 2nd and 3rd counter. Once I did that, the low order byte started working perfectly (basically a copy of the data register). After another pass with the multimeter, I still could not see anything wrong.<br />
<br />
I started googling for issues with cascading counters, and everything I read says what I'm doing should work as expected.<br />
<br />
Knowing how much I don't know about electronics yet, I figured there was some minutiae of electrical engineering I missed. Maybe I'm getting voltage spikes? Maybe the signals are ringing in the breadboard? It's time for the oscilloscope...<br />
<br />
Since the clock signal is driven by a schmitt triggered inverter, the rising and falling edges are extremely clean. There is a tiny bit of ringing at the detection limit of my oscilloscope (70MHz), but at +/- 600mV, it should be well below the threshold for a false-1.<br />
<br />
Triggering on the clock and watching the various inputs & outputs didn't produce anything unexpected until I probed the borrow output of the third chip. Suddenly the high order bits started flashing rapidly as if the probe of my oscilloscope was dropping it to ground and triggering the count. I don't see how that would be possible unless this was a CMOS chip; my probes are set to 10x attenuation and should not draw enough current to register as a 0. Maybe I'm wrong about that?<br />
<br />
It seems consistent though. If I touch the probe to the clear line on the 3rd chip, the first two chips start behaving correctly. Wait what?<br />
<br />
I started rearranging some of the connections again while the clock was running and the LED module was plugged in. When I removed the clear line between the 3rd and 4th chip, the first 3 counters started working perfectly.<br />
<br />
Ok... Now I'm getting somewhere. I had noticed that the voltage on the Clear line was in the 0.6V range earlier. It seemed a little high, but it did make sense since you have to sink some current from TTL inputs to register a zero, and that is going through a 1K pull-down resister.<br />
<br />
I replaced the 1K resister with a 470R and everything is peachy in counter-land.<br />
<br />
I don't <i>quite</i> have a clear grasp on what's going on, but the gist of it seems that when underflowing, the fourth chip in the chain gets into a state where it drives the clear line so high the other chips register it as a signal.<br />
<br />
I'm sure there's something in the 74LS193's data sheet that would've alerted me to this problem. I had problems before with pull-down resistors. My first electronics kits had CMOS chips (one had CD4000 series, the other had both that and 74HC) so I generally went with 10K. I switched to 1K when I was having some not-similar-enough-to-ring-a-bell issues with the Data Register.<br />
<br />
Anyway, here's the thing hooked up to life support, running properly at 32 KHz. The fact that the clock is operating at 88% duty cycle means the actual swiching is happening in the hundreds of KHZ (around 700 if I mathed it right in my head). The pie in the sky goal I have in the back of my mind is 10 MHz for the final build, so this is pretty encouraging.<br />
<br />
<a href="http://1.bp.blogspot.com/-ZQc272nzohY/WTINDW-_1zI/AAAAAAAAB6E/gbxumYs0DpYd-Ig0-N0gtjihD8XEI8nXgCK4B/s1600/IMG_20170602_174320964.jpg" imageanchor="1"><img border="0" height="640" src="https://1.bp.blogspot.com/-ZQc272nzohY/WTINDW-_1zI/AAAAAAAAB6E/gbxumYs0DpYd-Ig0-N0gtjihD8XEI8nXgCK4B/s640/IMG_20170602_174320964.jpg" width="360" /></a></div>
<h2>
Next Steps</h2>
<div>
<br /></div>
<div>
<strike><span style="color: #cc0000;">Once I get </span></strike><span style="color: #3d85c6;">Now that I have</span><span style="color: #0b5394;"> </span>this counter issue sorted out, all of the major pieces of the Data Side are in place for the +, -, <, and > operations (half of the language), so I plan to move onto the Program Side.</div>
<div>
<br /></div>
<div>
Last week I made a half-hearted attempt to program an EEPROM with my Arduino but didn't get very far. The code was quick & dirty so I'm sure it wasn't doing the right thing somewhere. Hopefully my next post will involve a look through program memory.</div>
<div>
<br /></div>
<div>
<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-1-intro.html">Part 1</a> (first) - <a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-5.html">Part 5</a> (prev) - <a href="http://blog.cogwheel.info/2017/06/ttl-brainfuck-computer-part-7-eeprom.html">Part 7</a> (next)</div>
Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com1tag:blogger.com,1999:blog-1474963297185666429.post-59400889854651853512017-05-31T10:58:00.003-07:002017-06-02T18:31:19.382-07:00TTL Brainfuck Computer Part 5 - Complexities and Missteps<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-1-intro.html">Part 1</a> (first) - <a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-4-animate.html">Part 4</a> (prev) - <a href="http://blog.cogwheel.info/2017/06/ttl-brainfuck-computer-part-6.html">Part 6</a> (next)<br />
<br />
My guiding principles, both separately and in conjunction, present some interesting challenges. Here are the optimization puzzles I'm currently working on.<br />
<br />
<h3>
Minimizing Clock Per Instruction</h3>
<br />
Modifying a value in RAM involves moving the data from RAM to the Data Register, in/decrementing the Data Register, and moving the data from the Data Register back to RAM. Since Brainfuck programs usually have several +/- in a row, the data only needs to be transferred at the beginning and end of a run.<br />
<br />
To state more clearly, you only need to write to RAM when the Data Register has been incremented/decremented and the memory location is about to change. Similarly, you only need to read from RAM if the memory location has changed since the previous read. The story gets a bit more complicated with the I/O instructions, but that's for another day.<br />
<br />
As an alternative to the conditional read/write, I've been toying with the idea of putting the read/writes and inc/decs out of phase. So the RAM would be read/written on rising clock, and inc/dec would happen on falling clock. Coincidentally (or more likely by foresight of the 7400 series designers), the control signals to the RAM and counters already follow this logic. I haven't followed this line of thinking very far though so I'm not sure where it will lead.<br />
<br />
<h3>
Zeroing RAM</h3>
<br />
When a Brainfuck program begins, all memory locations have to start at 0. One option would be to keep a "Clear Pointer" of the highest accessed address. Whenever the Data Pointer goes up, if it is higher than the Clear Pointer, write a 0 to that location. With some clever micro-instruction logic, this would only take 2 extra cycles the first time you access a RAM location.<br />
<br />
A simpler (and somewhat less fun) option would be to have the reset circuitry walk through RAM with a fast clock and set it all to 0 before running the program. I feel like this better fits the "Minimal number of execution steps per instruction" principle, and more directly reflects the execution of an interpreted/complied Brainfuck program on a regular computer.<br />
<br />
<h3>
Fixing a Major Brainfuck</h3>
<br />
If you've been paying really close attention so far and, and if you have an intimate working knowledge of Brainfuck, you may have noticed some hand waiving in my early posts about constant time looping. My logisim implementation had a 'uge mistake in its implementation of the Brainfuck language, and I didn't notice until long after I'd started on the breadboard project.<br />
<br />
The loop construct, [ ... ], is represented in C as <span style="font-family: "courier new" , "courier" , monospace;">while (*data_pointer) { ... }</span>. This means that as the loop is entered, the current RAM value is read. If it's 0, the contents of the loop are skipped. Otherwise, the contents of the loop run. At the end of the loop, if the contents of RAM at the current location is NOT zero, then it jumps back to the beginning of the loop.<br />
<br />
Unfortunately, the way I built it in logisim would be represented by <span style="font-family: "courier new" , "courier" , monospace;">do { ... } while (*data_pointer);</span>. This means the contents of the loop always run at least once. An open question is whether this change breaks the language's Turing Completeness. Another open question is what do we call this new language? But those questions are for another time.<br />
<br />
Does this problem mean I have to sacrifice [ to the O(n) gods? Not necessarily... If I'm planning to do the "zero RAM on reset" strategy, I could throw in a parallel "index all the loop locations". I would have a bit of circuitry walk through program memory looking for all the [ and ]. In another RAM, at each address where there is a [ in the program, write the address of the corresponding ]. This reset circuitry could use the existing Stack RAM to balance the brackets.<br />
<br />
So that's where I am as of this moment. The replacement breadboards should be here today. Yay!<br />
<br />
<h3>
Edit</h3>
<br />
On second thought, the index could be used for both [ and ], and the stack would only be necessary during analysis. That would make the control circuitry more consistent.<br />
<br />
<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-1-intro.html">Part 1</a> (first) - <a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-4-animate.html">Part 4</a> (prev) - <a href="http://blog.cogwheel.info/2017/06/ttl-brainfuck-computer-part-6.html">Part 6</a> (next)Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-72069021397658760722017-05-30T23:57:00.001-07:002017-05-31T18:20:43.839-07:00TTL Brainfuck Computer Part 4 - Animate Objects<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-1-intro.html">Part 1</a> (first) - <a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-3-first.html">Part 3</a> (prev) - <a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-5.html">Part 5</a> (next)<br />
<br />
To breathe life into my CPU, it needs a heartbeat. I put together a simple 555 astable circuit with a 10k potentiometer to adjust the clock speed. I'm still waiting on some switches to put in a manual clock mode.<br />
<div>
<br /></div>
<div>
Since the counter control signals need to be synchronized with the clock, I added a 74LS00 (quad 2-input NAND) to combine the signals. This provides the high signal by default to disable count/load, and only activates (goes low) when both the clock and control signals go high. This "uninverts" the logic of the control signals and confuses me a couple times in the following video:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/-l9ookS6pHw/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/-l9ookS6pHw?feature=player_embedded" width="320"></iframe></div>
<div>
<br /></div>
<div>
You'll notice a couple extra jumpers connecting the ground lines on the data register. I'm starting to have some really frustrating issues with these crappy breadboards. Replacements should be here tomorrow.</div>
<div>
<br /></div>
<div>
The LED boards are made from some breadboard-style PCB that came with one of the Elegoo kits. I trimmed the plastic lip with wire nippers so they'd fit snugly. I alternated their orientations so cathode is next to cathode, anode next to anode. Then I put resistors on the underside of the board between the cathodes and the power rail of the PCB. I chopped off the cathode leads, and added a ground connection to the new common cathode. Having 2 anodes side by side with 2 blank spaces between fits perfectly in the outputs of the 193s, and only needs a small bit of bending to fit into the data bus.</div>
<div>
<br /></div>
<div>
I've got a 16-bit one for the data pointer but still need to dremel it down to size.<br />
<br />
<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-1-intro.html">Part 1</a> (first) - <a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-3-first.html">Part 3</a> (prev) - <a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-5.html">Part 5</a> (next)</div>
Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com4tag:blogger.com,1999:blog-1474963297185666429.post-35709675142903372592017-05-30T23:39:00.003-07:002017-05-31T18:19:19.608-07:00TTL Brainfuck Computer Part 3 - First Connections<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-1-intro.html">Part 1</a> (first) - <a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-2-first.html">Part 2</a> (prev) - <a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-4-animate.html">Part 4</a> (next)<br />
<br />
After making a pile of insulation confetti, here's a thing that actually does some stuff:<br />
<br />
<a href="http://4.bp.blogspot.com/-WWOk_d9QcaU/WS4hDhANVYI/AAAAAAAAB5Q/pmAZGSae3_Q4GtaAlq_HPSuNl5BxoCiPQCK4B/s1600/IMG_20170529_000851093.jpg" imageanchor="1"><img border="0" height="360" src="https://4.bp.blogspot.com/-WWOk_d9QcaU/WS4hDhANVYI/AAAAAAAAB5Q/pmAZGSae3_Q4GtaAlq_HPSuNl5BxoCiPQCK4B/s640/IMG_20170529_000851093.jpg" width="640" /></a><br />
<br />
I went ahead and grabbed one of the other 193s to finish up the Data Pointer at the top-left. The output of the counters are connected in purple to the address lines of the Data RAM.<br />
<br />
The buttons on the left are connected to Load (orange), Clear (white), Down (red/blue) and Up (green/yellow). This allows me to easily cycle through memory addresses. Load, Down, & Up are active low, so they've got pull-up resistors to +5V. Clear is pulled low.<br />
<br />
The I/O pins of the RAM are connected to the data bus. The three jumper wires coming out of the ram are Load (orange), Output Enable (blue), and Chip Enable (yellow). These are all active low, so currently it's sending whatever value is being pointed to in RAM onto the bus. The LEDs show this as 11001000 (0xC8).<br />
<br />
The Data Register has grown quite a bit more complicated. The chips with wires going to the bus are 74LS244 octal tri-state buffers. These separately connect/disconnect the inputs (blue) and outputs (yellow) of the counters to/from the data bus. If I were using CMOS chips, I would leave the inputs connected and only switch the outputs. But with TTL, inputs draw non-trivial current and I don't want to load the bus any more than necessary; breadboards already have a hard enough time delivering power.<br />
<br />
The 193s have the same jumper wire colors for clear, load, down, and up as the data pointer but are connected directly to the power rails rather than through buttons. At this point I'm more concerned with moving data between RAM and the register. I can do that in this shot by moving the blue jumper to ground on the data register (input from bus), then momentarily bringing the orange jumper to ground (load).<br />
<br />
Once the value is loaded into the register it can be modified with the up/down jumpers (albeit with tons of bounce). Then I can load it back into RAM by turning off the output from RAM (set its blue jumper high), enabling output from the data register (set its yellow pin low), and momentarily set the RAM's load pin low.<br />
<br />
Next post will demonstrate some of this in action.<br />
<br />
<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-1-intro.html">Part 1</a> (first) - <a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-2-first.html">Part 2</a> (prev) - <a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-4-animate.html">Part 4</a> (next)Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-53730339906031831162017-05-30T18:47:00.002-07:002017-05-31T18:17:24.465-07:00TTL Brainfuck Computer Part 2 - First steps<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-1-intro.html">Part 1</a> (prev) - <a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-3-first.html">Part 3</a> (next)<br />
<br />
The most basic piece of a breadboard computer is, of course, the breadboards. I found some Elegoo brand 3-packs on Amazon with primarily positive reviews for less than $10 and snagged a couple, along with some other Elegoo kits which each came with one breadboard.<br />
<br />
I was not impressed at all with their quality. The clips were misaligned so that inserting leads was tedious-to-impossible. Their own brand power modules, which have a DC jack and plug into the power rails on a breadboard, would not fit without some extreme jiggling & pin bending.<br />
<br />
I left a one-star review and they sent me replacements hoping I'd reconsider. At first they seemed much better than the original set. But while they didn't have the same frequency of issues, they still had problems. For one thing, the DIP switches I got will not stay in the holes at all. Tactile switches are similarly hard to keep in. By comparison, a breadboard that came with an electronics kit years ago holds onto these with enough force that they were more difficult to remove than insert.<br />
<br />
I ordered some better ones which should be here this week, but these ones work just well enough that I couldn't resist starting. Here is an initial layout:<br />
<br />
<a href="http://3.bp.blogspot.com/-ukiIKIbObX8/WS4bg2g7RMI/AAAAAAAAB5A/kBE5T8FETqwg9YU15osBhzgLYqjFpjMJwCK4B/s1600/preview.jpg" imageanchor="1"><img border="0" height="360" src="https://3.bp.blogspot.com/-ukiIKIbObX8/WS4bg2g7RMI/AAAAAAAAB5A/kBE5T8FETqwg9YU15osBhzgLYqjFpjMJwCK4B/s640/preview.jpg" width="640" /></a><br />
<br />
All but two of the breadboards had their "top" power rail sliced off (the slicing is just through the double-sided tape; they're otherwise joined by plastic tabs). The boards and power rails were joined together in two chunks each. I cut some pieces of hookup wire to connect the power & data buses together.<br />
<br />
The clock is a 555 timer. The second 555 is for de-bouncing the manual clock button. I'm planning to use <a href="https://www.youtube.com/watch?v=WcnHZGyzRJI">a different design</a> that only needs a single 555, but I need a SPDT switch, not just an OFF-(ON).<br />
<br />
Data Pointer and Data Register/ALU are made of Binary up/down counters (74LS193). This naturally represents the fundamental Brainfuck operations of +, -, >, and <. The Data Pointer pictured here has only 3 of the 4 chips needed to address 32 K of RAM. A handful more of these chips should be arriving this week.<br />
<br />
A + instruction will cause the Data Register to increment. A - will cause it to decrement. A > will cause the Data Pointer to increment. A < will cause it to decrement. Values will be transferred to/from RAM whenever necessary.<br />
<br />
Stack Pointer is also made of 193s to handle Brainfuck's [ and ] instructions. The location to jump to will be stored when entering the loop. An alternative design would be to keep a depth counter and decrement PC until depth goes down, but looping should be constant time for remotely reasonable performance.<br />
<br />
The Program Pointer also uses 193s; It never needs to count down, but the other binary counters in the kit are ripple carry and can't be loaded directly with data. It needs to be able to load a program counter location from the Stack Pointer.<br />
<br />
Data and Stack RAM are made of 32 KB ram chips (CY7C199-35PC). Stack needs 2 of them to handle the address width of the Data RAM. The two chips will have address lines in common, so it acts as a single 32 K x 16-bit memory.<br />
<br />
The microcode stepper is a J/K flip flop to toggle between micro-instruction steps.<br />
<br />
The Program & Microcode ROMs are 32 KB EEPROMs (X28C256P-15). This is massive overkill for the Microcode. I shouldn't need more than 8 bits per instruction and Brainfuck only has 8 instructions. I may end up doing the microcode with discrete logic gates just for the challenge.<br />
<div>
<br />
<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-1-intro.html">Part 1</a> (prev) - <a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-3-first.html">Part 3</a> (next)</div>
Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-24004304914954212242017-05-30T13:38:00.000-07:002017-05-31T18:15:48.032-07:00TTL Brainfuck Computer Part 1 - Intro<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-2-first.html">Part 2</a><br />
<br />
A couple months ago I stumbled across <a href="https://eater.net/">Ben Eater's series</a> building a breadboard computer out of TTL chips. I've had the idea in the back of my mind to do something like this for a while now, but Ben's series has kicked a lot of people over the edge and it's turning into a bit of a trend.<br />
<br />
I've always had a soft spot for <a href="https://en.wikipedia.org/wiki/Brainfuck">Brainfuck</a> (and more generally, <a href="https://esolangs.org/wiki/Main_Page">esolangs</a> and <a href="http://www.ioccc.org/">obfuscated code</a>). Way back in ought 6, I wrote an obfuscated Brainfuck interpreter to use as my e-mail signature (the yin-yang light bulb was my personal logo before Gnomes took over my identity):<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">#include <iostream> // // _ | |</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#include <fstream> //| //| // \\ \ __ /</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#include <cstring> //||//|| // // __ /o)\ __</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#define S 32768 // |// || \\_//RLANDO \(o/</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#define b ;break; // |/ ||ATTHEW 2006 ZZ</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">#define c(x,y) case x:y //==================================</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">char a[2*S],*m=a,*p=a+S,*r=p,o; void i(int n=0){char*l=p;while</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">(p<r){switch(*p++){c(43,++*m)b c(45, --*m)b c(62,++m)b c(60,--</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">m)b c(46,std::cout.put(*m))b c(44, *m=std::cin.get(o)?o:*m)b c</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">(91,if(*m)i(n+1);else for(o= 1;o&&p<r;++p){o+=*p==91;o-=*p==93</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">;})b c(93,if(*m)p=l; else return;)}}}int main(int _, char**f){</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">memset(a,0,2*S);std::ifstream z(f[1]); while(z.get(*r++));i();</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">return 0;} //BF interpreter. No err chk. 32k mem, 32k program.</span><br />
<iostream><fstream><cstring><r --=" br=" c="" m="" p="" switch=""><r o="" p="=91;o-=*p==93<br"><br /></r></r></cstring></fstream></iostream>
<iostream><fstream><cstring><r --=" br=" c="" m="" p="" switch=""><r o="" p="=91;o-=*p==93<br">Someone who knows me well enough probably could've predicted my urge to make a hardware Brainfuck computer after seeing Ben's series.</r></r></cstring></fstream></iostream><br />
<br />
From the beginning, I had some guiding principles for the design:<br />
<br />
<ul>
<li>Provide enough storage for non-trivial programs - Minimum specs matching my Brainfuck signature: 32 K instructions, 32 K data.</li>
<li>One-to-one correspondence between Brainfuck commands and CPU instructions - There is merely an encoding difference</li>
<li>Constant time execution of each instruction - It should never take more than 3 cycles to execute any instruction</li>
<li>Minimal number of execution steps - If an instruction can be executed in one cycle, it should be</li>
</ul>
The RAM needs are behind most of my departures from Ben's design. He's using a pair 74189s (or equivalent) which are 16 x 4 bit each, for a total of 16 bytes of RAM. His computer uses a Von Neumann architecture, so his RAM is used for both code and data, and all data transfers happen over a single bus. This makes his computer much closer in design to the CPUs inside desktop computers, smartphones, etc.<br />
<br />
Brainfuck programs are extremely inefficient in code size, and fairly inefficient in memory usage. Only the most trivial programs would fit in 16 bytes (nothing close to printing the Fibonacci sequence). Since I'm targeting minimal clock cycles, a Harvard architecture makes more sense, where data and instructions are transferred on separate buses. Since Brainfuck programs are so inefficient in code size, it would be extremely tedious to have to enter the program every time the system powers on. I decided to use EEPROMs for the program memory.<br />
<br />
I spent some time playing with <a href="https://github.com/reds-heig/logisim-evolution">logisim-evolution</a>, a digital circuit designer/simulator to get a rough idea of the implementation. By using RAM with asynchronous outputs (output changes immediately when the address changes) and separate inputs, I was able to make a design that executed one instruction per cycle.<br />
<br />
Then I started looking at hardware. <a href="http://www.jameco.com/z/74LS-SERIES-KIT-420-PIECE-74LS-LOGIC-SERIES-COMPONENT-KIT_84961.html">Jameco sells a kit</a> with 10 or 20 each of 35 different 74LS chips, which I believe is the same kit Ben used. Except for the RAM and ROM, this kit has pretty much everything I needed. The most important parts are the binary up/down counters (74LS193) since half of all Brainfuck operations involve either incrementing or decrementing a number (either the location in memory or the data in memory). They also had <a href="https://www.jameco.com/webapp/wcs/stores/servlet/ProductDisplay?langId=-1&storeId=10001&catalogId=10001&productId=74843">a suitable EEPROM</a>. So that side of things is fine, but I still needed RAM.<br />
<br />
Even if I used every flip flop & latch in the kit, I would still only have probably a hundred or so bytes of RAM, so I went looking for SRAM chips with 15+ address lines. Unfortunately, the only asynchronous SRAM chips available with separate input & output lines are fully dual port, meaning both sets of I/O lines can act as input or output. This makes them much more complicated in design and the cost for a 32KB chip is north of $40. On top of the cost, they're all surface mount devices (BGA, QFP, etc), so I'd have to solder them onto a break-out board. I've never done surface mount soldering, and there's no way I'm going to practice on a $40 chip.<br />
<br />
So I decided to scale back my ambitions and go for a 2-cycle design using single port RAM. I was able to get <a href="https://www.jameco.com/webapp/wcs/stores/servlet/ProductDisplay?langId=-1&storeId=10001&catalogId=10001&productId=242376"><b>ten</b> of CY7C199-35PC</a> for half the price of a single dual-port.<br />
<br />
In the next post, I'll show the initial breadboard layout and give an overview of the design of the computer.<br />
<br />
<a href="http://blog.cogwheel.info/2017/05/ttl-brainfuck-computer-part-2-first.html">Part 2</a>Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-26246574254854607172016-11-15T10:37:00.001-08:002016-11-15T10:37:44.344-08:00Third Degree RacismI think we do a terrible disservice when we slap labels on people for "who they are" rather than "what they've done." We see a Trump supporter with "Put the white back in the white house," we see Trump's tacit approval, and we see another person vote for Trump. That person must "be a racist". Not "they're acting in a racist way," not "they're tacitly supporting racism." Racism is part of the person's nature, worthy of shame and ridicule simply because they voted for Trump. Maybe in a technical sense it's true. The word "racism" has a subtler meaning among academics and the socially conscious. But most people don't have this understanding of the word by default. When you call someone a racist that implies, to them and to others, that you think they are as worthy of contempt as the people assaulting minorities.<br />
<br />
We only hold people absolutely culpable when they knowingly, intentionally, and willfully kill someone. With 1st degree murder, there has to be evidence that the killing was intended while the killer had a cool head. These are the people who kill for pleasure or personal gain.<br />
<br />
In 2nd degree murder, the willfulness and knowing are called into question. Drug use, fits of rage, etc. disconnect people from their better judgement and cause them to act in ways that go directly against their own will. They are culpable for allowing themselves to become impaired. We blame them for the murder, but we recognize that it's not on the same level as someone who spends a week plotting to kill someone.<br />
<br />
3rd degree murder (manslaughter) generally means there was no intention or willfulness to kill, but a reasonable person in the same shoes would have been able to prevent it (that our legal system is built so heavily on what a "reasonable" person would do is a whole other can of worms).<br />
<br />
Then there are other classifications for killing that aren't even called murder. They acknowledge that the killer is responsible for the death, but that there are other factors that mitigate both fault and responsibility. They may only be subject to civil penalties rather than criminal.<br />
<br />
I wish we used this kind of categorization in our interactions with people. Trump voters are indeed racist, but to varying degrees. Varying enough that if we could measure people's Racism Quotient, there would surely be a significant overlap between Clinton's supporters and Trump's. The only way we will be able to win over the people we need is if we don't alienate them. The best way to alienate them is to display that their actions are unforgivable and forever label them as "racists", "white supremacists", etc.Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-38314532934934297082016-11-10T13:05:00.002-08:002016-11-10T13:13:29.614-08:00A Romantic EndingIn order to see what Trump offers as beneficial, you need to have confidence in "the American dream." The ability to have that confidence, to truly believe that anyone can reach any level of success just by working hard enough with no consideration given to chance or starting conditions, is a privilege. It's not about how financial successful you are now, but how in control of your own fate you believe yourself to be.<br />
<br />
People who grow up in parts of America or otherwise under conditions where they can't believe in that dream, where it's obvious that the "others" and "have-nots" are being forced to remain "others" and "have-nots," and where your starting conditions all but guarantee the path your life will take, they don't have the luxury of soothing their insecurities with the notion that everything will be OK if they just work hard enough.<br />
<br />
But this isn't necessarily about Trump in particular or conservatives in general. The mentality that all you have to do to succeed is to put your mind & body to work in <i>just</i> the right way, to put your own interests first with the sincere belief that the result will be prosperity for everyone, to go through life actively making yourself oblivious to the day-to-day sufferings of the people just "over the hill" but displaying self-righteousness for your minuscule efforts to fix global, systemic problems that need an entirely different way of operating our economy...<br />
<br />
These descriptions fit equally well for a lot of the left wing new agey types. The folks who wrote-in for Sanders rather than voting for Clinton to make a statement. The ones who deny vaccines for their children and yell at my wife to stay inside from the chemtrails when all she wanted to do was admire a beautiful sunset. The ones who assign orders of magnitude more value to instinct than to objective reality (especially when it comes to children).<br />
<br />
America idolizes Romanticism (the philosophy, not the courtship rituals). When you start with the fundamental world views of conservatism (<i>in-</i>dependence is the path to prosperity, things are fine the way they are) and liberalism (<i>inter</i>-dependence is the path to prosperity, we should always be trying to change), Romanticism distorts them in ways that emphasize the differences and make it harder to reach a shared understanding.<br />
<br />
Romanticism sets up expectations that are doomed to fail for the vast majority of people, much like the promises of multilevel marketing schemes (exponentials are a bitch). Also like MLM, the most insidious part of these expectations is the idea that you only have yourself to blame for failure. If only you had sold more, if only you worked faster, if only you could find the right words, if only you weren't such a loser. This clearly has a depressing effect on the overall mood of the country.<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/sPOuIyEJnbE" width="560"></iframe>
<br />
<br />
From an anthropological perspective, it sucks that entire ways of life are lost to the ages. From a personal perspective, it sucks more to have the world as you know it crumble around you, and even more when the folks from distant lands who control most of the water and all international commerce are making all the rules for you. And describe you "from an anthropological perspective."<br />
<br />
But this nostalgia and attachment to the present/past is doing all manner of measurable harm up to and including killing people. Conservatism demands that we maintain bigotry. That we perceive all suggestions to change as threats (unless they roll back previous change). That the way things were is better than the way things are or the way things seem to be headed. That the world is too complicated for us to make any rational choices on a national/global level. Liberalism is much more open to change, but is vulnerable to similar failings from a different vantage point.<br />
<br />
We need to have a sit down with our egos, take a nice big dose of reality, and realize that there's no way we're going to get through this without working together. Reality, nature, God, whatever you want to call it, has set up a game with all kinds of traps and pitfalls, Pandora's boxes, great rewards and great suffering. Contrary to much received "wisdom", that game's rules are consistent and generally predictable. By asking the right questions we can learn how the universe behaves in ways that Romantics believe we can't. By testing our assumptions and calling our beliefs into question, we can make changes that produce a measurable improvement to everyone's quality of life (not just the people with the cities). There's no way we can do that alone; we are too imperfect.<br />
<br />
Us vs. The World gives us much better odds than Us vs. Each Other vs. The World. But you can't just sit there and expect everything to be OK without accepting change and relying on others.Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-67512652707608682062016-11-09T13:38:00.004-08:002016-11-09T13:54:06.655-08:00Elephants, Donkeys, and Voting, Oh My!A lot of Democratic voters (read: much of my Facebook feed) have expressed extreme surprise, if not genuine shock, at Trump's win. I wonder if their level of surprise is correlated with how they voted in the primaries. Much of Sanders' support came from people trying to serve the same need as the people who support Trump: the need not to feel consistently ignored by the people in power. My hypothesis is that Sanders supporters who voted for Clinton have no small helping of "told you so" to mitigate their "OMFGWTFBBQ!!!!111"<br />
<br />
To be clear, the level of sadness and rage is completely understood, and I share it to the extent that a privileged, straight, white, cis male can. However, I can't say it came as a surprise.<br />
<br />
Just before the election, Nate Silver <a href="http://fivethirtyeight.com/features/election-update-dont-ignore-the-polls-clinton-leads-but-its-a-close-race/">seemed to be defending FiveThirtyEight's suggestion</a> that Trump had a significant chance of winning. My trust in the quants grows stronger.<br />
<br />
It's ironic and sad that so many people thought Trump would be the end of the Republican party, when it seems to be the exact opposite. But hopefully the level of success of both Sanders and Trump will be a wake-up call to everyone working to keep the status quo.<br />
<br />
Speaking of status quo, there's the Electoral College. I know a lot of people will feel betrayed by the system because Clinton seems to have won more popular votes (albeit narrowly). On the one hand, in a first-past-the-post, winner-take-all system that is inevitably reduced to 1 or 2 choices, we really are being failed by the system. But the problem isn't the electoral college itself. I actually think the electoral college is doing exactly what it's designed to do: limit the influence of states that happen to have a disproportionate share of the population due to the chaotic interactions of geography, economics, and time.<br />
<br />
The simple fact is that much of the country wants something that Clinton couldn't offer but Trump is willing to promise. National frustration with DC and Wall Street is at an all time high. Confused as we might be wondering why people believe he'll actually improve things for them, he definitely offers "something different."<br />
<br />
But the problem isn't the voters or the electoral college, it's the way we actually express our votes. There were several candidates besides Trump and Clinton who many people would've been happy to see as President, even if they ultimately voted for a major candidate. But the way we vote, where every person gets a single "Yes" to assign to a candidate, has been proven mathematically to lead to a two-party (or one-party) system over time, and to minimize voter satisfaction.<br />
<br />
Wouldn't it be nice if instead we could say "I would be OK with these people being president, but not these ones"? Or even better: "I really like this lady, I'd be OK with that guy, but NO WAY do i want HIM in office." In a hypothetical race, Bernie could still be on the ticket without taking votes from Clinton, people could vote for Stein, Johnson, or that guy from Utah without feeling like they wasted their vote. Even write-in candidates would have a chance of winning, if they reached a minimum share of the vote.<br />
<br />
This kind of voting, known in various forms as approval voting, range voting, score voting, is in use at various levels of government all over the US and the world. The cool thing is that there is nothing in the constitution that dictates <i>how</i> popular votes are counted, only that the states pick electors for the electoral college based on the results. That means this change can happen in a grass-roots way, much like marijuana legalization (see what I did there?). We don't even need a constitutional amendment for this to work.<br />
<br />
If you can't readily imagine the kind of difference this would make or are curious to learn more, have a look at <a href="http://rangevoting.org/">http://rangevoting.org/</a>. There is everything from a simple high level overview down to thoroughly sourced arguments and original research. As I mentioned earlier, our current voting system has been shown to lead to a minimum of voter satisfaction. Not just suboptimal; one yes vote per person, first past the post, winner take all is worse than every other democratic voting system as far as producing outcomes that satisfy the most people. Even something as simple as changing it to "Yes/No" for each candidate makes a 'UGE difference.<br />
<br />
Please consider bringing this up with your local, state, and national representatives. It's an achievable goal that would dramatically improve how Americans feel about their ability to be heard through their votes.Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-56726758497812681392016-10-15T11:25:00.000-07:002016-10-15T11:26:59.148-07:00Your Duty to Change Your OpinionsThe set-up: A man shares a link (which I will not reproduce here) to an article by a woman voting for Trump. She executes the most impressive mental gymnastics in order to allow her support for Trump to coexist with her experiences as a sexually abused woman in America. The natural response to this was a combination of shock and pity by the sharer's female friends. One of his other friends came to his defense, and I couldn't help but respond.<br />
<hr />
<blockquote class="tr_bq">
I am so often amazed at how irrational and intolerant people can be when they don't agree with your personal opinion. Guess what? We ALL get a chance to vote, whether you agree, disagree or choose to mock and belittle others.</blockquote>
I'm amazed at how people can't seem to see the difference between people having divergent political views and people calling others out for deplorable, despicable behavior and attitudes, and an utter lack of human dignity.<br />
<blockquote class="tr_bq">
It's your opinion that another's opinion is divergent, can't you see that? And whether we agree or not, we're entitled to our own.</blockquote>
If you're really arguing that all opinions are equally worthy of respect and that there isn't any way to objectively measure the outcome of those opinions then you've already lost the plot. Please expose yourself to some philosophy and critical thinking instead of echo chambers and kool-aid drinking<br />
<br />
Some opinions are harmful in that simply believing them and sharing them with others, let alone acting on them, will cause suffering for you and those around you. If you find yourself in possession of such beliefs, then what you're experiencing right now is called cognitive dissonance. You think of yourself as a good person, you have these beliefs, therefore those beliefs can't be bad. I'm sorry to burst your bubble, but people are flawed. It's possible to believe something sincerely and without malice, but still have that belief cause harm.<br />
<br />
It's our duty as members of civilized society to question ourselves and challenge our most cherished, deeply held beliefs with intense scrutiny. The greatest enemy of progress is certainty, and "all opinions are valid" is the most insidious justification of false certainty there is.<br />
<br />
"Boys will be boys, if she didn't want to get raped she shouldn't have gone to the party drunk" --- perfectly valid opinion yeah?<br />
<br />
"That black man should be hanged for hitting on my white daughter" -- perfectly valid opinion yeah?<br />
<br />
"My baby is possessed and needs to be held under water for 10 minutes to exorcise the demon" -- just someone's opinion, right? Totally fine for them to feel that way?<br />
<br />
Please wake up. Society needs you to take off your blinders. There are real issues and real problems in the world. you can't just stick your fingers in your ears and tell people to vote for whatever opinion makes them feel good at the moment.Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-71537227879040270682016-10-12T14:01:00.004-07:002016-10-12T14:04:02.746-07:00On Emotional SupportThank you to everyone who has offered kindness and support over my recent revelations. My wife and I have been on a journey of learning to support each other emotionally over the past few years and I want to share a couple of the resources that have helped. I don't know if I would've made it to this point without them.<br />
<div>
<br /></div>
<div>
The watershed moment for us was exposure to Brené Brown's work on vulnerability. Every one of her books has been an enormous help both in our private and public lives. <a href="http://thedaringway.com/">The Daring Way</a> is working to help people and organizations find strength in vulnerability.</div>
<div>
<br /></div>
<div>
In our discussions we've often lamented how little education we receive in how to deal with emotions. There are no classes on "how to be in the room with people you don't like" or "when should you apologize?" Instead, you lash out, face punishment, and never really learn what to do with those feelings the next time they come up. Thankfully, that's changing. <a href="http://www.theschooloflife.com/">The School of Life</a> offers precisely these kinds of lessons in an easily digestible and amusing format.</div>
<div>
<br /></div>
<div>
Besides our own discoveries, I'd also like to pass along some of the resources that have been brought to my attention since revealing my story:</div>
<div>
<br /></div>
<div>
<a href="http://www.avoicefortheinnocent.org/">A Voice for the Innocent</a> whose "purpose is to allow people to share their stories of sexual abuse and rape to a listening ear who won't judge them and will still allow them to be as anonymous as they choose to be."</div>
<div>
<br /></div>
<div>
<a href="http://www.malesurvivor.org/">MaleSurvivor</a> has been conducting 3-Day Weekends of Recovery (WOR’s) throughout the US & Canada since 2001. Facilitated by a team of trained therapists and educators who adhere to the highest ethical standards of their clinical professions. These healing weekends provide adjunctive support for any male – 18 or older – who has been sexually victimized as a child and/or as an adult.</div>
Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-72746571252968625142016-10-09T17:43:00.001-07:002016-10-10T11:43:59.391-07:00On Frederick HodgesCONTENT WARNING: Explicit descriptions of sexual assault and other victimization<br />
<br />
Nothing about him was threatening, except maybe his height. But I was no shorty for an 11 year old, so it didn't mean much to me. We'd met before so that my mother could get a feel for him, once at a park for sure, and perhaps another time. The offer was generous enough: my grandmother was holding a conference on the other side of the country and one of the folks she worked with offered to bring me along and take me on a tour of Washington, DC. Growing up poor and frequently on the move didn't afford many opportunities like this, so we were all very excited.<br />
<br />
As well as those interactions went, we still proceeded cautiously. My mother and grandmother talked to me about their worries. They talked to me about what it means to be homosexual, reinforced that my body is mine and mine alone, made sure I was willing and able to say "no," etc. Let me be doubly clear: all due diligence was done. No one else in this story shares culpability besides him. I know that will do little to assuage the guilt and shame but it needs to be said nonetheless. I harbor no resentment. If they had not prepared me in this way, I'm sure the story would've played out differently.<br />
<br />
The picture of the Aryan race (tall, blond, light eyes, chiseled features), his tastes were ... apropos. His kitchen was filled with racist artwork, mostly early 20th century depictions of black people (fat women with exaggerated lips eating watermelon, and the like). The massive Duo-Art grand player piano took up the bulk of his living space and his collection of player rolls was impressive. I had never seen a laser disc collection so impressive, and ... OMG STAR TREK!!! We hit it off immediately, playing music, watching star trek and old movies from the '20s, singing, it was awesome. It was like hanging out with the rich kid but it was his own money not his parents'.<br />
<br />
Oh and the poster sized pictures of naked pre-teen boys hanging on his bedroom walls. Did I mention those?<br />
<br />
He occasionally brought up masturbation as a conversation topic. Having never tried it myself, I was thoroughly unconvinced that it was a widespread phenomenon despite his insistence. As far as I knew, no one else did it, and you would have been cast out if anyone found out you did. He asked if he could show me how, and I told him it was too embarrassing. I won't say he left it at that, but he was very good at knowing when to let off the pressure, and it felt like he was respecting my wishes.<br />
<br />
Now, I was exposed to a lot of things as a kid that I'm not sure anyone would've approved of. Between "accidentally" seeing the most graphic parts of The Accused while waiting for Crocodile Dundee to start, and catching What's Love Got to Do with It on late night HBO, let's just say I had at the same time an advanced and stunted impression of rape for an 11-year-old.<br />
<br />
What we were talking about that I would've mentioned this, I have no idea. But somehow we made a game out of Ike & Tina's relationship. By the time we had reached Maryland the game had evolved into running around the room trying to grab each other's foreskin, screaming "NO IKE!" when you got caught. It was all in good fun, right?<br />
<br />
Again, he always made sure to keep me feeling in control. If I said I didn't want something or said I was done, he would "respect" that. So with this confidence in the safety of our relationship, I continued to report "all's well" whenever my mom and grandmother would ask how things went.<br />
<br />
After the trip to Maryland, I continued to spend the occasional weekend with him, partly for piano lessons, partly for day care (single, working mother on welfare needed all the help she could get). We went to a Star Trek event at the California Academy of Sciences (which apparently was one of the topics in the suit against him; someone on the plaintiff's side witnessed us there). The poster he bought me is one of my most prized Star Trek possessions. He took me to the Ritz Carlton where he played piano in the cocktail lounge. We saw classic movies at classic theaters in Oakland & Berkeley. Oh the laser discs! And he even had a computer that I'd use to draw Star Trek control panels and the like.<br />
<br />
During this period I learned that "Mulatto" was the word you use to describe a mixed-race person, that Driving While Chinese was a thing (which I later tried to confirm with one of his Chinese, I'm assuming now ex-, friends), and that the jokes about a jew, a black, and a connecticut yankee were good clean fun. Black face was an amusing act by Eddie Cantor. A mother should be ridiculed because she thinks her daughter's name, Pajama (PA-juh-muh) is pretty.<br />
<br />
The first time I ever felt any true discomfort was quite literal. We were sitting on the couch watching Star Trek. I was laying in his lap and felt something poking me in the back. I got a little weirded out and asked if that was what I thought it was. He said no it wasn't and pulled me back down onto him. The ... problem subsided, so I didn't really think anything more of it.<br />
<br />
Still, he would occasionally bring up the masturbation thing. I mean, part of me gets it... If I were talking to a 12 year old and they insisted none of their peers masturbates, I would be laughing inside while trying to change the subject. A part of me would feel bad that he hasn't yet figured it out for himself, but it certainly wouldn't be my place to say anything. But this man was trying to convince me that I *should* be masturbating, and that he wanted to be the one to show me how.<br />
<br />
Well there I was, an increasingly horny, nearly teenage boy, watching the girls around me change both physically and in my own perception. As I was exposed to more examples besides him, I began to accept that masturbation is a perfectly normal part of being a human, and started to open up to the idea of his "offer."<br />
<br />
As soon as he picked up on this, he was straddling me on his futon, tip poking out of his pants, showing me the pre-cum/lube leaking out and asking me to touch him. To feel what a full adult erection was like in my hands. I did. He asked me to pull his foreskin down. I did. He pulled out the futon, laid down, and proceeded to masturbate. I was very curious; I'm always interested in learning new things and having new experiences, so in spite of his insistence that I never tell anyone about what we did together, I didn't feel like anything was wrong. He came, and we talked about how interesting it was that semen cycles between clear and cloudy over the course of a few minutes.<br />
<br />
I continued to visit him pretty regularly for the next year or so. We would masturbate, watch old (racist) movies, etc. Eventually I didn't see him quite as often, but my grandmother's conferences are every two years. The next one would be in Lausanne, Switzerland, and he was again ready to share his financial privilege with me for a month long tour of Europe.<br />
<br />
As it relates to the current topic, most of the second trip was uneventful. We didn't play Ike & Tina in the hotel, he actually let me eat cheese while we were in Italy (he was a hard core vegan at the time, and my protein craving guts were a wreck every time I visited), and for the first couple weeks he didn't do or say anything sexual.<br />
<br />
In fact, it may even have been me who brought up masturbation when we were in Paris. Now 13, I had a strong desire for pornography, and I heard France was a great source for such a thing (the internet was still young). When I asked him to buy me a dirty magazine, he asked me to give him a blow job in exchange. I told him no, but this was the first time he started being insistant. He started to use the same trick with masturbation; trying to convince me that it was perfectly normal for boys to give each other blowjobs. Eventually the conversation escalated to him asking "well why not, then?!" to which I responded "because I'm not gay like you!" I don't remember if he dropped it right away, but I did get the impression he either denied being gay, or denied that homosexuality was necessary for wanting to give boys blowjobs.<br />
<br />
Again, he continued to prove that he'll take "no" for an answer, so from my point of view, nothing was wrong with that interaction. Eventually he relented on the porn. He bought me one magazine in Paris and another in England. We masturbated together once more, I think for the last time.<br />
<br />
Once my voice started changing and I started approaching his eye level, our interactions became fewer and farther between. He moved to England to go to attend Oxford University. When my grandmother's next conference was held at a nearby college in Oxford, he let me stay in his flat.<br />
<br />
This time things were very different. He was much more distant. I imagine a part of that was his intense PhD studies, but I'm pretty certain that I had moved out of his preferred age bracket. I think I've only seen him once since then at a gathering. We hugged or shook hands or something, and then went on with our lives.<br />
<br />
Years later he was on trial for his similar treatment of another boy. Somehow he thought it would be a good idea to ask me to testify in his defense and put in that request through my grandmother. I hate him for the pain he put her through by making me answer "I can't". I hate him for the guilt and shame she and my mother will inevitably feel after reading this.<br />
<br />
I can try to convince myself none of this left me damaged, but I would be lying. I can reassure my family that none of this was their fault, but it would feel like a lie to them no matter how true it is.<br />
<br />
But I can also tell the truth. And if we all share our truths, then maybe we can see we're all in the same boat together and work towards a common good.<br />
<div>
<br /></div>
Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-64593588130712811702011-08-02T09:32:00.000-07:002011-08-20T15:25:58.231-07:00Dear Mortgage Company...<p><strong>UPDATE 2011-08-20:</strong> I just got a call from Seterus saying that I've been approved for the modification and they sent out the final documents on Thursday! Thanks to everyone who offered advice and kind wishes.</p><p>Following is a letter I just sent to my mortgage company. It pretty much speaks for itself (some things are redacted for my own privacy).</p><hr /><p>To: Seterus, Inc.
Fax: 877-371-7799</p><p>Attention Customer Service:</p><p>Subject: Loan # [REDACTED]</p><p>Matthew A Orlando
[REDACTED]</p><p>August 2, 2011</p><p>This is a “qualified written request” under section 6 of the Real Estate Settlement Procedures Act (RESPA).</p><p>I am writing because your organization has utterly failed to live up to its obligations and has denied me a modification based on false information. First some background:</p><p>My wife became unemployed in 2009 and we fell behind on our mortgage payments in the beginning of 2010. At this time our loan was serviced by Chase. Around April 2010, we applied for a modification, and were approved for a trial period for the July, August, and September payments. The modification was scheduled to be finalized on October 1. In September, however, I got a letter from Chase informing me that the loan would be transferred to your company (then IBM LBPS, now Seterus).</p><p>When I received information about the transfer from your company, I called to make sure the modification was still in the works. I was told to continue making the trial payment and things seemed to be moving along. In January, I was informed that we were approved for the modification and that documents had been sent out. I still hadn’t received anything by February when your automated dialer started calling me every week for being behind on my payments.</p><p>Every week for months I talked to someone and told them I had not yet received the documents. Every week for months I was told they would look into it. I spent a few 40-60 minute calls being transferred between different departments, all telling me they would look into it. At one point someone said “I see this message was sent to <so and so department> but they never did anything with it. I’ll try to get that moved along.” Every. Single. Week. For MONTHS.</p><p>You guys gave me this runaround for MONTHS. From February through late May it’s the same thing. Calling to collect on a debt, wondering why I haven’t sent back my documents, even though I told you repeatedly and persistently that I had not received them.</p><p>Let me spell it out one more time since it didn’t seem to get through:</p><p>I NEVER RECEIVED MY FINAL DOCUMENTS FOR THE APPROVED MODIFICATION</p><p>But wait; there’s more!</p><p>Around early June, I got my weekly “you’re behind on payments call.” I was told that at this point, because so much time had passed since the initial application, they would have to open a new file for me. This was downright insulting. YOU failed on your end and now I had to start the process all over again with the chance that it wouldn’t be approved.</p><p>True to my worries, the modification was declined with the excuse (paraphrased) “Your monthly mortgage payment including principle, interest, taxes, and insurance is less than 31% of your gross monthly income.”</p><p>[Ed. note: Using variables here instead of pure redaction so it makes more sense]</p><p>Let’s do some arithmetic here. My annual salary is $[12a]. Divide that by 12, you get $[a] per month (I listed $[a] as my monthly income on the Request for Modification form). What’s 31% of $[a]? The answer is $[0.31a]. What is the monthly mortgage payment listed my statement including principle, interest, insurance, and taxes? $[0.33a]. Which number is greater: $[0.31a] or $[0.33a]?</p><p>[Ed. note: yes, a is a positive number]</p><p>Given the above, I demand that you re-instate the modification trial period and send me the final documents no later than November 1, 2011. I would also like a written letter of apology for all the abuse I’ve received in the face of my good faith efforts.</p><p>I understand that under Section 6 of RESPA you are required to acknowledge my request within 20 business days and must try to resolve the issue within 60 business days.</p><p>Sincerely,</p><p>Matthew Orlando</p>Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com1tag:blogger.com,1999:blog-1474963297185666429.post-47831277245520914762010-12-21T16:14:00.000-08:002010-12-21T16:22:07.443-08:00Totally Random Made-Up Term for the Day 4 & 5<dl>
<dt>fishgiver</dt>
<dd>n. - A person who gives an easy answer to someone in spite of others' efforts to provide the necessary tools for finding or producing the answer.<dd>
<dt>fisheater</dt>
<dd>n. - A person who refuses to use the tools at their disposal to solve a problem and instead relies on the handouts of fishgivers.</dd>
</dl>
These are derived from the proverb: “Give a man a fish, you feed him for a day. Teach a man to fish, you feed him for the rest of his life.”Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-89960136220833235322010-07-29T22:33:00.001-07:002010-07-29T22:46:08.357-07:00Caffeinated Bang For Your Buck<p>I quit caffeine for six months a couple years ago and hated every minute. I’d rather sleep less than live longer. Well, I’d rather do both; that’s why I love science. I wonder if there are studies that correlate caffeine consumption with life expectancy. If my life expectancy is reduced by less than the total of daily added time, I’d experience more time conscious than otherwise.</p> <p>Like most Simpsons episodes, the rest of this post is only tangentially related to what was just discussed…</p> <p>I loves me some energy drinks (<a href="http://www.facebook.com/photo.php?pid=4112713&l=a671a16949&id=563064469" target="_blank">proof</a>). I’m here to pimp my most recent favorite, <a href="http://www.molotov-energy.com/" target="_blank">Molotov Explosive Energy</a>. “Pimp” isn’t the right word; that would imply I’m making money from it. Really, I’m just a guy in love with a drink. They’re a relative newcomer to the market, and I don’t want them to go away any time soon. I really hate it when products I love disappear.</p> <p>I’ve posted about them on Facebook before, but something struck me as blog-worthy. A portion of their sales goes towards the <a href="http://www.hsf.net/" target="_blank">Hispanic Scholarship Fund</a>. Considering what my <a href="http://nocirc.org/about.php" target="_blank">grandmother does</a>, I have a big soft spot for charity.</p> <p>That’s all fine and dandy, but what does Molotov do for <em>you</em>?</p> <p>If I could describe myself in one word, it would be “eclectic.” When I saw “con <a href="http://www.tapatiohotsauce.com/" target="_blank">Tapatío</a>” on an energy drink can, how could I possibly resist?</p> <p>The first flavor I tried was Pineapple con Tapatío (they have non-Tapatío versions as well). I poured it into a tall glass to see the color. It was pineapple yellow with sparse, red specks of chili peppers. As I brought the glass to my face the first thing I noticed—even before the sweet pineapple smell—was a tickle in my nose reminiscent of a strong ginger ale.</p> <p>The first sip paid perfect homage to the description “explosive energy.” It was a blast of pineapple-y goodness. It takes a fair bit of sweetness to cover up the bitterness of caffeine, but Molotov perfectly balances it with the acidity of lemon. There is absolutely no hint of the unpleasant tang and aftertaste associated with highly caffeinated drinks (especially the ones with taurine and guarana).</p> <p>Swallowing was another experience unto itself. Carbonation conspired with capsaicin to tickle and tingle my throat in a way I never imagined (usually I have a great imagination for imbibants*). It was similar to a ginger ale, but with a subtle warmth that goes beyond the superficial burn. The warmth builds as you continue to drink it.</p> <p>One word of warning though: be careful breathing while drinking. If your throat or sinuses are sensitive to the spice, it may make you cough. This can be especially troublesome when sitting at a computer at work. Ahem. You may not be affected by it, or (like me) you may think it’s <strong>totally</strong> worth the risk. Otherwise, the non-Tapatío versions are perfectly acceptable alternatives. The loss of spice does nothing to diminish the unique, “is this really an energy drink?” experience.</p> <p>The mango has a more mellow flavor than the pineapple. There is less acidity, but also slightly less sweetness. I still have a hard time noticing the “energy blend.”</p> <p>The third flavor which doesn’t have a spicy counterpart is Tamarindo. If you’ve never experienced tamarind before, do yourself a favor. It’s sweet, and ever so slightly fruity. It has been described as somewhat cola-like, but I’ve never found that particularly satisfying. Whatever the case, it’s just as delicious as the others.</p> <p>Oh, did I mention Molotov drinks make excellent cocktails?</p> <hr />* TODO: Totally Random Made-up Term for the Day: imbibantsCogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com1tag:blogger.com,1999:blog-1474963297185666429.post-37771668872866806572010-07-16T11:36:00.000-07:002010-07-16T11:39:10.229-07:00Tame Your Inner Monkey<p><a href="http://www.youtube.com/user/philhellenes">philhellenes</a> posted this masterpiece on YouTube yesterday. I cannot possibly share this video with enough people.</p><p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/3I7TKW_QQbA&hl=en_US&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/3I7TKW_QQbA&hl=en_US&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0tag:blogger.com,1999:blog-1474963297185666429.post-82358481905209029072010-07-13T20:48:00.000-07:002010-07-13T21:48:56.249-07:00General Advice to No One in Particular<p>Anyone who knows me well knows I let go of things pretty easily; perhaps to a fault (once the things are over, anyway). Wait, what? Is it really such a fault to be abnormally forgiving?</p> <p>Anyone who knows me well knows I rarely stress over the stresses in my life. Sure I might talk about the stresses, but you’d be hard-pressed to call me stressed.*</p> <p>Is there some cause and effect here?</p> <p>Some discussions I’ve observed recently have helped solidify a couple ideas I’ve been mulling around in my head for a while:</p> <p>If an argument is based on a misunderstanding and the people arguing realize this fact, no one has the “right” to be mad anymore. As soon as the misunderstanding is pointed out, the entire context of everything that followed vanishes. Granted, it takes a while for your anger hormones to dissipate. Go for a walk. Exercise. Eat some ice cream. Act like it never happened.</p> <p>Forget your own first impressions. We all know first impressions make a huge difference in our lives. Have you ever felt like you “should” have achieved something were it not for the first impression you made? Have you ever bothered to examine your own judgments in that regard? I have many friends on whose feet, off I wrongly got.</p> <p>I hope English forgives me for murdering it…</p> <p> <hr /></p> <p>* It was about 3 minutes after I wrote that when I realized it rhymed. Just be glad I didn't try to take it further…</p> Cogwheelhttp://www.blogger.com/profile/02565889119494393451noreply@blogger.com0