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