Важная информация

User Tag List

Страница 141 из 271 ПерваяПервая ... 137138139140141142143144145 ... ПоследняяПоследняя
Показано с 1,401 по 1,410 из 2702

Тема: Цифровая археология: 1801 и все-все-все

  1. #1401
    Guru Аватар для Vslav
    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    755
    Поблагодарили
    353 сообщений
    Mentioned
    86 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от gid Посмотреть сообщение
    Там почти для всех опкодов, если шесть младших битов == 000111 (число 7), то бит plx[20] == 0 - эта ситуация прослеживается почти в каждом микроадресе, нету в обработке mark, trap, emt и опкодов меньше 7. Как будто, специально отлавливается, но зачем-то распространена на весь микрокод.
    Пока за весь микрокод не скажу, но почти все одноадресные инструкции начинаются так (пример для TST):
    Код:
    if (dd address mode == 0)
      01: A = PC
         IR preload start, word read start
         if (dd register == PC)
            01: R12 = PC + 2
            31: MCIR = 1012
            49: PC = PC & 1777778, assign NZVC
            11: next instruction
         else
            01: PC = PC + 2
            31: MCIR = 1012
            49: Rd = Rd & 1777778, assign NZVC,
                MCIR poll, wait read
            01: next instruction
    else
    Ветвление по address mode сделано совсем ранним, на первом же микроадресе цепочки декодирования, таким образом выделяется отдельная ветка регистровых операций, что позволяет минимизировать число тактов исполнения и ускорить инструкции (уменьшить занимаемое ими число тактов). Причем тут же в первом цикле всегда запускается предвыборка по (PC)+ следующей инструкции. Но на адресе 01 PC уже имеет значение ".+2", если его позволить модифицировать, то инструкции типа ASL PC будут уже работать за значением ".+4". Поэтому если аргумент 0001112, то PC пока не меняем, выполняем саму операцию а потом (на адресе 11) запустим получение следующей инструкции уже по новому значению PC (результату операции). Прикол в том что TST работает по это же ветке, и TST PC будет извлекать следующую инструкцию дважды - получаем фантомный цикл.

  2. #1402
    Guru Аватар для Vslav
    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    755
    Поблагодарили
    353 сообщений
    Mentioned
    86 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    С MTPS все понятно, никаких сюрпризов - изменяет только младший байт PSW, бит T сохраняет свое значение, при регистровой адресации любого регистра (не только PC) следует фантомный цикл чтения следующей инструкции.
    Код:
    if (dd address mode == 0)
      01: A = PC, IR preload start,
          word read start, R12 = PC + 2
      50: Rd = Rd & ~0000208, Q = Rd
      37: PSW[7:0] = PSW[7:0] & 0000208
      36: PSW[7:0] = PSW[7:0] | Q
      11: next instruction
    else
      01: MCIR = 1012
      switch (dd address mode)
        case 0: Rd
          45: user exception (0000108)
        case 1: @Rd
          45: A = Rd, R12 = Rd, byte read start
        case 2: (Rd)+
          45: A = Rd, Rd = Rd + 1, word read start
          55: R12 = Rd – 1
        case 3: @(Rd)+
          45: A = Rd, word read start, Rd = Rd + 2
          4D: wait read, R12 = Q,
              A = Q, word read start
        case 4: -(Rd)
          45: Rd = Rd – 1, A = Rd, byte read start
          55: R12 = Rd
        case 5: @-(Rd)
          45: Rd = Rd – 2, A = Rd, word read start
          4D: wait read, R12 = Q
              A = Q, word read start
        case 6: E(Rd)
          45: A = PC, word read start, PC = PC + 2
          4C: wait read, R12 = Rd + Q,
              A = R12, byte read start
        case 7: @E(Rd)
          45: A = PC, word read start, PC = PC + 2
          4C: wait read, R12 = Rd + Q, A = R12
              word read start
          4D: wait read, R12 = Q,
            A = Rd, byte read start
      48: wait read, Q = Q & ~0000208
      37: PSW[7:0] = PSW[7:0] & 0000208
      36: PSW[7:0] = PSW[7:0] | Q
      11: next instruction
    - - - Добавлено - - -

    MFPS интереснее. Трактуется как байтовая, если приемником является регистр то выполняем знаковое расширение в старший байт регистра аналогично MOVB. Изменяет флаги NZ, V=0. В приемник копируется значение до изменения. Бит T копирует честно.
    Последний раз редактировалось Vslav; 15.06.2018 в 23:38.

  3. #1403
    Guru
    Регистрация
    02.03.2015
    Адрес
    г. Караганда, Казахстан
    Сообщений
    2,321
    Спасибо Благодарностей отдано 
    35
    Спасибо Благодарностей получено 
    225
    Поблагодарили
    177 сообщений
    Mentioned
    17 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Vslav Посмотреть сообщение
    Изменяет флаги NZ, V=0
    По идее должно быть и С=0. Так?
    Кто мешает тебе выдумать порох непромокаемый? (К.Прутков, мысль № 133)

  4. #1404
    Guru Аватар для Vslav
    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    755
    Поблагодарили
    353 сообщений
    Mentioned
    86 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от AFZ Посмотреть сообщение
    По идее должно быть и С=0. Так?
    Не видно там строба флага C. Не изменяется он, как и в инструкции MOV(B).

    MTPS и MFPS обе байтовые. MTPS (R0)+ и MFPS (R0)+ обе изменят R0 на 1.

    - - - Добавлено - - -

    А инструкция MOV Rs, Rd исполняется 8 тактов - на быстрой шине с максимально быстрым RPLY. Могло бы и быстрее, только долго логика арбитража/захвата шины чешется. Вот так не особо нужная фича многопроцессорности тормозит жизнь изделию в одноядерной конфигурации. Так что - быстродействие ВМ1 на 5МГц 625К операций в секунду, 8 тактов на регистр-регистр.

  5. #1405
    Master
    Регистрация
    19.04.2013
    Адрес
    г. Чебоксары
    Сообщений
    542
    Спасибо Благодарностей отдано 
    14
    Спасибо Благодарностей получено 
    136
    Поблагодарили
    105 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Vslav, пока я восстанавливал недостающие структуры для mcode.c возникла пара вопросов. Нет ли там опечаток?
    В функции static DWORD mc_plm32_vm1(DWORD src)
    Код:
    	for (p = plm + MCODE_P_MIN; p < (plm + MCODE_P_MAX); p++)
    	{
    		if (((src ^ p->pmask) & p->xmask) == 0) r |= p->s32dw[0];
    	}
    есть некая s32dw[0], которая больше нигде не используется.
    А в функции static ULONGLONG mc_plm64_vm1(DWORD src), выше, вместо s32dw[0] используется smask.

    В функции void ma_stat(DWORD ma, DWORD na, DWORD mask, DWORD value)
    со строки 2192 есть такое:
    Код:
    if (qstby)
    {
    	ps->qstba.count++;
    	ps->qstba.zero |= src;
    	ps->qstba.one |= ~src;
    }
    не должно ли там быть ps->qstby для более корректной статистики?

    - - - Добавлено - - -

    А что за макрос INPLX?

  6. #1406
    Guru Аватар для Vslav
    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    755
    Поблагодарили
    353 сообщений
    Mentioned
    86 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от gid Посмотреть сообщение
    Vslav, пока я восстанавливал недостающие структуры для mcode.c возникла пара вопросов. Нет ли там опечаток?
    ...
    есть некая s32dw[0], которая больше нигде не используется.
    Это юнион.
    Да тут все свои, не надо стесняться, а просто напомнить забывчивому мне выложить недостающий mcode.h
    mcode.h
    mcode.c

    Цитата Сообщение от gid Посмотреть сообщение
    Код:
    if (qstby)
    {
    	ps->qstba.count++;
    	ps->qstba.zero |= src;
    	ps->qstba.one |= ~src;
    }
    не должно ли там быть ps->qstby для более корректной статистики?
    Да, это косяк, спасибо, поправлю.
    Последний раз редактировалось Vslav; 16.06.2018 в 13:23.

  7. #1407
    Guru Аватар для Vslav
    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    755
    Поблагодарили
    353 сообщений
    Mentioned
    86 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Полностью микропрограмму 1801ВМ1Г разбирать не буду, разобрал и описал только умножение:
    Код:
    01: MCIR = 1012
    if (ss address mode == 0)
      7A: R11 = Rr
      40: R12 = Rs
    else
      switch(ss address mode)
        case 0: Rs
          45: A = R12 = Rs, word read start
          58: stop microcode (error)
        case 1:     @RS
          45: A = Rs, R12 = Rs, word read start
        case 2: (Rd)+
          45: A = Rs, Rs = Rs + 2, word read start
          55: R12 = Rs – 2
        case 3: @(Rs)+
          45: A = Rs, word read start, Rs = Rs + 2
          4C: wait read, R12 = Q,
              A = Q, word read start
        case 4: -(Rs)
          45: Rs = Rs – 2, A = Rs, word read start
          55: R12 = Rs
        case 5: @-(Rs)
          45: Rs = Rs – 2, A = Rs, word read start
          4C: wait read, R12 = Q
              A = Q, word read start
        case 6: E(Rs)
          45: A = PC, word read start, PC = PC + 2
          44: wait read, R12 = Rs + Q,
              A = R12, word read start
        case 7: @E(Rs)
          45: A = PC, word read start, PC = PC + 2
          44: wait read, R12 = Rs + Q, A = R12
              word read start
          4C: wait read, R12 = Q,
            A = Q, word read start
      48: wait read, R12 = Q
    //
    // Аргументы получены в R11 и R12, можно выполнять умножение
    //
    // R11 – первый аргумент, R12 – второй
    // R8 – старшие 16 бит произведения, R9 – младшие 
    32: R8 = 0
    25: R10 = R11
    6E: R9 = 1000008
    74: FR C = R11[0], R11 = R11 >> 1
    if (FR C)
      69: R8 = R8 + R12, assign NZVC
      6B: if (V) R8 = ROR(R8) else R8 = ASR(R8), assign NZVC
    else
      69: R8 = ASR(R8), assign NZVC
    77: R9 = ROR(R9)
    if (FR C == 0)
      75: FR C = R11[0], R11 = R11 >> 1
      69: next cycle
    else
      75: R10 = R10, set FR N
    if (FR N)
      76: R8 = R8 – R12
    else MCIR = 1102
    07: Rr = R8
    06: R[r | 1] = R9
    if (FR N==0 && FR Z==0)
      7C: PSW |= 0000018
      11: next instruction
    else
      if (FR N==1)
        7C: R12 = R8 - 1777778
        if (FR Z==0)
          7E: PSW |= 0000018
          11: next instruction
        else
          7E: R9 = R9
          7D: PSW |= N ? 0000008 : 0000018
          11: next instruction
      else
        7C: R9 = R9
        if (FR N==0 && FR Z==0)
          7F: R12 = 0000018, set NZVC
          11: next instruction
        else
          if (FR N==0)
            7F: PSW |= 0000008
            11: next instruction
          else
            7F: PSW ^= 0000018, set NZVC
            11: next instruction
    Заодно пришлось разбираться с кодированием операции сдвигателя на выходе АЛУ.
    Видно что длительность умножения варьируется, зависит от числа единичных битов в первом аргументе (каждый единичный бит добавляет два такта). С флагами на выходе вообще мрак творится, непонятно как они отрабатываются. Знаковое умножение - зло

    - - - Добавлено - - -

    Документация на 1801ВМ1 закончена (возможно позже добавлю небольшие подробности по захвату-освобождению шины, когда спаяю двухпроцессорный модуль и сниму реальные диаграммы). Вопросы, замечания, исправления и дополнения всячески приветствуются. Из версии документа убрано слово "предварительный". Версия теперь будет обновляться по дате.

    Однокристальный микропроцессор К1801ВМ1. Техническое описание.
    Последний раз редактировалось Vslav; 01.02.2019 в 17:51.

  8. #1408
    Master
    Регистрация
    19.04.2013
    Адрес
    г. Чебоксары
    Сообщений
    542
    Спасибо Благодарностей отдано 
    14
    Спасибо Благодарностей получено 
    136
    Поблагодарили
    105 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот жеж, а я только разбираюсь в коде mcode. И оказалось, что всё гораздо сложнее, чем я себе представлял.
    И вот такой момент мне непонятен, насчёт битов 28..25.
    в строке 2263 мы получаем значение Y:
    Код:
    tmp = ((plm & (1<<25)) ? 0 : 8)
    	| ((plm & (1<<26)) ? 0 : 4)
    	| ((plm & (1<<27)) ? 0 : 2)
    	| ((plm & (1<<28)) ? 0 : 1);
    оно как и положено, инвертировано и биты задом-наперёд, и обозначает номер регистра на шине Y (предположительно).
    А потом в строке 2272 берём эти же биты уже как есть
    Код:
    tmp = (plm >> 25) & 0x0F;
    и оперируем этим значением, если на шине Y - вектор или константа.

    Т.е. получается, что эти биты надо одновременно рассматривать как инвертированные и реверсные и как обычные прямые, в зависимости от комбинации битов 14,13,11? Или тут ошибка?

  9. #1409
    Guru Аватар для Vslav
    Регистрация
    31.03.2013
    Адрес
    г. Киев
    Сообщений
    2,413
    Спасибо Благодарностей отдано 
    132
    Спасибо Благодарностей получено 
    755
    Поблагодарили
    353 сообщений
    Mentioned
    86 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от gid Посмотреть сообщение
    Т.е. получается, что эти биты надо одновременно рассматривать как инвертированные и реверсные и как обычные прямые, в зависимости от комбинации битов 14,13,11? Или тут ошибка?
    Если у нас обращение к регистру в блоке РОН, то инвертируем и реверсируем порядок бит - тогда вычисленное в результате значение индекса совпадает с индексом регистра в процессорной инструкции. А если у нас константа или вектор - тогда не реверсируем и не переставляем. Я подумаю как этот момент отразить в доке, там в описании битов 13-14-16-17 табличка есть, внесу и туда уточнение.

  10. #1410
    Master
    Регистрация
    19.04.2013
    Адрес
    г. Чебоксары
    Сообщений
    542
    Спасибо Благодарностей отдано 
    14
    Спасибо Благодарностей получено 
    136
    Поблагодарили
    105 сообщений
    Mentioned
    8 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я полагал, что если (((plm & (1<<13)) && !(plm & (1<<14))) || (plm & (1<<11))), то значение константы или вектора задаётся значением VSEL из специального управляющего вектора, или из матрицы прерываний, а в коде программы - значение битов [28:25] используется одновременно и как номер константы/вектора, и как признак константы/вектора

    - - - Добавлено - - -

    Ещё не хватает таблицы для PLOP.
    А ещё вот это вот:
    Код:
    assign au_is0  = ~(plr[13] & plr[14] & plr[25] & plr[26] & ~plr[27]);
    assign au_is1  =  (plr[13] & plr[14] & plr[25] & plr[26] & ~plr[27]);
    always @(posedge pin_clk_n)
    begin
       if (au_is0)
          xreg[15:0] <= x[15:0];
       else
          if (au_is1)
             xreg[15:0] <= {x[7:0], x[15:8]};
       yreg <= y;
    end
    Если биты 13 и 14 оба 1 и на шине Y [x011], то на шине Х переставляются байты местами.
    Последний раз редактировалось gid; 17.06.2018 в 18:56.

Страница 141 из 271 ПерваяПервая ... 137138139140141142143144145 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 7
    Последнее: 28.06.2014, 17:50
  2. Микросхемы МПК 580,1801,1810 и другие...
    от Alex_Vac в разделе Барахолка (архив)
    Ответов: 44
    Последнее: 07.04.2012, 08:03
  3. ЦИФРОВАЯ МУЗЫКА НА ZX
    от AAA в разделе Музыка
    Ответов: 98
    Последнее: 18.09.2011, 22:33
  4. Учебный стенд УМПК-1801
    от dk_spb в разделе ДВК, УКНЦ
    Ответов: 2
    Последнее: 12.05.2010, 16:52
  5. Цифровая музыка от Вадима Ермеева
    от zxmike в разделе Музыка
    Ответов: 2
    Последнее: 06.08.2007, 23:13

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •