home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #18 / NN_1992_18.iso / spool / comp / sys / hp48 / 4259 < prev    next >
Encoding:
Internet Message Format  |  1992-08-13  |  9.9 KB

  1. From: darrylo@hpnmdla.sr.hp.com (Darryl Okahata)
  2. Date: Thu, 13 Aug 1992 22:48:06 GMT
  3. Subject: Backing up *everything* in the HP 48SX
  4. Message-ID: <15990013@hpnmdla.sr.hp.com>
  5. Organization: Hewlett-Packard, Santa Rosa, CA
  6. Path: sparky!uunet!usc!sdd.hp.com!hpscdc!hplextra!hpl-opus!hpnmdla!darrylo
  7. Newsgroups: comp.sys.hp48
  8. Lines: 425
  9.  
  10. [ Over a year ago, I posted a "beta" version of a backup program.  Well,
  11.   in all that time, I never got around to releasing an official version,
  12.   and it's about time.  As a result, here is another "beta" version,
  13.   which will be submitted to comp.sources.hp48 in a couple of weeks or
  14.   so.  If you have any comments, please send them now!  ]
  15.  
  16.      Here is a program to backup the ENTIRE contents (libs and all) of
  17. an HP 48SX.  It's not perfect, it's huge (about 2900 bytes), and it's
  18. probably inefficient.  However, it should work.
  19.  
  20.      The big advantage of these functions, over previously-released
  21. ones, is that you only need as much memory as the largest library/port
  22. variable to do a backup, as the libraries/port variables are saved in
  23. separate files and not as a concatenated list in main memory.
  24.  
  25.      Note that, while these functions are easy to use, they do not work
  26. like other backup programs.  Please read these instructions carefully
  27. and completely.
  28.  
  29.      The code at the end of this message contains two functions: BACKUP
  30. and RECOVER.  In order to use these functions, you need to backup to a
  31. kermit *SERVER*; you must place the destination machine in kermit SERVER
  32. mode to use these routines.  If you do not have a kermit that supports
  33. SERVER mode, you CANNOT use these routines.  You must also use binary
  34. transfer mode; if you accidentally use ASCII mode, the transfer will
  35. take hours.  Also, the clock display must be turned off, due to the
  36. archive bug; if the display is turned on, the clock will be turned off,
  37. and you will be asked to redo the operation.
  38.  
  39.      You press BACKUP to archive the contents of your HP-48SX.  BACKUP
  40. first sends all port variables/libraries to the kermit server, one by
  41. one (it first checks to see if you have enough memory, though), and then
  42. does an archive of main memory.  Port variables and libraries are stored
  43. in files named like:
  44.  
  45.     Lpnnn
  46.  
  47. Where "p" is the port number (0..2), and "nnn" is a number from 1 to
  48. however many variables are in the port.  After all port variables and
  49. libraries have been backed up (but before the archive of main memory is
  50. done), a file called "lfiles" is created; this file contains a
  51. description of what port variable/library is stored in each of the
  52. "Lpnnn" files, for example:
  53.  
  54. %%HP: T(3)A(D)F(.);
  55. "
  56. L01: Prt 0: Library 768:  SW-A
  57. L02: Prt 0: Library 1644:  SWING by LennartB
  58. L03: Prt 0: Library 968:  [Ant]: v1.0
  59. "
  60.  
  61. (This file is basically a backup object of a string containing the
  62. information.)  Note that, as this transfer is done in ASCII mode (all
  63. other transfers are done in binary mode), each line is terminated by a
  64. CRLF sequence.  Users of MSD*S systems will not notice a thing, but
  65. users of systems like Un*x will notice a ^M at the end of each line.
  66.  
  67.      As each port object is sent to the server, a note of its type
  68. (variable vs library) is made and is saved away (this is used to restore
  69. the backup).  After all port objects have been saved, the flags are
  70. saved in a variable, and an ARCHIVE is done (the ARCHIVE file name is
  71. hard-coded to "BACKUP").  The HP-48SX will also terminate the kermit
  72. server at the end of the backup.
  73.  
  74.      Filename collisions are a problem here.  I strongly suggest
  75. starting the kermit server in an empty directory before starting the
  76. backup.
  77.  
  78.  
  79.      Here's a summary of the backup process:
  80.  
  81. 1. Make sure the HP-48SX is using wire transfer.
  82.  
  83. 2. Place kermit into SERVER mode.  ALSO, MAKE SURE THAT THE SERVER IS IN
  84.    BINARY MODE (for those systems that make a distinction between text
  85.    and binary modes).  If you do not, the backup will appear to work,
  86.    but YOU WILL NOT BE ABLE TO RESTORE.  Note that you have to worry
  87.    about binary/ascii transfer modes at BOTH ends of a kermit
  88.    connection; while this program automatically places the HP 48SX into
  89.    binary mode for transfers, the other end must be manually placed into
  90.    binary mode.
  91.  
  92. 3. Press BACKUP.  Have a cup of coffee while you wait.  If the suppress
  93.    error beep flag (-56) is not set, the calculator will beep when the
  94.    full backup is complete.
  95.  
  96.  
  97.      To restore the contents of your HP-48SX, you do the following:
  98.  
  99. 1. Go to the directory containing the backup files.
  100.  
  101. 2. Using kermit, manually transfer the "backup" archive back to the
  102.    HP-48SX, and RESTORE it.
  103.  
  104. 3. Put kermit into server mode.
  105.  
  106. 4. Go to the HP-48SX directory that contains the BACKUP and RECOVER
  107.    functions.
  108.  
  109. 5. Press RECOVER.  The calculator will transfer the rest of the files
  110.    and place the objects into the correct ports.  That's it.
  111.  
  112.  
  113. ***** Known problems:
  114.  
  115. * This program backs up EVERYTHING in RAM (of course, it doesn't touch
  116.   ROM).  It backs up *ALL* libraries, backup objects, other variables,
  117.   etc..  You cannot tell it to not backup something, other than purging
  118.   the object, or pulling the RAM card out of the calculator.
  119.  
  120. * This program is huge, due partly to the extensive checks that makes
  121.   sure that enough memory is present before doing the BACKUP/RECOVER.
  122.   Perhaps these checks should be deleted (but I like having
  123.   user-friendly programs ...)?
  124.  
  125. * No kermit error checking is done.
  126.  
  127. * Currently, some of the constants used to estimate the minimum amount
  128.   of RAM needed are stored in variables ("M" and "S").  Perhaps these
  129.   should be hard-coded?
  130.  
  131.      Extract the program at the end of this message into a file called
  132. "backup", and upload it to your HP-48SX.
  133.  
  134.      -- Darryl Okahata
  135.     Internet: darrylo@sr.hp.com
  136.  
  137. DISCLAIMER: this message is the author's personal opinion and does not
  138. constitute the support, opinion or policy of Hewlett-Packard or of the
  139. little green men that have been following him all day.
  140.  
  141. ===============================================================================
  142. %%HP: T(3)A(R)F(.);
  143. DIR
  144.   BACKUP
  145.     \<< DEPTH \-> d
  146.       \<<
  147.         IF -40 FS?
  148.         THEN -40 CF
  149. "Clock display disabled
  150. Retry operation"
  151. DOERR
  152.         END
  153.         IFERR PATH
  154. '$BACKUP' DUP VTYPE
  155. \-> p b v
  156.           \<<
  157.             CASE v
  158. 15 ==
  159.               THEN
  160.               END b
  161. " -- Can't find
  162. directory"
  163. + DOERR
  164.             END b
  165. EVAL p 'OPATH' STO
  166.           \>> CLLCD
  167. "CHECKING MEM REQ."
  168. 4 DISP MEMCHK
  169. 'NEEDED' STO RCLF
  170. 'FLAGS' STO { } DUP
  171. DUP 'PV2' STO 'PV1'
  172. STO 'PV0' STO -35
  173. SF OPENIO 0 2
  174.           FOR p p
  175.             IFERR
  176. PVARS
  177.             THEN
  178. DROP { } ""
  179.             END
  180.             IF TYPE
  181. 0 ==
  182.             THEN
  183. OBJ\->
  184.               IF
  185. DUP 0 >
  186.               THEN
  187. 1 SWAP
  188. FOR i CLLCD "Port "
  189. p + C$ 3 : " + OVER
  190. + C$ 1 " + 4 DISP
  191.   IF DUP OBJ\-> DROP
  192. TYPE 0 \=/
  193.   THEN DUP \->STR
  194.   ELSE DUP OBJ\->
  195. DROP
  196.   END p PVNAME STO+
  197. RCL p i FNAME SWAP
  198. OVER STO DUP SEND
  199. CLLCD "Wait ..." 4
  200. DISP
  201.   IF DUP VTYPE 15
  202. ==
  203.   THEN PGDIR
  204.   ELSE PURGE
  205.   END
  206. NEXT
  207.               ELSE
  208. DROP
  209.               END
  210.             ELSE
  211. DROP
  212.             END
  213.           NEXT
  214. CLLCD
  215. "Writing file list ..."
  216. 4 DISP -35 CF NLIST
  217. :IO: LFILES DUP ROT
  218. SWAP STO DUP SEND
  219. PURGE CLLCD
  220. "Archiving main mem ..."
  221. 4 DISP
  222. ":IO: BACKUP" OBJ\->
  223. ARCHIVE FINISH DONE
  224.         THEN
  225.           IF ERRN 1
  226. \=/
  227.           THEN
  228. CLLCD
  229. "ABORTING ..." 4
  230. DISP d CLEANUP
  231.           END ERRN
  232. DOERR
  233.         END
  234.       \>>
  235.     \>>
  236.   RECOVER
  237.     \<< DEPTH \-> d
  238.       \<<
  239.         IF -40 FS?
  240.         THEN -40 CF
  241. "Clock display disabled
  242. Retry operation"
  243. DOERR
  244.         END
  245.         IFERR PATH
  246. '$BACKUP' DUP VTYPE
  247. \-> p b v
  248.           \<<
  249.             CASE v
  250. 15 ==
  251.               THEN
  252.               END b
  253. " -- Can't find
  254. directory"
  255. + DOERR
  256.             END b
  257. EVAL p 'OPATH' STO
  258.           \>>
  259.           IF NEEDED
  260. M + MEM >
  261.           THEN
  262. OPATH EVAL 1 DOERR
  263.           END -35
  264. SF OPENIO 0 2
  265.           FOR p p
  266. PVNAME RCL OBJ\->
  267.             IF DUP
  268. 1 \>=
  269.             THEN 1
  270. SWAP
  271.               FOR i
  272. CLLCD \-> n
  273. \<< p i FNAME DUP
  274. KGET DUP RCL DUP
  275.   IF n TYPE 0 ==
  276.   THEN 0 p \->TAG STO
  277.   ELSE n OBJ\-> STO
  278.   END CLLCD
  279. "Wait ..." 4 DISP
  280.   IF TYPE 15 ==
  281.   THEN PGDIR
  282.   ELSE PURGE
  283.   END
  284. \>>
  285.               NEXT
  286.             ELSE
  287. DROP
  288.             END
  289.           NEXT
  290. FLAGS STOF FINISH
  291. DONE
  292.         THEN
  293.           IF ERRN 1
  294. \=/
  295.           THEN
  296. CLLCD
  297. "ABORTING ..." 4
  298. DISP d CLEANUP
  299.           END ERRN
  300. DOERR
  301.         END
  302.       \>>
  303.     \>>
  304.   $BACKUP
  305.     DIR
  306.       PV0 { 968
  307. 1644 768 }
  308.       PV1 { }
  309.       PV2 { }
  310.       FLAGS {
  311. # 90400000FF0h # 0h
  312. }
  313.       NEEDED
  314. 11139.5
  315.       MEMCHK
  316.         \<< 0 0 \-> sz
  317. n
  318.           \<< 0 2
  319.             FOR p p
  320.               IFERR
  321. PVARS
  322.               THEN
  323. DROP { } ""
  324.               END
  325.               IF
  326. TYPE 0 ==
  327.               THEN
  328. OBJ\->
  329. IF DUP 0 >
  330. THEN DUP 'n' STO+ 1
  331. SWAP
  332.   START RCL BYTES
  333. SWAP DROP
  334.     IF DUP sz >
  335.     THEN 'sz' STO
  336.     ELSE DROP
  337.     END
  338.   NEXT
  339. ELSE DROP
  340. END
  341.               ELSE
  342. DROP
  343.               END
  344.             NEXT
  345.             IF sz
  346. DUP M + n S * + MEM
  347. > n 35 * MEM > OR
  348.             THEN
  349. DROP p EVAL 1 DOERR
  350.             END
  351.           \>>
  352.         \>>
  353.       M 300
  354.       S 10
  355.       PVNAME
  356.         \<< "'PV"
  357. SWAP + "'" + OBJ\->
  358.         \>>
  359.       FNAME
  360.         \<< "'L" ROT
  361. + SWAP + "'" + OBJ\->
  362.         \>>
  363.       CLEANUP
  364.         \<< \-> d
  365.           \<<
  366.             IFERR
  367. '$BACKUP'
  368.               IF
  369. DUP VTYPE 15 ==
  370.               THEN
  371. EVAL VARS OBJ\-> 1
  372. SWAP
  373. FOR i
  374.   IF DUP \->STR 2 2
  375. SUB NUM 76 ==
  376.   THEN PURGE
  377.   ELSE DROP
  378.   END
  379. NEXT
  380.               END
  381. DEPTH d - DROPN
  382. EXIT
  383.             THEN d
  384. CLEANUP
  385.             END
  386.           \>>
  387.         \>>
  388.       DONE
  389.         \<< CLLCD
  390. "DONE" 1 DISP 1
  391. FREEZE EXIT
  392.         \>>
  393.       EXIT
  394.         \<<
  395.           IF -56
  396. FC?
  397.           THEN 1400
  398. .1 BEEP
  399.           END
  400. CLOSEIO FLAGS STOF
  401. -40 CF OPATH
  402. 'OPATH' PURGE EVAL
  403.         \>>
  404.       NLIST
  405.         \<< "
  406. " \-> r
  407.           \<< 0 2
  408.             FOR p p
  409. PVNAME RCL OBJ\->
  410.               IF
  411. DUP 0 >
  412.               THEN
  413. 1 SWAP
  414. FOR i r p i FNAME
  415. \->STR DUP SIZE 1 - 2
  416. SWAP SUB + ": Prt "
  417. + p + ": " +
  418.   IF SWAP DUP TYPE
  419. 0 ==
  420.   THEN p \->TAG RCL
  421.   ELSE SWAP "Var "
  422. + SWAP
  423.   END + "
  424. " + 'r'
  425. STO
  426. NEXT
  427.               ELSE
  428. DROP
  429.               END
  430.             NEXT r
  431.           \>>
  432.         \>>
  433.     END
  434. END
  435.