видимо в версии gp48k чтото поменялось с макросами
Вид для печати
видимо в версии gp48k чтото поменялось с макросами
Не может быть.) Только # используется для других целей.
Код:1:
2: print_code macro vcode,v1,v2
3: ld a,vcode
4: rst $10
5: ld a,v1
6: rst 10h
7: if !nul &v2
8: ld a,v2
9: rst 10h
10: endif
11: endm
12:
13: - 0000 print_code 1,2,3
13: 0+7 0000 3E01 ld a,1
13: 7+11 0002 D7 rst $10
13: 18+7 0003 3E02 ld a,2
13: 25+11 0005 D7 rst 10h
13: - 0001 if !nul 3
13: 36+7 0006 3E03 ld a,3
13: 43+11 0008 D7 rst 10h
13: endif
13: - 0009 endm
14: ;print_code 1,2,
15: - 0009 print_code 1,2
15: 54+7 0009 3E01 ld a,1
15: 61+11 000B D7 rst $10
15: 72+7 000C 3E02 ld a,2
15: 79+11 000E D7 rst 10h
15: - 0000 if !nul
15: endif
15: - 000F endm
16:
17: - 000F end
Statistics:
3 passes
0 jr promotions
0 symbols
15 bytes
2 macro calls
133 macro bytes
0 invented symbols
Вот код:
Результат компиляции:Код:; zmac -i -m -h -o build/test-marg.hex -x build/test-marg.lst test-marg.asm
ROM_CLS equ #0DAF
ROM_OPEN_CHANNEL equ #1601 ; a=channel
ROM_PRINT equ #203C ; de=text, bc=length
CHAR_AT equ #16
CHAR_INK equ #10
CHAR_PAPER equ #11
CHAR_BRIGHT equ #13
print_code macro vcode,v1,v2
ld a,vcode
rst #10
ld a,v1
rst #10
if !nul &v2
ld a,v2
rst #10
endif
endm
org #8000
call ROM_CLS
print_code CHAR_AT,0,0
print_code CHAR_PAPER,3
print_code CHAR_BRIGHT,1
ld hl,message
call printf
ret
message:
db 'HELLO WORLD',#00
printf:
ld a,(hl)
or a
ret z
rst #10
inc hl
jr printf
Код:$ ./zmac -i -m -h -o build/test-marg.hex -x build/test-marg.lst test-marg.asm
test-marg.asm:26: Syntax error
test-marg.asm:26: Balance error
test-marg.asm:27: Syntax error
test-marg.asm:27: Syntax error
test-marg.asm:27: Balance error
test-marg.asm:28: Syntax error
test-marg.asm:28: Syntax error
test-marg.asm:28: Balance error
test-marg.asm:26: Undeclared error
test-marg.asm:27: Undeclared error
test-marg.asm:28: Undeclared error
В целях поиздеваться над мозгом, попробовал накалякать мелкую библиотечку с lua функциями для sjasmplus, генерирующую этот тип хекса, если конечно правильно разобрался в формате. :v2_confu:
Пользоваться -> в начало исходника вставить: include IntelHEX.asm
макросом ihexname# имя.hex создать файл для вывода
и макросами ihex# начало_блока,длина запихивать блоки.
Минус - имя файла не понимает кавычек/апострофов - в этом эксперименте мне лень возиться было :rolleyes:
- - - Добавлено - - -
Не делал запись окончания файла. Проглядел и так и не понял нужна она вообще в нашем случае или нет.:v2_conf2:
----------------------------
Добавил запись окончания файла -
макрос без параметров ihexend#
Немного доработал, причесал (хотя может наоборот), добавил обработку кавычек, растянул запись до максимума (255 байт данных), впихнул запись нулевого расширенного адреса, добавил подобие лицензии (прям как большой :v2_tong: ), малость багов думаю тоже добавил, хотя надеюсь что вру )) .
Теперь думаю а нафига оно то мне было надо ? :v2_confu: Впрочем было интересно немного в lua поковыряться. ;)
v0.1
А я вот удивляюсь. ZXMAK, ну ты ж грамотный мужик, вроде бы.) Неужто сам не в состоянии поиграться с макро средствами этого zmac-а? Или нянька нужна?)
M80, вот вы угадали, я как-раз и полез добавлять, в итоге завис на пару дней, разбирая код. Поняв что это надолго, появилась идея реализовать более чистую реализацию на lex/yacc, в итоге еще день ушел и я увяз в грамматиках. По итогу новые макросы так и не добавил, а время потратил. Впрочем разобрал как zmac работает, реализация честно говоря не очень надежная. Если большой код компилить, то посыпется песок... Нужно переделывать :)
Версия от gp48k еще более закрученная, вначале была мысль портировать из нее лексический анализатор в оригинальную версию, но как оказалось в ней прикручено так много костылей, что даже в лексический анализатор код сразу пишет...
Погуглил альтернативы на lex/yacc, но ничего для Z80 не нашел, есть только обсуждения где пишут что проще код вручную разбирать. И кстати в zmac лексический анализатор вручную написан, lex не используется. Поэтому в нем много костылей и дорабатывать код сложно.
Похожий подход был во встроенном ассемблере первого zxmak, там вообще весь код трансляции инструкции в код вручную написан был. Хотелось бы универсальный ассемблер, нормально переваривающий сложные вложенные макросы и выражения.
Когда то, лет эдак 20 назад, пытался было заменить этот М80 на что то посовременнее. Ну куда это годиться, 1981-го года выпуска, хоть и Microsoft(с), но под CP/M - прям, стыдоба какая то.) Кинулся, было, кучу разных ассемблеров перепробовал... и нифига. То валятся, то одно не нравится, то другое... Правда, исходник был не мал, 36000 строк где то. Ну и макро, типа, IRP/IRPC использовал. В общем, потыкался я и успокоился. Правда, на zmac не наткнулся.( А изделие проработало аж до 2012-го года, хотя оптимистично рассчитывал до 2000-го.)
может кто подскажет исходники z80 ассемблера с лексикой описанной в lex файле, а не вручную в коде написанной?
Странно, что столько ассемблеров для z80 написали, но ни одного lex файла гугл не находит :)
может кто подскажет, нужны примеры для тестирования синтаксического анализатора для z80 ассемблера. Интересуют разнообразные необычные варианты примеров кода, которые должны работать.