так может довести это похожее до ума? имхо цифры менее удобны в качестве мнемонических обозначений...Цитата:
Сообщение от aprisobal
кроме того остальные плюсы цифровые метки не покрывают
Вид для печати
так может довести это похожее до ума? имхо цифры менее удобны в качестве мнемонических обозначений...Цитата:
Сообщение от aprisobal
кроме того остальные плюсы цифровые метки не покрывают
а по-моему достаточно удобно. Когда близко, чего зря имена придумывать. Вот помню в асме PDP, с коим я познакомился еще до спека, были локальные метки вида @nnn (n-цифра), локальность которых ограничивалась метками обычными. Т.е. между двумя обычными метками все метки @nnn были локальными. Хотя слово PROC дает лучше эффект.
devpac на амиге: локальные метки == .metka, ограничены обычными. Ещё удобнее, чем цифры only - так как можно и .1 .2 .3 писать, так и .label .metkaЦитата:
Сообщение от Vladimir Kladov
кстати может там как раз точка и была (или еще какой знак, вроде солнца, столько лет прошло, все детали не упомню).
В SjASM тоже есть локальные метки. Только, что цифры как локальные метки теперь не поддерживаются - определяются как директива повтора строки (как в Шторм)Цитата:
Сообщение от lvd
Реализаций данной функции ассемблеров может быть много, например вот как это сделано в WLA DX:Цитата:
Сообщение от elf/2
Код:3.3. Labels
Labels are ordinary strings (which can also end to a ':'). Labels starting
with "_" are considered to be local labels and do not show outside sections
where they were defined, or outside object files, if they were not defined
inside a section.
Here are few examples of different labels:
VBI_IRQ:
VBI_IRQ2
_VBI_LOOP:
main:
Note that when you place ':' in front of the label string when referring to
it, you'll get the bank number of the label, instead of the label's address.
Here's an example:
LD A, :LOOP
.BANK 2 SLOT 0
LOOP:
Here "LD A, :LOOP" will be replaced with "LD A, 2" as the label LOOP is
inside the bank number two.
When you are referring to a label and you are adding something to its address
(or subtracting, any arithmetics apply) the result will always be bytes.
.org 20
DATA: .dw 100, 200, 300
ld a, DATA+1
^^^^^^ = r
So here the result r will be the address of DATA plus one, here 21. Some x86
assemblers would give here 22 as the result r as DATA points to an array
or machine words, but WLA isn't that smart (and some people including me
think this is the better solution).
You can also use -, --, ---, +, ++, +++, ... as un-named labels.
Labels consisting of '-' are meant for reverse jumps and labels consisting
of '+' are meant for forward jumps. You can reuse un-named labels as much
as you wish inside your source code. Here's an example of this:
dec e
beq ++ ; jump -> ?
dec e
beq + ; jump -> %
ld d, 14
--- ld a, 10 ; !
-- ld b, c ; #
- dec b ; *
jp nz, - ; jump -> *
dec c
jp nz, -- ; jump -> #
dec d
jp nz, --- ; jump -> !
ld a, 20
- dec a ; $
jp nz, - ; jump -> $
+ halt ; %
++ nop ; ?
Note that "__" (that's two underline characters) serves also as a un-named
label. You can refer to this label from both directions. Use "_b" when
you are jumping backwards and "_f" when you are jumping forwards label "__".
Example:
dec e
jp z, _f ; jump -> *
dec e
__ ldi a, (hl) ; *
dec e
jp nz, _b ; jump -> *
"+++, --, _b" - тоже не плохо. хотя это опять только _метки_. использование скобок позволяет подчеркнуть структуру программы и вложенность блоков. кроме того обозначение '}' для конца блока/цикла лучше отражает смысл чем +.Цитата:
Сообщение от aprisobal
опять же, это имхо, настаивать не буду, да и не имею права...
Вышла новая версия SjASMPlus - 1.05 RC3. Исправлен небольшой глюк с ENDM, добавлена поддержка скобок {..} и записи любых команд через запятую(INC A,B,C,A). Качать - [...вырезано...]
Spectre, скобками {..} берётся 1 байт из памяти или 2 байта?
Слово.Цитата:
Сообщение от aprisobal
А вообще вот фирменное описание Аласма (усеченное Alone Coder'ом до нескольких страниц). Это часть касающаяся команд и синтаксиса:
Код:4. ДИРЕКТИВЫ АССЕМБЛЕРА
ORG адрес[,страница]
Установка адреса компиляции. По умолчанию параметр "страница"
старый, в начале компиляции =0.
метка EQU значение
Присваивает метке значение, эквивалентное параметру "значение".
DISP адрес
Установка адреса, в котором должна работать программа.
ENT
Присвоение адресу работы программы текущего адреса компиляции.
Пример:
SCREEN EQU #4000
ORG #8000
LD HL,BEGIN ;Пересылка в область экрана
LD DE,SCREEN ;и запуск программы ожидания
LD BC,END-BEGIN ;[A] прерываний
LDIR
CALL SCREEN
DI
HALT
BEGIN DISP SCREEN
MARKA DEC A
HALT
JP NZ,MARKA ;JP не случайно
RET
ENT
END
Текущее смещение компиляции (shift=org-disp) узнают так:
a ORG 0
ENT
shift ORG a+shift
DISP a
INCLUDE "drv:имя файла"[,страница]
Включение в компилируемый файл дополнительного исходника,
лежащего на диске под именем "имя файла". При этом указанный
файл загружается в страницу, определенную параметром "страница"
(по умолчанию - текущая). По окончании компиляции включенного
блока компиляция продолжается со строки, следующей после данной
директивы. Файл не будет загружаться с диска, если
он уже находится в необходимой странице. "" - любой файл.
Пример:
LDIR
INCLUDE "TOKENIZE",1
OTDR
INCLUDE "ALASM2"
HALT
Сначала будет откомпилирован LDIR, потом текст "TOKENIZE.H",
загруженный в страницу 1, потом OTDR, затем в тек.страницу
будет загружен и откомпилирован текст "ALASM2.H", после чего
с диска будет считан основной файл и компиляция продолжится
с команды HALT.
MAIN "имя файла"[,страница]
Указание основного файла компиляции. Директива MAIN должна быть
первой исполнимой директивой подчиненного файла.
Символы "." и "*" заменяйте на "?".
Пример:
MAIN "MAKE6?7",6
LDIR
После подачи команды ASSEMBLE компиляция передается
программе MAKE6*7, находящейся в странице 6,
затем находящийся в ней INCLUDE вызывает подчиненную
программу, состоящую из директивы MAIN и команды LDIR.
Во включаемых файлах MAIN игнорируется, поэтому после
ассемблирования LDIR происходит возврат назад и
продолжение компиляции.
INCBIN "дисковод:имя файла"[,длина]
Включение в компилируемую программу кодового блока с диска
размером "длина" байт или по умолчанию из данных каталога.
DUP число
Указывает начало блока, который необходимо компилировать
"число" раз подряд
EDUP
Указывает конец повторяемого блока. Возможна вложенная
конструкция.
Пример:
DUP 32
LDI
LD A,B
OR C
JR Z,$+3
LD (HL),D
EDUP
Блок между DUP и EDUP откомпилируется 32 раза
REPEAT
<тело>
UNTIL <выражение>
Компилирует <тело> до тех пор, пока <выражение> не 0
DB байт[,список байт]
Пример:
DB "У",13,10,"попа",13,10,"была",13,10,"собака",13,10
DEFB "она съела",13,10,"попа факу..."
DW слово[,список слов]
Пример:
DW ALASKA,BUFFER,12,#BD15,32767,.NUMB1
DEFW 12345,34567
DS количество повторений[,список байт]
Список байт (по умолчанию нулевой байт) копируется в текущий
адрес компиляции. Число циклов = "количество повторений".
Пример:
DS 10,#E5
DEFS 32,#ED,#B0
DD [#]hexбайт[hexбайты]
Плотное хранение шестнадцатиричных чисел.
DD 1D4FDC42
эквивалентно
DB #1D,#4F,#DC,#42
+<нечто>
ОПАСНО ПРИ ДЛИНЕ СТРОКИ=#2C..#2F!
При загрузке текста с диска он сканируется на наличие в нем "+"
в начале каждой строки. В процессе компиляции все встреченные
"+" будут заменены на "-", что заставит компилятор пропускать
строки при следующем ассемблировании.
Пример:
LD HL,#DB00
+SAVEADR
+ ORG #DB00,7
+ INCBIN "sts70r"
+ ORG SAVEADR
JP (HL)
отладчик загрузится только при первой компиляции
метка=выражение
(Пере)присвоение значения метке.
Пример:
SHLUSS=0
ORG 32768
DUP #4000
DEFW SHLUSS
SHLUSS=SHLUSS+1
EDUP
память выше #8000 заполнится увеличивающимися словами 0..16384
IF <выражение>
<тело1>
ELSE
<тело2>
ENDIF
Если <выражение>=0, то компилируется <тело1>, иначе <тело2>
IFN <выражение>
<тело1>
ELSE
<тело2>
ENDIF
То же, но наоборот.
Допускается вложенность условной компиляции (до 254)
LOCAL
<тело>
ENDL
Объявление локальных меток. Все метки в пределах этой
операторной скобки будут невидимы вне ее (кроме меток,
начинающихся с символа @ - это глобальные метки). Допускаются и
вложенные конструкции.
Если в пределах локальных меток определять метки с именами,
к которым обращались раньше этой конструкции, то такие метки
будут глобальными:
LD HL,LABEL
LOCAL
LABEL
ENDL
MACRO <имя_макросa>
<тело>
ENDM
Определение макроса.
В теле макроса:
\0..\9 - параметр номер 0,1,2,..9
\C - текущий символ
\N - перейти на следующий символ (ничего не выдает)
\R - установить указатель на начало строки параметров
\S<char> - строка от текущего символа до символа <char>
\P - сдвинуть строку параметров на один параметр. Выдает
съеденный параметр. \R возвращает, как было.
<имя_макроса> [параметр1[,параметр2[...]]]
Использовать макрос.
Разделитель параметров - запятая
(заключенная в кавычки не считается).
MACRO DOWN
LOCAL
INC \C
LD A,\C
AND 7
JR NZ,LABEL
LD A,\N\C
SUB #E0
LD \C,A
JR NC,LABEL
LD A,\R\C
SUB 8
LD \C,A
LABEL
ENDL
ENDM
Теперь мы можем процедуры DOWN HL и DOWN DE компилировать по их
именам - DOWN HL, DOWN DE и т.д.
Пользуясь условиями типа
IF " "-" \1"
или
IF ?macroname\1-2
можмо определять макросы с переменным числом параметров.
DISPLAY [/L,]["any text",][[/D|/H|/A,][/T,]выражение]
Отображает текст или числа в процессе ассемблирования. Ключи
/D, /H и /A устанавливают формат вывода для одного следующего
числа. Далее числа выводятся в текущей системе счисления. /D -
десятичное число, /H - шестнадцатиричное, /A - в обеих
системах.
/L указывает, что необходимо печатать не с новой строки.
/T выводит сначала само выражение, потом его значение.
Примеры:
DISPLAY "code size: ",/D,end-start
DISPLAY /A,"abc+xyz=",abc+xyz
DISPLAY "simple"," text"
DISPLAY "Баран жевал "
DISPLAY /L,"травКу"
DISPLAY /A,/T,abc+xyz
эквивалентно
DISPLAY /A,"abc+xyz",abc+xyz
Половинки IX и IY: HX,HY,LX,LY.
Можно: INF;SLI;OUT (C),0;EXA;EXD;JZ;JNZ;JC;JNC
LD L,0,H,'fnt и т.п.
5. Выражения
Считаются слева направо без приоритетов (кроме скобок).
a+b
a-b
a*b
a/b
a&b - AND
a|b - OR
a!b - XOR
a>b - циклич.сдвиг слова a на b бит вправо
a<b - влево
() - скобки (сначала рассчитываются они)
{a} - слово, находящееся в памяти по адресу a
a~ - инвертирование текущего результата
?метка - возвращ. 0, если метка определена, #ffff, если не
определена, и 1, если не определена, но к ней было уже
обращение. Если метка - название макроса, то 2.
'a - ст.байт a
.a - мл.байт a
%const двоичная
$$ - текущая страница кода
Как узнать страничку компилируемого исходника
и адрес компилируемой строки (из макроса нельзя)
ORG #C0E1,2
DISPLAY {$}-#C040,"/pg",.{$+2}
Как определить, не из mkace ли мы запущены
ORG #FF32,2
IF {4>4+{$}}-#BF43
make ;mkace!
ENDIF
Во всех операциях, кроме + и -, не допускается использование
меток, которые будут определены ниже (из-за однопроходности)
:( А почему у меня такая фигня :(
При использовании INCLUDE вылетает сообщение об ошибке
---------- Capture Output ----------
"C:\ASM\sjasm.exe" My.asm
SjASMPlus Z80 Cross-Assembler v1.05 RC3
Terminated with exit code -1073741819
Да что-то конкретно запарил он с ERROR: Forward reference.
Может есть какой ключик чтобы он во время второго прохода делал подобное?
Он что - вообще не умеет ссылаться "вперед"?
Можно с ума сойти.. невозможно ссылаться на метки инклуженных файловКод:len equ start2-end2
org 30000
start2
ret
end2
ругается "Bytes lost" если пытаешься использовать -1 (в качестве 65535 или 255, в засивимости от регистра). Никуда ничего не потеряно же!
Матерится "Label has different value in pass 2"...
Гы.. автор совсем чтоли не знает как асм должен работать? Лэбелы должны все использоваться из 2го прохода, а на 1м проходе лишь вычисляться, и запоминаться места, где они используются, чтобы во втором проходе их вставить уже скорректированными.
Короче то ли я туплю, то ли у меня 90% всех исходников вообще не компилятся в sjasm.
Писаны на TASM. И z80asm их компилит влёт.
Нет, ты вовсе не тупишь, просто так как пишешь ты и пишется КОД на асме, поэтому при появлении аласма я понял, что на нём будут писаться простые работки или сложные с большим трудом ... Поэтому когда-то Golden Eagle и не дописал своих WORMS'ов на Speccy, всё в итоге заглючило !!! Но, наверное, в асме, который обсуждается на этом форуме сделали учёт многопроходности, однако, если нет, то не зря что я по-прежнему сижу на своём личном асме !!! Мой это безусловно умеет, - я вообще не представляю как можно писать проги без меток указывающие на метки, указывающие ещё на какние-нибудь метки !!!Цитата:
Сообщение от Dexus
Прочёл предложение три раза. Смысл до сих пор неясен;)Цитата:
Нет, ты вовсе не тупишь, просто так как пишешь ты и пишется КОД на асме, поэтому при появлении аласма я понял, что на нём будут писаться простые работки или сложные с большим трудом ...
Значит не судьба быть понятым ... А смысл прост, на ТАSМЕ можно написать такой код, который не будет компилится в аласме.Цитата:
Сообщение от Shiru
ORG 49152-(END-START)
START
LD HL,MeST
LD DE,MeEN
LD BC,(MeEN-MeST)*3
LDIR
LD HL,MeSTT
LD DE,MeENN
LD BC,(MeENN-MeSTT)*3*(LINES-1)
LDIR
;...
;фА-ФА-ФА ЛЯ-ЛЯ-ЛЯ
;...
;Эффект ...
;...
MeSTT
LD SP,0
MeST
PUSH HL DE BC AF
MeEN
DS (MeEN-MeST)*3
MeENN
DS (MeENN-MeSTT)*(LINES-1)
LINES EQU 192
END
Как приятно мыслить на АСМЕ ... А DUP'ы нужны, но совсем не для создания кода, который должен расписаться на пол памяти ...
Хотя это мой стиль программирования, просто привык так, а АЛАСМ не понимает как так можно ...
Приветы!Цитата:
Сообщение от Shiru
Может человек малость непонятно выразился, но по-моему и так понятно о чем речь... А речь лишь о том, что асмы поледние - далеко не "золото", несмотря на всякие навороты (которые в моем случае никакой пользы не имеют), недочетов концептуальных полно. А то я уж подумал "вот - наконец-то хороший асм", а в нем - на тебе... "взгрели", называется.
Скажите мне, в каких еще компилерах подобные "приколюхи" есть? Чтобы сразу из расмотрения их выбросить...
И еще мне интересно в каком языке на PC такая фигня имеется... если имеется.
Прикинь, можно.Цитата:
Сообщение от Robus
Можно взять исходники оригинального SjASM'a или SjASMPlus'a и сотворить лучший ассемблер в мире. Осталась самая малость - добавить все фенечки и затыки спековских ассемблеров. Сам прославишься и спектрумистам-кодерам поможешь, которым, как плохим танцорам, карманы мешают.Цитата:
Сообщение от Dexus
Куда прикинуть ???Цитата:
Сообщение от aprisobal
Как легко найти оправдание облому сделать человеческий компилятор !?! Нет, что бы сесть и сделать нормальный асм, так сидят и "прикидывают".
Хех ... Типичный мир виндовсов и СИ, - а бы работало ...
Думаю удивишься, что SjASM написал не я, я и Kurles лишь его доработали под себя и назвали SjASMPlus.Цитата:
Сообщение от Robus
А по поводу "Нет, что бы сесть и сделать нормальный асм, так сидят и "прикидывают". Компилятор ASAM до сих пор для ДОС? Или ДОС стала для современных программ нормой? со всеми вытекающими... Перечитай, в своем посте, что (по сути) ты написал про самого себя и свою программу.
Я знаю, что написали его не вы ! Это не удивило !Цитата:
Сообщение от aprisobal
Норма для программ это компьютер, а не ДОС или ВИНДОВС ! Программа должна работать на компьютере а не на виндовсе, этим и отличается Coding от приграммирования ! Мой компилятор вместе с досом велеколепно уместится на одну дискету, что мне и нужно было. У тебя странные сравнения ... неужели ты предложишь писать современные игры не для старого и убого TR-DOS'а, я для, скажем, IS-DOS !?! Представляю какие ГИПЕР ограничения появятся при её создании ... Кстати, если из ASAM'а выкинуть эмулятор ZX'а, он прекрасно будет работать под винду или уникс или ещё под что-нибудь !!! Такая версия уже была, но она быстро ушла в прошлое ... А текущая версия прекрасно запускается под виндой, правда на ХР я не проверял, но на 2000-ном идёт без проблем ! НО !!! Я никогда не стану гордиться этой глупостью, компилятор сделан для программирования а не для хвастовства его гиперзапускаемости под разнообразные оси !!!Цитата:
Сообщение от aprisobal
Если чем обидел, aprisobal, - не обижайся ... Просто на ZX'е, был единственный лучший асм - TASM-4 (rst), для 128-ого !!! Там оставленно максимум памяти для пользования и максимально места для меток, остальные асмы просто захлёбывались ! Не говоря уже о метках, которые указывают на другую, ещё не известную метку ... На ПиЦи для ZX'а, я не встречал хорошего асма ... Те, что я перепробовал обязательно в чём-то обламывали ... Вот я и сел делать ASAM ... Последняя версия всё ещё не оптимизирована но он делает ВСЁ, что только можно придумать ... Я не люблю писать компиляторы, и я бы не писал, если бы была альтенатива ...
В связи с тем, что итальянский фанат MSX Артуро Рагозини (Arturo Ragozini) прислал баг репорт для SjASMPlus, выпускаю новую версию последнего - 1.05 Stable:
- Исправлен глюк при обработке имен подключаемых файлов (thx 2 A.Ragozini)
- У исполнимого файла компилятора появилась иконка
- (!)В состав программы включена версия под FreeBSD
- Исправлена ошибка, когда "END" нельзя было использовать в качестве метки
- Исправлена ошибка, когда директива повтора .число работала и в начале строки (thx 2 A.Ragozini)
- Добавлен новый ключ -B, отключающий возможность написания директив с начала строки
Качать: [...вырезано...]
Новая версия SjASMPlus - 1.06 RC1.
Скачать: [...вырезано...]Цитата:
Новое в 1.06 RC1:
- ВНИМАНИЕ! Чтобы изначально увеличить совместимость ассемблера с другими, ключ -B теперь включает(а не выкл. как раньше) возможность записи директив с начала строки
- Исправлена ошибка с обработкой символов, номер в таблице ascii которых больше 127
- Исправлена ошибка с обработкой директив DISP/ENT
- Добавлена директива DEFM/DM как синоним директивам DEFB/DB/BYTE
- DEFL(новая директива) и LABEL=... можно переназначать.
- Исправлен баг с невозможностью использования числовых меток в DUP/REPT
- Новая директива DEFARRAY, для создания массивов DEFINE'ов
Исходники: [...вырезано...]
Неправда! Ничего не глючило. Даже мой малой помнит беседу с Иглом... И проблема была в нехватке 1 страницы под метки. Всего лишь. Аласм его устраивал вполне. А Алем обещал больше страниц... Решили подождать... :) просто забили :)Цитата:
Сообщение от Robus
Я так же помню беседу с Eagl'ом, мы с Jungar'ом и Dreamer'ом тогда сидели у меня, после чего Jungar поехал в Николаев водку пить =) И мне Golden показывал как при не хватке меток глючит "аласм" и как ему очень не хватает возможностей "тасма", где можно казывать метку на метку. А меток и вправду не хватала, поэтому последнюю версию ВОРМСа Еагл переписал под "тасм". После Голден купил себе амигу и уж тогда забил на спекки. Хотя настоящую причину "забития" почти никто не знает, кроме Макса и Еагла, и распространяться об этом не будем, это личное Silicon Brains'ов.Цитата:
Сообщение от Знахарь
А в аласме есть только один минус, это меткаи на метки вот и всё, а эта пичина одна из самых главных.
Эх, какие были времена, когда мы с Еаглом по очереди засыпали над его компом, кодируя. Если честно, то я впервые встречал человека, который мог продолжать писать код с того места, на котором я остановился, как и наоборот ... Хех ... "Были люди в наше время, Не то что нынешнее племя, Богатыри, не Вы" ...
Благодарен, Вам ...
Цитата:
Сообщение от Robus
Хотя, чего я на это трачу время ... Куда мне знать ... Аласм - АЗБЕСТ, CJASM - АЗБЕСТ !!!
Пойду доделывать последний проект ... =)
Вот это другое дело :) точки над "и" расставлены :) Проехали.Цитата:
Сообщение от Robus
Robus, что можно укодить такого на ассемблере с фичей "метка на метку", чего никогда не укодишь на ассемблере без этой фичи? С примером плз.
Вот пример программы, где очень много построено на метка в метку ...Цитата:
Сообщение от Aprisobal
Можно-ли подобное откомпилировать в CJASM'е ? Я лишь нажимаю "ентер" и получаю готовый файл, которым уже можно пользоваться !!!Код:
; Пример программы супер-микро-мини демка ...
EQU $ASAM.PASS.ERROR=1 ;Количество пустых компиляций, для
;устронения вложенных меток в дважды
;запаковынном блоке или больше.
INCLUDE "speccy.az8" ;Маленький набор утилит.
.LoadPack ,_ ;Загрузка ранее запакованных кусков из
@.1.P EQU $PAGE ;файлов, в данном случае это нужно
@.1.S INCBIN @.0 ;для LOADER'а, который подгрузит
@.1.E EQU $-1 ;картинку загрузки ... =)
@.1.L EQU $ASAM.LOAD.SIZE+2
DW $ASAM.LOAD.SIZE
..
.PackerXP _ ;Запаковка блока для 128 страниц
ORG @.0
@.0.P EQU $PAGE
DSQ.Pack @.-@.0
@.0.E EQU $-1
@.0.S EQU $-@.0
..
.RunXP _ ;Автоматическая распаковка и запуск
LD A,@.0.P
LD HL,@.0.E
LD DE,FREEBLOCK
CALL DEPACKXP
..
PAGE 17 ;Какая-то часть компилится в страницу
ORG 49152
EFFx1 PHASE FREEBLOCK ;Адрес свободной памяти
EFFx1_S CALL WaitINCER ;Ожидаем окончания секундного интервала
LD A,1*8+7
CALL Clearuchik ;Стираем экран
CALL Printik ;Печать текста
DW 20480
DB "Spectrum Is The Best ..."+128
RET ;Прощай жизнь, конец части =)
UNPHASE
PackerXP EFFx1 ;Запаковываем кусок
B17.S EQU $-49152 ;Размер страницы #17, который в будущем
;запакуется в LOADER, я понимаю, что
;в этой странице уже и так всё запаковано,
;но это всё просто пример
PAGE 19 ;То же, что и сверху ... =)
ORG 49152
EFFx2 PHASE FREEBLOCK
EFFx2_S CALL WaitINCER
LD A,2*8+6
CALL Clearuchik
CALL Printik
DW 18432
DB "Hello To Aprisobal ..."+128
RET
UNPHASE
PackerXP EFFx2
CLR_P19: ;Процедура, стирания экрана, которая
PUSH AF ;распологается сразу после запакованной
LD A,R ;части
AND 00000111B
LD B,A
RLCA
RLCA
RLCA
OR B
CALL CLR_M0
POP AF
LD HL,16384
LD DE,16385
LD BC,6143
LD (HL),L
LDIR
CLR_M0: LD DE,22529
LD B,A
RRA
RRA
AND A
RRA
LD HL,ICLR+1
LD (HL),A
CLR_M1 BIT 7,(HL)
JZ CLR_M1
LD A,B
LD HL,22528
LD (HL),A
LD BC,767
LDIR
RET
EFFx3 PHASE FREEBLOCK ;Ещё один блок части, в котором
EFFx3_S JMP EFFx3_START ;используется метка на метку !
ORG 49152-(EFFx3_END-EFFx3_START) ;Откомпилит дальнейший код с адреса
EFFx3_START ;в самый конец свободной части памяти.
CALL WaitINCER ;Последний байт картинки "GFX\entire.scr"
LD A,3*8+0 ;будет находиться по адресу 49151
CALL Clearuchik
CALL Printik
DW 16384
DB "Assembler FOREVER ..."+128
CALL WaitINCER
XOR A
CALL Clearuchik
LD HL,ENTIREL
LD DE,18432
LD BC,2048
LDIR
HALT
LD DE,22528+256
INC B
LDIR
RET
ENTIREL IncBIN "GFX\entire.scr"
EFFx3_END
UNPHASE
PackerXP EFFx3
B19.S EQU $-49152
PAGE 20 ;Для красоты, что бы что-то валялось в странице
ORG 49152
DB "CJASM Is The Best ..."+128
B20.S EQU $-49152
PAGE 22 ;Для красоты, что бы что-то валялось в странице
ORG 49152
DB "HAVA NAVA VOCHEZ ??? ..."+128
B22.S EQU 16384
PAGE 23 ;Для красоты, что бы что-то валялось в странице
ORG 49152
DB "NAVA NAIN VOCHEZ ??? ..."+128
B23.S EQU $-49152
PAGE 16 ;Депакер, который будет использоваться как в деме,
ORG 23296 ;так и в LOADER'е
DEPACK
PUSH DE
INC HL
LD C,(HL)
INC HL
LD B,(HL)
DEC HL
DEC HL
DEC DE
EX DE,HL
ADD HL,BC
PUSH HL
EX DE,HL
AND A
PUSH HL
SBC HL,DE
POP HL
JNC DEPAx1
LDDR
JMP DEPAx2
DEPAx1
INC HL
INC DE
SBC HL,BC
EX DE,HL
SBC HL,BC
EX DE,HL
LDIR
DEPAx2
POP HL
POP DE
DEPACKX DSQ.DePacker ;Распаковщик by IMP
B23296.S EQU $-23296
;Programm Block ...
ORG 23552
INT: PUSHA ;Прерывание
ICLR LD A,0 ;Для примера, сюда запихивается цвет бордюра вне INT'а
PUSH AF ;да бы можно было понять, что все блоки распаковываются
AND 7 ;и запускаются автоматически
OUT (254),A
POP AF
OR 10000000B
LD (ICLR+1),A
INCER LD A,1 ;Счёчик по секунде, что бы синхронезироваться после
DEC A ;затраченного времени на распаковку и другую фингню.
JNZ INCERx1
LD A,50
INCERx1 LD (INCER+1),A
POPA
EI
RET
Clearuchik: ;Вызов процедуры очистки экрана, которая лежит в 19-ой
LD BC,32765 ;странице памяти между двумя запакованными блоками
EXA
LD A,19
OUT (C),A
EXA
JP CLR_P19
OrgInt INT,INT ;Утилита из Speccy.az8, устанавливающая в ближайшем
StackSP EQU INT.VecAddr ;адресе вектор прерывания, стек лепится перед вектором,
;нпдо же его куда-нибудь поместить
WaitINCER: ;Ждём окончание секунды
LD HL,INCER+1
LD A,(HL)
DEC A
JNZ WaitINCER
RET
M1 ;Цикл запуска трёх частей, в одной из которых
RunXP EFFx1 ;появляется наш логотип
RunXP EFFx2
RunXP EFFx3
JMP M1
Printik: ;Печать текста
POP HL
LD E,(HL)
INC HL
LD D,(HL)
INC HL
PR1 LD A,(HL)
PUSH AF HL
RLCA
RLCA
RLCA
LD L,A
AND 00000011B
ADD A,60
LD H,A
LD A,L
AND 11111000B
LD L,A
LD B,D
.8 ;Восем раз повторить нужно !!! =)
LD A,(HL)
LD (DE),A
INC L
INC D
..
ORG $-2 ;Стираем лишние команды, будем экономны !!! =)
LD D,B
POP HL AF
INC E
INC HL
RLCA
JNC PR1
PUSH HL
RET
DEPACKXP: ;Распаковка блока и запуск его, так как он депачится
LD BC,32765 ;сразу послет CALL DEPACKX
OUT (C),A
CALL DEPACKX
FREEBLOCK
;Start Of Programm
START: ;Сюда происходит JMP из LOADER'а, так как этот кусок
DI ;запускается только раз, его в будущем сотрут
LD A,(22528) ;части ГИГА-демы !!! =)
RRCA
RRCA
RRCA
LD (ICLR+1),A
LD SP,StackSP
LD BC,32765
LD A,16
OUT (C),A
LD A,INT.VEC
LD I,A
LD HL,INT
LD (INT.VecAddr),HL
IM 2
EI
JMP M1 ;Интересно, в итоге получился "JP M1" или "JR M1" ?
.1
INCLUDE "loader.az8" ;Там лоадер всё запакует и сделает готовый для
ORG @. ;использования файл, запихнув его в TRD
..
SaveLabels "wl.txt" ;Для примера сохраним все мекти, которые были
;в проекте
;ВСЁ !!! нано-дема отова ... Кстати, вы обратили внимание, на то, что дема
;компилится вообще во всю область памяти, и на ВАСИКовские переменные !!! =)
;
;В итоге всё это ужалось в 4352, с учётом нулей, при сохранении запакованных
;страниц для блоковой загрузки по секторам ... Не экономно, но облом делать
;качественную версию ... В игре Surgicsl Fantasy увидите качественную структуру
;файла, имеющий до 300-та запакованных файлов, блоков и других кусков.
;
Внимательно посмотрите кусок с метки EFFx3 ... Хотя не важно, главное, что бы Вы были Счастливы ...
ССссори за опечатки, всё это делалось за час и я не обращал внимание на грамматику ... =)
Может что-нибудь ещё накодить ??? =) !!!
Спасибо. Но можно было и не писать столь большую программу, а дать след. код, который нельзя никак переделать для ассемблера, не умеющего ссылаться вперед:Цитата:
Сообщение от Robus
Код:EFFx3: PHASE FREEBLOCK ;Ещё один блок части, в котором
EFFx3_S: JP EFFx3_START ;используется метка на метку !
DB 192
DB 192
EFFx3_START:
DEPHASE
DEPACKXP:
DB 255
DB 255
FREEBLOCK:
;Start Of Programm
START:
;...............
Никогда не слышал о таком.Цитата:
Сообщение от Robus
На SjASM/SjASMPlus/Pasmo/Xasm/PazAsm/AsMSX/As80/Asm80... нельзя. Знаю только один такой ПЦшный ассемблер tniASM - он мульти-проходной.
Надо будет и что-нибудь с SjASMPlus попробовать сделать на досуге.
Прости, я перепутал ... Это моя оплошность ... Не CJASM, а SjASM... Однако мой компилирует, и ещё TASM 4.0 на Speccy ... Это и была проблема перехода на ALASM, который вообще ниодну мою прогу не компилировал, разве что если всю логику кода переписать. Просто я привык к универсальности. Но это всё вкусы ...Цитата:
Сообщение от Aprisobal
А писать код - приятно большой, маленький, не важно, главное делать.
Ех. Использую структуры (STRUCT). При первой же попытке поюзать заданный стракт вылетает с Exception'ом.Цитата:
Сообщение от Aprisobal
ЗЫ. Банальный тестовый код:
Цитата:
; common sprite structure
STRUCT SPRITE
NEXT WORD 0 ; 00 02 Next sprite in queue (0 - end)
PREV WORD 0 ; 02 02 Previous sprite in queue
NEXTDQ WORD 0 ; 04 02 Next display queue entry (0 - end)
FLAGS BYTE 3 ; 06 01 Flags
; 0: visibility (0 - not visible)
; 1: invalidated (1 - coordinates changed or new sprite)
; 2: delete flag (1 - delete it)
; 3: current visibility (1 - offscreen, preprocessed)
SPRNO BYTE 0 ; 07 01 Sprite number to display
X WORD 0 ; 08 02 X coordinate (pixels) on VSCREEN
Y BYTE 0 ; 0A 01 Y coordinate (pixels) on VSCREEN
DESC WORD 0 ; 0B 02 Sprite descriptor pointer (preprocessed)
SADDR WORD 0 ; 0D 02 Screen address (preprocessed)
HCLIP WORD 0 ; 0F 02 Horizontal clipping routine (preprocessed)
PENTRY WORD 0 ; 11 02 Putter entry (preprocessed)
PEND WORD 0 ; 13 02 Putter endpoint (preprocessed)
LOOKUP BYTE 0 ; 15 01 Lookup high byte (preprocessed)
ENDS
; first queue sprite (0 in visible field)
CSS_Q_FSPR SPRITE 0,0,0,0,0
Alex/AT, вот bugfix, пока следующая версия не вышла. См. аттачмент.
Вот спасибо!!! Respect :v2_clap2:Цитата:
Сообщение от Aprisobal
А можно один просьб?
Кусочек из мануалки.
Нельзя ли весь (не только цитированный) этот набор команд сделать отключаемым (опциональным). А то временами промахиваешься, а он все нормально компилит...Цитата:
"Extended instructions"
=======================
Of course the Z80 is only an 8 bit cpu, but sometimes ld hl,de would be nice. SjASMPlus now 'fakes' some instructions like that. This improves the readability of the source, but it might not be the fastest way to get the result. Also possibly some 'new' load instructions do affect the flags in ways you wouldn't expect.
Anyway, here's the list:
rl bc
rl de
rl hl
rr bc
rr de
rr hl
Может быть в версии 1.06 RC3 или 1.07.Цитата:
Сообщение от Alex/AT
Вышла новая версия SjASMPlus.Качать: [...вырезано...]Цитата:
Новое в 1.06 RC2: (2006-04-20)
------------------
- Исправлены некоторые ошибки в директивах STRUCT/ENDS
- Применены изменения к SjASMPlus от новой версии SjASM 0.39g, а именно:Цитата:
- ENDMAP directive.
- DEFM and DM synonyms for BYTE. (уже было)
- Some bug fixes:
- file size is reset when a new output file is opened. (уже было)
- 'bytes lost' warning fixed.
And thanks to Konami Man:
- PHASE and DEPHASE directives as synonyms of TEXTAREA and ENDT. (уже было)
- FPOS directive.
- Expanded OUTPUT directive.
- The possibility to generate a symbol file.
Исходники: [...вырезано...]
[bug] RC2: LABELSLIST при использовании вылетает в AV. Кондишны так до конца и не понял - но вылетал как на простом коде без модулей, так и на коде с модулями.
Упс, просто кое-что в этой версии сильно поменял(и буду дальше менять, чтобы сделать его мультипроходным), а про LABELSLIST забыл. Спасибо.Цитата:
Сообщение от Alex/AT
Багфикс:
Bin: http://zx.pk.ru/attachment.php?attachmentid=3108
Src: http://zx.pk.ru/attachment.php?attachmentid=3109
Что то мене не разобраться..
компил.я прошла
удачно все ок
а в эмуль не граузиться что я не так сделал??
Нельзя ли добавить опцию компиляции на ленту (tap) в виде загрузчик + код. Был бы очень признателен (возможно не я один). Батники напрягают. А z80 и SNA это все таки недоформаты (не хочу никого обидеть).
О, грамотный подход! Батники напрягают, поэтому пойду-ка понапрягаю авторов...Цитата:
Сообщение от jim
А для чего тогда эта ветка?Цитата:
Сообщение от nyuk
И я о том же. Хотя может кто-то счел бы опцию создания образа кассеты или диска лишней..Цитата:
Сообщение от Robus
Могу еще предложить: для совместимости с различными ассемблерами, использовать соответствующую директиву в начале текста (например: .alasm или .gens). мне кажется добавить одну строчку вначале - проще чем перелопачивать всю программу. тем более, что вроде как отличия синтаксиса не очень большие. есть поддержка популярного ассемблера - все ок! нет - выдается ошибка..