__ // / / - Т R A D Е // _ ПРЕДСТАВЛЯЕТ ____________________________________________________________ _______________ ___ ______ / ____/__ __/ / / __ | || / | | /| || || | __ | || / || | || || | _____ | | _/ | | || || | ______/ |_| ___/|_| _||_||_| ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒ Т U R В О A S S Е М В L Е R ▒▒▒▒ ▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒ Version 1.2 ▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ Данный текст является редакцией описа- ния STORM, помещенного в ZX-FORMAT #7. Редактор √ Размер текстового окна 40*20 символов каждое знакоместо 6*6 пикселей. √ Скроллинг текста во фрэйм! (1/50 сек) √ PAGE UP, PAGE DOWN в пять фреймов. √ Поиск в тысяче строк за секунду. √ Злой токенизированный формат текста. √ Размер текста (степень токенизации) XAS/1.3 ZXASM/2 ALASM/1.4 TASM4/1.5 √ Блочные операции над произвольно от- маркированными строками. (при выгруз- ке текста маркировка сохраняется). √ Длина строки в памяти до 40 символов. √ Проверка синтаксиса в процессе ввода. √ Авторазметка строки. √ Возможность сокращенного набора ( LD, JR не требуют ввода ). √ Функции SCROLL UP, SCROLL DOWN. √ Встроенные IMPORT FROM DISK и EXPORT ТО DISK (из/в текстовый формат). √ Полноценный строчный редактор √ Имеется возможность изменения цветов Компилятор √ Время компиляции XAS/1.5 ZXASM/3 ALASM/1.4 TASM4/4 (внимание! По вине какой-то чертов- щины в ZF #7 приведенные в нем дан- ные о времени неверны...) √ Любое количество операторов в строке. √ Любое количество операндов у одного оператора. √ Арифметика с соблюдением приоритетов. √ 22 арифметические, логические и спе- циальные операции. √ Метки длиной до семи символов. √ Общее количество меток около 1536 (11.5 Kb буфер, каждая метка занимает 3+ДЛИНА_МЕТКИ байт.) √ При компиляции возможно тиражирование строки √ Возможность размещения кода по адресу не совпадающему с ORG. √ Естественно, INCBIN/INCLUDE. √ Скорость компиляции мало зависит от общего количества меток. √ Повышение скорости вследствие заранее просчитанных/переведенных чисел. √ Поддержка недокументированных команд. √ Встроенные макрокоманды типа LD ВС,HL Прочее √ Кэш каталога для INCBIN/INCLUDE. √ Быстрые дисковые процедуры. √ Опознавание текста в странице в слу- чае перезапуска. √ Автозагрузка STS при запуске. -------- Распределение памяти ---------- Необходимая конфигурация машины - 128к, TR-DOS 5.03/5.04. STORM не трогает банки 0,2,5 (48-ая па- мять), туда он кладет откомпилированный код. Остальные банки местами свободны, местами нет... 0 Свободна. 1 Убивается при входе/возврате в STORM. Пользовательская программа может пос- тупать с ней также. STORM использует ее только во время своей работы. 2 Свободна. 3 В первых 4к хранится кусок STORMA. Прохните - в него будет уже не войти. В следующих 12к хранится таблица ме- ток. Можете убивать. 4 Целиком занята STORMom. 5 STORM грохает BASIC-области #5В00...#5BFF, #5Е00...#5EFF Остальное свободно. 6 Текст программы. Можете убивать, если нужно. 7 2ой экран + STS. Область второго экрана используется STORMom для работы. При желании, мо- жете убивать все. Но учтите, что ко- манда STORMa "запустить STS" не про- веряет, что она запускает... Ассемблер может компилировать в адреса #6000...#FFFF. Из среды пользователю не- доступна область #4000-#SFFF (банка 5). Туда нельзя класть об'ектный код. Код, компилированный в эти адреса, может быть размещен по другому адресу и переслан в область #4000-#SFFF программой пользо- вателя. Используйте ORG со смещением ад- реса. При запуске/возврате в среду необходимо, чтобы RAMTOP стоял на 24575, иначе полу- чите 4 OUT of memory, 0:1. Для возврата используется USR 23600 или OUT 32765,20:USR 49152. При первом запуске устанавлвается 48-ой режим с открытыми страницами и очищает- ся 48-ая память. STS 5.1а должен быть записан сразу после STORM - он не утруждает себя лазанием в каталог. При входе/выходе происходит SWAPPING со страницами, не возмущайтесь вынужденным тормозом (30 тактов/байт, однако...). При выходе 1ая банка и STS$ чистятся. При любом запуске/возвате Асм анализи- рует 6-ую банку на предмет текста. Если он там есть, вы можете с ним работать, если нет, происходит инициализация ре- дактора. ════════════════════════════════════════════════════════════ Редактор ════════════════════════════════════════════════════════════ Интерфейс оптимизирован для быстрой работы (под этими словами скрывается не- достаток памяти, да и самая обычная че- ловеческая лень). Вся работа, таким об- разом, ведется с помощью горячих клавиш. На экране у нас имеется: - Статусная строка INS/OVR -Без комментариев BIG/SML RUS/LAT EXT/ALT -Смена виртуального меню потом поймете... RES/SET -Режим маркировки (см. ниже) LINE,COL,FREE -Поворят сами за себя - Окно текста - Область сообщений - Область строчного редактора - Имя редактируемого файла + ботва *!A:FILENAME │││ ││└-- Текущий дисковод │└--- Признак наличия маркировки └---- Признак изменения текста Клавиши в режиме редактирования текста: CS/1 edit Скролл вверх CS/2 caps lock Скролл вниз CS/3 true video На страницу вверх CS/4 inv. video На страницу вниз CS/5 left Влево CS/6 down Вниз CS/7 ир Вверх CS/8 right Вправо CS/9 graphics Удаление по курсору CS/0 back space Забой (на все...) SS/W Вставка/замена SS/A stop CAPS LOCK SS/Q В начало строки SS/Е в конец строки SS/I Продолжение поиска CS/ENTER Пометить строку SS/ENTER Удалить строку SS/SPACE РУС/LAT CS/SS ext префикс команды редактора CS/SPACE break префикс внешней команды Клавиши в строчном редакторе: SS+Q/Е Номе/End SS+SPACE RUSLAT SS+A CAPSLOCK DOWN Очистка строки EDIT Смена дисковода EXT,BREAK Отмена Команды делятся на две группы: - Команды редактора (EXT). Вводятся после нажатия EXTEND. - Внешние (альтернативные) (ALT) Вводятся после нажатия BREAK. Команды редактора (EXT+...) : Begin Отметить начало блока. End Отметить конец блока. BlK mode Установка режима отметки блока: SET в указанном блоке строки отмечаются. RES в указанном блоке снимается пометка со всех строк. Copy Копировать все отмеченные блоки в место, указанное курсором. Delete Удалить все отмеченные блоки. Move Переместить все отмеч. блоки в место, указанное курсором. (используется COPY & DEL, на лучшее не было времени.) uNmark Снять все блочные пометки. Search Поиск. neXt Поиск следующего. Replace Поиск и замена. Запрос: Y - заменить N - пропустить A - заменить все Q - отвалить Undo Вернуть строке вид, который она имела перед редактированием. Если вы об'единяли любое коли- чество строк командами DEL или BACK SPACE, или стирали строки подряд с помощью ss+enter, все восстанавливается. Assemble Компиляция программы. Если ошибок нет и программа ма- ленькая, вы не успеете ничего заметить... Ошибки выводятся порциями по 20 строк и ждется нажатие клавиши. Пробел - выход из компилятора. Второй проход делается в случае отсутствия ошибок по первому проходу. Jump Переход к строке с номером N. Inspect Калькулятор. Перемещения: extent ↑ В начало текста. extent ↓ В конец текста. extent → К следующей отмеченной строке. extent ← К предыдущей отмеченной строке. Внешние команды (BREAK+...) : Load Загрузка текста Save Сохранение текста Сат Каталог Merge Добавление текста в конец и по- следующая его маркировка. save Blk Сохранение блока (он должен быть единственным, иначе будет выдано сообщение об ошибке). save Obj Сохранение откомпилированной программы. Сохраняется блок от минимального до максимального адреса, по которому был сгене- рирован код. Вы можете исполь- зовать ORG в любом количестве и порядке. Zap техт Очистка текста. Quit Выход в BASIC. imporT Преобразование из текстового формата в токенизированный. Засос исходника с диска. Непонятное или слишком длинное помечается в блок и знаком ";", непонятные команды воспринима- ются как метки. было : INCLUDE "THRASH" стало: JR INCLUDE,"THRASH" подразумевается: INCL "THRASH", а также "DOOM" и "DEATH"... eXport Преобразование в текстовый фор- мат. Отписывает на диск. Никаких табуляций. В конце строки #0D. Маркер конца текста не ставится. Assemble Компиляция программы. Debug Вызов STS. Возврат - RETURN ТО ASM Run Запуск откомпилированной прог- раммы. Возврат по RET или OUT (#7FFD),#14:JP #C000 Вопросы, не нашедшие ответа выше: ───────────────────────────────────────── Некоторые ошибки выводятся на бордюр. Синий - Текущая строка длиннее 40 символов (ограничение формата) Красный - Синтаксическая ошибка Желтый - Нехватка памяти Зеленый - Внутренняя ошибка Она может возникнуть, например, если им- портить не текст, а, например, кодовый блок. Не сбрасывайте компьютер! Войдите в TR-DOS и запустите STORM, при запуске он найдет текст (если это возможно). Если при перезапуске увидите черный эк- ран, то, значит, Асм нашел что-то, похо- жее на текст, но не текст. В данном слу- чае поможет лишь очистка 6-ой страницы (это делает 128-BASIC при сбросе). Не секрет, что работа через TR-DOS напоминает садомазохизм. Поэтому в Асм используются быстрые дисковые процедуры следовательно, счастливые обладатели винта круто обламываются. Все эти достающие проверки типа "А вы действительно хотите запустить эту прог- рамму" или "Наберите, пожалуйста, комби- нацию hyЙCТЗyНIУ7TgHwr5r5 для подтверж- дения вашего действия" не реализованы. При операциях с диском каталог и 8-ой сектор проверяются на предмет любых оши- бок. STORM будет работать только тогда, когда не найдет таковых. При наличии ошибки будет выведено "CORRUPTED DISK". Таким образом, можно пихать все, что угодно, даже MS-DOS диски - работать можно лишь с "правильными". Все это сделано для исключения конфлик- тов. STORM - это ведь не диск-доктор, обязанный понимать всякую ересь. Диск должен удовлетворять требованиям: - 80 DS DRIVE AND DISK. - Первый файл начинается с дорожки 1, сектор 0. - Начало любого файла на диске = начало предыдущего + длина предыдущего в сек- торах. - Начало последнего файла + его длина должна стоять в поле "начало свободной области" в 8-ом секторе. - Количество файлов/уд. файлов в 8-ом секторе должно соответсвовать реаль- ности. - Количество свободных секторов в 8-ом секторе >= 2544-занятый об'ем. ════════════════════════════════════════════════════════════ Компилятор ════════════════════════════════════════════════════════════ ОБЩИЙ ФОРМАТ СТРОКИ: [метка] [ком.+опер.] : [ком.+опер.] ;REM Все поля необязательны. Метка длиной до семи символов. В поле метки может стоять запись вида: .число где число = 0-255, задающее тираж данной строки, 0=256 раз. Комментарий может быть в любом поле. Возможно любое количество операторов в строке (сколько влезет в 40 символов..). У одного оператора не ограничено число операндов, например: ADD A,A,A,В,HL,DE = ADD A,A ADD A,В ADD HL,DE PUSH ВС,DE,HL = PUSH ВС PUSH DE PUSH HL JR NZ,LOOP,LOOP1 = JR NZ,LOOP JR LOOP1 JR C,$+5,Z,$+20 = JR C,$+5 JR Z,$+20 DB ABC-$,LOOP-$ = DB ABC-$ DB LOOP-$ (в двух последних случаях $ вычисляется верно,и команды слева и справа абсолютно эквивалентны). Допускаются следующие выкрутасы: OUT (#FE) = OUT (#FE),A OUT В,A,(#FE) = OUT (C),В ; только OUT (C),A ; непонятно, OUT (#FE),A; зачем... IN (#FE) = IN A,(#FE) IN D,Е,(#В7) = IN D,(C) IN Е,(C) IN A,(#В7) LD HL,ВС etc = LD Н,В LD L,C LD ВС,IX etc = LD В,НХ LD C,LX ЕХ HL,DE = ЕХ DE,HL ADD DE,HL = ЕХ DE,HL ADD HL,DE ЕХ DE,HL ЕХА = ЕХ AF,AF DB "@AEDFC825"= DB #АЕ,#DF,#C8,#25 DS 7,#AA,#ВВ = DB #AA,#ВВ,#AA,#ВВ DB #AA,#ВВ,#AA всего семь байт DS 111,"@ABCD"= DB #АВ,#CD .... DB #АВ всего 111 байт. DS 10 = 10 нулей ВЫРАЖЕНИЯ ═════════ Там, где синтаксис допускает число, мо- жет быть использовано любое выражение, непосредственное или определенное EQU. Это справедливо для всех команд. Подсчет происходит с игнорированием пе- реносов, выражение вида 0-#20 = #FFE0. Если синтаксис требует слово, результат просто считается. Если синтаксис требует байт, результат должен быть в диапазоне #FFOO-#OOFF, т.е. 0-#20 даст #Е0. В командах IN,OUT,IM и RST отрицательное число не допускается. Знаки, требующие двух операндов (ставятся между ними): + Сложение - Вычитание * Умножение / Деление Остаток от деления & AND (поразрядное над словами) ! OR (поразрядное над словами) | XOR (поразрядное над словами) << Нециклический сдвиг влево на N >> Нециклический сдвиг вправо на N <= меньше или равно, результат = 0 или 1 >= больше или равно, результат = 0 или 1 < строго меньше , результат = 0 или 1 > строго больше , результат = 0 или 1 = равно , результат = 0 или 1 Знаки, требующие одного операнда (ставятся после него): [ старший байт (N/256) ] младший байт (N256) ^ округление до большего или равного #АЕ18=#AFOO, #В700=#В700 £ округление до меньшего или равного #АЕ18=#AE00, #3D00=#3D00 ~ NEG, вычитание переменной из нуля. (Самое интересное, что этот знак невозможно ввести с клавиатуры :) @ NOT, =0, если не нуль =1, если нуль ' умножить на 256 В сложном выражении сначала считаются скобки, потом знаки с наибольшим приори- тетом, далее знаки с меньшим, и далее до нинимального приоритета.Для равных прио- ритетов вычисление идет слева направо. Внутри скобок то же самое (там свои приоритеты).Максимальный уровень вложен- ности скобок+приоритетов - 16.(использо- ваны рекурсивные процедуры, стек забива- ется промежуточными результатами. Конт- роль 16-ти уровней присутствует, система не повиснет.) Если все выражение необходимо заключить в скобки, необходимо использовать запись вида 0 + (выражение), иначе скобки будут восприняты как метод адресации. Приоритеты: [ ] ^ £ ' 8 * / 7 ~ 6 >> << 5 + - 4 & | ! 3 = etc 2 @ 2 В выражениях можно использовать: ... Метки, в качестве первого символа допускается только большая буква в качестве остальных - цифры, "_" и большие/маленькие буквы. $ текущий адрес трансляции данного оператора. Если используется что- либо вида JR $,$,$,$,$,то $ меня- ется внутри строки - он каждый раз указывает на текущий "вирту- альный" JR. 123 десятичный байт 12345 десятичное слово #AA шестнадцатеричный байт #FAB2 шестнадцатеричное слово %10101 двоичный байт %... двоичное слово "A" код символа в байт "АВ" коды двух символов в слово, первый - старший. Об особенностях синтаксиса. INCB=INCBIN/INSERT INCL=INCLUDE (вложение не допускается) LX,LY,НХ,НУ <альтернатива перекодируется DB,DW,DS <в такой вид при вводе SLI _DB "ABC" ; не табулируется... ORG ADR1 [,ADR2] ADR1 - где будет работать ADR2 - куда положить код допускается ORG $,ADR ORG ADR,$ ORG $^ ; люблю красивые ; адреса ORG ($-1)/256*256+256 ; умудрялся любить ; красивые адреса ; и в ZXASM 3.0 ;) $ адресует область работы. ════════════════════════════════════════════════════════════ О ПОСЛЕДУЮЩИХ ВЕРСИЯХ... ════════════════════════════════════════════════════════════ Скорее всего, следующие весии будут пи- саться исключительно под большую память, т.к. даже в этой версии памяти для поль- зователя остается мало, а об'ем кода вы- растет значительно... √ Мультитекстовый редактор √ Полностью рамочный интерфейс (ВДОБАВОК к существующему!) √ Новые встроенные макрокоманды √ Локальные метки √ Макроопределения √ Условная трансляция √ Полномасштабный SETUP √ Улучшенный внутристрочный редактор (работа со словами и метками) √ Возможность быстрого ввода токенов √ Размер каждого текста до 32-64к √ Навороченный ПОИСК/ЗАМЕНА √ Печаталка √ Ускорение компиляции еще % на 20... √ Более быстрые дисковые процедуры √ Многое другое... Во второй версии ассемблера предполага- ется сделать поддержку макрокоманд вида: 1.XXXI R,R(N) Пде XXX=ADD,SUB,AND,OR,XOR R-Регистр или косвенная ячейка ADDI L,#20 == LD A L:ADD A,#20:LD L,A 2. LD DD,R LD ВС,L == LD C,L:LD В,0 3. SUB HL,DD == OR A:SBC HL,DD 4. Постинкремент типа LD A,(HL)+ = LD A,(HL):INC HL LD A,(L)+ = LD A,(HL):INC L 5. Косвенная адресация по любому регистру, типа LD (DE),LX = LD A,LX:LD (DE),A 6. Косвенная загрузка слова LDW (DE)+,HL = LD A,L:LD (DE),A:INC DE LD A,Н:LD (DE),A:INC DE И еще вагон всякого-разного... Чего точно не будет (по принципиальным соображениям...) х Длинных строчек (более 40 символов) х 64 etc символов в строке (доработку нашей проги до такого варианта вос- примем как личное оскорбление...) х Меток длиной более семи символов х Поддержки винчестера через #3D13. ИСКЛЮЧЕНИЕ : кто-нибудь напишет гото- вый драйвер _БЕЗ_ характерных особен- ностей TR-DOS, чтобы все ошибки воз- вращались наверх, не портился экран, не нужны были системные переменные... И если драйвер нас устроит, тогда... ════════════════════════════════════════════════════════════ НАСТРОЙКА ЦВЕТОВ. ════════════════════════════════════════════════════════════ Вы можете поменять кое-какие цвета в редакторе (только ink) с помощью ... DiskDoctor'а! Для осуществления подобного насилия нужно в первые два байта Basic блока (туда, где хранится номер строчки) запи- сать следующие значения : 0-й байт 1-й байт 00AAABBB CDDDEFFF ^^ └- =0 !!! (иначе Basic скипает строку) В Ink Назначение ---------------------------------- 0 AAA - Цвет рамки 0 ВВВ - Цвет строчного редактора C DDD - Цвет текста Е FFF - Цвет маркировки ---------------------------------- 0В0OOINK - Результирующий атрибут |яркость * Каков изврат, а? * ════════════════════════════════════════════════════════════ БАПИ. ════════════════════════════════════════════════════════════ Как известно, документированный глюк - уже не глюк, а особенность программы. Предлагаем вам список особенностей :) Редактор: - В поле "FREE" неправильно печатаются числа диапазона 10000...10999 и 1000...1099. - Поиск стринга иногда его не находит (случается очень редко) - Плючит JUMP ТО LINE (было всего один раз) Ассемблер: - LD ($),... дико глючит. (совершенно ненужная команда) - Плючат выражения (AA<ВВ)*... - DB "A", т.е. одна буква в кавычках - неправильно компилится; две и более - нормально. - Если на втором проходе появляется хотя бы один OFFSET ERROR, могут появиться другие, даже если это не так (исправлять JR на JP, по возможности, по очереди). Надеемся, это все. На STORMe были напи- саны три большие программы и куча ма- леньких... Это все, что мы накопали... леньких... Это все, что мы накопали... Если будут замечены другие глюки, хоте- лось бы о них услышать... и увидеть, ведь цветные квадратики - это так краси- во!.. Пишите в редакцию - и глюки будут исправлены! ════════════════════════════════════════════════════════════ В приложение к статье "SPECTRUM+3D" идут примеры, записанные в формате текста. Если вы захотите импортнуть в STORM эти примеры, запустите его, нажмите BREAK, Т и наберите имя файла. Напоследок, осмелимся посоветовать Вам - переходите на STORM, вы должны попробо- вать, что значит быстро и удобно!