PDA

Просмотр полной версии : ASAM Compiler By Rob F. / Entire Group ...



Robus
07.03.2005, 19:59
Я тут так подумал ... Вижу, что люди заинтересовались моим компилятором !!!

Надеюсь на вашу помощь, в нахождениее недочётов и ваши пожелания. Сейчас там много всяких возможностей, если что, готов рассмотреть и ваши предложения !!!

Кратко:
- Есть макросы
- Сохранение в TRD и TAP
- Создание готовых лоадеров с любым кодом внутри
- Возможность запустить во внутреннем эмуляторе только что скомпилированную программу и её данные использовать при дальнейшей компиляции
- Понятно, что есть INCLUDE, количестко которых соизмеряется памятью в вашем ПиЦи
- Можно загружать файлы прямо из TRD или TAP'ов
- Можно "не отходя от кассы" запаковать то, что откомпилировали
- Конечно же есть поддержка страниц, вам хватит 64 ???
- Сохранение в извращённом формате HEX созданный Intel'ом, так поставляются прошивки ПЗУ
- Виртуальная адресация
- Прямое копирование кусков памяти
- И что-то там ещё, я уже забываю ...

Вот на него ссылка http://www.entire.nm.ru/coding/asam.zip

Вообще-то, у меня есть ещё и эмулятор, только он ДОСовский, но эмулирует с точностью до пикселя на бордюре, плюс комманды которые не эмулируют другие эмули ... =)

breeze
08.03.2005, 00:40
иии ... э ... И большая беда в разнице один день, всё же я то же живой человк, дела, семья, работа и другое ... Кроме всего этого нужно было скомпилировать свой эмулятор, а в последний раз я его видел примерно в 1999-ом году, когда начал делать Wild Speccy ...

сорри! никто не собирался требовать :rolleyes:


Это последняя версия, в которой работает HEX на любой вкус !!! Надеюсь вы не потребуете от меня заменять команду повторений на DUP, поскольку у меня это делается точкой, вместо DUP, так и быстрее и удобнее и приятнее смотрится !!!

Блин! а если очень сильно попросить ? знаешь как сложно беребахивать проект с alasm'а , когда куча модулей и везде нужно менять...
кста если у тебя всё-таки дайдут руки добавь plz еще туда
разварот конструкции push hl,de,bc,af и pop af,bc,de,hl я имею ввиду раздельную конструкцию а не всё сразу.
большего я думаю не потребуется :)

заранее big snx! :rolleyes:

Robus
08.03.2005, 01:38
сорри! никто не собирался требовать :rolleyes:



Блин! а если очень сильно попросить ? знаешь как сложно беребахивать проект с alasm'а , когда куча модулей и везде нужно менять...
кста если у тебя всё-таки дайдут руки добавь plz еще туда
разварот конструкции push hl,de,bc,af и pop af,bc,de,hl я имею ввиду раздельную конструкцию а не всё сразу.
большего я думаю не потребуется :)

заранее big snx! :rolleyes:

Ну ... Можно и DUP добавить ... Хотя, если честно, то такой код очень плохо читается, слишком много текста превращается в кашу на экране ... А вот по поводу pop af,bc,de ... Это и так есть, только вместо запятой просто через пробел ... Но, я сейчас сделаю и такое ... Заодно и DUP сделаю, хотя это изврат ... Только я не понял, что за разворот ??? Ты имеешь в виду что:

pop hl,de,bc,af
Будет выглядеть как
pop af
pop bc
pop de
pop hl
????

Но ведь это же просто дикость !!! Мне-то не сложно это сделать, но это нарушение всех норм программиования под асмо !!!

Robus
08.03.2005, 01:48
сорри! никто не собирался требовать :rolleyes:



Блин! а если очень сильно попросить ? знаешь как сложно беребахивать проект с alasm'а , когда куча модулей и везде нужно менять...
кста если у тебя всё-таки дайдут руки добавь plz еще туда
разварот конструкции push hl,de,bc,af и pop af,bc,de,hl я имею ввиду раздельную конструкцию а не всё сразу.
большего я думаю не потребуется :)

заранее big snx! :rolleyes:

Я тут подумал ... Давайте сделаем так ... Я делаб простейшие команды, которые будут означать, что дальше идёт текст в формате ALASM, но ... Перечислите все виды асмов в которых вы работаете и их тонкости !!! Только точно, что бы не много править !!! Например код будет выглядить так:

;---------
:ALASM:
pop hl,de,bc,af
:ASAM:
pop hl de bc af
;---------

Единственное, что я не могу сделать, это после команды ещё одну команду, тогда не сможет работать компилятор под Intel-51 !!!

Кстати, ещё одно, если pop af,bc,de,hl нужно объеденить в ожну команду, то это уже можно, просто напиши:

.POPX
POP AF
POP BC
POP DE
POP HL
..

.PUSHX
PUSH HL
PUSH DE
PUSH BC
PUSH AF
..

Shadow Maker
08.03.2005, 02:14
Только я не понял, что за разворот ??? Ты имеешь в виду что: pop hl,de,bc,af Будет выглядеть как pop af pop bc pop de pop hl ????

Нет, он имел ввиду как раз чтобы все было по правилам, а не как в sjAsm. То есть у тебя все нормально, только запятую в качестве разделителя добавь. И это... Двоеточия поддержаны когда-нибудь будут?
Чтобы можно было написать например

XOR B:LD A,#FE:BIT 0,A
Это во всех ассемблерах на Спектруме есть - и ни на одном на PC почему-то... Религия чтоль не позволяет? :)

Shadow Maker
08.03.2005, 02:24
Роб, опять не срастается. Команды с регистром А ни фига не обрабатывает:
LD A,(#5B5C) - ругается, IN A,(#FE) - ругается.
Вернее я думаю, это не в регистре А дело, а в том, что значение из #XXXX берется, видимо поправить тут забыл это место.

Кстати, а почему выводится только одна ошибка, самая первая? Почему не все сразу? Что, так по одной и находить их?

breeze
08.03.2005, 02:25
Нет, он имел ввиду как раз чтобы все было по правилам, а не как в sjAsm. То есть у тебя все нормально, только запятую в качестве разделителя добавь. И это... Двоеточия поддержаны будут? В качестве разделителя?

ДААААААААААААААААААААА!!!!!! :eek:
именно так ! что бы было всё по правилам а не как в sjasm!!!!!!

пишем pop af,bc,de,hl

имеем


pop af
pop bc
pop de
pop hl

Robus
08.03.2005, 03:33
Роб, опять не срастается. Команды с регистром А ни фига не обрабатывает:
LD A,(#5B5C) - ругается, IN A,(#FE) - ругается.
Вернее я думаю, это не в регистре А дело, а в том, что значение из #XXXX берется, видимо поправить тут забыл это место.

Кстати, а почему выводится только одна ошибка, самая первая? Почему не все сразу? Что, так по одной и находить их?

Точно, ты прав, сейчас поправлю ... Забыл добавить скобки ... Вот что значит на скорую руку делать ....

Через пару минут можно качать новую версию ... =)

Robus
08.03.2005, 03:34
ДААААААААААААААААААААА!!!!!! :eek:
именно так ! что бы было всё по правилам а не как в sjasm!!!!!!

пишем pop af,bc,de,hl

имеем


pop af
pop bc
pop de
pop hl



Я понял ... Оставляю как есть, то есть правильно ... Только дабавлю запятую ...

Robus
08.03.2005, 03:40
Нет, он имел ввиду как раз чтобы все было по правилам, а не как в sjAsm. То есть у тебя все нормально, только запятую в качестве разделителя добавь. И это... Двоеточия поддержаны когда-нибудь будут?
Чтобы можно было написать например

Это во всех ассемблерах на Спектруме есть - и ни на одном на PC почему-то... Религия чтоль не позволяет? :)

Двоеточее то же можно сделать ... Но это не во всех асмах !!! Вообще-то, я не считаю за асм, который не может откомпилировать метку указывающую на метку которая будет в будущем, поэтому когда-то ALASM у меня сразу отпал, поскольку он и одного процента моих работ не мог откомпилировать. А о такой записи вообщеи речь не идёт, да же TASM ny RST не мог такое скушать:

---------
ORG 65536-(END-START)

START

LD HL,16384
LD DE,16385
LD BC,0
LD (HL),L
LDIR

END
---------

Robus
08.03.2005, 06:04
И это... Двоеточия поддержаны когда-нибудь будут?
Чтобы можно было написать например

Это во всех ассемблерах на Спектруме есть - и ни на одном на PC почему-то... Религия чтоль не позволяет? :)

Снова я ... Тепер и двоеточие работает и исправлена ошибка со скобками при HEX'е !!! И запятая в POP'e есть !!! (рямо пошлость получается) Качайте: http://www.entire.nm.ru/coding/asam.zip

jtn
08.03.2005, 08:18
Robus, respect. хороший асм, вот только бы документацию поподробней, и еще такой вопрос - будут ли проблемы при переносе исходников из Tasm4.12?

Shadow Maker
08.03.2005, 17:01
Роб, реально, теперь ассемблируется :) только надо было написать в документации, что имя файла надо в кавычках писать. Да, еще бага:
у тебя почему-то обязательно надо писать в командах с IX/IY смещение, например LD (IY),4 - не прокатит, а вот LD (IY+0),4 - прокатит. Поправь плиз, а то дико неудобно.

Да, а почему нельзя например LD A,%11001100, то есть чтобы битами? Может добавишь? Или уже есть, только другой синтаксис?

Robus
08.03.2005, 18:13
Ну вот ... Теперь добавил DUP !!! Только не извращайтесь, а пишите в разных строках !!! Он, конечно, понимает через двоеточие, но всё же мне кажется что где-то не замеченный баг, а то с этими двоеточиями пришлось политику асма менять !!! Я имею в виду не стоит писать "DUP 6:LD A,0:EDUP" !!!




Роб, реально, теперь ассемблируется :) только надо было написать в документации, что имя файла надо в кавычках писать. Да, еще бага:
у тебя почему-то обязательно надо писать в командах с IX/IY смещение, например LD (IY),4 - не прокатит, а вот LD (IY+0),4 - прокатит. Поправь плиз, а то дико неудобно.

Да, а почему нельзя например LD A,%11001100, то есть чтобы битами? Может добавишь? Или уже есть, только другой синтаксис?

По поводу LD (IX),x я знаю, просто не дописал табличку команд, я доделаю, но это мелочь, в сравнении с глобальными ошибками !!!

BIN то же работает, только не вначале % а в конце "B" - LD A,11001100B, но я сделаю и вначале !

Качайте: http://www.entire.nm.ru/coding/asam.zip

Если найдёте баги, сообщите !!! Кстати, из TASM'а он всё понимает, я сам всю жизнь писал в TASM'е и переводил свои работы.

Robus
08.03.2005, 18:21
Robus, respect. хороший асм, вот только бы документацию поподробней, и еще такой вопрос - будут ли проблемы при переносе исходников из Tasm4.12?

Спасибо ! Доки я не умею писать ... Может кто поможет ??? А перенос из TASM'а может быть проблематичен только один - синтаксис BIN'а !!! Правда ещё с командой PHASE и UNPHASE, в моём асме это ORGOF !!!

Producer
08.03.2005, 19:06
оффтоп: ту Робус: а чего ты кричишь все время !!! ???

Robus
08.03.2005, 19:18
оффтоп: ту Робус: а чего ты кричишь все время !!! ???

Ссори, я вовсе не кричу ... С детства любил число три, поэтому привык по три точки ставить, или восклецательных знака ... Просто привычка !!! А восклицательный знак означает не только криа, но и как выделение некой важной мысли ... Если я обижаю читателей, постараюсь не "кричать", хотя могу и вовсе молчать ...

Shadow Maker
08.03.2005, 23:31
Есть просьб - можно добавить команду некоего немного извратного INCLUDE, при котором метки будут не глобальные, а локальные? То есть этот INCLUDE, назовем его INCLOCAL к примеру, будет работать таким образом - когда встречается INCLOCAL, компилятор ассемблирует подинклудиемый файл, но с его собственными метками, которые не передаются основной программе.

То есть выглядит так: есть 1.asm, в котором есть INCLOCAL 2.asm.
Это аналогично тому, как если бы мы сначала отассемблировали файл 2.asm, а потом его подгрузили в 1.asm как бинарник.

Ибо меня еси честно уже достало, что я называю по привычке в разных кусках программы одними и теми же метками, а при INCLUDE естессно ругается что двойная метка, вот и приходится сначала ассемблировать, а потом грузить бинарником.

breeze
08.03.2005, 23:47
Поддерживаю просьбу! действительно бывает засада с метками :(
особенно когда берешь куски из других проектов...

Proteus
09.03.2005, 01:59
Спасибо ! Доки я не умею писать ... Может кто поможет ??? А перенос из TASM'а может быть проблематичен только один - синтаксис BIN'а !!! Правда ещё с командой PHASE и UNPHASE, в моём асме это ORGOF !!!

Я твои доки всю жизнь почему-то с первого раза понимал, и без примеров. Непонятно что там кому-то может не нравиться.

Shadow Maker
09.03.2005, 02:57
Роб, бага что ли опять...


start_
TABLE000 DB 12,4,14,12,5,14,12,6,14,12,7,14,12,8,14,12,9,14,12 ,10,14,12,11,14,8,4,1,8,5,1,8,6,1,8,7,1,8
end_
Savebin "BT.C",START_,end_

Сохраняет не 37 байт, как надо, а 36, все, что дальше 8,7,1 игнорируется в дуст. Грубо говоря длина строки DB получается 36 байт максимум. Так? Если так, то чего компилер не ругается Too long line, неясно. Молча игнорирует, подлец, и все. То есть поделить строчку на 2 можно конечно, только об этом надо знать, а компилер ошибку не выдает...

Да, что еще хотелось бы - чтобы компилер прекратил наконец издеваться и выдавать только одну первую ошибку. А то у меня на Атлоне 2000XP+ прога какая-то моя старинная в 5300 строк компилится секунд 9-10 - задалбывает такое каждый раз. Пускай до конца ассемблирует, и все ошибки либо сразу на экран выводит, либо в файл кладет errors.txt например... А лучше и туда и туда.

Ну и кроме того, по поводу вышеописанного локального INCLUDE. Можно сделать как в sjAsm MODULE (aprisobal описывал в теме про SjASMPlus).

Да, и вопрос. Листинг компилируемой программы можно как-нибудь получить? В стандартном виде "АДРЕС КОДЫ АССЕМБЛЕРНЫЙ ТЕКСТ"?
А то я что-то не увидел в хелпе такого... А может просто меня в 3 ночи плющит :)

SMT
09.03.2005, 09:45
модульность в стиле паскаля не обладает достаточной гибкостью.
лучше её сделать в виде пространств имён c++, то есть указывать в тексте программы, к какому пространству относится кусок кода. например:
namespace module1
{
proc1 ei
ret
proc2 call proc1
di
ret
}
namespace module2
{
proc1 call module1;;proc1
ret
}
// основная программа:
call module1;;proc1
call module2;;proc1
using namespace module2 // если метка не найдена,
// пытаться найти ту же метку,
// но с префиксом module2;;
call proc1 // вызов из module2
using namespace module1
call proc1 // вызов из module1

преимущества по сравнению с delphi-подходом очевидны:
1. можно модуль держать в нескольких файлах
namespace mod1
{
include "proc1"
include "proc2"
}
2. можно в одном файле держать несколько модулей (как в примере выше)
3. можно дописывать стандартные модули новыми функциями:

namespace std
{
... стандартная библиотека
}
namespace lib1
{
...
}
// дальше основная программа
...
namespace std // снова открываем модуль std и добавляем в него процедуры
{
...
}
4. можно делать аналоги c++ шаблонов, когда один и тот же исходник
компилируется в разный код, в зависимости от опций, и метки разных
вариантов доступны из одной программы
// пускай это библиотека для работы с обычным экраном
namespace lib_zx
{
scr_delta equ 32
use_attr equ 1
include "maincode"
// maincode, используя условную трансляцию (if use_attr=1)
// делает код, работающий или не работающий с атрибутами.
// и использует scr_delta символов в строке
}
// пускай это библиотека для работы с чёрно-белым режимом пентагона (512 пикселей)
namespace lib_pentagon_512
{
scr_delta equ 64
use_attr equ 0
include "maincode"
}
а в основной программе
call detect_pentagon
jz p_512
using namespace lib_zx
call print1
call print2
...
p_512 using namespace lib_pentagon_512
call print1
call print2

или

call detect_pentagon
call z,lib_pentagon_512;;print2
call nz,lib_zx;;print2
5. реализуется в компиляторах легче, чем искусственные локальные метки
паскалевских модулей. если открыт namespace, то принудительно ко всем новым
меткам приписывается префикс. если встречается метка, пытаться найти её
с префиксом текущего namespace'a, а потом уже без префикса. если не открыт
namespace, то если метки нет, пытаться найти её с префиксом активного namespace'a

p.s. конечно, в c++ пространства могут быть вложены с произвольной глубиной,
но для спектрума пока достаточно будет без вложений

что за глюк движка??? поставил 4 тэга CODE, а ругается "Вы вставили слишком много картинок в свою подпись или в это сообщение. Пожалуйста, вернитесь назад, уменьшите количество картинок и попробуйте снова. Картинками считаются также: смайлы, тэги BB-кодов img и тэги HTML img."

херна, простите, полная! убрал все теги - тоже ругается. попробую заменить фигурные скобки на круглые

оказалось, не ест два двоеточия. заменил на ;;

lvd
09.03.2005, 10:13
4. можно делать аналоги c++ шаблонов, когда один и тот же исходник
компилируется в разный код, в зависимости от опций, и метки разных
вариантов доступны из одной программы

Ага, вот кто-то по поводу ооп в аль-асме пугался. Скоро будет ооп в асаме =)

acidrain
09.03.2005, 12:13
[...]

Ибо меня еси честно уже достало, что я называю по привычке в разных кусках программы одними и теми же метками, а при INCLUDE естессно ругается что двойная метка, вот и приходится сначала ассемблировать, а потом грузить бинарником.

Простите меня амижника заядлого =), предлагаю ввести метки локальные, которые действуют в данной п/п. например,


main: move.l a0,(a7)+
bla, bla, bla
.block subq #1,d0
bne .block
newdir ...
block


Т.е. метка, которой предшествует точка является локальной и действительна до тех пор, пока компилятор не встретит глобальной метки (main, newdir, block - те. без точки). Очень удобно, проверенно годами собственного опыта:)

lvd
09.03.2005, 12:30
Простите меня амижника заядлого =), предлагаю ввести метки локальные, которые действуют в данной п/п. например,


main: move.l a0,(a7)+
bla, bla, bla
.block subq #1,d0
bne .block
newdir ...
block


Т.е. метка, которой предшествует точка является локальной и действительна до тех пор, пока компилятор не встретит глобальной метки (main, newdir, block - те. без точки). Очень удобно, проверенно годами собственного опыта:)

Угу, но они все взрощены на дельфях и на цпп, им подавай пространства имён, ооп, шаблоны =) Им нас не понять =)))

Robus
09.03.2005, 13:28
Есть просьб - можно добавить команду некоего немного извратного INCLUDE, при котором метки будут не глобальные, а локальные? То есть этот INCLUDE, назовем его INCLOCAL к примеру, будет работать таким образом - когда встречается INCLOCAL, компилятор ассемблирует подинклудиемый файл, но с его собственными метками, которые не передаются основной программе.

То есть выглядит так: есть 1.asm, в котором есть INCLOCAL 2.asm.
Это аналогично тому, как если бы мы сначала отассемблировали файл 2.asm, а потом его подгрузили в 1.asm как бинарник.

Ибо меня еси честно уже достало, что я называю по привычке в разных кусках программы одними и теми же метками, а при INCLUDE естессно ругается что двойная метка, вот и приходится сначала ассемблировать, а потом грузить бинарником.

Да ... Над INLOCAL я уже думал ... Но так и не сделал ... Нужно сделать ... Но вообще-то, это можно реализовать и сейчас, только думаю это не очень вам понравится, поскольку для этого нужно перелопачивать исходники ... Просто перед каждой меткой нужно поставить @, и тогда он будет думать, что это метка для макроса, после в середине INCLUD'а поставить в самом начале ".1", а в конце "..", что будет указанием на исполнение макроса, в данном случае это будет повторение один раз ... Но конено это не удобство с точки зрения дописывания этих пресловутых @ !!! Но сегодня вечером я сделаю то что вы хотите, только пусть это называется не INLOCAL, а команда AddToLabel, что будет означать к каждой метке приписать имя некоего проекта, который будет указваться в AddToLabel. Если у вас будет метка PRINT а имя проекта SuperPuper.Ofiget, то в компиляторе он её запомнит как SuperPuper.Ofiget.PRINT. После да же из вне можно будет делать ссылки на любые метки !!!

Robus
09.03.2005, 13:37
Роб, бага что ли опять...



Сохраняет не 37 байт, как надо, а 36, все, что дальше 8,7,1 игнорируется в дуст. Грубо говоря длина строки DB получается 36 байт максимум. Так? Если так, то чего компилер не ругается Too long line, неясно. Молча игнорирует, подлец, и все. То есть поделить строчку на 2 можно конечно, только об этом надо знать, а компилер ошибку не выдает...

Да, что еще хотелось бы - чтобы компилер прекратил наконец издеваться и выдавать только одну первую ошибку. А то у меня на Атлоне 2000XP+ прога какая-то моя старинная в 5300 строк компилится секунд 9-10 - задалбывает такое каждый раз. Пускай до конца ассемблирует, и все ошибки либо сразу на экран выводит, либо в файл кладет errors.txt например... А лучше и туда и туда.

Ну и кроме того, по поводу вышеописанного локального INCLUDE. Можно сделать как в sjAsm MODULE (aprisobal описывал в теме про SjASMPlus).

Да, и вопрос. Листинг компилируемой программы можно как-нибудь получить? В стандартном виде "АДРЕС КОДЫ АССЕМБЛЕРНЫЙ ТЕКСТ"?
А то я что-то не увидел в хелпе такого... А может просто меня в 3 ночи плющит :)

Точно баг ... Я и вправду не проверяю на переполнение в размере строки !!! Вообще-то, её размер 256 байт, но при компиляции он прописывает вместо каждого числа или любой метке в списке оных шесть байт, как бы переводя их с фиксированный размер ... Поэтому 37 байт получились аж 222 да плюс команда ... Вообщем баг мой, я разберусь ...

У всех прошу прощение за маленькую скорость компиляции ... Я половину написал на асме а остальные добавления оставил на высоком уровне ... Как только разберёмся с багами, переведу всё на асм и будет скорость - глазом не мргнёте ... Если взять версию где-то 12-ую, то на моём 266 десять тысяч строк компилятся 5-6 секунд, теперь еонечно куча добавлений, которые затормозили скорость ... Но не волнуйтесь в итоге будет всё на высшем уровне !!!

Со списком ошибок я то же поработаю ... Там есть такая команда SaveAllLabel ... Я в этот листинг вставлю и список ошибок ... Или может сделать команду SaveAllErrors, за одно и OpenCompileResult, но эту команду нужно будет делать в самом начале асемблируемого текста !!!

Спасибо за помощь в поисках недостатков !!!

Robus
09.03.2005, 13:41
Хотел бы ещё кое что добавить. На меня ругалисть, что я часто пишу "!!!" или "..." ! Это моя привычка, которая перешла в мошинальность ... Я всегда так писал, и очень сложно перестроиться. Я вовсе не кричу на вас, а восклицательными знаками выдиляю акцент на фразу, да бы обратили внимание ! Если это вам не приятно, я постараюсь переучиться ...

jtn
09.03.2005, 20:06
Спасибо ! Доки я не умею писать ... Может кто поможет ??? А перенос из TASM'а может быть проблематичен только один - синтаксис BIN'а !!! Правда ещё с командой PHASE и UNPHASE, в моём асме это ORGOF !!!
вглубь еще не влезал, потому и спрашиваю, а что будет с макросами и локальными переменными: те что в Tasm'e ...name обозначаются (на самом деле в тасме вместо трех точек подставляется текстовая инкрементирующаяся при .LOCAL переменная).
можно ли передавать в макрос текстовую строку и двигаться по ней курсором?
есть ли подобие Display "blabla",Label ?
присвоение параметру макроса (если это текстовая строка) значения, т.е.
\0 equ #4000
или
\1 = mnu*10+abc

Если этого нет, то видимо придется повременить пока со сменой ассемблера.

p.s. есть пакетный конвертор tasm>txt (на пц) кому надо обращайтесь

jtn
09.03.2005, 20:10
Я твои доки всю жизнь почему-то с первого раза понимал, и без примеров. Непонятно что там кому-то может не нравиться.
написанное по-русски, а не на непонятном языке формул, гораздо легче понять (извините за тафтологию). мне не "не нравиться" как Вы выразились, просто есть какое-то непонимание.

p.s. не сочтите за наезд.

key-jee
09.03.2005, 20:40
просто есть какое-то непонимание.Анналогично..

Shadow Maker
09.03.2005, 21:51
Да нет, ничего, лично мне не мешает, пиши как привык. Вообще у нас демократия :)

Robus
12.03.2005, 06:05
Привет всем !!!

Вот, наконец-то, я сделал почти всё, что вы просили ... Теперь можно использовать % в качестве BIN'арного значения. Так же добавлена команада LocalModule и EndLocalModule, думаю намёк ясен, что она делает !!!

пример:
------
ORG 0

KAKA EQU 333

LocalModule Super
KAKA EQU 777
LocalModule Super
KAKA EQU 999
EndLocalModule
EndLocalModule

BYAKA EQU KAKA+Super.KAKA+Super.Super.KAKA

------

Как вы уже догадались, - можно из локального модуля вытаскивать метки.

Ну ... Удобного пользования ... Хех ...

Совсем забыл ... Вот ссылка: http://www.entire.nm.ru/coding/asam.zip

random
12.03.2005, 07:54
ROB! Ты молодец!!!

Как там со скоростью, прооптимизировал?

(сейчас тебе еще просьб накидают по самое негорюй)

Robus
12.03.2005, 11:15
ROB! Ты молодец!!!

Как там со скоростью, прооптимизировал?

(сейчас тебе еще просьб накидают по самое негорюй)

Hi, Random !!!

Не, ещё не прооптимизоровал ... Тут каждый хочет очередную новую возможность, с оптимизацией не успеваю !!! Как баги понаходят сразу засяду за оптимизацию.

А что за просьбы ??? Там в асме такая куча команд, что я уже затрудняюсь себе представить "КОГО" туда ещё можно вставить ...

Слушай ... Ты случайно с пакерами не знаком ??? Не хочешь написать свой пакер и депакер ??? Только пакер нужен на ПиЦи, желательно, и желательно в асме, ну или алгоритм !!! Будет в языке новая команда, например: RandomPack и RandomDepacker !!!

random
12.03.2005, 11:23
Rob!!!

Лично я с пакерами знаком только в плане реализации документированых алгоритмов. Своих не изобретал. Если нужен хороший пакер, посмотри http://upx.sourceforge.net/

Там и сорцы и все что хочешь.

lvd
12.03.2005, 12:30
Hi, Random !!!

Не, ещё не прооптимизоровал ... Тут каждый хочет очередную новую возможность, с оптимизацией не успеваю !!! Как баги понаходят сразу засяду за оптимизацию.

Эта... Rob F.! А зачем собственно ты чего-то там оптимизируешь и на асме пишешь? Ты же не 3д двигло даже делаешь, а асм, который хавает всего-то несколько сотен килов сорцов за раз. И 5 секунд он там прокопается, или 3 - глубоко параллельно... В общем не страдай фигнёй, не надо ничего оптимизировать на асм, лучше новые фичи добавляй и баги лови =)



Слушай ... Ты случайно с пакерами не знаком ??? Не хочешь написать свой пакер и депакер ??? Только пакер нужен на ПиЦи, желательно, и желательно в асме, ну или алгоритм !!! Будет в языке новая команда, например: RandomPack и RandomDepacker !!!

Дык у тебя ж там эмулятор Z80 есть? Ну вот, берёшь любой zx-пакер, и через этот эмулятор присобачиваешь.

PS: а ещё лучше, чтобы юзер мог присобачить тот пакер, который ему нравится. Мне, например, megalz нравится... =)

PPS: А если очень-очень хочется, см сюда: http://www.west.co.tt/matt/speccy/apology/
Пакер на сях + депакер в ~70 байт на асме Z80. Правда, нерелоцируемый.

Robus
12.03.2005, 12:48
Эта... Rob F.! А зачем собственно ты чего-то там оптимизируешь и на асме пишешь? Ты же не 3д двигло даже делаешь, а асм, который хавает всего-то несколько сотен килов сорцов за раз. И 5 секунд он там прокопается, или 3 - глубоко параллельно... В общем не страдай фигнёй, не надо ничего оптимизировать на асм, лучше новые фичи добавляй и баги лови =)



Дык у тебя ж там эмулятор Z80 есть? Ну вот, берёшь любой zx-пакер, и через этот эмулятор присобачиваешь.

PS: а ещё лучше, чтобы юзер мог присобачить тот пакер, который ему нравится. Мне, например, megalz нравится... =)


Не, что не говори, а скорость это нужное дело ... Вообще-то мой асм сейчас совсем не быстрый ... До первой оптимизации он компилировал примерно минуту всего-то 1000 строк, хотя признаюсь, что для такого нужно было использовать последнюю в списке команд команду. После оптимизации скорость возрасла примерно раз в 100. Кроме всего этого загрузка разных файлов, та же парафия, стоило сохранить блок длиной в 65536 байт, приходилось ждать, теперь там буфера, что ускорело этот процес ... На работе я использую свой асм, где компилится проект в общей сложности на 250000 строк, ух как приходится ждать ... Так что в итоге я всё перепишу на асм ... Скорость должна быть скоростью, это правило хорошего тона Coder'ов ...


Да, в асме есть эмуль, но ведь согласись, что должно быть качественно и компактно, да и паковать эмулятором это извращение. Я бы очень хотел получить алгоритмы пковки хороших пакеров со Speccy !!! Я, надеюсь, всё же, - сделать качественно !!! Вот как доделаю свою дему, сразу же займусь этим ...

Спасибо, что помогаете с глюками !!!

Shadow Maker
12.03.2005, 17:50
Роб... Чего-то думаю я, что скорость такая тормозная из-за запуска под Виндами дос-экстендера... Что мешает перекомпилить все это в Виндовс-вариант? Скорость думаю сразу вырастет раз в 100 :)

lvd
12.03.2005, 18:26
Кроме всего этого загрузка разных файлов, та же парафия, стоило сохранить блок длиной в 65536 байт, приходилось ждать, теперь там буфера, что ускорело этот процес ...
[skip]
Так что в итоге я всё перепишу на асм ...


Ну уж пардон, если в файл писать по 1 байту используя ф-ции fread/fwrite (или как их там), то это к оптимизации не относится. Это скорее к здравому смыслу...

Если конкретный алго переписать на асм руками, то быстрее он в 100 раз не станет, максимум в 2-3 раза, а далее см. про 5 и 3 секунды. Более того, в особых случаях может стать только медленнее - если например ты под вин32 начнёшь юзать ax-bx-etc и loop - пренепременнейше.

Так что оптимизация алгоритмов имеет место быть как весьма действенная, а тупое переписывание на асм - фигня, не стоящая затрат ДЛЯ ТАКОГО ПРОДУКТА, как этот асм. Для него гораздо важнее безглючность и фичность. Чем кончается переписывание такого на асм - могу сказать. Есть такой PhxAss. Вроде бы старый продукт, все им юзаются, но - его беру я и - о ужас! - нахожу нелепый глюк с bra *+n .Пишу автору - а он отвечает - да мне типа влом править, оно на асме написано.



Скорость должна быть скоростью, это правило хорошего тона Coder'ов ...

Если какая-нить демка лезет в память и не коматозит (50фпс онли) - кому какое дело, как она написана? Тем более, раз это правило хорошего тона, то почему бы действительно не перекомпилять под вин32, как говорит SM? Скоро в виндах вообще дос отменят, а под вин32 и консольные приложения пишутся отлично - см. тот же фар. Не нравится вин32 - пиши под minGW/cygnus - заодно портабельность под линух будет.

Proteus
13.03.2005, 02:58
Если конкретный алго переписать на асм руками, то быстрее он в 100 раз не станет, максимум в 2-3 раза, а далее см. про 5 и 3 секунды. Более того, в особых случаях может стать только медленнее - если например ты под вин32 начнёшь юзать ax-bx-etc и loop - пренепременнейше.


Ты видать проги с Энлайхта не дезасемблировал. У меня в инсте преподы которые асма не разу не видели или плохо на нём писали так же говорили. Могу тебя заверить что если как надо всё написать то ещё как станет быстрее и не в 2-3 раза, а раз в 500 если захотеть. Алгоритм конешно дело хорошее, только ассемблер это мир с другой логикой.. на Си ты его никогда не обгонишь (и не надо заливать про оптимизатор и прочее... ни один опитимзатор по сравнению с мозгами гроша ломанного не стоит)....

Proteus
13.03.2005, 03:04
Rob!!!

Лично я с пакерами знаком только в плане реализации документированых алгоритмов. Своих не изобретал. Если нужен хороший пакер, посмотри http://upx.sourceforge.net/

Там и сорцы и все что хочешь.

Если что-то упаковать надо то пожалста. А если функцию или алгоритм выдрать, то к UPX лучше близко не подходить. Для начала я промолчу про форматы исполняемых файлов ELF,PE про их потроха и т.д. Его упаковка основна на двух библиотеках, притом одна из них испоьзует дикую смесь LZ метода и генетического алгоритма, а другая тоже не лучше....

SMT
13.03.2005, 04:03
Ты видать проги с Энлайхта не дезасемблировал. У меня в инсте преподы которые асма не разу не видели или плохо на нём писали так же говорили. Могу тебя заверить что если как надо всё написать то ещё как станет быстрее и не в 2-3 раза, а раз в 500 если захотеть. Алгоритм конешно дело хорошее, только ассемблер это мир с другой логикой.. на Си ты его никогда не обгонишь (и не надо заливать про оптимизатор и прочее... ни один опитимзатор по сравнению с мозгами гроша ломанного не стоит)....
конечно, на спектруме нет оптимизирующих компиляторов. но в общем случае утверждение ошибочно

lvd
13.03.2005, 09:43
Ты видать проги с Энлайхта не дезасемблировал. У меня в инсте преподы которые асма не разу не видели или плохо на нём писали так же говорили. Могу тебя заверить что если как надо всё написать то ещё как станет быстрее и не в 2-3 раза, а раз в 500 если захотеть. Алгоритм конешно дело хорошее, только ассемблер это мир с другой логикой..

Ну уж не надо мне заливать про асм - я таки и на Z80 програмлю, и на 68k, и на других доводилось... Только вот если ты взял прогу на сях типа for(i=0;i<100;i++) funktsiya(i);, то в не то что в 500, даже в 5 раз ты её не ускоришь (не касаясь вызываемой функции). А если таки ускорил в 500 раз - это значит, что поменял (оптимизнул) алгоритм - причём даже очень круто (изменил запись в файл по 1 байту на запись в буфер и его отписку за раз, например =).



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

Так это смотря какой компилятор и какой проц. Ты например видимо в курсе, что всякие там гигагерцовые процы имеют конвейер на десяток-другой тактов, а также всякие хитрости типа кеширования условных переходов. Так вот простой пример - eвидев, как компайлер раскрыл if(a>0) b=b*c+d; на 20 линейных команд без переходов, а ты пришёл и радостно оптимизнул до 3 команд с условным переходом. И что же - после этого условный переход перестал угадываться в половине случаев и началась чистка конвейера на 20-30 тактов - и где тут оптимизация?

Далее, у процов таких секретов может быть много, и хороший компилятор о них может быть в курсе. А ты?

lvd
13.03.2005, 10:04
конечно, на спектруме нет оптимизирующих компиляторов. но в общем случае утверждение ошибочно

Почему же, есть. AlCo, например. =)

Proteus
13.03.2005, 13:26
Так это смотря какой компилятор и какой проц. Ты например видимо в курсе, что всякие там гигагерцовые процы имеют конвейер на десяток-другой тактов, а также всякие хитрости типа кеширования условных переходов. Так вот простой пример - eвидев, как компайлер раскрыл if(a>0) b=b*c+d; на 20 линейных команд без переходов, а ты пришёл и радостно оптимизнул до 3 команд с условным переходом. И что же - после этого условный переход перестал угадываться в половине случаев и началась чистка конвейера на 20-30 тактов - и где тут оптимизация?

Далее, у процов таких секретов может быть много, и хороший компилятор о них может быть в курсе. А ты?

Не надо меня со школьной детворой равнять. Я давно уже не спектрумист. Просто нравится он мне и люди которые на нём сидят. Вот и зависаю иногда на форуме. И поверь отлично знаю как надо и под конвеерный процессор и под суперскалярный и под какой угодно писать. Если уж на то пошло то реальные коды после этих оптимизаторов меня совсем не впечатляют. Даже если самые крутые из них и знают что-то лучше меня одних фактов для оптимизаци не достаточно.

Robus
13.03.2005, 20:55
Роб... Чего-то думаю я, что скорость такая тормозная из-за запуска под Виндами дос-экстендера... Что мешает перекомпилить все это в Виндовс-вариант? Скорость думаю сразу вырастет раз в 100 :)


Не, совсем не из-за этого ... Хотя, возможно, что ХР так и делает ... Но на сколько я работал с ХР, еже ли хорошо настроить, то тормозить выделение памяти не будет ... В остальных случаях дос-экстендер выделяется ну оооочень быстро, так что вся галимая скорость лишь из-за меня !!! Я это обязательно исправлю !!! А если перекомпилировать под винду, то скорость будет или такая же или медленнее ... Темболее, что винда блочит выделение процессорных сегментов в GDT, а на этом построин моя эмулятор. Вообщем, пока я не достану полный TMT,под винду врядли перекомпилирую !!!

SMT
13.03.2005, 21:13
Не надо меня со школьной детворой равнять. Я давно уже не спектрумист. Просто нравится он мне и люди которые на нём сидят. Вот и зависаю иногда на форуме. И поверь отлично знаю как надо и под конвеерный процессор и под суперскалярный и под какой угодно писать. Если уж на то пошло то реальные коды после этих оптимизаторов меня совсем не впечатляют. Даже если самые крутые из них и знают что-то лучше меня одних фактов для оптимизаци не достаточно.
такие выпады наблюдаю не в первый раз... один раз мне пытались доказать, что ООП тормоз, спорщик выбрал задачу сортировки строк файла, но так и не смог обогнать сортировку абстрактного контейнера vector из STL (фишка там в том, что в рекурсии, когда длина вектора находится в определенных пределах, применяется лучше подходящий для этой длины алгоритм. на определение порогов/алгоритмов потрачен imho не один десяток часов)

если Вы настаиваете, что можете обогнать компилятор в 2-3, а то и "раз в 500 если захотеть" и если "оптимизаторы меня совсем не впечатляют", то можете выбрать ЛЮБУЮ задачу на Ваше усмотрение (лучше выполняющуюся не менее нескольких секунд для удобства подсчёта времени) и попробуйте обогнать компилятор ХОТЯ БЫ в 1.5 раза. я со своей стороны обещаю не использовать ассемблерных вставок в программе. если отказываетесь - прекращаем флейм :)

Robus
13.03.2005, 21:26
Ну уж пардон, если в файл писать по 1 байту используя ф-ции fread/fwrite (или как их там), то это к оптимизации не относится. Это скорее к здравому смыслу...

Ну как сказать, я же переписал эти модули. У меня по-прежнему пишется по байту, но не тормозит же, а процедура осталась та же. Если бы у меня была полная версия TMT, то я бы этим не занимался, поскольку это уже сделали, но аторы специально не распространяют полные модули, от чего я не мгу по-человечески писать, вот и приходится некоторые модули переписывать. Можно, конечно, со старыми, но тогда будет уровень стандартных виндошно-микрософто-борландовсих продуктов ... Мало того, если вы заметили, то в компилятор запакованы ещё семь файлов. Пакер мой собственный, хотя галимый, но я сделал эмуляцию диска, и можно на прямую загружать файлы из ЕХЕ-шника. Очень удобно, когда нет никаких лишних файлов, засирающих винт.


Если конкретный алго переписать на асм руками, то быстрее он в 100 раз не станет, максимум в 2-3 раза, а далее см. про 5 и 3 секунды. Более того, в особых случаях может стать только медленнее - если например ты под вин32 начнёшь юзать ax-bx-etc и loop - пренепременнейше.

Поверь, медленнее не станет ... Уже сотню раз через это проходил, и если бы не некоторые проблемы, то я сразу писал бы всё в асме, но теперь это не важно ...


Так что оптимизация алгоритмов имеет место быть как весьма действенная, а тупое переписывание на асм - фигня, не стоящая затрат ДЛЯ ТАКОГО ПРОДУКТА, как этот асм. Для него гораздо важнее безглючность и фичность. Чем кончается переписывание такого на асм - могу сказать. Есть такой PhxAss. Вроде бы старый продукт, все им юзаются, но - его беру я и - о ужас! - нахожу нелепый глюк с bra *+n .Пишу автору - а он отвечает - да мне типа влом править, оно на асме написано.

Да, я когда-то свой пакер написал полностью на СИ, потом нашёл TMT, и перевёл его туда, да скорость поднялась примерно в 10-ть раз, и я был раз как никогда. Но, когда я решил полностью переписать на асм, то заметил, что скорость загрузки с автоматическим распаковыванием происходит примерно в 10-ть раз быстрее, нежели это сделать просто загружая файл ... Понятно, что, если он плохо запаковался, то ничего не получится, и скорость будет чуточку дольше, но результат АСМ-а всё равно неповторим !!! Жизнь в АСМ-е как иной мир, мысли по-другому, и выполнение одного и тогоже кажется гениальным, что в итоге чаще всего и подтверждается ... АСМ - СИЛА !!!


Если какая-нить демка лезет в память и не коматозит (50фпс онли) - кому какое дело, как она написана? Тем более, раз это правило хорошего тона, то почему бы действительно не перекомпилять под вин32, как говорит SM? Скоро в виндах вообще дос отменят, а под вин32 и консольные приложения пишутся отлично - см. тот же фар. Не нравится вин32 - пиши под minGW/cygnus - заодно портабельность под линух будет.

Но у нас не демка. А другие системы ... Это не совсем то что должно быть ... Под линух я перекомпилю, когда достану полный TMT, иначе я этого не сделаю !!! :D

Robus
13.03.2005, 21:37
Ты видать проги с Энлайхта не дезасемблировал. У меня в инсте преподы которые асма не разу не видели или плохо на нём писали так же говорили. Могу тебя заверить что если как надо всё написать то ещё как станет быстрее и не в 2-3 раза, а раз в 500 если захотеть. Алгоритм конешно дело хорошее, только ассемблер это мир с другой логикой.. на Си ты его никогда не обгонишь (и не надо заливать про оптимизатор и прочее... ни один опитимзатор по сравнению с мозгами гроша ломанного не стоит)....

Точно в точку ... Хотя и на АСМ-е могут написать тормоза, но и вправду, если программер нормальный, то асме он покорит любые высоты. Конечно, я не предлагаю переписывать загрузки с винта, это хоть и влияет на скорость, но не так мешает, как нудное ожмдание окончание компиляции ... Особенно меня шокируют ПиЦишные языки. Как-то мне довелось писать серьёзный проект, и я себя ощущал реально-тормозящим человеком ... Пока откомпилируктся прога, напрочь забываешь о том что делал !!!

Кстати, я этот АСМ написал не просто так ... Для него должна быть оболочка, то есть текстовый редактор. И пока человек шурует новую строку своей программы, остальные компилируются на заднем плане. Но за текстовый редактор я так и не сел. Всё думаю, стоит-ли это делать ...

Robus
13.03.2005, 21:42
Если что-то упаковать надо то пожалста. А если функцию или алгоритм выдрать, то к UPX лучше близко не подходить. Для начала я промолчу про форматы исполняемых файлов ELF,PE про их потроха и т.д. Его упаковка основна на двух библиотеках, притом одна из них испоьзует дикую смесь LZ метода и генетического алгоритма, а другая тоже не лучше....

Вообще-то нужно ещё хуже, всего-то переписать на асм паковку стандартных пакеров на ZX'е ! А депакер родной !!! Очень хотел бы получить HRUST и DSQ !!! Но лучше всего все подряд ... Просто каждый програмер идивидуал, поэтому любит определённые пакеры. А тут ему только написал команду и запаковал то, что откомпилировалось !!! Полмоему это очень удобно !!! Мне да же подошло бы из вне запустить EXE'шник получить файл и подгрузить его в асм, но мне кажется, что это слишком по ПиЦишному и совсем не красиво !!!

Robus
13.03.2005, 22:08
Ну уж не надо мне заливать про асм - я таки и на Z80 програмлю, и на 68k, и на других доводилось... Только вот если ты взял прогу на сях типа for(i=0;i<100;i++) funktsiya(i);, то в не то что в 500, даже в 5 раз ты её не ускоришь (не касаясь вызываемой функции). А если таки ускорил в 500 раз - это значит, что поменял (оптимизнул) алгоритм - причём даже очень круто (изменил запись в файл по 1 байту на запись в буфер и его отписку за раз, например =).

Ну что вы спорите ... Темболее над такими примерами ... Никто же не говорит о простейших задачах !!! Я в своём АСМ-е писал процедуру поиска команды. Использовал стандартные процедуры, но как только решил написать на асме, скорость стала потрясающей !!! Осоюенно, если той процедуре задаёшь команду, которая лежит вконце списка команд, то тормоза были неимоверные !!! Да и компактность процедуры стала очень крохотной. И никакие гигагерцовые процессоры не обламывались с кешированием. Мало того, кеши обрываются не просто от условных или безусловных переходов, а от работы с памятью. Поэтому я написал десяток табличек, которые прокешировал да же допотопный целерон от пня-2 и СИ просто остались далеко позади.


Так это смотря какой компилятор и какой проц. Ты например видимо в курсе, что всякие там гигагерцовые процы имеют конвейер на десяток-другой тактов, а также всякие хитрости типа кеширования условных переходов. Так вот простой пример - eвидев, как компайлер раскрыл if(a>0) b=b*c+d; на 20 линейных команд без переходов, а ты пришёл и радостно оптимизнул до 3 команд с условным переходом. И что же - после этого условный переход перестал угадываться в половине случаев и началась чистка конвейера на 20-30 тактов - и где тут оптимизация?

Когда-то был конкурс, где была поставлена задача, ежели в регистре А лежит 1, то по исполнениее программы там должна быть 2, ежели 2, то 1. Конкурс был двоякий, кто напишет саму коротку или саму гиганскую программу. Самая гиганская была на 1 метр, и сколько-то там строк. Конечно нелзя было писать что-то левое, всё должно быть осмысленно. А самая короткая была из двух строк. Но у них небыло ZX-Spectrum'а, на этом бейсике можно просто одной командой из трёх действий ... Но, всё это шутки, а вы спорите ... Это как расы, есть чёрные есть белые, а есть среди них росисты. Не спорте, каждый сам выбирает свой путь. Признаюсь честно, для меня языки высокого уровня считаются самыми низкими решениями программирования ... Едиснственное их реальное применение я вижу в загрузках файлов или расчёте таблц. Тут я соглашусь, математика есть математика, и она хорошо подходит для языков высокого уровня, но в остальном я выбираю лишь асм. Поэтому для меня самый лучший язык где есть команда ASM, конечно же без ограничений, как это в СИ !!!


Далее, у процов таких секретов может быть много, и хороший компилятор о них может быть в курсе. А ты?

Да, но только компилятору и нужно это знать, а я знаю АСМ и знаю, что стандарт на ПиЦи стал 486-проц, поэтому я не отхожу от него, и уверен, что мой продукт не запустится на другом компе только из-за каких-нибудь видеокарт или звуковиков. Но в остальном мой пограмма не выдаст вам сообщение 3DNOW не найден, или MMX но презент, и после пользователь сделает кислое лицо заявив, что мой продукт - дерьмо, а виноват будет компилятор, который знает как оптимизировать FOR ... NEXT, а LOOP на метку будет работать как часы ВЕЗДЕ. Поэтому я редко играю в современные игры, гадость - то, что тормозит, а ещё хуже если она тормозит местами, как это происходит в 99% современных продуктах !!!

elf/2
13.03.2005, 23:08
уже не первый раз на этом форуме пытаются сравнивать асм и языки высокого уровня. при этом все время разговор (флейм) идет только по поводу скорости работы программы. и почему-то никто не говорит о других не менее важных параметрах:

1. скорость/стоимость разработки. надеюсь никто не будет спорить что по этому параметру любой яву превосходит асм в разы (на порядки?)
2. стоимость поддержки/модификации. та же картина. на этом форуме есть живой пример: пока в этой ветке обсуждается "что круче", Aprisobal взял _чужой_ проект и увеличил скорость работы в 2.5 раза и добавил некоторое количество новых функций. я сильно сомневаюсь что это было бы возможно если бы SjASM был написан на ассемблере

если говорить о скорости работы, то в большинстве случаев работает такой подход:
если хочется увеличить скорость, то сначала надо смотреть на алгоритмы (согласен со многими предыдущими ораторами). а если уж этого не достаточно, то взять profiler и посмотреть где все еще есть проблема, и только этот кусок (обычно он очень маленький) переписать на асме...

ну и последнее: посмотрите сколько успешных коммерческих или opensource проектов написаны на асме, а сколько на ЯВУ. при этом я бы не сказал что все последние сильно тормозят на реальных задачах

Shadow Maker
13.03.2005, 23:23
Кстати, я этот АСМ написал не просто так ... Для него должна быть оболочка, то есть текстовый редактор. И пока человек шурует новую строку своей программы, остальные компилируются на заднем плане. Но за текстовый редактор я так и не сел. Всё думаю, стоит-ли это делать ...
Не надо. Лучше реализуй все, что наобещал :) Начиная от листингов и кончая скоростью работы.

PS - Господа, может хватит уже флейма?

Robus
13.03.2005, 23:50
Не надо. Лучше реализуй все, что наобещал :) Начиная от листингов и кончая скоростью работы.

PS - Господа, может хватит уже флейма?

Всё, что обещал врё реализовано !!! За исключением листинга ... У меня такой вопрос, а что это так важно ??? Просто я сколько не компилил работы всегда эту опцию считал нагромождающей !!! Вообще-то, это очень просто, но помоему это последнее что обещал, и помоему "наобещал" не очень подходит к сделанному ? :wink:

Кстати, по поводу языков высокого уровня ... Вообще-то, на моём асме можно создавать макросы, которые могут выглядеть как команды языка. Я понимаю, что совместить один макрос в другом не так просто у меня, но всё же наборы простейших операций реализовываются очень легко. Только напиши ...

Да, и ещё у меня есть постепенно увеличивающийся файл для моего асма со всякими готовыми процедурами. Например берёте и пишете:

A DD 0 ;Математические операции работают с четырмя байтами !!!
B DD 0
LET A=B*C-456/67+(98-9)

Или такое:

ExitBasic48 ;Не так просто как кажется ... Переходит в бейсик 48, оставляя всё в памяти. Ну вообщем отрубает 128-ой. Это бывает нужно.

Вот поэтому я и удивляюсь спорам о высоких языках, может стоит написать самому команды. Или от СИ уже отказаться никто не может ? :smile:

lvd
14.03.2005, 07:56
Вот поэтому я и удивляюсь спорам о высоких языках, может стоит написать самому команды. Или от СИ уже отказаться никто не может ? :smile:

Да лучше уж си, чем жуткая смесь паскаля и х86 асма... =) А когда мне хочется для души на асме попрограммить, я беру спек/z80 или амигу/68k - и ужасы х86 остаются позади.

PS: всё пользуюсь аль-асмом - вот недавно из id'ы pro в него дизасм запихал - скушал с первого раза =))

Alex/AT
14.03.2005, 08:54
За исключением листинга ... У меня такой вопрос, а что это так важно ??? Просто я сколько не компилил работы всегда эту опцию считал нагромождающей !!!

Очень важно. Удобно видеть все метки с кодом "в статике". Особенно когда ловишь в большой проге, кто на кого наползает ;)))

Вот сейчас попробую твой ASM - Worms перекомпилю ;)

Alex/AT
14.03.2005, 09:12
Попробовал, называется ;)

Есть одна штука, которую ОБЯЗАТЕЛЬНО хотелось бы ;) Это сохранение результата ассемблирования в снапшот .Z80... Ибо тестить быстрее.

Что ж, сейчас буду внешний скрипт писать, который из .BIN'ов .Z80 соберет ;)

random
14.03.2005, 09:18
а чем не катит bin2sna?

SMT
14.03.2005, 09:23
уже не первый раз на этом форуме пытаются сравнивать асм и языки высокого уровня. при этом все время разговор (флейм) идет только по поводу скорости работы программы. и почему-то никто не говорит о других не менее важных параметрах:

1. скорость/стоимость разработки. ...
2. стоимость поддержки/модификации.

кажется, я начинаю понимать людей, цепляющихся за асм (или за си без плюсов) вероятно, причины у них те же, что и у поклонникoв спектрума. поэтому и аргументация про поддержку программы и удобство кодирования их совершенно не трогают. они тихими долгими вечерами корпят над своими программами и им не нужно доделать к сроку. хм... мой спор с Proteus похож на издевательство, как если бы пцшник предложил спектрумисту аналогичное соревнование (так что я извиняюсь). а наши попытки переубедить этих людей сами знаете на что похожи

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

Bulba
14.03.2005, 09:41
бесконечно оптимизировать цикл поиска. потому что хорошо реализованный автомат на визуал басике будет быстрее (но на больших объемах данных), чем любая реализация линейного поиска на ассемблере

Это точно, пока есть возможность для алгоритмической оптимизиции, нет никакого смысла заниматься прочими видами оптимизации. Сортировку "пузырьком" можно до умопомрачения оптимизировать, но это явно бессмысленно, уже на нескольких тысячах записей разница в скорости отличается на пару порядков в худшую сторону (субъективно) от того же QuickSort в Delphi.

... Ay_Emul: Смысловые галлюцинации - Ковбои

Alex/AT
14.03.2005, 10:01
Попробовал... :( Глюки.
LD (IX+s),#nn не понимает в упор, хоть стреляйся...

Robus
14.03.2005, 10:25
Попробовал, называется ;)

Есть одна штука, которую ОБЯЗАТЕЛЬНО хотелось бы ;) Это сохранение результата ассемблирования в снапшот .Z80... Ибо тестить быстрее.

Что ж, сейчас буду внешний скрипт писать, который из .BIN'ов .Z80 соберет ;)

Да зачем внешний скрипт писать ??? Дайте доку по Z80 и я сделаю сохранение, это же так просто !!!

Robus
14.03.2005, 10:37
Попробовал... :( Глюки.
LD (IX+s),#nn не понимает в упор, хоть стреляйся...

Да, это мой глюк, я не сделал IX без плюсов ... LD (IX),7 не поймёт, а LD (IX+0),7 поймёт ... Надо раз и навсегда разобраться с этими плюсами, сейчас сделаю !!!

Alex/AT
14.03.2005, 10:40
Описание .Z80:
http://www.worldofspectrum.org/faq/reference/z80format.htm

Да, а как там по поводу LD (IX+s),#n?

Еще хотелось бы аналоги DB/DW - DEFB/DEFW, но это я и сам в CMD дописать в состоянии ;) ;) ;)

Еще бы хотелось савиться в хобету ($B/$C)

А вообще - пересел на SjAsmPlus. Даже код почти переделывать не пришлось...

Alex/AT
14.03.2005, 10:43
Да, это мой глюк, я не сделал IX без плюсов ... LD (IX),7 не поймёт, а LD (IX+0),7 поймёт ... Надо раз и навсегда разобраться с этими плюсами, сейчас сделаю !!!
Нет, не все так просто. Он их ВООБЩЕ не понимает. Hint: команда встречается во включаемом файле... может от этого как-то зависит?

Spectre
14.03.2005, 11:04
Вообще-то нужно ещё хуже, всего-то переписать на асм паковку стандартных пакеров на ZX'е ! А депакер родной !!! Очень хотел бы получить HRUST и DSQ !!! Но лучше всего все подряд ... Просто каждый програмер идивидуал, поэтому любит определённые пакеры. А тут ему только написал команду и запаковал то, что откомпилировалось !!! Полмоему это очень удобно !!! Мне да же подошло бы из вне запустить EXE'шник получить файл и подгрузить его в асм, но мне кажется, что это слишком по ПиЦишному и совсем не красиво !!!

Исходники пакера и депакера Hrust'а 2.1 уже много лет открыты. Лежат в комплекте Hrip'а: http://trd.speccy.cz/system/HRIP_105.ZIP. Если будут вопросы, помогу.

Robus
14.03.2005, 11:31
Описание .Z80:
http://www.worldofspectrum.org/faq/reference/z80format.htm

Да, а как там по поводу LD (IX+s),#n?

Еще хотелось бы аналоги DB/DW - DEFB/DEFW, но это я и сам в CMD дописать в состоянии ;) ;) ;)

Еще бы хотелось савиться в хобету ($B/$C)

А вообще - пересел на SjAsmPlus. Даже код почти переделывать не пришлось...

Сделал ... http://www.entire.nm.ru/coding/asam.zip

Правда не понимаю почему у тебя не работало LD (IX+0),7 ??? Сейчас-то я сделал что бы понимал все виды и с плюсом и без него ... Может у тебя LD (0+IX),7 ??? Потому что я только что проверил и во вложенных работает и по десять раз во вложенных работает !!!

А по-поводу $, так для этого всё готово, но я не мог разобраться с контрольной суммой, читать-то я их читаю, но записывать нужно подсчитать контрольную сумму, а она там какая-то непонятная, и не XOR и не ADD+ADDR ... Так я когда-то и плюнул ...

Bulba
14.03.2005, 11:46
нужно подсчитать контрольную сумму, а она там какая-то непонятная, и не XOR и не ADD+ADDR ... Так я когда-то и плюнул ...

Я в VT делаю так:
k := 0;
for j := 0 to 14 do
Inc(k,Ind[j]);
CheckSum := k * 257 + 105


Это проделывается с первыми 15 байт заголовка. Оригинальную доку сходу не нашел, но вроде была ZX.SPECTRUM Echo FAQ.

... Ay_Emul: Silent now...

elf/2
14.03.2005, 11:47
А по-поводу $, так для этого всё готово, но я не мог разобраться с контрольной суммой, читать-то я их читаю, но записывать нужно подсчитать контрольную сумму, а она там какая-то непонятная, и не XOR и не ADD+ADDR ... Так я когда-то и плюнул ...
u16 calculateCheckSum(HoHdr& hdr)
{
u16 sum = 0;
u8* p = (u8*)&hdr;
for(int i = 0; i < sizeof(HoHdr)-2; ++i) sum += *p++;
return 257*sum + 105;
}


сумма всех байт хобетного заголовка (без самой суммы конечно) умноженная на 257 плюс 105

Alex/AT
14.03.2005, 11:49
Правда не понимаю почему у тебя не работало LD (IX+0),7 ???
Не работает... Странный глюк, пишет Instruction not found или что-то в этом роде...

Robus
14.03.2005, 12:07
кажется, я начинаю понимать людей, цепляющихся за асм (или за си без плюсов) вероятно, причины у них те же, что и у поклонникoв спектрума. поэтому и аргументация про поддержку программы и удобство кодирования их совершенно не трогают. они тихими долгими вечерами корпят над своими программами и им не нужно доделать к сроку. хм... мой спор с Proteus похож на издевательство, как если бы пцшник предложил спектрумисту аналогичное соревнование (так что я извиняюсь). а наши попытки переубедить этих людей сами знаете на что похожи

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

Вообще-то, признаюсь, большего неудобства нежели в СИ с любыми плюсами я не испытывал ... Наверное самое лучшее, что могли придумать это паскаль, не считая ВАСИКА, конечно ! Это с точки удобства программирования. Просто я умудрился на СИ написать несколько программ, и заметил тенденцию, что писать их нужно как можно проще, не стараясь использовать готовые библиотеки. Поскольку при всей своей мулти-платформинности СИ не имеет всех библиотек и в любом случае перенося программу в другую среду приходится её править ! Но да же если стать извращенцем, а это можно сделать и на асме, и писать всё простейшими командами, то и тут есть подводные камни. На микроконтроллерах я не один раз с этим сталкивался. Вот не хочет он 37-мой IF исполнять ... Что мне делать ??? Я не могу полезть и так просто переписать кусок компилятора. Но если у меня есть асм, я просто эту проблему обойду ... Да, - я затрачу в три раза больше времени, но я добьюсь успеха. Получается, для качественной работы с СИ мне нужно быть асом использования команд, не использовать больше двух сравнений в IF, следить за тем что бы во вложенном цикле небыло вложенных циклов больше чем 10-ть штук, зачем ??? Это всё превращает не в программирование а в борьбу за выживание под ПРОЦИКОМ, так и зародилась винда ... Про кодинг под виндой страшно говорить ... То используешь какую-нибудь библиотеку, переносишь на другой комп, а тебе говорят, что тут она уже не работает ... Как проклятый ищешь её на другие винды, а тебе сообщают, что её перестали модернезировать со времён 2001 года, что делать ??? Я месяц сидел кряхтел над работой, пришёл сдавать работу, и выясняется что у крутого нет винды ХР, у него только ИТ, поскольку его внучатый-племянник по дедушкиной линии об этом прочитал в каком-нибудь УМНОМ учебнике по чайникостроению ... И я сижу и переписываю половино программы на СИ неизвеснт для чего и почему ... Хотя извесно почему, потому что был дурком и согласился использовать библиотеку ... Или тот же ком-порт ... Как я когда-то влетел с этим, пока не написал личный маленький модуль на асме для управлением компортом, работает как часы на совершенно любых виндовсах, ну за исключением 3.11, а предыдущий так глючил, проглатывая целые куски данных ... Конечно, никто же не тестировал, а что будет если без остановочно на 115200 отправить ему данные, ах как визуал начинает захлёбываться, особенно если отправить FF00FF00 ... Понятно, что одна винда другой пошлёт нормально, ведь у неё переходные процесс, и времени хватает на один бит, поэтому стоп-бит и старт бит у них не сливается, но стоит на асме отправить пачку, - держи винда любимый глюк. Я не знаю, может я за 15-ть лет так и не научился программировать на ПАСЕ или на СИ, но я признаюсь честно, никогда у меня такого не было на АСМЕ, как на ПиЦи так и на Speccy ... Глюки, конечно, были, но не такого плана ... Уж точно на диск всегда всё записывалось как по часам далеко не по-советским !!!

Кстати, по-поводу команд в таблице, помоему для компилятора, поиск команды такая мелочь, в сравнении с обработкой в строке математических функций или чего-то подобного. А если пытаешься совместить разные синтаксисы ALASM и TASM, то всё превращается ещё в больший ужас ... Но и вправду, я в этом случае выбрал АСМ и очень быстро добавляю новые возможности ... И когда я начинал писать этот АСМ, то подумал, что быстрее будет его сделать на высоком уровне, в итоге универсальность и гибкость самих команд на порядок ниже нежели поиск макросов, который был сразу написан на АСМе. Теперь я часто задумываюсь, что зря решил писать выделение команд на высоком уровне, хоть теперь это и асм стал, но из-за ограниченности или громосткости кода пришлось упростить поиск команд, а сделать новый вариант мне в лом, поскольку это нужно переписывать таблицу команд !

Я не знаю чем отличается методы с такими шарообразными названиями, но я не думаю, что можно ими решить например поиск:
...EQU ...=...+...
Где "..." любое значение с любыми символами, только певое "..." это переменная один, второе "...", соответственно второе ... На асме эта процедура выглядит в 20-40 строчек, не помню уже точно, но короткая и такая шустрая, что IF долше её исполнится ... Кроме всего у каждой команды есть условия, на переменные, и если это условие не совпало, то искать нужно дальше, а в условиях может быть что угодно, например проверка находится ли переменная в диапозоне от -127...+128, если нет, то ищем слежующую команду. Кстати и поиск у меня двухступенчатый, что в своё время ускорело процесс в десятки раз ...

Я извеняюсь перед любителями СИ, может я чего лишнего наговорил, не хотел обидеть, просто страшно становится, ведь мы когда-то начинали с ВАСИКА, и пришли к АСМу, неужто этот путь был напрасно, ведь СИ должен был встретиться по пути этой дороги а не в конце ...

Ещё раз извеняюсь, все мы творим но на разных инструментах, помоему это лучшее объяснение этим спорам, хотя я надеюсь что меня не воспримут как спорщика, а как человека, который высказал своё мнение ...

Robus
14.03.2005, 12:11
Я в VT делаю так:
k := 0;
for j := 0 to 14 do
Inc(k,Ind[j]);
CheckSum := k * 257 + 105


Это проделывается с первыми 15 байт заголовка. Оригинальную доку сходу не нашел, но вроде была ZX.SPECTRUM Echo FAQ.

... Ay_Emul: Silent now...

ВАУУУУУУУУУ ... k*257+105 ... Я бы точно до такого не догадался ... Теперь сделаю выгрузку в $, а заодно и при загрузке буду проверять, а то честно говоря, я игнорирую кнтр-сум !!! Спасибо !!!

И elf/2'у то же !!! =)

Robus
14.03.2005, 12:21
Не работает... Странный глюк, пишет Instruction not found или что-то в этом роде...
Слушай, оставь пожалуйста иходник с этим глюком ??? Наверное там дело совсем в другом ... О конфедециальности твоего исходника можешь не волноваться, и клянусь впервые исполнить то, что пишется лицензионных соглашениях, о том, что я должен через 30-ть дней удалить эту программу с компьютера !!! :D

lvd
14.03.2005, 12:49
кажется, я начинаю понимать людей, цепляющихся за асм (или за си без плюсов) вероятно, причины у них те же, что и у поклонникoв спектрума. поэтому и аргументация про поддержку программы и удобство кодирования их совершенно не трогают. они тихими долгими вечерами корпят над своими программами и им не нужно доделать к сроку. хм... мой спор с Proteus похож на издевательство, как если бы пцшник предложил спектрумисту аналогичное соревнование (так что я извиняюсь). а наши попытки переубедить этих людей сами знаете на что похожи

Да вот собственно и я о том же - если мне надо накатать какую-нить тулзу для амми или пц - я возьму цэ, а если скажем 4к интро - то асм! =)



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

Эээ - речь идёт о поиске строчки-имени команды в массиве/списке? Дык сделать хешь-таблицу на 256 входов - уже ускорение в 256 раз будет - с тем же линейным поиском. А если ещё пихать новые команды не в список, а в бинарное дерево, то и поиск по нему ещё быстрее будет. Балансировку на первый раз можно не делать - в предположении что хешь-функция 'хорошая'. Это к вопросу си-асм, такое я сам на сях делал (когда надо было за 3 дня написать асм для 51ых =).

elf/2
14.03.2005, 13:11
Вообще-то, признаюсь, большего неудобства нежели в СИ с любыми плюсами я не испытывал ... Наверное самое лучшее, что могли придумать это паскаль, не считая ВАСИКА, конечно !

Роб, а какая разница на каком языке писать? язык лучше выбирать в зависимости от задачи. обработка строк - perl, dhtml - javascript, что-то маленькое и максимально быстрое - асм. а спор между любителями c/c++ и pascal - это наверное навсегда :)


Это с точки удобства программирования. Просто я умудрился на СИ написать несколько программ, и заметил тенденцию, что писать их нужно как можно проще, не стараясь использовать готовые библиотеки. Поскольку при всей своей мулти-платформинности СИ не имеет всех библиотек и в любом случае перенося программу в другую среду приходится её править !

линкуйся статиком или носи с собой dll. хотя это никакого отношения к си не имеет. мне почему-то кажется что подобные проблемы могут быть на любом языке.


Но да же если стать извращенцем, а это можно сделать и на асме, и писать всё простейшими командами, то и тут есть подводные камни. На микроконтроллерах я не один раз с этим сталкивался. Вот не хочет он 37-мой IF исполнять ... Что мне делать ??? Я не могу полезть и так просто переписать кусок компилятора. Но если у меня есть асм, я просто эту проблему обойду ... Да, - я затрачу в три раза больше времени, но я добьюсь успеха. Получается, для качественной работы с СИ мне нужно быть асом использования команд, не использовать больше двух сравнений в IF, следить за тем что бы во вложенном цикле небыло вложенных циклов больше чем 10-ть штук, зачем ???

описанное выше - проблема компилятора. вполне допускаю что нет хорошего компилятора си для микроконтроллеров


Я не знаю чем отличается методы с такими шарообразными названиями, но я не думаю, что можно ими решить например поиск:
...EQU ...=...+...
Где "..." любое значение с любыми символами, только певое "..." это переменная один, второе "...", соответственно второе ... На асме эта процедура выглядит в 20-40 строчек, не помню уже точно, но короткая и такая шустрая, что IF долше её исполнится ... Кроме всего у каждой команды есть условия, на переменные, и если это условие не совпало, то искать нужно дальше, а в условиях может быть что угодно, например проверка находится ли переменная в диапозоне от -127...+128, если нет, то ищем слежующую команду. Кстати и поиск у меня двухступенчатый, что в своё время ускорело процесс в десятки раз ...

а может быть стоило посмотреть на LEX или YACC? вообще народ довольно давно работает над решением задачи синтаксического анализатора, почему бы не использовать готовые наработки?

Shadow Maker
14.03.2005, 13:25
А по-поводу $, так для этого всё готово, но я не мог разобраться с контрольной суммой, читать-то я их читаю, но записывать нужно подсчитать контрольную сумму, а она там какая-то непонятная, и не XOR и не ADD+ADDR ... Так я когда-то и плюнул ...
http://www.nvg.ntnu.no/sinclair/faq/fileform.html#HOBETA


Всё, что обещал врё реализовано !!! За исключением листинга ... У меня такой вопрос, а что это так важно ???
На тот момент не были реализованы LD (IX+s),#n, до сих пор не убит баг с длинной строкой (когда DB больше 36 штук), и нету листинга, что крайне важно, в основном потому, что компилер у тебя до сих пор не избавле от всех глюков - и для поиска их я сначала ассемблирую, а потом сравниваю файлы - это удобно. И во время самого написания программы тоже очень удобно посмотреть, где и что находится. Так что листинг обязательно нужен, как и полный список ошибок, чтобы в файл выводился.


Да, а как там по поводу LD (IX+s),#n?
Все компилится... LD (IX),#7, LD (IX+3),4... Нормально все.


Еще хотелось бы аналоги DB/DW - DEFB/DEFW, но это я и сам в CMD дописать в состоянии ;) ;) ;)
Все это есть.


Еще бы хотелось савиться в хобету ($B/$C)
Зачем? Все равно ты отлаживаешь я больше чем уверен в Unreal Speccy. Ставишь автозапуск на .trd и радуешься жизни. Хобету ты так не запустишь, придется сначала делать .trd или .scl и туда перекидывать... Оно тебе надо?


А вообще - пересел на SjAsmPlus. Даже код почти переделывать не пришлось...
Вообще, в последние 2 недели мы наблюдаем стремительное развитие обеих ассемблеров :) Это не может не радовать.

Robus
14.03.2005, 15:42
У меня появился заказ, а это на сутки минимум ... Должен работать ... Хотелось бы узнать в отвлечении от темы, я тут скачал последнюю версию UnrealSpeccy 27в, она говорит мне что OS Not Support !!! SMT, это что ??? Может я не так настроил ??? И ещё, может на досуге сделаешь автоматическое добавление в диск А: имейджа из командной строки ... А то я частенько работаю сразу над двумя-тремя проектами, иногда так нужно !?!

Листинг и исправление багов на послезавтра !!! Удачи вам и мне то же не помешает ... Единственное, чего не хочу - ехать в ЛасВегас, там столько умолешённых, и все с шарообразными глазами, а ещё у них сеть на 150 вольт, правда есть и на 220, но их техники отличаются, один завёт другого, что бы тот протянул удленитель, тот который отвечает за 150 вольт, - тянет своё, а тот который за 220, - свою. Хех, дикий народ ...

Shadow Maker
14.03.2005, 17:34
Вопросы про Unreal задавать автору лучше всего в разделе Эмуляторы (http://zx.pk.ru/forumdisplay.php?f=8), в теме про Unreal... их там даже не одна.

Shadow Maker
15.03.2005, 11:42
Именно, все вопросы по Эмуляторам обсуждать в Эмуляторах!

Как тока Роб прочитаешь, чего тебе там SMT понаписал, весь оффтоп удалю, думаю никто не обидится.

Robus
16.03.2005, 01:25
Именно, все вопросы по Эмуляторам обсуждать в Эмуляторах!

Как тока Роб прочитаешь, чего тебе там SMT понаписал, весь оффтоп удалю, думаю никто не обидится.

Ок ... Почитал ...

Сейчас подготовлю новую версию, в которой есть листинг компиляции и проверка на переполнение строки !!!

Robus
16.03.2005, 01:58
Ну вот ... Очередная версия ... Добавил команду OpenListFile, после неё вся информация о компиляции будет писаться в файл ... Не знаю, может не очень удобно данные будут там расположены, но надеюсь, что удобно ... Там два параметра, второй сейчас игнорируется ... Я его оставил на случай разных взглядов о листинге ... Кстати, в листин отгружаются все найденные ошибки !!! И сделана проверка на переполнение длины строки !!! Ну и локальные метки то же реализованы, кстати, там автоматом получаются и локальные макросы !!! Если вам нужно вытащить метку в макросе из другого макроса, то перед меткой поставьие точку, и укажите полный путь ко всем локальным вложениям !!!

---------EXAM-------
OpenListFile "filename.lst",0
---------------------

Качайте, пользуйтесь, всегда с рад Вам !!!

http://www.entire.nm.ru/coding/asam.zip

Robus
16.03.2005, 02:01
Не работает... Странный глюк, пишет Instruction not found или что-то в этом роде...

У меня появилась идея ... Может этот глюк из-за кода табуляции ... Хотя я отчётливо помню, что исправлял его, но: - "кто его знает, о чём он мечтает" ...

Robus
16.03.2005, 14:26
Тут в прошлой версии был глюк, если не отключить сохранение в листинг, то ошыбки выдаёт ... Вот новый вариант, более исправленный !!!

http://www.entire.nm.ru/coding/asam.zip

Robus
12.04.2005, 02:50
Очередная исправленная версия, кто хочет, удачи ... =)

http://www.entire.nm.ru/coding/asam.zip

fishka
18.04.2005, 16:25
Robus, сори, оффтоп, но судя по постам человек (Proteus) знает методы упаковки различных файлов. Поэтому вопрос к нему тут или может ты знаешь чего нибуть по этому поводу?

2 Proteus
Не подскажешь, как можно узнать чем запакован ELF бинарник? Можеть есть какие анализаторы или просто по какому нибуть признаку?
Помоги плиз разобраться - очень надо. За мной не заржавеет.
Спасиб!


Moderatorial: Фишка, пиши им в приват и не засоряй тему, ага? Не надо засорять тему оффтопом! И соответственно вы (Робус, Протеус, etc.) тоже в приват отвечайте. Dixi.

Robus
06.05.2005, 07:03
Супер-гига-мега исправленная версия ... Было парочку ошибок, например если сделать смещение адресса PHASE / UNPHASE, то любая команда BIT, SET и т.д., не верно компилировалась ...

Качайте: http://entire.nm.ru/coding/asam.zip

Недавно капался в словаре, и был очень огарчён, оказывается слово "компилировать" означает - использовать труд другого человека, чаще всего это слово используется в критике произведений. Ну а "компилятор" это человек, который использовал чей-то труд ... Вот так вот, сколько программировал а в итоге сам, получается, ничего не написал ... ХЕХ ... =(

acidrain
03.06.2005, 11:49
А скажи, реально ли перекомпилировать сие чудо под 186 проц (или 86), а то в PocketDos'е не пускается, а охота "на коленках" кодить =)

Robus
03.06.2005, 12:42
А скажи, реально ли перекомпилировать сие чудо под 186 проц (или 86), а то в PocketDos'е не пускается, а охота "на коленках" кодить =)

Ох ... Нет, это не реально ... Я ещё в 94-ом году не понимал зачем люди поддерживают 086, как и 286 ... Реальная польза от Intel'а пошла с 386-ого, до этого этот процессор вообще бесполезная консервная банка ... Кроме всего в язык встроенный эмулятор, он написан доп 386-ой, да и сам компилятор требует не меньше чем 386, поскольку там очень много процедур написаны на АСМЕ !!! Так что прошу прощение !!! Хотя, конечно, можно было бы извратиться и переписать весь язык на IF'ы и FOR'ы, но это так много времени займёт ... На это тему есть CJASM, попроси перекомпилировать его, он как раз написан на ИФАХ (СИ) ... В этом форуме о нём много говорят ...

А сколько процентов POCKET'ов со 186'ым ??? Поскольку мы год назад хотели делать на внутреннастях от Poket'а прибор, но потом отказались из-за постоянной модернизации и удишевлении техники, что приводило к нестабильности ... Но я видел Poket'ы с 386'ыми !!!

Shiru
03.06.2005, 13:26
А сколько процентов POCKET'ов со 186'ым ??? Поскольку мы год назад хотели делать на внутреннастях от Poket'а прибор, но потом отказались из-за постоянной модернизации и удишевлении техники, что приводило к нестабильности ... Но я видел Poket'ы с 386'ыми !!!
Не бредь, плиз. x86 процессоры в КПК вообще не используются. Речь выше шла о PocketDOS - эмуляторе 8086/80186 машины на обычном PocketPC.

acidrain
07.06.2005, 12:29
А сколько процентов POCKET'ов со 186'ым ???
0% =) Эмулятор доса PocketDos (он то и поддерживает 186 =) ), есть еще dosbox (он лучше, на нем даже вынь до 95-го пускается), но на моем покетпц 2002 не идет =(

acidrain
07.06.2005, 12:33
машины на обычном PocketPC.
Точнее на обычном риске (армы, мипсы, xscale ипр.) У меня х-скале на 400 мгц

Dexus
08.08.2005, 23:01
Есть ASAM by Robus и sjAsm by имя какое-то непроизносимое и Апри
sjAsm не умеет делать forward reference (как и практически все кросс-асмы, а я привык к tasm)
а ASAM что-то вообще никакого списка ошибок не дает. неясно вообще в чем проблема. то ли импорт не пашет, то ли метка не так написана. то ли ошибка где. в общем я так и не смог на нем откомпилить многофайловый проект.
А тормозит он оп причине того что список инструкций весь внешний (в файле). Конечно - это клево, но вообще наверно можно было бы это дело ускорить (байт-компилить как-нибудь этот cmd файл, например)..

А про Апри не знаю.

Robus
09.08.2005, 04:21
sjAsm не умеет делать forward reference (как и практически все кросс-асмы, а я привык к tasm)
а ASAM что-то вообще никакого списка ошибок не дает. неясно вообще в чем проблема. то ли импорт не пашет, то ли метка не так написана. то ли ошибка где. в общем я так и не смог на нем откомпилить многофайловый проект.
А тормозит он оп причине того что список инструкций весь внешний (в файле). Конечно - это клево, но вообще наверно можно было бы это дело ускорить (байт-компилить как-нибудь этот cmd файл, например)..

А про Апри не знаю.

Что не то ??? Ошибки он выдаёт, если они есть !!! Может ошибок нет !!! А все файлы должны быть просто в текстовом виде !!! Сам TASM, который BY RST, хранил текст в своём личном, запакованном виде, и, конечно, я не делал импорт таких файлов !!! Многофайловый проект требует всего-то команды INCLUDE "xxxx.xxx", но если бы что-то было не так написано, то он обязательно выдал бы сообщение об ошибке !!! Пришли мне на мыло то, что не компилится, наверное что-то банальное !!!

А тормозит он не из-за cmd, кстати, его можно внедрить прямо в exe'шник, но из-за того, что я его постоянно дополняю, я этого пока не сделал. Он тормозит из-за того, что я некоторые вещи написал не на ASM'е, просто нужно было по-скорее доделать его для моей работы, и подумал, что на языке высокого уровня будет быстрее, оказалось и хуже и дольше ... Но очень скоро я его обязательно турбирую !!! =)

Кстати, в конце компилируемого блока можно поставить такую команду - SaveLabels "xxxx.txt", куда он сохранит все метки, которые были при компиляции и да же сообщит использовали-ли их, или они просто занимали место в тексте !!!

Если есть вопросы, напиши мне на [email protected] !!!

Shiru
09.08.2005, 07:07
Он тормозит из-за того, что я некоторые вещи написал не на ASM'е

Robus как всегда, в своём репертуаре. Свято верит в силу низкоуровневой оптимизации, и ничего не хочет знать про алгоритмическую;) А ведь другие, более быстрые ассемблеры, не на ассме написаны... Вот-же засада, да?:)

Dexus
09.08.2005, 07:39
Тем не менее 3хпроходных кросс-асмов я больше не видел, у которых можно код подгонять по "нижней" границе, и при этом иметь достаточно гибкие "выражения".

Но факт, что низкоуровневой оптимизацией надо заниматься в последнюю очередь, когда алгоритмически уже ничего не сделаешь.
На PC компиляторы (сишные) и так оптимизируют _очень_ неплохо. И смысла всовываться со своим асмом особо нету. Единственный смысл был вторгаться в высокоуровневый язык со своими вставками - это в паскале. Не редко это был единственный способ. Но ИМХО асм - не тот случай. Спектрумовский подход тут "не катит".

Dexus
09.08.2005, 07:58
Robus
Откомпилил-таки.
проблема была именно в INCLUDE
он почему-то на отсутствие файла не ругался (а ругался на отсутствие переменной которая должна в этом файле определяться)... и когда перед инклудом стояла куча пробелов - компилер его вообще как метку воспринимал, а не как директиву.
На все ошибки один ответ: "ERROR ... Label Not Found Or Instruction Error"
сругнулся на строчку


KEYNUM DEFM "0123456789abcdef"

хоть и поменял на


KEYNUM DS "0123456789abcdef"

все равно ругается.
Потом еще небольшая проблема была с IXH/IXL (у Вас - XH/XL) и написанием "SLL" для "SLI".

P.S.: Пишу тут, потому как Ваша личка переполнена.

Shadow Maker
09.08.2005, 12:44
Robus
Откомпилил-таки.
проблема была именно в INCLUDE
он почему-то на отсутствие файла не ругался (а ругался на отсутствие переменной которая должна в этом файле определяться)... и когда перед инклудом стояла куча пробелов - компилер его вообще как метку воспринимал, а не как директиву.
На все ошибки один ответ: "ERROR ... Label Not Found Or Instruction Error"
сругнулся на строчку


KEYNUM DEFM "0123456789abcdef"

хоть и поменял на


KEYNUM DS "0123456789abcdef"

все равно ругается.
Потом еще небольшая проблема была с IXH/IXL (у Вас - XH/XL) и написанием "SLL" для "SLI".

P.S.: Пишу тут, потому как Ваша личка переполнена.
DS???? Почему DS???? Может все такие DB, а не DS? А по поводу команд - там же список этих самых команд внешний, сам же писал. Возьми да и поправь в текстовом редакторе так, как тебе нравится. Там же все равно, даже какой нить VLEVOSDVIG вместо SLL написать можно :)

PS - На будущее. Все вопросы по ASAM задавайте в теме про ASAM, окей? Про ошибки и прочее компиляторов ассемблера пишите в темах про эти самые компиляторы ассемблера, благо на каждый уже есть по здоровущей теме. Впредь подобные сообщения буду удалять или переносить.

Robus
10.08.2005, 23:45
Robus как всегда, в своём репертуаре. Свято верит в силу низкоуровневой оптимизации, и ничего не хочет знать про алгоритмическую;) А ведь другие, более быстрые ассемблеры, не на ассме написаны... Вот-же засада, да?:)

У меня более сложная "болезнь", я верю в алгоритм написанный на асме !!!
А по-поводу скорости, тут можно легко поспорить ... Задачи у асмов разные, например те же метки которые будут в будущем ... Кроме того есть асм BY RST, в котором всё что не команда считается меткой, так что напишешь:

LDIR
LIDR

Первое будет как команда, второе будет как метка, и ошибок не будет, за-то это универсально, и на такую ошибку я нарывался разве что в глубоком детстве ...

Просто я не хочу становиться в позу "ЗЮ", что бы программировать ... Язык должен быть гибким изначально, а не требовать от тебя каких-нибудь пробелов или написание маленькими буквами. Про тупость о метках, которые нужно регестрировать перед текстом программы я вообще молчу.

Есть такая штука как TASM на ПиЦи, который так же притормаживает, у него те же проблемы как с LIDR'ом ... Если ты знаешь уникальный способ АЛГОРИТМА компиляции, напиши асм под ZX, ведь это так просто ... Сравнить одну БИБЛИЙОТЕКУ с другой на СИ и по результату положить код той или иной команды ...

Я не занимаюсь осуждением каких-либо асмов, как и ВАШЕГО способа программирования, я просто делаю то чего ещё нет ...

А о DEFM, я как-то забыл ... И вправду была такая команда, нужно будет её наколдовать ... Хотя это тот же DB !!!

jim
26.05.2006, 23:23
что там с ASAM? проект закрыт?

Robus
27.05.2006, 10:55
что там с ASAM? проект закрыт?
Не в коем случае ... Он постоянно обновляется ... Просто народ не очень жаждит пользоваться ... Я всё пишу только на своём асме, другие просто не компилируют мои работы из-за логических недоработок ... Но вообще-то в текущей версии сделано почти всё, что можно придумать ... А что интересует ??? Буду рад разъяснить, добавит, показать, снять ... не снимать не буду =) ... Шутка ...

jim
19.06.2006, 01:47
хотелось бы юзабельности побольше

Robus
08.07.2006, 03:05
хотелось бы юзабельности побольше

Что значит юзабельнее ??? Текстового редактора я к нему не писал, поскольку это компилятор. А в остальном он как никогда юзабельный !!!

boo_boo
10.07.2006, 17:39
Но вообще-то в текущей версии сделано почти всё, что можно придумать ... А что интересует ??? Буду рад разъяснить, добавит, показать, снять ... не снимать не буду =) ... Шутка ...
имхо очень в жилу был бы "компилятор" текстовых таблиц с инструкциями в формат, который не надо пережевывать при запуске асма..
а если бы он (асм) еще под юниксами работал... :rolleyes:

Robus
10.07.2006, 23:18
имхо очень в жилу был бы "компилятор" текстовых таблиц с инструкциями в формат, который не надо пережевывать при запуске асма..
а если бы он (асм) еще под юниксами работал...

С юниксом есть проблема ... Я пользуюсь компилятором, которым компилируется компилятор (TMT-Pascal), который и так ворованный. Можно скомпилить под WIN и под OS/2, а юникс в следующей версии, которая стоит $300 да и ещё продаётся только в NEW-YORK'е ...

А вот таблицы не проблема ... Придумай формат таблиц или хотя бы какие-нибудь стандарты, например первый столбец всегда в таких-то координатах, и я сделаю. Кстати, в любой момент можно сделать отдельный EXE, который запустить прямо в тексте компилируемой программы. В этом EXE легко делается любая перекодировка таблиц, передать параметры так же просто прямо в компиляторе.

Robus
11.07.2006, 09:01
Тут малость глюки убраны, поэтому выкладываю последнюю версию.

Khampton
02.07.2007, 11:16
Тут малость глюки убраны, поэтому выкладываю последнюю версию.

Спасибо, Робус. :) Обновить не желаешь?

Robus
09.07.2007, 23:27
Спасибо, Робус. Обновить не желаешь?

Ден !!! Как приятно тебя читать !!! А версии перестал выкладывать, - не интересуются ... Только я и пишу в нём, в остальных асмах я не могу писать свои проекты, разве что ограничивая себя в свободе действий ...

Robus
11.07.2007, 01:19
Некоторые интересуются.. Только у них не получается ничего с первого раза :)

Разберёмся ... И всё получится ... =)


обозвал её flashline.az8 и сохранил в одну с компилером директорию, далее запускаю компилятор asam.exe flashline.az8 z80.cmd, а он в ответ:
ERROR ... File Not Found: flashline.az8

Да ... Тут мой маленький просчёт ... Размер названия файла привышает 8-мь символов ... Забыл сконвертировать ... На утро постараюсь выложить версию с этой добавкой ... Но если переименовать "flashline.az8" в "flashlin.az8", то всё заработает ...


И ещё.. У тебя в TEST.AZ8 в самом начале располагаются директивы
.ZX.Loader и .1, но вот в ASAM-RUS.TXT про них нет ни слова.. Кажется.. ПризнаЮсь - я читал невнимательно..
Ты уж извини, что так много вопросов, но у меня амплуа такое ;)

".ZX.Loader" это внутренний(в самой программе) макрос ... У меня всё что начинается с точки "." и заканчивается ".." это макросы. например:



;Сам макрос
.ZX.Loader
LD A,@.0
XOR @.1
..

; Итеперь используем ранее заданный макрос
ZX.Loader 123,210


А если в имени макроса первый символ есть числовое значение то считается что это повтор! например

.100
DB @.C-1
..

В памяти пропишется 0,1,2 ... 98,99 !!! Если вместо @.C написать @.c, то счётчик будет на еденицу меньше. Также вместо ".100", можно написать "REP 100", что будет индентично !!!

-----

А вот с длинным имененм файла я разберусь ... =)

Khampton
17.07.2007, 20:50
Исправленную версию в СТУДИЮ!

З.Ы.
Надо тебе Гифт налабать :) Пошленький какой-то... :) Хммм... Или подарить тебе часть из "ненаписанного" (No "MultiColor" Demo)?
Осталось вспомнить Таблицу Прерываний... Может пришлешь? (Вспоминать тяжко :) )

Robus
18.07.2007, 23:41
Исправленную версию в СТУДИЮ!

З.Ы.
Надо тебе Гифт налабать :) Пошленький какой-то... :) Хммм... Или подарить тебе часть из "ненаписанного" (No "MultiColor" Demo)?
Осталось вспомнить Таблицу Прерываний... Может пришлешь? (Вспоминать тяжко :) )

Вот, значит, последняя версия ... Для ZX’а тем практически ничего не изменилось. Лишь добавлено компрессия в математическую компиляцию. Я её использую для программирования микроконтроллеров, что бы легко сопрягать математику с ассемблером. Например:

LET A=((A+B)/C+123.567/256)

Это откомпилируется в простые операции, раскрывая скобки. Как показывает практика, что бы написать ЛЮБЫЕ программы на микроконтроллерах, этого мне хватает, всё остальное я делю на асме.

Теперь INT’ы:



EQU $ASAM.PASS.ERROR=1 ;Количество пустых компиляций, для
;устронения вложенных меток в дважды
;запаковынном блоке или больше.




INCLUDE "speccy.az8" ;Маленький набор утилит.


ORG 40000
JMP START

OrgInt INT,INT ;Утилита из Speccy.az8, устанавливающая в ближайшем

START: DI
LD SP,$
LD A,INT.VEC
LD I,A
LD HL,INT
LD (INT.VecAddr),HL
IM 2
EI
JMP $

INT: PUSHA ;Прерывание
POPA
EI
RET


SaveLabels "less-007.txt" ;Для примера сохраним все мекти, которые были
;в проекте



Это же, прикреплено в LESS-007.zip, грузани и посмотри ... =)

Длинные имена файлов пока не делал, но мне кажется, что это не есть камень преткновения для CODEING’а на ZX’е ... =)

Robus
20.07.2007, 01:08
LD SP,$
Блин ... Налажал ... Как CALL'нёт на INT и как пушанёт в стек, вектор и сотрётся ... Вообщем в стек что-нибудь другое, например 40000 ... Это уже дело техники ...

Robus
22.01.2008, 12:39
Новые добавления.

1. Сделан 64-битовый математический блок. 10-ть знаков до и 10-ть знаков после запятой. Скорость мат-функций всего в два раза быстрее ВАСИКа. Не очень хорошё работает оптимезатор мат-функций, будет время доделаю. Пример



EQU $ASAM.PASS.ERROR=2
INCLUDE "asam-80.inc"

ORG 33025
MATH R_A-8*56+R_B/4 - 3*(SIN*R_B)
RET

VAR R_A=3
VAR R_B=-7

ASAM.MATH.INIT

Вообщем посчитает. Как вы уже поняли VAR откушает 8 байт памяти на числовую операцию. Можете не писать =??? и тогд туда автоматом пропишется 0. Совет, не резервируйте регистры с именем "A", этим вы замените все аккумуляторы на точку памяти.
Так же в мат-модуле есть внутренние регистры. Ежели вы использете хотя бы раз "MATH A=6553H.34", то под регистр "А" будет автоматически зарезервировано место.
Числовой формат: первые четыре байта это значение до запятой, последние четыре байта это значение после запятой.

2. Сделаны числовые метки. Допустим:


LAB EQU 213
POPIKLAB05 ;Как всегда кодировка винды не поддерживает нужные символы ...

В итоге мы получаем метку "POPIK00213"

3. Модернезирован макрос:


.IF (<>) THEN√
;ЧТО-то
..
.IF (<=) THEN√
;ЧТО-то
..
.IF (=>) THEN√
;ЧТО-то
..
.IF (<) THEN√
;ЧТО-то
..
.IF (>) THEN√
;ЧТО-то
..
.IF (=) THEN√
;ЧТО-то
..

Ну и теперь у вас есть ифы ... Компилятор будет искать любые вариации разделяя их жёсткими сепараторами из макросов. Как появится время опишу все главные комманды.

4. Сделаны метки с приоритетами:



.IF (=) THEN√
ASAM_INC_IFC
MATH (@.0)-(@.1)
JZ _ASAM_IF_ELSE$ASAM.ASAM.IFC03
..

.ELSE
EQUID _ASAM_IF_ELSE$ASAM.ASAM.IFC03[1]=$
..

.END IF
EQUID _ASAM_IF_ELSE$ASAM.ASAM.IFC03[2]=$
_ASAM_IF_END$ASAM.ASAM.IFC03[2]
ASAM_DEC_IFC
..


Как вы заметили оператор EQUID резервирует метку _ASAM_IF_ELSE001. В квадратных скобках указывается приоритет. В "ELSE" он имеет 1, в "END IF" он 2. Ежели вы напишите:


IF 7=7 THEN
LD A,1
END IF

В данном случае "ELSE" не учавствует в коде, и автоматически _ASAM_IF_ELSE001 будет равен _ASAM_IF_END001 и указывать на конец IF'а. Если:


IF 7=7 THEN
LD A,1
ELSE
LD A,0
END IF

То в данном случае _ASAM_IF_ELSE001 будет компилятором встречаться дважды но в "END IF" будет иметь приоритет 2 и игнорироваться.

Имея фантазию вы легко сделаете любые операторы.

Shadow Maker
22.01.2008, 13:08
Роб, респект! Я уж подумал ты на свой компилятор забил давно ;)

Robus
22.01.2008, 13:30
Роб, респект! Я уж подумал ты на свой компилятор забил давно
Поверьте, то что я сейчас пишу тут это результат новогодних праздников !!! Эта работа просто ужас ... Я пол-года ничего кроме работы не вижу ... По три четыре поекта одновеменно пишу, к домашнему компьютеру вообще не подхожу ...

Зато есть очень серьёзные перспективы в плане Speccy. Возможно скоро будет новый Speccy с новой ОСью, если, конечно, наши еврейские партнёры не обломаюся ... Хоть этот проект и ради меня запустии в жизнь, и прибыли компании он не принесёт, но всё же ...

Higgins
29.12.2010, 23:29
Набросал пару строк:


ORG #10000-(AFTER-BEFORE)
BEFORE:
DB "ABC"
.IF ($ > #8000) THEN
DB "X"
..
DB "DEF"
AFTER:
SaveLabels "labels.txt"

Вопрос автору: оно так и задумывалось, чтобы вот такой код транслировался в шесть байтов "ABCDEF", то есть без символа "X" посередине? :)

* * *

UPDATE: Гм, впечатление такое, будто у меня .IF не работает вообще. Имеем код:


ORG #F000
BEFORE:
DB "ABC"
.IF 0<1 THEN
DB "X"
.ELSE
DB "YY"
.END IF
DB "DEF"
AFTER:
SaveLabels "labels.txt"

Получаем для меток BEFORE и AFTER значения #F000 и #F009 соответственно. Гм... :)

Robus
30.12.2010, 13:59
UPDATE: Гм, впечатление такое, будто у меня .IF не работает вообще. Имеем код:
Ммм ... Как бы более правильно объяснить ... Поскольку практически никто не пользовался ASAM'ом, я не особо расписывал макросы ...

Смотри: "." и ".." Это описание макроса или цикла ...
Всё, что идёт дальше это не особо но умный макрос, который не понимает IF. В данном случае ты попытался компилятору разъяснить что хочешь создать макрос. Когда я расписывал пример некого подобия бейсика, то я приводил пример макросов, которые потом превращается в код, причём код не оптимизированный.

Как я понял ты хочешь получить компиляцию отдельных строк по условию. Я в компиляторе не ставил задачи реализовывать условия, потому что для этого я в компилятор встроил эмулятор ZX-SPECTRUM'а, без видео, конечно.

Если тебя устраивает простой флаг, да нет, то можно сделать так:


FLAG EQU 1
.FLAG
DB "TRUE"
..
.1-FLAG
DB "FALSE"
..


Если тебе нужно более сложные операции, то их нужно описать, например:


;====================
;Это макрос описывающий сравнение входящего переметра A с B
;====================
.IF (<) THEN√
ORG 0
EQU $ZX.R.PC=16384
LD A,@.0 ;Параметр макроса А
CP @.1 ;Параметр макроса В
RLA
AND 1
LD C,A ;Запихиваем с ВС результат сравнения
LD B,0
EQU $ZX.R.Break=$+$ZX.R.PC
MoveMemAZ $ZX.R.PC,$ZX.R.PC,0,$-$ZX.R.PC ;Копируем из памяти компилятора в память эмулятора откомпилированный блок
RunEmulZX ;Запускаем откомпилированный код
ORG @.
EQU IF_FLAG=$ZX.r.BC ;Результат эмулятора ВС передаём во флаг
..

;========================
; Теперь сама программа которая использует макрос, который в совю очередь использует эмулятор
;========================
IF_FLAG EQU 0

ORG #8000
START
IF (7<6) THEN
.IF_FLAG
DB "A < B"
..
.1-IF_FLAG
DB "A > B"
..
SaveBIN "TEST.BIN",START,$-START


То есть компилятор рассчитан на то, что программист сам себе создаст любые макросы, которые он считает удобными. Практика показывает, что мне хватает простого флага 0/1 ... Более сложные операции тянут за собой целые системы. Например я пишу текст для скролла и у меня есть шрифт. Зачем мне в памяти хранить графику для буквы, которая никогда не появится на экране ? Я пишу программу которая анализирует весь текст или тексты, и составляет таблицу. И пишу вторую программу которая по таблице сохраняет нужную графику каждой буквы. Далее для компилятора я использую команду SetTextXOR, в которой говорю, что далее всё что будет заключено в кавычки, нужно перекодировать. Например код буквы "A" станет каким-то кодом, который будет в таблице. И ву-а-ля, минимум памяти, и текст компактный.

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

Сразу хочу предупредить ... RunEmulZX запускает эмулятор не взирая на то, все ли метки собрал компилятор ... Данный пример макроса был написан так, что бы входные параметры требовали только одного прохода. Если код внутри макроса сложный, то нужно использовать RunEmulZXne, то есть без ошибок до данного места. Но опять таки это не выгодно и наилучший способ предварительно, в отдельном файле создать все нужные макросы с внутренними кодами, записать их в отдельный файл. А уже при использовании макросов в программе грузить файл непосредственно в память эмулятора и запускать ... Вообщем я на этом написал кучу boot-loader'ов, скроллов, компрессоров и даже ОС для Speccy. Например в ОСи у меня создаются образы дисков для игры, в которую впихиваются тонны картинок, кода, музыки и лежат линейно, байт за байтом по образам. А в коде у меня это выглядит так:


LoadInData 'GFX\entire.scr', 18432
LD HL,20480
LD DE,22528+256
LD BC,256
LDIR
LD B,50*2
HALT
DJNZ $-1
LoadInData 'GFX\rob.scr', 16384
LD B,50*2
HALT
DJNZ $-1
LoadInData 'GFX\mellona.scr', 16384
LD B,50*2
HALT
DJNZ $-1

Макросы ОСи сами добавляют нужный файл в образ, сами пакуют их и сами раздают ID каждому файлу. И в итоге в коде после раскрытия макроса это получается так:


LD HL,03765H ;ID файла
LD DE,16384 ;адрес куда грузить данный
CALL DOS.LOAD.FILEID

Этот ID мне не известен и не нужен, мне главное в тексте видеть, что я гружу. Так же можно создать таблицы из нужных нам файлов и грузить их по номеру ... Для этого я и создавал ASAM, для того, что бы одним нажатием у тебя собирался полностью рабочий проект.

В одном из постов, ААА написал, что большинство времени уходит на допиливание лоадера. От этого я давно ушёл, лодаер LATRAX'а, например, трогался только один раз, где-то в августе. Если бы у меня хватило времени на загрузочную картинку, то тронул бы два раза.

Higgins
30.12.2010, 14:17
Если тебя устраивает простой флаг, да нет, то можно сделать так:

Мне, наверное, понадобится еще посидеть над тем, что ты написал. :) Что-то плохо понимаю что к чему, особенно причем тут эмулятор. :)

Задача вот какая. Пусть есть две строки текста:

DB "ABC"
DB "DEF"

Мне нужно, чтобы в случае, если значение $ после первой строки больше #8000, между этими двумя строками появлялась еще одна строка:

DB "X"

Как это можно оформить?

* * *

Снова UPDATE: теперь понимаю, причем здесь эмулятор. :)

Возникают следующие вопросы:

1) Надо понимать так, что весь макропроцессор написан через вызовы эмулятора? То есть, непосредственно языком поддерживается только сама возможность определения и использования макросов, но не их раскрытия?

2) Эти вызовы эмулятора происходят на каждом проходе? Если да, то с какими значениями меток, в том числе $, если раскрытие макроса зависит от этих значений?

Скажем, если изменить немного твой код:

ORG #8000-(END-START)
START
IF ($=#8000-2) THEN
.IF_FLAG
DB "X"
..
.1-IF_FLAG
DB "YY"
..
END
SaveBIN "TEST.BIN",START,$-START

Как в этом случае будут вычисляться значения меток? Или во время трансляции мы должны получить ошибку?

Вообще, что делает ASAM в случае циклических зависимостей по меткам т что считается и не считается им за циклическую зависимость?

Robus
30.12.2010, 14:44
Задача вот какая. Пусть есть две строки текста:


Мне нужно, чтобы в случае, если значение $ после первой строки больше #8000, между этими двумя строками появлялась еще одна строка:


Как это можно оформить?

Вот так:

ORG #7FFC
START DB "ABC"
.0+LOW($/32768)
DB "X"
..
DB "DEF"

Higgins
30.12.2010, 15:09
.0+LOW($/32768)

Ага, то есть, знаки операций сравнения "<" и ">" это часть определения макросов IF, я правильно понимаю? И именно по этой причине параметры макросов обозначаются этими странными значками? :)

То есть, сам ассемблер непосредственно сравнения и другие операции не поддерживает?

Robus
30.12.2010, 15:37
1) Надо понимать так, что весь макропроцессор написан через вызовы эмулятора? То есть, непосредственно языком поддерживается только сама возможность определения и использования макросов, но не их раскрытия?
Нет ... Макропроцессор написан как простоя подмена входных параметров нужными значениями. Именно поэтому нужно писать 0+LOW(xxx), что бы компиллер понял, что это не макрос а цикл, восприняв первый "0" как число. Вообщем макросы раскрываются только в виде подставляемых в них параметров. Простая замена, а уже потом компилятор разбирает это число или команда или ещё один макрос ...


2) Эти вызовы эмулятора происходят на каждом проходе? Если да, то с какими значениями меток, в том числе $, если раскрытие макроса зависит от этих значений?

Да, на каждом проходе ... Отличие только в окончании ne ... RunEmulZX запустит в любом случае, а RunEmulZXne, только если нет ошибок компиляции ...



Как в этом случае будут вычисляться значения меток? Или во время трансляции мы должны получить ошибку?
В этом случае будет зацикливание ... Что бы этого не было, нужно сделать так:

ORG #8006-(END-START)
START DB "ABC"
.0+LOW($/#8000)
DB "X"
..
DB "DEF"
EQU END=$
SaveBIN "TEST.BIN",START,END-START


Зацикливание будет только в случае адреса #8003. Поскольку длина кода будет меняться от адреса куда попадает "Х" !!!

Эта строчка: "EQU END=$", нужна, что бы метка END была удалена после первого прохода. Таким образом ты объясняешь компилятору, что эта метка точно используется в тексте и не нужно её контролировать на наличие использования. В таком случае не будет ошибки и не будет зацикливаний ...

---------- Post added at 14:29 ---------- Previous post was at 14:16 ----------


параметры макросов обозначаются этими странными значками?
Да - точно ... Я специально выбрал не использованный символ для входного параметра в макрос. А значёт вконце макроса (галочка в дос кодировке), эозначает, что всякие параметры далее запрещены, и если вдруг строчка вызываемая макрос их содердит, ты получишь ошибку. Так же можно создать макрос без значков и окончания. Тогда компилятор через запятую воспримет 10-ть значений макроса.

Например:


.HELLO
@.0
@.1
@.2
@.3
..
Далее вызываем макрос:
HELLO NOP, POP, LDIR


То есть компилятор первый параметр макроса поймёт как NOP, второй POР, третий LDIR, а четвёртый как пустая строчка. Конечно же в этом случае нужно помнить, что нельзя передать, например - "LD HL,16384", поскольку разделитель есть запятая ... Если нужно передавать более сложные параметры макроса, то лучше иначе его описать и придумать другие разделители.

---------- Post added at 14:37 ---------- Previous post was at 14:29 ----------


То есть, сам ассемблер непосредственно сравнения и другие операции не поддерживает?
Не поддерживает. Чтобы описать 100% IF, тебе нужно писать все вариации IF'ов ... Это не язык высокого уровня и вложенность не поддерживает. То есть в макрос нельзя передать раскрытый макрос прямым путём ! Нелзья сделать макрос ABS(A) и его передать в IF (ABS(A)<0). Отдельно нужно получить значение из ABS и отдельно его передать в IF !

Higgins
30.12.2010, 15:47
Зацикливание будет только в случае адреса #8003. Поскольку длина кода будет меняться от адреса куда попадает "Х" !!!

То есть ассемблер не выявляет циклических зависимостей, просто впадая в бесконечный цикл проходов, правильно?

Тогда такой вопрос: а как он определяет необходимость дополнительного прохода? Я имею в виду формальный критерий.

Ведь кроме случаев, когда подходящих значений меток нет (как, например, с ORG #8003-(END-START) выше), есть случаи, когда подходящих значений меток несколько. Я не знаю как это записать на ASAM, но схематично это может выглядеть так:


ORG #8008-(END-START)
START DB "ABC"
IF $ = #8000
DB "XX"
ELSE
DB "Y"
ENDIF
DB "DEF"
END


Будет ли в этом случае какое-нибудь указание от ассемблера на неоднозначность?

Robus
30.12.2010, 16:33
То есть ассемблер не выявляет циклических зависимостей, просто впадая в бесконечный цикл проходов, правильно?
Можно прописать предел циклов, сейчас не скажу, какая команда, прости, я её делал в 2002-ом году и забыл ... А с собой нет описания. Прервать можно ещё ESC ... Сейчас вроде предел по проходам 64 или 128 ...



Тогда такой вопрос: а как он определяет необходимость дополнительного прохода?
Второй проход происходит тогда, когда адрес метки изменился в отношении к предыдущему проходу и при этом метка использовалась в коде. Повторный проход может быть ещё при экзотических командах ... Например "JZ", Если ты используешь "JZ", то компилятор сам будет выискивать где надо поставить "JR Z" или "JP Z". Тогда применяет другой метод, который сам за тебя определит нужное количество JR/JP, для минимального размера памяти ...



Ведь кроме случаев, когда подходящих значений меток нет (как, например, с ORG #8003-(END-START) выше), есть случаи, когда подходящих значений меток несколько. Я не знаю как это записать на ASAM, но схематично это может выглядеть так:
Записывать надо так:


ORG #8003-(END-START)
START DB "ABC"
EQU IF_FLAG=LOW($/#8000)
.IF_FLAG
DB "XX"
..
.1-IF_FLAG
DB "Y"
..
DB "DEF"
EQU END=$

Главное адресом не попадать на точку когда, который будет при каждом проходе END менять на 8003/8004.

А почему возникла именно такая задача ? Или просто попытка поймать глюк асма ? Поймать можно, - он не идеален ...

Higgins
30.12.2010, 17:12
Можно прописать предел циклов, сейчас не скажу, какая команда, прости, я её делал в 2002-ом году и забыл ... А с собой нет описания. Прервать можно ещё ESC ... Сейчас вроде предел по проходам 64 или 128 ...

Да нет, не стоит. Здесь вопрос именно в том, как устроено вычисление меток. Может быть, зацикливание это не не самый плохой вариант для такого кода. :)


А почему возникла именно такая задача ? Или просто попытка поймать глюк асма ?

В общем да, просто проверка на вшивость. :) К практике это имеет то отношение, что, с одной стороны, отказ от форвардных ссылок на метки в некоторых контекстах -- это серьезное ограничение, с другой стороны меньше всего хочется быть жертвой непринужденного буйства ассемблера при вычислении таких меток. :)

perestoronin
30.09.2013, 12:07
Вижу, что люди заинтересовались моим компилятором
Исходники его, если они не тайна, покажите пожалуйста, адаптирую под своё окружение (Gentoo Linux, gcc 4.8.1).

Hacker VBI
30.09.2013, 13:39
хочу скомпиленную под 64бита версию