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

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

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24264
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 - что есть существующий и более тривиальный байт-код...
User avatar
Shaos
Admin
Posts: 24264
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.
User avatar
Shaos
Admin
Posts: 24264
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];
}
Вот это мы сейчас и попробуем...
User avatar
Shaos
Admin
Posts: 24264
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.
User avatar
Shaos
Admin
Posts: 24264
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.
User avatar
Shaos
Admin
Posts: 24264
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.
User avatar
Shaos
Admin
Posts: 24264
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.
User avatar
Shaos
Admin
Posts: 24264
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.
User avatar
Shaos
Admin
Posts: 24264
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.
User avatar
Shaos
Admin
Posts: 24264
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.
User avatar
Shaos
Admin
Posts: 24264
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.
User avatar
Shaos
Admin
Posts: 24264
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.
User avatar
Shaos
Admin
Posts: 24264
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Ещё прицепить возможность чтения аргументов из урла и всё - можно начинать писать любые онлайн приложения на Robby :)
User avatar
Shaos
Admin
Posts: 24264
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...
User avatar
Shaos
Admin
Posts: 24264
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. Это я троичный конвертер строю если что...