HISTORICAL BACKGROUND TO THIS FILE: It seemed to me that it would be a good idea to be able to store information without losing it in a DESTROY ALL or having it in a text file. An adaptation of ENDUPLEX without the execution of statements seemed to be the way. There are potentially many uses of the STORE command. Examples are: (1) STORE LIST$(3,":PORT(0)"),4 followed by MODIFY XXXX,RECALL$(4) should get around the HORRIBLE bug of LIST$, without disturbing the alternate character set. (2) Include as part of your STARTUP a RECALL$(8), say, to give yourself a message at turn-on. (3) Add a STORE command to a subroutine to trace a string variable or STR$( a numeric variable) without messing around with the parameter list, etc. LEX 'BUFSTO10' * CREATE 10 BUFFERS FOR INFO STORAGE ID #EC MSG 0 POLL polhnd * POLL HANDLER TO PRESERVE BUFFERS IF IN USE ENTRY recal CHAR #F * A FUNCTION ENTRY store CHAR #D * A STATEMENT GENERALLY USABLE ( KBD,PRGM ETC.) KEY 'RECALL$' * SYNTAX: RECALL$[(n)] WITH 0<=n<=9, DEFAULT 0 TOKEN 14 KEY 'STORE' * SYNTAX: STORE string,n WITH n AS ABOVE TOKEN 15 RNDAHX EQU #136CB * POP NUMBER, ROUND CONVERT TO HEX IN A(A) STRGCK EQU #036BA * STRING CHECK FOR PARSE ROUTINE FIXDC EQU #05493 * FIX DECOMPILE COMCK+ EQU #032AE * COMMA CHECK FOR PARSE FIXP EQU #02A6E * FIX PARSE SYNTXe EQU #02E2B * SYNTAX ERROR EXIT ARGERR EQU #0BF19 * INVALID ARGUMENT ERROR EXIT MEMERR EQU #0944D * INSUFFICIENT MEMORY EXIT MOVEU3 EQU #1B177 * SHIFT STUFF IN MEMORY I/OALL EQU #1197D * ALLOCATE NEW BUFFER OR ADJUST EXISTING BUFFER I/ODAL EQU #11A41 * DE-ALLOCATE BUFFER ( WHEN NOT NEEDED!) STROVF EQU #1411A * STRING OVERFLOW ERROR EXIT REVPOP EQU #0BD31 * POP 1 STRING AND REVERSE ON STACK D=AVMS EQU #1A460 * STORE AVAIL.MEM.START IN D EXPEXC EQU #0F186 * EVALUATE EXPRESSION: PUTS RESULT ON STACK XXHEAD EQU #1A44E * POP 1 STRING AND STRIP OFF HEADER I/ORES EQU #118FF * SET HIGH BIT ON BUFFER ID TO SAVE IT I/OFND EQU #118BA * BUFFER FIND ROUTINE STKCHR EQU #18504 * STACK CHARACTERS - BUILDS UP STRING ON STACK ADHEAD EQU #181B7 * ADD HEADER TO STRING NXTSTM EQU #08A48 * TERMINATE STATEMENTS bSTORE EQU #F39 * 1st BUFFER'S ID. ADD n TO THIS pCONFG EQU #FB * CONFIG POLL:TIME TO SAVE OR DELETE BUFFERS ENDTXT polhnd LC(2) pCONFG * LOAD POLL ID ?B=C B * IS THIS THE ONE? GOYES savebuf * YES! SAVE THE BUFFERS GONC rtncc * NO RETURN WITH CARRY CLEAR savebuf P= 0 * SET TO LOAD 1st BUFFER'S ID LC(3) bSTORE * LOAD IT P= 9 * NOW USE P AS A LOOP COUNTER SETHEX * HEX ARITHMETIC loop GOSBVL I/ORES * SET HIGH BIT OF ID C=C+1 A * INCREMENT ID FOR NEXT BUFFER P=P-1 * DECREMENT POINTER/COUNTER GONC loop * LOOP IF P>=0 (CARRY CLEAR) rtncc A=0 A * ON EXIT, CARRY IS SET- MUST CLEAR A=A+1 A * BY INCREMENTING A BEFORE RTNSXM * STANDARD EXIT FROM POLL HANDLER strgckp GOSBVL STRGCK * START OF PARSE ROUTINE ( COURTESY OF JPC) GOSBVL COMCK+ GOC fixp GOVLNG SYNTXe fixp GOVLNG FIXP fixd GOVLNG FIXDC REL(5) fixd REL(5) strgckp store GOSBVL EXPEXC * EVALUATES THE STRING, PUTS HEADER ON STACK D0=D0+ 2 * SHIFT PAST tCOMMA TOKEN GOSBVL EXPEXC * EVALUATES NUMERIC PARAMETER, PUTS IT ON STACK GOSUB pop * POP THE NUMERIC OFF THE STACK LC(3) bSTORE * LOAD 1st BUFFER'S ID C=C+A A * ADD n TO GET DESIRED BUFFER'S ID R2=C * SAVE ID IN R2 C=0 W GOSBVL XXHEAD LCHEX #0D * STRING TERMINATOR P= 1 ST=0 0 CD1EX C=-C A C+P+1 C=-C A ?CC A * HERE WE CHECK FOR A NULL STRING GOYES char10 C=R2 * NULL FOUND: PUT ID INTO C GOSBVL I/ODAL * DE-ALLOCATE THIS BUFFER GOTO nxtstm * EXIT charer GOVLNG MEMERR char10 B=A A * NOT A NULL STRING C=0 A LC(3) #FFF * LIMIT ON BUFFER'S CAPACITY ?A<=C A GOYES char40 * OK GOVLNG STROVF * TOO MUCH! char40 R1=A C=R2 * RELOAD ID INTO C GOSBVL I/OALL * EXPAND BUFFER IF PRESENT, CREATE IT OTHERWISE GONC charer A=R0 D0=A C=R1 GOSBVL MOVEU3 * PLACES THE STRING IN THE BUFFER nxtstm GOVLNG NXTSTM * EXIT pop GOSBVL RNDAHX GONC argerr * ERROR ON NEGATIVE ARGUMENT C=0 W LCHEX 9 ?A>C X GOYES argerr * ERROR IF ARG>9 D1=D1+ 16 * SHIFT PAST n, TO READ STRING FOR STORE, AND RTN * TO MAKE ROOM FOR STRING HEADER IN RECALL$(n) argerr GOVLNG ARGERR NIBHEX 801 * A FUNCTION WITH ONE OPTIONAL NUMERIC PARAMETER recal A=0 W * CLEAR A ?C=0 S * IS THERE NO PARAMETER? GOYES recal0 * THEN SKIP POP ROUTINE GOSUB pop * OTHERWISE POP n TO ADD TO F39 recal0 C=0 S * CLEAR SIGN NIBBLE OF C LC(3) bSTORE * LOAD #F39 C=C+A A * ADD POPPED n AD1EX * HERE BEGINS THE RECALL FROM THE CHOSEN BUFFER R1=A * AGAIN THIS CODE IS ESSENTIALLY THAT OF ENDUPLEX GOSBVL I/OFND * AFTER pop, ID IS IN C AS REQUIRED BY I/OFND CD1EX CD0EX B=C A GOSBVL D=AVMS A=R1 D1=A GONC LBL2 LBL1 A=DAT0 B LCHEX #0D ?A=C B * IS THIS THE END OF THE STRING? GOYES LBL2 C=A B GOSBVL STKCHR * PILE ANOTHER BYTE ON D0=D0+ 2 GONC LBL1 * B.E.T. LBL2 C=B A D0=C GOVLNG ADHEAD * EXITS THROUGH EXPR END Well, there it is. After months of frustration, with the constant help and suggestions from David Cameron, BUFSTORE works! The bug that held me up for so long was in what to do at the entry to the execution code of the statement. This was David's latest idea - to call EXPEXC, increment D0 by 2 nibbles to skip the comma token, then call EXPEXC again. Information can now be STOREd in buffers 'numbered' 0 to 9 without being lost in a DESTROY ALL. If numbers need to be STOREd, they have to be converted to strings using STR$. They can later be recovered using VAL. I wonder what the next challenge will be? Regards, Jack Elhay.