nedoPC-стандарт онлайновых приложений

Публичный форум для http://www.nedopc.org/nedopc

Moderator: Shaos

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

Post by Shaos »

bar wrote:
Shaos wrote:2) гипотетический байткод с функционального языка программирования Hope, т.к. это функциональщина, то теоретически можно поддержать ограниченное подмножество функционала таких языков как Lisp, Haskell, Erlang.
Я не обратил сразу внимания на слово "гипотетический". Теперь же я не понимаю вкладываемого в него смысла. Гипотетический -- значит несуществующий? По-крайней мере в сорцах Hope я не нашёл никаких упоминаний про байткод.
Угу - смысл понят верно - байткода Hope ещё нет :roll:
Поэтому я и стал пока копать в сторону RW0 - что есть существующий и более тривиальный байт-код...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re:

Post by Shaos »

Shaos wrote:Поэтому я и стал пока копать в сторону RW0 - что есть существующий и более тривиальный байт-код...
Ну мой движок RW0 (язык Robot Warfare 1 теперь называется Robby) на JS существует уже более 10 лет - см. Rgrid - виртуальная машина роботов в браузере (JavaScript)
Поэтому задача по сути выполнена - можно строить онлайн приложения с управлением мышой типа http://Circuits.CC или http://Ternaro.com
Разве что ещё нужно замкнуть на нативные контролы (кнопки, чекбоксы, текстовые поля ввода) - тогда можно нагородить аналоги вот такого:
Screenshot from 2023-04-08 12-03-00.png
И оно даже будет крутиться в старых браузерах :mrgreen:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: NedoPC-стандарт онлайновых приложений

Post by Shaos »

Можно поэкспериментировать с прикручиванием HTML-ных контролов к ROBBY, продолжая развивать минимальный пример из соседнего топика.

Пока в Robby-онлайн используется вывод картинки по номеру в определённые координаты:

Code: Select all

   if(N==#FFFF) // mouse click
   {
      select x y
      set #FF
   }
по мышиному клику, который превращается в сообщение роботу вот такой JS-фунцией:

Code: Select all

function action(x,y) {
 $R.event(0,-1,1,x,y);
}
а также можно выводить попап с сообщением (alert) через команды PRINT и SAY (правда в последнем случае вывод значений переменных пока не работает).

И ещё остаётся неисследованная возможность заводить команды COMMAND (для вызова изнутри робота), реализация которых на JS добавлялась бы через колбеки:

Code: Select all

// $R.callback - get or set callback for external command
// 1st parameter (i) = numeric identifier of the command
// 2nd parameter (optional) - function(robot,a,b,c)
// if 2nd parameter is not set then it returns callback

$R.callback = function(i) {
 var f = arguments[1];
 if(f) {
   commands[i] = f;
 }
 return commands[i];
}
Вот это мы сейчас и попробуем...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: NedoPC-стандарт онлайновых приложений

Post by Shaos »

Мда - надо пофиксить:

Code: Select all

// $R.callback - get or set callback for external command
// 1st parameter - numeric identifier of the command
// 2nd parameter (optional) - function(robot) implementing command
// if 2nd parameter is not set then it returns stored function

$R.callback = function(i) {
 var f = arguments[1];
 if(f) {
   this.commands[i] = f;
 }
 return this.commands[i];
}
вот теперь COMMAND работает :roll:

Code: Select all

// robbyc -r EXAMPLE.R

author "Shaos"
robot "Example"
main()
{
 while(1)
 {
   code = 0
   recv code
   if(N==0) continue
   if(N==#FFFF) // mouse click
   {
      select x y
      set #FF
      if(x==0 && y==0)
      {
         A = x
         B = y
         C = k
         COMMAND 1
      }
   }
 }
}
и вот с таким HTML:

Code: Select all

<HTML>
<HEAD><TITLE>Rgrid example</TITLE>
<META HTTP-EQUIV="Content-Language" content="en">
<META HTTP-EQUIV="Content-Type" content="text/html; charset=utf-8">
<SCRIPT type="text/javascript" src="Rgrid.js"></SCRIPT>
<SCRIPT type="text/javascript" src="robot.js"></SCRIPT>
</HEAD>
<BODY BGCOLOR=#000000 TEXT=#00AA00 LINK=#00AAAA>
<p id="here" align=center>Rgrid requires a modern web-browser to work properly...</p>
<font size=-4>
<p id="pow" align=center>Powered...</p>
</font>
</BODY>
<script type="text/javascript">

$R.prefix = "pcb/";

$_("pow","Powered by " + $R.powered());

function command1(r) {
 alert("Robot "+r.regs[9]+" "+r.regs[0xA]+" "+r.regs[0xB]+" "+r.regs[0xC]);
}

$R.callback(1,command1);

function action(x,y) {
 $R.event(0,-1,1,x,y);
}

if($R.grid('here',80,50,action)>0) {
 $R.add(robot);
 $R.start();
}

</script>
</HTML>
при кликаньи в левую-верхнюю клетку выдаёт вот такое:
Screenshot from 2023-04-15 01-57-34.png
Это значения регистров робота I A B С после слова Robot, как и было закодено в HTML для COMMAND 1:

Code: Select all

function command1(r) {
 alert("Robot "+r.regs[9]+" "+r.regs[0xA]+" "+r.regs[0xB]+" "+r.regs[0xC]);
}

$R.callback(1,command1);
Регистр I (девятый регистр) - это порядковый номер робота, начиная с 1 (поэтому оно тут 1),
а вот более одного робота пока не взлетают - буду чинить потом :cry:

P.S. Обновил Rgrid.js до v0.5 (фикс COMMAND): https://gitlab.com/nedopc/sdk/-/tree/master/rgrid
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC-стандарт онлайновых приложений

Post by Shaos »

А теперь пробуем чекбоксы - меняем HTML таким образом:

Code: Select all

<HTML>
<HEAD><TITLE>Rgrid example</TITLE>
<META HTTP-EQUIV="Content-Language" content="en">
<META HTTP-EQUIV="Content-Type" content="text/html; charset=utf-8">
<SCRIPT type="text/javascript" src="Rgrid.js"></SCRIPT>
<SCRIPT type="text/javascript" src="robot.js"></SCRIPT>
</HEAD>
<BODY BGCOLOR=#000000 TEXT=#00AA00 LINK=#00AAAA>
<p id="here" align=center>Rgrid requires a modern web-browser to work properly...</p>
<p align=center>
<input name="el1" type="checkbox" onclick="inputcheck(10)" id="input10">
<input name="el2" type="checkbox" onclick="inputcheck(20)" id="input20">
<input name="el3" type="checkbox" onclick="inputcheck(30)" id="input30">
</p>
<font size=-4>
<p id="pow" align=center>Powered...</p>
</font>
</BODY>
<script type="text/javascript">

$R.prefix = "pcb/";

$_("pow","Powered by " + $R.powered());

function command1(r) {
 alert("Robot "+r.regs[9]+" "+r.regs[0xA]+" "+r.regs[0xB]+" "+r.regs[0xC]);
}

$R.callback(1,command1);

function action(x,y) {
 $R.event(0,-1,1,x,y);
}

if($R.grid('here',20,12,action)>0) {
 $R.add(robot);
 $R.start();
}

function inputcheck(i) {
 var e = $("input"+i);
 if(e.checked) i++;
 $R.event(0,-5,i);
}
</script>
</HTML>
Этот код добавляет под сеткой 3 чекбокса:
Screenshot from 2023-04-15 03-45-17.png
Модифицируем робота вот так:

Code: Select all

author "Shaos"
robot "Example"
main()
{
 def pak[9]
 def buf[10]
 pak[0]=8
 buf[0]=13
 for(A=1;A<=8;A++)
 {
    pak[A] = 8-A
    buf[A] = 13
 }
 while(1)
 {
   code = 0
   recv code
   if(N==0) continue
   if(N==#FFFF) // mouse click
   {
      select x y
      set #FF
   }
   if(N==#FFFB) // GUI action
   {
      A = k
      B = n
      C = code
      COMMAND 1
   }
 }
}
Теперь при выборе первого чекбокса выскочит вот такой попап (Robot 1 далее время, потом код -5=0xFFFB и далее идентификатор события):
Screenshot from 2023-04-15 03-43-44.png
В данном случае идентификатор события 11 - т.е. контрол с кодом 10 включён (+1).

Далее снимаем чек с первого чекбокса - теперь идентификатор события 10 (чекбокс выключен):
Screenshot from 2023-04-15 03-44-05.png
И для разнообразия ставим чек на третьем чекбоксе:
Screenshot from 2023-04-15 03-44-25.png
В данном случае попапчик нам нужен только для отладки с помощью COMMAND 1 выводящем значения регистров A B C куда предварительно записаны K (время), N (код источника) и CODE (код пришедший из очереди сообщений) - так можно видеть, что всё сработало как надо.

P.S. По идее можно разными отрицательными кодами источника кодировать разные контролы, а в коде данных можно указывать взведён чекбокс или нет - в этом случае функция обработчик может выглядеть вот так:

Code: Select all

function inputcheck(i) {
 var e = $("input"+i);
 $R.event(0,-i,e.checked);
}
(тут последние 2 аргумента опущены, но в них что-то ещё можно передавать - внутри робота они принимаются как регистры X и Y)

P.P.S. Вот прям сразу можно ещё и обычные кнопки поддержать:

Code: Select all

<input value="Click" type="button" onclick="inputcheck(30)" id="input30">
Screenshot from 2023-04-15 04-10-38.png
А вот для радио-кнопок (type=radio) надо будет дополнительный код на JS городить, который будет выключать лишние радиокнопки...

P.P.P.S. Не - лишние радиокнопки сами выключаются если у них один и тот же name (а вот id у них должны быть разные, чтобы робот умел их отличать друг от друга).
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC-стандарт онлайновых приложений

Post by Shaos »

Теперь о полях ввода (однострочных type=text и многострочных textarea)

Текст можно попробовать засылать как многословное событие - внутри робота его надо получать через RECVP

А можно представить текст как файл, уведомляя робота однословным событием, что тот или иной текст (файл) поменялся

На обновление строки ввода должно отрабатывать событие onchange:

Code: Select all

<input type=text size=9 onchange="inputcheck(10)" id="input10">
И на нажатие Enter или уход из контрола когда там что-то поменялось, вызывается событие, уходящее в робота:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC-стандарт онлайновых приложений

Post by Shaos »

Обновил Rgrid.js до v0.6 (фикс SEND и RECV): https://gitlab.com/nedopc/sdk/-/tree/master/rgrid

Теперь попробую послать введённый в поле текстового ввода текст роботу - для этого делаем следующие изменения в HTML:

Code: Select all

<input type=text size=9 onchange="textchanged(10)" id="input10">
...
function textchanged(i) {
 var s = $_("input"+i);
 var ascii = [];
 for (var j = 0; j<s.length; j++) {
  ascii.push(s[j].charCodeAt(0));
 }
 $R.event(0,-i,ascii);
}
Функция $_ досталась фреймворку Rgrid.js по наследству от моего же фреймворка Webitabe, который я развил до предела в 2012 году - эта функция возвращает текстовое значение элемента HTML по ID - в данном случае это value контрола text, которое затем превращается в массив ASCII-кодов (а что делать с UTF8?) и передаётся роботу как сообщение-пакет (может имеет смысл вставить такую разборку строки на запчасти внутрь фреймворка?).

P.S. Хотя с UTF8 вроде бы что-то поболее чем ASCII-коды возвращает (и это не Unicode):
Screenshot from 2023-04-16 03-52-02.png

Code: Select all

5: 1088 = р
​6: 1091 = у
​7: 1089 = с
​8: 1089 = с
​9: 1082 = к
​10: 1080 = и
​11: 1081 = й
P.P.S. А нет - это UTF8 т.к. всё совпадает вот с этой табличкой:
https://www.w3schools.com/charsets/ref_utf_cyrillic.asp
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC-стандарт онлайновых приложений

Post by Shaos »

Перенёс преобразование строки в массив внутрь Rgrid.js (будет частью v0.7) - плюс там ещё длину посылки надо было указывать в первом отправляемом слове и RECVP был немного "поломатый".

Теперь прямо при объявлении контрола можно указывать добавление события с текстом по изменению состояния (по Enter или покиданию изменённого контрола):

Code: Select all

<input type=text size=9 onchange="$R.event(0,-10,$_('input10'))" id="input10">
и всё отрабатывает как надо:
Screenshot from 2023-04-16 19-34-43.png
(в ячейке 5 теперь длина пакета 8 и далее идут коды символов из текстового поля ввода)

P.S. Сетку пока отключать нельзя т.к. в функции $R.grid идёт заполнение кое-каких операционных кешей для RobbyVM - непомню зачем я это сделал, но надо их оттуда вынести, тогда grid будет независим от роботов и можно будет делать другие виртуальные машины (как собственно и задумывалось в Webitable) либо запускать роботов без grid (это будет нужно для веб-приложений где только контролы).
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC-стандарт онлайновых приложений

Post by Shaos »

Для вывода русского текста через робота (скажем на сетку) придётся провести преобразование из UTF8 в альтернативную кодировку доса - в этом случае в робота надо воткнуть таблицу перекодировки, которая бы переводила UTF8 с кодами от 1025 (Ё) до 1105 (ё) т.е. всего 81 ячейка (ну или 82, если стартовать с круглого кода 1024):

Code: Select all

Char   Dec     Hex     CP866   Name
Ѐ      1024    0400            CYRILLIC CAPITAL LETTER IE WITH GRAVE
Ё      1025    0401    0xF0    CYRILLIC CAPITAL LETTER IO
Ђ      1026    0402            CYRILLIC CAPITAL LETTER DJE
Ѓ      1027    0403            CYRILLIC CAPITAL LETTER GJE
Є      1028    0404            CYRILLIC CAPITAL LETTER UKRAINIAN IE
Ѕ      1029    0405            CYRILLIC CAPITAL LETTER DZE
І      1030    0406            CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
Ї      1031    0407            CYRILLIC CAPITAL LETTER YI
Ј      1032    0408            CYRILLIC CAPITAL LETTER JE
Љ      1033    0409            CYRILLIC CAPITAL LETTER LJE
Њ      1034    040A            CYRILLIC CAPITAL LETTER NJE
Ћ      1035    040B            CYRILLIC CAPITAL LETTER TSHE
Ќ      1036    040C            CYRILLIC CAPITAL LETTER KJE
Ѝ      1037    040D            CYRILLIC CAPITAL LETTER I WITH GRAVE
Ў      1038    040E            CYRILLIC CAPITAL LETTER SHORT U
Џ      1039    040F            CYRILLIC CAPITAL LETTER DZHE
А      1040    0410    0x80    CYRILLIC CAPITAL LETTER A
Б      1041    0411    0x81    CYRILLIC CAPITAL LETTER BE
В      1042    0412    0x82    CYRILLIC CAPITAL LETTER VE
Г      1043    0413    0x83    CYRILLIC CAPITAL LETTER GHE
Д      1044    0414    0x84    CYRILLIC CAPITAL LETTER DE
Е      1045    0415    0x85    CYRILLIC CAPITAL LETTER IE
Ж      1046    0416    0x86    CYRILLIC CAPITAL LETTER ZHE
З      1047    0417    0x87    CYRILLIC CAPITAL LETTER ZE
И      1048    0418    0x88    CYRILLIC CAPITAL LETTER I
Й      1049    0419    0x89    CYRILLIC CAPITAL LETTER SHORT I
К      1050    041A    0x8A    CYRILLIC CAPITAL LETTER KA
Л      1051    041B    0x8B    CYRILLIC CAPITAL LETTER EL
М      1052    041C    0x8C    CYRILLIC CAPITAL LETTER EM
Н      1053    041D    0x8D    CYRILLIC CAPITAL LETTER EN
О      1054    041E    0x8E    CYRILLIC CAPITAL LETTER O
П      1055    041F    0x8F    CYRILLIC CAPITAL LETTER PE
Р      1056    0420    0x90    CYRILLIC CAPITAL LETTER ER
С      1057    0421    0x91    CYRILLIC CAPITAL LETTER ES
Т      1058    0422    0x92    CYRILLIC CAPITAL LETTER TE
У      1059    0423    0x93    CYRILLIC CAPITAL LETTER U
Ф      1060    0424    0x94    CYRILLIC CAPITAL LETTER EF
Х      1061    0425    0x95    CYRILLIC CAPITAL LETTER HA
Ц      1062    0426    0x96    CYRILLIC CAPITAL LETTER TSE
Ч      1063    0427    0x97    CYRILLIC CAPITAL LETTER CHE
Ш      1064    0428    0x98    CYRILLIC CAPITAL LETTER SHA
Щ      1065    0429    0x99    CYRILLIC CAPITAL LETTER SHCHA
Ъ      1066    042A    0x9A    CYRILLIC CAPITAL LETTER HARD SIGN
Ы      1067    042B    0x9B    CYRILLIC CAPITAL LETTER YERU
Ь      1068    042C    0x9C    CYRILLIC CAPITAL LETTER SOFT SIGN
Э      1069    042D    0x9D    CYRILLIC CAPITAL LETTER E
Ю      1070    042E    0x9E    CYRILLIC CAPITAL LETTER YU
Я      1071    042F    0x9F    CYRILLIC CAPITAL LETTER YA
а      1072    0430    0xA0    CYRILLIC SMALL LETTER A
б      1073    0431    0xA1    CYRILLIC SMALL LETTER BE
в      1074    0432    0xA2    CYRILLIC SMALL LETTER VE
г      1075    0433    0xA3    CYRILLIC SMALL LETTER GHE
д      1076    0434    0xA4    CYRILLIC SMALL LETTER DE
е      1077    0435    0xA5    CYRILLIC SMALL LETTER IE
ж      1078    0436    0xA6    CYRILLIC SMALL LETTER ZHE
з      1079    0437    0xA7    CYRILLIC SMALL LETTER ZE
и      1080    0438    0xA8    CYRILLIC SMALL LETTER I
й      1081    0439    0xA9    CYRILLIC SMALL LETTER SHORT I
к      1082    043A    0xAA    CYRILLIC SMALL LETTER KA
л      1083    043B    0xAB    CYRILLIC SMALL LETTER EL
м      1084    043C    0xAC    CYRILLIC SMALL LETTER EM
н      1085    043D    0xAD    CYRILLIC SMALL LETTER EN
о      1086    043E    0xAE    CYRILLIC SMALL LETTER O
п      1087    043F    0xAF    CYRILLIC SMALL LETTER PE
р      1088    0440    0xE0    CYRILLIC SMALL LETTER ER
с      1089    0441    0xE1    CYRILLIC SMALL LETTER ES
т      1090    0442    0xE2    CYRILLIC SMALL LETTER TE
у      1091    0443    0xE3    CYRILLIC SMALL LETTER U
ф      1092    0444    0xE4    CYRILLIC SMALL LETTER EF
х      1093    0445    0xE5    CYRILLIC SMALL LETTER HA
ц      1094    0446    0xE6    CYRILLIC SMALL LETTER TSE
ч      1095    0447    0xE7    CYRILLIC SMALL LETTER CHE
ш      1096    0448    0xE8    CYRILLIC SMALL LETTER SHA
щ      1097    0449    0xE9    CYRILLIC SMALL LETTER SHCHA
ъ      1098    044A    0xEA    CYRILLIC SMALL LETTER HARD SIGN
ы      1099    044B    0xEB    CYRILLIC SMALL LETTER YERU
ь      1100    044C    0xEC    CYRILLIC SMALL LETTER SOFT SIGN
э      1101    044D    0xED    CYRILLIC SMALL LETTER E
ю      1102    044E    0xEE    CYRILLIC SMALL LETTER YU
я      1103    044F    0xEF    CYRILLIC SMALL LETTER YA
ѐ      1104    0450            CYRILLIC SMALL LETTER IE WITH GRAVE
ё      1105    0451    0xF1    CYRILLIC SMALL LETTER IO
На самом деле тут всё относительно просто и можно чисто процедурно подменить - вот пример на языке Robby:

Code: Select all

   recv buf[0]
   if(N<=-10) // GUI action
   {
      B = buf[0] // length
      for(A=1;A<=B;A++)
      {
        code = buf[A]
        if(code==1025) code = #F0
        if(code==1105) code = #F1
        if(code>=1040 && code<=1087) code = #80 + code - 1040
        if(code>=1088 && code<=1103) code = #E0 + code - 1088
        select A 0
        set code
      }
   }
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC-стандарт онлайновых приложений

Post by Shaos »

C textarea тоже всё хорошо :)
Screenshot from 2023-04-16 20-56-49.png
Вот такой HTML:

Code: Select all

<textarea rows=4 cols=20 onchange="$R.event(0,-10,$_('input10'))" id="input10">
placeholder
</textarea>
и вот обработчик в Robby:

Code: Select all

   def buf[32]
   ...
   recvp buf[0]
   if(N<=-10) // GUI action
   {
      B = 0
      C = 0
      for(A=1;A<=buf[0];A++)
      {
        code = buf[A]
        if(code==1025) code = #F0
        if(code==1105) code = #F1
        if(code>=1040 && code<=1087) code = #80 + code - 1040
        if(code>=1088 && code<=1103) code = #E0 + code - 1088
        if(code==10) // newline
        {
           B = 0
           C = C + 1
        }
        else
        {
           select B C
           set code
           B = B + 1
        }
      }
   }
Обновил https://gitlab.com/nedopc/sdk/-/tree/master/rgrid до v0.7

P.S. Но всё-таки большие тексты лучше по нажатию на кнопку через файлы в робота вводить т.к. там будут ограничения по размеру 32K (область данных робота с отрицательными адресами), а не размер массива объявленного внутри программы как в случае многословных сообщений, а так уже можно начинать писать онлайн реализацию 3niti alpha на Robby :mrgreen:

P.P.S. Раздвоение одной буквы при выводе placeholder -> placeholddr было связано с тем, что размер принимающего буфера в программе на языке Robby был недостаточен (т.е. далее шли другие переменные, например code) - увеличил размер буфера c 10 до 32 и всё стало лучше - это лишнее доказательство того, что для textarea надо переходить на файлы...
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC-стандарт онлайновых приложений

Post by Shaos »

Для современных браузеров можно где-то сбоку опционально приделать canvas и реализовать Robby-команды PIXEL/CLEAR, COLOR, FILL и TEXT для рисования на графический экран:
Screenshot from 2023-04-16 22-31-11.png
P.S. Ещё можно сделать сайт, где бы пользователь мог ввести текст своей программы на Robby, скомпилировать (скажем через сервер, на котором бы запускался robbyc) и запустить в своём браузере (в Rgrid.js прямо сейчас уже возможно робота брать извне как строку с JSON-ом, а не как подключаемый JS-файл)...
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC-стандарт онлайновых приложений

Post by Shaos »

Выпадающее меню для робота выглядит как текстовая строка ввода - при выборе нового значения оно будет послано в робота с нужным идентификатором контрола (в данном случае -50):

Code: Select all

<select name="value" id="input50" onchange="$R.event(0,-50,$_('input50'))">
<option value="N">N</option>
<option value="O">O</option>
<option value="P">P</option>
<option value="Z">Z</option>
</select>
Screenshot from 2023-04-21 21-48-47.png
combo1.jpg
combo2.jpg
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC-стандарт онлайновых приложений

Post by Shaos »

Ещё прицепить возможность чтения аргументов из урла и всё - можно начинать писать любые онлайн приложения на Robby :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC-стандарт онлайновых приложений

Post by Shaos »

К вопросу о том как работать с большими числами - как известно в Robby результат математических операций всегда сохраняется в 16-битном регистре L, однако, в соответствии с поздней спецификацией, старшая часть результата (старшее 16-битное слово) идёт в регистр H - соответственно по содержимому регистра H можно судить о том, было переполнение или нет - например, если мы будем последовательно возводить в квадрат числа и выводить в лог значения числа, регистра H и регистра L:

Code: Select all

(num*num) // result in H and L
num = num + 1
под спойлером печать значений от 170 до 365 с квадратом разделённым на 2 слова как это считается в Rgrid:

 square

Code: Select all

Robot 1 : 170 0 28900
Robot 1 : 171 0 29241
Robot 1 : 172 0 29584
Robot 1 : 173 0 29929
Robot 1 : 174 0 30276
Robot 1 : 175 0 30625
Robot 1 : 176 0 30976
Robot 1 : 177 0 31329
Robot 1 : 178 0 31684
Robot 1 : 179 0 32041
Robot 1 : 180 0 32400
Robot 1 : 181 0 32761
Robot 1 : 182 0 -32412
Robot 1 : 183 0 -32047
Robot 1 : 184 0 -31680
Robot 1 : 185 0 -31311
Robot 1 : 186 0 -30940
Robot 1 : 187 0 -30567
Robot 1 : 188 0 -30192
Robot 1 : 189 0 -29815
Robot 1 : 190 0 -29436
Robot 1 : 191 0 -29055
Robot 1 : 192 0 -28672
Robot 1 : 193 0 -28287
Robot 1 : 194 0 -27900
Robot 1 : 195 0 -27511
Robot 1 : 196 0 -27120
Robot 1 : 197 0 -26727
Robot 1 : 198 0 -26332
Robot 1 : 199 0 -25935
Robot 1 : 200 0 -25536
Robot 1 : 201 0 -25135
Robot 1 : 202 0 -24732
Robot 1 : 203 0 -24327
Robot 1 : 204 0 -23920
Robot 1 : 205 0 -23511
Robot 1 : 206 0 -23100
Robot 1 : 207 0 -22687
Robot 1 : 208 0 -22272
Robot 1 : 209 0 -21855
Robot 1 : 210 0 -21436
Robot 1 : 211 0 -21015
Robot 1 : 212 0 -20592
Robot 1 : 213 0 -20167
Robot 1 : 214 0 -19740
Robot 1 : 215 0 -19311
Robot 1 : 216 0 -18880
Robot 1 : 217 0 -18447
Robot 1 : 218 0 -18012
Robot 1 : 219 0 -17575
Robot 1 : 220 0 -17136
Robot 1 : 221 0 -16695
Robot 1 : 222 0 -16252
Robot 1 : 223 0 -15807
Robot 1 : 224 0 -15360
Robot 1 : 225 0 -14911
Robot 1 : 226 0 -14460
Robot 1 : 227 0 -14007
Robot 1 : 228 0 -13552
Robot 1 : 229 0 -13095
Robot 1 : 230 0 -12636
Robot 1 : 231 0 -12175
Robot 1 : 232 0 -11712
Robot 1 : 233 0 -11247
Robot 1 : 234 0 -10780
Robot 1 : 235 0 -10311
Robot 1 : 236 0 -9840
Robot 1 : 237 0 -9367
Robot 1 : 238 0 -8892
Robot 1 : 239 0 -8415
Robot 1 : 240 0 -7936
Robot 1 : 241 0 -7455
Robot 1 : 242 0 -6972
Robot 1 : 243 0 -6487
Robot 1 : 244 0 -6000
Robot 1 : 245 0 -5511
Robot 1 : 246 0 -5020
Robot 1 : 247 0 -4527
Robot 1 : 248 0 -4032
Robot 1 : 249 0 -3535
Robot 1 : 250 0 -3036
Robot 1 : 251 0 -2535
Robot 1 : 252 0 -2032
Robot 1 : 253 0 -1527
Robot 1 : 254 0 -1020
Robot 1 : 255 0 -511
Robot 1 : 256 1 0
Robot 1 : 257 1 513
Robot 1 : 258 1 1028
Robot 1 : 259 1 1545
Robot 1 : 260 1 2064
Robot 1 : 261 1 2585
Robot 1 : 262 1 3108
Robot 1 : 263 1 3633
Robot 1 : 264 1 4160
Robot 1 : 265 1 4689
Robot 1 : 266 1 5220
Robot 1 : 267 1 5753
Robot 1 : 268 1 6288
Robot 1 : 269 1 6825
Robot 1 : 270 1 7364
Robot 1 : 271 1 7905
Robot 1 : 272 1 8448
Robot 1 : 273 1 8993
Robot 1 : 274 1 9540
Robot 1 : 275 1 10089
Robot 1 : 276 1 10640
Robot 1 : 277 1 11193
Robot 1 : 278 1 11748
Robot 1 : 279 1 12305
Robot 1 : 280 1 12864
Robot 1 : 281 1 13425
Robot 1 : 282 1 13988
Robot 1 : 283 1 14553
Robot 1 : 284 1 15120
Robot 1 : 285 1 15689
Robot 1 : 286 1 16260
Robot 1 : 287 1 16833
Robot 1 : 288 1 17408
Robot 1 : 289 1 17985
Robot 1 : 290 1 18564
Robot 1 : 291 1 19145
Robot 1 : 292 1 19728
Robot 1 : 293 1 20313
Robot 1 : 294 1 20900
Robot 1 : 295 1 21489
Robot 1 : 296 1 22080
Robot 1 : 297 1 22673
Robot 1 : 298 1 23268
Robot 1 : 299 1 23865
Robot 1 : 300 1 24464
Robot 1 : 301 1 25065
Robot 1 : 302 1 25668
Robot 1 : 303 1 26273
Robot 1 : 304 1 26880
Robot 1 : 305 1 27489
Robot 1 : 306 1 28100
Robot 1 : 307 1 28713
Robot 1 : 308 1 29328
Robot 1 : 309 1 29945
Robot 1 : 310 1 30564
Robot 1 : 311 1 31185
Robot 1 : 312 1 31808
Robot 1 : 313 1 32433
Robot 1 : 314 1 -32476
Robot 1 : 315 1 -31847
Robot 1 : 316 1 -31216
Robot 1 : 317 1 -30583
Robot 1 : 318 1 -29948
Robot 1 : 319 1 -29311
Robot 1 : 320 1 -28672
Robot 1 : 321 1 -28031
Robot 1 : 322 1 -27388
Robot 1 : 323 1 -26743
Robot 1 : 324 1 -26096
Robot 1 : 325 1 -25447
Robot 1 : 326 1 -24796
Robot 1 : 327 1 -24143
Robot 1 : 328 1 -23488
Robot 1 : 329 1 -22831
Robot 1 : 330 1 -22172
Robot 1 : 331 1 -21511
Robot 1 : 332 1 -20848
Robot 1 : 333 1 -20183
Robot 1 : 334 1 -19516
Robot 1 : 335 1 -18847
Robot 1 : 336 1 -18176
Robot 1 : 337 1 -17503
Robot 1 : 338 1 -16828
Robot 1 : 339 1 -16151
Robot 1 : 340 1 -15472
Robot 1 : 341 1 -14791
Robot 1 : 342 1 -14108
Robot 1 : 343 1 -13423
Robot 1 : 344 1 -12736
Robot 1 : 345 1 -12047
Robot 1 : 346 1 -11356
Robot 1 : 347 1 -10663
Robot 1 : 348 1 -9968
Robot 1 : 349 1 -9271
Robot 1 : 350 1 -8572
Robot 1 : 351 1 -7871
Robot 1 : 352 1 -7168
Robot 1 : 353 1 -6463
Robot 1 : 354 1 -5756
Robot 1 : 355 1 -5047
Robot 1 : 356 1 -4336
Robot 1 : 357 1 -3623
Robot 1 : 358 1 -2908
Robot 1 : 359 1 -2191
Robot 1 : 360 1 -1472
Robot 1 : 361 1 -751
Robot 1 : 362 1 -28
Robot 1 : 363 2 697
Robot 1 : 364 2 1424
Robot 1 : 365 2 2153

365^2=133225=0x20869 и 0x0869 это 2153 (т.е. H=2 и L=2153)

P.S. Одна из неприятных особенностей такого подхода состоит в том, что для того, чтобы убедиться, что у нас в L действительно получилось отрицательное число, то нужно проверить знак регистра H - если там -1, то значит ответ действительно отрицательный и находится в пределах от -32768...-1, а если там 0, то было переполнение и результат является положительным в пределах от 32767 до 65535...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: nedoPC-стандарт онлайновых приложений

Post by Shaos »

Ещё один способ передачи информации из робота наружу - как текст через память робота:

Code: Select all

def tri[36] // массив в памяти робота в котором хранится троичная строка вида "OOO...ONOPPON"
...
msg() // A=id, B=len, C=adr
{
 COMMAND 2
}

print3()
{
 for(jj=0;jj<36;jj++)
 {
   if(tri[jj]!='O') break
 }
 if(jj==36) jj=35
 msg(0,36-jj,&tri[jj]) // третьим аргументом указатель на первый символ в строке не равный 'O' (либо на последний 'O' если строка целиком состоит из символов 'O')
}
А вот читающая функция из HTML/JS:

Code: Select all

function command2(r) {
 var id = r.regs[0xA];
 var len = r.regs[0xB];
 var adr = r.regs[0xC];
 var str = "";
 var i,j;
 for(i=0;i<len;i++) {
    str += String.fromCharCode($R.read(r,adr++));
 }
 if(id>=0) {
   $_('output',str);
 }
 else {
   j = -id;
   if(id>-100) {
    j -= 100;
    $_("radio"+j,"1");
   }
   else if(id>-200) {
    j -= 200;
    $_("input"+j,str);
   }
   else // <= -300
   {
    j -= 300;
    $_("input"+j,str);
   }
 }
}

$R.callback(2,command2); // регистрируем обработчик для COMMAND 2
Как можно видеть в регистре A передаётся идентификатор элемента веб-интерфейса, текст которого мы хотим поменять, в регистре B - длина строки, и регистр C - это адрес строки в памяти робота - непосредственно чтение из памяти делает вот в этом цикле:

Code: Select all

 for(i=0;i<len;i++) {
    str += String.fromCharCode($R.read(r,adr++));
 }
Так как ячейки памяти робота 16-битные, то такие строки могут содержать юникод - я до этого уже экспериментировал с передачей русских букв UTF8 в робота - думаю вывести их обратно тоже не составит особого труда, но пока я чисто с ASCII работаю...

P.S. Это я троичный конвертер строю если что...
Я тут за главного - если что шлите мыло на me собака shaos точка net