Sprinter SDK by nedoPC

Компьютер "Спринтер" http://sprinter.nedopc.org

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Sprinter SDK by nedoPC

Post by Shaos »

Вот как выглядит 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-шник :)

Code: Select all

robot "Exec" 
author "Shaos" 
main() 
{ 
def name[10]='fn.exe' 
exec(&name+1) 
say "\! call exit" 
} 

exec() // (&filename+1) 
{ 
say "\! ld de,(_reg_a)" 
say "\! ld hl,(_l_base)" 
say "\! add hl,de" 
say "\! add hl,de" 
say "\! ld bc,0040h" 
say "\! rst 10h" 
} 
Чтобы вставить ваш целиком асмовый кусок в код, ищите в вашем
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"
Last edited by Shaos on 22 Apr 2004 08:31, edited 2 times in total.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Sprinter SDK + локальные переменные

Post by Shaos »

До некоторых пор большой проблемой нашего Sprinter SDK было отсутствие
локальных переменных - все переменные в языке RW1 являются глобльными.
Хорошо, их нет - но их можно сымитировать! Во-первых, заводим массив
LOCAL размером M слов - это будет стек локальных переменных. Во-вторых,
заводим переменную LBASE, которая будет указывать на текущую вершину
стека (первоначальное ее значение - ноль). В начале каждой функции,
использующей локальные переменные надо писать LBASE=LBASE+n, где n -
число переменных, используемыхв данной функции, а в конце такой функции -
LBASE=LBASE-n. Обращение к локальным переменным внутри функции будет
оуществляться следующим образом: LOCAL[LBASE-1], LOCAL[LBASE-2] и т.д.
до LOCAL[LBASE-n]. Чтобы облегчить себе жизнь создадим RWI файл с именем
LOCAL.RWI:

Code: Select all

 @INI(1)=ocal[@1];lbase=0
 @BEG(1)=base=lbase+@1
 @END(1)=base=lbase-@1
 @L(1)=ocal[lbase-@1]
 @1=@L(1)
 @2=@L(2)
 @3=@L(3)
 @4=@L(4)
 @5=@L(5)
 @6=@L(6)
 @7=@L(7)
 @8=@L(8)
 @9=@L(9)
После этого мы получаем простейший и изящный механизм локальных
переменных и рекурсивных функций. Вот пример рекурсивной программы,
печатающей 20 первых чисел ряда Фиббоначи (1, 1, 2, 3, 5, и т.д.),
кроме того программа печатает в круглых скобках максимальную
использованную глубину стека локальных переменных:

Code: Select all

robot "Fib"
author "Shaos"
+inc/rw1_std.rwi
+inc/rw1p2.rwi
+local.rwi
main()
{
 def L@INI(256)
 printy=0
 printx=0
 lmax=0
 for(num=0;num<20;num++)
 {
   fib(num) // count L
   printn(num,L,lmax)
 }
 loop: goto loop
}
+lib/p2term.rwl

fib() // (A)
{
 L@BEG(3)
 L@1=A
 L@2=1
 if(L@1>1)
 {
   fib(L@1-1)
   L@3=L
   fib(L@1-2)
   L@2=L@3+L
 }
 fibres=L@2
 // count max deep (may be removed)
 if(lbase>lmax) lmax=lbase
 // end of count
 L@END(3)
 (fibres)
}

printn() // (A,B,C)
{
 printa=A
 printb=B
 printc=C
 termsetsay(printx,printy,#0E)
 say "[ &printa ] = &printb ( &printc )"
 printy=printy+1
}
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Sprinter SDK by nedoPC

Post by Shaos »

Добавил скриншот SDK в первое сообщение
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Sprinter SDK by nedoPC

Post by Shaos »

А вот так оно устанавливается и работает в виртуальной 98й винде из-под Virtual Box :)
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net