PDA

Просмотр полной версии : Компилятор C для MCS-48 ?



13joe
03.01.2015, 14:52
Уважаемые форумчане, подскажите существует ли в природе компилятор языка С для микроконтроллеров 1816ве35/39/48/49 (интелловские 8035/8039/8048/8049) ?

p.s. компиляторы С для MCS-51 не предлагать (насколько я понял, код генерируемый ими не будет работать на MCS-48)

Tronix
03.01.2015, 15:46
Сам искал одно время - нет, нету. Я так думаю, в основном из-за аппаратных ограничений платформы, таких как отсутствие памяти для нормального стека, да и вообще для чего либо. ASM forever \w/

Sergei Frolov
03.01.2015, 17:19
Кстати, а какой лучший АSM для него?

Tronix
03.01.2015, 17:48
Кстати, а какой лучший АSM для него?

Я, когда баловался (http://habrahabr.ru/post/214355/), юзал кросс-платформенный Asm48 (http://sourceforge.net/projects/asm48/). Асм как асм, все просто: ASM48 <имяфайла.asm>

Еще какие-то пробовал, но остальные под DOS, поэтому не очень удобно в DosBox туда-сюда (на программатор) таскать файлы. Остановился на вышеупомянутом.

HardWareMan
28.10.2016, 13:24
Покопаю я тут. Тасм интересней, и, скорее всего, он уже abandonware.

Tronix
28.10.2016, 13:48
Покопаю я тут. Тасм интересней, и, скорее всего, он уже abandonware.

Интересней все-таки Си. Не обязательно компилятор, а хотя-бы транслятор в ASM. Хоть бы и с внешней RAM.

HardWareMan
28.10.2016, 17:55
Tronix, ну я по сравнению с ASM48.

OrionExt
28.10.2016, 21:59
Интересней все-таки Си. Не обязательно компилятор, а хотя-бы транслятор в ASM. Хоть бы и с внешней RAM.

Боюсь спросить, что такое транслятор в Си. И транслятор чего?) в Си, Асм.

wiki: КМ1816ВЕ48 — 8-битный однокристальный микроконтроллер (ОМК), советский аналог ОМК i8748 фирмы Intel. Выпускался с начала 1980-х годов

- - - Добавлено - - -

Такой маразмом (транслятором, компилятором) уж точно никто не будет заниматься. Ну разве что в образовательных целях, как занять студентов), чтобы траву не курили. Хотя под траву – можно такую цель поставить)

shoorick
03.05.2017, 22:53
fasmg (https://board.flatassembler.net/topic.php?t=18398) ;)

Tronix
04.05.2017, 09:56
fasmg (https://board.flatassembler.net/topic.php?t=18398) ;)

Ну, FASM все-таки ассемблер, хоть и богатый конечно на макросы. Но до языка высокого уровня не дотягивает.
С ассемблерами под сабж проблем то нет никаких...

Вообще, по прикидкам, набросать простенький компилятор с Паскаля можно. Например, я когда-то давным давно взял какой-то сорец http://exmortis.narod.ru/comp_src/pp002.zip набросанный по мотивам статьи Let's Build a Compiler, by Jack Crenshaw (http://compilers.iecc.com/crenshaw/) допилил его маленько для кодо-генерации платформы chip-8, а затем и вымышленной chip-16 (https://habrahabr.ru/post/146496/).

Кушал он примерно такие сорцы (рисование мандельброта):

var
xPixels, yPixels, xStart, yStart, Xsize, YSize, maxiter : integer;
xStep, yStep : integer;
ix,iy,x,y,x0,y0,iteration,xtemp : integer;
dist : byte;
temp : byte;
xx,yy : byte;

begin
XPixels := 160;
YPixels := 100;
XStart := $FF9c;
YStart := $FFce;
XSize := 160;
YSize := 100;
MaxIter := 16;

XStep := XSize div XPixels;
YStep := YSize div YPixels;

yy := 20;
For iy := 0 to yPixels do
begin
xx := 0;
For ix := 0 to xPixels do
begin
x := xStart + ix * xStep;
y := yStart + iy * yStep;
x0 := x;
y0 := y;
iteration := 0;
Repeat
xtemp := ((x*x) div 48) - ((y*y) div 48) + x0;
y := 2*((x*y) div 48) + y0;
x := xtemp;
iteration := iteration + 1;
dist := ((x*x) div 48) + ((y*y) div 48);
If iteration = maxiter then dist := 4000;
Until dist > 192;

If iteration <> maxiter then
If iteration > 1 then
begin
temp := ((iteration shl 4) or iteration) shl 8;
temp := temp or ((iteration shl 4) or iteration);
DrawSprite(xx,yy,$0201,^temp);
end;
xx := xx + 2;
end;
yy := yy + 2;
end;
end.

Так что можно попробовать just for fun перенести и на msc48.

Еще одна большая проблема с сабжем - что его нет в Протеусе. Но выход из этого то же есть. Например, есть такая приставка - Magnavox Odyssey² (https://en.wikipedia.org/wiki/Magnavox_Odyssey%C2%B2) , дык в ней в качестве CPU как раз воткнут i8048. Ессно есть эмуляторы с открытым кодом, щаз не помню но вроде какой-то EM2 или как-то так, там 8048 ядро прям выдрать запросто можно, я выдирал безболезненно.

bigral
04.05.2017, 18:38
Тема слегка сдвинулась в пользу трансляторов\компиляторов потому выложу такую довольно древнюю сцылу - http://www.avhohlov.narod.ru/

Для ленивых напишу в кратце что там:
Автор довольно давно возился с идеей "самопальный транслятор без умных книжек" и результатом многолетних экспериментов стал язык программирования склепанный на коленке (context) а также разные версии его компилятора. Сразу скажу что это НЕ какой-то там заброшенный недострой студента первого курса, автор довольно далеко продвинулся (вплоть до публикации статьи в печатном журнале), причем это было уже довольно давно, считаю тему "самопального компилятора" довольно неплохо раскрытой на этом сайте.

И еще одно примечание: тема компиляторов жестко СВЯЗАННА с темами моделей памяти и "linkers and loaders (https://g.co/kgs/2gtdYT)". Связанна то да, но про которую НИГДЕ НИЧЕГО похожего на сайт выше никто не создал и не написал. Такое впечатление что <0.0001% программистов на этой планете эта тема когда-либо интересовала. Кроме того когда хочешь научиться использовать уже ГОТОВЫЕ решения которые скажем создают запускаемые модули с оверлеями под разные системы (rt11, rsx11m, rsx11m+, 2.11bsd, msdos-exe, win16-exe) в самих описаниях к link-овщикам царит хаос покрытый мраком. Никогда не видел ни одного человека который разобрался с этим делом досконально. Подозреваю что самой совершенной схемой обладает rsx11m+.

NEO SPECTRUMAN
04.05.2017, 18:51
Какой еще С????? о_О
у этой шняги мизер памяти
туда моргатель светодиодом написанный на С не поместится
пишите молча на асме

- - - Добавлено - - -


приставка - Magnavox Odyssey²
а еще какие нибудь компьютеры\приставки на этом есть?

Tronix
04.05.2017, 20:04
туда моргатель светодиодом написанный на С не поместится


Да моргатель поместиться без вопросов. Там заморочка что стек маловат, и что основной памяти фактически 32 байт. Но в принципе, в концепцию без-функционного програмного языка укладывается (пишется все в мейне). 32 байт на самом деле не так то и мало. Смотря что делать. Часы например - избыточно памяти. Ну и никто не воспрещает внешнюю поставить с защелками ИР22 и банками, хоть метр, хоть два.

- - - Добавлено - - -

Ваще, всем *****кодерам типа меня, настоятельно рекомендую это: Let's Build a Compiler, by Jack Crenshaw (http://compilers.iecc.com/crenshaw/) 1988 год мать иго таг. Это основы. Я из этой статьи реально почерпнул много нового. Если бы я пилил компилятор с нуля, я бы наступил на овер 9000 граблей, о которых говорит автор. На любом языке современном.

NEO SPECTRUMAN
04.05.2017, 20:07
32 байт на самом деле не так то и мало
это МАЛО
поэтому ТОЛЬКО АСМ!!!

shurik-ua
04.05.2017, 20:11
Попробуйте HDL какой-нибудь ) - после него вам асм будет бейсиком казаться ))

Tronix
04.05.2017, 20:31
это МАЛО
поэтому ТОЛЬКО АСМ!!!

Да почему мало то? Нормально вполне. Смотря какие задачи ставятся. Например, сделать какой-нибудь AT2XT, PS/2-COM mouse переходник - избыточно памяти. Часы/термометр nixie - избыточно памяти. Какие применения? Если нужно больше памяти - ставиться просто на BUS срама на 64 кб и всех делов. Ну да, дополнительный копус, но с другой стороны - кто из мелконогих пиков/атмелов/стм8 щаз может 64кб рама из коробки? Даже больше скажу, не все стм32 могут.

- - - Добавлено - - -


Попробуйте HDL какой-нибудь ) - после него вам асм будет бейсиком казаться ))

Причем здесь HDL? Это немного не в ту степь ваще. Разница только в том, что нужно понимать что работает стейт машина - поэтому для каждого сигнала в один момент времени нужна программа обработки этого сигнала, которая, внезапно, линейна. Просто сигналов много, и программ обработки много. Ничего вырвемозгного по сравнению с обычным линейным програмингом, особенно если есть какой-либо мультитаск, начиная от таймера дос, заканчивая FreeRTOS. И там и там и там программа выполняется _последовательно_, просто в случае с HDL - выполняется множество функций одновременно.

shoorick
04.05.2017, 22:10
можно сделать железячную отладочную машинку: записывать программу в озу, потом подменять ею пзу.
есть железячный отладчик-пошаговик ла3+тм2, который стопорит по АЛЕ: часто знания того, где сейчас гуляет процессор уже достаточно для просветления. можно и схему сравнения для полного адреса сделать для стопора: монстр, зато можно отловить попадание по конкретному адресу!
для 51 я себе сделал такой картонвиль (https://goo.gl/photos/KvgmxKjLGX6bYEmy7) ;) кормится через "пять проводков", но по своему протоколу. несмотря на ИДЕ в вайне под линуксом из-под несудоюзера после небольшого колдовства удобство приемлимое: ктрл+энтер,энтер,пароль, кнопка на картонвиле - и наблюдаем результат ;) дойдут руки: оформлю и поделюсь :) конечно, 48 не 51, но тем не менее...

У меня ЛПТ, поэтому пока не заморачивался, а в принципе, можно сымитировать какой-нибудь проц, чтобы заливать в озу программу через любой стандартный ISP программатор, главное, чтобы проц успевал программно читать и выполнять команды
--------------
насчет мощности - 48 и 51 легко расширяются ;) 100 лет назад разобрал два вроде АОН-а на ВЕ39 вроде как с автоответчиком (в работе не видел): длинный вакуумный индикатор, 27128, 537РУ10 и две линейки РУ7 (наверное, для записи сообщения) - т.е., ресурсы впечатляющие и задача непростая ;)

Tronix
13.05.2017, 18:21
Хе-хе, вот например программка


Var
x,y : byte;
Begin
x := 1;
y := 2;
x := x + y;
End.

Генерируется в тонну *****кода:


;; MSC-48 PASCAL
;; Tronix (c) 2017

.org 0 ; reset vector
dis i
jmp MAIN

.org 3 ; external interrupt vector--trap
retr

.org 7 ; timer interrupt vector
retr
MAIN:
mov a,1 ; load const
mov r0,_X ; store variable
mov @r0,a
mov a,2 ; load const
mov r0,_Y ; store variable
mov @r0,a
mov r0,_X ; load variable
mov a,@r0
mov r2,a ; push to stack
mov r0,_Y ; load variable
mov a,@r0
mov r1,a ; save V0->V1, get V0 from stack
mov a,r2
add a,r1 ; make addiction
mov r0,_X ; store variable
mov @r0,a
_PEND:
jmp _PEND ; end program
; ***** Library Code *****
; ***** Library Ends *****
; Variable Area
.equ _Y 32
.equ _X 33
; String constants

shoorick
15.05.2017, 21:00
надо оптимизировать ;)