Важная информация

User Tag List

Страница 12 из 13 ПерваяПервая ... 8910111213 ПоследняяПоследняя
Показано с 111 по 120 из 126

Тема: ASAM Compiler By Rob F. / Entire Group ...

  1. #111

    Регистрация
    04.03.2005
    Адрес
    Ukraine, Kiev
    Сообщений
    792
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    5 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Talking

    Цитата Сообщение от Khampton Посмотреть сообщение
    Исправленную версию в СТУДИЮ!

    З.Ы.
    Надо тебе Гифт налабать Пошленький какой-то... Хммм... Или подарить тебе часть из "ненаписанного" (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’е ... =)
    Вложения Вложения
    • Тип файла: zip Asam.zip (136.5 Кб, Просмотров: 295)
    • Тип файла: zip Less-007.zip (10.4 Кб, Просмотров: 307)
    AAA когда меня режут, я терплю, но когда дополняют, становится нестерпимо.

    Этот пользователь поблагодарил Robus за это полезное сообщение:

    Urguk(04.09.2021)

  2. #112

    Регистрация
    04.03.2005
    Адрес
    Ukraine, Kiev
    Сообщений
    792
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    5 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  3. #113

    Регистрация
    04.03.2005
    Адрес
    Ukraine, Kiev
    Сообщений
    792
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    5 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Talking ASAM Compiler v.001.025A ...

    Новые добавления.

    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 и игнорироваться.

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

  4. #114

    Регистрация
    01.03.2005
    Адрес
    Саранск
    Сообщений
    5,830
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    247
    Поблагодарили
    106 сообщений
    Mentioned
    5 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Роб, респект! Я уж подумал ты на свой компилятор забил давно
    Свирепый агрессивно-депрессивный мордовец!
    Не уверен - не напрягай!

    Не сдавайся. Дыши?

    Virtual TR-DOS

  5. #115

    Регистрация
    04.03.2005
    Адрес
    Ukraine, Kiev
    Сообщений
    792
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    5 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

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

  6. #116

    Регистрация
    03.05.2007
    Адрес
    St. Petersburg
    Сообщений
    297
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Набросал пару строк:
    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 соответственно. Гм...
    Последний раз редактировалось Higgins; 29.12.2010 в 23:56.
    Higgins ZX Spectrum Emulator 8.10 alpha 3 available
    Please write us to report a bug or request a feature.

  7. #117

    Регистрация
    04.03.2005
    Адрес
    Ukraine, Kiev
    Сообщений
    792
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    5 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Wink

    Цитата Сообщение от Higgins Посмотреть сообщение
    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'а, например, трогался только один раз, где-то в августе. Если бы у меня хватило времени на загрузочную картинку, то тронул бы два раза.
    AAA когда меня режут, я терплю, но когда дополняют, становится нестерпимо.

  8. #118

    Регистрация
    03.05.2007
    Адрес
    St. Petersburg
    Сообщений
    297
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Robus Посмотреть сообщение
    Если тебя устраивает простой флаг, да нет, то можно сделать так:
    Мне, наверное, понадобится еще посидеть над тем, что ты написал. Что-то плохо понимаю что к чему, особенно причем тут эмулятор.

    Задача вот какая. Пусть есть две строки текста:
    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 в случае циклических зависимостей по меткам т что считается и не считается им за циклическую зависимость?
    Последний раз редактировалось Higgins; 30.12.2010 в 14:41.
    Higgins ZX Spectrum Emulator 8.10 alpha 3 available
    Please write us to report a bug or request a feature.

  9. #119

    Регистрация
    04.03.2005
    Адрес
    Ukraine, Kiev
    Сообщений
    792
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    5 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Higgins Посмотреть сообщение
    Задача вот какая. Пусть есть две строки текста:


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


    Как это можно оформить?
    Вот так:
    Код:
            ORG #7FFC
    START   DB "ABC"
            .0+LOW($/32768)
             DB "X"
            ..
            DB "DEF"
    AAA когда меня режут, я терплю, но когда дополняют, становится нестерпимо.

  10. #120

    Регистрация
    03.05.2007
    Адрес
    St. Petersburg
    Сообщений
    297
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Robus Посмотреть сообщение
    .0+LOW($/32768)
    Ага, то есть, знаки операций сравнения "<" и ">" это часть определения макросов IF, я правильно понимаю? И именно по этой причине параметры макросов обозначаются этими странными значками?

    То есть, сам ассемблер непосредственно сравнения и другие операции не поддерживает?
    Higgins ZX Spectrum Emulator 8.10 alpha 3 available
    Please write us to report a bug or request a feature.

Страница 12 из 13 ПерваяПервая ... 8910111213 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Colorbok^Phantom Family Group
    от rajdee в разделе Графика
    Ответов: 12
    Последнее: 20.01.2011, 23:32
  2. C compiler
    от vitasam в разделе Программирование
    Ответов: 17
    Последнее: 25.08.2005, 16:42

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •