
        .TITLE  RECALL_SAVE_RESTORE

        $SFDEF                                  ;stack frame defs

        .LIBRARY        /SYS$LIBRARY:LIB.MLB/   ;lib for $SFDEF
        .LINK   "SYS$SYSTEM:SYS.STB"            ;for CTL$ symbol
        .LINK   "SYS$SYSTEM:DCLDEF.STB"         ;for DCL symbols

        .PSECT  DATA    PIC,NOEXE,NOSHR,WRT,LONG

FAB:    $FAB    FNM=<RECALL$COMMANDS>,-         ;use logical name
                MRS=1024,ORG=SEQ,RFM=VAR        ;RECALL$COMMANDS to
RAB:    $RAB    FAB=FAB,RBF=PTR,RSZ=4           ;specify the file

        .ALIGN  LONG

PTR:    .LONG   0                               ;holds recall buf ptr
BUF:    .BLKB   1024                            ;holds recal buffer

SAVE:   .ASCID  /SAVE/                          ;SAVE CLI qualifer

        .PSECT  CODE    PIC,EXE,NOWRT,SHR,LONG
        .ENTRY  RECALL,0

        PUSHAB  SAVE                            ;figure out whether /SAVE
        CALLS   #1,G^CLI$PRESENT                ;/RESTORE was present
        BLBS    R0,10$                          ;if /SAVE, continue on...
        JMP     35$                             ;if /RESTORE, branch...
10$:
        MOVAL   G^CTL$AG_CLIDATA,R0             ;start of CLI data area
        MOVL    PPD$L_PRC(R0),R0                ;process area pointer
        MOVL    PRC_L_RECALLPTR(R0),PTR         ;get cur recall buf ptr
        MOVC3   #1024,PRC_G_COMMANDS(R0),BUF    ;get recall buffer

        $CREATE fab=FAB                         ;open up new file
        BLBS    R0,15$                          ;error if none
        JMP     DONE
15$:
        $CONNECT        rab=RAB                 ;setup record stream
        BLBS    R0,20$                          ;error if none
        JMP     DONE
20$:
        $PUT    rab=RAB                         ;write the pointer
        BLBS    R0,25$                          ;error if none
        JMP     DONE
25$:
        MOVAB   BUF,RAB + RAB$L_RBF             ;reload record size
        MOVW    #1024,RAB + RAB$W_RSZ           ;reload record address
        $PUT    rab=RAB                         ;write the recall buf
        BLBS    R0,30$                          ;error if none
        JMP     DONE
30$:


        $CLOSE  fab=FAB                         ;close the file
        RET                                     ;use $CLOSE status




35$:
        $OPEN   fab=FAB                         ;open recall file
        BLBS    R0,40$                          ;error if none
        JMP     DONE
40$:
        $CONNECT        rab=RAB                 ;connect record stream
        BLBS    R0,45$                          ;error if none
        JMP     DONE
45$:
        MOVAB   PTR,RAB + RAB$L_UBF             ;set read buf address
        MOVW    #4,RAB + RAB$W_USZ              ;set read buf size
        $GET    rab=RAB                         ;read ptr record
        BLBS    R0,50$                          ;error if none
        JMP     DONE
50$:
        MOVAB   BUF,RAB + RAB$L_UBF             ;reset read buf address
        MOVW    #1024,RAB + RAB$W_USZ           ;reset read buf size
        $GET    rab=RAB                         ;read recall buf record
        BLBS    R0,55$                          ;error if none
        JMP     DONE
55$:
        $CLOSE  fab=FAB                         ;close up shop
        BLBS    R0,60$                          ;error if none
        JMP     DONE
60$:
        $CMKRNL_S       routin=KERNEL           ;page is URSW
        RET                                     ;use status from routine

        .ENTRY  KERNEL,^M<R2,R3,R4,R5>
        MOVAL   HANDLER,(FP)                    ;setup error handler
        MOVAL   G^CTL$AG_CLIDATA,R0             ;CLI data area ptr
        MOVL    PPD$L_PRC(R0),R0                ;process area ptr
        MOVL    PTR,PRC_L_RECALLPTR(R0)         ;reload recall buf ptr
        MOVC3   #1024,BUF,PRC_G_COMMANDS(R0)    ;reload recall buffer
        MOVL    #SS$_NORMAL,R0                  ;set normal status
DONE:
        RET

        .ENTRY  HANDLER,0                       ;get here on error
        MOVL    4(AP),R0                        ;get signal array ptr
        MOVL    4(R0),R0                        ;get condition value
        MOVL    SF$L_SAVE_FP(FP),FP             ;fake out dispatcher
        RET                                     ;return from kernel err !

        .END    RECALL



!**********START OF MODIFICATION #1 TO RECALL CLD ************************
!
define syntax RECALL_SAVE_RESTORE
   image "RECALL_SAVE_RESTORE"


!
!**********END OF MODIFICATION #1 TO RECALL CLD **************************
!
!        ORIGINAL RECALL CLD
!
!************************************RECALL*******************************
define syntax RECALL_ALL_COMMANDS
   cliroutine RECALL
   noparameters
define verb RECALL
   cliroutine RECALL
   prefix CLI$K_RCAL_
   parameter P1
      value (type=$rest_of_line)
   qualifier ALL , syntax=RECALL_ALL_COMMANDS
   qualifier ERASE , syntax=RECALL_ALL_COMMANDS
!
!
!**********START OF MODIFICATION #2 TO RECALL CLD ************************
!
   qualifier SAVE , syntax=RECALL_SAVE_RESTORE
   qualifier RESTORE , syntax=RECALL_SAVE_RESTORE
!

        disallow  (SAVE and RESTORE) or (SAVE and ALL) or (SAVE and ERASE)
              or  (RESTORE and ALL)  or (RESTORE and ERASE)
!
!**********END OF MODIFICATION #2 TO RECALL CLD **************************



$
$ MACRO RECALL_SAVE_RESTORE
$
$ LINK RECALL_SAVE_RESTORE
$
$ COPY  RECALL_SAVE_RESTORE.EXE  SYS$COMMON:[SYSEXE]
$
$ SET COMMAND RECALL.CLD                        !loads command definition
$
$ RECALL/SAVE                                   !saves recall buffer
$
$ DIRECTORY RECALL$COMMANDS

Directory DUA0:[WORK]

RECALL$COMMANDS.;1

Total of 1 file.
$
$ SPAWN
%DCL-S-SPAWNED, process SYSTEM_1 spawned
%DCL-S-ATTACHED, terminal now attached to process SYSTEM_1
$


$ RECALL/ALL                                    !recall buffer is empty
$
$ SET COMMAND RECALL                            !load command definition
$
$ RECALL/RESTORE                                !restore recall buffer
$
$ RECALL/ALL
 1 RECALL/SAVE
 2 SET COMMAND RECALL.CLD
 3 COPY  RECALL_SAVE_RESTORE.EXE  SYS$COMMON:[SYSEXE]
 4 LINK RECALL_SAVE_RESTORE
 5 MACRO RECALL_SAVE_RESTORE
 6 SET DEF DUA0:[WORK]
$




