1 Отредактировано USR (09-03-2017 02:36)

Тема: Ассемблер системы Школьница

Вопрос такой, существовали ли его более функциональные версии для Агат-9?

Я сейчас пользуюсь версией с ИКП, причем с моего диска тех времен.

Как по мне, нерационально там для "девятки" память используется.

Бинарник более 8КБ скомпилировать нельзя. Приходится компилировать по частям.

Текстового буфера хватает примерно на 1,5к строк. Это 16Кб где-то.

И в результате чтобы скомпилировать бинарник на 10Кб приходится делать вот так (причем два раза):

http://c2n.me/3Ig1w1Q.png

Может была какая-нибудь поздняя версия, более адаптированная к "девятке"?

2 Отредактировано Voldemar0 (10-04-2017 19:52)

Re: Ассемблер системы Школьница

все компилировали по частям, судя по сборочным файлам

я сам работал с ДОК-7, но меня вообще не устраивали эти ограничения и я сделал для него такой патч:

 ASC "   B HOPMAЛЬHOЙ KOHФИГУPAЦИИ PEДAKTИPУEMЫЙ TEKCT HAXOДИTCЯ B"
 ASC "AДPECAX C $3000 ПO $7FFF, A OБЪEKTHЫЙ ФAЙЛ ACCEMБЛEPA"
 ASC "KOMПИЛИPУETCЯ B AДPECA $8000 ПO $9DFF. T.E. ПAMЯTЬ ПOД TEKCT"
 ASC "ИMEET OБЪEM 80 БЛOKOB, A ПOД OБЪEKTHЫЙ ФAЙЛ - 30 БЛOKOB."
 ASC "   ECЛИ BЫ HAЖMETE KЛABИШУ 'Y', TO ПAMЯTЬ PEДAKTOPA CДBИHETCЯ"
 ASC "HA AДPECA C $1F00 ПO $55FF, A OБЪEKTHOГO ФAЙЛA C $5600 ПO $9DFF."
 ASC "   TAKИM OБPAЗOM BЫ БУДETE ИMETЬ PAЗMEP TEKCTOBOГO БУФEPA 55"
 ASC "БЛOKOB, A OБЪEKTHOГO ФAЙЛA - 72 БЛOKA."
 ASC "   OДHAKO, B ЭTOM CЛУЧAE OTЛAДЧИK БУДET УHИЧTOЖEH."
 DCI "   BЫ COГЛACHЫ HA ПEPEKOHФИГУPAЦИЮ (Y/N) ? "

Сейчас, как мне кажется, перспективнее попробовать ассемблер Громова. Он шел с последними версиями BTK. Но я его не пробовал, надо копаться.

3 Отредактировано Voldemar0 (10-04-2017 20:05)

Re: Ассемблер системы Школьница

                  BEST - ассемблер 5.0


   Ассемблер  предназначен  для использования профессиона-
льными программистами и имеет ряд преимуществ по сравнению
со  штатным  ассемблером,  имеющимся  в  комплекте системы
The BEST:

   - благодаря  улучшенной системе хранения меток скорость
     трансляции  возрасла от 2 раз на маленьких программах
     до 7 (!) раз на больших системах

   - операторы  условного  ассемблирования могут быть вло-
     женными.  Допускается до 255 уровней вложенности. Ка-
     ждый   уровень  должен  начинаться  с  команды  DO  и
     заканчиваться командой FIN

   - введены  локальные  метки. Локальной считается метка,
     имя которой начинается с точки ".". Область видимости
     метки - промежуток между двумя ближайшими глобальными
     метками.  Имена локальных меток в разных областях ви-
     димости могут повторяться:

            LABEL1 LDA $80
                   BEQ .10 ----+
                   LDX #3      | переход в пределах
                   BNE .20 --+ | области видимости
            .10    LDX #0  --|-+
            .20    STX $81 --+
            LABEL2 LDY #0
                   STY $82
            .10    INY     --+-+
                   BNE .10 --+ |
                   INC $82     |
                   BNE .10 ----+

                     Новые операции.

   - введена  возможность  использования отрицательных чи-
     сел.  Отрицательное  число  представляется в дополни-
     тельном коде. Так, команда

                   LDA #-3

     эквивалентна команде

                   LDA #$FD

   - введены  операции  "<"  (меньше),  ">" (больше) и "="
     (равно).  Сравнивается результат вычисления выражения
     слева  от  знака и число (метка, константа) справа от
     знака. Если условие соблюдается, то результатом будет
     единица,  иначе - ноль. Эти операции удобно применять
     в командах условного ассемблирования

   - введена  операция "?". Она аналогична операции "*" (в
     смысле EQU *), но выдает адрес текущей строки относи-
     тельно последнего ORG, игнорируя последующие LOCи:

                   ORG $2000
                   LOC $4000
             LABEL EQU ?

     В этом примере метке LABEL будет присвоен адрес $2000


                      Новые команды.

CHB (CHine Binary) 
     Позволяет  вставлять в объектный код заранее подгото-
     вленные  бинарные модули, например, таблицы или блоки
     спрайтов. Формат команды:

         <текст программы>
         [<метка>] CHB <имя файла типа B>
         <продолжение программы>

     В  этом  примере по адресу <метка> будет вставлен би-
     нарный файл <имя файла>.

DFH
     Позволяет  вводить шестнадцатиричные числа. Цифры мо-
     гут  идти  друг  за другом без разделителей, тогда из
     каждой  пары цифр будет составлено число. Цифры могут
     идти  через разделители, тогда каждая цифра, отделен-
     ная  от остальных, будет считаться числом. Разделите-
     лем  может быть любой символ, кроме шестнадцатиричной
     цифры, в том числе и пробел. Писать комментарии после
     этой команды не рекомендуется.

LOC
     Ее действие аналогично команде ORG, но изменение базы
     ассемблирования не приводит к созданию нового файла.

ZERO и DZ
     Позволяют  оперировать  областями  данных  в  нулевой
     странице. Описание команд:

       ZERO <нач1>,<кон1>,[<нач2>,<кон2>,<нач3>,...]
         Команда выделяет области памяти в нулевой страни-
         це для хранения данных. Параметры:
           нач1 - начало первой области,
           кон1 - конец первой области (включительно),
           нач2 - начало второй области и т.д.        
         Все  параметры  должны находиться в пределах от 0
         до $FF. Области не могут пересекаться.

       <метка> DZ <длина>
         Команда  выделяет  область  памяти длиной <длина>
         в  одной  из объявленных областей и объявляет эту
         память  занятой. Выделяемая область памяти всегда
         непрерывна.  Сначала  заполняется  первая область
         данных,  затем  вторая и т.д. Если в первой обла-
         сти  места  нет,  то проверяется область 2 и т.д.
         Если  нет  места ни в одной из областей, выдается
         сообщение об ошибке.

     Пример:
         
             1         ZERO $80,$8F,$C0,$DF
             2 VAR1    DZ $06
             3 VAR2    DZ $12
             4 VAR3    DZ $08
             5 VAR4    DZ $0F

     В этом примере:
       1) объявлено 2 области данных: $80-$8F ($10 байт) и
          $C0-$DF ($20 байт);
       2) для VAR1 есть место в области 1, поэтому для нее
          выполнена команда VAR1 EQU $80;
       3) для VAR2 места в 1 области нет, и эта переменная
          размещается в области 2: VAR2 EQU $C0;
       4) для  VAR3  есть место в области 1, и выполняется
          операция VAR3 EQU $86;    
       5) для VAR4 нет места ни в одной из областей, и вы-
          дается сообщение об ошибке, хотя в сумме в обла-
          стях 1 и 2 памяти хватает.

BASE и DB
     Позволяют оперировать областями данных в основной па-
     мяти  (аналогично  ZERO  и DZ). Области BASE не могут
     находиться в нулевой странице.

DEFASC
     Позволяет  в  процессе ассемблирования перекодировать
     текст, заданный командами ASC и REV, а также в форма-
     те '<символ>', из кодов ASCII в произвольный код. Фо-
     рмат команды:

         DEFASC <имя файла>
         
     Файл  должен  содержать таблицу перекодировки и может
     иметь любой тип. Таблица строится так, чтобы в нужной
     кодовой позиции стоял требуемый символ или код ASCII.
     Из  файла  берутся  первые 256 байт без контроля типа
     файла.  В  связи  с  этим использование файлов типа B
     нежелательно.

ASZ
     Аналогична  команде  ASC, но в конец строки автомати-
     чески добавляется 0.

PROJECT
     Эта  команда  объявляет текущий файл программы "сбор-
     щиком".  Если после такой команды в тексте встретится
     команда CHN, то при загрузке следующего модуля файл -
     сборщик  сохранится  в  памяти,  что  позволит быстро
     вернуться  к  нему после загруженного CHN. В качестве
     сборщиков рекомендуется использовать маленькие модули
     с большим количеством CHN-ов.

   Ассемблер  оформлен в виде резидентной программы и пре-
дназначен  для работы в среде The BEST версий не ниже 5.0.
Программа  имеет  встроенную подсказку. Чтобы получить ее,
нужно просто ввести команду T без параметров.


                                 Автор доработок  С.Громов

                                         (C) 1994 USN Ltd.

PS Я не в курсе, что за "...штатным  ассемблером,  имеющимся  в  комплекте системы
The BEST..."

Но подозреваю, что это всё тот же ДОК:

Вашему вниманию предлагается система 'The Best' версии 5.3.
Комплект поставки на сентябрь 1993 г. содержит:
.......
ASM - автономный (и разрушающий систему в памяти) текстовый редактор+ассемблер+отладчик. Функционально практически 
совпадает с имеющимся в составе ИКП. Включение его в комплект поставки является мерой временной (до появления лучшего продукта). За качество программы авторы системы ответственности не несут.
ASM+ - ускоренный по сравнению с ASM резидентный ассемблер.

4 Отредактировано garnizon (26-04-2023 23:11)

Re: Ассемблер системы Школьница

Voldemar0 пишет:

Сейчас, как мне кажется, перспективнее попробовать ассемблер Громова.

Кстати, возможно что он ДОПОЗУ понимает.

http://agatcomp.ru/agat/Software/Language/AsmPlus.shtml

http://agatcomp.ru/agat/Software/Language/AsmPlus/ASMPLUS.png

5 Отредактировано Voldemar0 (10-04-2017 22:26)

Re: Ассемблер системы Школьница

В общем, тема эта уже давно крутится, но у меня времени нет с ней возиться -> предлагаю это сделать всем желающим.

В аттаче образ диска и несколько текстов. На образе The BEST 5.3 и коллекция ассемблеров.

Ассемблеры Громова:
    S  037  SYS.ASM   1.0                      
    S  037  EXP5      1.0                      
    S  038  SYS.ASM+  1.1                      
    S  038  ASM+      1.1                      
    S  038  SYS.ASM+  1.2                      
    S  039  SYS.ASM+  1.3                      
    T  011  ASM+.HLP  1.3                      
    S  039  SYS.ASM+  1.4x                    
    S  039  SYS.ASM+  1.4y                    
    S  039  ASM+      1.5                      
    S  040  ASM+      1.6                      
    S  042  SYS.ASM+  3.0                      
    T  022  ASM+.HLP  3.0                      
    T  008  ASM+.HLP  4.1                      
    S  044  SYS.ASM+  5.0                      
    T  027  ASM+.HLP  5.0                      

Доки на The BEST:
    T  021  SYSTEM.DOC.1                      
    T  081  SYSTEM.DOC.2                      
    T  074  SYSTEM.DOC.3                      
    T  048  SYSTEM.DOC.4                      
    T  056  SYSTEM.DOC.5                      
    T  078  SYSTEM.DOC.6                      
    T  078  SYSTEM.DOC.6  ver                  
    T  053  SYSTEM.DOC.7                      
    T  049  SYSTEM.APP.12                      
    T  041  SYSTEM.APP.345                    
    T  065  SYSTEM.APP.6                      
    T  036  SYSTEM.APP.7                      
    T  011  SYSTEM.APP.8                      
    T  021  SYSTEM.APP.9                      

Трассировщик:
    T  041  TRACE.DOC                      
    S  022  SYS.TRACE                      

Дизассемблеры:
    B  012  FIT                          
    S  017  DISA                          

Include-файлы The BEST:
    T  007  DOS.H                          
    T  031  SYSTEM.H                      
    T  006  IOSUB.H     

Мод ДОКА, версия X:
       BTK Dir: DOK106-108                      

Мод ДОКА, версия Y:
       BTK Dir: DOK129                        

Мод ДОКА, версия Z:
       BTK Dir: DOK109
                        
Пример простой проги, который я успешно собрал ассемблером Громова:
    T  002  TEST.ASM                      
    K  001  TEST.BIN

==========================

Читать маны на систему проще всего в dos33c2.
Кто ещё не в курсе, её берут здесь:
http://agatcomp.ru/Soft/dos33c2.shtml
Ссылка на скачивание внизу страницы.

==========================


Как запустить ассемблеры Громова:
После загрузки системы пишем:

[CAT

затем

[BOOT и пробегаем курсором по нужному S-файлу

Затем вводим команду:

T

и читаем подсказки

Чтобы скомпилировать мой пример пишем:

TTEST.ASM,TEST.BIN

И чтобы его запустить:

3000G

==========================

Для запуска ассемблеров из директорий DOK*
пишем, например:

[CD  DOK109
[RUN ASM                       

Выйти из них нельзя, только перезагрузкой (они выкидывают The BEST из памяти и варятся сами в собственном соку)

Учтите, что [CD модифицирует диск (меняя каталог) и эта модификация сохраняется.

Чтобы вернутся обратно к корню, пишем, внезапно, то же самое:

[CD  DOK109


==========================


Hi, people! Make love, not war!
Когда вы изучите эту подборку, я уже с интересом буду ждать рассказов о том, что в ней работает, а что - нет и что чем отличается. Эта информация крайне полезна для нашей коллекции программ.

Здесь нет дублей: все файлы имеют те или иные различия. Но насколько они существенны - я не знаю.

Post's attachments

Attachment icon asm-s.zip 340.19 kb, 383 downloads since 2017-04-10 

6 Отредактировано USR (11-04-2017 00:30)

Re: Ассемблер системы Школьница

Благодарю. А то у меня под Школьницей уже 5 или 6 файлов связанных и приходится их трижды компилировать, чтобы объектный получить...

А вообще, помню году так в 94-м собирался свой ассемблер сделать)) Текстовый редактор сделал под него, кстати.

http://c2n.me/3Jo5Cci.png

7

Re: Ассемблер системы Школьница

Voldemar0 пишет:

Стиль - стилем, но столько цифр помнить ....... :)
Для меня в школе самые нелюбимые занятия были: учить стихи наизусть и бегать по спортзалу :)

Ну вот видимо в юности помнил, а теперь в начале файла пишу себе подсказки))

Voldemar0 пишет:

А вы в юности понимали как устроены синтаксические анализаторы комстроки ?

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

На счет Линкера. Примерно понимаю зачем он нужен. Но вот у меня такая задача. Есть у меня в ассемблере Школьницы группа файлов А и группа файлов Б. Вместе не могу их компилировать - наступает переполнение таблицы меток. В группе А, меток 20 необходимых группе Б. В группе Б-меток 20 необходимых группе А. Файлы групп А и Б постоянно модифицируются. Как быть? Каждый раз править руками неохота.

Пока перенес все подпрограммы с перекрестными метками группы А, в самое начало, выделил в отдельный файл и этот файл присоединил к группе Б. Аналогично с группой Б. Не очень красивое решение, но другого не нашел.

Я так понимаю, Линкер мне не особо поможет...

8 Отредактировано Voldemar0 (16-02-2018 09:47)

Re: Ассемблер системы Школьница

USR пишет:

На счет Линкера. Примерно понимаю зачем он нужен. Но вот у меня такая задача. Есть у меня в ассемблере Школьницы группа файлов А и группа файлов Б. Вместе не могу их компилировать - наступает переполнение таблицы меток. В группе А, меток 20 необходимых группе Б. В группе Б-меток 20 необходимых группе А. Файлы групп А и Б постоянно модифицируются. Как быть? Каждый раз править руками неохота.

Пока перенес все подпрограммы с перекрестными метками группы А, в самое начало, выделил в отдельный файл и этот файл присоединил к группе Б. Аналогично с группой Б. Не очень красивое решение, но другого не нашел.

Я так понимаю, Линкер мне не особо поможет...

Почему ? Мне кажется (если верно понял вопрос), он как раз именно для решения такой задачи и существует.

Когда с линкером будет закончено (я там нашел ещё кой какие недочёты, не пойму пока - глюки или фичи или упрощения), я опубликую собранный диск со всеми советами и примерами по полному циклу компиляции крупных прог.
Туда же включу возможные пути обхода найденных глюков. Линкер просто пересоберу со своими правками. Проверять буду под ИКП-7 и ИКП-9.

-=-=

Ситуация сейчас вот какая: когда я писал проги в 90-е, это были, в основном, системные проги: редактор дисков, мощный копировщик файлов (парочка разных), текстовые редакторы, универсальные обучающие проги. Я старался в этих прогах по максимуму использовать существующее ПО и, в отличие от многих разработчиков агата, не включал в свой софт весь IOSub/RWTS/DOS, а делал только вызовы к существующему.

Я сделал всего две автономные проги: свою загружалку игрушек (причем и бейсиковых тоже) и файловый копировщик, использующий всё ОЗУ семёрки. Только эти две проги всё своё носят с собой (но даже этот копировщик всё равно был просто B-файлом и не требовал отдельного диска).

Всё это можно было писать просто на ассемблере + бейсике. В крайнем случае делить прогу на пару частей (например, драйвер дисковода и остальную логику - интерфейс между ними получался довольно простой).

Но сейчас я хотел запилить комплексный проект, который будет включать в себя минимум одну библиотеку, либо сидящую постоянно в ОЗУ либо вкомпиленную в каждую прогу (а самостоятельных прог будет штук 5-10). Причем интерфейс библиотеки довольно сложный. Это первый фактор. Второй фактор - эмулирующий отладчик, который теперь позволяет расковыривать любые баги агатовского софта за весьма короткое время. Поэтому я взялся капитально разбирать все завалы, что лежат на пути этой разработки.

В суперидеальном случае мне бы хотелось ещё сделать собственный компилятор кросс-ассемблера, который бы брал исходник в PC-формате и собирал на выходе B-FIL-файл. Причем добиться полной совместимости с ДОК-форматом исходных файлов. Но это когда нибудь потом.

9 Отредактировано Voldemar0 (18-02-2018 10:40)

Re: Ассемблер системы Школьница

Это не то баг, но то фича, но я пока не пойму, как её обойти.

  ИCXOДHЫЙ ФAЙЛ: Q
 ----- ИMЯ OБЪEKTHOГO ФAЙЛA: Q.KOД1
 2800:             1          ORG  $2800
 2800:             2          OBJ  $2800
 2800:             3

 ***** HEДOПУCTИMOE BЫPAЖEHИE B CTPOKE    4
 2800: 9D 20 00    4          LDA  (>PTR),X
 2803: A5 20       5          LDA  >PTR
 2805:             6
 0020:             7 PTR      EQU  $20
 2805:             8

 KOЛИЧECTBO OБHAPУЖEHЫX OШИБOK:    1


    20 PTR


    20 PTR

 OБHAPУЖEHЫ OШИБKИ:

 HEДOПУCTИMOE BЫPAЖEHИE B CTPOKE    4  Q

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

Это здорово мешает даже при сборке программы обычными CHN: т.е. если мы определим в библиотеке переменные, затем подключим библиотеку после основной программы, с точки зрения ассемблера получается следующее:

; прога
 LDA #0
 STA PARAM
 CHN LIB

; LIB
PARAM EQU $28
 LDA (PARAM),Y        <= возникает ошибка, такак как метка в основной программе
                                     ещё не определена и компилятор по дефолту
                                     считает её двухбайтовой.
                                     И даже явное указание ">PARAM" не спасает.

При компиляции же библиотеки отдельно от проги (тот же самый исходник!) - никаких проблем.

10 Отредактировано USR (18-02-2018 21:20)

Re: Ассемблер системы Школьница

***** HEДOПУCTИMOE BЫPAЖEHИE B CTPOKE    4
2800: 9D 20 00    4          LDA  (>PTR),X

Там регистр Y должен быть))

Ниже варианты когда все работает и когда не работает. Есть конечно неудобства...

В общем, внутри косвенной надо младший принудительно указывать типа того "LDA(>PARAM),Y" и тогда без разницы, где там эта метка...
ЗЫ. Как из эмулятора Одинцова текст копировать? Запарился скриншоты делать))

Post's attachments

t.png, 6.97 kb, 512 x 512
t.png 6.97 kb, 344 downloads since 2018-02-18 

t1.png, 5.15 kb, 512 x 512
t1.png 5.15 kb, 343 downloads since 2018-02-18 

t2.png, 5.12 kb, 512 x 512
t2.png 5.12 kb, 351 downloads since 2018-02-18 

t3.png, 5.09 kb, 512 x 512
t3.png 5.09 kb, 332 downloads since 2018-02-18 

t4.png, 6.92 kb, 512 x 512
t4.png 6.92 kb, 336 downloads since 2018-02-18 

11 Отредактировано Voldemar0 (19-02-2018 06:10)

Re: Ассемблер системы Школьница

Точно, с Y протупил :((


Интересно срабатывает вариант  "STA >PARAM". Жаль, что о логике такого поведения остаётся только догадываться
(т.е. вроде как если у переменной при первом вызове важен только младший байт, то старший, предполагается, будет нулём... А если потом встретится PARAM EQU 1234?).