#!/bin/sh # # Written by Christofer Edvardsen <ce@earthling.net>, Feb 1998 # # This script makes it possible to view and copy files to/from a hp48 # (tested with a HP48G and the emulator x48) # # To use the hp48 external filesystem: # - read the relevant parts of your HP48 manual # - install kermit # - connect the HP48 to your computer or start x48 # - below change the line which reflects the serial device you use # - configure your HP48 (<left shift> - i/o - iopar): # port: wire # baud: 9600 # transfer format: binary (fast transfers) or # ascii (editable on the pc) # - start the server on the HP48: <left shift> - i/o - srvr - serve # or the shortcut <right shift> - <right arrow> # - on MC's commandline enter "cd hp48://" # # Make sure you have kermit installed and that it's using the right serial # device by changing /dev/ttyXX on the next line AWK=@AWK@ KERMIT=${MC_TEST_EXTFS_LIST_CMD:-"kermit -l /dev/ttyS1 -b 9600"} NOW=`date +"%m-%d-%Y %H:%M"` hp48_cmd() { $KERMIT -C "SET EXIT WARNING OFF,REMOTE $1,QUIT" } hp48_cd() { (echo SET EXIT WARNING OFF;echo REMOTE HOST HOME for HP48_DIR in `echo "$1" | tr '/' ' '`;do if [ "x$HP48_DIR" != "x." ];then echo REMOTE HOST "$HP48_DIR"; fi done echo QUIT)| $KERMIT -B >/dev/null } # # Parses the reply to the DIRECTORY command. # # Here's an example reply (taken from [1][2]): # # { HOME } 105617 # STRAY 185.5 Directory 29225 # YEN 30.5 Program 53391 # JYTLIGHT 21848.5 String 62692 # IOPAR 37.5 List 61074 # # The meaning of the fields (according to [3][4]): # # { Current_directory } Free_space # Object_name Object_size_bytes Object_type Object_CRC # ... # # [1] http://newarea48.tripod.com/kermit.html # [2] http://www.hpmuseum.org/forum/thread-4684.html # [3] https://groups.google.com/d/msg/comp.sys.hp48/bYTCu9K3k20/YWQfF--W3EEJ # [4] http://www.columbia.edu/kermit/hp48.html (also has a link to the HP's user manual). # hp48_parser() { HP48_DIRS= read -r INPUT while [ "x$INPUT" != "xEOF" ] do set -- $INPUT obj_name=$1 obj_size=$2 obj_type=$3 obj_size=`echo $obj_size | $AWK '{ print int($0) }'` # Truncates floats to ints; anything else to "0". if [ "$obj_size" != "0" ]; then # Skips the 1st reply line (purportedly there aren't zero-size files b/c, according to resource [4], the size is "including name"). case "$obj_type" in Directory) HP48_DIRS="$HP48_DIRS $obj_name" printf "%crwxr-xr-x 1 %-8d %-8d %8d %s %s\n" 'd' \ 0 0 $obj_size "$NOW" "$HP48_CDIR/$obj_name" ;; *) printf "%crw-r--r-- 1 %-8d %-8d %8d %s %s\n" '-' \ 0 0 $obj_size "$NOW" "$HP48_CDIR/$obj_name" ;; esac fi read -r INPUT done for HP48_DIR in $HP48_DIRS; do HP48_PDIR="$HP48_CDIR" HP48_CDIR="$HP48_CDIR/$HP48_DIR"; hp48_cmd "HOST $HP48_DIR" >/dev/null hp48_list HP48_CDIR="$HP48_PDIR"; hp48_cmd "HOST UPDIR" >/dev/null done } hp48_list() { # It's hard to see why this "EOF" thing is needed. The loop above can be changed to "while read -r obj_name ...". @TODO. { hp48_cmd "DIRECTORY"; echo; echo EOF; } | hp48_parser } # override any locale for dates LC_ALL=C export LC_ALL case "$1" in list) HP48_CDIR= hp48_cmd "HOST HOME" >/dev/null hp48_list exit 0;; copyout) cd "`dirname "$4"`" hp48_cd "`dirname "$3"`" $KERMIT -B -g "`basename "$3"`" -a "$4" >/dev/null exit 0;; copyin) cd "`dirname "$4"`" hp48_cd "`dirname "$3"`" $KERMIT -B -s "$4" -a "`basename "$3"`" >/dev/null exit 0;; esac exit 1