MOV oo | ПОСТАВИ | move | копиране от втори към първи опреранд |
INP o | ВХОД | input | команда към приемника, зависи от I/S |
OUT o | ИЗХОД | output | команда към предавателя |
ADD oo | СЪБЕРИ | add | събери o1 <= o1+o2 |
JMP o | ПРЕХОД | jump | преход към относителен адрес о |
JMZ o | ПРИНУЛА | jump if RegI=0 | преход към o при условие I=0 |
JMF oo | УСЛОВНО | jump if (flag and o2)<>0 | преход към o1 при условие (flag and o2)<>0 |
CLF o | ФЛАГ | clear (flag=op) | установява регистър Флаг |
MSP o | СЪОБЩИ | put a message to prid | изпраща съобщение на процеса в o |
MSG | ВЗЕМИ | get a message | вземи съобщение |
IDL | ОСВОБОДИ | set idle state | остани в бездейно състояние |
DIE | СПРИ | die | изключи програмата |
CMP oo | СРАВНИ | compare | сравни o1 и o2 (резултатът остава в регистър FLAG) |
JSU o | ПОДПРЕХОД | jump to a subroutine | преход към подпрограма и запис на текущата позиция в стека |
RET | ОБРАТНО | return from subroutine | връщане от подпрограма |
STR o | ПРЕВЪРНИ | string operation | команда към стринговия регистър |
SPO oo | СЪДЪРЖА | string position | позиция на подстринг |
GME oo | ПАМЕТ | get memory block | заемане на памет |
FME o | ЗАБРАВИ | free memory block | освобождаване на памет |
PUT oo | БУТНИ | push into the stack | пъхни в стека променлива |
POP oo | ДРЪПНИ | pop from the stack | извади от стека променлива |
EXE oo | ПУСНИ | execute a program | стартирай RVM програма |
SYS o | СИСТЕМА | ask for system value | системна команда или въпрос |
LDE oo | LDE | set local procedure descriptor | |
MVM oo | ПРЕНЕСИ | copy mem to mem bytes /num=RegI | пренос на данни |
REG oo | МЕЖДУ | test op1<=regi<op2 | питане за принадлежност в интервал |
SUB oo | ИЗВАДИ | subtract | изваждане o1=o1-o2 |
PME | ВДИГНИ | peek a message | Изтегля съобщение от опашката без да го изтрива |
PUR o | ВСТЕК | put a register to the stack | Записва регистър в стека |
POR o | ОТСТЕК | pop a register from the stack | Изтегля регистър от стека |
DSK o | ДИСК | disk operation | Дискова операция |
MUL oo | УМНОЖИ | multiply | Умножение |
DIV oo | РАЗДЕЛИ | division | Деление |
ABS oo | ABS | get abs/sign | Абсолютна стойност |
{целочислени} addfroms('MOVRII', 'i'); // load immediate integer into RegI 1 addfroms('MOVRMI', 'i'); // load RegI from memory 2 addfroms('MOVRVI', 'i'); // load RegI from pointer 3 addfroms('MOVMRI', 'i'); // save RegI to memory 4 addfroms('MOVVRI', 'i'); // save RegI to pointer 5 addfroms('MOVMMI', 'ii'); // move memory to memory 6 addfroms('MOVMVI', 'ii'); // move pointer to memory 7 addfroms('MOVVMI', 'ii'); // move memory to pointer 8 addfroms('MOVVVI', 'ii'); // move pointer to pointer 9 {дробни} addfroms('MOVRID', 'd'); // load immediate double into RegD 10 addfroms('MOVRMD', 'i'); // load RegD from memory 11 addfroms('MOVRVD', 'i'); // load RegD from pointer 12*n addfroms('MOVMRD', 'i'); // save RegD to memory 13 addfroms('MOVVRD', 'i'); // save RegD to pointer 14 addfroms('MOVMMD', 'ii'); // move double memory to memory 15 addfroms('MOVMVD', 'ii'); // move double memory to pointer 16*n addfroms('MOVVMD', 'ii'); // move double pointer to memory 17*n addfroms('MOVVVD', 'ii'); // move double pointer to pointer 18*n {стрингови} addfroms('MOVRIS', 's'); // load immediate string into RegS 19*fe addfroms('MOVRMS', 'i'); // load RegS from memory 20*fe addfroms('MOVRVS', 'i'); // load RegS from pointer 21 addfroms('MOVMRS', 'i'); // save RegS to memory 22 addfroms('MOVVRS', 'i'); // save RegS to pointer 23*fe addfroms('MOVMMS', 'ii'); // move string memory to memory 24 addfroms('MOVMVS', 'ii'); // move string pointer to memory 25 addfroms('MOVVMS', 'ii'); // move string memory to pointer 26*n addfroms('MOVVVS', 'ii'); // move string pointer to pointer 27*n {по-късно добавени} addfroms('MOVMIS', 'is'); // move immediate string to memory 96 addfroms('MOVVII', 'ii'); // immediate to mem pointer 99 addfroms('MOVMII', 'ii'); // immediate to memory 100 addfroms('MOVRRI', 'rr'); // move regd <- regi 122*ct addfroms('MOVRRD', ''); // move regi <- regd 145*ct*fo addfroms('MOVMID', 'id'); // memd<=immd 162 *n = не работи, води до грешка v1e_not_supported *fe вдига флаг "v1fl_sempt", тоест "if_empty" ще работи *ct сменя типа на съдържанието, новия тип е на първия операнд *fo вдига флаг "v1fl_iover"_________________________________________________________________
ic_settcpinputport | установява порт (o) на TPC приемащия сокет |
ic_setudpinputport | установява порт (o) на UDP приемащия сокет |
ic_settcpinputaddr | установява адрес (целочислен-o) на TCP-сокета, който посреща конекциите |
ic_setudpinputaddr | установява адрес (посочен в регистър S като "127.0.0.1") на UDP-сокета |
ic_settcprecvbuf | установява буфер за приемане (o^) на TCP-сокета |
ic_settcprecvbsz | установява размер на буфера за приемане (o) на TCP-сокета |
ic_gettcprecvbsz | връща в регистър I размера на буфера за приемане (o) на TCP-сокета |
ic_gettcprecvrsz | връща в регистър I размера на последната получена порция данни в TCP-сокета |
ic_gettcprecvdsz | връща в регистър I размера на всички получени данни в TCP-сокета |
ic_gettcprecvlsz | връща в регистър I водещия размер на първия готов пакет данни в TCP-сокета |
ic_getinputerror | връща в регистър I код за грешка в TCP-сокета |
ic_getinputstate | връща в регистър I статуса на приемащия TCP-сокет и установява "ista_read" |
ic_gettcpinputsocket | връща в регистър I приемащия TCP-сокет |
ic_gettcpinputaddr | връща в регистър S адреса на приемащия TCP-сокет като "127.0.0.1" |
ic_inputsettimeout1 | установява временен ограничител1 (o) за работа с TCP/UDP-сокета |
ic_inputsettimeout2 | установява временен ограничител2 (o) за работа с TCP/UDP-сокета |
ic_setforkacception | установява флаг за размножаване (o) на TCP сокета |
ic_gettcprecvstr | връща в регистър S получена текстова линия по TCP сокета вдига флагове v1fl_irecv + v1fl_izero ако в получения пакет е разпозната команда за файлов пренос, го приготвя и записва в юзерската директория |
ic_shiftlefttcprecvbuf | премахва първия (най-левия) пакет от TCP буфера-значи приет и обработен пакет |
ic_settcprecvstr | установява стринг от регистър S -> в буфера на TCP-приемащия сокет. Тази операция е удобна преди изпращането на данни обратно към терминала. |
ic_settcprecvbacklen | установява дължина на TCP пакета който ще бъде изпратен обратно към терминала. |
ic_inittcpreceiver | включва TCP-сокета на приемника в действие. Само О-програмата трябва да прави това. новопроизведения сокет ще се вдигне в състояние "listen", според TCP-терминологията. |
ic_receivetcp | ако може, възбужда операция "recv" в TCP-сокета и приема поредния TCP-пакет. |
ic_closetcpreceiver | затваря TCP-сокета и премахва сесията на юзера. |
ic_sendbacktcp | изпраща TCP пакет към терминала. В регистър I се връща броя на изпратените байтове. |
ic_initudpreceiver | включва UDP-приемника. Само програма за групово управление прави това. |
... @init_tcp_state gme obuf,obufsize mov i,ic_settcprecvbuf // sets the receive buffer inp obuf mov i,ic_settcprecvbsz // sets receive buffer size inp obufsize jsu @init_out_pointers ret ... Микроверсии : addfroms('INPI_I', 'i'); // input immediate operand 31 addfroms('INPM_I', 'i'); // input memory operand 32 addfroms('INPV_I', 'i'); // input pointer operand 33*n *n - не работи, излъчва грешка v1e_not_supportedКоментар:
{целочислени} addfroms('ADDRII', 'i'); // add to RegI immediate number 34*fz addfroms('ADDRMI', 'i'); // add memory + RegS 35*fz addfroms('ADDRVI', 'i'); // add pointer + RegS 36*fz addfroms('ADDMRI', 'i'); // add RegS + memory 37*fz addfroms('ADDVRI', 'i'); // add RegS + pointer 38*fz addfroms('ADDMMI', 'ii'); // add memory + memory 39*fz addfroms('ADDMVI', 'ii'); // add pointer + memory 40*n addfroms('ADDVMI', 'ii'); // add memory + pointer 41*fz addfroms('ADDVVI', 'ii'); // add pointer + pointer 42*n {дробни} addfroms('ADDRID', 'd'); // add to RegD immediate double 43*fz addfroms('ADDRMD', 'i'); // add RegD + memory 44 addfroms('ADDRVD', 'i'); // add RegD + pointer 45*n addfroms('ADDMRD', 'i'); // add memory + RegD 46 addfroms('ADDVRD', 'i'); // add pointer + RegD 47*n addfroms('ADDMMD', 'ii'); // add memory + memory 48*fz addfroms('ADDMVD', 'ii'); // add pointer + memory 49*n addfroms('ADDVMD', 'ii'); // add memory + pointer 50*n addfroms('ADDVVD', 'ii'); // add pointer + pointer 51*n {стрингови} addfroms('ADDRIS', 's'); // add RegS + immediate string 52 addfroms('ADDRMS', 'i'); // add RegS + mem 53 addfroms('ADDRVS', 'i'); // add RegS + ptr 54*fe addfroms('ADDMRS', 'i'); // add mem + RegS 55 addfroms('ADDVRS', 'i'); // add ptr + RegS 56 addfroms('ADDMMS', 'ii'); // add mem + mem 57*fe addfroms('ADDMVS', 'ii'); // add ptr + mem 58*n addfroms('ADDVMS', 'ii'); // add mem + ptr 59*n addfroms('ADDVVS', 'ii'); // add ptr + ptr 60*n {по-късно добавени} addfroms('ADDIRS', 's'); // add immediate+RegS 90*r addfroms('ADDMII', 'ii'); // add mem + immediate 102 addfroms('ADDMIS', 'is'); // add mem,immediate 138 addfroms('ADDMID', 'id'); // add mem + immediate double 152*fz *n = не работи, води до грешка v1e_not_supported *fz вдига флаг "v1fl_izero", тоест "if_zero" ще работи *fe вдига флаг "v1fl_sempt", тоест "if_empty" ще работи *r в този случай резултатът остава в регистър, тоест не в първи операнд._________________________________________________________________
@cycle msg jmf @check_msg,if_message_received sys v1sq_get_time_tick mov tick,i sub i,lasttick cmp stepinterval,i jmf @cycle,if_bigger mov lasttick,tick mov i,ctxtype_chart sys v1sq_stepctx mov numusers,i cmp i,0 jmf @no_action,if_equal jmp @cycleКоментар :
addfroms('JMPI_I', 'i'); // jump immediate 61 addfroms('JMPM_I', 'i'); // jump memory 62*n addfroms('JMPV_I', 'i'); // jump ptr 63*n *n = не работи, води до грешка v1e_not_supported_________________________________________________________________
... @callsocketsend mov i,ic_sendbacktcp inp 0 jmz @callsocketsend mov i,ic_settcprecvbuf inp ibuf mov outsize,0 ...Коментар :
addfroms('JMZI_I', 'i'); // jump relative if RegI is not 0 imm 64 addfroms('JMZM_I', 'i'); // jump memory 65*n addfroms('JMZV_I', 'i'); // jump pointer 66*n *n = не работи, води до грешка v1e_not_supported_________________________________________________________________
... CODE LABEL @f1_main cmp ready_state,1 jmf @wmsg_cycle,if_equal mov entry_line,s ... @wmsg_cycle msg mov sender_pid,i ...Коментар1 :
addfroms('JMFIII', 'ii'); // jump rel if (flag and i2)<>0 ii 67 addfroms('JMFIMI', 'ii'); // jump imm mem 68*n addfroms('JMFIVI', 'ii'); // jump imm ptr 69*n *n = не работи, води до грешка v1e_not_supported_________________________________________________________________
addfroms('CLFI_I', 'i'); // flag=o im 70 addfroms('CLFM_I', 'i'); // mem 71 addfroms('CLFV_I', 'i'); // ptr 72*n *n = не работи, води до грешка v1e_not_supported_________________________________________________________________
addfroms('MSPI_I', 'I'); // put a message-immediste number 73 addfroms('MSPM_I', 'I'); // put a message-memory 74Коментар :
addfroms('MSG___', ''); // get a message 75Коментар :
addfroms('IDL___', ''); // set idle 76Коментар :
addfroms('DIE___', ''); // die 77Коментар :
{стрингови} addfroms('CMPRIS', 's'); // cmp RegS + immediate string 78*fb*fe*fd*fbe addfroms('CMPRMS', 'i'); // cmp RegS + mem 79*fb*fe*fd*fbe addfroms('CMPRVS', 'i'); // cmp RegS + ptr 80*n addfroms('CMPMMS', 'ii'); // cmp mem + mem 81*fb*fe*fd*fbe addfroms('CMPVMS', 'ii'); // cmp mem + ptr 82*n addfroms('CMPVVS', 'ii'); // cmp ptr + ptr 83*n {по-късно добавени} addfroms('CMPMII', 'ii'); // cmp mem + immediate 101*fb*fe*fd*fbe addfroms('CMPRII', 'i'); // cmp regi=immediate 105*fb*fe*fd*fbe addfroms('CMPMMI', 'ii'); // cmp mem=mem 106*fb*fe*fd*fbe addfroms('CMPMIS', 'is'); // cmp mem=imm 111*fb*fe*fd*fbe addfroms('CMPRMI', 'i'); // cmp RegS + mem 119*fb*fe*fd*fbe addfroms('CMPVMI', 'ii'); // cmp ptr=memi 123*fb*fe*fd*fbe addfroms('CMPIRI', 'i'); // cmp immediate - regI 144*fb*fe*fd*fbe addfroms('CMPRID', 'rd'); // cmp regd - immediate 149*fb*fe*fd*fbe addfroms('CMPIRS', 's'); // cmp immediare RegS 156*fb*fe*fd*fbe addfroms('CMPMRI', 'ii'); // cmp mem RegI 157*fb*fe*fd*fbe addfroms('CMPIMI', 'ii'); // cmp imm + mem 158*fb*fe*fd*fbe addfroms('CMPVII', 'ii'); // cmp ptr^=immediate 160*fb*fe*fd*fbe *fb if_bigger ще работи *fe if_equal ще работи *fd if_differ ще работи *fbe if_big_or_equal ще работи *n не работи, грешка v1e_not_supportedКоментар :
... //================ subroutines ========================= @add_list cmp listmode,0 jmf @exit_build_list,if_equal mov listbox_cmd_wid,edit_rect_ident mov s,listbox_cmd_cmline str soc_getlength add i,41 mvm s,listbox_cmd_num,S jsu @add_a_command @exit_build_list ret ... @add_a_command put s,254 mov aux_point,p2 mov s,'0000' jsu @insert_string_aux pop s,254 jsu @insert_string_aux mov [aux_point],i add outsize,i add outsize,4 ret ...Микроверсии :
addfroms('JSUI_I', 'i'); // jump to a subroutine 84 addfroms('RET___', ''); // return from subroutine 85Коментар :
soc_getlength | връща дължината на S в I; |
soc_getsubstr | връща подстринг S=copy(S,I,round(D)); |
soc_wordnum | връща дума номер i от S :S=wordn(S,i); |
soc_UpCase | връща s от главни букви; |
soc_LoCase | връща s от малки букви; |
soc_Clip | връща s без водещи и последни интервали; |
soc_ClipLeft | връща s без водещи интервали; |
soc_ClipRight | връща s без последни интервали; |
soc_tointeger | връща в I числото написано като стринг в S; |
soc_todouble | превръща S в дробно число, и го връща в D; |
soc_frominteger | превръща I в текстово число и го връща в S; |
soc_fromdouble | превръща D в текстово число с I-дестични знаци и го връща в S; |
soc_ord | превръща I-тата буква от S в ANSI код и го връща в I; |
soc_chr | превръща I в символ с ANSI код I; |
soc_monoline | връща в S линия от I символа с номер round(D); |
soc_addcleft | прибавя отляво към S буква номер I; |
soc_addcright | прибавя отдясно към S буква номер I; |
soc_isnumber | връща 1 в I, ако в S има число; |
soc_toright | връща RightPart(S,I); |
soc_fileexists | връща 1 ако в S е записан съществуващ файл или нула в противен случай; |
soc_rendertxt | регистър i трябва да сочи текстов обект. Това изпълнява команда от две букви в S; |
soc_inttohex | превръща i в шестнадесетичен запис (8 буквен) |
soc_strfromw | връща всичко от i-тата дума надясно |
soc_editline | регистър i трябва да сочи обект - текстова линия. Това изпълнява статуса; |
soc_fnmandeonly | премахва от името на файла в S цялата пътека и диск в лявата му част; |
soc_reducepathname | превръща '..\' участък в действителна пътека от името на файла в S; |
soc_formatileadz | превръща i в текст с допълнени от ляво нули колкото е round(D); |
soc_clearname | премахва от името на файла разширението (.EEE) |
soc_basename | връща име на таблица в S |
soc_formatname | връща име на форматен файл за таблица в S |
soc_fromfile | ако има файл с име S, връща първата текстова линия от файла; |
soc_preparehjmp | подготвя скок към диспечер - разпределител на команди; |
soc_forseext | залепва към S посочено разширение; |
soc_programstate | връща състояние на програмата в S |
soc_getprevpath | връща предпоследната пътека на файла от S; |
soc_getpathonly | връща пътеката на файла от S; |
soc_validsavename | връща 1 ако файла от S е с валидно име за запис; |
soc_substitute | замества означенията %WPATH% ,%UPATH%, %UP%, %OP%, %WP% с работните пътеки |
soc_extracttlines | извежда от текстов обект страница |
soc_compilerva | компилира RVA сорс в посочен текстов обект |
soc_toclipfile | записва S в текстов файл предназначен за клипборд-copy операция |
soc_tomoneystr | форматира числото от D като паричен стринг |
soc_encodespaces | кодира интервалите с ANSI символ 4 |
soc_decodespaces | декодира интервалите с ANSI символ 4 |
... //================ subroutines ========================= @add_list cmp listmode,0 jmf @exit_build_list,if_equal mov listbox_cmd_wid,edit_rect_ident mov s,listbox_cmd_cmline str soc_getlength add i,41 mvm s,listbox_cmd_num,S jsu @add_a_command @exit_build_list ret ...Микроверсии :
addfroms('STRI_I', 'i'); // string operation immediate code 86Коментар :
... mov s,itm_command_str spo 'PLAYER',s jmf @work_group_cmd,if_equal spo 'VSCR',s jmf @set_vscroll_position,if_equal spo 'HSCR',s jmf @set_hscroll_position,if_equal spo 'DT',s jmf @set_drag_position,if_equal spo 'SEARCHTEXT',s jmf @launch_textsearch_dialog,if_equal ...Микроверсии :
addfroms('SPORIS', 's'); // RegI=pos (immediate str,RegS) 87*fe addfroms('SPOIRS', 's'); // RegI=pos (immediate str,RegS) 88*fe addfroms('SPORMS', 'ii'); // RegI=pos (memory str,RegS) 89*fz *fe ако позицията е 1, if_equal ще работи *fz ако позицията е 0, if_zero ще работиКоментар :
... MAIN cmp ready_state,1 jmf @cycle,if_equal gme ubuf,ubsize ...Микроверсии :
addfroms('GMEMII', 'ii'); // get memory 91 addfroms('FMEM_I', 'i'); // free memory 92Коментар :
... @asquire_startplayer_data mov i,12 mov d,150.0 str soc_getsubstr put notify_cmd_num,150 mvm notify_cmd_num,s mov startplayertype,notify_rect_kind mov startplayerwid,notify_cmd_id mov incomingplayertext,notify_cmd_rest pop notify_cmd_num,150 cmp startplayertype,v1gutp_baloon jmf @send_baloontext_to_terminal,if_equal cmp startplayertype,v1gutp_clubman jmf @check_man_name,if_equal ret ...Микроверсии :
addfroms('PUTMII', 'ii'); // push into the stack mem,imm 93 addfroms('POPMII', 'ii'); // pop from the stack mem,imm 94Коментар :
... @cansendit mov uploadcmd,uploadprogramname mov i,this_process_pid str soc_frominteger add s,filetypestr add s,bagfilename add s,voption str soc_upcase mov d,1.0 mov i,2 exe uploadcmd,'' mov s,bagfilename dsk dsk_deletefile ret ...Микроверсии :
addfroms('EXEMIS', 'is'); // execute another program 95 addfroms('EXEMMS', 'ii'); // execute mem 120 addfroms('EXEIIS', 'ss'); // imm imm 163 addfroms('EXEIMS', 'ss'); // imm mem 164Коментар :
v1sq_jumptodispatcher | скок към подготвена преходна точка | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_getprogramlevel | връща в I променливата level на програмата | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_process_id_by_name | връща в I идентификатора на процес (наричан по-долу pid), с име на програмата зададено в S. Ако S е празен стринг, връща идентификатор на текущия процес. В противен случай процесите се изследват от края към началото и се връща най-големия номер, чието програмно име съвпада със зададеното в S. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_get_intvar_from_id | връща в I целочислена променлива посочена в round(D) от друг процес чийто идентификатор е зададен в I. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_get_intptr_from_id | както по-горното, но връща указател вместо пряка променлива | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_set_user_name | установява име на юзера, каквото е посочено в S. Само О-програмата прави това. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_set_user_ctx | обявява контекст (посочен в регистър S) предназначен за участие в група. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_get_user_name | връща в S текущото име на юзера. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_get_all_process_num | връща в I най-големия номер на работещ процес плюс 1. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_get_process_type | връща в I типа на посочения процес. Ако е мъртъв, връща -1. Ако процесът е на друг юзер, В регистър D се връща 1.0; Ако процесът е модален дъщерен, в регистър D се връща 2.0 | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_get_program_state | връща в I програмния статус на посочен процес от I (или -1, ако няма такъв) | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_get_programname_by_pid | връща в S името на програмата, чийто процес е посочен в I. Регистър D връща 1.0 при друг юзер и 2.0 при дъщерен процес. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_pid_by_program_ctx | връща идентификатор на следващия (всъщност ОТ посочения в I включително) процес, чийто контекст отговаря на е посоченото в S. Ако няма повече такива процеси, регистър Flag връща v1sq_equal иначе Flag се установява в v1sq_bigge. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_getchartname | връща в S името на картата, определена от регистър I. Регистър I трабва да е индекс на картовия групов управител (cid); | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_ctxindexbyctxname | връща в I индекс на групов управител по посочен контекст в S. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_get_time_tick | връща в I текущата милисекунда (tick) | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_getprocesscount | връща в I брой на процесите за текущия юзер с посоченото име на програма в S | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_stepctx | Kоманда към групов контекст за стъпка във времето. Само програмите - управители на група трябва да правят това. Ако регистър I е нула, всички контексти ще направят стъпка. Ако I е нула, ще задействува само контекста съответен на записаното в регистър S. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_addctx | Обявява нова контекстна група зададена в S. Само програмите управляващи група трябва да правят това. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_donectx | Унищожава контекстна група зададена в S. Само програмите управляващи група трябва да правят това. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_addunit | Създава нова контекстна единица. Това се прави от програмите управляващи регламентирани даннови обекти - текстове, таблици, карти. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_signalregion | Променен е зададен картов регион. Груповата машинка реагира на това като сигнализира участниците наблюдаващи този регион, да обновят образа. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_getuserhomeposition | Връща в S записаната в юзерския регистър домашна точка като "X Y SIZE CTXINDEX" | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_getuserchartfile | Връща в S името на картовия файл, съответен на домашния регион за юзера посочен в S. Flag връща v1fl_equal или v1fl_diffe, при успех/неуспех да бъде намерен файла. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_getchartobjectowner | Връща в S името на юзера, който е собственик на картов обект с име посочено в S. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_removeunit | Премахва контекстна единица посочена в S. Това го правят програмите за таблици, текстове, карти. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_get_user_session | Връща в S сесията на юзера посочен в S. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_remove_user_session | Премахва сесията на текущия юзер. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_setunitwalkstate | Пренастройва подвижен обект върху картата. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_set_program_velocity | Скорост на програмата. В регистър I трябва да е зададена новата скорост, а в регистър D-стъпка. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_get_program_velocity | Връща текущата скорост на програмата в I | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_getosname | Връща името на О-програмата в регистър S | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_set_netwait_state | Установява режим на сокета "listen" и бездеен-очакващ връзка статус. Само О-програмата прави това и то ако няма свързани терминали. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_process_uid_by_pid | Връща в I текущия UID на програмата. За разлика от обикновения идентификатор PID на процеса, UID е уникален до изключването на V-сървъра. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_process_pid_by_uid | Връща в I PID по посочен UID (виж по-горе). | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_getworkpath | Връща в S работната пътека на програмата. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_setworkpath | Установява работна пътека зададена в S. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_getv1port | Връща порта на текущия TCP-сокет. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_uncompress_input | Декомпресира участък посочен от I-регистъра. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_recentprogram | Работа с програмния списък. О-програмата поддържа в списъка си всички следващи, тоест първо ниво на юзерското дърво от процеси. Съпътствуващата DESK.RVA се ползува от това дърво за да докладва в терминала статуса на работещите програми. По аналогичен начин и други програми се ползуват от този списък. В зависимост от регистър D действията са:
| ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_workwithusertree | Работа с юзерското дърво. В зависимост от съдържанието на I ut_option_messagetoall - изпраща съобщение (от регистър S) към всички останали ut_option_countalive - преброява колко работещи процеса има ut_option_killprocess - изпраща на процесите съобщение otoa_killprocess_cmd | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_process_type_by_uid | Връща тип на процеса намерен по UID в регистър I | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_process_name_by_pid | Връща името на процеса чийто пид е зададен в I | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_gettickcount | Връща брояча в V-процесора. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_getservername | Връща името на V-сървъра. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_getserverversion | Връща версията на V-сървъра. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_renewserver | Обновява програмата на сървъра. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_setunitconstrainregion | Включва ограничения в движението на обект върху карта. | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_finduserinctx | Намира индекса на юзер с име S в контекста (флаговия регистър трябва да е CID) | ||||||||||||||||||||||||||||||||||||||||||||||
v1sq_check_alive | На всеки 10 бездейни секунди терминалът трябва да изпраща към сървъра TCP съобщение "KEEPALIVE". Ако дълго време О-програмата не е получила вест от терминала, се самоизключва с тази опция. Иначе тя работи непрекъснато, докато юзера е свързан. С други думи О-програмата ползува тази команда за да изключи юзера при дълго бездействие. След изпълнението, ако бездействието на приемника е превишило лимита (около 50 секунди), регистър Флаг връща v1fl_bigge + v1fl_diffe, Тоест if_differ ще работи. |
... @obtain_homeregion mov s,'' mov i,0 mov d,0.0 sys v1sq_getuserhomeposition mov userhomeline,s ret ...Микроверсии :
addfroms('SYSI_I', 'i'); // ask a question 97Коментар :
... @asquire_shiftstate mov i,os_shiftstate_address mov d,i mov i,parrent_osid sys v1sq_get_intptr_from_id mov os_ptr_shiftstate,i mov i,8 mvm shiftpressed,[os_ptr_shiftstate] ret ...Микроверсии :
addfroms('MVMMMI', 'ii'); // copy mem <- mem 103*li addfroms('MVMVVI', 'ii'); // copy ptr <- ptr 104*li addfroms('MVMMVI', 'ii'); // cmp mem <- ptr 107*li addfroms('MVMVMI', 'ii'); // cmp ptr <- mem 108*li addfroms('MVMRMS', 'i'); // move regs <- mem, length=regi 114*lis1 addfroms('MVMMRS', 'i'); // move mem <- regs, length(regs) 115*s1 addfroms('MVMVRS', 'i'); // move ptr <- regs, length(regs) 116*s1 addfroms('MVMRVS', 'i'); // move reg <-ptr, length(regs) 121*lis1 addfroms('MVMRMI', 'ri'); // move regd <- mem, length=regi 132*li addfroms('MVMMRD', 'ir'); // move mem <-regd, length=regi 133*li *li дължината на преноса идва от регистър I *lis1 дължината на преноса е в I, но не повече от 254 и данните се настаняват от първата буква на S надясно *s1 дължината на преноса е колкото дължината на стринга; преноса започва от първата буква на S надясноКоментар :
addfroms('REGMMI', 'ii'); // cmp mem <- mem 109Коментар :
addfroms('SUBMMI', 'ii'); // sub mem mem 110*fz addfroms('SUBMRI', 'i'); // sub m-regi 112*fz addfroms('SUBMII', 'ii'); // sub m-imm 113*fz addfroms('SUBRII', 'ii'); // sub reg-imm 136 addfroms('SUBVMI', 'ii'); // sub ptr-mem 141*fz addfroms('SUBRMI', 'ri'); // sub reg-mem 142*fz addfroms('SUBMID', 'id'); // sub mem + immediate double 153*fz addfroms('SUBMMD', 'ii'); // sub mem + immediate double 154*fz *fz вдига флаг v1fl_izero, тоест if_zero ще работиКоментар :
@cp_alive pme cmp i,child_pid jmf @c_have_msg,if_equal cmp s,'0002' jmf @unfocus_child_tree,if_equal cmp s,'0003' jmf @focus_child_tree,if_equal cmp s,'0004' jmf @end_child_tree,if_equal spo '0008 0000PLAYER',s cmp i,1 jmf @get_group_cmd,if_equal @translate_to_child msg msp child_pid idl
addfroms('PME___', ''); // peek a message 124Коментар :
@doopenfile pur s cmp textfilename,'' jmf @dontsaverecent,if_equal jsu @save_recentname @dontsaverecent por s mov i,2 str soc_strfromw jsu @sub_openfile jmp @end_tmmsg_cycle
addfroms('PURR_I', 'r'); // push into the stack reg 125 addfroms('PORR_I', 'r'); // pop from the stack reg 126 addfroms('PURR_D', 'r'); // push into the stack reg 127 addfroms('PORR_D', 'r'); // pop from the stack reg 128 addfroms('PURR_S', 'r'); // push into the stack reg 129 addfroms('PORR_S', 'r'); // pop from the stack reg 130Коментар :
dsk_getfilesize | връща размера на файл - BuildUserFileName(в регистър S е името на файла) | ||||||||||||||||||||||||||||||||
dsk_savefile | записва файл - BuildUserFileName(в регистър S е името на файла) Регистър I трябва да сочи данните; Размера се прочита като цяло число от първите четири байта на Регистър D; ето пример за запис на файл (откъс от EDITLINE.RVA) VARI ... eline_container '' eline_cont_ptr ^eline_container ... CODE ... @saveresultondisk cmp textfilename,'' jmf @exitsaveresult,if_equal mov s,eline_container str soc_getlength mov textfilesize,i mov d,0.0 mov i,4 mvm d,textfilesize mov s,textfilename add '__',s mov i,eline_cont_ptr add i,1 dsk dsk_savefile @exitsaveresult ret ... | ||||||||||||||||||||||||||||||||
dsk_loadfile | зарежда файл - BuildUserFileName(регистър S е име на файла) Регистър I трябва да сочи данните. В първите 4 байта на Регистър D е размера на буфера за данни в целочислен вид. На изхода регистър I връща код за грешка. Ето пример за ползуване: (откъс от RECENTUTILS.RVA): VARI ... isfilesze 0 saved_wx1 0 saved_wy1 0 saved_wdx 0 saved_wdy 0 ... windowstate_ptr ^saved_wx1 initstate_filename 'MAINWINDOWSTATE.DAT' ... CODE ... @read_windowstate mov isfilesze,24 mov i,4 mvm d,isfilesze mov i,windowstate_ptr mov s,'APP\' add s,workpath add s,'\' add s,initstate_filename dsk dsk_loadfile cmp i,0 jmf @exit_read_wstate,if_differ mov window_start_centered,0 .... | ||||||||||||||||||||||||||||||||
dsk_direxists | Ако няма пътека - BuildUserFileName(регистър S) вдига флаг vqfl_izero | ||||||||||||||||||||||||||||||||
dsk_fileexists | Ако няма файл - BuildUserFileName(регистър S) вдига флаг vqfl_izero | ||||||||||||||||||||||||||||||||
dsk_loadtext | зарежда текстов обект от стандартен текстов файл - BuildUserFileName(регистър S) | ||||||||||||||||||||||||||||||||
dsk_readfilebuf | чете данни в буфер - BuildUserFileName(name= wordn(S,2)) | ||||||||||||||||||||||||||||||||
dsk_table | работи с таблица посочена от I като обект /ProcessTable/ На вход регистър Флаг трябва да има една от следните стойности-константи /CONSTANTS_DSK.RVA/
| ||||||||||||||||||||||||||||||||
dsk_tableexists | Търси табличен файл с име S и връща FLAG=v1fl_equal/v1fl_diffe | ||||||||||||||||||||||||||||||||
dsk_loadtextfast | зарежда текстов обект файл - BuildUserFileName(регистър S) | ||||||||||||||||||||||||||||||||
dsk_regstofile | Създава празен файл с име посочено от S | ||||||||||||||||||||||||||||||||
dsk_buildchart | Строи карта около текущия подвижен обект | ||||||||||||||||||||||||||||||||
dsk_createchartobject | Създава обект на картата | ||||||||||||||||||||||||||||||||
dsk_deletefile | Изтрива файл - BuildUserFileName(регистър S) |
... @set_cursor_in_window mov i,obufsize mov d,i mov i,table_head_ptr mov s,table_name clf ttc_putrcinwindow dsk dsk_table ret ...Микроверсии :
addfroms('DSKI_I', 'i'); // disk oper 131Коментар :
addfroms('MULMMI', 'ii'); // mul mem <-mem 134*fz addfroms('MULRII', 'ri'); // mul reg <-immediate 139 addfroms('MULRMD', 'ri'); // mul regd <- memory 146*fz addfroms('MULRMI', 'ri'); // mul regi <- memory 148 addfroms('MULMII', 'ii'); // mul memory <-immediate 150*fz addfroms('MULMMD', 'ii'); // mul mem + mem double 155*fz addfroms('MULRID', 'rd'); // mul reg*imm 159*fz *fz вдига флаг v1fl_izero, тоест if_zero ще работиКоментар :
... @calc_eline_length mov i,edit_rect_dx mov i,btnline_cmd_x1 sub i,15 sub i,eline_initx mov eline_winlen,i div eline_winlen,terminal_chardx mov eline_maxlen,eline_winlen retМикроверсии :
addfroms('DIVMMI', 'ii'); // div mem <-mem 135*fz addfroms('DIVMII', 'ii'); // div mem <-immediate 140 addfroms('DIVRII', 'ri'); // div reg <-immediate 143*fz addfroms('DIVRMD', 'ri'); // div regd <- memory 147*fo *fz вдига флаг v1fl_izero, тоест if_zero ще работи *fo вдига флаг v1fl_iover, тоест if_over ще работиКоментар :
addfroms('ABSMMI', 'ii'); // abs/sign mem / mem 151Коментар :