diff --git a/changelog.txt b/changelog.txt index c0513a7..36eee64 100644 --- a/changelog.txt +++ b/changelog.txt @@ -2,6 +2,7 @@ GCCLIB Change LOG ================= 0.8.4 - 14 Mar 2021 +F0051 - Added CMSdirectRead() Read from the virtual console, bypassing stack F0050 - Added GCCLIB [VERSION|DEBUG] argument VERSION prints version DEBUG prints version, anchor and turns on debug mode diff --git a/cmssys.assemble b/cmssys.assemble index 1b85938..9b5203c 100644 --- a/cmssys.assemble +++ b/cmssys.assemble @@ -1,23 +1,24 @@ -*********************************************************************** -* CMSSYS contains C interfaces to CMS system services: * -* @@DEBUG A dummy routine callable from C (set breakpoint here). * -* @@ATTN Place a line on the CMS console stack. * -* @@SVC202 Invoke a CMS system service or command. * -* @@DMSFRE Allocate free memory. * -* @@DMSFRT Release allocated memory. * -* @@FSCLOS Close an open file and save it to disk. * -* @@FSERAS Delete a CMS file. * -* @@FSOPEN Open a CMS file for reading or writing. * -* @@FSPOIN Set the next item in a file to be read or written. * -* @@FSREAD Read a record from an open file. * +*********************************************************************** 00010000 +* CMSSYS contains C interfaces to CMS system services: * 00020000 +* @@DEBUG A dummy routine callable from C (set breakpoint here). * 00030000 +* @@ATTN Place a line on the CMS console stack. * 00040000 +* @@SVC202 Invoke a CMS system service or command. * 00050000 +* @@DMSFRE Allocate free memory. * 00060000 +* @@DMSFRT Release allocated memory. * 00070000 +* @@FSCLOS Close an open file and save it to disk. * 00080000 +* @@FSERAS Delete a CMS file. * 00090000 +* @@FSOPEN Open a CMS file for reading or writing. * 00100000 +* @@FSPOIN Set the next item in a file to be read or written. * 00110000 +* @@FSREAD Read a record from an open file. * 00120000 * @@FSSTAT Determine whether a file exists. * * @@FSWRIT Write a record to an open file. * * @@GETCLK Get the system clock time. * * @@PRINTL Write a line to the virtual printer. * * @@PUNCHC Write a line to the virtual card punch. * * @@RDCARD Read a line from the virtual card reader. * +* @@RDDRCT Read a line from the virtual console, bypassing stack. * * # @@RDTAPE Read a record from a virtual tape drive. * -* @@RDTERM Read a line from the terminal. * +* @@RDTERM Read a line from the stack or, if empty, the console. * * @@RENAME Rename a CMS file. * * @@STACKN Return number of lines in the CMS console stack. * * # @@TAPCTL Position the tape on a virtual tape drive. * @@ -943,7 +944,7 @@ RDCARDPL EQU *-RDCARDP EJECT *********************************************************************** * @@RDTERM Entry Point * -* Read a line from the terminal. * +* Read a line from the stack, or if empty, the virtual console. * * * * Syntax is: * * int __RDTERM(char * line) * @@ -980,6 +981,49 @@ RDTERMP RDTERM (2),EDIT=NO RDTERMPL EQU *-RDTERMP EJECT *********************************************************************** +* @@RDDRCT Entry Point * +* Read a line from the virtual console, bypassing the stack * +* * +* Syntax is: * +* int __RDDRCT(char * line) * +* where: * +* line is a pointer to the 131-character buffer into which * +* the line is read. This line will be terminated with a * +* null character, forming a C string. * +* returns: * +* (int) Length of the string placed in the buffer. * +*********************************************************************** +@@RDDRCT PDPPRLG CINDEX=0,FRAME=CMSSVALN,BASER=12,ENTRY=YES + LA R15,@@RDDRCT-CMSSYS + SLR R12,R15 + USING CMSSYS,R12 + L R2,0(R1) get buffer address +* Use RDTERM to read the line. +* RDTERM (2),EDIT=NO,TYPE=DIRECT + MVC RDDRCTE(RDDRCTPL),RDDRCTP set pattern +* Allow assembly on VM Sixpack by manually setting the TYPE=DIRECT + LA R9,RDDRCTE branch there to call it +* Remove this later ********* + MVI X'19'(R9),C'D' MANUALLY SET TYPE=DIRECT +* Remove this later ********* + BR R9 +RDDRCTND DS 0H it returns here + LH R0,14(,R1) Length returned here +* + LR R15,R0 get number of bytes read as return code + SR R1,R1 + STC R1,0(R15,R2) place null character at end of line + PDPEPIL +* + DS 0D align to avoid generated CNOP + USING RDDRCTP,R9 +*RDDRCTP RDTERM (2),EDIT=NO,TYPE=DIRECT +RDDRCTP RDTERM (2),EDIT=NO TYPE=DIRECT + DROP R9 + B RDTERMND +RDDRCTPL EQU *-RDDRCTP + EJECT +*********************************************************************** * @@RENAME Entry Point * * Rename a CMS file. * * * @@ -1214,6 +1258,13 @@ PLSTAREA DS 0D BUILD PLISTS HERE FOR PRINTL, PUNCHL, RDTERME RDTERM (2),EDIT=NO DROP R9 B RDTERMND +**** + ORG PLSTAREA + USING RDDRCTE,R9 +*RDDRCTE RDTERM (2),EDIT=NO,TYPE=DIRECT +RDDRCTE RDTERM (2),EDIT=NO TYPE=DIRECT + DROP R9 + B RDDRCTND **** ORG PLSTAREA USING WRTRM1E,R9 @@ -1256,7 +1307,7 @@ OUTBUF DS CL256 Terminal buffer CMSSVALN EQU *-CMSCRAB Save area length * FSCB FSCBD File System Control Block -FSCBLEN EQU *-FSCBD Length of FSCB +FSCBLEN EQU *-FSCBD Length of FSCB NUCON , REGEQU , END diff --git a/cmssys.h b/cmssys.h index 5b66ce4..1c600b2 100644 --- a/cmssys.h +++ b/cmssys.h @@ -7,19 +7,19 @@ /**************************************************************************************************/ #ifndef CMSSYS_INCLUDED #define CMSSYS_INCLUDED - + #define GCCLIB_VERSION "0.8.4" - + #include #include - + /**************************************************************************************************/ /* CMS Call Structures */ /**************************************************************************************************/ typedef char PLIST[8]; /* 8 char block */ - + typedef struct EVALBLOK EVALBLOK; - + struct EVALBLOK { EVALBLOK *Next; /* Reserved - but obvious what the intention was! */ int BlokSize; /* Total block size in DW's */ @@ -27,12 +27,12 @@ struct EVALBLOK { int Pad; /* (reserved) */ char Data[]; /* the data... */ }; - + typedef struct ADLEN { char *Data; /* data... */ int Len; /* length of data in bytes */ } ADLEN; - + typedef struct EPLIST { char *Command; char *BeginArgs; /* start of Argstring */ @@ -41,7 +41,7 @@ typedef struct EPLIST { ADLEN *ArgList; /* FUNCTION ARGUMENT LIST - Calltype 5 only */ EVALBLOK **FunctionReturn;/* RETURN OF FUNCTION - Calltype 5 only */ } EPLIST; - + /**************************************************************************************************/ /* CMSFILE maps the CMS FSCB (File System Control Block). */ /**************************************************************************************************/ @@ -57,7 +57,7 @@ typedef struct { short numRecords; /* number of records to read or write */ int bytesRead; /* number of bytes actually read */ } CMSFILE; - + struct FILE { char validator1; /* Marks a valid FILE structure */ char name[21]; /* File name used for messages */ @@ -81,7 +81,7 @@ struct FILE { CMSFILE fscb; /* the CMS File System Control Block (if it is a disk file) */ char validator2; /* Marks a valid FILE structure */ }; - + /**************************************************************************************************/ /* CMSFILEINFO maps the CMS FST (File Status Table). */ /**************************************************************************************************/ @@ -101,13 +101,13 @@ typedef struct { short numBlocks; /* number of 800-bypte blocks */ short fileYear; /* year file was last written */ } CMSFILEINFO; - + /**************************************************************************************************/ /* HI, TS, TE - Immediate flags */ /**************************************************************************************************/ #define TRACEFLAG 0x1 #define HALTFLAG 0x10 - + /**************************************************************************************************/ /* Two functions to help C programs avoid having any non-const static or global */ /* variables. For programs planning to be run from a shared segment the program they will be */ @@ -124,11 +124,11 @@ typedef struct { /* */ /**************************************************************************************************/ void *CMSPGAll(size_t size); - + #include - + #define CMSGetPG() (GETGCCCRAB()->process_global) - + /**************************************************************************************************/ /* int CMSGetFlag(int flag) */ /* */ @@ -138,7 +138,7 @@ void *CMSPGAll(size_t size); /* The flag is stored at 0x5e6 */ /**************************************************************************************************/ #define CMSGetFlag(flag) (int)(((*(char*)0x5e6) & (flag)) ? 1 : 0) - + /**************************************************************************************************/ /* void CMSSetFlag(int flag, int value) - thanks to Bob Bolch */ /* */ @@ -146,25 +146,25 @@ void *CMSPGAll(size_t size); /* Args flag and value (0 or 1) */ /**************************************************************************************************/ void CMSSETFL(int flag, int value); - + #define CMSSetFlag(s1, s2) (CMSSETFL((s1),(s2))) - + /**************************************************************************************************/ /* void CMSSetNUCON(void *address, int value) */ /* */ /* Set memory in NUCON */ /**************************************************************************************************/ void CMSSETNU(void *address, int value); - + #define CMSSetNUCON(s1, s2) (CMSSETNU((s1),(s2))) - + /**************************************************************************************************/ /* char CMSGetNUCON(void *address) */ /* */ /* Get memory in NUCON */ /**************************************************************************************************/ #define CMSGetNUCON(address) ((*(int*)(address))) - + /**************************************************************************************************/ /* int CMScardPunch(char * line) */ /* */ @@ -182,9 +182,9 @@ void CMSSETNU(void *address, int value); /* CMScommand function. */ /**************************************************************************************************/ int __punchc(char *line); - + #define CMScardPunch(s1) (__punchc((s1))) - + /**************************************************************************************************/ /* int CMScardRead(char * line, int * len) */ /* */ @@ -203,9 +203,9 @@ int __punchc(char *line); /* 100 Punch not attached. */ /**************************************************************************************************/ int __rdcard(char *line, int *len); - + #define CMScardRead(s1, i2) (__rdcard((s1),(i2))) - + /**************************************************************************************************/ /* CMSclock(void * clock) */ /* */ @@ -215,9 +215,9 @@ int __rdcard(char *line, int *len); /* (int) The number of seconds since 1/1/1970. */ /**************************************************************************************************/ int __getclk(void *clock); - + #define CMSclock(s1) (__getclk((s1))) - + /**************************************************************************************************/ /* int CMScommand(char * cmdLine, int cmdFlag) */ /* */ @@ -236,11 +236,11 @@ int __getclk(void *clock); /* 2. Be aware that the command invoked can potentially overlay your program in memory. */ /**************************************************************************************************/ int __cmscmd(char *cmdLine, int cmdFlag); - + #define CMScommand(s1, i1) (__cmscmd((s1),(i1))) #define CMS_COMMAND 1 #define CMS_CONSOLE 11 - + /**************************************************************************************************/ /* Call Type 5 (function) call */ /* __CMSFND() */ @@ -268,9 +268,9 @@ int __cmscmd(char *cmdLine, int cmdFlag); int __CMSFND(char *physical, char *logical, int is_proc, char **ret_val, int argc, char *argv[], int lenv[]); - + #define CMSfunctionDataArray(s1, s2, s3, s4, s5, s6, s7) (__CMSFND((s1),(s2),(s3),(s4),(s5),(s6),(s7))) - + /**************************************************************************************************/ /* Call Type 5 (function) call */ /* __CMSFNA() */ @@ -296,9 +296,9 @@ __CMSFND(char *physical, char *logical, int is_proc, char **ret_val, int argc, int __CMSFNA(char *physical, char *logical, int is_proc, char **ret_val, int argc, char *argv[]); - + #define CMSfunctionArray(s1, s2, s3, s4, s5, s6) (__CMSFNA((s1),(s2),(s3),(s4),(s5),(s6))) - + /**************************************************************************************************/ /* Call Type 5 (function) call */ /* __CMSFNC() */ @@ -324,9 +324,9 @@ __CMSFNA(char *physical, char *logical, int is_proc, char **ret_val, int argc, int __CMSFNC(char *physical, char *logical, int is_proc, char **ret_val, int argc, ...); - + #define CMSfunction(s1, s2, s3, s4, s5, ...) (__CMSFNC((s1),(s2),(s3),(s4),(s5),__VA_ARGS__)) - + /**************************************************************************************************/ /* Call Type 5 (function) call - convenience macros */ /* int CMSsimplefunction(char *function, char **ret_val, int argc, ...) */ @@ -348,11 +348,11 @@ __CMSFNC(char *physical, char *logical, int is_proc, char **ret_val, int argc, /**************************************************************************************************/ #define CMSsimplefunction(f, r, c, ...) (__CMSFNC((f),(f),0,(r),(c),__VA_ARGS__)) #define CMSsimpleprocedure(f, c, ...) (__CMSFNC((f),(f),1,0,(c),__VA_ARGS__)) - + /**************************************************************************************************/ /* int CMSconsoleRead(char * line) */ /* */ -/* Read a line from the terminal. */ +/* Read a line from the stack, or if empty, from the virtual console. */ /* line is a pointer to the 131-character buffer into which the line is read. The incoming */ /* line is terminated with a null character, forming a C string. */ /* */ @@ -360,9 +360,23 @@ __CMSFNC(char *physical, char *logical, int is_proc, char **ret_val, int argc, /* the length of the string placed in the buffer. */ /**************************************************************************************************/ int __rdterm(char *line); - + #define CMSconsoleRead(s1) (__rdterm((s1))) - + +/**************************************************************************************************/ +/* int CMSdirectRead(char * line) */ +/* */ +/* Read a line from the virtual console directly, bypassing the stack */ +/* line is a pointer to the 131-character buffer into which the line is read. The incoming */ +/* line is terminated with a null character, forming a C string. */ +/* */ +/* Returns: */ +/* the length of the string placed in the buffer. */ +/**************************************************************************************************/ +int __rddrct(char *line); + +#define CMSdirectRead(s1) (__rddrct((s1))) + /**************************************************************************************************/ /* int CMSconsoleWait(void) */ /* */ @@ -372,9 +386,9 @@ int __rdterm(char *line); /* Return code from the WAITT function, always 0. */ /**************************************************************************************************/ int __waitt(void); - + #define CMSconsoleWait() (__waitt()) - + /**************************************************************************************************/ /* int CMSconsoleWrite(char * line, int edit) */ /* */ @@ -396,11 +410,11 @@ int __waitt(void); /**************************************************************************************************/ #define CMS_EDIT 1 #define CMS_NOEDIT 0 - + int __wrterm(char *line, int edit); - + #define CMSconsoleWrite(s1, i2) (__wrterm((s1),(i2))) - + /**************************************************************************************************/ /* int CMSdebug(int retcode) */ /* */ @@ -412,9 +426,9 @@ int __wrterm(char *line, int edit); /* (int) as specified. */ /**************************************************************************************************/ int __debug(int retcode); - + #define CMSdebug(i1) (__debug((i1))) - + /**************************************************************************************************/ /* int CMSfileClose(CMSFILE* file) */ /* */ @@ -426,9 +440,9 @@ int __debug(int retcode); /* 6 The file is not open. */ /**************************************************************************************************/ int __fsclos(CMSFILE *file); - + #define CMSfileClose(s1) (__fsclos((s1))) - + /**************************************************************************************************/ /* int CMSfileErase(char * fileid) */ /* */ @@ -445,9 +459,9 @@ int __fsclos(CMSFILE *file); /* 36 Disk not accessed. */ /**************************************************************************************************/ int __fseras(char *fileid); - + #define CMSfileErase(s1) (__fseras((s1))) - + /**************************************************************************************************/ /* int CMSfileOpen(char * fileid, char * buffer, int bufferSize, char format, int numRecords, */ /* int recordNum, CMSFILE * file) */ @@ -486,9 +500,9 @@ int __fseras(char *fileid); /**************************************************************************************************/ int __fsopen(char *fileid, char *buffer, int bufferSize, char format, int numRecords, int recordNum, CMSFILE *file); - + #define CMSfileOpen(s1, s2, i3, c4, i5, i6, s7) (__fsopen((s1),(s2),(i3),(c4),(i5),(i6),(s7))) - + /**************************************************************************************************/ /* int CMSfilePoint(CMSFILE * file, int recordNum, int readWrite) */ /* */ @@ -509,11 +523,11 @@ int __fsopen(char *fileid, char *buffer, int bufferSize, char format, /* unpredictable results. */ /**************************************************************************************************/ int __fspoin(CMSFILE *file, int recordNum, int readWrite); - + #define CMSfilePoint(s1, i2, i3) (__fspoin((s1),(i2),(i3))) #define CMS_POINTREAD 0 #define CMS_POINTWRITE 1 - + /**************************************************************************************************/ /* int CMSfileRead(CMSFILE * file, int recordNum, int *bytesRead) */ /* */ @@ -546,9 +560,9 @@ int __fspoin(CMSFILE *file, int recordNum, int readWrite); /* They are NOT terminated with a null character. */ /**************************************************************************************************/ int __fsread(CMSFILE *file, int recordNum, int *bytesRead); - + #define CMSfileRead(s1, i2, s3) (__fsread((s1),(i2),(s3))) - + /**************************************************************************************************/ /* int CMSfileRename(char * oldFileid, char * newFileid) */ /* */ @@ -573,9 +587,9 @@ int __fsread(CMSFILE *file, int recordNum, int *bytesRead); /* 2. The RENAME command may issue error messages for certain errors. */ /**************************************************************************************************/ int __rename(char *oldFileid, char *newFileid); - + #define CMSfileRename(s1, s2) (__rename((s1),(s2))) - + /**************************************************************************************************/ /* int CMSfileState(char * fileid, CMSFILEINFO ** fileInfo) */ /* */ @@ -597,9 +611,9 @@ int __rename(char *oldFileid, char *newFileid); /* 36 Disk not accessed. */ /**************************************************************************************************/ int __fsstat(char *fileid, CMSFILEINFO **fileInfo); - + #define CMSfileState(s1, s2) (__fsstat((s1),(s2))) - + /**************************************************************************************************/ /* int CMSfileWrite(CMSFILE * file, int recordNum, int recordLen) */ /* */ @@ -648,9 +662,9 @@ int __fsstat(char *fileid, CMSFILEINFO **fileInfo); /* file, then open the file and begin writing from record 1. */ /**************************************************************************************************/ int __fswrit(CMSFILE *file, int recordNum, int recordLen); - + #define CMSfileWrite(s1, i2, i3) (__fswrit((s1),(i2),(i3))) - + /**************************************************************************************************/ /* void * CMSmemoryAlloc(int bytes, int type) */ /* */ @@ -666,11 +680,11 @@ int __fswrit(CMSFILE *file, int recordNum, int recordLen); /* Note that if such a program abnormally terminates, CMS does not release this memory. */ /**************************************************************************************************/ void *__dmsfre(int bytes, int type); - + #define CMSmemoryAlloc(i1, i2) (__dmsfre((i1),(i2))) #define CMS_NUCLEUS 0 #define CMS_USER 1 - + /**************************************************************************************************/ /* int CMSmemoryFree(void * memory) */ /* */ @@ -690,9 +704,9 @@ void *__dmsfre(int bytes, int type); /* Note that if such a program abnormally terminates, CMS does not release this memory. */ /**************************************************************************************************/ int __dmsfrt(void *memory, int doublewords); - + #define CMSmemoryFree(s1, s2) (__dmsfrt((s1),(s2)) - + /**************************************************************************************************/ /* int CMSprintLine(char * line) */ /* */ @@ -717,9 +731,9 @@ int __dmsfrt(void *memory, int doublewords); /* CMScommand function. */ /**************************************************************************************************/ int __printl(char *line); - + #define CMSprintLine(s1) (__printl((s1))) - + /**************************************************************************************************/ /* int CMSstackLine(char * line, int order) */ /* */ @@ -734,11 +748,11 @@ int __printl(char *line); /* 0 */ /**************************************************************************************************/ int __attn(char *line, int order); - + #define CMSstackLine(s1, i2) (__attn((s1),(i2))) #define CMS_STACKLIFO 0 #define CMS_STACKFIFO 1 - + /**************************************************************************************************/ /* int CMSstackQuery(void) */ /* */ @@ -748,63 +762,63 @@ int __attn(char *line, int order); /* the number of lines currently on the console stack. */ /**************************************************************************************************/ int __stackn(void); - + #define CMSstackQuery() (__stackn()) - + /**************************************************************************************************/ /* Get Program ARGV Vector (vector of arguments) */ /* __ARGV() */ /* char **CMSargv(void) */ /**************************************************************************************************/ char **__ARGV(void); - + #define CMSargv() (__ARGV()) - + /**************************************************************************************************/ /* Get Program ARGC value (number of arguments) */ /* __ARGC() */ /* int CMSargc(void) */ /**************************************************************************************************/ int __ARGC(void); - + #define CMSargc() (__ARGC()) - + /**************************************************************************************************/ /* Get Program PLIST Structure */ /* __PLIST() */ /* PLIST *CMSplist(void) */ /**************************************************************************************************/ PLIST *__PLIST(void); - + #define CMSplist() (__PLIST()) - + /**************************************************************************************************/ /* Get Program EPLIST Structure */ /* __EPLIST() */ /* EPLIST *CMSeplist(void) */ /**************************************************************************************************/ EPLIST *__EPLIST(void); - + #define CMSeplist() (__EPLIST()) - + /**************************************************************************************************/ /* Get Program Call Type */ /* __CALLTP() */ /* int CMScalltype(void) */ /**************************************************************************************************/ int __CALLTP(void); - + #define CMScalltype() (__CALLTP()) - + /**************************************************************************************************/ /* Returns 1 if the calltype 5 procedure/subroutine flag was set (a return value is not required) */ /* __ISPROC() */ /* int CMSisproc(void) */ /**************************************************************************************************/ int __ISPROC(void); - + #define CMSisproc() (__ISPROC()) - + /**************************************************************************************************/ /* Sets the return value (string). This is only valid if the program is called via calltype 5 */ /* __RETVAL(char*) */ @@ -812,9 +826,9 @@ int __ISPROC(void); /* returns 0 on success or 1 if the calltype is not 5, or the return value has already been set */ /**************************************************************************************************/ int __RETVAL(char *value); - + #define CMSreturnvalue(a1) (__RETVAL((a1))) - + /**************************************************************************************************/ /* Sets the return value (data). This is only valid if the program is called via calltype 5 */ /* __RETDATA(void* data, int len) */ @@ -822,9 +836,9 @@ int __RETVAL(char *value); /* returns 0 on success or 1 if the calltype is not 5, or the return value has already been set */ /**************************************************************************************************/ int __RETDATA(void *data, int len); - + #define CMSreturndata(a1, a2) (__RETDATA((a1),(a2))) - + /**************************************************************************************************/ /* Sets the return value (int). This is only valid if the program is called via calltype 5 */ /* __RETINT(int) */ @@ -833,9 +847,9 @@ int __RETDATA(void *data, int len); /* been set */ /**************************************************************************************************/ int __RETINT(int value); - + #define CMSreturnvalint(a1) (__RETINT((a1))) - + /**************************************************************************************************/ /* Sets the debug mode (0=off, else debug on. It currently just turns on/off the memory leak check*/ /* __SDEBUG(int) */ diff --git a/members.parm b/members.parm index 8339b96..b1ee4e7 100644 --- a/members.parm +++ b/members.parm @@ -51,6 +51,7 @@ CMSSETNU @@PUNCHC @@RDCARD * @@RDTAPE +@@RDDRCT @@RDTERM @@RENAME @@STACKN diff --git a/sysprofb.exec b/sysprofb.exec new file mode 100644 index 0000000..c77f04c --- /dev/null +++ b/sysprofb.exec @@ -0,0 +1,24 @@ +&CONTROL OFF NOMSG +* Load bREXX into resident memory and establish it as the DMSREX command. +* This is called from the SYSPROF EXEC. + +SET LDRTBLS 64 + +* Load the native GCC runtime library into memory. +RESLIB LOAD GCCLIB (NAME GCCLIB +&IF &RETCODE NE 0 &TYPE SYSPROF Error loading GCCLIB into memory! +&IF &RETCODE NE 0 &GOTO -DONE + +* Initialize the runtime library +GCCLIB + +* Now load bREXX into memory. +RESLIB LOAD BREXX (NAME DMSREX +&IF &RETCODE NE 0 &TYPE SYSPROF Error loading bREXX into memory! +&IF &RETCODE NE 0 &GOTO -DONE + +* Initialize the bREXX interpretor +DMSREX + +-DONE +&EXIT 0 diff --git a/vtable.macro b/vtable.macro index bc0ec83..15f7d55 100644 --- a/vtable.macro +++ b/vtable.macro @@ -51,6 +51,7 @@ CMSSETNU VTENTRY @@PUNCHC VTENTRY @@RDCARD VTENTRY * @@RDTAPE VTENTRY +@@RDDRCT VTENTRY @@RDTERM VTENTRY @@RENAME VTENTRY @@STACKN VTENTRY