eldorado@en.ecn.purdue.edu (David D Jansen) (03/30/91)
The following is a DEC VT52 terminal emulator for the HP48SX. It emulates
every vt52 command except for the Keypad mode (kind of redundant on the HP)
and the special graphics characters (perhaps in a latter version). The one
drawback, like other communication programs for the HP48, is speed. Because
it is slow after the recieve buffer (which is 256 characters long) fills up,
it looses the rest. Buffering the recieve buffer will not work since at
9600 baud the buffer fills up in about 3 hundredths of a second. Nevertheless
Since fewer than 256 characters can fit on the screen at one time, it is
functional. If enough interest shows, an assembly version could be written.
Another possibility is to set the IOPAR to enable XON/XOFF. So far I have
not been able to get this to work.
Directions
1. execute the program
2. if you wish to do a file transfer, quit and do the usual Kermit transfer,
then just run the program again to continue.
Keyboard
The keyboard of the HP48 was redefined as the following.
1 2 3 4 5 6
A B C D E F
1 a b c d e f
^A ^B ^C ^D ^E ^F
G H I J K L
2 g h i j k l
^G ^H ^I ^J ^K ^L
M N O P Q R
3 m n o p q r
^M ^N ^O ^P ^Q ^R
S T U V W X
4 s t u v w x
^S ^T ^U ^V ^W ^X
ENTER Y Z
5 ENTER y z DELETE BACKSPACE
ENTER ^Y ^Z
{ < ( [
6 ESCAPE 7 8 9 /
\ } > ) ]
CAPS LOCK $ % ^ &
7 SHIFT 4 5 6 *
QUIT CHR(28) CHR(29) CHR(30) CHR(31)
, ~ ` '
8 CONTROL 1 2 3 -
BREAK ; @ # "
= ? _ |
9 ATTENTION 0 . SPACE +
CHR(0) ! TAB :
The labels above the numbered row is the left shift key. Labels on the
same line as the numbers are the default values and labels under the
numbered lines are the right shift values.
The numbers are the row and column of the keyboard. Quitting by pressing ON
leaves the port open and is not necessary even to stay online.
All 128 ASCII characters are accessible from the keyboard. I suggest getting
a template and writing the above table on it for easiest use.
Send suggestions, comments, complains to:
_______________________________________________________________________________
Dave Jansen | INTERNET: eldorado@en.ecn.purdue.edu
Electrical Engineering | BITNET: eldorado%ea.ecn.purdue.edu@purccvm
Purdue University | UUCP: {purdue, pur-ee}!en.ecn.purdue.edu!eldorado
Cut here 8<--------------------------------------------------------------------
%%HP: T(3)A(D)F(.);
\<< # 0d # 0d "" ""
"" "" \-> col row cur
spc char keymap
\<<
\<< 51 13 146 13
241 13 54 127 55 8
284 9 275 34 282 0
201 1 202 2 203 3
204 4 205 5 206 6
211 7 212 8 213 9
214 10 215 11 216
12 221 13 222 14
223 15 224 16 225
17 226 18 231 19
232 20 233 21 234
22 235 23 236 24
242 25 243 26 61 27
262 28 263 29 264
30 265 31
"..........abcdef....ghijkl....mnopqr....stuvwx.....yz........789/......456*......123-......0. +..........ABCDEF....GHIJKL....MNOPQR....STUVWX.....YZ........{<([......$%^&......,~`'......=?_|..........ABCDEF....GHIJKL....MNOPQR....STUVWX.....YZ.......\\}>)]................;@#........!.:"
1 39
START ROT ROT
CHR REPL
NEXT 'keymap'
STO
\>>
\<< PICT col row
2 \->LIST DUP2 col
# 5d + row # 7d + 2
\->LIST SUB 'char'
STO cur REPL
\>>
\<< PICT col row
2 \->LIST char REPL
IF row # 56d
<
THEN # 8d
'row' STO+
ELSE PICT DUP
{ # 0d # 0d } OVER
{ # 0d # 8d } {
# 131d # 63d } SUB
REPL { # 0d # 56d }
# 131d # 8d BLANK
REPL
END PICT col
row 2 \->LIST DUP2
col # 5d + row # 7d
+ 2 \->LIST SUB
'char' STO cur REPL
\>> \-> addcntrl
get nl
\<<
\<< 2 \->GROB
PICT col row 2
\->LIST ROT REPL
'col' STO+
IF col
# 131d >
THEN # 0d
'col' STO get EVAL
nl EVAL
ELSE get
EVAL
END
\>>
\<< DROP
WHILE
BUFLEN DROP NOT
REPEAT
END 1 SRECV
DROP NUM
CASE DUP 65
==
THEN PICT
col row 2 \->LIST
char REPL
IF row
# 7d >
THEN
'row' # 8d STO-
END get
EVAL
END DUP
66 ==
THEN PICT
col row 2 \->LIST
char REPL
IF row
# 56d <
THEN
# 8d 'row' STO+
END get
EVAL
END DUP
67 ==
THEN PICT
col row 2 \->LIST
char REPL
IF col
# 125d <
THEN
# 6d 'col' STO+
END get
EVAL
END DUP
68 ==
THEN PICT
col row 2 \->LIST
char REPL
IF col
# 5d >
THEN
'col' # 6d STO-
END get
EVAL
END DUP
72 ==
THEN PICT
col row 2 \->LIST
char REPL # 0d
'col' STO # 0d
'row' STO get EVAL
END DUP
73 ==
THEN PICT
col row 2 \->LIST
char REPL
IF row
# 7d >
THEN
'row' # 8d STO-
ELSE
PICT DUP { # 0d
# 8d } OVER { # 0d
# 0d } { # 131d
# 55d } SUB REPL {
# 0d # 0d } # 131d
# 8d BLANK REPL
END get
EVAL
END DUP
74 ==
THEN PICT
# 0d row 2 \->LIST
# 131d # 64d row -
BLANK REPL get EVAL
END DUP
75 ==
THEN PICT
col row 2 \->LIST
# 131d col - # 8d
BLANK REPL get EVAL
END DUP
89 ==
THEN PICT
col row 2 \->LIST
char REPL
WHILE
BUFLEN DROP NOT
REPEAT
END 1
SRECV DROP NUM 32 -
# 8d * 'row' STO
WHILE
BUFLEN DROP NOT
REPEAT
END 1
SRECV DROP NUM 32 -
# 6d * 'col' STO
get EVAL
END DUP
90 ==
THEN 27
CHR "/Z" + XMIT
DROP
END
END DROP
\>>
\<<
CASE DUP
127 ==
THEN PICT
col row 2 \->LIST spc
REPL
IF col
# 5d >
THEN
'col' # 6d STO-
ELSE
# 126d 'col' STO
'row' # 8d STO-
END
PICT col row 2
\->LIST cur REPL
END DUP
13 ==
THEN PICT
col row 2 \->LIST
char REPL # 0d
'col' STO get EVAL
END DUP
DUP 10 \>= SWAP 12 \<=
AND
THEN nl
EVAL
END DUP 8
==
THEN PICT
col row 2 \->LIST
char REPL
IF col
# 5d >
THEN
'col' # 6d STO-
ELSE
# 126d 'col' STO
IF
row # 7d >
THEN
'row' # 8d STO-
ELSE
PICT DUP { # 0d
# 8d } OVER { # 0d
# 0d } { # 131d
# 55d } SUB REPL {
# 0d # 0d } # 131d
# 8d BLANK REPL
END
END get
EVAL
END DUP 7
==
THEN 440
.1 BEEP
END DUP 9
==
THEN PICT
col row 2 \->LIST
char REPL col # 12d
/ # 1d + # 12d *
IF DUP
# 131d >
THEN
DROP # 0d 'col' STO
get EVAL nl EVAL
ELSE
'col' STO get EVAL
END
END
END DROP
\>> 0 { } \->
write vt52 cntrl
room flags
\<< RCLF
'flags' STO
addcntrl EVAL 127
CHR 2 \->GROB 'cur'
STO 32 CHR 2 \->GROB
DUP 'spc' STO
'char' STO -40 CF
OPENIO ERASE PICT {
# 0d # 0d } DUP
PVIEW # 0d 'col'
STO # 0d 'row' STO
cur REPL 7 CF 8 CF
9 CF 10 SF
WHILE 10
FS?
REPEAT
IF BUFLEN
DROP
THEN
# 131d col - # 6d /
B\->R 'room' STO ""
DO 1
SRECV DROP DUP NUM
IF
DUP 31 > SWAP 127 <
AND
THEN
+
ELSE
9 SF SWAP
END
UNTIL
DUP SIZE room > 9
FS? OR BUFLEN DROP
NOT OR
END
IF DUP
SIZE DUP
THEN
# 6d * SWAP write
EVAL
ELSE
DROP2
END
IF 9
FS?C
THEN
IF
NUM DUP 27 ==
THEN
vt52 EVAL
ELSE
cntrl EVAL
END
END
END
IF KEY
THEN
IF DUP
DUP DUP2 10 > SWAP
54 < AND SWAP 51 \=/
AND 6 FS? AND 8 FC?
AND 7 FS? OR SWAP
71 \=/ AND
THEN 95
+ 7 CF
ELSE
IF
DUP DUP 71 \=/ SWAP
81 \=/ AND 8 FS? AND
THEN
190 + 8 CF
END
END
IF DUP
71 ==
THEN
IF 8
FS?C
THEN
10 CF
ELSE
IF 7 FS?C
THEN
IF 6 DUP FS?
THEN CF
ELSE SF
END
ELSE 7 SF
END
END
DROP
ELSE
IF
DUP 81 ==
THEN
IF 8 FS?C
THEN SBRK
ELSE 8 SF
END DROP
ELSE
keymap SWAP DUP SUB
XMIT DROP
END
END
END
END CLOSEIO
TEXT flags STOF
\>>
\>>
\>>
\>>
--
P.O.W. * M.I.A. -- You are not forgotten
_______________________________________________________________________________
Dave Jansen | INTERNET: eldorado@en.ecn.purdue.edu