nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 05:03



Reply to topic  [ 28 posts ]  Go to page 1, 2  Next
TMS1000 shift-регистр РС 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
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:
#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;
}

т.е. это 6-битный сдвиговый регистр, один XOR-гейт и одна инверсия (или 2 XOR-гейта, где второй одной ногой к "1" прицеплен).

P.S. Интересно, что такой LFSR обходит по одному разу все ячейки кроме #3F (в которую не заходит вовсе), т.е. факт перепутывания ячеек от разработчика в общем случае можно скрыть, а в его программе команды типа явного перехода на адрес подменять ассемблером во время компиляции ;)

P.P.S. т.е. в программе у чувака написано JMP 5, а ассемблер во время компиляции генерирует код #9F (переход в ячейку с адресом #1F)

P.P.P.S. это был неправильный вариант, а вот правильный:
Code:
[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:
#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;
}


( алгоритм позаимствован из http://blog.kevtris.org/blogfiles/TMSDIS.BAS )

в отличие от первоначального варианта оно обходит все 64 ячейки (#3F добавился перед #3E)

RASM-таблички уже поправлены в соответствии с новой информацией

_________________
:dj: https://mastodon.social/@Shaos


Last edited by Shaos on 10 May 2013 14:34, edited 6 times in total.



07 May 2013 17:06
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos wrote:
вставил чуть выше картину PLA декодера инструкций из патента про TMS1000 - если они по заказу могли эту PLA по другому программировать, то это вообще круто :roll:

А меня как раз вот эта фича смутила в своё время... :(
Мы ведь не в первый раз про TMS1000 говорим.
Я прочитал когда - у меня её нативная система команд восторга не вызвала...
А уж необходимость (или возможность) PLA программировать - так и вовсе ввергла
в негатив.

Поэтому я к TMS сейчас вернулся, когда увидел, что на ней можно добиться аналогичного
моей задаче результата...


Послушай...ты про РС понятно всё изложил... но ЗАЧЕМ они ТАК его сделали?
Неужели 6-битный сдвиговый регистр, один XOR-гейт и одна инверсия получаются
проще обычного счетчика?

_________________
iLavr


08 May 2013 07:29
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Lavr wrote:
Shaos wrote:
вставил чуть выше картину PLA декодера инструкций из патента про TMS1000 - если они по заказу могли эту PLA по другому программировать, то это вообще круто :roll:

А меня как раз вот эта фича смутила в своё время... :(
....
Послушай...ты про РС понятно всё изложил... но ЗАЧЕМ они ТАК его сделали?
Неужели 6-битный сдвиговый регистр, один XOR-гейт и одна инверсия получаются
проще обычного счетчика?


Как я чуть позже написал у них не просто XOR, а какие-то многоногие AND-гейты понавешаны, чтобы охватить все 64 ячейки - так что может и не проще счётчика...

_________________
:dj: https://mastodon.social/@Shaos


08 May 2013 07:43
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Shaos wrote:
Lavr wrote:
Shaos wrote:
вставил чуть выше картину PLA декодера инструкций из патента про TMS1000 - если они по заказу могли эту PLA по другому программировать, то это вообще круто :roll:

А меня как раз вот эта фича смутила в своё время... :(
....
Послушай...ты про РС понятно всё изложил... но ЗАЧЕМ они ТАК его сделали?
Неужели 6-битный сдвиговый регистр, один XOR-гейт и одна инверсия получаются
проще обычного счетчика?


Как я чуть позже написал у них не просто XOR, а какие-то многоногие AND-гейты понавешаны, чтобы охватить все 64 ячейки - так что может и не проще счётчика...


Читал википедию, много думал...

По сути счётный триггер (T-триггер), это D-триггер с XOR-гейтом (Q'=Q(+)T), соответственно сдвиговый регистр на 6 битов (6 D-триггеров) с одним XOR-гейтом будет легче счётчика из 6 D-триггеров к каждому из которых прилеплен XOR-гейт...

_________________
:dj: https://mastodon.social/@Shaos


08 May 2013 12:33
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Shaos wrote:
Shaos wrote:
Lavr wrote:
Неужели 6-битный сдвиговый регистр, один XOR-гейт и одна инверсия получаются
проще обычного счетчика?

Как я чуть позже написал у них не просто XOR, а какие-то многоногие AND-гейты понавешаны, чтобы охватить все 64 ячейки - так что может и не проще счётчика...

Читал википедию, много думал...

По сути счётный триггер (T-триггер), это D-триггер с XOR-гейтом (Q'=Q(+)T), соответственно сдвиговый регистр на 6 битов (6 D-триггеров) с одним XOR-гейтом будет легче счётчика из 6 D-триггеров к каждому из которых прилеплен XOR-гейт...

Прочитал патент на калькулятор... мелькнула мысль - вот же забавно будет узнать,
что всю эту тень на плетень с РС, TI развели сугубо для патентной чистоты! :lol:

_________________
iLavr


08 May 2013 15:33
Profile
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
Post 
Shaos wrote:
....
Послушай...ты про РС понятно всё изложил... но ЗАЧЕМ они ТАК его сделали?

Это довольно распространённый ( ну по крайней мере в те времена ) схемотехнический приём.

Я когда изучал внутреннее устройство 564ик2 - узнал, что "родная"- Экситоновская ИК2 в части счётчика сделана как раз на основе счётчика джонсона из 5 триггеров, а уж потом идёт кодер пяти линий в три бита адреса ( они из ИМС выходят и подаются далее обычно на двухпортовую память, а пять линий управляют выбором одного из пяти семисегментных индикаторов ). В Воронеже вроде бы по другому её делали - не так, как Экситон нарисовал, но это достоверно не выяснено.


08 May 2013 15:50
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
petrenko wrote:
Shaos wrote:
....
Послушай...ты про РС понятно всё изложил... но ЗАЧЕМ они ТАК его сделали?

Это довольно распространённый ( ну по крайней мере в те времена ) схемотехнический приём.

Ну а почему не поставить просто двоичный счётчик? :o

Shaos wrote:
По сути счётный триггер (T-триггер), это D-триггер с XOR-гейтом (Q'=Q(+)T)

Но мне кажется, что счётный триггер (T-триггер), это D-триггер с обратной связью
с выхода /Q - на D !

Что может быть проще шести таких триггеров (в контексте TMS1000)?
Я даже не знаю...

_________________
iLavr


08 May 2013 16:43
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Lavr wrote:
petrenko wrote:
Shaos wrote:
....
Послушай...ты про РС понятно всё изложил... но ЗАЧЕМ они ТАК его сделали?

Это довольно распространённый ( ну по крайней мере в те времена ) схемотехнический приём.

Ну а почему не поставить просто двоичный счётчик? :o

Shaos wrote:
По сути счётный триггер (T-триггер), это D-триггер с XOR-гейтом (Q'=Q(+)T)

Но мне кажется, что счётный триггер (T-триггер), это D-триггер с обратной связью
с выхода /Q - на D !

Что может быть проще шести таких триггеров (в контексте TMS1000)?
Я даже не знаю...


а вообще да - для счётчика вход T то и ненужен - он всегда "1" и XOR-гейт заменяется на инверсию...

_________________
:dj: https://mastodon.social/@Shaos


08 May 2013 19:08
Profile WWW
Doomed

Joined: 10 Mar 2012 16:21
Posts: 598
Location: РФ
Reply with quote
Post 
Lavr wrote:
...Ну а почему не поставить просто двоичный счётчик? :o
.....
Что может быть проще шести таких триггеров (в контексте TMS1000)?
Я даже не знаю...

Не считаю себя настолько "гуру"( я, не забывайте, всё же самоучка, без образования вообще ), чтобы объяснять гораздо более образованным и опытным людям искусство схемотехники. :wink:
Но причины для такого схемотехнического решения есть и весьма основательные. :idea:
Quote:
:rotate: Подсказка : логику ( в т.ч. ПЛМ, ПМЛ ) иногда не минимизируют "до упора", но напротив - вводят один или несколько "лишних" термов.


09 May 2013 17:32
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
petrenko wrote:
Lavr wrote:
...Ну а почему не поставить просто двоичный счётчик? :o
.....
Что может быть проще шести таких триггеров (в контексте TMS1000)?
...
Но причины для такого схемотехнического решения есть и весьма основательные. :idea:

А ты можешь пояснить написанное белым шрифтом подробнее?
Я, честно говоря, в этом не уловил связи ни с хитрым shift-регистром,
ни с шестью счетными триггерами...

_________________
iLavr


10 May 2013 10:33
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
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:


А это не код ли Грея, действительно, как нам с самого начала и сказали?
Quote:
...used a grey code counter...

_________________
iLavr


10 May 2013 12:09
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
Нет, там вот это было (ты забыл перенести):

Shaos wrote:
P.P.S. Вон чего нагуглил: http://blog.kevtris.org/blogfiles/TMSDIS.BAS


в соответствии с алгоритмом из этой программки получилась такая табличка:

Code:
[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:
#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)

P.S. поправил RASM-таблички в соответствии с новой информацией

_________________
:dj: https://mastodon.social/@Shaos


10 May 2013 12:15
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Я вот тут несколько странный код на С обнаружил...
http://mamedev.org/source/src/emu/cpu/tms0980/tms0980.c.html

Похоже на софтверную эмуляцию TMS-процессора.
Там приводится вот такой алгоритм для РС и адреса:
Code:
  626  /*
  627  The program counter is implemented using PRNG logic and gets incremented as follows:
  628 
  629  00, 01, 03, 07, 0F, 1F, 3F, 3E,
  630  3D, 3B, 37, 2F, 1E, 3C, 39, 33
  631  27, 0E, 1D, 3A, 35, 2B, 16, 2C,
  632  18, 30, 21, 02, 05, 0B, 17, 2E,
  633  1C, 38, 31, 23, 06, 0D, 1B, 36,
  634  2D, 1A, 34, 29, 12, 24, 08, 11,
  635  22, 04, 09, 13, 26, 0C, 19, 32,
  636  25, 0A, 15, 2A, 14, 28, 10, 20
  637 
  638  There is also a strange address (AD) to location (LOC) mapping performed by the
  639  tms1000 family.
  640 
  641  From tms1000 family pdf:
  642  AD          LOC
  643  000 000000  003 000011
  644  001 000001  004 000100
  645  003 000011  00C 001100
  646  007 000111  01C 011100
  647  00F 001111  03C 111100
  648  01F 011111  03F 111111
  649  03F 111111  03E 111110
  650  03E 111110  039 111001
  651  03D 111101  036 110110
  652  03B 111011  02E 101110
  653  037 110111  01E 011110
  654  02F 101111  03D 111101
  655  01E 011110  038 111000
  656  03C 111100  031 110001
  657  039 111001  026 100110
  658  033 110011  00E 001110
  659  027 100111  01D 011101
  660  00E 001110  03B 111011
  661  01D 011101  037 110111
  662  03A 111010  029 101001
  663  035 110101  016 010110
  664  02B 101011  02D 101101
  665  016 010110  018 011000
  666  02C 101100  032 110010
  667  018 011000  020 100000
  668  030 110000  001 000001
  669  021 100001  005 000101
  670  002 000010  00B 001011
  671  005 000101  014 010100
  672  00B 001011  02C 101100
  673  017 010111  01F 011111
  674  02E 101110  03A 111010
  675  01C 011100  030 110000
  676  038 111000  021 100001
  677  031 110001  006 000110
  678  023 100011  00D 001101
  679  006 000110  01B 011011
  680  00D 001101  034 110100
  681  01B 011011  02F 101111
  682  036 110110  019 011001
  683  02D 101101  035 110101
  684  01A 011010  028 101000
  685  034 110100  011 010001
  686  029 101001  025 100101
  687  012 010010  008 001000
  688  024 100100  012 010010
  689  008 001000  023 100011
  690  011 010001  007 000111
  691  022 100010  00A 001010
  692  004 000100  013 010011
  693  009 001001  024 100100
  694  013 010011  00F 001111
  695  026 100110  01A 011010
  696  00C 001100  033 110011
  697  019 011001  027 100111
  698  032 110010  009 001001
  699  025 100101  015 010101
  700  00A 001010  02B 101011
  701  015 010101  017 010111
  702  02A 101010  02A 101010
  703  014 010100  010 010000
  704  028 101000  022 100010
  705  010 010000  000 000000
  706  020 100000  002 000010
  707 
  708  The following formula seems to be used to decode a program counter
  709  into a rom address:
  710  location{5:2} = pc{3:0}
  711  location{1:0} =  ( pc{5:4} == 00 && pc{0} == 0 ) => 11
  712                   ( pc{5:4} == 00 && pc{0} == 1 ) => 00
  713                   ( pc{5:4} == 01 && pc{0} == 0 ) => 00
  714                   ( pc{5:4} == 01 && pc{0} == 1 ) => 11
  715                   ( pc{5:4} == 10 && pc{0} == 0 ) => 10
  716                   ( pc{5:4} == 10 && pc{0} == 1 ) => 01
  717                   ( pc{5:4} == 11 && pc{0} == 0 ) => 01
  718                   ( pc{5:4} == 11 && pc{0} == 1 ) => 10
  719 
  720  */




PS. Это код из некоего эмулятора MAME: stands for Multiple Arcade Machine Emulator.

PPS. http://emu-russia.net/ru/files/emus/mame/

_________________
iLavr


10 May 2013 13:36
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Post 
внутренний маппинг на самом деле неважен - важен именно внешний, на уровне объектного файла, а его то мы как раз и раскусили уже (как я уже писал таблички для RASM правильные)

_________________
:dj: https://mastodon.social/@Shaos


10 May 2013 14:08
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Похоже, что MAME - Multiple Arcade Machine Emulator - это единственный эмулятор,
способный интерпретировать код TMS1000.

Корме него попадается только артефактный TMS1000 CPU Calculator Emulator in Minecraft. :roll:

_________________
iLavr


10 May 2013 14:19
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 28 posts ]  Go to page 1, 2  Next

Who is online

Users browsing this forum: No registered users and 7 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.