Technical Capabilities
Having trouble finding what you need?
Get in touch with us, so we can answer your specific questions directly.
Get In Touch

FMS$ – Forms Management System

Overview

VX/FMS$ is a native C reimplementation of OpenVMS FMS (Forms Management System) for x86 and ARM Linux. It exports the OpenVMS FDV$ Forms Driver callable interface, so applications that call FDV$LOAD, FDV$DISPW, FDV$GET and the rest of the 66-routine set link and run unchanged. Forms authored in the FMS form language compile to the same binary form format and load from the same form libraries.

The product ships as a static library (libfms.a) plus command-line utilities and a terminal form editor. Compiled forms render to VT, ANSI, and xterm terminals through an escape-sequence driver rather than a VMS terminal driver, and every FDV$ routine returns the same VMS-style condition codes, so forms-based applications keep their existing screen behaviour and error handling on Linux.

Architecture and dispatch

VX/FMS$ is a linked library, not a daemon. An application links against libfms.a (or libfmsx.a in standalone mode) and calls the FDV$ Forms Driver routines directly. The whole product is a single portable source tree: the same files build for OpenVMS and for Linux, guarded by __VMS conditionals, so behaviour on Linux tracks the VMS original rather than forking from it. Three pieces make up the product: the FDV$ Forms Driver runtime, the FMS form language and binary form format, and a terminal driver that paints forms with escape sequences.

Two-layer call dispatch

Every FDV$ call passes through two layers. This is the single most important structural fact about the runtime.

LayerSymbol shapeRole
Public entry (VMS ABI)FDV_D_XXX, aliased to FDV$XXX / fdv$xxxThe ABI-facing thunk. On VMS it probes the caller's argument count and NULLs out omitted trailing arguments, then calls the implementation and normalises the return value.
ImplementationFCC_XXXThe actual work: validates arguments, checks the current terminal control area and cancel state, mutates the workspace, drives the terminal, and returns an FDV__* condition code.

The dollar-sign name is bound to a dollar-free real symbol through an alias table, because $ is legal in OpenVMS identifiers but not in a portable C symbol. The public thunk and its implementation look like this:

/* public thunk: normalises the VMS ABI */
U32 FDV_D_ADLVA(S32 *video)
{
  begin_FDV();
#ifdef __VMS
  int prmcnt; va_count(prmcnt);
  if( prmcnt < 1 ) video = NULL;   /* default an omitted arg */
#endif
  call_FDV( FCC_ADLVA( video ) );
  end_FDV();
}
__AliasF(FDV_D_ADLVA, FDV$ADLVA, fdv$adlva);   /* export the VMS-visible name */

/* implementation: the real work + status ladder */
U32 FCC_ADLVA(S32 *video)
{
  enter_FDV
  if( ! video )        return_FDV( FDV__ARG )   /* bad/omitted arg */
  if( ! FMS_curr_tca ) return_FDV( FDV__TCA )   /* no terminal control area */
  if( FMS_t_cancel(FMS_curr_tca) ) return_FDV( FDV__CAN )
  /* ... do the work ... */
  return_FDV( FDV__SUC )                        /* 2719889 = success */
}
Consistent error ladder. Nearly every routine follows the same guard order: FDV__ARG (bad or omitted argument), then FDV__TCA (no terminal control area), then FDV__CAN (call cancelled), then the routine's own work, then FDV__SUC. The enter_FDV / return_FDV wrappers keep the last status current so FDV$STAT can report it afterwards.

Core runtime state

The runtime is organised around a small set of structures:

StructureRole
Terminal Control Area (TCA)Per-terminal context in a linked list, holding display state, the cancel flag, and the current workspace root. FMS_curr_tca is the active one, selected by FDV$STERM.
WorkspaceWhere a loaded form lives; attached with FDV$AWKSP and selected with FDV$SWKSP.
Form libraryAn open library file on a channel, holding compiled forms; opened with FDV$LOPEN.
Loaded formAn in-memory copy of a compiled form, brought in from the library by FDV$LOAD.

Call lifecycle

01Attach and select terminalFDV$ATERM attaches the terminal and creates its TCA; FDV$STERM selects that TCA as current.
02Open form libraryFDV$LOPEN(file) opens the library on a channel.
03Attach and select workspaceFDV$AWKSP attaches the workspace; FDV$SWKSP selects it as current.
04Load compiled formFDV$LOAD(name) reads form.fbn into the workspace.
05Display and waitFDV$DISPW paints the form to the terminal and waits until it is ready.
06Interact with fieldsFDV$PUT* seeds values, then FDV$GET* or FDV$PFT reads them, then FDV$RET* harvests the result.
07Close libraryFDV$LCLOS releases the form library channel.
08Detach terminalFDV$DTERM ends the terminal session.

FDV$ callable routines

VX/FMS$ exports the full OpenVMS FDV$ Forms Driver set: 66 callable routines, each backed by a real implementation body. On the VMS ABI every argument is passed by reference and trailing arguments are optional, defaulted to NULL by the public thunk. The routines are grouped below by function; every routine listed is live.

FDV$, not FDL$. These are the Forms Driver routines of OpenVMS FMS. They are not the RMS File Definition Language routines (FDL$), which are a separate product. This page documents FDV$ only.

Terminal and workspace setup

RoutinePurpose
FDV$ATERMAttach a terminal and create a terminal control area on a channel.
FDV$STERMSelect a terminal control area, making it current.
FDV$DTERMDetach a terminal and tear down its terminal control area.
FDV$AWKSPAttach (register) a workspace of a given size.
FDV$SWKSPSelect a workspace as the current one.
FDV$DWKSPDetach (deregister) a workspace.
FDV$FIX_SCREENRepair and repaint the physical screen.

Form libraries and loading

RoutinePurpose
FDV$LOPENOpen a form library file on a channel.
FDV$LCLOSClose the current form library.
FDV$LOADLoad a form by name from the library into the current workspace.
FDV$READRead a binary form image into caller-supplied memory.
FDV$DELDelete (undisplay) a named form from the workspace.
FDV$FCHANReturn the form-library channel of the current terminal control area.
FDV$LCHANReturn the current library channel.
FDV$TCHANReturn the terminal channel of the current terminal control area.

Display and refresh

RoutinePurpose
FDV$DISPDisplay a form without waiting.
FDV$DISPWDisplay the current form and wait for the terminal to be ready.
FDV$NDISPDisplay without clearing (overlay a new display).
FDV$CDISPContinue or append the display of a form at an offset.
FDV$RFRSHRefresh (repaint) the screen from the workspace.
FDV$USER_REFRESHRegister a user refresh callback.
FDV$CLEARClear a count of screen lines from a starting line.
FDV$PUTLPut a text string on a screen line.
FDV$PRINT_SCREENPrint or dump the current screen to a file.

Field input and output

RoutinePurpose
FDV$GETRead one field (value plus terminator key).
FDV$GETAFGet all fields starting at a named field.
FDV$GETALGet all field values into a single buffer.
FDV$GETDLGet a data line with a prompt on a screen line.
FDV$GETSCGet a field from a scrolled area.
FDV$PFTPut field and transmit; scroll or advance a scrolled area.
FDV$WAITWait for a terminator key without reading a field.
FDV$PUTPut a value into a field.
FDV$PUTALPut all field values from one buffer.
FDV$PUTDPut the default value into a field.
FDV$PUTDAPut defaults into all fields.
FDV$PUTSCPut a value into a scrolled-area field.

Retrieving form context and status

RoutinePurpose
FDV$RETReturn (retrieve) a field's current value.
FDV$RETALReturn all field values.
FDV$RETCXReturn full context: terminal control area, workspace, form, cursor position, terminator, insert/overstrike, and help state.
FDV$RETDIReturn named data by index.
FDV$RETDNReturn named data by name.
FDV$RETFLReturn a form line image.
FDV$RETFNReturn the current field's name.
FDV$RETFOReturn a field name by ordinal number.
FDV$RETLEReturn a field's length.
FDV$STATReturn the last FMS status and I/O status.
FDV$SSRVSet service: return the status and I/O status pair.

Attributes, keyboard, and control

RoutinePurpose
FDV$ADLVASet the down-line-loadable video attribute on the current terminal control area.
FDV$AFCXAccess field context (insert/overstrike, cursor position, field).
FDV$AFVAAlter field video attributes.
FDV$CLEAR_VAClear video-attribute state.
FDV$DPCOMSet the display or data-path communication mode.
FDV$SPADASet the pad or scrolled-area display mode.
FDV$SPONTurn supervisor mode on.
FDV$SPOFFTurn supervisor mode off.
FDV$DFKBDDefine the keyboard (key to function mapping).
FDV$BELLSound the terminal bell and reset video and LEDs.
FDV$LEDONTurn a keyboard LED on.
FDV$LEDOFTurn a keyboard LED off.
FDV$ILTRMSet the illegal-terminator handling mode.
FDV$SSIGQSet the signal-queue mode.
FDV$SIGOPSignal the operator and drive the message line.
FDV$STIMESet the GET or WAIT timeout period.
FDV$CANCLCancel the pending GET or WAIT on the current terminal control area.
FDV$SCR_LENGTHReturn the screen length in rows.
FDV$SCR_WIDTHReturn the screen width in columns.

One further name, FDV$RESETTERMINAL, appears in the public header but is not part of the exported 66-routine set; treat it as internal-only.

Status and terminator codes

FDV$ routines return VMS-style condition codes: an odd value is success, an even value is failure, and callers test the low bit. There are 73 FDV__* codes in total, numbered contiguously from 2719889 (FDV__SUC, normal completion). The table lists the load-bearing codes an application is most likely to test or log.

CodeValueMeaning
FDV__SUC2719889Normal completion (success).
FDV__INC2719897Form incomplete after a PFT call.
FDV__MOD2719905Input successful; a field may have changed.
FDV__IMP2719922Workspace too small.
FDV__FSP2719930Illegal file spec in a LOPEN call.
FDV__IOL2719938Error opening the form library.
FDV__FLB2719946Specified file is not a form library.
FDV__ICH2719954Invalid channel number specified.
FDV__FRM2719970Invalid binary form.
FDV__FNM2719978Specified form does not exist.
FDV__FLD2719994Invalid field specification.
FDV__DSP2720010GET-type call is illegal for a display-only field.
FDV__UTR2720042Undefined field terminator.
FDV__ARG2720066Wrong number of arguments for the call.
FDV__INI2720074Workspace not attached.
FDV__IVM2720090Insufficient virtual memory.
FDV__ITT2720106Invalid terminal type.
FDV__TCA2720114Terminal Control Area invalid or undefined.
FDV__WID2720130Form too wide for the terminal or context.
FDV__NFL2720138No form loaded into the specified workspace.
FDV__NDS2720154GET-type call to an undisplayed form.
FDV__CAN2720194Call was cancelled.
FDV__TMO2720234Timeout exceeded on a GET-type call or WAIT.
FDV__VAL2720250Value of a parameter out of range.
FDV__SYS2720266FDV encountered a system error response.

A further block of field-attribute codes (for example FDV__ALPHA, FDV__NUMERC, FDV__MUSTFILL, FDV__NOHELP) describes field validation classes and is what a User Action Routine inspects.

Field terminator codes

The terminator out-parameter of FDV$GET, FDV$GETSC, FDV$PFT and FDV$WAIT carries the key that ended input. There are 17 terminator values; the common ones are:

ConstantValueMeaning
FDV_K_FT_NTR0Enter (end of GETs).
FDV_K_FT_NXT1Next field.
FDV_K_FT_PRV2Previous field.
FDV_K_FT_ATB3Auto-tab to the next field.
FDV_K_FT_XBK4Exit scrolled area backward.
FDV_K_FT_XFW5Exit scrolled area forward.
FDV_K_FT_SNX6Scroll forward to the next field.
FDV_K_FT_SPR7Scroll backward to the previous field.
FDV_K_FT_SFW8Scroll forward.
FDV_K_FT_SBK9Scroll backward.

The FMS form language and binary forms

A form is authored as a text .flg file, compiled to a binary .fbn form, and grouped with other forms into a form library. At run time FDV$LOPEN opens the library on a channel and FDV$LOAD locates a form by appending .fbn to its name. The form language and binary format match the OpenVMS originals, so existing form sources compile unchanged.

Statement types

The top-level statements in a .flg form description:

StatementPurpose
FORMBegin a form; must be the first statement.
ATTRIBUTE_DEFAULTSSet default attributes for the form.
TEXTLiteral screen text.
FIELDDefine an input or output field.
DRAWLine-drawing block.
VIDEOVideo-attribute block.
SCROLLDefine a scrolled area.
ORDERField ordering.
NAMED_DATAAttach named constant data to the form.
END_OF_FORMTerminate a form.

Item keywords

Clauses within a statement select field behaviour, validation, and video attributes. The full keyword set includes:

ACTION_ROUTINE
AREA_TO_CLEAR
BACKGROUND
CHARACTER_SET
CLEAR_CHARACTER
DATA
DATE_FIELD
DEFAULT
HELP
HELP_FORM
HIGHLIGHT
INDEX
INDEXED
NAME
PICTURE
TIME_FIELD
WIDTH
AUTOTAB
BLANK_FILL
BLINKING
BOLD
DISPLAY_ONLY
ECHO
FIXED_DECIMAL
LEFT_JUSTIFIED
MUST_FILL
RESPONSE_REQUIRED
REVERSE
RIGHT_JUSTIFIED
SUPERVISOR_ONLY
SUPPRESS
UNDERLINE
UPPERCASE
ZERO_FILL

Date pictures (MDY, DDMMMYY, MMDDYY, DDMMYY) and time pictures (HHMMSS, HHMMAMPM) are built in, and the compiler enforces that FORM is the first statement before writing the binary form.

Example form source

FORM NAME='ACCOUNT_INQUIRY'
    AREA_TO_CLEAR=1:23
    WIDTH=80
    BACKGROUND=CURRENT
    HIGHLIGHT=BOLD:UNDERLINE
    FUNCTION_KEY_ACTION_ROUTINE='FILTER_UAR'
    ;
TEXT (5,10) 'Account Number :'
    ;
FIELD ACCT_NO (5,27)
    PICTURE='NNNNNNNNNN'
    RESPONSE_REQUIRED
    UPPERCASE
    ;

Positions are given as (row,col), an ampersand continues a string across lines, and each statement ends with a semicolon.

Linux form editor

VX/FMS$ ships fmsedit, a Linux reimplementation of the VMS form editor that reads and writes the same .flg format and renders to an ANSI or VT terminal. It follows the VMS Gold-key idiom (PF1 as Gold) and also builds a headless render tool and a round-trip regression tool for validating form files in a build pipeline.

Terminal rendering

Forms are painted by emitting escape sequences directly, not through curses. A dedicated terminal layer handles cursor addressing, line erasing, video attributes, and output flushing. Video attributes map to standard CSI sequences:

/* video attribute sequences */
BST_SEQ_VID_BEG   "\033["   /* CSI */
BST_SEQ_BOLD      "1"
BST_SEQ_UNDERLINE "4"
BST_SEQ_REVERSE   "7"
BST_SEQ_VID_END   "m"

Terminal type is auto-detected from the $TERM environment variable at startup. An X-window terminal resolves to XTERM; otherwise a prefix match selects ANSI, HFT, or VT, and anything unmatched falls back to VT. This is the main Linux divergence point: the OpenVMS original drove real VT-series hardware through the VMS terminal driver, while VX/FMS$ renders the same forms to a Linux pseudo-terminal using ANSI and VT escape sequences.

Same forms, portable output. Because rendering is driven entirely by $TERM, a form built for a VT terminal displays correctly under xterm and other ANSI-compatible terminals without any change to the form source.

End-to-end call path

A migrated program links against libfms.a and calls the FDV$ routines exactly as it did on OpenVMS. The success test is the same: the low bit of the returned status is set on success (status & 1). The example below loads and displays a form, then reads fields from a scrolled area, checking status after each call.

/* fail fast: report the FMS message and exit on any error */
#define CHECK if( !(fmsstat & 1) ) { \
  fprintf(stderr, "FMS error %d [%s] at line %d\r\n", \
          fmsstat, FMS_disp_deb_mess_1(fmsstat), __LINE__); exit(0); }

/* simple form: select workspace, load, display, wait */
fmsstat = fdv$swksp( &acct_wksp );                        CHECK
fmsstat = fdv$load ( _DESCR("ACCOUNT_INQUIRY") );          CHECK
fmsstat = fdv$dispw( 0 );                                 CHECK
fmsstat = fdv$wait ( 0 );                                 CHECK

/* scrolled area: read fields until the terminator says stop */
fmsstat = fdv$swksp( &txn_wksp );                         CHECK
fmsstat = fdv$load ( _DESCR("TXN_HISTORY") );              CHECK
fmsstat = fdv$dispw( 0 );                                 CHECK
fmsstat = fdv$getsc( _DESCR("TXN_LINE"), &val, &trm );    CHECK

while( 1 ) {
  switch( trm ) {                    /* trm is an FDV_K_FT_* code */
    case FDV_K_FT_NXT: case FDV_K_FT_ATB:
    case FDV_K_FT_SFW: case FDV_K_FT_SNX:
      fmsstat = fdv$pft( &trm, _DESCR("TXN_LINE"),
                         _DESCR(line_buf), 0, 0 );        CHECK
      break;
    /* ... handle other terminators ... */
  }
}

Note the trailing 0, 0 passed to fdv$pft: on Linux the optional arguments a VMS caller could omit are passed explicitly as NULL, because the argument-count probe used on VMS is not available.

The complete ordered sequence, including terminal and workspace selection, library and form loading, interaction, and teardown, is shown in Architecture and dispatch: Call lifecycle.

FDV$STAT can report the last condition value at any point in this sequence.

Compatibility and divergences

The table summarises what is implemented. The core forms driver, the form language, the binary form format, terminal rendering, scrolled areas, and User Action Routines are all present and exercised.

CapabilityStatus
66 FDV$ Forms Driver routines (each with an implementation body)live
FDV$ condition codes and message textlive
Field terminator and validation-class codeslive
FMS form language and statement / keyword setlive
Binary form load (FDV$LOAD / FDV$READ)live
Form libraries (FDV$LOPEN / FDV$LCLOS)live
VT, ANSI, xterm, and HFT terminal renderinglive
Scrolled areas (FDV$GETSC / FDV$PFT / FDV$SPADA)live
User Action Routines and the UAR generator utilitylive
fmsedit Linux form editor (read, write, render .flg)live
FDV$RESETTERMINAL public exportnot exposed

Divergences from OpenVMS FMS

DivergenceReason
Each routine is exported twice: a dollar-free real symbol (FDV_D_XXX) plus a FDV$XXX alias.A dollar sign is legal in OpenVMS identifiers but not in a portable C symbol; the alias reproduces the VMS-visible name so existing object references resolve.
Optional trailing arguments must be passed explicitly as NULL on Linux.The VMS argument-count probe is not available on Linux, so callers pass omitted arguments as NULL or zero.
Rendering uses ANSI and VT escape strings, driven by $TERM.There is no VMS terminal driver or real VT hardware on Linux.
A form binary is located by concatenating the form name with .fbn in a library directory.Maps OpenVMS form-library semantics onto a Linux directory and file layout.
A standalone build (libfmsx.a) is available alongside the default libfms.a.The standalone build decouples FMS from the rest of the VX/RT runtime.

Quick reference

Linking

Link with -lfms (or -lfmsx for the standalone build) from libfms.a; include the FDV$ routine prototypes and pull in the FMS standard header.

Minimal call flow

Use the ordered card flow in Architecture and dispatch: Call lifecycle for the complete session sequence. The minimal path selects the terminal, opens the library, selects the workspace, loads and displays the form, reads and returns field values, then closes the library.

Common status codes

FDV__SUC = 2719889
FDV__ARG (bad args)
FDV__TCA (no terminal)
FDV__CAN (cancelled)
FDV__FNM (form not found)
FDV__FRM (bad binary form)
FDV__NFL (no form loaded)
FDV__TMO (timeout)

Success test: status & 1 true means success.

File extensions

.flg (form source)
.fbn (binary form)
form library on a channel

Common terminators

FDV_K_FT_NTR = 0 (Enter)
FDV_K_FT_NXT = 1
FDV_K_FT_PRV = 2
FDV_K_FT_ATB = 3

Environment

$TERM selects XTERM, ANSI, HFT, or VT rendering at startup.

Frequently Asked Questions

Curious about how Sector7 can facilitate your application migration? Explore our FAQs for expert insights.

What is VX/FMS and how does it help with OpenVMS migration?

VX/FMS provides a native call-compatible implementation of OpenVMS Forms Management System for Linux platforms. It enables OpenVMS applications to define, generate, and manage native FMS Forms on both x86 and ARM Linux systems.

This solution allows organizations to preserve their existing OpenVMS forms-based applications while migrating to modern Linux infrastructure. To discuss how VX/FMS can support your specific migration requirements, contact our team.

What key features does VX/FMS provide for forms management?

VX/FMS offers full compatibility with OpenVMS FDL$ APIs, supports file structure definition and parsing, and maintains OpenVMS file structure semantics on Linux.

Does VX/FMS support all OpenVMS FDV$ API functions?

Yes, VX/FMS provides comprehensive support for FDV$ APIs including display operations, terminal handling, file management, and workspace allocation functions.

What are the main benefits of migrating forms with VX/FMS?

VX/FMS preserves OpenVMS capability while enabling direct porting of applications without major modifications, minimizing development costs and preserving productivity.

What technical platforms does VX/FMS support?

VX/FMS supports both x86 and ARM Linux architectures, providing flexible deployment options for modern infrastructure requirements.

How does VX/FMS handle OpenVMS forms processing workflows?

VX/FMS maintains the complete OpenVMS forms workflow including structure generation, parsing, display operations, and user interaction handling. The solution preserves terminal management functions, screen operations, and file channel management exactly as they work in OpenVMS.

This comprehensive approach ensures that complex forms-based applications continue to operate with identical behavior on Linux platforms.

What results can organizations expect from VX/FMS implementation?

VX/FMS delivers seamless migration of forms-based applications with preserved functionality and consistent behavior. Organizations eliminate vendor lock-in while modernizing their infrastructure to Linux platforms.

The solution reduces development costs by avoiding application rewrites and maintains productivity through familiar forms management capabilities. Companies like Shaw Industries have successfully modernized their manufacturing systems using similar migration strategies.

Ready to explore how VX/FMS can modernize your forms-based applications? Contact us to discuss your specific requirements.

What is VX/FMS$?

VX/FMS$ is a native reimplementation of the OpenVMS Forms Management System (FMS) for x86 and ARM Linux. It exports the FDV$ Forms Driver callable interface, so OpenVMS applications can define, display, and manage FMS forms on Linux without changing their forms logic.

Which CPU architectures and platforms does VX/FMS$ run on?

VX/FMS$ runs on both x86 and ARM Linux. It is delivered as part of the VX/RT runtime that brings OpenVMS compatibility to those platforms.

Do I have to rewrite my application to use VX/FMS$?

No. Applications that call the OpenVMS FDV$ Forms Driver routines link and run without major modifications, which preserves productivity and minimizes development cost.

Which FDV$ routines does VX/FMS$ provide?

VX/FMS$ provides the full set of 66 FDV$ callable routines. They span form loading and display (FDV$LOAD, FDV$DISP, FDV$DISPW), field input and output (FDV$GET, FDV$GETSC, FDV$PFT, FDV$PUT), terminal and screen management (FDV$STERM, FDV$SCR_WIDTH, FDV$SCR_LENGTH), workspace handling (FDV$AWKSP, FDV$SWKSP, FDV$DWKSP), and library and channel control (FDV$LOPEN, FDV$LCHAN, FDV$TCHAN). The full routine table is on the page.

How does VX/FMS$ handle terminal display and user interaction?

Through its FDV$ routines. For example FDV$DISP and FDV$DISPW display data, FDV$READ and FDV$GET handle input, FDV$BELL sounds the terminal alert, FDV$LEDON and FDV$LEDOF control terminal LEDs, and FDV$STERM sets terminal characteristics. Behaviour matches OpenVMS FMS, and forms are rendered to VT, ANSI, and xterm terminals using escape sequences.

How does VX/FMS$ fit with the rest of the Sector7 migration stack?

VX/FMS$ integrates into the VX/RT ecosystem, which provides OpenVMS compatibility on x86 and ARM Linux. FMS forms handling is delivered as part of that broader OpenVMS-on-Linux runtime rather than as a standalone island.

Does VX/FMS$ preserve the same forms workflows as OpenVMS?

Yes. VX/FMS$ preserves OpenVMS FMS capability and supports the same forms workflows: loading and displaying compiled forms, reading and transmitting fields, and managing the terminal, so forms-based applications can be ported directly.

How is an FMS form defined and displayed?

A form is authored in the FMS form language as a .flg source file with statements such as FORM, TEXT, and FIELD, then compiled to a binary .fbn form. At run time an application selects a workspace with FDV$SWKSP, loads the form with FDV$LOAD, displays it with FDV$DISPW, and reads user input with FDV$GET or FDV$GETSC.

Transform Your Legacy Software Today!

Get In Touch
Unlock the potential of your legacy software with our expert migration services.