%%HP: T(3)A(D)F(.);
@ 
@ Application Maintenance Tool  (AMT) for  CKPAL  - Stanley H.H.Lui 12/1/01
@ Updated 1/17/05 for HP48gII/49g+
@
@ AMT provides the following functions:
@ 1. Run an application
@ 2. Change application variable storage mode (In Port 2 memory or in Home directory)
@ 3. Remove an application from the HP memory
@
@ AMT data:  toolist : { {appdir}  {appvars}  {appdata}  'main_program_name'  'logo_name'  << task>> hpflag rflag sflag}
@
@  1. {appdir} : application directory
@  2. {appvar} : application variable list
@  3. {appdata} : application data list
@  4. 'main_program_name'
@  5. 'logo_name'
@  6. schedule_task_list
@      { time  << daily_scheduled_task >> }
@         time: time to use in FINDALARM
@         << daily_scheduled_task>>:  daily scheduled task for application
@      schedule_task_list set to zero if no daily scheduled task
@  7. hpflag :  0 - HP48gII  1 - HP49g+
@  8: rflag :  remove flag :  0 - do not remove variables from HOME after application execution
@                                       1 - remove variables from HOME after each application execution
@  9: sflag : flashflag : 0 - variables are not in flash
@                                1 - variables are in flash
@
@  input :  toolist
@  output:  toolist - updated
@
\<<
  RCLF {HOME URPLUI} {}  0 0  0 0 0 0 
  GROB 13 5 54C156407FD156405440
  GROB 13 5 54C15C407FD15C405440
  GROB 17 10 00F100001100C1D700155400C15F10545110C1711000C110000110000F10
GROB 73 7 FFFFFFFFFFFFFFFFFF10FFFFFFFFFFFFFFFFFF10FFFFFFFFFFFFFFFFFF10FFFFFFFFFFFFFFFFFF10FFFFFFFFFFFFFFFFFF10FFFFFFFFFFFFFFFFFF10FFFFFFFFFFFFFFFFFF10

GROB 10 10 F30012001200F300120012001A2012101A20F300

0 0

\-> tlist  fs udir adir ni k saveVARS  GETVARS removev g  ftohg  htofg  fg bg rg sg uu \<<
  
@ check to see if we have an additional parameter string "RUN", which means go directly to run the application 
  3 CF
  IF DEPTH THEN
      DUP IF "RUN" SAME THEN 3 SF DROP END
  END

  tlist 1 GET 'adir' STO

  \<< \-> u \<<
     IF u u SIZE DUP SUB "." == THEN u 1 u SIZE 1 - SUB ELSE u END
  \>> \>> 'uu' STO

@  get variables from flash to HOME
@  only do get if not already done and variables are available in Flash
@  return 0 if failed, 1 if suceeded
  \<< 0  IF 3 FC? THEN {#1d, #18d}  {#16d, #18d} ELSE {#20d, #2d} {#35d, #2d} END \-> tots  p1 p2 \<<
     adir EVAL
     IF tlist 9 GET    tlist 2 GET 1 GET VTYPE DUP -1 ==  SWAP 15 == OR     AND THEN
       PICT p1 # 22d # 5d BLANK REPL
       PICT p1 ftohg REPL
       1 tlist 2 GET SIZE FOR i
          PICT p2 # 7d # 5d BLANK REPL
          PICT p2 i \->STR uu EVAL 1 \->GROB REPL
          ":2:" tlist 2 GET i GET \->STR DUP 2 SWAP SIZE 1 - SUB + OBJ\-> RCL BYTES SWAP DROP 'tots' STO+
       NEXT
       IF tots MEM > THEN
         1 "NOT ENOUGH RAM AVAILABLE!" udir EVAL ALRTMSG adir EVAL 0
       ELSE
         1 tlist 2 GET SIZE FOR i
            PICT p2 # 7d # 5d BLANK REPL
            PICT p2 i \->STR uu EVAL 1 \->GROB REPL
            ":2:" tlist 2 GET i GET \->STR DUP 2 SWAP SIZE 1 - SUB + OBJ\-> RCL tlist 2 GET i GET STO
         NEXT  1
       END
     ELSE
       IF tlist 2 GET 1 GET VTYPE -1 \=/ THEN 1 ELSE 0 END
     END 
     PICT p1 # 22d # 5d BLANK REPL
  \>> \>>  'GETVARS' STO

@  remove variables from HOME
  \<< 
       adir EVAL
       PICT {# 104d,# 53d} {# 129d,# 61d} SUB 'sg' STO
       PICT {# 104d,# 53d} GROB 26 9 FFFFFF30100000205110002051350020DD720020513500205110002010000020FFFFFF30
       REPL
       1 tlist 2 GET SIZE FOR i
          PICT {# 121d,# 55d} # 7d # 5d BLANK REPL
          PICT {# 121d,# 55d} i \->STR uu EVAL 1 \->GROB REPL
          tlist 2 GET i GET PURGE
       NEXT
       PICT {# 104d,# 53d} sg REPL 
  \>>  'removev' STO

@  save variables to flash from HOME and remove variables from HOME
@  only do save to flash if  variables are available in HOME
    \<< 
            adir EVAL
            PICT {# 1d,# 29d} # 22d # 5d BLANK REPL
            PICT {# 1d,# 29d} htofg REPL
            1 tlist 2 GET SIZE FOR i
               IF tlist 2 GET i GET VTYPE -1 \=/ THEN
                 PICT {# 16d,# 29d} # 7d # 5d BLANK REPL
                 PICT {# 16d,# 29d} i \->STR uu EVAL 1 \->GROB REPL
                 IF tlist 9 GET NOT THEN
                   tlist 2 GET i GET RCL ":2:" tlist 2 GET i GET \->STR DUP 2 SWAP SIZE 1 - SUB + OBJ\-> STO
                 ELSE
                   tlist 2 GET i GET RCL ":2:" tlist 2 GET i GET \->STR DUP 2 SWAP SIZE 1 - SUB + OBJ\-> DUP PURGE STO
                   IF tlist 8 GET THEN
                     tlist 2 GET i GET PURGE
                   END
                 END
               END
            NEXT
            tlist 9 1 PUT 'tlist' STO
            PICT {# 2d,# 50d} fg REPL
            PICT {# 1d,# 29d} # 22d # 5d BLANK REPL
    \>>  'saveVARS' STO
  
IF 3 FC? THEN             
@ introductory screen
   -3 SF -105 CF -120 SF 
  ERASE { # 0h # 0h } PVIEW
  1 CF
  adir EVAL
  IF tlist 5 GET VTYPE -1 \=/ THEN
      tlist 5 GET EVAL
  ELSE
    IF tlist 7 GET THEN
      IF ":2:" tlist 5 GET \->STR DUP 2 SWAP SIZE 1 - SUB + OBJ\-> DUP VTYPE -1 \=/ THEN
          EVAL 
      ELSE
          DROP 0 
      END
    ELSE
      0
    END
  END 'g' STO
  IF g 0 SAME NOT THEN
    PICT g SIZE  #3Dh SWAP -  SWAP  B\->R 131 SWAP - 2 / R\->B SWAP 2 \->LIST  g REPL
  END
  1 WAIT
  PICT {# 0d,# 0d} # 131d # 64d BLANK REPL

  1 0 30 5 100 tlist 4 GET \->STR " TOOLS" + udir EVAL DLINE adir EVAL DROP2
  PICT {# 32d,# 18d} "RUN APPLICATION" 1 \->GROB REPL
  PICT {# 31d,# 17d} bg GXOR
  {# 30d,# 16d} {# 104d,# 24d} BOX
  PICT {# 32d,# 29d} "SAVE APPL TO FLASH" 1 \->GROB REPL
  {# 30d,# 27d} {# 104d,# 35d} BOX
  PICT {# 32d,# 40d} "REMOVE APPLICATION" 1 \->GROB REPL
  {# 30d,# 38d} {# 104d,# 46d} BOX
  PICT {# 32d,# 51d} "SET HP49G+ OPTIONS" 1 \->GROB REPL
  {# 30d,# 49d} {# 104d,# 57d} BOX
  {# 25d,# 9d} {# 25d,# 53d} LINE
  {# 26d,# 9d} {# 29d,# 9d} LINE
  {# 26d,# 20d} {# 29d,# 20d} LINE
  {# 26d,# 31d} {# 29d,# 31d} LINE
  {# 26d,# 42d} {# 29d,# 42d} LINE
  {# 26d,# 53d} {# 29d,# 53d} LINE
   IF tlist 7 GET THEN
     IF tlist 9 GET THEN
       PICT {# 2d,# 50d} fg REPL
     END
     IF tlist 8 GET THEN
       PICT {# 2d,# 38d} rg REPL
     END
   END
   PICT {# 121d,# 52d} udir EVAL CMDGPIC  REPL
END

adir EVAL

  1 CF  2 CF 
  WHILE 1 FC? REPEAT


@ZKEYLABELS 17 29675 -1 -16777216 5 24 "Exit" 41 "Help" 45 "Select Action" 46 "Up" 49 "Down" 

    IF 3 FC? THEN
      DO UNTIL KEY END 'k' STO
    ELSE
      105 'k' STO 0 'ni' STO
    END
    CASE
        k 95 == THEN
@       command guide
          {" " " " " " "X" "+"}
          {"UP: GO UP"
           "DOWN: GO DOWN"
           "ENTER: SELECT ACTION"
           "EXIT TOOLS"
           "COMMAND HELP"}
           udir EVAL CMDHELP  adir EVAL
        END
        k 63 == THEN
           1 SF
        END
        k 35 == THEN
          IF ni 1 +  3 \<= THEN
             1 'ni' STO+
             PICT #31d  ni 1 - 11 * 17 +  R\->B 2 \->LIST bg GXOR
             PICT #31d  ni 11 * 17 + R\->B 2 \->LIST bg GXOR
          ELSE
             0 'ni' STO
             PICT {# 31d,# 50d} bg GXOR
             PICT {# 31d,# 17d} bg GXOR
          END
        END
        k 25 == THEN
          IF ni 1 - 0  \>=  THEN
             'ni' 1 STO-
             PICT #31d  ni 1 + 11 * 17 + R\->B 2 \->LIST bg GXOR
             PICT #31d  ni 11 * 17 + R\->B 2 \->LIST bg GXOR
          ELSE
             3 'ni' STO
             PICT {# 31d,# 50d} bg GXOR
             PICT {# 31d,# 17d} bg GXOR
          END
        END
        k 105 == THEN
          70 .1 BEEP
          CASE
              ni 0 == THEN
                 IF tlist 7 GET THEN
                    IF tlist 2 GET 1 GET VTYPE DUP -1 ==  SWAP 15 == OR THEN
                        GETVARS EVAL
                    ELSE
                         1
                    END
                 ELSE
                     1
                 END
                 IF 1 == THEN
                     IF tlist 4 GET VTYPE -1 \=/ THEN

@ZKEYLABELSOFF 

                         tlist 4 GET EVAL

@ZKEYLABELS 17 515711 -1 -16777216 5 24 "Exit" 41 "Help" 45 "Select Action" 46 "Up" 49 "Down" 

                         IF tlist 7 GET THEN
                            IF tlist 8 GET tlist 9 GET AND THEN
                                removev EVAL
                            END
                         END
                     ELSE
                         1 "APPLICATION NOT FOUND!" udir EVAL ALRTMSG adir EVAL
                     END
                     1 SF
                 END
              END
              ni 1 == THEN
                 IF tlist 7 GET THEN
                   {"YES" "NO"} "SAVE APPL TO FLASH?" 1 0 1 udir EVAL CHOOSES adir EVAL DROP
                   IF 1 == THEN
                     saveVARS EVAL
                   END
                 END
              END
              ni 2 == THEN
                  {"YES" "NO"} "REMOVE APPLICATION?" 2 0 1 udir EVAL CHOOSES adir EVAL DROP
                  IF 1 == THEN
                      1 SF 2 SF
                      removev EVAL
                      IF tlist 3 GET {} \=/ THEN
                         {"YES" "NO"} "REMOVE APPL DATA?" 2 0 1 udir EVAL CHOOSES adir EVAL DROP
                         IF 1 == THEN
                            tlist 3 GET PURGE
                         END
                      END
                      IF tlist 7 GET  tlist 9 GET AND THEN
                         PICT {# 104d,# 53d} {# 129d,# 61d} SUB 'sg' STO
                         PICT {# 104d,# 53d}  GROB 26 9 FFFFFF3010000020D110002050350020DD720020503500205010002010000020FFFFFF30   REPL
                         1 tlist 2 GET SIZE FOR i
                            PICT {# 121d,# 55d} # 7d # 5d BLANK REPL
                            PICT {# 121d,# 55d} i \->STR uu EVAL 1 \->GROB REPL
                            IFERR 
                              ":2:" tlist 2 GET i GET \->STR DUP 2 SWAP SIZE 1 - SUB + OBJ\-> PURGE
                            THEN
                            END
                         NEXT
                         PICT {# 104d,# 53d} sg REPL adir EVAL
                      END
                      IF tlist 6 GET 0 SAME NOT THEN
                         DATE 1 DATE+ tlist 6 GET 1 GET 2 \->LIST FINDALARM 'ni' STO
                         IF ni THEN
                            IF ni RCLALARM DUP SIZE 4 == THEN
                                IF  3 GET  tlist 6 GET 2 GET SAME THEN
                                   ni DELALARM
                                END
                            ELSE
                                DROP
                            END
                         END
                      END
                      'TOOL'  PURGE
                      'TOOLIST'  PURGE
                      IF VARS {} == THEN
                        UPDIR tlist 1 GET DUP SIZE GET PURGE
                      END
                  END
              END
              ni 3 == tlist 7 GET AND THEN
                  {"REMOVE VARS FROM HOME AFTER EXECUTION"} "HP49G+ OPTION" 0 tlist 8 GET 1 \->LIST 2 udir
                  EVAL CHOOSES adir EVAL DROP 1 GET tlist 8 ROT PUT 'tlist' STO
                  IF tlist 8 GET THEN
                     PICT {# 2d,# 38d} rg REPL
                  ELSE
                     PICT {# 2d,# 38d} # 10d # 10d BLANK REPL
                  END
              END
          END
        END
    END
  END

  IF 2 FC? THEN tlist adir EVAL END
  fs STOF

@ZKEYLABELSOFF 

\>>
\>>
