Сообщения без ответов | Активные темы Текущее время: 27 апр 2024, 19:52



Ответить на тему  [ Сообщений: 15 ] 
 Эмуляция pipeline в 6502 
Автор Сообщение
Сообщение 16 мар 2013, 20:49
Профиль

Зарегистрирован:
16 мар 2013, 17:53
Сообщения: 11
Как известно, некоторые инструкциии в 6502 "пайплайновые". При эмуляции по машинным циклам - всё красиво, но при попытке эмулировать по инструкциям можем наткнуться на камень - по количеству циклов инструкция завершилась, но последний такт (как правило, решающий) - не завершен. А хотелось бы иметь два режима эмуляции, с "горячим" переключением между ними:
1. Real-time, с потактовым выполнением;
2. Пошаговый, с выполнением по инструкциям;
Что можете посоветовать ?


Сообщение 18 мар 2013, 10:16
Профиль ICQ WWW
Аватара пользователя

Зарегистрирован:
24 июл 2007, 10:41
Сообщения: 570
Это что за инструкции такие ? У 6502 нет очереди команд.


Сообщение 18 мар 2013, 10:30
Профиль

Зарегистрирован:
16 мар 2013, 17:53
Сообщения: 11
LDA immediate - хотя команда и 2-тактовая (исполнение следующей начинается ровно после 2 тактов от начала этой),
в реальности 3ий такт выполняется при T0 следующей команды.
Код:
Execution of the instruction takes place during the fetching and decoding of the next instruction.


Разве путаю что ?


Сообщение 18 мар 2013, 11:50
Профиль ICQ WWW
Аватара пользователя

Зарегистрирован:
24 июл 2007, 10:41
Сообщения: 570
Просто каждый такт 6502 состоит из двух полутактов - PHI1 и PHI2, то есть за 1 такт 6502 делает 2 действия.
Поэтому чтобы точно эмулировать процессор надо выполнять все инструкции полутактами.


Сообщение 18 мар 2013, 12:28
Профиль
Аватара пользователя

Зарегистрирован:
24 июл 2007, 06:54
Сообщения: 492
Откуда: Embedded
Не знаю как у 6502, но у i8080 есть оверлап. Некоторые команды завершают выполнение во время фетча следующего опкода. Вот пример (команды со сноской №9):
Изображение
Изображение
Цитата:
9. The results of these arithmetic, logical or rotate instructions are not moved into the accumulator (A) until state T2 of the next instruction cycle. That is, A is loaded while the next instruction is being fetched; this overlapping of operations allows for faster processing.

Что в вольном переводе означает примерно следующее:
Цитата:
9. Результат этих арифметических, логических или инструкций сдвига не помещается в аккумулятор (А) до такта Т2 следующего цикла инструкции. Так и есть: А загружается во время считывания опкода следующей инструкции, это наложение позволяет реализовать более быструю обработку.

Как видно, этих команд подавляющее большинство.

_________________
Tried so hard and got so far, but in the end, it doesn't even matter...


Сообщение 18 мар 2013, 12:48
Профиль ICQ WWW
Аватара пользователя

Зарегистрирован:
24 июл 2007, 10:41
Сообщения: 570
"Оверлап" у 6502 происходит постоянно, потому что в 1м такте может умещаться Decode предыдущей инструкции и Fetch следующей.
Phi1 - Decode
Phi2 - Fetch
вместо Fetch может быть Read адреса, операндов или других значений.
но это никакой не "пайплайн" :) 2 инструкции за такт тут никак не выполнятся.


Сообщение 22 мар 2013, 20:31
Профиль

Зарегистрирован:
16 мар 2013, 17:53
Сообщения: 11
согласен на "оверлап"....
тогда просьба знатоков пояснить работу PLA -
на вход подается T0..T5 сдвиговым регистром, D0..D7 и PHI1 / PHI2 флип-флопом ?


Сообщение 22 мар 2013, 22:52
Профиль ICQ WWW
Аватара пользователя

Зарегистрирован:
24 июл 2007, 10:41
Сообщения: 570
пока могу только расписать как обрабатывается эта инструкция внутри 6502. по полутактам пока не готов расписать :)

первый такт : выборка кода операции

потом : S/SB, SB/ADD, ADD/ADL, 0/ADH17, ADH/ABH, ADL/ABL - это равносильно следующему:
- поместить регистр S на шину SB
- соединить SB с регистром ADD
- поместить регистр ADD на ADL
эти три шага помещают регистр стека на младшие 8 разрядов шины адреса
- команды ADH/ABH и ADL/ABL помещают внутреннюю шину AD на внешнюю шину адреса CPU
- 0/ADH17 очищает разряды 1-7 старшей половины, в результате итоговый адрес становится 0x01SS (S - регистр стека)
R/W = 1 , то есть читаем по указанному адресу

затем : DL/DB, SB/DB, SB/AC
то есть прочитанные данные с Data Latch помещаются на шину DB, DB соединяется с шиной SB, а шина SB в конце-концов с регистром A.

ну и где-то в промежутке - это инкремент регистра S:
S/SB, SB/DB, 0/ADD, DB/ADD, SUMS, I/ADDC ;
AC/SB, SB/S
то есть в ALU подается регистр S и форсируется флаг переноса, чтобы результат суммы был S + 1.
сумма эта потом помещается на шину SB, а с этой шины назад на регистр S.

опять же - это только предположение как это работает, на самом деле надо изучать схему )


Сообщение 22 мар 2013, 23:41
Профиль

Зарегистрирован:
16 мар 2013, 17:53
Сообщения: 11
спасибо, осилю это - вопросы появятся.....пока немного раскопал PLA, докопаю - буду спрашивать.
PLA имелся ввиду 130х21 logic array ) а не одноименная мнемоника, но не суть важно, в любом случае спасибо.


Сообщение 23 мар 2013, 01:41
Профиль ICQ WWW
Аватара пользователя

Зарегистрирован:
24 июл 2007, 10:41
Сообщения: 570
Ааа )) PLA обычный декодер. на него подается T0 - T5 и код операции (IR) + в инвертированном виде (/IR).
проверяет он примерно так: Если ( IR[0] == 1 && IR[1] == 0 && T0 ) то выходная линия = 1.
На самом деле вместо IR0/1 проверяется сразу комбинация IR0 | IR1, кроме последней линии.
схема тут : http://breaknes.com/files/6502/6502.jpg

там не все транзисторы подписаны, но по полисиликоновым проводам понятно что к чему.

смысл PLA - выбрать нужную группу из таблицы опкодов, ну или в частном случае - один требуемый код операции.
проверяет он это дело по маске вида 0101XX01, где 1 и 0 это понятно, а X - это не имеет значения (0 или 1). если подаваемый код операции на декодер подходит под эту маску, то линия декодера срабатывает. ну и дополнительно проверяется условие T0 - T5, причем не обязательно конкретное значение T (линия может срабатывать на любой такт)


Сообщение 23 мар 2013, 02:01
Профиль

Зарегистрирован:
16 мар 2013, 17:53
Сообщения: 11
это тоже знакомо, а где там полутакт ? это первый вопрос, но еще сам толком линии не глядел.
дальше, гляжу линию CLear Carry

Код:
бит 10 55 66 22 33 44 77 0|1 2345
PLA 01 00 01 01 10 10 01 010 0000

почему 5ый бит не инвертирован ?

-- 23 мар 2013, 11:14 --

ага, попробую сам ответить - там 5 бит маска под лог.AND, сброшен потому, что линия должна срабатывать как для CLC, так и для SEC. Заодно для себя примерно выяснил что за странный такт TX - это тот самый "оверлаповый" такт...Зато появился новый вопрос - что за линии(взял пару для примера):
Цитата:
G02 92: 000000001010000000100 XXX11XXX T3 RIGHT ODD
C13 33: 000000000100000001000 XXXX0XXX T2 LEFT ALL


и еще.... вот пример одной из команд
Код:
Zero Page Addressing (3 cycles)
Tn     Address Bus     Data Bus      R/W     Comments
T0       PC             OP CODE       1      Fetch OP CODE
T1       PC + 1         ADL           1      Fetch Zero Page Effective Address
T2       00, ADL        Data          0      Write internal register to memory
T0       PC + 2         OP CODE       1      Next Instruction

на основе чего процессор выставляет линию R/W ? это "заложенно" в линии ?


Сообщение 23 мар 2013, 14:03
Профиль ICQ WWW
Аватара пользователя

Зарегистрирован:
24 июл 2007, 10:41
Сообщения: 570
линии RIGHT ODD / LEFT ALL это я так их назвал )
если забить XXX11XXX в мой декодер http://breaknes.com/files/6502/decoder.htm
то увидишь что эта линия активна для всех опкодов справа (RIGHT), на четных строках (ODD).
такие линии обычно выполняют роль "excluder" -ов, то есть исключают часть ненужных опкодов.

контакт R/W выставляется рандомной логикой, на основе целого ряда линий декодера. там есть небольшая схема "RW SELECT".
также по время RESET R/W ставится в режим чтения, чтобы не сохранять вектор прерывания в стеке (для RESET это не нужно)

CLC/SEC совмещены, потому что в рандомную логику дополнительно подается IR5, то есть 5й разряд кода операции, который позволяет отличить CLC от SEC при их обработке. то же самое с другими командами установки/сброса флагов.


Сообщение 23 мар 2013, 22:10
Профиль

Зарегистрирован:
16 мар 2013, 17:53
Сообщения: 11
org писал(а):
то увидишь что эта линия активна для всех опкодов справа (RIGHT), на четных строках (ODD).
такие линии обычно выполняют роль "excluder" -ов, то есть исключают часть ненужных опкодов.

а смысл отсекания ? я понимаю выборку по методу адресации к памяти, или исключение "JMP (excluder for C11)", но смысла этих немного не пойму.
видел декодер, полезная штука.


Сообщение 25 мар 2013, 00:38
Профиль ICQ WWW
Аватара пользователя

Зарегистрирован:
24 июл 2007, 10:41
Сообщения: 570
Линии 91 и 92 идут в схему, которая управляет очисткой сдвигового регистра T (счетчик тактов), для длинных инструкций.

92я линия активируется на последнем такте (T3) следующих 4-х тактовых инструкций:
Изображение
Но так как у нас нет возможности сделать такую хитрую маску, поэтому тупо берутся все опкоды по нечетным линиям :)

а 91я линия - это последний такт инструкций вида OP ind, Y (они все выполняются 5 тактов)

Завершение более длинных инструкций проверяется в специальной схеме - ENDX, которая выдает наружу сигнал для сброса T.
И кстати для инструкций, которые выполняются более 6 тактов есть ещё один, встроенный счетчик тактов - T5 и T6, а чтобы декодер разрешил выполнение этих инструкций, в него подается TX, но внутри рандомной логики TX станет либо T5, либо T6.

Когда смотришь на результат декодера нужно игнорировать те инструкции, которые короче указанного количества тактов, то есть например CLC никогда не выполнится во время T3, потому что она 2х-тактовая.


Сообщение 25 мар 2013, 04:23
Профиль

Зарегистрирован:
16 мар 2013, 17:53
Сообщения: 11
ох, вроде и понятно всё, а в то же время сложно для меня это ( попробую всё таки описать микрокодом...не потяну я ПЛА (


Показать сообщения за:  Поле сортировки  
Ответить на тему   [ Сообщений: 15 ] 

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 44


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

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by STSoftware for PTF (mod by Zeru-j).
Русская поддержка phpBB