У меня получилось вот так (это неправильный вариант, правильный см. ниже):Lavr wrote:PS. И я что-то подзабыл, что за трюк у TMS1000 с РС?
Кажется кто-то упоминал... но вот не помню... да по мануалу там shift-registr as Program Counter.
И есть вот такие упоминания:"I remember the code was split up into 64 byte pages, and used a grey
code counter, so the PC ran 0, 1, 3, 7, F, 1F, 3F, 3E, etc."
#00 #01 #03 #07 #0F #1F #3E #3D #3B #37 #2F #1E #3C #39 #33 #27 #0E #1D #3A #35 #2B #16 #2C #18 #30 #21 #02 #05 #0B #17 #2E #1C #38 #31 #23 #06 #0D #1B #36 #2D #1A #34 #29 #12 #24 #08 #11 #22 #04 #09 #13 #26 #0C #19 #32 #25 #0A #15 #2A #14 #28 #10 #20
Это с помощью LFSR вида x^6 + x^5 + 1:
Code: Select all
#include <stdio.h>
int main()
{
int i,a[64],pc=0;
for(i=0;i<64;i++) a[i]=0;
do
{
a[pc]++;
printf("#%2.2X ",pc);
pc = (((pc&0x20)?1:0)^((pc&0x10)?1:0)^1)|((pc<<1)&0x3E);
} while(pc);
printf("\n\nFREQ:\n");
for(i=0;i<64;i++) printf("[#%2.2X]=%i\n",i,a[i]);
return 0;
}
P.S. Интересно, что такой LFSR обходит по одному разу все ячейки кроме #3F (в которую не заходит вовсе), т.е. факт перепутывания ячеек от разработчика в общем случае можно скрыть, а в его программе команды типа явного перехода на адрес подменять ассемблером во время компиляции

P.P.S. т.е. в программе у чувака написано JMP 5, а ассемблер во время компиляции генерирует код #9F (переход в ячейку с адресом #1F)
P.P.P.S. это был неправильный вариант, а вот правильный:
Code: Select all
[0] #00
[1] #01
[2] #03
[3] #07
[4] #0F
[5] #1F
[6] #3F
[7] #3E
[8] #3D
[9] #3B
[10] #37
[11] #2F
[12] #1E
[13] #3C
[14] #39
[15] #33
[16] #27
[17] #0E
[18] #1D
[19] #3A
[20] #35
[21] #2B
[22] #16
[23] #2C
[24] #18
[25] #30
[26] #21
[27] #02
[28] #05
[29] #0B
[30] #17
[31] #2E
[32] #1C
[33] #38
[34] #31
[35] #23
[36] #06
[37] #0D
[38] #1B
[39] #36
[40] #2D
[41] #1A
[42] #34
[43] #29
[44] #12
[45] #24
[46] #08
[47] #11
[48] #22
[49] #04
[50] #09
[51] #13
[52] #26
[53] #0C
[54] #19
[55] #32
[56] #25
[57] #0A
[58] #15
[59] #2A
[60] #14
[61] #28
[62] #10
[63] #20
Code: Select all
#include <stdio.h>
int main()
{
int i,fb,fc,fd,fe,ff,pc=0;
for(i=0;i<=63;i++)
{
if(((pc&0x1F)|((pc&0x20)?0x00:0x20))==0x3F) fb=0;
else fb=1;
if((pc&0x0F)==0x0F) fc=0;
else fc=1;
fd = ((pc&0x20)?1:0)|((pc&0x10)?1:0);
fe = (fc&((pc&0x20)?1:0)&((pc&0x10)?1:0))?0:1;
ff = fb&fd&fe;
printf("[%i] #%2.2X\n",i,pc);
pc = ((pc<<1)&0x3E)|(ff?0:1);
}
return 0;
}
в отличие от первоначального варианта оно обходит все 64 ячейки (#3F добавился перед #3E)
RASM-таблички уже поправлены в соответствии с новой информацией