Вот как выглядит Sprinter SDK 2003 года будучи запущенным в Debian Linux через WINE (добавил картинку в октябре 2021 года):ПОСЛЕДНЯЯ ВЕРСИЯ ОТ 26 АПРЕЛЯ 2003 ГОДА: http://nedopc.org/nedopc/sprinter/download/sprinsdk.zip (725K)Нижеследующее сообщение появилось на форуме PetersPlus 28 июля 2003, а сейчас я решил продублировать его тут на форуме.
Вдруг кто-то еще не успел прочитать, как можно работать с ассемблером внутри RW1P2?
==========================================================================================
Пора сказать пару слов о том, как в SDK обращаться к функциям Estex и BIOS
Итак, когда вы пишете на RW1 вызов функции
func(1,2,3)то это превращается препроцессором в
A=1;B=2;C=3;call func и чтобы передать какие-то данные в ассемблер, нам нужно научиться читать регистры A,B и C напоминаю как использовать ассемблер:
say "\! ld a,b" итак, чтобы прочитать регистр A, используем:
say "\! ld hl,(_reg_a)" для регистров B и C соответственно
say "\! ld hl,(_reg_b)" и say "\! ld hl,(_reg_c)" обратно функция может возвращать резуьтаты в тех же регситрах A,B,C, но наиболее устоявшийся вариант для RW1 - это регистр L:
say "\! ld (_reg_l),hl" чуть сложнее получается значение адреса func(&array)
say "\! ld de,(_reg_a)" // значение в ячейках переменных
say "\! ld hl,(_l_base)" // получение базового адреса переменных
say "\! add hl,de"
say "\! add hl,de" // теперь в hl адрес переменной или массива
если мы зададим строку в виде
def arr[5]='str' то будем иметь массив 0x0002, 0x7473, 0x0072, 0x0000, 0x0000 (т.е. "пакет" из двух слов, каждый байт которых будет передавать букву) и чтобы передать указатель на такую строку в функцию на ассемблере придется сдвинуться на 1 ячеку, т.е. писать так:
func(&str+1) либо прибавлять два байта внутри функции на ассемблере. К слову если строку задавать в двойных кавычках, то на одно слово будет приходиться одна буква, а не две.
Вот примерчик, который будет запускать какой-нибудь EXE-шник
Чтобы вставить ваш целиком асмовый кусок в код, ищите в вашем
SHJ-проекте строку:
\add ${name}.a include '${EXEPATH}lib/z80/sprinter/back_sp.a' и вставляете следом за ней что-то аналогичное, но со своим файлом,
например:
\add ${name}.a include 'mycode.asm' а потом на RW1 можно вызывать функции из этого кода через
say "\! call mysub" P.S. Решил вставить несколько слов через несколько месяцев. Наверное многие путаются когда читают "регистры A, B, C". Требуется уточнить - эти регистры являются регистрами языка RW1, а не регистрами процессора Z80. Даже лучше их считать предопределенными переменными языка, имеющими специфическое назначение. Также можно сделать оговорку, что большими буквами мы будем обозначать регистры языка (A,B,C), а меленькими - процессора (a,b,c - кроме того они пишуся в кавычках и в ассемблерных инструкциях).P.P.S. Начиная с версии 2.2.0 (декабрь 2012) в компиляторе RW1 (ROBBYC) появилась директива ASM, т.е. теперь вместо say "\! ld a,b" можно писать asm "ld a,b"