программа в озу

8-битные микроконтроллеры AVR (AT90, ATtiny, ATmega) от Atmel (в настоящий момент принадлежит Microchip)

Moderator: Shaos

7400
Maniac
Posts: 254
Joined: 14 Jul 2011 02:18
Location: Гомель

Post by 7400 »

думаю если по битам то код гораздо быстрее получится (или кейс ему перебирать 300 значений либо всего лиш несколько битов проверить)

только все команды из 16 в двоичную нужно будет переводить и находить закономерность :cry: (в книге все машинные команды в 16 ричной системе ) но это в ринципе не беда главное до 255 уметь считать
:)

а вот еще вопросик ну допустим команда AND
код команды может быть 24 25 80 81 83 20 21 23 (это 1 байт команды)
а потом адреса приемника и источника идут? где можно найти адреса всех (ну или хотябы основных) регистров?

и еще для справки
получается для нормальной работы придется еще эмулировать сопроцессор и биос?
User avatar
MC68k
Retired
Posts: 1328
Joined: 25 Jul 2011 00:14
Location: WWW

Post by MC68k »

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

да, а что мешает использовать 8080 или что там надо? или хочется ололо атмега? :lol:
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

7400 wrote:а вот еще вопросик ну допустим команда AND
код команды может быть 24 25 80 81 83 20 21 23 (это 1 байт команды)
а потом адреса приемника и источника идут? где можно найти адреса всех (ну или хотябы основных) регистров?

и еще для справки
получается для нормальной работы придется еще эмулировать сопроцессор и биос?
Ты б всё же пояснил, что хочешь сделать? А то мы уже кучу ссылок разных понакидали
и всё дальше и дальше от темы программа в озу. :wink:

...ну допустим для команды AND всё обстоит вот так:

Image

но тебе же Хардыч выложил эти справочники.

А дальше - трудно сказать, что тебе надо "для нормальной работы чего-то",
может статься, что и все порты ввода-вывода... :D

А регистры в кодах процессора имеют свои номера. Для 8080 я их знаю, а для
8086 - не интересовался никогда. Но их можно узнать через тот-же DEBUG.
Заодно и нам расскажешь. Или прочитай вот здесь.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Lavr wrote:
7400 wrote:где можно найти адреса всех (ну или хотябы основных) регистров?
А регистры в кодах процессора имеют свои номера. Для 8080 я их знаю, а для
8086 - не интересовался никогда.
Сугубо из-за тебя и собственного любопытства вот поинтересовался:

Image
7400
Maniac
Posts: 254
Joined: 14 Jul 2011 02:18
Location: Гомель

Post by 7400 »

изначально подумал что можно в озу записывать программы и их выполнять но из-за невозможности этого сделать пришел к выводу что придется писать эмулятор
дак почему же не системы команд 486???)))

там кстати для удобства даже придумал схемку) только нужно найти мк подходящий) кстати микроконтроллер в принципе не решил пока какой либо пик18 либо мегу а можно на пике написать эмулятор меги)))) хотя для меги писать эмулятор пика полегче будет команд поменьше но это так к слову

собственно схемка представляет собой микроконтроллер подключенный к пзу и озу причем пзу можно будет шить через юарт а в памяти мк собственно эмулятор мк а в памяти пзу внешней эмулятор интела + биос + сопроцессор + некая видюха + собственно программа для 486
можно допустим проги писать на турбо си иль подобном
кстати для доса 4 метра оперативы нужно было?))
7400
Maniac
Posts: 254
Joined: 14 Jul 2011 02:18
Location: Гомель

Post by 7400 »

кстати у пик 18 есть режим эмуляции может даже удобнее будет
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

7400 wrote:думаю если по битам то код гораздо быстрее получится (или кейс ему перебирать 300 значений либо всего лиш несколько битов проверить)
Табличный переход решает. Пример для AVR:

Code: Select all

ld   temp1,Y+          ; Читаем байт команды
cpi  temp1,DevCmdCnt   ; Такая команда существует? (номер за пределами таблицы или нет)
brsh ErrorByte         ; Команда не существует - выходим с ошибкой
ldi  ZL,low(ByteCmd)   ; Загрузим младший адрес на таблицу команд
ldi  ZH,high(ByteCmd)  ; Загрузим старший адрес на таблицу команд
clr  temp2             ; Подготовим регистр для переноса
add  ZL,temp1          ;
adc  ZH,temp2          ; Вычислим адрес
lsl  ZL                ; Умножим на 2 (байты вместо слов)
rol  ZH                ;
rol  temp1             ; Бит переноса в temp1
andi temp1,$01         ; Выделим младший бит в старшей странице
out  RAMPZ,temp1       ; Выкинем в поинтер, теперь полный адрес сформирован: RAMPZ:Z
elpm temp1,Z+          ; Берём в переменные по адресу в Z адрес подпрограммы 
elpm temp2,Z           ; По номеру переданному в команде и вычисленному по таблице
movw ZH:ZL,temp2:temp1 ; Копируем в Z взятый адрес из таблицы
ijmp                   ; Вызываем целевую подпрограмму действий
// Таблички меток подпрограмм
.equ DevCmdCnt = 7     ; Всего 7 команд, к примеру
ByteCmd: .dw ByteNOP,ByteMOV,ByteCALL,ByteRET,ByteJMP,ByteOR,ByteAND
Пример для i8080:

Code: Select all

ldax b         ; Считаем байт
mov  l,a       ; В [L]
mvi  h,0       ; [H] = 0
lxi  d,ByteCMD ; Начало таблицы в [DE]
dad  h         ; [HL]*2 (слова)
dad  d         ; [HL]=[HL]+Адрес таблицы
mov  e,m       ; Младший байт в [E]
inx  h         ; Следующий байт
mov  d,m       ; Старший байт в [D]
xchg           ; Обмен [HL] и [DE]
pchl           ; Переход
//
ByteCMD: dw Cmd1,Cmd2,Cmd3...
Или можно так:

Code: Select all

push d
ret
И никаких 300 проверок. Если байт цельный (таблица на весь байт - 256 адресов перехода), то проверку на количество делать сесьно не нужно. Ну и сам алго можно немного твикануть, в зависимости от задачи. Но в общем, думаю идея понятна и она не нова.
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

7400 wrote:изначально подумал что можно в озу записывать программы и их выполнять но из-за невозможности этого сделать пришел к выводу что придется писать эмулятор...
Зря только в курилку топик запрятал. Надо бы где-нибуть в открытых форумах.
Тема парсинга команд интересна многим, как и организация эмуляторов...
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

Lavr wrote:
7400 wrote:изначально подумал что можно в озу записывать программы и их выполнять но из-за невозможности этого сделать пришел к выводу что придется писать эмулятор...
Зря только в курилку топик запрятал. Надо бы где-нибуть в открытых форумах.
Тема парсинга команд интересна многим, как и организация эмуляторов...
перенёс топик в авр
Я тут за главного - если что шлите мыло на me собака shaos точка net
7400
Maniac
Posts: 254
Joined: 14 Jul 2011 02:18
Location: Гомель

Post by 7400 »

мысли вслух)
собственно не имеет смысла писать эмулятор меги для меги который бутед тянуть эмулятор i486 т.к придется писать очень много мутерного кода(но ко внешней озу придется обращатся так сказать влоб а это несовсем удобно)
эмулятор пика рассмотрел как вариант (всеж команд поменьше да и легкие все) но опять же нет привязки ко внешней озу
собственно и решил я написать собственную систему команд для 'среднего' эмулятора у которой будет доступ к озу пзу портам мк а потом уже писать в бойткодах эмулятор i486
тобиж хочу сделать примерно такое
все команды будут состоять из 6 байт не больше и не меньше (в пике16 12 бит пришлось бы проверять четная либо нечетная команда да еще плюс к тому перескакивать на адреса неочень удобно с 12битными словами черт его знает в какой участок кода оно может занести)
на саму команду будет отводится 16 бит и на данные/адрес tot 32 бита
ну ронов думаю взть по
8 однобойтовых
8 2байтовых
8 4байтовых
8 8байтовых
8 16байтовых
8 32байтовых
+
4байта на всякие флаги
а то что останется на адреса перехода(допустим чтобы можно было из call вызвать еще 1 call а потом из него еще 1 call и так пока не надоест :) ) +буферы для прошивки пзушки ну и всякую мелочевку
ну команды которые сразу стоит добавить это наверное
AND OR XOR NOT NAND NOR + - * /
sin cos tan ctg - через ряды с большой степенью погрешности либо по таблице
ну и еще для возведения в степени и всякого такого нужны
exp ln log
ну и еще sqrt(x*x+y*y)
так же операции сдвига ,сравнения, перестановки (для 1 бойтовой - перестановка тетрад , для 2 байтовой - перестановка байтов и так далее до 32байтовых) присвоения(причем если однобайтовой присвоить 2байтовую то в 1 байтовой окажется младший байт 2байтовой) , подпрограммы , переходы , нупы , слипы , ну и собственно 1 из главных задач - доступ к озу
ну и адресация для внешней памяти примерн такая : сначала будут ити примерно 64 кб пзу а потом после этой области будет ити озу

как пример команды приведу несколько команд
0000000000000000 00000000000000000000000000000000- нуп)
0000000000000001 00000000000000000000000000000000 - допустим в 32 битный регистр А32 назовем его так) занести значение 00000000000000000000000000000000
0000000000000010 0000000000000000dddddddddddddddd - выгрузить регистр A32 в озу по адресу dddddddddddddddd
ну и таких команд можно напридумывать 65 536 но думаю можно будет обойтись и 256 и уменьшить общую команду на 1 байт
какие команды еще необходимо добавить к вышеописанным или их хватит для описания тогоже i486?
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

7400 wrote:...какие команды еще необходимо добавить к вышеописанным или их хватит для описания тогоже i486?
А для меги не через край эмулировать i486 ?
Что-то мне подсказывает, что там и регистры "шире", чем я тебе на картинке привёл...
И других проблем наличие подозреваю.
Дело, конечно, хозяйское... только на мой взгляд, 8086 - это ещё куда ни шло,
хотя тоже не мёд... но вот i486... :-?
User avatar
MC68k
Retired
Posts: 1328
Joined: 25 Jul 2011 00:14
Location: WWW

Post by MC68k »

Lavr wrote:
7400 wrote:...какие команды еще необходимо добавить к вышеописанным или их хватит для описания тогоже i486?
А для меги не через край эмулировать i486 ?
Что-то мне подсказывает, что там и регистры "шире", чем я тебе на картинке привёл...
И других проблем наличие подозреваю.
Дело, конечно, хозяйское... только на мой взгляд, 8086 - это ещё куда ни шло,
хотя тоже не мёд... но вот i486... :-?
там еще защищенный режим и прочие плюшки.
вам что железа мало? эту энергию да в мирное русло, вот был бы профит
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Только, моя не понимать, зачем нам нужен онанизм (т.е. эмулятор), когда есть девки, (т.е. 486)?
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Post by Shaos »

HardWareMan wrote:
Lavr wrote:Ну тогда сам ищи в Инете электронный справочник TECH Help.
В течхелпе мало асма. Нужен Хелппц. Энивей, доставлено!
А чего там стока EXE-шников внутри? :roll:
Можно я это снесу от греха подальше?...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
HardWareMan
Banned
Posts: 2139
Joined: 20 Mar 2005 13:41
Location: От туда

Post by HardWareMan »

Shaos wrote:А чего там стока EXE-шников внутри? :roll:
Можно я это снесу от греха подальше?...
На каждый хелп по конфигуратору же. А че сносить то, платное чтоли?!