|
Страница 1 из 1
|
[ Сообщений: 15 ] |
|
Автор |
Сообщение |
16 мар 2013, 20:49 |
|
Зарегистрирован: 16 мар 2013, 17:53 Сообщения: 11
|
Как известно, некоторые инструкциии в 6502 "пайплайновые". При эмуляции по машинным циклам - всё красиво, но при попытке эмулировать по инструкциям можем наткнуться на камень - по количеству циклов инструкция завершилась, но последний такт (как правило, решающий) - не завершен. А хотелось бы иметь два режима эмуляции, с "горячим" переключением между ними: 1. Real-time, с потактовым выполнением; 2. Пошаговый, с выполнением по инструкциям; Что можете посоветовать ?
|
|
18 мар 2013, 10:16 |
|
Зарегистрирован: 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 |
|
Зарегистрирован: 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 |
|
Зарегистрирован: 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 |
|
Зарегистрирован: 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 |
|
Зарегистрирован: 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 |
|
Зарегистрирован: 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 |
|
Зарегистрирован: 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
|
ох, вроде и понятно всё, а в то же время сложно для меня это ( попробую всё таки описать микрокодом...не потяну я ПЛА (
|
|
|
|
Страница 1 из 1
|
[ Сообщений: 15 ] |
|
Кто сейчас на конференции |
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 44 |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения
|
|