Comments 36
Это нормально. Z80 тоже умножать не умеет.
Между ними разницы-то — всего 5 лет. Собсно Z80 это 8080 с доп.банком регистров, как я помню из вики — а 8080 это улучшенная версия 8008. А он в свою очередь — 8-разрядная версия 4004.
Но делить даже некоторые младшие AVR не умеют как помню, хотя с ними я очень слабо знакома.
Собсно Z80 это 8080 с доп.банком регистров
Нет. Z80 просто обратно совместим с 8080. Помимо дополнительного банка регистров есть ещё ~500 дополнительных инструкций.
«Делить» не умеют даже совсем нескромные Itanium-ы
http://www.math.chalmers.se/Math/Grundutb/GU/MMG410/V11/FAQ/divsqrt.pdf
Мне понравилась вот эта его лекция по сабжу www.youtube.com/watch?v=hugZii_eX30
www.nedopc.org/forum/viewtopic.php?t=7790&start=6
www.nedopc.org/forum/viewtopic.php?t=9215
Помню когда впервые эту песенку услышал, и полез в вики, был удивлен что родной Z80 был таки без умножения. Хотя это единственный ассемблер который я таки знал хорошо, а не на уровне написать пару строк в паскале, для ускорения или вызова низкоуровневых вещей.
С эмуляторами тоже забавно недавно было. Знакомый сказал мол 580-й (клон 8080) он видел только в эмуляторе. Я сказал мол живьем видел, но лишь мельком, а на следующий день я нахожу у себя инструкцию по бейсику СМ1800, которая была моей первой машиной (у деда в лаборатории стояла, я собственно на этом бейсике и писал первые строчки кода). Открываю вики и вижу, что это тот самый 580...))
А по сути: оно ещё и работает?
Пыли на самом деле тут не много, это он уже успел сново запылится.
вот тут у меня еще часть железок, если интересно.
fotki.yandex.ru/users/icce/album/155960
Правда не все.
fim p1,$23
fim p2,$35
fim p3,0
fim p4,0
fim p0,$08
repeat
clc
xch r9
ral
xch r9
xch r8
ral
xch r8
xch r7
ral
xch r7
xch r6
ral
xch r6
xch r5
ral
xch r5
xch r4
ral
xch r4
jcn $a,nadd
clc
xch r9
add r3
xch r9
xch r8
add r2
xch r8
jcn $a,nadd
isz r7,nadd
inc r6
nadd
isz r1,repeat
а то получается ужас
Да, ужас и есть — на сайте недавно задачу на минификацию кода э-э-э… вот она преобразовать BCD в HEX выложили — я пока и пробовать не стала. Хотя судя по тому что кто-то в 37 байт запилил — какой-то нюанс в условии, который я не вижу — а если втупую делать у меня кода на три страницы (и то не работает).
Похоже, что в эмуляторе неправильно работает DAA: в инструкции написано, что при C=1 шестёрка прибавляется, а в эмуляторе — не хочет, и получается 9+9=12, а не 18.
Если я правильно понял задачу, то:
repeat
xch r0
dac
xch r0
jcn c1,add1
ldm 9
xch r0
xch r1
dac
xch r1
jcn c1,add1
ldm 9
xch r1
xch r2
dac
xch r2
jcn c1,add1
ldm 9
xch r2
xch r3
dac
xch r3
jcn c0,end
add1
isz r8,repeat
isz r9,repeat
isz r10,repeat
inc r11
jun repeat
end
ldm 9
xch r4
repeat
clc
xch r0
add r4
daa
xch r0
xch r1
add r4
daa
xch r1
xch r2
add r4
daa
xch r2
xch r3
add r4
daa
xch r3
jcn c0,end
isz r8,repeat
isz r9,repeat
isz r10,repeat
inc r11
jun repeat
end
repeat
xch r0
dac
jcn c1,add0
ldm 9
xch r1
dac
jcn c1,add1
ldm 9
xch r2
dac
jcn c1,add2
ldm 9
xch r3
dac
xch r3
jcn c0,end
add2
xch r2
add1
xch r1
add0
xch r0
isz r8,repeat
isz r9,repeat
isz r10,repeat
inc r11
jun repeat
end
Конечно, если r11:r8 изначально нулевые.
А там есть что-нибудь интересное?
Ну просто в статистике по этой задаче можно зависнуть в топе списка назло потомкам. Но в общем на любителя конечно… Я и не пыталась эту сдавать. Но подсматривать в Ваше решение не хочу пока. М.б. прозрение озарит! Тем не менее спасибо — вернусь к нему если отчаюсь!
Спасибо, за статью и нахлынувшие тёплые воспоминания.
Прошу прощения, если это нужно, что пишу под столь старым постом, но тем не менее.
В какой-то момент появилась идея сделать симуляцию работы сначала отдельных математических действий, потом ALU, и мысли дошли до полноценного процессора (и памяти к нему, естессно), спойлер - программы на телефон, даже мощный, не выдерживают одну только попытку реализовать ОЗУ, программы на ПК ещё не искал, не до того было
Не могу назвать себя хорошо разбирающимся в теме создания процессоров, да и программировать на ассемблере не пробовал, опыт только с языками высокого уровня типа C++++ (решетку ставить не даёт) (в основном), Python (в рамках подготовки к ЕГЭ), C++ (в рамках школьного курса в 9 классе)
И хотя, возможно, имеет смысл начинать с 8 битной системы, хотя бы потому, что у неё нет проблем с количеством инструкций, я решил все таки сделать 4-битную
Стандартами не ограничен, примерами, впрочем, не обогащен, поэтому решил делать двухбайтные (1 байт - 4 бита, или их надо называть полубайтами? Далее 4 бита вместе — байт) адреса памяти (т.е. 8 бит на место в памяти, это лучше четырёх). Также спустя много попыток составить список инструкций, которые все посыпались после того, как я узнал о том, что некоторым инструкциям нужны два вида хранения информации - "дальше второй операнд" или "дальше местоположение второго операнда" (я не могу вспомнить правильные названия, извините).
В итоге было принято решение добавить ещё один бит в процессор, чтобы увеличить объем инструкций с шестнадцати до тридцати двух, это дало возможность вместить все, что я хотел и считал необходимым. Основной идеей стала альтернативность действия, поэтому назвал его "бит альтернативы", по-умолчанию, значение у него равно нулю, так же буду называть его дальше. Альтернативность действия подразумевает то, что одна и та же команда в ассемблерной мнемонике будет делать разные действия в зависимости от значения бита альтернативы, это может показаться не круто, а я не знаю, так это или нет.
Хватит воды, вот список инструкций:
Арифметические:
000L_A. ADD - сложение/умножение
001L_A. SUB - вычитание/деление
Логические:
010L_A. AND - логическое И/ИЛИ
0110_A. SHL - сдвиг влево/вправо
0111 (A). JMP - условный переход, если A == 1
100L. - COMP сравнить число из аккумулятора с числом далее (из аккум - А, число далее — В):
0b1000: A > B,
0b0110: A == B,
0b0001: A < B;
Передача данных:
101L. ALT - установить значение альтернативы на младший бит L==0 => числа далее, else L==1 => числа из аккумулятора
110L_A. RD/WRT - чтение/запись из/в памяьи, L для MEM при A=1 и L=1 - установка разрешения на перезапись (есть сомнения)
Ввод/Вывод:
111L_A. IN/OUT - ввод/вывод данных
NN - отсутствие значения, для записи/перезаписи, просто пропуск при компиляции, удобство для разработчика
A - значение альтернативы, L - значение "дальше число или ссылка на него?": либо следующий байт — это значение (0), либо следующие два числа — это ссылка (1)
При записи команды через пробел ставится 0 или 1 — значение L (для тех, где важно)
Операции сложения и вычитания записывают в бит альтернативности единицу, если произошло переполнение или ошибка вычитания
Пример:
00. RD 0
01. 0xA
02. ADD 0
03. 0x5
04. WRT 0
05. 0x0
06. 0xAB
07. ALT 1
08. JMP
09. 0x0
0A. 0x8
0B. NN
0C.
0D.
0E.
0F.
Вроде бы ничего не забыл. Пишу сюда, так как хочу узнать мнение других людей о том, сколь полным получился набор инструкций) операции сравнения и перехода специально не используют альтернативность.
Ассемблер Intel-4004 — для развлечения