Pull to refresh

Comments 36

> Этот дедушка не умеет не то что делить — даже умножать.

Это нормально. Z80 тоже умножать не умеет.
Это точно :)

Между ними разницы-то — всего 5 лет. Собсно Z80 это 8080 с доп.банком регистров, как я помню из вики — а 8080 это улучшенная версия 8008. А он в свою очередь — 8-разрядная версия 4004.

Но делить даже некоторые младшие AVR не умеют как помню, хотя с ними я очень слабо знакома.
Делить AVR вообще все поголовно не умеют, а младшие (и старые) еще и умножать не умеют. А вот любой дедушка семейства MCS51 умеет и делить, и умножать.
Вы правы! Спасибо! Ну я честно сказала что слаба знакома :)
А вот у прадедушки 8048 MSC48 нет даже команды вычитания, что поначалу впечатляет.
Ну это-то мелочи, т.к. вычитание зачастую это то же сложение. Я вот час назад разглядывая инструкцию к AVR (разбираясь с комментом выше) обнаружила что есть инструкция SUBI но нет ADDI — т.е. вычесть непосредственное значение можно а прибавить нельзя (что конечно не мешает вычесть отрицательное значение).
mc51 — вообще отличный выбор для начинающего.
Собсно Z80 это 8080 с доп.банком регистров


Нет. Z80 просто обратно совместим с 8080. Помимо дополнительного банка регистров есть ещё ~500 дополнительных инструкций.

«Делить» не умеют даже совсем нескромные Itanium-ы
http://www.math.chalmers.se/Math/Grundutb/GU/MMG410/V11/FAQ/divsqrt.pdf
История создания Zilog и Z80

http://archive.computerhistory.org/resources/text/Oral_History/Zilog_Z80/102658073.05.01.pdf
Умножают, не умножают…

Помню когда впервые эту песенку услышал, и полез в вики, был удивлен что родной Z80 был таки без умножения. Хотя это единственный ассемблер который я таки знал хорошо, а не на уровне написать пару строк в паскале, для ускорения или вызова низкоуровневых вещей.

С эмуляторами тоже забавно недавно было. Знакомый сказал мол 580-й (клон 8080) он видел только в эмуляторе. Я сказал мол живьем видел, но лишь мельком, а на следующий день я нахожу у себя инструкцию по бейсику СМ1800, которая была моей первой машиной (у деда в лаборатории стояла, я собственно на этом бейсике и писал первые строчки кода). Открываю вики и вижу, что это тот самый 580...))
У меня не то, что клон. У меня оригинал работает стоит :) На голове появляется седина.

AMD 8088-1



8088


У меня Intel 386 работал — я его полюбил за то что это реально был прорыв в то, без чего сейчас жизнь невозможна — многозадачные многопользовательские ОС.
Вы не поверите!!!

80386



Вообще у меня много чего есть :)
Если не ошибаюсь — просто 8086 с узенькой шиной данных?

С программной точки зрения это ж почти никак не проявляется?
8086 — 16 битный процессор.
8088 — 8 битный.

Вообще надо будет как нить накатать статью про 80xx и вообще историю.
Перечитал и ужаснулся. Имел в виду разрядность шины данных.
Пыль… Пожалейте его!

А по сути: оно ещё и работает?
Да он вполне себе работает.
Пыли на самом деле тут не много, это он уже успел сново запылится.

вот тут у меня еще часть железок, если интересно.

fotki.yandex.ru/users/icce/album/155960

Правда не все.
В «Спектрумах» в РОМе был «язык калькулятора», кажется так назывался. АПИ для математики.
Забавная игрушка. Но для работы её, похоже, надо серьёзно изучать, а то получается ужас.

Умножение 8*8 => 16 бит. 41 байт, не больше 280 тактов
	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 байт запилил — какой-то нюанс в условии, который я не вижу — а если втупую делать у меня кода на три страницы (и то не работает).
С битом «C» при вычитании, конечно, засада. Логичнее, если он устанавливается в 1 при «переполнении», а не наоборот.
Похоже, что в эмуляторе неправильно работает DAA: в инструкции написано, что при C=1 шестёрка прибавляется, а в эмуляторе — не хочет, и получается 9+9=12, а не 18.
Если я правильно понял задачу, то:
35 байт, которые работают в эмуляторе
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



30 байт, которые не работают (но, вроде бы, должны)
	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


32 байта :)
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 изначально нулевые.
М-м-м, по хорошему их не имеет смысла сюда постить — можно ж прям там засабмитить попытаться. А то секрет украдут :D
Действительно. Но убирать уже поздно.
А там есть что-нибудь интересное?
Там? Пряников и денег вроде не раздают :)

Ну просто в статистике по этой задаче можно зависнуть в топе списка назло потомкам. Но в общем на любителя конечно… Я и не пыталась эту сдавать. Но подсматривать в Ваше решение не хочу пока. М.б. прозрение озарит! Тем не менее спасибо — вернусь к нему если отчаюсь!
Забавная вещь, в своё время по 8080 в институтские годы нас сильно гоняли. Были стенды с самим процессором и периферией и ручным набор машинных кодов на цифровой клавиатуре. Сами написали под него компилятор, чтобы всё время по табличке не переводить, но вводить в любом случае вручную приходилось.

Спасибо, за статью и нахлынувшие тёплые воспоминания.
Отсутствие умножения не значит невозможности создать сложную систему. У меня z80 решал систему нелинейных дифференциальных уравнений второго порядка (числа, естественно, были с плавающей запятой). Правда, очень медленно.
Ну с учетом того, что умножение — это краткая запись сложения, то действительно ничего удивительного.
Да умножение-то дело нехитрое, я смутно припоминаю что умножение последовательным удвоением еще древние вавилоняне умели (т.к. они считали в 60-ричной системе и таблицы умножения запоминать было нереально).

Деление обычно самое нудное…

Прошу прощения, если это нужно, что пишу под столь старым постом, но тем не менее.

В какой-то момент появилась идея сделать симуляцию работы сначала отдельных математических действий, потом 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.

Вроде бы ничего не забыл. Пишу сюда, так как хочу узнать мнение других людей о том, сколь полным получился набор инструкций) операции сравнения и перехода специально не используют альтернативность.

Ну я и написал текста...

Sign up to leave a comment.

Articles