Внезапно, это нормальный синтаксис для чего-то почтенно архаичного, не помню уже, чего конкретно (pasmo?). Но, да, соглашусь, синтаксис странный, кто и зачем такое придумал...
Вид для печати
Кстати, я тут проверил от нечего делать. sjasm-то этот синтаксис всё ещё понимает. Ругается, но понимает.
В смысле, что значит всё ещё ? И почему это он не должен ругаться если ктото не читает инструкцию и использует команды языка вопреки его правилам и грамматики ? На такое вообще любой компилятор ругаться будет.
Какие в этом претензии к SjASMplus ?
Замени endm на endr , как положено в правилах, и не будет никакой ругни, всё замечательно компилируется.
Ну, а IRPC сделает?
Код:BXlt equ 0a5h
DBS. MACRO str,stre
IRPC x,<str>
db '&x&' xor BXlt
ENDM
db '&stre&' or 128 xor BXlt
ENDM
5D33 OpNum: DspStr
5D33 DF + rst 18h
dbs. <operator:>,< >
5D34 CA + db 'o' xor BXlt
5D35 D5 + db 'p' xor BXlt
5D36 C0 + db 'e' xor BXlt
5D37 D7 + db 'r' xor BXlt
5D38 C4 + db 'a' xor BXlt
5D39 D1 + db 't' xor BXlt
5D3A CA + db 'o' xor BXlt
5D3B D7 + db 'r' xor BXlt
5D3C 9F + db ':' xor BXlt
5D3D 05 + db ' ' or 128 xor BXlt
Насколько знаю IRP и IRPC готовых аналогов в SjASMplus нет, while есть, а этих не видел.
Если очень нужно чтото подобное, то можно как-то выкрутиться используя lua-скрипты, и даже более хитрую обработку строки провернуть, но это будет посложнее конечно, хотя и более универсально.
Но если честно я особо не припоминаю подобных функций и в других популярных у нас спектрумовских ассемблерах. И на практике даже и не знал что чтото такое зачемто нужно ))
Вообще в теме время от времени присутствует разработчик Ped7g, может быть если удастся обосновать необходимость данных фичь, то сможете уговорить их реализовать ))
Мне, если честно, более интересно было бы появление в SjASMplus возможности создания макросов с неопределённым количеством параметров, чтобы такой макрос можно было бы вызвать как вообще без параметра, так и с любым количеством.
Пусть это будет не macro , а например macro@ или macro$ или как-то по другому, параметры чтоб имели какое-то фиксированное название с порядковым номером, один со специальным именем (или нулевым номером) указывал номер последнего переданного, и их также можно было бы в lua перенаправить.
Вот тут можно было-бы неплохо развернуться. И тот же IRP например реализовать внешней библиотекой через lua, и много другого ))
sjasmplus doesn't have IRPC, you can get same machine code in some different way.
One of the options is to use virtual memory of DEVICE to post-process the string with xor like this:
which assembles as this listing shows (notice the memory at 5D34 written twice, first getting regular ASCII chars, second time being xor-ed):Код:BXlt equ 0a5h
DEVICE ZXSPECTRUM48 ; switch virtual device memory mode on
ORG $5D33 ; first do regular ASCII string
OpNum: rst $18 ; the "C literal suffix means
.str: DB "operator: "C ; to tag last byte with "or 128"
; now go over the ASCII string again and xor each byte:
.length equ $ - .str ; length for dot-repeater
ORG .str ; go back in virtual memory to start of str
.(.length) DB {b $} ^ BXlt ; .length-many-times xor content of virtual memory
SAVEBIN "temp.bin", OpNum, $-OpNum ; save resulting machine code
and hexa dump of saved binary file:Код:1 0000 BXlt equ 0a5h
2 0000 DEVICE ZXSPECTRUM48 ; switch virtual device memory mode on
3 0000 ORG $5D33 ; first do regular ASCII string
4 5D33 DF OpNum: rst $18 ; the "C literal suffix means
5 5D34 6F 70 65 72 .str: DB "operator: "C ; to tag last byte with "or 128"
5 5D38 61 74 6F 72
5 5D3C 3A A0
6 5D3E ; now go over the ASCII string again and xor each byte:
7 5D3E .length equ $ - .str ; length for dot-repeater
8 5D3E ORG .str ; go back in virtual memory to start of str
9 5D34 CA > DB {b $} ^ BXlt ; .length-many-times xor content of virtual memory
9 5D35 D5 > DB {b $} ^ BXlt
9 5D36 C0 > DB {b $} ^ BXlt
9 5D37 D7 > DB {b $} ^ BXlt
9 5D38 C4 > DB {b $} ^ BXlt
9 5D39 D1 > DB {b $} ^ BXlt
9 5D3A CA > DB {b $} ^ BXlt
9 5D3B D7 > DB {b $} ^ BXlt
9 5D3C 9F > DB {b $} ^ BXlt
9 5D3D 05 > DB {b $} ^ BXlt
There are for sure more possible ways, but not a simple way to replicate the exact syntax of your example, you need to convert that source for sjasmplus, sorry.Код:$ hd ~/zx/ped/scratch/temp.bin
00000000 df ca d5 c0 d7 c4 d1 ca d7 9f 05 |...........|
0000000b
Спасибо Ped7g за ваше внимание.
Я начал работать с M80 с конца 80-х и тогда других вариантов не было. А уже ближе к 2000-м начал подумывать об использовании чего нибудь посовременнее. Но, тогда уже было много наработок на M80 с его IRP/IRPC, и требовалось много изменений. Тем более, что основная заповедь гласит: "работает, не трожь!" И даже сейчас, с вашим SjASMPlus, видно что это не просто.