Форум Эму-Россия
http://forum.emu-russia.net/

Эмуляция pipeline в 6502
http://forum.emu-russia.net/viewtopic.php?f=13&t=4458
Страница 1 из 1

Автор:  Korben [ 16 мар 2013, 20:49 ]
Заголовок сообщения:  Эмуляция pipeline в 6502

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

Автор:  org [ 18 мар 2013, 10:16 ]
Заголовок сообщения:  Re: Эмуляция pipeline в 6502

Это что за инструкции такие ? У 6502 нет очереди команд.

Автор:  Korben [ 18 мар 2013, 10:30 ]
Заголовок сообщения:  Re: Эмуляция pipeline в 6502

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


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

Автор:  org [ 18 мар 2013, 11:50 ]
Заголовок сообщения:  Re: Эмуляция pipeline в 6502

Просто каждый такт 6502 состоит из двух полутактов - PHI1 и PHI2, то есть за 1 такт 6502 делает 2 действия.
Поэтому чтобы точно эмулировать процессор надо выполнять все инструкции полутактами.

Автор:  HardWareMan [ 18 мар 2013, 12:28 ]
Заголовок сообщения:  Re: Эмуляция pipeline в 6502

Не знаю как у 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 следующего цикла инструкции. Так и есть: А загружается во время считывания опкода следующей инструкции, это наложение позволяет реализовать более быструю обработку.

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

Автор:  org [ 18 мар 2013, 12:48 ]
Заголовок сообщения:  Re: Эмуляция pipeline в 6502

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

Автор:  Korben [ 22 мар 2013, 20:31 ]
Заголовок сообщения:  Re: Эмуляция pipeline в 6502

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

Автор:  org [ 22 мар 2013, 22:52 ]
Заголовок сообщения:  Re: Эмуляция pipeline в 6502

пока могу только расписать как обрабатывается эта инструкция внутри 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.

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

Автор:  Korben [ 22 мар 2013, 23:41 ]
Заголовок сообщения:  Re: Эмуляция pipeline в 6502

спасибо, осилю это - вопросы появятся.....пока немного раскопал PLA, докопаю - буду спрашивать.
PLA имелся ввиду 130х21 logic array ) а не одноименная мнемоника, но не суть важно, в любом случае спасибо.

Автор:  org [ 23 мар 2013, 01:41 ]
Заголовок сообщения:  Re: Эмуляция pipeline в 6502

Ааа )) 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 (линия может срабатывать на любой такт)

Автор:  Korben [ 23 мар 2013, 02:01 ]
Заголовок сообщения:  Re: Эмуляция pipeline в 6502

это тоже знакомо, а где там полутакт ? это первый вопрос, но еще сам толком линии не глядел.
дальше, гляжу линию 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 ? это "заложенно" в линии ?

Автор:  org [ 23 мар 2013, 14:03 ]
Заголовок сообщения:  Re: Эмуляция pipeline в 6502

линии 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 при их обработке. то же самое с другими командами установки/сброса флагов.

Автор:  Korben [ 23 мар 2013, 22:10 ]
Заголовок сообщения:  Re: Эмуляция pipeline в 6502

org писал(а):
то увидишь что эта линия активна для всех опкодов справа (RIGHT), на четных строках (ODD).
такие линии обычно выполняют роль "excluder" -ов, то есть исключают часть ненужных опкодов.

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

Автор:  org [ 25 мар 2013, 00:38 ]
Заголовок сообщения:  Re: Эмуляция pipeline в 6502

Линии 91 и 92 идут в схему, которая управляет очисткой сдвигового регистра T (счетчик тактов), для длинных инструкций.

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

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

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

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

Автор:  Korben [ 25 мар 2013, 04:23 ]
Заголовок сообщения:  Re: Эмуляция pipeline в 6502

ох, вроде и понятно всё, а в то же время сложно для меня это ( попробую всё таки описать микрокодом...не потяну я ПЛА (

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/