From: Doug Ingraham: Tuesday, September 13, 2016 1:38 PM
This struck me as a pretty clever bit of code.  My first cut used 23 words
including 2 masks and 3 temporaries.

Thanks!!

This is the working version of Vince's original.  It uses 18 words
including 1 mask and 2 temporaries.
I have done some edge testing and it appears to work.

  30              / THIS VERSION BY VINCE SLYNGSTAD
  31 00210  0000  BSWI,   .-.             /ENTRY POINT
  32 00211  3175          DCA SAVEAC
  33 00212  7420          SNL             /REMEMBER LINK STATE
  34 00213  7040          CMA             /AS A -1 FOR ISZ TEST
  35 00214  3176          DCA SAVEL
  36 00215  7100          CLL             /NEED THE LINK CLEARED

Ok, I just don't see why one should need to clear link here.

  37 00216  1175          TAD SAVEAC      /GET 0 XXX XXX YYY YYY
  38 00217  0177          AND C7700       /    0 XXX XXX 000 000

These two lines, the comment would have "L" instead of their first "0".

  39 00220  1175          TAD SAVEAC      /    X XXX XX0 YYY YYY

Poof! There goes the prior value of link! And the "0" in the comment is correct.

  40 00221  7006          RTL             /    X XXX 0YY YYY YXX
  41 00222  7006          RTL             /    X X0Y YYY YYX XXX
  42 00223  7006          RTL             /    0 YYY YYY XXX XXX
  43 00224  2176          ISZ SAVEL       /WAS LINK SET?
  44 00225  7020          CML             /YES, RESTORE LINK
  45 00226  5610          JMP I BSWI      /RETURN
  46              $


As Klemens Krause points out you do need the CLL (line 36) somewhere before
the second TAD SAVEAC or it will flip
what was the original leftmost bit (AC 0).

Someone help me understand this claim.

I have thought about this a bunch and have come up with an improved
version.  It also uses 18 words including 2 constants
two temporaries.  This is one less instruction executed.

  32 00210  0000  BSWI,   .-.             /ENTRY POINT
  33 00211  3174          DCA SAVEAC
  34 00212  7430          SZL             /REMEMBER LINK STATE
  35 00213  1177          TAD C0100       /PRE ROTATE LINK POSITION
  36 00214  3175          DCA SAVEL
  37 00215  7100          CLL             /NEED THE LINK CLEARED
  38 00216  1174          TAD SAVEAC      /GET 0 XXX XXX YYY YYY
  39 00217  0176          AND C7700       /    0 XXX XXX 000 000
  40 00220  1174          TAD SAVEAC      /    X XXX XX0 YYY YYY
  41 00221  1175          TAD SAVEL       /    X XXX XXL YYY YYY
  42 00222  7006          RTL             /    X XXX LYY YYY YXX
  43 00223  7006          RTL             /    X XLY YYY YYX XXX
  44 00224  7006          RTL             /    L YYY YYY XXX XXX
  45 00225  5610          JMP I BSWI      /RETURN

Not bad but I realized even more was possible.

  31 00210  0000  BSWI,   .-.             /ENTRY POINT
  32 00211  3174          DCA SAVEAC
  33 00212  7430          SZL             /REMEMBER LINK STATE
  34 00213  1176          TAD C0100       /PRE ROTATE LINK POSITION
  35 00214  7100          CLL             /NEED THE LINK CLEARED
  36 00215  1174          TAD SAVEAC      /GET 0 XXX XXX YYY YYY
  37 00216  0175          AND C7700       /    0 XXX XXX 000 000
  38 00217  1174          TAD SAVEAC      /    X XXX XX0 YYY YYY
  39 00220  7006          RTL             /    X XXX LYY YYY YXX
  40 00221  7006          RTL             /    X XLY YYY YYX XXX
  41 00222  7006          RTL             /    L YYY YYY XXX XXX
  42 00223  5610          JMP I BSWI      /RETURN

Nice!

Vince

Reply via email to