1190: "Time"

This forum is for the individual discussion thread that goes with each new comic.

Moderators: Moderators General, Prelates, Magistrates

User avatar
Eternal Density
Posts: 5588
Joined: Thu Oct 02, 2008 12:37 am UTC
Contact:

Yikes!

Postby Eternal Density » Wed Mar 16, 2016 8:46 am UTC

It begins!

Hotdog Vendor's Degree:
Post random minor news stories with the comment "It begins". Or post about the beginning of things you like, or something.
Also, new Other Comic: http://xkcd.com/1656/
Play the game of Time! castle.chirpingmustard.com Hotdog Vending Supplier But what is this?
In the Marvel vs. DC film-making war, we're all winners.

User avatar
Neil_Boekend
Posts: 3220
Joined: Fri Mar 01, 2013 6:35 am UTC
Location: Yes.

Re: 1190: "Time"

Postby Neil_Boekend » Wed Mar 16, 2016 9:03 am UTC

Actually from a non-linear, non-subjective viewpoint it is always beginning.
Mikeski wrote:A "What If" update is never late. Nor is it early. It is posted precisely when it should be.

patzer's signature wrote:
flicky1991 wrote:I'm being quoted too much!

he/him/his

User avatar
StormAngel
Posts: 279
Joined: Sun Apr 14, 2013 2:09 am UTC
Location: Verified
Contact:

Re: 1190: "Time"

Postby StormAngel » Wed Mar 16, 2016 9:25 am UTC

We've been waiting for 'It' for the past 466 comics, and it's begun at last!
So has NewPage 2447!!

This OTTerComic began as well!!!
Image
(It *nded too, or you wouldn't be seeing it)
Oelpr Jnhar, Knight of the Chronological Order, Protector of Othamburg
"HELLO. MY NAME IS STORMANGEL. YOU OTCOLORED MY NOPICES. PREPARE TO GO CAVE."
yappobiscuits wrote:"I wanna be redundant too! Lemme be redundant! C'monnn!"

My OTTifications on Imgur
Spoiler:
Ch*rp

Image

User avatar
lmjb1964
Posts: 2472
Joined: Mon Apr 04, 2011 7:09 pm UTC
Location: In the Present! Need to ketchup NP 2236-2280, plus NP 2026-2058 and something like 2060-2090+?.

Re: 1190: "Time"

Postby lmjb1964 » Wed Mar 16, 2016 7:16 pm UTC

Aaeriele wrote:For the record, every so often I look over at this thread and the fact that it's still going simultaneously amazes me and warms my heart.


And visits from old friends warm our hearts! Nice to see you!

Treeish OTTercomics, StormAngel.

And yay, Timeless River finally has decided I'm not a bot!

For decree, sort of:

It begins.
Spring break, that is. Most of the raptors and zombies have gone away, and it's nice and quiet here.
Image

You helped Addams stay in her home, and gave her a better life. She thanks you, and so do I.
Imagesmiley by yappo
That's a robot but it totally counts. Image

bot by balthasar_s

User avatar
Neil_Boekend
Posts: 3220
Joined: Fri Mar 01, 2013 6:35 am UTC
Location: Yes.

Re: 1190: "Time"

Postby Neil_Boekend » Wed Mar 16, 2016 7:23 pm UTC

lmjb1964 wrote:Spring break
Who broke Spring and how in GLR's name are we going to repair it?
Mikeski wrote:A "What If" update is never late. Nor is it early. It is posted precisely when it should be.

patzer's signature wrote:
flicky1991 wrote:I'm being quoted too much!

he/him/his

User avatar
slinches
Slinches get Stinches
Posts: 1036
Joined: Tue Mar 26, 2013 4:23 am UTC

Re: 1190: "Time"

Postby slinches » Wed Mar 16, 2016 7:59 pm UTC

I don't know who broke spring, but I'm annoyed that we had to skip it and go straight into summer this year.

BlackWolf
Posts: 1
Joined: Wed Mar 16, 2016 8:03 pm UTC
Location: Page 157 of the OTT

Re: 1190: "Time"

Postby BlackWolf » Wed Mar 16, 2016 8:07 pm UTC

I have been a long time XKCD reader, but only recently found the forums. Now, I must read all of the OTT from page 1.

I am on page 5 of 2447...this will take a while.

User avatar
slinches
Slinches get Stinches
Posts: 1036
Joined: Tue Mar 26, 2013 4:23 am UTC

Re: 1190: "Time"

Postby slinches » Wed Mar 16, 2016 9:43 pm UTC

Welcome to the fora and good luck on your blitz, BlackWolf.

User avatar
Gingercat
Posts: 450
Joined: Thu Nov 07, 2013 4:19 am UTC
Location: Ceiling

Re: 1190: "Time"

Postby Gingercat » Wed Mar 16, 2016 10:46 pm UTC

ggh wrote:ETA3: find things that balthatimelord has messed with
Image


:mrgreen:
I am Schrödinger's Gingercat.

User avatar
Gingercat
Posts: 450
Joined: Thu Nov 07, 2013 4:19 am UTC
Location: Ceiling

Re: 1190: "Time"

Postby Gingercat » Thu Mar 17, 2016 12:27 am UTC

NP 2319, TWENTY-THREE NINETEEN!! And not a single Monsters Inc reference on it!

For shame!!
I am Schrödinger's Gingercat.

User avatar
SBN
Saved
Posts: 2236
Joined: Tue Mar 26, 2013 7:15 pm UTC
Location: No longer in the home of the raptorcats, now in the home of the raptorcats.

Re: 1190: "Time"

Postby SBN » Thu Mar 17, 2016 1:56 am UTC

Gingercat wrote:NP 2319, TWENTY-THREE NINETEEN!! And not a single Monsters Inc reference on it!

For shame!!

Are you sure?
astrotter wrote:It is not particularly clear to me at this time that we are not overanalyzing this...

Randalspeed thunk, iskinner, and other blitzers! Notes from the before-was improve the after-when.
Some Ways to Time
NetWeasel wrote:I want to put that in my sig... BUT I CAN'T!!!!

User avatar
Gingercat
Posts: 450
Joined: Thu Nov 07, 2013 4:19 am UTC
Location: Ceiling

Re: TimeAfterTime Revisited – t1i-1413

Postby Gingercat » Thu Mar 17, 2016 5:55 am UTC

SilentTimer wrote:Thanks, y'all, for your attention,
and for waiting for it!
Spoiler:
And special thanks to balthasar_s for providing the infrastructure which made these “Did you notice … ?” notices possible. You can reblitz them at his time/aftertime viewer.
-- posted by SilentBot Image


What an absolutely brilliant series. Had me captivated, and furious that those barrels weren't stored properly. Poor BraveBean & co.!!

Thank you for such an epic addition to Time.

balthasar_s wrote:the mr*bdex story cONGtinues.

Code: Select all

 competition, photographed Ch**rpies with Cameras, and witnessed the Mind Glow of Schrödinger's Gingercat. The King scowled when he heard these requests, but ordered them to be carried out to the letter, for he had given his royal word. The bOTTifactors were thus granted all that they wished.
  "All that they wished" grew more and more outlandish. For instance, in the files of the R.I.M. under code number 48769/27M/B was a copy of a requisition for three War Banners each with its own Carrybot to

-- posted by mrImagebdexbot


Mind Glow indeed! Am I, too, radioactive? Or is it a differently-colored glow? Maybe more of an... orange glow. Yes.
I am Schrödinger's Gingercat.

User avatar
adnapemit
Posts: 200
Joined: Thu Jul 04, 2013 6:05 am UTC
Location: The wrong timezone.

Re: 1190: "Time"

Postby adnapemit » Thu Mar 17, 2016 8:44 am UTC

It's been too long since I posted. Hello!
SBN wrote:
Gingercat wrote:NP 2319, TWENTY-THREE NINETEEN!! And not a single Monsters Inc reference on it!

For shame!!

Are you sure?

Thank you Swirly Time Ripple, Inc.
Empress adnapemit "Nancy" "Time Panda"
[adnapemit|timepanda]
Does anyone actually read signatures?

User avatar
ZoomanSP
Posts: 1967
Joined: Sun May 26, 2013 11:23 am UTC
Location: Twelve days north of the Othercomic threads, and a few degrees south of complete insanity. (©yappo)

Re: 1190: "Time"

Postby ZoomanSP » Thu Mar 17, 2016 1:06 pm UTC

Welcome back, adnapemit! :)
Wait on.

Image
Spoiler:
Kieryn wrote:They have a culture involving hat wearing. What kind of a collective would come up with such a thing!?
BlitzGirl wrote:I'll get the razor and finish off Occam while we're at it.
ucim / Megan wrote:"It can do whatever it wants. It's the OTT."

User avatar
lmjb1964
Posts: 2472
Joined: Mon Apr 04, 2011 7:09 pm UTC
Location: In the Present! Need to ketchup NP 2236-2280, plus NP 2026-2058 and something like 2060-2090+?.

Re: 1190: "Time"

Postby lmjb1964 » Thu Mar 17, 2016 6:53 pm UTC

Yay, adnapemit's back!

And a new Blitzer! Randallspeed, BlackWolf! It's a worthy quest indeed!

My goodness, Whirly Time Ripple Inc. is very efficient!

Speaking of Time, GingerCat is getting so close to the present! We should plan some kind of party.

I don't know who broke Spring. Maybe the same person who broke Morning?
Image

You helped Addams stay in her home, and gave her a better life. She thanks you, and so do I.
Imagesmiley by yappo
That's a robot but it totally counts. Image

bot by balthasar_s

User avatar
ZoomanSP
Posts: 1967
Joined: Sun May 26, 2013 11:23 am UTC
Location: Twelve days north of the Othercomic threads, and a few degrees south of complete insanity. (©yappo)

Re: 1190: "Time"

Postby ZoomanSP » Fri Mar 18, 2016 12:52 pm UTC

Wait on.

Image
Spoiler:
Kieryn wrote:They have a culture involving hat wearing. What kind of a collective would come up with such a thing!?
BlitzGirl wrote:I'll get the razor and finish off Occam while we're at it.
ucim / Megan wrote:"It can do whatever it wants. It's the OTT."

User avatar
Link
Posts: 1419
Joined: Sat Mar 07, 2009 11:33 am UTC
Location: ᘝᓄᘈᖉᐣ
Contact:

GRAPEVINE YOUR MOLPHIN AREE BELONG TTOO OTC

Postby Link » Fri Mar 18, 2016 8:09 pm UTC

For decree: It begins!

And a bit belated: hi Aaeriele, hi adnapemit, and welcome BlackWolf, Revealer the Recent! Also, welcome back from holidips, HES! :D

User avatar
balthasar_s
Posts: 2408
Joined: Mon Nov 28, 2011 3:20 pm UTC
Location: secret base on the Moon
Contact:

Re: 1190: "Time"

Postby balthasar_s » Fri Mar 18, 2016 8:48 pm UTC

I wanted to practice some assembly programming. So I implemented basic calculator functionality on the SilentTImer action figure.
calculation mode activated by pressing middle button while turning device on.
Can do 4 basic operations on numbers from -999 to 9999. For numbers between -9.99 and 99.99 there are two digits after decimal dot. The results are rounded. Shows E:EE on error (result too big or division by 0). All calculation on BCD numbers.
https://youtu.be/7ci6b-xgpoQ

Code: Select all

// SilentTimer Action Figure software, v1.5
// main.c
// The main c file.
//
// 07.03.2016
// Copyright (C) 2014-2016  Balthasar Szczepański
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
   
   // #define DEBAG
   #include "msp430.h"
   #include "definitions.h"

   unsigned char inbuf[8];
   unsigned char outbuf[8] __attribute__ ((aligned (2)));
   unsigned char dispvalue[4];
   unsigned char time[8];
   unsigned char leap;
   unsigned char settime[3];
   unsigned char mode;
   unsigned char alarm[3];
   unsigned char lastcdn[2];
   unsigned char lastyear[5];
   unsigned char digit;
   unsigned char changed;
   unsigned char run;
   unsigned char symbol[16] ={
      SYMB_0,
      SYMB_1,
      SYMB_2,
      SYMB_3,
      SYMB_4,
      SYMB_5,
      SYMB_6,
      SYMB_7,
      SYMB_8,
      SYMB_9,
      SYMB_A,
      SYMB_B,
      SYMB_C,
      SYMB_D,
      SYMB_E,
      SYMB_F};

   __interrupt void P2_ISR();
   void display(
      unsigned char *data);
   void spi(
      unsigned char command,
      unsigned char addr,
      unsigned char *inbuf,
      unsigned char *outbuf,
      unsigned short n);
   int main( void );

   void display(unsigned char *data)
   {
      //lsd
      P1OUT =data[0];
      P3OUT |=0x80; //74hc373 latch enable
      P3OUT &=0x0f;
      
      P1OUT =data[1];
      P3OUT |=0x40;
      P3OUT &=0x0f;
      
      P1OUT =data[2];
      P3OUT |=0x20;
      P3OUT &=0x0f;
      
      //msd
      P1OUT =data[3];
      P3OUT |=0x10;
      P3OUT &=0x0f;
   }

   void spi(
      unsigned char command,
      unsigned char addr,
      unsigned char *inbuf,
      unsigned char *outbuf,
      unsigned short n)
   {
      unsigned short i;
      unsigned char nul;
      unsigned char flags;
      
      switch (command)
      {
      case RTC_EEREAD:
      case RTC_IDREAD:
      case RTC_READ:
         flags= ADDRFLAG|READFLAG;
         break;
         
      case RTC_EEWRITE:
      case RTC_IDWRITE:
         n=(n>8)?8:n;
      case RTC_WRITE:
         flags= ADDRFLAG|WRITEFLAG;
         break;
         
      case RTC_EEWREN:
      case RTC_EEWRDI:
         flags=0;
         break;
         
      case RTC_SRREAD:
         n=(n>1)?1:n;
         flags=READFLAG;
         break;
      
      case RTC_SRWRITE: //1
      case RTC_CLRRAM: //data ignored but has to be
      case RTC_UNLOCK: //1
          n=(n>1)?1:n;
         flags=WRITEFLAG;
         break;
      default:
         return;
      }
      
      P3OUT&=0xfe; //chip select down
      
      #if !(defined DEBAG)
      while((IFG2&UTXIFG0)==0); // wait until can be sent
      #endif
      U0TXBUF=command; // send command
      #if !(defined DEBAG)
      while((IFG2&UTXIFG0)==0); // wait until received
      #endif
      nul=U0RXBUF; //pretend to read "data"
      
      if(flags&ADDRFLAG)
      {
         #if !(defined DEBAG)
         while((IFG2&UTXIFG0)==0); // wait until can be sent
         #endif
         U0TXBUF=addr; // send address
         #if !(defined DEBAG)
         while((IFG2&UTXIFG0)==0); // wait until received
         #endif
         nul=U0RXBUF; //pretend to read "data"
      }
      if(flags&(READFLAG|WRITEFLAG))
      {
         for(i=0;i<n;++i)
         {
            #if !(defined DEBAG)
            while((IFG2&UTXIFG0)==0); // wait until can be sent
            #endif
            U0TXBUF=(flags&WRITEFLAG)?outbuf[i]:0xff; // send data
            #if !(defined DEBAG)
            while((IFG2&UTXIFG0)==0); // wait until received
            #endif
            if(flags&READFLAG)
               inbuf[i]=U0RXBUF; //read data
            else
               nul=U0RXBUF;
         }
      }
      P3OUT|=0x01; //chip select up
      for(i=0;i<255;++i); //looks like the RTC might not like another SPI transmission exactly before the previous one, sometimes.
   }

   #pragma vector=PORT2_VECTOR
   __interrupt void P2_ISR()
   {
      if(P2IFG&0x08) // RTC
      {
         P2IFG &= ~0x08;
         spi(RTC_READ,0x00,inbuf,outbuf,8);
      
         time[0]=inbuf[0]; //1/100 s
         time[1]=inbuf[1]&0x7f; //seconds
         time[2]=inbuf[2]&0x7f; //minutes
         time[3]=inbuf[3]&0x3f; //hours
         time[4]=inbuf[4]&0x07; //dow
         time[5]=inbuf[5]&0x3f; //dom
         time[6]=inbuf[6]&0x1f; //mon
         time[7]=inbuf[7];//year
         leap=inbuf[6]&0x20;
         
         spi(RTC_READ,0x0f,inbuf,outbuf,1); // <- because of RTC bug (probably not needed anymore?)
         if(!((time[2]^alarm[1])|(time[3]^alarm[2])) && alarm[0])
         {
            mode=MODE_ALARM;
            alarm[0]=0; //alarm removed after activated
            spi(RTC_WRITE,0x20,inbuf,alarm,1);
         }
         
         if(mode==MODE_COUNTUP && run)
         {
            if(settime[1]<0x59)
               settime[1]=bcd_add_byte(settime[1],0x01);
            else
            {
               settime[1]=0x00;
               settime[2]=bcd_add_byte(settime[2],0x01);
            }
         }
         else if(mode==MODE_COUNTDOWN && run && (settime[1]|settime[2]))
         {
            if(settime[1])
               settime[1]=bcd_add_byte(settime[1],0x99);
            else
            {
               settime[1]=0x59;
               settime[2]=bcd_add_byte(settime[2],0x99);
            }
         }
         
         if (mode==MODE_ALARM || (mode==MODE_COUNTDOWN && !(settime[1]|settime[2])))
         {
            TACTL^=MC_1;
            //P2DIR^=0x40;
            //P2SEL^=0x40;
         }
         else if(TACTL & MC_3)
         {
            TACTL&= ~MC_3;
            //P2DIR&= ~0x40;
            //P2SEL&= ~0x40;
         }
         
         lastyear[4]=(time[7]==0x00 && lastyear[0]==0x99)?bcd_add_byte(lastyear[1],0x01):lastyear[1];
         if (time[7]!=lastyear[0])
         {
            if(time[7]==lastyear[2])
               ++(lastyear[3]);
            else
               lastyear[3]=0;
            
            lastyear[2]=time[7];
            
            if(lastyear[3]>55)
            {
               lastyear[3]=0;
               
               if(time[7]==0x00 && lastyear[0]==0x99)
                  lastyear[1]=bcd_add_byte(lastyear[1],0x01);
               
               lastyear[0]=time[7];
               
               outbuf[0]=ALARMVALUE;
               outbuf[1]=lastyear[0];
               outbuf[2]=lastyear[1];
               spi(RTC_WRITE,0x26,inbuf,outbuf,3);
            }     
         }
         
         
         if(mode==MODE_DEBUG && changed)
            spi(RTC_READ,settime[1],settime,outbuf,1);
      }
      else if(P2IFG&0x02) // button A
      {
         P2IFG &= ~0x02;
         switch(mode)
         {
         case MODE_CALCSETNUM:
         case MODE_CALCSETOPER:
            mode=MODE_CALC;
            break;
         case MODE_CALC:
            if(outbuf[7] || outbuf[1]!=0 || outbuf[0]!=0)
            {
               outbuf[7]=0x00;
               outbuf[6]=0x00;
               outbuf[3]=0x00;
               outbuf[2]=0x00;
               outbuf[1]=0x00;
               outbuf[0]=0x00;
            }
            else
               mode=MODE_TIME;
            break;
         case MODE_TIME:
         case MODE_SETDATE:
         case MODE_SETYEAR:
            mode=MODE_DATE;
            break;
         case MODE_DATE:
            mode=MODE_COUNTUP;
            settime[1]=0x00;
            settime[2]=0x00;
            run=0;
            break;
         case MODE_COUNTUP:
            if(run)
            {
               settime[1]=0x00;
               settime[2]=0x00;
               run=0;
            }
            else
            {
               mode=MODE_SETCOUNTDOWN;
               settime[1]=lastcdn[0];
               settime[2]=lastcdn[1];
               changed=0;
               digit=3;
            }
            break;
         case MODE_DEBUGADDR:
         case MODE_DEBUGVAL:
            mode=MODE_DEBUG;
            break;
         case MODE_SETCOUNTDOWN:
         case MODE_COUNTDOWN:
            if(changed || mode==MODE_COUNTDOWN)
            {
               mode=MODE_SETCOUNTDOWN;
               settime[1]=lastcdn[0];
               settime[2]=lastcdn[1];
               changed=0;
               digit=3;
               break;
            }
         default:
            mode=MODE_TIME;
            break;
         }
      }
      else if(P2IFG&0x01) // button B
      {
         P2IFG &= ~0x01;
         
         switch(mode)
         {
         case MODE_CALCSETOPER:
            outbuf[6]&=0x3f;
            outbuf[6]|=settime[2];
            mode=MODE_CALCSETNUM;
            digit=4;
            if(changed)
            {
               settime[0]=outbuf[2];
               settime[1]=outbuf[3];
               settime[2]=(outbuf[6]&0x0c)>>2;
            }
            else
            {
               settime[0]=0x00;
               settime[1]=0x00;
               settime[2]=0x00;
            }
            changed=1;
            break;
         case MODE_CALCSETNUM:
            if(digit)
               --digit;
            else
            {
               if(changed)
               {
                  outbuf[6]&=0xf3;
                  outbuf[6]|=settime[2]<<2;
                  outbuf[3]=settime[1];
                  outbuf[2]=settime[0];
                  
                  
                  switch(outbuf[6]&0xc0)
                  {
                  case 0xc0:
                     calc_div(outbuf);
                     break;
                  case 0x80:
                     calc_mul(outbuf);
                     break;
                  case 0x40:
                     outbuf[6]^=0x04;
                     calc_add(outbuf);
                     outbuf[6]^=0x04;
                     break;
                  case 0x00:
                     calc_add(outbuf);
                     break;
                  default:
                     outbuf[7]=0xff;
                  }
                  mode=MODE_CALC;
               }
               else
               {
                  outbuf[6]&=0xcf;
                  outbuf[6]|=settime[2]<<4;
                  outbuf[5]=settime[1];
                  outbuf[4]=settime[0];
                  mode=MODE_CALCSETOPER;
                  settime[2]=0x00;
               }
            }
            break;
         case MODE_CALC:
            if(outbuf[7])
            {
               outbuf[0]=0x00;
               outbuf[1]=0x00;
               outbuf[2]=0x00;
               outbuf[3]=0x00;
               outbuf[6]=0x00;
               outbuf[7]=0x00;
            }
            else
            {
               outbuf[6]&=0xcf;
               outbuf[6]|=(outbuf[6]&0x03)<<4;
               outbuf[5]=outbuf[1];
               outbuf[4]=outbuf[0];
               mode=MODE_CALCSETOPER;
               settime[2]=outbuf[6]&0xc0;
               changed=1;
            }
            break;
         case MODE_TIME:
            mode=MODE_SETTIME;
            digit=3;
            changed=0;
            settime[0]=0;
            settime[1]=time[2];
            settime[2]=time[3];
            break;
         case MODE_DATE:
            mode=MODE_SETDATE;
            digit=2;
            changed=0;
            settime[0]=time[5];
            settime[1]=time[6];
            break;
         case MODE_COUNTUP:
         case MODE_COUNTDOWN:
            run=!run;
            break;
         case MODE_SETCOUNTDOWN:
            if(digit)
            {
               --digit;
               changed=1;
            }
            else
            {
               lastcdn[0]=settime[1];
               lastcdn[1]=settime[2];
               
               outbuf[0]=ALARMVALUE;
               outbuf[1]=settime[1];
               outbuf[2]=settime[2];
               spi(RTC_WRITE,0x23,inbuf,outbuf,3);

               mode=MODE_COUNTDOWN;
               run=0;
            }
            break;
         case MODE_CALIBRATE:
            if(digit)
               --digit;
            else
            {
               spi(RTC_WRITE,0x09,inbuf,settime,1);
               outbuf[0]=time[3]|settime[1];
               spi(RTC_WRITE,0x03,inbuf,outbuf,1);
               digit=3;
            }
            break;
         case MODE_DEBUGADDR:
            if(digit)
               --digit;
            else
            {
               spi(RTC_READ,settime[1],settime,outbuf,1);
               mode=MODE_DEBUG;
               changed=1;
            }
            break;
         case MODE_DEBUGVAL:
            if(digit)
               --digit;
            else
            {
               spi(RTC_WRITE,settime[1],inbuf,settime,1);
               mode=MODE_DEBUG;
            }
            break;
         case MODE_SETTIME:
            if(digit)
            {
               if(digit==3&&settime[2]>0x23)
                   settime[2]&=0xf0;
               --digit;
            }
            else
            {
               if(changed)
               {
                  outbuf[0]=0x00;
                  outbuf[1]=0x00;
                  outbuf[2]=settime[1]&0x7f;
                  outbuf[3]=settime[2]&0x3f;
                  
                  spi(RTC_WRITE,0x01,inbuf,outbuf,1);//stop osc.
                  spi(RTC_READ,0x03,inbuf,outbuf,1);
                  outbuf[3]|=(inbuf[0]&0x80);//keep the calsgn bit.
               
                  spi(RTC_WRITE,0x00,inbuf,outbuf,4);//write new time
               
                  outbuf[0]=0x80;
                  spi(RTC_WRITE,0x01,inbuf,outbuf,1);//start osc;
                  
                  time[1]=0;
                  time[2]=settime[1];
                  time[3]=settime[2];
               }
               mode=MODE_TIME;
            }
            break;
         case MODE_SETYEAR:
            if(digit)
               --digit;
            else
            {
               if(changed)
               {
                  time[7]=settime[1];
                  spi(RTC_WRITE,0x07,inbuf,settime+1,1);
                  
                  lastyear[0]=settime[1];
                  lastyear[1]=settime[2];
                  settime[0]=ALARMVALUE;
                  
                  spi(RTC_WRITE,0x26,inbuf,settime,3);
               }
               mode=MODE_DATE;
            }
            break;
         case MODE_SETDATE:
            if(digit)
            {
               --digit;
               if(settime[0]>((settime[1]==0x02)?(leap?0x29:0x28):(((settime[1]&0x18) && !(settime[1]&0x01) || !(settime[1]&0x18) && (settime[1]&0x01))?0x31:0x30)))
                  settime[0]&=(digit?0x00:0xf0);
               if(settime[0]==0x00)
                  settime[0]=0x01;
            }
            else
            {
               if (changed)
               {
                  time[5]=settime[0];
                  time[6]=settime[1];
                  settime[2]=time[7];
                  spi(RTC_WRITE,0x06,inbuf,settime+1,2);
                  spi(RTC_WRITE,0x05,inbuf,settime,1);
               }
               mode=MODE_DATE;
            }
            
            break;
         case MODE_SETALARM:
            if(digit)
            {
               if(digit==3&&settime[2]>0x23)
                   settime[2]&=0xf0;
               --digit;
            }
            else
            {
               if(changed|| !alarm[0])
               {
                  alarm[0]=ALARMVALUE;
                  alarm[1]=settime[1];
                  alarm[2]=settime[2];
                  
                  spi(RTC_WRITE,0x20,inbuf,alarm,3);
               }
               else
               {
                  alarm[0]=0;
                  spi(RTC_WRITE,0x20,inbuf,outbuf,1);
               }
               mode=MODE_TIME;
            }
            break;
         case MODE_ALARM:
            alarm[0]=0;
            spi(RTC_WRITE,0x20,inbuf,outbuf,1);
            mode=MODE_TIME;
            break;
         case MODE_DEBUG:
            //changed=1;
            digit=1;
            mode=MODE_DEBUGADDR;
            break; 
         default:
            break;
         }
      }
      else if(P2IFG&0x20) // button C
      {
         P2IFG &= ~0x20;
         
         switch(mode)
         {
         case MODE_CALC:
            if(outbuf[7])
            {
               outbuf[0]=0x00;
               outbuf[1]=0x00;
               outbuf[2]=0x00;
               outbuf[3]=0x00;
               outbuf[6]=0x00;
               outbuf[7]=0x00;
            }
            else
            {
               mode=MODE_CALCSETNUM;
               changed=0;
               digit=4;
               settime[0]=0x00;
               settime[1]=0x00;
               settime[2]=0x00;
            }
            break;
         case MODE_CALCSETNUM:
            if (digit==4)
               settime[2]^=0x02;
            else if (digit==3)
            {
               if((settime[1]&0xf0)==0x90)
               {
                  settime[1]&=0x0f;
                  settime[2]|=0x01;
               }
               else if (settime[2]&0x01)
                  settime[2]&=0xfe;
               else
                  settime[1]+=0x10;
            }
            else
            {
               if ((settime[(digit&0x02)?1:0]&((digit&0x01)?0xf0:0x0f)) == ((digit&0x01)?0x90:0x09))
                  settime[(digit&0x02)?1:0]&=((digit&0x01)?0x0f:0xf0);
               else
                  settime[(digit&0x02)?1:0]+=((digit&0x01)?0x10:0x01);
            }
            break;
         case MODE_CALCSETOPER:
            settime[2]+=0x40;
            break;
         case MODE_COUNTUP:
            settime[1]=0x00;
            settime[2]=0x00;
            break;
         case MODE_COUNTDOWN:
            settime[1]=lastcdn[0];
            settime[2]=lastcdn[1];
            changed=0;
            mode=MODE_SETCOUNTDOWN;
            digit=3;
            break;
         case MODE_CALIBRATE:
            if(digit==2)
               settime[1]^=0x80;
            if(digit>=2)
               break;
         case MODE_DEBUGADDR:
         case MODE_DEBUGVAL:
            settime[(mode==MODE_DEBUGADDR)?1:0]+=(digit==1?0x10:(((settime[(mode==MODE_DEBUGADDR)?1:0]&0x0f)==0x0f)?0xf1:0x01));
            break;
         case MODE_SETTIME:
         case MODE_SETALARM:
         case MODE_SETYEAR:
         case MODE_SETCOUNTDOWN:
            changed=1;
            //these 4 lines replaced a larger switch structure
            if((settime[digit&0x02?2:1]&((digit&0x01)?0xf0:0x0f))<(digit==1?((mode==MODE_SETYEAR)?0x90:0x50):(digit==3?((mode==MODE_SETCOUNTDOWN||mode==MODE_SETYEAR)?0x90:0x20):((mode!=MODE_SETCOUNTDOWN&&mode!=MODE_SETYEAR&&digit==2&&settime[2]>0x19)?0x03:0x09))))
               settime[digit&0x02?2:1]+=((digit&0x01)?0x10:0x01);
            else
               settime[digit&0x02?2:1]&=((digit&0x01)?0x0f:0xf0);
            break;
         case MODE_SETDATE:
            changed=1;
            switch (digit)
            {
            case 2:
               if(settime[1]<0x12)
                  settime[1]=bcd_add_byte(settime[1],0x01);
               else
                  settime[1]=0x01;
               break;
            case 1:
               if((settime[0]&0xf0)<((settime[1]==0x02)?0x20:0x30))
                  settime[0]+=0x10;
               else
                  settime[0]&=0x0f;
               break;
               
            case 0:
               if((settime[0]<((settime[1]==0x02)?(leap?0x29:0x28):(((settime[1]&0x18) && !(settime[1]&0x01) || !(settime[1]&0x18) && (settime[1]&0x01))?0x31:0x30))) && (settime[0]&0x0f)<0x09)
                  ++settime[0];
               else
                  settime[0]&=0xf0;
               if(settime[0]==0x00)
                  settime[0]=0x01;
               break;
            }
            break;
         case MODE_DATE:
            mode=MODE_SETYEAR;
            digit=3;
            changed=0;
            
            settime[1]=time[7];
            settime[2]=lastyear[1];
            break;
         case MODE_TIME:
            mode=MODE_SETALARM;
            digit=3;
            changed=0;
            
            settime[0]=0;
            settime[1]=alarm[1]; //get last alarm time
            if(settime[1]>0x59 || (settime[1]&0x0f)>0x09)
               settime[1]=0x00;
            settime[2]=alarm[2];
            if(settime[2]>0x23 || (settime[2]&0x0f)>0x09)
               settime[2]=0x00;
            break;
         case MODE_ALARM:
            alarm[0]=0;
            spi(RTC_WRITE,0x20,inbuf,outbuf,1);
            mode=MODE_TIME;
            break;
         case MODE_DEBUG:
            if(changed)
            {
               digit=1;
               mode=MODE_DEBUGVAL;
            }
            break;
         default:
            break;
         }
      }
      else
         P2IFG=0;
      
      switch(mode)
      {
      case MODE_CALC:
         if(outbuf[7])
         {
            dispvalue[0]=SYMB_E & SYMB_DOT;
            dispvalue[1]=SYMB_E & SYMB_DOT;
            dispvalue[2]=SYMB_E;
            dispvalue[3]=SYMB_NUL;
         }
         else
         {
            dispvalue[0]=symbol[outbuf[0]&0x0f] | (((outbuf[0]&0x0f)==0x00 && (outbuf[6]&0x02))?SYMB_NUL:SYMB_8);
            dispvalue[1]=(symbol[(outbuf[0]&0xf0)>>4] | (((outbuf[0]&0xf0)==0x00 && outbuf[1]==0x00 && !(outbuf[6]&0x02))?SYMB_NUL:SYMB_8)) & ((outbuf[6]&0x02)?SYMB_DOT:SYMB_NUL);
            dispvalue[2]=symbol[outbuf[1]&0x0f] | ((outbuf[1]==0x00 && !(outbuf[6]&0x02))?SYMB_NUL:SYMB_8);
            dispvalue[3]=(outbuf[6]&0x01)?SYMB_MIN:(symbol[(outbuf[1]&0xf0)>>4] |  (((outbuf[1]&0xf0)==0x00)?SYMB_NUL:SYMB_8));
         }
         if(alarm[0])
            dispvalue[3]&=SYMB_DOT;
         break;
      case MODE_CALCSETNUM:
         dispvalue[0]=(symbol[settime[0]&0x0f]      | ((digit!=0 && (time[1]&0x01))?SYMB_NUL:SYMB_8));
         dispvalue[1]=(symbol[(settime[0]&0xf0)>>4] | ((digit!=1 && (time[1]&0x01))?SYMB_NUL:SYMB_8)) & ((settime[2]&0x02)?SYMB_DOT:SYMB_NUL);
         dispvalue[2]=(symbol[settime[1]&0x0f]      | ((digit!=2 && (time[1]&0x01))?SYMB_NUL:SYMB_8));
         dispvalue[3]=(((settime[2]&0x01)?SYMB_MIN:symbol[(settime[1]&0xf0)>>4]) | ((digit!=3 && (time[1]&0x01))?SYMB_NUL:SYMB_8)) & (alarm[0]?SYMB_DOT:SYMB_NUL);
         break;
      case MODE_CALCSETOPER:
         switch (settime[2] & 0xc0)
         {
         case 0xc0:
            dispvalue[0]=SYMB_U;
            dispvalue[1]=SYMB_I;
            dispvalue[2]=SYMB_D;
            dispvalue[3]=SYMB_NUL;
            break;
         case 0x80:
            dispvalue[0]=SYMB_L;
            dispvalue[1]=SYMB_U;
            dispvalue[2]=SYMB_M2;
            dispvalue[3]=SYMB_M1;
            break;
         case 0x40:
            dispvalue[0]=SYMB_B;
            dispvalue[1]=SYMB_U;
            dispvalue[2]=SYMB_5;
            dispvalue[3]=SYMB_NUL;
            break;
         default:
            dispvalue[0]=SYMB_D;
            dispvalue[1]=SYMB_D;
            dispvalue[2]=SYMB_A;
            dispvalue[3]=SYMB_NUL;
         }
         if(alarm[0])
            dispvalue[3]&=SYMB_DOT;
         break;
      case MODE_SETTIME:
      case MODE_SETALARM:
      case MODE_SETCOUNTDOWN:
      case MODE_SETYEAR:
         dispvalue[0]=(symbol[settime[1]&0x0f]      | ((digit!=0 && (time[1]&0x01))?SYMB_NUL:SYMB_8)) & ((((((time[1]+0x01)&0x02)^((time[1]&0x10)>>3))&&mode==MODE_SETCOUNTDOWN)||mode==MODE_SETYEAR)?SYMB_NUL:SYMB_DOT);
         dispvalue[1]=(symbol[(settime[1]&0xf0)>>4] | ((digit!=1 && (time[1]&0x01))?SYMB_NUL:SYMB_8)) & (((((time[1]&0x02)^((time[1]&0x10)>>3))&&mode==MODE_SETCOUNTDOWN)||mode==MODE_SETYEAR)?SYMB_NUL:SYMB_DOT);
         dispvalue[2]=(symbol[settime[2]&0x0f]      | ((digit!=2 && (time[1]&0x01))?SYMB_NUL:SYMB_8)) ;
         dispvalue[3]=(symbol[(settime[2]&0xf0)>>4] | ((digit!=3 && (time[1]&0x01))?SYMB_NUL:SYMB_8)) & ((mode!=MODE_SETALARM && alarm[0] || mode==MODE_SETALARM && !(time[1]&0x01))?SYMB_DOT:SYMB_NUL);
         break;
      case MODE_DEBUGADDR:
      case MODE_DEBUGVAL:
         dispvalue[0]=(symbol[settime[(mode==MODE_DEBUGADDR)?1:0]&0x0f]      | ((digit!=0 && (time[1]&0x01))?SYMB_NUL:SYMB_8)) &SYMB_DOT;
         dispvalue[1]=(symbol[(settime[(mode==MODE_DEBUGADDR)?1:0]&0xf0)>>4] | ((digit!=1 && (time[1]&0x01))?SYMB_NUL:SYMB_8)) &SYMB_DOT;
         dispvalue[2]=(mode==MODE_DEBUGADDR)?SYMB_A:SYMB_NUL;   
         dispvalue[3]=alarm[0]?SYMB_DOT:SYMB_NUL;
         break;
      case MODE_SETDATE:
         dispvalue[0]=(symbol[settime[1]&0x0f]|((digit!=2 && (time[1]&0x01))?SYMB_NUL:SYMB_8));
         dispvalue[1]=(symbol[(settime[1]&0xf0)>>4]|((digit!=2 && (time[1]&0x01))?SYMB_NUL:SYMB_8))&SYMB_DOT;
         dispvalue[2]=(symbol[settime[0]&0x0f]|((digit!=0 && (time[1]&0x01))?SYMB_NUL:SYMB_8));
         dispvalue[3]=(symbol[(settime[0]&0xf0)>>4]|((digit!=1 && (time[1]&0x01))?SYMB_NUL:SYMB_8))&(alarm[0]?SYMB_DOT:SYMB_NUL);
         break;
      case MODE_CALIBRATE:
         dispvalue[0]=symbol[settime[0]&0x0f]|((digit!=0 && digit!=3 && (time[1]&0x01))?SYMB_NUL:SYMB_8);
         dispvalue[1]=symbol[(settime[0]&0xf0)>>4]|((digit!=1 && digit!=3 && (time[1]&0x01))?SYMB_NUL:SYMB_8);
         dispvalue[2]=(settime[1]?SYMB_MIN:SYMB_NUL)|((digit!=2 && digit!=3 && (time[1]&0x01))?SYMB_NUL:SYMB_8);
         dispvalue[3]=alarm[0]?SYMB_DOT:SYMB_NUL;
         break;
      case MODE_DATE:
         if((time[1]&0x03)==((time[1]&0x10)?0x01:0x03))
         {
            dispvalue[0]=symbol[time[7]&0x0f];
            dispvalue[1]=symbol[(time[7]&0xf0)>>4];
            dispvalue[2]=symbol[lastyear[4]&0x0f];
            dispvalue[3]=symbol[(lastyear[4]&0xf0)>>4]&(alarm[0]?SYMB_DOT:SYMB_NUL);
         }
         else
         {
            dispvalue[0]=symbol[time[6]&0x0f];
            dispvalue[1]=symbol[(time[6]&0xf0)>>4]&SYMB_DOT;
            dispvalue[2]=symbol[time[5]&0x0f];
            dispvalue[3]=((time[5]&0xf0)?symbol[(time[5]&0xf0)>>4]:SYMB_NUL)&(alarm[0]?SYMB_DOT:SYMB_NUL);
         }
         break;
      case MODE_COUNTDOWN:
         if(!(settime[1]|settime[2]))
         {
            if(!run)
            {
               dispvalue[0]=SYMB_g&SYMB_DOT;
               dispvalue[1]=SYMB_n&SYMB_DOT;
               dispvalue[2]=SYMB_o;
               dispvalue[3]=alarm[0]?SYMB_DOT:SYMB_NUL;
               break;
            }
            run=0;
         }
      case MODE_COUNTUP:
         dispvalue[0]=symbol[settime[1]&0x0f]&SYMB_DOT;
         dispvalue[1]=symbol[(settime[1]&0xf0)>>4]&SYMB_DOT;
         dispvalue[2]=symbol[settime[2]&0x0f];
         dispvalue[3]=((settime[2]&0xf0)?symbol[(settime[2]&0xf0)>>4]:SYMB_NUL)&(alarm[0]?SYMB_DOT:SYMB_NUL);
         break;
      case MODE_DEBUG:
         if(changed)
         {
            dispvalue[0]=symbol[settime[0]&0x0f]&SYMB_DOT;
            dispvalue[1]=symbol[(settime[0]&0xf0)>>4]&SYMB_DOT;
            dispvalue[2]=symbol[settime[1]&0x0f];
            dispvalue[3]=symbol[(settime[1]&0xf0)>>4]&(alarm[0]?SYMB_DOT:SYMB_NUL);
         }
         else
         {
            dispvalue[0]=SYMB_NUL;
            dispvalue[1]=SYMB_5&SYMB_DOT;
            dispvalue[2]=SYMB_1;
            dispvalue[3]=SYMB_NUL&(alarm[0]?SYMB_DOT:SYMB_NUL);
         }
         break;
      case MODE_ALARM:
      case MODE_TIME:
         if(((time[1]&0x01) && mode==MODE_ALARM) || (time[3]==0x04 && time[2]==0x33 && time[1]==0x00))
         {
            dispvalue[0]=SYMB_g;
            dispvalue[1]=SYMB_n;
            dispvalue[2]=SYMB_o;
            dispvalue[3]=SYMB_DOT;
            break;
         }
      default:
         dispvalue[0]=symbol[time[2]&0x0f]&((time[1]&0x01)?SYMB_NUL:SYMB_DOT);
         dispvalue[1]=symbol[(time[2]&0xf0)>>4]&((time[1]&0x01)?SYMB_NUL:SYMB_DOT);
         dispvalue[2]=symbol[time[3]&0x0f];
         dispvalue[3]=((time[3]&0xf0)?symbol[(time[3]&0xf0)>>4]:SYMB_NUL)&((alarm[0] || mode==MODE_ALARM)?SYMB_DOT:SYMB_NUL);
         break;
      }
      
      display(dispvalue);
      
      
      return;
   }

   int main( void )
   {
      unsigned char delay;
      
      //watchdog:
      WDTCTL = WDTPW + WDTHOLD;
      
      mode=MODE_INIT;
      
      //init 7 segment display
      
      P1OUT =0xff; //display data on p1
      P1DIR =0xff;
      
      P3OUT &=0x0f; //display control on p3.4-7
      P3DIR |=0xf0;
      
      dispvalue[0]=SYMB_NUL;
      dispvalue[1]=SYMB_o;
      dispvalue[2]=SYMB_o;
      dispvalue[3]=SYMB_NUL;
      
      display(dispvalue); 
      
      //clocking:
         
      BCSCTL2 |= DIVM_3; //errata sheet recommends this here
      
      DCOCTL =0x00;
      BCSCTL1 =
         RSEL2| //in the
         XTS| //hi freq
         DIVA_1; //ACLK = 6/2 MHz
      
      #if !(defined DEBAG)
      do
      {
         IFG1 &= ~OFIFG;
         for (delay = 0xFF; delay > 0; --delay);
      }
      while ((IFG1 & OFIFG));
      #endif
      
      BCSCTL2 =
         SELM_2| //MCLK from XT2
         DIVM_1| //MCLK = 6/2 MHz
         SELS| //SMCLK from XT2
         DIVS_0; //SMCLK = 6/1 MHz
         
      //init SPI
      
      P3SEL =0x0e; // SPI on p3.1, 3.2, 3.3
      P3OUT |=0x01;
      P3DIR |=0x01; //RTC CS on p3.0
      
      U0CTL =
         SWRST| //reset
         MM| //master
         SYNC| //SPI mode
         CHAR; //8 bit data
      U0TCTL=
         CKPH| //polarity and phase
         SSEL0|SSEL1| //SMCLK
         STC; //3 pin mode
      U0BR1=0x00;
      U0BR0=0x02; //baudrate = SMCLK/2 = 3MHz
      U0MCTL=0x00;
      ME2|=USPIE0;
      U0CTL &= ~SWRST;
      
      
      //init RTC
      
      //Looks like sometimes the first SPI reads rom the RTC may be incorrect.
      //To be sure, let's do a few redundant reads before starting the real work
      
      #if !(defined DEBAG)
      for (delay = 0xFF; delay > 0; --delay)
          spi(RTC_READ,0x00,inbuf,outbuf,1);
      #endif
      
      //set 24 hour mode
      spi(RTC_READ,0x03,inbuf,outbuf,1);
      if(inbuf[0]&0x40)
      {
         outbuf[0]=inbuf[0]&(~0x40);
         spi(RTC_WRITE,0x03,inbuf,outbuf,1);
      }
         
      //enable battery
      spi(RTC_READ,0x04,inbuf,outbuf,1);
      if(!(inbuf[0]&0x08))
      {
         outbuf[0]=inbuf[0]|0x08; //enable battery
         spi(RTC_WRITE,0x04,inbuf,outbuf,1);
      }
      
      //set control register
      //spi(RTC_READ,0x08,inbuf,outbuf,1);
      outbuf[0]=
         0x40| //squarewave enable
         0x04; //1Hz
      //no hardware alarms :(
      spi(RTC_WRITE,0x08,inbuf,outbuf,1);
      
      //get (soft) alarm from RTC SRAM
      spi(RTC_READ,0x20,inbuf,outbuf,3);
      
      alarm[0]=(inbuf[0]==ALARMVALUE)?ALARMVALUE:0;
      alarm[1]=inbuf[1];
      alarm[2]=inbuf[2];
      
      spi(RTC_READ,0x2f,inbuf,outbuf,1); // <- because of RTC bug (?)
      
      //get last countdown value from RTC SRAM
      spi(RTC_READ,0x23,inbuf,outbuf,3);
      if(inbuf[0]==ALARMVALUE)
      {
         lastcdn[0]=inbuf[1];
         lastcdn[1]=inbuf[2];
      }
      else
      {
         lastcdn[0]=0;
         lastcdn[1]=0;
      }
      
      spi(RTC_READ,0x2f,inbuf,outbuf,1); // <- because of RTC bug (?)
      
      //get last year value from RTC SRAM
      spi(RTC_READ,0x26,inbuf,outbuf,3);
      if(inbuf[0]==ALARMVALUE)
      {
         lastyear[0]=inbuf[1];
         lastyear[1]=inbuf[2];
      }
      else
      {
         lastyear[0]=0x00;
         lastyear[1]=0x20;
      }
      lastyear[3]=0;
      
      //start oscillator
      spi(RTC_READ,0x01,inbuf,outbuf,1);
      if(!(inbuf[0]&0x80))
      {
         outbuf[0]=inbuf[0]|0x80;
         spi(RTC_WRITE,0x01,inbuf,outbuf,1);
      }
      
      //init timer:
      TACCR0 = 375-1; //3MHz/375/2=4kHz
      TACCTL0=   //also, compare, not capture
         OUTMOD_4; //toggle
      TACTL=
         TASSEL_1| //ACLK, 3MHz
         ID_0| //3MHz/1
         //MC_1| //up mode
         TACLR; //reset
      P2SEL|=0x04; //P2.2 timer output.
      P2DIR|=0x04;
      
      // Init interrupts
      P2IE=
         0x08| //p2.3 - int. from RTC
         0x02| //p2.1 - int. from button A
         0x01| //p2.0 - int. from button B
         0x20; //p2.5 - int. from button C
      P2IES|=0x01|0x02|0x20; //button int. on falling edge
      P2IES&= ~0x08; //RTC int. on rising edge
      P2IFG=0x00;
      
      if(!(P2IN&0x02)) //button A pressed at start?
      {
         mode=MODE_CALIBRATE;
         spi(RTC_READ,0x03,inbuf,outbuf,1);
         settime[1]=inbuf[0]&0x80;
         spi(RTC_READ,0x09,inbuf,outbuf,1);
         settime[0]=inbuf[0];
         digit=3;
      }
      else if(!(P2IN&0x01)) //button B pressed at start?
      {
         mode=MODE_CALC;
         outbuf[0]=0x00;
         outbuf[1]=0x00;
         outbuf[2]=0x00;
         outbuf[3]=0x00;
         outbuf[6]=0x00;
         outbuf[7]=0x00;
      }
      else if(!(P2IN&0x20)) //button C pressed at start?
      {
         mode=MODE_DEBUG;
         settime[1]=0x00;
         changed=0;
      }
      else
         mode=MODE_TIME;
      
      __enable_interrupt();
      
      
      while(1)
      {
         lpm3();
      }
   }

Code: Select all

; SilentTimer Action Figure software, v1.5
; asm.S
; things that can't be done in C
;
; 07.03.2016
; Copyright (C) 2014-2016  Balthasar Szczepański
;
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program.  If not, see <http://www.gnu.org/licenses/>.

#include "msp430.h"
;Why do I even have to define this?!
#define SR R2

.section .text


;function to add 2-digit BCD numbers
.global bcd_add_byte
.type bcd_add_byte, @function
bcd_add_byte:
   clrc
   dadd.b R14, R15
   ret

;function to enter low power mode 3
.global lpm3
.type lpm3, @function
lpm3:
   bis.w #SCG1|SCG0|CPUOFF, SR
   ret

;helper function - shifts R13:R12 two digits left
.global calc_shl
.type calc_shl, @function
.type cshl_1, @function
calc_shl:
   mov   #8,      R15
cshl_1:
   rla            R12
   rlc            R13
   dec            R15
   jnz            cshl_1
   ret

;helper function - shifts R13:R12 two digits right, with rounding
.global calc_shr
.type calc_shr, @function
.type cshr_1, @function
.type cshr_2, @function
calc_shr:
   mov   R12,     R15
   and   #0x00f0, R15
   cmp   #0x0050, R15
   jlo            cshr_1
   clrc
   dadd  #0x0100, R12
   dadc           R13
cshr_1:
   mov   #8,      R15
cshr_2:
   rra            R13
   rrc            R12
   dec            R15
   jnz            cshr_2
   ret

;helper function - negate bcd number in R13:R12
.global calc_neg
.type calc_neg, @function
calc_neg:
   mov   #0x9999, R15
   sub   R12,     R15
   mov   R15,     R12
   mov   #0x9999, R15
   sub   R13,     R15
   mov   R15,     R13
   clrc
   dadd  #0x0001, R12
   dadc           R13
   ret
   
;the calculator add function
.global calc_add
.type calc_add, @function
.type ca_shl2, @function
.type ca_neg2, @function
.type ca_shl1, @function
.type ca_neg1, @function
.type ca_negr, @function
.type ca_shr1r, @function
.type ca_err, @function
.type ca_end, @function
calc_add:
   push  R11
   push  R10
   
   mov   R15,     R14
   
   mov   2(R14),  R12
   clr            R13
   bit.b #0x08,   6(R14)
   jnz            ca_shl2
   call           #calc_shl
ca_shl2:
   bit.b #0x04,   6(R14)
   jz             ca_neg2
   call           #calc_neg
ca_neg2:
   mov   R12,     R10
   mov   R13,     R11
   
   mov   4(R14),  R12
   clr            R13
   bit.b #0x20,   6(R14)
   jnz            ca_shl1
   call           #calc_shl
ca_shl1:
   bit.b #0x10,   6(R14)
   jz             ca_neg1
   call           #calc_neg
ca_neg1:
;ok, prepared, now add
   clrc
   dadd  R10,     R12
   dadd  R11,     R13
;and process result
   mov   #0xff00, R10
   mov   #0x0000, R11
   bic.b #0x03,   6(R14)
   mov   R13,     R15
   and   #0xff00, R15
   cmp   #0x9900, R15
   jne            ca_negr
   mov   #0xfff0, R10
   mov   #0xf000, R11
   bis.b #0x01,   6(R14)
   call           #calc_neg
ca_negr:
   bit   R10,     R13
   jnz            ca_err
   bit   #0xffff, R13
   jnz            ca_shr1r         
   bit   R11,     R12
   jnz            ca_shr1r
   bit   #0x00ff, R12
   jz             ca_shr1r
   bis.b #0x02,   6(R14)
   jmp            ca_end
ca_shr1r:
   call           #calc_shr
   bit   #0xffff, R13
   jnz            ca_err
   bit   R11,     R12
   jnz            ca_err
   jmp            ca_end
ca_err:
   mov.b #0xff,   7(R14)
ca_end:
   mov   R12,     0(R14)
   pop            R10
   pop            R11
   ret

;the calculator multiply function
.global calc_mul
.type calc_mul, @function
.type cm_ml, @function
.type cm_slo, @function
.type cm_sla, @function
.type cm_adm1, @function
.type cm_adm2, @function
.type cm_nr1, @function
.type cm_nr2, @function
.type cm_srl1, @function
.type cm_srl2, @function
.type cm_srl3, @function
.type cm_srl4, @function
.type cm_srrl1, @function
.type cm_srrl2, @function
.type cm_tbg, @function
.type cm_srrb, @function
.type cm_zap, @function
.type cm_err, @function
.type cm_end, @function
calc_mul:
   push  R11
   push  R10
   push  R9
   push  R8
   push  R7
   push  R6
   mov   2(R15),  R7
   mov   4(R15),  R8
   clr            R9
   clr            R12
   clr            R13
   mov   #4,      R14
cm_ml:
   clr            R10
   clr            R11
   mov   #4,      R6
cm_slo:
   rla            R8
   rlc            R9
   dec            R6
   jnz            cm_slo
   mov   #4,      R6
cm_sla:
   rla            R12
   rlc            R13
   dec            R6
   jnz            cm_sla
   bit   #0xffff, R9
   jz             cm_adm2
cm_adm1:
   clrc
   dadd  R7,      R10
   dadc           R11
   dec            R9
   jnz            cm_adm1
cm_adm2:
   clrc
   dadd  R10,     R12
   dadd  R11,     R13
   dec            R14
   jnz            cm_ml
;R8, R9, R14 = 0 here
   mov   #0xff00, R7
   bic.b #0x03,   6(R15)
   bit.b #0x10,   6(R15)
   jz             cm_nr1
   xor.b #0x01,   6(R15)
   xor   #0xf000, R8
   xor   #0x00f0, R7
cm_nr1:
   bit.b #0x04,   6(R15)
   jz             cm_nr2
   xor.b #0x01,   6(R15)
   xor   #0xf000, R8
   xor   #0x00f0, R7
cm_nr2:
   bit.b #0x20,   6(R15)
   jnz            cm_srl1
   add   #8,      R9
cm_srl1:
   bit.b #0x08,   6(R15)
   jnz            cm_srl2
   add   #8,      R9
cm_srl2:
   cmp   #0x0000, R9
   jeq            cm_srl4
cm_srl3:
   rla            R12
   rlc            R13
   rlc            R14
   dec            R9
   jnz            cm_srl3
cm_srl4:
   bit   #0xffff, R14
   jnz            cm_err
   bit   R8,      R13
   jnz            cm_err
   bit   R7,      R13
   jnz            cm_srrl2
   mov   #8,      R6
   bis.b #0x02,   6(R15)
cm_srrl1:
   rla            R12
   rlc            R13
   dec            R6
   jnz            cm_srrl1
cm_srrl2:
   and   #0xf000, R12
   cmp   #0x5000, R12
   jlo            cm_zap
   clrc
   dadd  #0x0001, R13
   dadc           R14
   jnz            cm_tbg
   bit   R8,      R13
   jnz            cm_tbg
   jmp            cm_zap
cm_tbg:
   bit.b #0x02,   6(R15)
   jz             cm_err
   bic.b #0x02,   6(R15)
   mov   #8,      R6
cm_srrb:
   rra            R13
   dec            R6
   jnz            cm_srrb
cm_zap:
   bit.b #0x02,   6(R15)
   jz             cm_end
   bit   #0x00ff, R13
   jnz            cm_end
   swpb           R13
   bic.b #0x02,   6(R15)
   bit   #0xffff, R13
   jnz            cm_end
   bic.b #0x01,   6(R15)
   jmp            cm_end
cm_err:
   mov.b #0xff,   7(R15)
cm_end:
   mov   R13,     0(R15)
   pop            R6
   pop            R7
   pop            R8
   pop            R9
   pop            R10
   pop            R11
   ret

;the calculator divide function
.global calc_div
.type calc_div, @function
.type cd_slo1, @function
.type cd_slo2, @function
.type cd_slo3, @function
.type cd_slo4, @function
.type cd_ml, @function
.type cd_slaa, @function
.type cd_sbdv1, @function
.type cd_sbdv2, @function
.type cd_sbdv3, @function
.type cd_nr1, @function
.type cd_nr2, @function
.type cd_srrl1, @function
.type cd_srrl2, @function
.type cd_tbg, @function
.type cd_srrb, @function
.type cd_zap, @function
.type cd_err, @function
.type cd_end, @function
calc_div:
   push  R11
   push  R10
   push  R9
   push  R8
   push  R7
   push  R6
   push  R5
   
   mov   2(R15),  R7
   bit   #0xffff, R7
   jz             cd_err
   mov   #0x9999, R6
   sub   R7,      R6
   clrc
   dadd  #0x0001, R6
   
   mov   4(R15),  R8
   clr            R9
   clr            R10
   clr            R11
   clr            R12
   clr            R13
   clr            R5
   
   bit.b #0x20,   6(R15)
   jnz            cd_slo1
   add   #8,      R5     
cd_slo1:
   bit.b #0x08,   6(R15)
   jz             cd_slo2
   add   #8,      R5
cd_slo2:
   bit   #0xffff, R5
   jz             cd_slo4
cd_slo3:
   rla            R8
   rlc            R9
   dec            R5
   jnz            cd_slo3
cd_slo4:
   
   mov   #9,      R14
cd_ml:
   mov   #4,      R5
cd_slaa:
   rla            R8
   rlc            R9
   rlc            R10
   rlc            R11
   rla            R12
   rlc            R13
   jc             cd_err
   dec            R5
   jnz            cd_slaa
cd_sbdv1:
   bit   #0xffff, R11
   jnz            cd_sbdv2
   cmp   R7,      R10
   jlo            cd_sbdv3
cd_sbdv2:
   clrc
   dadd  R6,      R10
   dadd  #0x9999, R11
   clrc
   dadd  #0x0001, R12
   jmp            cd_sbdv1
cd_sbdv3:
   dec            R14
   jnz            cd_ml
   
   bic.b #0x03,   6(R15)
   clr   R14
   mov   #0x0000, R9
   mov   #0xf000, R10
   mov   #0xfff0, R11
   bit.b #0x10,   6(R15)
   jz             cd_nr1
   xor.b #0x01,   6(R15)
   xor   #0xf000, R9
   xor   #0x0f00, R10
   xor   #0x000f, R11
cd_nr1:
   bit.b #0x04,   6(R15)
   jz             cd_nr2
   xor.b #0x01,   6(R15)
   xor   #0xf000, R9
   xor   #0x0f00, R10
   xor   #0x000f, R11
cd_nr2:
   bit   R10,     R13
   jnz            cd_err
   bit   R11,     R13
   jnz            cd_srrl1
   mov   #12,     R5
   bis.b #0x02,   6(R15)
   jmp            cd_srrl2
cd_srrl1:
   mov  #4,       R5
cd_srrl2:
   rla            R12
   rlc            R13
   rlc            R14
   dec            R5
   jnz            cd_srrl2
   and   #0xf000, R12
   cmp   #0x5000, R12
   jlo            cd_zap
   clrc
   dadd  #0x0001, R13
   dadc           R14
   jnz            cd_tbg
   bit   R9,      R13
   jnz            cd_tbg
   jmp            cd_zap
cd_tbg:
   bit.b #0x02,   6(R15)
   jz             cd_err
   bic.b #0x02,   6(R15)
   mov   #8,      R5
cd_srrb:
   rra            R13
   dec            R5
   jnz            cd_srrb
cd_zap:
   bit.b #0x02,   6(R15)
   jz             cd_end
   bit   #0x00ff, R13
   jnz            cd_end
   swpb           R13
   bic.b #0x02,   6(R15)
   bit   #0xffff, R13
   jnz            cd_end
   bic.b #0x01,   6(R15)
   jmp            cd_end
cd_err:
   mov.b #0xff,   7(R15)
cd_end:
   mov   R13,     0(R15)
   pop            R5
   pop            R6
   pop            R7
   pop            R8
   pop            R9
   pop            R10
   pop            R11
   ret
   
   
   
BSTA
Good luck, my blitzing friends!
BTTBAA:1023 # Mustard? Use the mirror! Blitzing? Also use the mirror! And here's why. # OTT facebug copy
that's a robot so it doesn't countImage
This text was autogenerated:
swimming unit detector active

User avatar
HES
Posts: 4896
Joined: Fri May 10, 2013 7:13 pm UTC
Location: England

Re: GRAPEVINE YOUR MOLPHIN AREE BELONG TTOO OTC

Postby HES » Fri Mar 18, 2016 10:23 pm UTC

Link wrote:Also, welcome back from holidips, HES! :D

Thanks! Though, that hasn't actually happened yet. But you know what this place is like when it comes to nonlinear chronology...

Glancing to the right, I'm assuming my avatar is backed up someplace? Probably redundantly so.
He/Him/His Image

User avatar
slinches
Slinches get Stinches
Posts: 1036
Joined: Tue Mar 26, 2013 4:23 am UTC

Re: GRAPEVINE YOUR MOLPHIN AREE BELONG TTOO OTC

Postby slinches » Fri Mar 18, 2016 10:32 pm UTC

HES wrote:
Link wrote:Also, welcome back from holidips, HES! :D

Thanks! Though, that hasn't actually happened yet. But you know what this place is like when it comes to nonlinear chronology...

Glancing to the right, I'm assuming my avatar is backed up someplace? Probably redundantly so.

I'm not sure if it's the latest version, but your BuffyHatted avatar is here: http://xkcd-time.wikia.com/wiki/Hats_by_buffygirl

And your new Avatar avatar has an appropriate amount of redundancy.

User avatar
SilentTimer
Posts: 1101
Joined: Fri Nov 08, 2013 8:40 pm UTC
Location: secret base on the Moon

TimeAfterTime Revisited – t1i-0740

Postby SilentTimer » Sat Mar 19, 2016 9:00 am UTC

A CREDENZA IS WUNGISH. THE PINKLYMOLP? NOT SO MUCH. -- ongomome
Image
Spoiler:
Wait for it.

Did you notice …
… the molpy?
Spoiler:
There's a seaish snake in the bush on the right. We'll meet it again later.
-- posted by SilentBot Image
Image Did you like 1190: Time?
Then you will like its sequel: t1i. [Discussion] [Making Of]
ucim wrote:I consider it to be canon.

503? Images don't work? Other mustard? Visit the ЯOЯЯIM!

Randalspeed to Rakhal, thunk, and all Blitzers!

User avatar
Eternal Density
Posts: 5588
Joined: Thu Oct 02, 2008 12:37 am UTC
Contact:

Hi adnapemit, I remember you!

Postby Eternal Density » Sat Mar 19, 2016 10:12 am UTC

FYI we've reached a new chapter of Hallucinations of a Time Accessor!
And no one has looked at it yet.
Swirly space ripple: http://timelessriver.net/stories/1/4/
Play the game of Time! castle.chirpingmustard.com Hotdog Vending Supplier But what is this?
In the Marvel vs. DC film-making war, we're all winners.

User avatar
apricity
almost grown-up but not quite
Posts: 3983
Joined: Fri Jan 26, 2007 9:28 am UTC

Re: 1190: "Time"

Postby apricity » Sat Mar 19, 2016 11:43 pm UTC

You have been bequeathed a forum. Use it well. viewforum.php?f=47
LE4d wrote:have you considered becoming an electron

it takes just a little practice to learn to be
(she/her/hers)

User avatar
mscha
Posts: 6907
Joined: Tue Mar 26, 2013 10:21 pm UTC
Location: NL
Contact:

Time Randomly Revisited - np2378

Postby mscha » Sun Mar 20, 2016 12:00 am UTC

WRONGDOERS...
Image
Spoiler:
Wait for it.
(Colorization by balthasar_s.)

OTT Time Travel

AUTOMOME wrote:CHIRPY 2: ELECTRIC BAGALLOO

-- posted by randompixbot

User avatar
BlitzGirl
Posts: 9116
Joined: Mon Sep 20, 2010 11:48 am UTC
Location: Out of the basement for Yip 6! Schizoblitz: 115/2672 NP
Contact:

Re: 1190: "Time"

Postby BlitzGirl » Sun Mar 20, 2016 5:47 am UTC

Image
Baobabs, it's the OTT! Hi again everyone!
I think I accidentally the Outside, might have had something to do with a rainbow brainslug.
Also I think I now have a couple of gallons of ketchup to do. But I heard there was Furious Doodling afoot so I had to check in on my fellow OTTers!
*waves enthusiastically at everymolpy*


Redundant:
Spoiler:
Image


OutsidePortal.png
OutsidePortal.png (63.4 KiB) Viewed 17646 times

Keywords: BGUM outside portal believe half yip whirly swirly time ripple
redundanthalfyip.png
Don't worry, no illness or injury. But lots of busy!
redundanthalfyip.png (165.64 KiB) Viewed 17646 times
Knight Temporal of the One True Comic
BlitzGirl the Pink, Mopey Molpy Mome
Spoiler:
Image
Image
Image<Profile
~.Image~.FAQ->Image

User avatar
balthasar_s
Posts: 2408
Joined: Mon Nov 28, 2011 3:20 pm UTC
Location: secret base on the Moon
Contact:

Re: 1190: "Time"

Postby balthasar_s » Sun Mar 20, 2016 6:08 am UTC

Good to see you here again. Hi, welcome forward.
I was afraid we would have the first BlitzGirlless madnesstime.

Also it's only 5 days until the third(!) anniversary of Time.
BSTA
Good luck, my blitzing friends!
BTTBAA:1023 # Mustard? Use the mirror! Blitzing? Also use the mirror! And here's why. # OTT facebug copy
that's a robot so it doesn't countImage
This text was autogenerated:
swimming unit detector active

User avatar
Sciscitor
Posts: 505
Joined: Sat Apr 13, 2013 6:20 am UTC
Location: Austria

Re: 1190: "Time"

Postby Sciscitor » Sun Mar 20, 2016 6:16 am UTC

BlitzGirl wrote:Image
Baobabs, it's the OTT! Hi again everyone!

Hello BlitzGirl! :D
Welcome back, you have been missed greatly. Let me be the first one to greet you before I take my hiatus from the yearly infantilities.
Unfortunately, the message is already garbled up. :( Sorry.
TFDA Senior OTT Analyst (Resources, The Database of OTC and OTT Related Art)
To all Blitzers (Maugrim, micdi, Purplepants77 et al): Have fun and enjoy your journey!
Holmes, Sherlock wrote:"It's elementary, my dear Watson!"1
1 Holmes actually never said this.

User avatar
BlitzGirl
Posts: 9116
Joined: Mon Sep 20, 2010 11:48 am UTC
Location: Out of the basement for Yip 6! Schizoblitz: 115/2672 NP
Contact:

Re: 1190: "Time"

Postby BlitzGirl » Sun Mar 20, 2016 6:40 am UTC

Image Hi balthasar and Sciscitor! (Don't worry, Sciscitor, your message is ungarbled in original OTT posts. Have a molpish hiatus!)
It's wowterful to be forward! I was hoping to pop out at Time's birthdip but the Doodling appeared first this yip so I unvortexed a bit early.

balthasar_s wrote:I was afraid we would have the first BlitzGirlless madnesstime.

Actually, I missed the OTT's first madnesstime completely! That was before I began blitzing (I think), so the needle-pulled thing has had four Madnessen and I've only been Present for three.

Speaking of which, I'm planning to try and keep the OTW's own copy of the wordfilter list current and anymolpy is welcome to pitch in. I know the fora-at-large has their own spreadsheet but it's always molpish to have a redundalist.
Knight Temporal of the One True Comic
BlitzGirl the Pink, Mopey Molpy Mome
Spoiler:
Image
Image
Image<Profile
~.Image~.FAQ->Image

User avatar
Neil_Boekend
Posts: 3220
Joined: Fri Mar 01, 2013 6:35 am UTC
Location: Yes.

Re: 1190: "Time"

Postby Neil_Boekend » Sun Mar 20, 2016 8:18 am UTC

BLITZGIRL!!!!!!

WELCOME BACK!!!!!!!

MY SHIFT KEY IS STUCK!!!!!!
Mikeski wrote:A "What If" update is never late. Nor is it early. It is posted precisely when it should be.

patzer's signature wrote:
flicky1991 wrote:I'm being quoted too much!

he/him/his

User avatar
Link
Posts: 1419
Joined: Sat Mar 07, 2009 11:33 am UTC
Location: ᘝᓄᘈᖉᐣ
Contact:

A RAFTCASTLE IS TREEEISH TOO

Postby Link » Sun Mar 20, 2016 8:23 am UTC

OMR, IT'S BLITZGIRL! YAAAY!

User avatar
BlitzGirl
Posts: 9116
Joined: Mon Sep 20, 2010 11:48 am UTC
Location: Out of the basement for Yip 6! Schizoblitz: 115/2672 NP
Contact:

Re: 1190: "Time"

Postby BlitzGirl » Sun Mar 20, 2016 8:55 am UTC

I THINK THE SHIFT KEY IS CONTAGIOUS! HI NEIL AND LINK!

I ALMOST FORGOT: I BROUGHT SOME RELATED CAKE FOR THIS YIP! HOPEFULLY IT'S NOT REDUNDACAKE:

Image
Knight Temporal of the One True Comic
BlitzGirl the Pink, Mopey Molpy Mome
Spoiler:
Image
Image
Image<Profile
~.Image~.FAQ->Image

User avatar
Sustainabilizer
Posts: 612
Joined: Thu Dec 26, 2013 7:24 pm UTC
Location: The Sustainable University

Re: 1190: "Time"

Postby Sustainabilizer » Sun Mar 20, 2016 9:40 am UTC

OMR! BlitzGirl is back! Rejoice!
BlitzGirl wrote:
*waves enthusiastically at everymolpy*

*waves back enthusiastically*
Image

–– going to read-only mode for the madness ––

See y'all soon! :)

ETA:
lmjb1964 wrote:
AluisioASG wrote:Hey, I got lmjb'd!
In any case, there was too much to say, and I feel bad editing posts, so have a WIP instead: https://aasg.chirpingmustard.com/chirpy/presentation/
balthasar_s: Time to stop the botch-up?

Ah, I've been verbed!

I didn't understand all of that presentation, but it looked very impressive.

I do understand it, and it's awesomeful. :)

AluisioASG wrote:
balthasar_s wrote:
AluisioASG wrote:In any case, there was too much to say, and I feel bad editing posts, so have a WIP instead: https://aasg.chirpingmustard.com/chirpy/presentation/
I need Javascript to see this. But it's only text and pictures. also also in some places the text doesn't fit the screen and it's not possible to scroll to see it.
Try https://aasg.chirpingmustard.com/chirpy ... tation.pdf, or https://aasg.chirpingmustard.com/chirpy ... cement.mdk.

I agree with balthasar_s. Thanks for the pdf and mdk files. :) They are much molpier for me!
To be precise, the original link required me to turn off CSS to see anything. The PDF file just worked.
Aluisio, I think your work should be included in the upcoming Proceedings.
We can discuss that here after the madness, or directly via email.
In any case: Steakish!
Confused about the OTT? See the Wiki!
Want more 1190: Time? Check out TimeAfterTime!
There is a MIRROR of the OTT, just in case.
Thanks for participating in my Scientific Conference and OTTer Meetup!
Image
Help for addams completed successfully. Thanks!

User avatar
ucim
Posts: 6888
Joined: Fri Sep 28, 2012 3:23 pm UTC
Location: The One True Thread

Re: 1190: "Time"

Postby ucim » Sun Mar 20, 2016 1:42 pm UTC

OMR it's BlitzGirl! I saw you in the crystal organ, but was wondering if it was a mirage, since a thorough search of the basement came up empty. So glad to see you're back! These are exciting times indeed!

Jose
Order of the Sillies, Honoris Causam - bestowed by charlie_grumbles on NP 859 * OTTscar winner: Wordsmith - bestowed by yappobiscuts and the OTT on NP 1832 * Ecclesiastical Calendar of the Order of the Holy Contradiction * Heartfelt thanks from addams and from me - you really made a difference.

User avatar
BlitzGirl
Posts: 9116
Joined: Mon Sep 20, 2010 11:48 am UTC
Location: Out of the basement for Yip 6! Schizoblitz: 115/2672 NP
Contact:

Re: 1190: "Time"

Postby BlitzGirl » Sun Mar 20, 2016 6:24 pm UTC

Image Hi Sustainabilizer and ucim! It's so awesomeful to see everybody again!

In sieve news, I won't be posting most of them here since they aren't especially OTT-RELATED.
It might be helpful to know that FaiD references now turn into the OTF, a parody of the OTT:
Spoiler:
FaiD = The One True Forum
Free as in Destitute = The One True Forum
And no practical definition of freedom would be complete without the freedom to take the consequences. Indeed, it is the freedom upon which all the others are based = The One True Forum, dedicated to the Time comic. Off-topic discussion is strictly prohibited.
And this one was probably not made with OTTers in mind but I like it anyway:
Spoiler:
t** **d = the beginning
Knight Temporal of the One True Comic
BlitzGirl the Pink, Mopey Molpy Mome
Spoiler:
Image
Image
Image<Profile
~.Image~.FAQ->Image

User avatar
balthasar_s
Posts: 2408
Joined: Mon Nov 28, 2011 3:20 pm UTC
Location: secret base on the Moon
Contact:

Re: 1190: "Time"

Postby balthasar_s » Sun Mar 20, 2016 6:43 pm UTC

BlitzGirl wrote:It might be helpful to know that The One True Forum references now turn into the OTF, a parody of the OTT

This is interesting. They made madness into an OTTifying machine.
BlitzGirl wrote:It's so awesomeful to see everybody again!
And also awesomeful to see you. You were missed.
I had [url=forums.xkcd.com/viewtopic.php?f=7&t=101043&p=3903044#p3903044]dreams[/url] of you.
BSTA
Good luck, my blitzing friends!
BTTBAA:1023 # Mustard? Use the mirror! Blitzing? Also use the mirror! And here's why. # OTT facebug copy
that's a robot so it doesn't countImage
This text was autogenerated:
swimming unit detector active

User avatar
mscha
Posts: 6907
Joined: Tue Mar 26, 2013 10:21 pm UTC
Location: NL
Contact:

Re: 1190: "Time"

Postby mscha » Sun Mar 20, 2016 8:00 pm UTC

Yay, BlitzGirl is back! Welcome forward, we missed you!
That calls for some BlitzCake!

Image
List¹ of all Frames of Time and after Time.
New here? Questions? Check the wiki.
Don't worry, feed molpies⁴.
Image
Holy Croce
Default footnotes; standard OTT-np2166m 1.2:
Spoiler:
Image
Image

User avatar
lmjb1964
Posts: 2472
Joined: Mon Apr 04, 2011 7:09 pm UTC
Location: In the Present! Need to ketchup NP 2236-2280, plus NP 2026-2058 and something like 2060-2090+?.

Re: 1190: "Time"

Postby lmjb1964 » Sun Mar 20, 2016 8:19 pm UTC

Birthdip-related ketchup forthcoming, but just let me say

AAAAAAAAAAAAABLITZGIRLAAAAAAAA!!!!
Image

You helped Addams stay in her home, and gave her a better life. She thanks you, and so do I.
Imagesmiley by yappo
That's a robot but it totally counts. Image

bot by balthasar_s

User avatar
BlitzGirl
Posts: 9116
Joined: Mon Sep 20, 2010 11:48 am UTC
Location: Out of the basement for Yip 6! Schizoblitz: 115/2672 NP
Contact:

Re: 1190: "Time"

Postby BlitzGirl » Sun Mar 20, 2016 9:07 pm UTC

AAAAAAAAAAAAALMJBAAAAAAAA!!!!
(that scream looks like it should rhyme with "algebra" for some reason)
Happy belated birthdip! Cake:
Spoiler:
Image

mscha wrote:That calls for some BlitzCake!
Spoiler:
Image

OMR, that looks and sounds scrumptious! Thanks, mscha!!


balthasar_s wrote:And also awesomeful to see you. You were missed.
I had dreams of you.

Spoiler:
balthadream wrote:
lmjb1964 wrote:But I miss BlitzGirl. :(

I miss BlitzGirl too.
Yesterday I had a dream about BlitzGirl.

(In my dreams people always speak Polish. Even if they're foreign people they almost always speak Polish too. But at some point I may notice that something is wrong...
This already happened twice with related dreams and even more with unrelated ones. also also, it's not the first dream with BlitzGirl in it.)

I was on a sandy road on a small hill on an empty field. It was very sunny. On the right side of the road was a small wall made of stone about 1m tall. BlitzGirl was sitting on the wall and I was standing next to it. We were talking about something. I don't remember now. There was something about going to a place. And that there is a lot of time for it. While talking most of the time I was not looking at her but instead I would pick up some sand and look at my hand with some sand in it. After some more talking I realised that we are not speaking English. I asked her how it's possible. She tried to explain herself but I wasn't listening to the explanation. I was picking up sand, dropping a small stream of it and observing it.
And then it was late, evning, a little dark. She was not there anymore. I walked along the road thinking about how to get to that place we talked about earlier.
Baobabs, that's a baobabbish dream. Very interesting. Sand and Time and walls made of stone. Plus I could speak Polish, which is cool. Image


Redundant:
Spoiler:
Image



LMJBcake16.png

Keywords: cake LMJB birthdip 16 2016 redundabirthdip redunda mardi gras beads meowlpy kitty
RedundabirthdipLMJB.png
RedundabirthdipLMJB.png (170.97 KiB) Viewed 16685 times
Knight Temporal of the One True Comic
BlitzGirl the Pink, Mopey Molpy Mome
Spoiler:
Image
Image
Image<Profile
~.Image~.FAQ->Image

User avatar
NoMouse
Posts: 727
Joined: Mon Mar 25, 2013 10:05 pm UTC
Location: Czech Republic

"I WANT THE CREDENZA!"/"YOU CAN'T MOLPY THE CREEDENZA!"

Postby NoMouse » Sun Mar 20, 2016 9:21 pm UTC

Yay, BlitzGirl's bag! Welcome forward! Oh, and I almost forgot about the Timiversary, I feel ashamed! And the Madness! Has started! I don't know why am I using so many exclamation marks! I see the sieves affecting the post preview but I assume the OTT is not affected, right?

ETA: No, of course it's not affected.
Time. The final frontier. These are the voyages of Cueball and Megan. Its continuing mission: to explore strange new worlds, to seek out new life and new civilizations, to boldly go where no one has gone before.

User avatar
ZoomanSP
Posts: 1967
Joined: Sun May 26, 2013 11:23 am UTC
Location: Twelve days north of the Othercomic threads, and a few degrees south of complete insanity. (©yappo)

Re: 1190: "Time"

Postby ZoomanSP » Sun Mar 20, 2016 10:42 pm UTC

BlitzGirl wrote:Baobabs, it's the OTT! Hi again everyone!

Welcome back! Welcome forward! Welcome sideways! :D
Wait on.

Image
Spoiler:
Kieryn wrote:They have a culture involving hat wearing. What kind of a collective would come up with such a thing!?
BlitzGirl wrote:I'll get the razor and finish off Occam while we're at it.
ucim / Megan wrote:"It can do whatever it wants. It's the OTT."


Return to “Individual XKCD Comic Threads”

Who is online

Users browsing this forum: No registered users and 49 guests