...
 
Commits (3)
  • Robert Sprowson's avatar
    Resolve some warnings · e89c8ca8
    Robert Sprowson authored
    Escape '$', use Push/Pull macros.
    e89c8ca8
  • Robert Sprowson's avatar
    Undo repository garbling · 586da07c
    Robert Sprowson authored
    MakeError.c and MakeError.h seem to have been misclassified as makefiles, and re-indented with tabs. Put back the original indentation.
    586da07c
  • Robert Sprowson's avatar
    Store choices alongside Mounts · 239f6972
    Robert Sprowson authored
    Consolidate choices into a file rather than system variable, avoiding the clash when it's set to one thing in Omni:Startup, and another in <Boot$ToBeTasks>.Desktop.
    
    CoreInit.c: Rewrite ConfigRead/ConfigWrite to go via a choices file. Set the defaults (in the absence of choices) to match the former "a s1 d1" options.
    Events.c: Add 'Auto discover' and 'Save choices' to the filer-like menu. Reply to interactive help on the 2 new menu entries. No longer put Omni$Options into the desktop save file.
    Messages: New translation of menu entries.
    Startup: Don't bother setting Omni$Options.
    
    Version 2.31. Tagged as 'Omni-2_31'
    239f6972
......@@ -4,7 +4,6 @@
|
| Program configuration (see User Guide for details).
UnSet Omni$Error
Set Omni$Options a s1 d1
Set Omni$User user
|
| Protocol module selection - set to 0 to stop a protocol module loading.
......
......@@ -26,8 +26,8 @@ menu.icon_d:This, All
mhdr.icon_q:Quit
menu.icon_q:Filer, All
mhdr.icon_o:Open root
mhdr.main:Filer
menu.main:>Display,~Connect ''
mhdr.main:Servers
menu.main:>Display,~Connect '',Auto discover,Save choices
mhdr.main_d:Display
menu.main_d:Large icons, Small icons, Full info|Sort by name, Sort by protocol
......@@ -193,6 +193,9 @@ mmain.0:\Rset the type of display (icon size and sorting method).
mmain.1:\Sconnect to this server.
mmain.1b:\Gthere is no selected network server.
mmain.1e:<miconm.1>
mmain.2e:\Senable automatic querying of servers for available mounts.
mmain.2d:\Sdisable automatic querying of servers.
mmain.3:\Ssave the current setup as the default.
mmaind.0:\Sshow Large icons.
mmaind.1:\Sshow Small icons.
mmaind.2:\Sshow Full information on servers.
......
/* (2.30)
/* (2.31)
*
* This file is automatically maintained by srccommit, do not edit manually.
* Last processed by srccommit version: 1.1.
*
*/
#define Module_MajorVersion_CMHG 2.30
#define Module_MajorVersion_CMHG 2.31
#define Module_MinorVersion_CMHG
#define Module_Date_CMHG 20 Sep 2018
#define Module_Date_CMHG 29 Feb 2020
#define Module_MajorVersion "2.30"
#define Module_Version 230
#define Module_MajorVersion "2.31"
#define Module_Version 231
#define Module_MinorVersion ""
#define Module_Date "20 Sep 2018"
#define Module_Date "29 Feb 2020"
#define Module_ApplicationDate "20-Sep-18"
#define Module_ApplicationDate "29-Feb-20"
#define Module_ComponentName "Omni"
#define Module_ComponentPath "castle/RiscOS/Sources/Networking/Omni/Apps/Omni"
#define Module_FullVersion "2.30"
#define Module_HelpVersion "2.30 (20 Sep 2018)"
#define Module_LibraryVersionInfo "2:30"
#define Module_FullVersion "2.31"
#define Module_HelpVersion "2.31 (29 Feb 2020)"
#define Module_LibraryVersionInfo "2:31"
......@@ -296,50 +296,86 @@ extern void InitVars(void)
}
/* Read global program configuration from <app_DIR>$Options variable.
/* Read global program configuration from Choices.
*/
extern void ConfigRead(void)
{
char *s = omni_getenv(app_DIR"$Options");
char *p = NULL;
int n;
FILE *f;
char line[256];
int n;
prog_config.sort = sort_NAME;
prog_config.display = display_LARGE;
prog_config.display = display_SMALL;
prog_config.expert = Desk_FALSE;
prog_config.autolocate = Desk_FALSE;
dprintf (("", "ConfigRead: %s\n", s ? s : "no options"));
prog_config.autolocate = Desk_TRUE;
if (!s) return;
f = fopen("Choices:"app_DIR".Choices", "r");
if (f == NULL) return;
if ((p = strchr(s, 's')) != NULL)
/* Read lines from file until EOF */
Desk_Hourglass_On();
while (fgets(line, 255, f) != NULL)
{
n = atoi((char *) p+1);
dprintf (("", "ConfigRead: sort '%s' %d\n", p, n));
if ((n >= sort_NONE) && (n <= sort_PROTOCOL)) prog_config.sort = n;
}
if ((p = strchr(s, 'd')) != NULL)
{
n = atoi((char *) p+1);
dprintf (("", "ConfigRead: display '%s' %d\n", p, n));
if ((n >= display_LARGE) && (n <= display_FULL)) prog_config.display = n;
}
/* Comment line - ignore */
if (line[0] == '#') continue;
if (strncmp(line, "Display:", 8) == 0)
{
n = atoi(&line[8]);
dprintf (("", "ConfigRead: display '%s' %d\n", line + 8, n));
if ((n >= display_LARGE) && (n <= display_FULL)) prog_config.display = n;
}
if (strncmp(line, "Sort:", 5) == 0)
{
n = atoi(&line[5]);
dprintf (("", "ConfigRead: sort '%s' %d\n", line + 5, n));
if ((n >= sort_NONE) && (n <= sort_PROTOCOL)) prog_config.sort = n;
}
if (strncmp(line, "AutoLocate:", 11) == 0)
{
dprintf (("", "ConfigRead: autolocate '%s'\n", line + 11));
prog_config.autolocate = atoi(&line[11]) ? Desk_TRUE : Desk_FALSE;
}
#ifdef EXPERT
if ((p = strchr(s, 'x')) != NULL) prog_config.expert = Desk_TRUE;
if (strncmp(line, "Expert:", 7) == 0)
{
dprintf (("", "ConfigRead: expert '%s'\n", line + 7));
prog_config.expert = atoi(&line[7]) ? Desk_TRUE : Desk_FALSE;
}
#endif
if ((p = strchr(s, 'a')) != NULL) prog_config.autolocate = Desk_TRUE;
}
Desk_Hourglass_Off();
fclose(f);
}
/* Set global program configuration as <app_DIR>$Options variable.
/* Put global program configuration into Choices.
*/
extern void ConfigWrite(void)
{
char buf[10];
FILE *f;
/* Try to create the dir, if it fails, the subsequent fopen() fail will be reported */
_swix (OS_File, _INR (0, 1) | _IN (4), 8, "<Choices$Write>."app_DIR, 0);
/* Open failed ? give error */
f = fopen("<Choices$Write>."app_DIR".Choices", "w");
if (f == NULL)
{
Desk_Msgs_Report(0, "mount.noopen", "<Choices$Write>."app_DIR".Choices");
return;
}
sprintf(buf, "s%d d%d%s%s", prog_config.sort, prog_config.display,
(prog_config.expert) ? " x" : "", (prog_config.autolocate) ? " a" : "");
_kernel_setenv(app_DIR"$Options", buf);
/* Write out */
Desk_Hourglass_Start(1);
fputs("# Choices file for Omni\n", f);
fprintf(f, "Display:%d\nSort:%d\nAutoLocate:%d\n", prog_config.display,
prog_config.sort,
prog_config.autolocate);
#ifdef EXPERT
fprintf(f, "Expert:%d\n", prog_config.expert)
#endif
Desk_Hourglass_Off();
fclose(f);
}
......@@ -481,6 +517,7 @@ extern bool coreinit(void)
menu_main = Desk_Menu_New(appname, menudescription);
Desk_Msgs_Lookup("mhdr.main_d", appname, 63);
Desk_Msgs_Lookup("menu.main_d", menudescription, 259);
Desk_Menu_SetFlags(menu_main, mmenu_AUTODISCOVER, prog_config.autolocate, Desk_FALSE);
menu_main_d = Desk_Menu_New(appname, menudescription);
Desk_Menu_AddSubMenu(menu_main, mmenu_DISPLAY, menu_main_d);
......
......@@ -1606,6 +1606,15 @@ static Desk_bool MainMenuChoice(Desk_event_pollblock *event, mount_record *mr)
}
break;
case mmenu_AUTODISCOVER:
prog_config.autolocate = !prog_config.autolocate;
Desk_Menu_SetFlags(menu_main, mmenu_AUTODISCOVER, prog_config.autolocate, Desk_FALSE);
break;
case mmenu_SAVECHOICES:
ConfigWrite();
break;
case mmenu_DISPLAY:
/* Display submenu */
switch(event->data.selection[1])
......@@ -1614,7 +1623,6 @@ static Desk_bool MainMenuChoice(Desk_event_pollblock *event, mount_record *mr)
case mdmenu_SMALL:
case mdmenu_FULL:
prog_config.display = event->data.selection[1];
ConfigWrite();
if (r->display != event->data.selection[1])
{
int loop;
......@@ -2092,6 +2100,9 @@ extern Desk_bool HelpHandler(Desk_event_pollblock *event, void *reference)
if (ClientCount() == 0) strcpy(prefix, "miconmo.b");
}
break;
case mmenu_AUTODISCOVER:sprintf(prefix, "mmain.%d%c", buf[0], prog_config.autolocate ? 'd' : 'e');
break;
case mmenu_SAVECHOICES:
default:
sprintf(prefix, "mmain.%d", buf[0]);
break;
......@@ -2152,8 +2163,6 @@ extern Desk_bool GenEvent(Desk_event_pollblock *e, void *reference)
MountSaveFile();
sprintf(buf, "Set "app_DIR"$Path %s\n", omni_getenv(app_DIR"$Path"));
Desk_File_WriteBytes(fh, buf, strlen(buf));
sprintf(buf, "Set "app_DIR"$Options %s\n", omni_getenv(app_DIR"$Options"));
Desk_File_WriteBytes(fh, buf, strlen(buf));
sprintf(buf, "Run %s", omni_getenv(app_DIR"$Dir"));
Desk_File_WriteBytes(fh, buf, strlen(buf));
buf[0] = '\0';
......
/* Copyright 2000 Pace Micro Technology plc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* Program: MakeError.c - shared error routines
*
* Project: !Omni OmniClient(tm) project
*
* Author: Nick Smith
* ANT Limited
* Cambridge
* Internet: nas@ant.co.uk
*
* Date: 13 November 1994
* Last Edited: 14 November 1994
*
* Copyright 1994 by ANT Limited
*/
* Program: MakeError.c - shared error routines
*
* Project: !Omni OmniClient(tm) project
*
* Author: Nick Smith
* ANT Limited
* Cambridge
* Internet: nas@ant.co.uk
*
* Date: 13 November 1994
* Last Edited: 14 November 1994
*
* Copyright 1994 by ANT Limited
*/
#include <stdbool.h>
#include <stdio.h>
......@@ -46,47 +46,47 @@
/* Private copy of error messages, in case we can't access the MessageTrans ones */
static const char *err_strings[] =
{
"Protocol is already registered",
"Bad protocol identifier value",
"No free memory for protocol registration",
"Protocol not registered",
"Bad reason code",
"Need protocol/server/printer names",
"Protocol not registered for printing",
"No free memory for print job",
"Bad print job identifier",
"Bad mounts file",
"Cannot create print job",
"Function not yet implemented",
"Bad time conversion format",
"No free memory for buffer",
"Please run !Omni to restart application",
"Unknown OmniClient error"
"Protocol is already registered",
"Bad protocol identifier value",
"No free memory for protocol registration",
"Protocol not registered",
"Bad reason code",
"Need protocol/server/printer names",
"Protocol not registered for printing",
"No free memory for print job",
"Bad print job identifier",
"Bad mounts file",
"Cannot create print job",
"Function not yet implemented",
"Bad time conversion format",
"No free memory for buffer",
"Please run !Omni to restart application",
"Unknown OmniClient error"
};
static const int err_count = (sizeof(err_strings)/sizeof(char*))-1;
/* Block of error messages */
static const char *omni_errors[] =
{
"No connection to server",
"Connection to '%0' server broken",
"Connection already exists",
"Cannot find named server '%0'",
"Server out of file handles",
"Function '%0' not implemented",
"Timeout error",
"General server error: %0",
"Bad parameters",
"Memory error - out of buffers",
"Out of RISC OS handles",
"File '%0' not found",
"Directory '%0' not found",
"Insufficient access",
"File already exists",
"Incorrect password",
"Illegal name",
"Error not known"
"No connection to server",
"Connection to '%0' server broken",
"Connection already exists",
"Cannot find named server '%0'",
"Server out of file handles",
"Function '%0' not implemented",
"Timeout error",
"General server error: %0",
"Bad parameters",
"Memory error - out of buffers",
"Out of RISC OS handles",
"File '%0' not found",
"Directory '%0' not found",
"Insufficient access",
"File already exists",
"Incorrect password",
"Illegal name",
"Error not known"
};
static const int omni_errcount = (sizeof(omni_errors)/sizeof(char*))-1;
......@@ -97,97 +97,97 @@ static bool msgopen = false;
/* Initialise errors from MessageTrans.
*/
*/
extern void InitErrors(void)
{
Desk_os_error *err = NULL;
/* Get resources path from country configuration */
InitResources(msgpath);
strcat(msgpath, "Messages");
/* Attempt to open messages file. See PRM 3-743, because R2=0 on entry,
* the file descriptor and message file pathname should be static.
*/
err = _swix(MessageTrans_OpenFile, _INR (0, 2), &msgtrans[0], msgpath, 0);
dprintf (("", "InitErrors: '%s' %x\n", msgpath, (int) err));
if (!err) msgopen = true;
Desk_os_error *err = NULL;
/* Get resources path from country configuration */
InitResources(msgpath);
strcat(msgpath, "Messages");
/* Attempt to open messages file. See PRM 3-743, because R2=0 on entry,
* the file descriptor and message file pathname should be static.
*/
err = _swix(MessageTrans_OpenFile, _INR (0, 2), &msgtrans[0], msgpath, 0);
dprintf (("", "InitErrors: '%s' %x\n", msgpath, (int) err));
if (!err) msgopen = true;
}
/* Close any open error lookup files, and release workspace from RMA.
*/
*/
extern void CloseErrors(void)
{
dprintf (("", "CloseErrors:\n"));
if (msgopen) _swix (MessageTrans_CloseFile, _IN (0), &msgtrans[0]);
msgopen = false;
dprintf (("", "CloseErrors:\n"));
if (msgopen) _swix (MessageTrans_CloseFile, _IN (0), &msgtrans[0]);
msgopen = false;
}
/* This function takes an error number and returns a pointer to
* an error block (OmniClient internal error messages).
*/
* an error block (OmniClient internal error messages).
*/
extern _kernel_oserror *MakeError(int n)
{
omni_errblk.errnum = n;
n -= ERR_BASE;
if (n >= err_count) n = err_count;
dprintf (("", "MakeError: %d\n", n));
if (msgopen)
{
char token[16];
/* Do lookup via MessageTrans */
sprintf(token, "omni.int%d", n);
_swix (MessageTrans_Lookup, _INR (0, 3),
&msgtrans[0], token, omni_errblk.errmess, sizeof (omni_errblk.errmess));
/* If lookup failed (returned token unchanged) then do private lookup */
if (strcmp(token, omni_errblk.errmess)) return(&omni_errblk);
}
/* Do lookup with private copy of messages */
strncpy(omni_errblk.errmess, err_strings[n], 251);
return(&omni_errblk);
omni_errblk.errnum = n;
n -= ERR_BASE;
if (n >= err_count) n = err_count;
dprintf (("", "MakeError: %d\n", n));
if (msgopen)
{
char token[16];
/* Do lookup via MessageTrans */
sprintf(token, "omni.int%d", n);
_swix (MessageTrans_Lookup, _INR (0, 3),
&msgtrans[0], token, omni_errblk.errmess, sizeof (omni_errblk.errmess));
/* If lookup failed (returned token unchanged) then do private lookup */
if (strcmp(token, omni_errblk.errmess)) return(&omni_errblk);
}
/* Do lookup with private copy of messages */
strncpy(omni_errblk.errmess, err_strings[n], 251);
return(&omni_errblk);
}
/* This function takes an error number and returns a pointer to
* an error block (OmniClient shared protocol errors - called by Omni_MessageLookup).
*/
* an error block (OmniClient shared protocol errors - called by Omni_MessageLookup).
*/
extern _kernel_oserror *OmniError(int n, char *param)
{
omni_errblk.errnum = n + ERR_MESSBASE;
if (n >= omni_errcount) n = omni_errcount;
dprintf (("", "OmniError: %d\n", n));
if (msgopen)
{
char token[16];
/* Do lookup via MessageTrans */
sprintf(token, "omni.err%d", n);
_swix (MessageTrans_Lookup, _INR (0, 4),
&msgtrans[0], token, omni_errblk.errmess, sizeof (omni_errblk.errmess), param);
dprintf (("", "OmniError: msg '%s' '%s'\n", token, omni_errblk.errmess));
/* If lookup failed (returned token unchanged) then do private lookup */
if (strcmp(token, omni_errblk.errmess)) return(&omni_errblk);
}
/* Do lookup with private copy of messages */
if (param)
{
char err[252];
char *sub = NULL;
/* Have to deal with MessageTrans '%0' -> C sprintf '%s' translation! */
strncpy(err, omni_errors[n], 251);
if ((sub = strstr(err, "%0")) != NULL) *(sub+1) = 's';
sprintf(omni_errblk.errmess, err, param);
dprintf (("", "OmniError: private param '%s' '%s'\n", param, omni_errblk.errmess));
}
else
{
strncpy(omni_errblk.errmess, omni_errors[n], 251);
dprintf (("", "OmniError: private '%s'\n", omni_errblk.errmess));
}
return(&omni_errblk);
omni_errblk.errnum = n + ERR_MESSBASE;
if (n >= omni_errcount) n = omni_errcount;
dprintf (("", "OmniError: %d\n", n));
if (msgopen)
{
char token[16];
/* Do lookup via MessageTrans */
sprintf(token, "omni.err%d", n);
_swix (MessageTrans_Lookup, _INR (0, 4),
&msgtrans[0], token, omni_errblk.errmess, sizeof (omni_errblk.errmess), param);
dprintf (("", "OmniError: msg '%s' '%s'\n", token, omni_errblk.errmess));
/* If lookup failed (returned token unchanged) then do private lookup */
if (strcmp(token, omni_errblk.errmess)) return(&omni_errblk);
}
/* Do lookup with private copy of messages */
if (param)
{
char err[252];
char *sub = NULL;
/* Have to deal with MessageTrans '%0' -> C sprintf '%s' translation! */
strncpy(err, omni_errors[n], 251);
if ((sub = strstr(err, "%0")) != NULL) *(sub+1) = 's';
sprintf(omni_errblk.errmess, err, param);
dprintf (("", "OmniError: private param '%s' '%s'\n", param, omni_errblk.errmess));
}
else
{
strncpy(omni_errblk.errmess, omni_errors[n], 251);
dprintf (("", "OmniError: private '%s'\n", omni_errblk.errmess));
}
return(&omni_errblk);
}
......@@ -79,7 +79,9 @@ enum imenu_quit
enum mmenu
{
mmenu_DISPLAY = 0,
mmenu_CONNECT
mmenu_CONNECT,
mmenu_AUTODISCOVER,
mmenu_SAVECHOICES
};
/* Main display menu items */
......
/* Copyright 2000 Pace Micro Technology plc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef Omni_MakeError_h
#define Omni_MakeError_h
/*
* MakeError.h
* Header file for NetFiler client module - part of the Omni project
*/
* MakeError.h
* Header file for NetFiler client module - part of the Omni project
*/
#include "Filer.h"
typedef enum
{
err_REGISTERED = ERR_BASE,
err_BADPROTOCOL,
err_NOMEM_REGISTRATION,
err_NOTREGISTERED,
err_BADREASON,
err_NEEDNAMES,
err_NOTPRINTING,
err_NOMEM_PRINT,
err_BADPRINT,
err_BADMOUNTS,
err_BADCREATE,
err_NOTIMPLEMENTED,
err_BADTIME,
err_NOMEM_BUFFER,
err_RESTART,
err_REGISTERED = ERR_BASE,
err_BADPROTOCOL,
err_NOMEM_REGISTRATION,
err_NOTREGISTERED,
err_BADREASON,
err_NEEDNAMES,
err_NOTPRINTING,
err_NOMEM_PRINT,
err_BADPRINT,
err_BADMOUNTS,
err_BADCREATE,
err_NOTIMPLEMENTED,
err_BADTIME,
err_NOMEM_BUFFER,
err_RESTART,
err_UNKNOWN
err_UNKNOWN
} err_number_type;
extern _kernel_oserror *MakeError(int n);
......
......@@ -29,35 +29,35 @@
EXPORT serviceomni_delay
serviceomni_delay
STMFD sp!, {lr}
Push "lr"
MOV a2, a1 ; save R0 parameter (called as r12)
ADR a1, serviceomni_cb
SWI XOS_AddCallBack
LDMFD sp!, {pc}
Pull "pc"
serviceomni_cb
STMFD sp!, {a1-a2, lr}
Push "a1-a2, lr"
MOV a1, ip ; issue service call
MOV a2, #Service_OmniAction
SWI XOS_ServiceCall
LDMFD sp!, {a1-a2, pc}
Pull "a1-a2, pc"
; Wimp_SpriteReadInfo
EXPORT Wimp_SpriteReadInfo
Wimp_SpriteReadInfo
STMFD sp!, {a2, v1, v2, v3, lr}
Push "a2, v1, v2, v3, lr"
MOV a3, a1
MOV a1, #40
SWI XWimp_SpriteOp
LDMFD sp!, {a2}
Pull "a2"
STMVCIA a2, {a4, v1, v2, v3}
MOVVC a1, #0
[ {CONFIG}=26
LDMFD sp!, {v1, v2, v3, pc}^
Pull "v1, v2, v3, pc",,^
|
LDMFD sp!, {v1, v2, v3, pc}
Pull "v1, v2, v3, pc"
]
; SetVar_Code - sets up/removes a code system variable
......@@ -65,7 +65,7 @@ Wimp_SpriteReadInfo
EXPORT SetVar_Code
SetVar_Code
STMFD sp!, {v1, lr}
Push "v1, lr"
MOVS a3, a1 ; r0 = -ve on entry to remove variable
MOVGE a3, #var_end-var_code
STR a2, var_taskhandle ; r1 = address of taskhandle int
......@@ -75,9 +75,9 @@ SetVar_Code
MOV v1, #16
SWI XOS_SetVarVal
[ {CONFIG}=26
LDMFD sp!, {v1, pc}^
Pull "v1, pc",,^
|
LDMFD sp!, {v1, pc}
Pull "v1, pc"
]
; var_code - evaluates the system variable
......@@ -101,6 +101,6 @@ var_state
var_end
var_name
= "Omni$Running", 0
= "Omni$$Running", 0
END