nedoPC.org

Community of electronics hobbyists established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Jun 2022 13:18



Reply to topic  [ 5 posts ] 
Sprinter SDK by nedoPC 
Author Message
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 20217
Location: Silicon Valley
Reply with quote
Вот как выглядит Sprinter SDK от апреля 2003 будучи запущенным в линуксе через WINE (добавил картинку в октябре 2021 года):



ПОСЛЕДНЯЯ ВЕРСИЯ ОТ 26 АПРЕЛЯ 2003 ГОДА: http://nedopc.org/nedopc/sprinter/download/sprinsdk.zip (725K)

Пора сказать пару слов о том, как в 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:
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"

_________________
:eugeek: https://twitter.com/Shaos1973


Last edited by Shaos on 22 Apr 2004 09:31, edited 2 times in total.



28 Oct 2003 13:15
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 20217
Location: Silicon Valley
Reply with quote
Post 
Это сообщение появилось на форуме PetersPlus 28 июля 2003, а сейчас я решил продублировать его в моем форуме - вдруг кто-то еще не успел прочитать, как можно работать с ассемблером внутри RW1P2!

Про Sprinter SDK можно почитать тут http://www.nedopc.org/nedopc/sprinter/sdk/

_________________
:eugeek: https://twitter.com/Shaos1973


28 Oct 2003 13:17
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 20217
Location: Silicon Valley
Reply with quote
До некоторых пор большой проблемой нашего 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:
 @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:
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
}

_________________
:eugeek: https://twitter.com/Shaos1973


01 May 2004 21:51
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 20217
Location: Silicon Valley
Reply with quote
Добавил скриншот SDK в первое сообщение

_________________
:eugeek: https://twitter.com/Shaos1973


04 Oct 2021 09:38
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 20217
Location: Silicon Valley
Reply with quote
А вот так оно устанавливается и работает в виртуальной 98й винде из-под Virtual Box :)


Attachments:
Screenshot from 2021-11-24 22-34-50.png
Screenshot from 2021-11-24 22-34-50.png [ 431.84 KiB | Viewed 2618 times ]
Screenshot from 2021-11-24 22-35-43.png
Screenshot from 2021-11-24 22-35-43.png [ 429.66 KiB | Viewed 2618 times ]
Screenshot from 2021-11-24 22-39-53.png
Screenshot from 2021-11-24 22-39-53.png [ 173.26 KiB | Viewed 2618 times ]

_________________
:eugeek: https://twitter.com/Shaos1973
03 Dec 2021 22:38
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 5 posts ] 

Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  

Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.