home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
archives
/
c64forth.tar.gz
/
c64forth.tar
/
c644th.scr
< prev
next >
Wrap
Text File
|
1988-08-16
|
102KB
|
2,822 lines
( ---
( --- SCREEN # 5 ---
( ---
( TYPE DEFINITIONS 070984)
: VAR VARIABLE ; ( SHORTHAND)
: 0VAR 0 VARIABLE ; ( INITS VAR TO 0)
: CONST CONSTANT ; ( SHORTHAND)
: ASC 32 WORD HERE 1+ C@ ;
( LEAVES ASCII EQUIVALENT OF FOLLOWING
SINGLE CHARACTER ON STACK. USEAGE:
ASC A CONST 'A' , STORES 65 IN 'A')
-->
( ---
( --- SCREEN # 6 ---
( ---
( STRING FUNCTIONS 071784)
: ADD$ ( A$ C$ --- ) ( C$=C$+A$ )
SWAP COUNT 3 PICK COUNT DUP ROT + SWAP
3 PICK + 5 PICK C! SWAP CMOVE DROP ;
: CONCAT$ ( A$ B$ C$ ---) ( C$=A$+B$ )
0 OVER ! ( ZEROES C$ )
SWAP ROT 3 PICK ADD$ SWAP ADD$ ;
: TYPE$ COUNT TYPE ; ( NAME$ ---)
: TO$ ( A$ B$ ---) ( COPIES A$ OVER B$)
0 OVER ! ADD$ ; -->
( ---
( --- SCREEN # 7 ---
( ---
( MORE STRING FUNCTIONS 060584)
: WORD$ ( MAKES STRING CALLED 'ABCD')
<BUILDS ( WORD$ 'ABCD' )
2 0 DO ( BACKUP PTR TO 2D ' )
BEGIN
IN @ 1- DUP
0< IF ." ERROR -- NO '" ENDIF
DUP IN !
BLK @ IF
BLK @ BLOCK
ELSE
TIB @
THEN
+ C@ 39 =
UNTIL
LOOP
1 ALLOT 39 WORD HERE C@ HERE 1- C!
HERE C@ 1+ ALLOT
DOES> 1+ ;
: STR$ ( N --- ADDR) ( ADDR OF STRING)
0 <# #S 32 HOLD #> ( FROM N IN PAD.)
OVER 1- C! 1- ; ( ADD COUNT BYTE)
-->
( ---
( --- SCREEN # 8 ---
( ---
( MORE STRING FUNCTIONS 070484)
3 CONSTANT SWD
: =$ ( ADDR1 ADDR --- FLAG )
COUNT ROT COUNT ROT ( A A1 N1 N)
SWD MIN SWAP SWD MIN ( A A1 N1' N')
OVER = NOT IF
2DROP DROP 0 EXIT ( N'<>N1', F=0)
THEN 1 SWAP ( A A1 N)
0 DO ( A A1 1)
OVER I + C@ ( A A1 1 C1)
4 PICK I + C@ ( A A1 1 C1 C)
= NOT IF ( A1 A2 1)
DROP 0 LEAVE ( A1 A2 0)
THEN
LOOP ( A1 A2 1/0)
ROT ROT 2DROP ;
-->
( ---
( --- SCREEN # 9 ---
( ---
( CASE: CHARLES EAKER-> LH-> RD 012284)
: CASE ?COMP CSP @ SP@ CSP ! 4 ;
IMMEDIATE
: OF 4 ?PAIRS COMPILE OVER COMPILE =
COMPILE 0BRANCH HERE 0 , COMPILE DROP
5 ; IMMEDIATE
: ENDOF 5 ?PAIRS COMPILE BRANCH HERE
0 , SWAP 2 [COMPILE] THEN 4 ;
IMMEDIATE
: ENDCASE 4 ?PAIRS COMPILE DROP
BEGIN
SP@ CSP @ = NOT WHILE
2 [COMPILE] THEN
REPEAT CSP ! ; IMMEDIATE
: ANY DUP ; ( USE IN 'ANY OF ... ENDOF')
( THIS ONE FOR STRINGS)
: OF$ 4 ?PAIRS COMPILE OVER COMPILE =$
COMPILE 0BRANCH HERE 0 , COMPILE DROP
5 ; IMMEDIATE
-->
( ---
( --- SCREEN # 10 ---
( ---
( TABLE-BUILDING WORDS 070984 )
( THESE BUILD TABLES OF N+1 ENTRIES:
0,1,...,N FROM LISTS IN THE INPUT
STREAM )
: BCONVERT ( N --- ) ( BYTES )
1+ 0 DO
BL WORD HERE NUMBER DROP C,
LOOP ;
( USAGE:
N BTABLE NAME B0 B1 B2 ... BN )
: BTABLE <BUILDS BCONVERT
DOES> + C@ ;
-->
( ---
( --- SCREEN # 11 ---
( ---
( COMMAND AND VALUE TABLES 052684 )
15 VARIABLE $LEN ( LENGTH OF NAMES IN
TABLES) : $LEN@+ $LEN @ 1+ ;
: CMDBLD ( N ---) ( BUILD COMMAND TABLE)
1+ 0 DO ( N+1 EA, WORD$ + CFA )
BL WORD $LEN@+ ALLOT ( WORD$ )
FIND DUP 0= 0 ?ERROR , ( CFA )
LOOP ;
: CMDTBL ( N CMDTBL NAME WORD$ WORD ...)
<BUILDS DUP C, ( N-> 0TH LOC)
CMDBLD ( N+1 ENTRIES: WORD$ + CFA )
DOES> ( --- ADDR OF N ) ;
: () ( ADDR I --- ADDR ENTRY )
OVER C@ OVER < ( OVERRANGE? )
OVER 0< OR IF ( NEGATIVE? )
CR ." ? COMMAND RANGE ERROR"
ABORT
THEN $LEN@+ 2+ * SWAP DUP ROT + 1+ ;
( USAGE: NAME I <> CMDEXE )
: CMDEXE $LEN@+ + @ EXECUTE DROP ;
-->
( ---
( --- SCREEN # 12 ---
( ---
( COMMAND AND VALUE TABLES 020184 )
WORD$ '?'
: LIST? ( CMDTBL --- ) ( PRINT NAMES )
HERE '?' =$ HERE C@ 0 = OR IF ( ?/NUL)
." SELECT FROM:" CR
DUP C@ 1+ 0 DO
I () SPACE TYPE$ CR
LOOP
." SELECTION: " QUERY CR BL WORD
THEN ;
: VALBLD ( N --- ) ( BUILD VALUE TABLE)
1+ 0 DO ( N+1 EA, WORD$ + VALUE)
BL WORD $LEN@+ ALLOT ( WORD$ )
BL WORD HERE NUMBER DROP , ( VALUE )
LOOP ;
: VALTBL ( N VALTBL NAME WORD$ VALUE...)
<BUILDS DUP C, ( N-> 0TH LOC)
VALBLD ( N+1 ENTRIES: WORD$ + VALUE)
DOES> ( --- ADDR OF N ) ;
( USAGE: NAME I <> VALGET )
: VALGET $LEN@+ + @ ;
-->
( ---
( --- SCREEN # 13 ---
( ---
( ASCII/BOOLEAN CONSTANTS KERMIT 061884)
ASC A CONST <A> ASC B CONST <B>
ASC C CONST <C> ASC D CONST <D>
ASC E CONST <E> ASC F CONST <F>
ASC G CONST <G> ASC H CONST <H>
ASC I CONST <I> ASC J CONST <J>
ASC K CONST <K> ASC L CONST <L>
ASC M CONST <M> ASC N CONST <N>
ASC O CONST <O> ASC P CONST <P>
ASC Q CONST <Q> ASC R CONST <R>
ASC S CONST <S> ASC T CONST <T>
ASC U CONST <U> ASC V CONST <V>
ASC W CONST <W> ASC X CONST <X>
ASC Y CONST <Y> ASC Z CONST <Z>
ASC ? CONST <?> ASC # CONST <#>
ASC " CONST <">
1 CONST TRUE
0 CONST FALSE
-->
( ---
( --- SCREEN # 14 ---
( ---
( LCIN ASCII-> CBMASCII 071884)
( TO INPUT FROM MODEM TO C64-ASCII FILES
AND TO TERMINAL SCREEN WHEN BOTH UPPER
AND LOWER CASE CHARACTERS ARE PRESENT)
( INPUT BYTE = 0-127)
( 8=BACKSPACE->157=CRSR LEFT)
( 92=BACKSLASH->221=VERT BAR, NOT \)
( 9=TAB->220) ( 12=FF->219)
127 BTABLE LCIN
00 00 00 00 00 00 00 00 157 220
00 00 219 13 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00
00 00 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
060 061 062 063 064 193 194 195 196 197
198 199 200 201 202 203 204 205 206 207
208 209 210 211 212 213 214 215 216 217
218 091 221 093 094 095 096 065 066 067
68 69 70 71 72 73 74 75 76 77
78 79 80 81 82 83 84 85 86 87
88 89 90 00 00 00 00 00 -->
( ---
( --- SCREEN # 15 ---
( ---
( UCIN ASCII-> CBMASCII 071884)
( TO INPUT FROM MODEM TO C64-ASCII FILES
AND TO TERMINAL SCREEN WHEN ONLY UPPER
CASE CHARACTERS ARE DESIRED IN C64)
( INPUT BYTE = 0-127)
( 8=BACKSPACE->157=CRSR LEFT)
( 92=BACKSLASH->221=VERT BAR, NOT \)
( 9=TAB->220) ( 12=FF->219)
127 BTABLE UCIN
00 00 00 00 00 00 0 0 157 220
00 00 219 13 00 00 00 00 00 0
00 00 00 00 00 00 00 00 00 00
00 00 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69
70 71 72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87 88 89
90 91 221 93 94 95 96 65 66 67
68 69 70 71 72 73 74 75 76 77
78 79 80 81 82 83 84 85 86 87
88 89 90 00 00 00 00 00 -->
( ---
( --- SCREEN # 16 ---
( ---
( LCOUT C64ASCII-> ASCII 111384)
255 BTABLE LCOUT
00 00 02 03 04 05 06 07 08 09
00 11 12 13 14 15 16 17 18 19
127 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
060 061 062 063 064 097 098 099 100 101
102 103 104 105 106 107 108 109 110 111
112 113 114 115 116 117 118 119 120 121
122 091 092 093 094 095 096 065 066 067
68 69 70 71 72 73 74 75 76 77
78 79 80 81 82 83 84 85 86 87
88 89 90 00 00 00 00 00 00 00
00 00 00 17 19 08 27 18 20 10
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
00 00 00 00 00 00 00 00 00 00
00 00 00 65 66 67 68 69 70 71
72 73 74 75 76 77 78 79 80 81
82 83 84 85 86 87 88 89 90 12
09 92 00 00 00 00 00 00 00 00
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 -->
( ---
( --- SCREEN # 17 ---
( ---
( UCOUT C64ASCII-> ASCII 111384)
255 BTABLE UCOUT
00 00 02 03 04 05 06 07 08 09
00 11 12 13 14 15 16 17 18 19
127 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69
70 71 72 73 74 75 76 77 78 79
80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 65 66 67
68 69 70 71 72 73 74 75 76 77
78 79 80 81 82 83 84 88 86 87
88 89 90 00 00 00 00 00 00 00
000 000 000 017 019 008 027 018 020 010
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
00 00 00 00 00 00 00 00 00 00
00 00 00 65 66 67 68 69 70 71
72 73 74 75 76 77 78 79 80 81
82 83 84 85 86 87 88 89 90 12
09 92 00 00 00 00 00 00 00 00
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 -->
( ---
( --- SCREEN # 18 ---
( ---
( KERMIT CONSTANTS AND VARIABLES 071684)
( NOTE: CONSTANTS ARE ->ASCII<- VALUES)
94 CONST MAXPACK ( MAX PACKET LENGTH)
1 CONST <SOH> ( START OF HEADER)
32 CONST <SP> ( ASCII SPACE)
13 CONST <CR> ( CARRIAGE RETURN)
10 CONST <LF> ( LINE FEED)
127 CONST <DEL> ( DELETE/RUBOUT)
5 CONST MAXTRY ( TIMES TO RETRY)
140 CONST MYESC ( CONNECT-ESCAPE CHAR)
<#> VAR MYQUOTE ( QUOTE CHAR I'LL USE)
0 VAR MYPAD ( NO. PAD CHARS I NEED)
0 VAR MYPCHAR ( PAD CHAR I NEED)
<CR> VAR MYEOL ( ENDOLINE CHAR I NEED)
10 VAR MYTIME ( SEC AFTER WHICH I)
( SHOULD BE TIMED OUT)
5 VAR DELAY ( SEC DELAY BEFORE I
( SEND INIT PACKET)
127 VAR BITS ( MASK FOR 7-BIT/8-BIT)
-->
( ---
( --- SCREEN # 19 ---
( ---
( KERMIT CONSTANTS AND VARIABLES 070884)
( VARIABLES FROM 'C' 8080 VERSION)
0VAR SIZE ( SIZE OF PRESENT DATA)
0VAR N ( MESSAGE NUMBER)
MAXPACK VAR RPSIZ ( MAX RECEIVE PACKET)
MAXPACK VAR SPSIZ ( MAX SEND PACKET)
0 VAR SPAD ( HOW MUCH PADDING TO SEND)
10 VAR TIMINT ( SEC TIME AFTER WHICH I)
( NUDGE OTHER KERMIT)
0VAR NUMTRY ( TIMES THIS PACKET RETRIED)
0VAR OLDTRY ( TIMES PREVIOUS PACKET
RETRIED)
0VAR KSTATE ( PRESENT STATE OF THE
KERMIT AUTOMATON)
0VAR PADCHAR ( PAD CHARACTER TO SEND)
<CR> VAR EOL ( END OF LINE TO SEND)
<#> VAR QUOTE ( QUOTE CHAR IN INCOMING
DATA)
0VAR FLWRN ( FLAG, 1=> FILE-WARNING ON)
-->
( ---
( --- SCREEN # 20 ---
( ---
( KERMIT TABLES, SETUP/ERROR 071584)
0VAR KERR 0VAR KTEMP
: PAUSE ." -ANY KEY CONTINUES-"
KEYIN DROP ;
: UNKERR 0 KERR ! ( RESET ERROR FLAG )
LEAVE ; ( MIGHT AS WELL OMIT LOOPS)
: DOKERR 1 KERR ! ; ( SET ERROR FLAG )
: TSTKERR ( TEST ERROR FLAG, WARN )
KERR @ IF CR IN @ KTEMP !
0 IN !
BLK @ IF BLK @ BLOCK ELSE TIB @ THEN
KTEMP @ 0 DO DUP I + C@ EMIT LOOP DROP
." <--ERROR?" CR ." NO ACTION" CR
SP! PAUSE ABORT THEN ;
: XSETUP ( ADDR --- ADDR N+1 0 )
( SETUP FOR SEARCH OF VAL/CMDTBL )
DOKERR ( PRESET ERROR FLAG )
BL WORD ( INPUT STRING )
LIST? ( IS IT A '?' ? )
DUP C@ 1+ 0 ; --> ( SETUP DO-LOOP)
( ---
( --- SCREEN # 21 ---
( ---
( TERMINAL CONSTS/VARS/ROUTINES 120284)
0VAR ITSPEED 0VAR TSPEED ( BAUD RATE)
0VAR ITWORD 0VAR TWORD ( WORD LENGTH)
0VAR ITSTOP 0VAR TSTOP ( STOP BITS)
0VAR ITSHK 0VAR TSHK ( HANDSHAKE MODE)
0VAR ITDUP 0VAR TDUP ( ECHO/DUPLEX)
0VAR ITPAR 0VAR TPAR ( PARITY)
0VAR TCTL 0VAR TCOM ( CTL, CMD WORDS)
0VAR ICHRSET ( GRAPHICS/TEXT CHAR SET)
0VAR IBORDER ( BORDER COLOR, 0-15)
0VAR IBKGND ( BACKGROUND COLOR, 0-15)
0VAR ICHRCLR ( CHARACTER COLOR, 0-15)
: CLR ." " ; ( CLEARS SCREEN)
: DWN ( N ---) ( STARTS A LINE N DOWN)
." " -DUP IF 0 DO ." " LOOP THEN
39 0 DO BL EMIT LOOP
39 0 DO ." " LOOP ; -->
( ---
( --- SCREEN # 22 ---
( ---
( TERMINAL SCREEN PRINT 120284 )
( SPECIAL ROUTINE TO AVOID QUOTE MODE
AND TO SHOW CURSOR WHERE PRINT WILL
NEXT OCCUR )
: BYTEPRINT ( B ---) ( SCREEN PRINT)
DUP IF ( ONLY IF NONZERO)
0 212 C! ( TURN OFF QUOTE MODE)
( FIRST REMOVE OLD CURSOR)
0 646 C@ 32 59923 CALLR 2DROP DROP
EMIT ( THEN PRINT ONE CHARACTER)
( AND ADD NEW CURSOR)
0 646 C@ 121 59923 CALLR 2DROP DROP
ELSE DROP THEN ;
-->
( ---
( --- SCREEN # 23 ---
( ---
( PACKET VARIABLES 063084)
( MEMTOP MUST BE < $CB00 )
HEX
CB80 CONST PACKET ( KERMIT SEND BUFFER)
0VAR NN ( COUNTER FOR BYTES-OUT)
0VAR II ( COUNTER FOR SEND BUFFER)
0VAR BUFFADDR ( SEND BUFFER ADDRESS)
CB00 CONST RECPKT ( KERMIT RECEIVE BUF)
DECIMAL
0VAR <KEY> ( KEYBOARD CHARACTER)
0VAR MOD$ ( MODEM INPUT STRING, 1 CHAR)
MOD$ 1+ CONST MOD$1 ( ACCESS TO BYTE)
0VAR MOU$ ( MODEM OUT STRING. 1 CHAR)
0VAR RTYPE ( PACKET TYPE, RECEIVE)
0VAR RCK ( CHECKSUM, RECEIVE)
0VAR RNUM ( NUMBER OF PACKET, RECV)
0VAR RLEN ( LENGTH OF PACKET, RECV)
0VAR TNUM ( NUMBER OF PACKET, SEND)
0VAR TLEN ( LENGTH OF PACKET, SEND)
-->
( ---
( --- SCREEN # 24 ---
( ---
( FILE CONSTANTS AND VARIABLES 071784)
( EXPECTS MEMTOP < $CB00 )
HEX
CD00 CONST FBUFF ( C64-FILES BUFFER)
FF CONST FBUFFLEN ( LENGTH OF IT)
CC00 CONST RNAME$ ( NAME OF READ-FILE)
CC40 CONST WNAME$ ( NAME OF WRITE-FILE)
CC80 CONST FNAME$ ( NAME OF EXT FILE)
CCC0 CONST BUF1 ( BUFFER FOR FILENAMES)
DECIMAL
0VAR FEOF ( EOF FOUND, END THIS BUFFER)
0VAR FEOLB ( END OF LAST FILE BUFFER)
0VAR FBFPTR ( PTR INTO FILE I/O BUFFER)
0VAR FILTYP ( TYPE OF FILE, TRANSLATE?)
WORD$ 'S0:'
WORD$ '0:'
WORD$ ',R'
WORD$ ',W'
WORD$ ',P'
WORD$ ',S'
-->
( ---
( --- SCREEN # 25 ---
( ---
( DISK BYTE FETCH DGET# 060884)
( XXXX* = C64-BASIC KERNAL ROUTINES )
( REPLACE GET# FOR DISK READ, FIX BUGS)
: READST ( --- B ) ( RETURN STATUS BYTE)
0 0 0 65463 CALLR ( READST*)
ROT ROT 2DROP ;
: UNTALK 65451 CALL ; ( UNTLK*)
: DGET# ( FILE# ADDR COUNT --- )
3 PICK 0 SWAP 0 65478 CALLR ( CHKIN*)
DROP 2DROP 1+ 1 DO
0 0 0 65445 CALLR ( ACPTR*)
4 PICK I + C! 2DROP ( STORE BYTE)
I OVER C! ( STORE CURRENT LENGTH)
READST IF ( CHECK STATUS BYTE)
LEAVE
THEN
LOOP 2DROP UNTALK
READST ST ! CKST DROP ; ( RD,CK ST)
-->
( ---
( --- SCREEN # 26 ---
( ---
( FILE I/O 062984) ( INPUT UTILITIES)
: FILLFBUFF ( ---) ( FILL EMPTY BUFFER)
18 FBUFF 1- COUNT DGET#
CKRDSTAT ( EOF? WORSE?)
FEOF ! ( SAVE IN EOF-FLAG)
1 FBFPTR ! ; ( RESET BUFFER POINTER)
: FGET ( --- B )
( GET ONE BYTE FROM FILE BUFFER AND )
( SET EOLB FLAG IF LAST BYTE IN FILE)
FBFPTR @ FBUFF + C@ ( GET BYTE)
FBFPTR @ 1+ DUP FBFPTR ! ( INC PTR)
FBUFF C@ > IF ( NEED REFILL?)
FEOF @ IF ( -YES, END LAST BUFFER?)
1 FEOLB ! ( SET EOLB FLAG)
ELSE
FILLFBUFF ( -NO, REFILL BUFFER)
THEN
THEN ;
-->
( ---
( --- SCREEN # 27 ---
( ---
( FILE I/O 070384) ( OPEN FOR READ)
: FRCLOSE 18 CLOSE ( CLOSE FILE)
CLOSCHN ;
: FROPEN ( --- F)
'0:' RNAME$ BUF1 CONCAT$
',R' BUF1 ADD$ ( "0:NAME,S,R)
OPENCHN
18 8 18 BUF1 COUNT OPEN
?FILE DUP ( F=0=>OK,1=> NOT FOUND)
IF
3 DWN RNAME$ TYPE$ ." NOT FOUND"
FRCLOSE ABORTIO ( SHUT DOWN)
1 FEOLB ! ( AND SET EOF FLAG)
ELSE
FILLFBUFF ( FOUND: FILL BUFFER,)
0 FEOLB ! ( AND RESET EOF FLAG )
THEN ;
-->
( ---
( --- SCREEN # 28 ---
( ---
( FILE I/O 072484) ( OUTPUT UTILITIES)
: EMPTYFBUFF ( EMPTIES FILE BUFFER)
19 FBUFF COUNT PRINT#
CKWRSTAT 0 FBUFF C! ; ( CHECK, RESET)
: FPUT ( B ---) ( ONE BYTE TO BUFFER)
FBUFF COUNT + C! ( STORE THE BYTE)
FBUFF C@ 1+ DUP FBUFF C! ( COUNT)
FBUFFLEN < NOT IF EMPTYFBUFF THEN ;
: NAMETEST ( NAME IN WNAME$) ( --- F)
WNAME$ C@ IF 0 ( F=0 => OK)
WNAME$ C@ 0 DO ( F>0 => BAD CHARS)
WNAME$ 1+ I + C@ 127 AND UCIN
DUP 46 < IF SWAP 1+ SWAP THEN
DUP 90 > IF SWAP 1+ SWAP THEN
DUP 57 > OVER 65 < AND IF
SWAP 1+ SWAP THEN
OVER IF DROP BL THEN
WNAME$ 1+ I + C!
LOOP FILTYP @ CASE ( APPEND ,P OR ,S)
<H> OF ',P' ENDOF
<B> OF ',P' ENDOF
ANY OF ',S' ENDOF
ENDCASE WNAME$ ADD$ ELSE 1 THEN ; -->
( ---
( --- SCREEN # 29 ---
( ---
( FILE I/O 071384) ( OPEN FOR WRITE)
: FWOPEN ( NAME IN NAME$ ) ( --- )
'0:' WNAME$ BUF1 CONCAT$
',W' BUF1 ADD$ ( "0:WNAME,X,W" )
OPENCHN
19 8 19 BUF1 COUNT OPEN
CKWRSTAT ( FILE ALREADY EXISTS?...)
FBUFF FBUFFLEN 1+ 0 FILL ; ( 0 BUFF)
: WCLOSE 19 CLOSE CLOSCHN ;
: FWCLOSE ( EMPTY BUFFER, CLOSE FILE)
FBUFF C@ 0= NOT IF ( STUFF IN BUFF?)
EMPTYFBUFF ( -YES, EMPTY IT)
THEN WCLOSE ;
: FWTEST ( --- F) ( 1=> NO FILE, SAFE)
'0:' WNAME$ BUF1 CONCAT$
OPENCHN
19 8 19 BUF1 COUNT OPEN
?FILE
WCLOSE ;
-->
( ---
( --- SCREEN # 30 ---
( ---
( SET/SHOW FILE-TRANSLATION 071184)
( FILE TYPES:
SEQUENTIAL:
T = TEXT = LC/UC, TRANSLATE DATA
UC-ONLY = UC/GRAPHICS, TRANSLATE DATA
A = ANSI/ASCII, 7-BIT, NO TRANSLATION
PROGRAM:
B = BINARY, 8-BIT, NO TRANSLATION
H = HEX NIBBLE CODING, 8-BIT BINARY )
0VAR ITYPE
4 VALTBL VTYPE TEXT 84 UC-ONLY 85
ASCII-7 65 BINARY-8 66
HEX 72
: STYPE ( N ---)
ITYPE ! VTYPE ITYPE @ ()
VALGET FILTYP ! DROP
FILTYP @ <B> = IF 255 ELSE 127 THEN
BITS ! ;
0 STYPE ( DEFAULT = TEXT)
-->
( ---
( --- SCREEN # 31 ---
( ---
( SET/SHOW FILE-TRANSLATION 071184)
: XTYPE ( SELECT FILE TYPE FROM KBD)
VTYPE XSETUP
DO I () HERE =$ IF
I STYPE UNKERR
THEN LOOP DROP TSTKERR ;
: SHOWTYPE
VTYPE ITYPE @ ()
." FILE TYPE = " TYPE$ CR DROP
FILTYP @ CASE
<H> OF ." <PROGRAM>" ENDOF
<B> OF ." <PROGRAM>" ENDOF
ANY OF ." <SEQUENTIAL>" ENDOF
ENDCASE CR ;
-->
( ---
( --- SCREEN # 32 ---
( ---
( TERMINAL PARAMETER SETUP 020484)
( SET BAUD RATE )
3 VALTBL VTSPEED
110 3 300 6 1200 8 2400 10
: STSPEED ( N --- )
ITSPEED ! VTSPEED ITSPEED @ ()
VALGET TSPEED ! DROP ;
1 STSPEED
( SET WORD LENGTH )
1 VALTBL VTWORD 8-BITS 0 7-BITS 32
: STWORD ( N --- )
ITWORD ! VTWORD ITWORD @ ()
VALGET TWORD ! DROP ;
0 STWORD
-->
( ---
( --- SCREEN # 33 ---
( ---
( TERMINAL PARAMETER SETUP 020484)
( SET STOP BITS, NORMALLY 1 )
1 VALTBL VTSTOP 1 0 2 128
: STSTOP ( N --- )
ITSTOP ! VTSTOP ITSTOP @ () VALGET
TSTOP ! DROP ;
0 STSTOP
( SET HANDSHAKE MODE )
1 VALTBL VTSHK 3-LINE 0 X-LINE 1
: STSHK ( N --- )
ITSHK ! VTSHK ITSHK @ () VALGET
TSHK ! DROP ;
0 STSHK
-->
( ---
( --- SCREEN # 34 ---
( ---
( TERMINAL PARAMETER SETUP 020484 )
( SET ECHO MODE, NORMALLY FULL DUPLEX )
1 VALTBL VTDUP FULL 0 HALF 16
: STDUP ( N --- )
ITDUP ! VTDUP ITDUP @ () VALGET
TDUP ! DROP ;
0 STDUP
( SET PARITY, NORMALLY NO )
4 VALTBL VTPAR NO 0 ODD 32 EVEN 96
MARK 160 SPACE 224
: STPAR ( N --- )
ITPAR ! VTPAR ITPAR @ () VALGET
TPAR ! DROP ;
0 STPAR
-->
( ---
( --- SCREEN # 35 ---
( ---
( TERMINAL PARAMETER SETUP 071784 )
( CONSTRUCT CONTROL, COMMAND WORDS )
: STCTL
TSPEED @ TWORD @ + TSTOP @ + TCTL ! ;
: STCOM
TSHK @ TDUP @ + TPAR @ + TCOM ! ;
( BUILD RS-232 OPENING STRING )
CREATE TOPN$ 0 , 0 C, ( 3 BYTES)
: BLDTOPN$
STCTL STCOM
TOPN$ ( OPENING STRING )
2 OVER C! ( NO. OF BYTES )
1+ TCTL C@ OVER C! ( CTRL BYTE )
1+ TCOM C@ SWAP C! ; ( CMD BYTE )
-->
( ---
( --- SCREEN # 36 ---
( ---
( TERMINAL PARAMETER SETUP 020484 )
: XTSPEED ( SELECT BAUD RATE )
VTSPEED XSETUP
DO I () HERE =$ IF
I STSPEED UNKERR
THEN LOOP DROP TSTKERR ;
: XTWORD ( SELECT WORD LENGTH )
VTWORD XSETUP
DO I () HERE =$ IF
I STWORD UNKERR
THEN LOOP DROP TSTKERR ;
: XTSTOP ( SELECT NO. OF STOP BITS )
VTSTOP XSETUP
DO I () HERE =$ IF
I STSTOP UNKERR
THEN LOOP DROP TSTKERR ;
: XTSHK ( SELECT HANDSHAKE MODE )
VTSHK XSETUP
DO I () HERE =$ IF
I STSHK UNKERR
THEN LOOP DROP TSTKERR ;
-->
( ---
( --- SCREEN # 37 ---
( ---
( TERMINAL PARAMETER SETUP 020484)
: XTDUP ( SELECT ECHO/DUPLEX MODE )
VTDUP XSETUP
DO I () HERE =$ IF
I STDUP UNKERR
THEN LOOP DROP TSTKERR ;
: XTPAR ( SELECT PARITY )
VTPAR XSETUP
DO I () HERE =$ IF
I STPAR UNKERR
THEN LOOP DROP TSTKERR ;
-->
( ---
( --- SCREEN # 38 ---
( ---
( TERMINAL PARAMETER SETUP 063084)
1 VALTBL VCHRSET UC/GRAPHIC 21 LC/UC 23
: SCHRSET ( N --- )
ICHRSET ! VCHRSET ICHRSET @ () VALGET
53272 ! DROP ;
0 SCHRSET
: XCHRSET ( SELECT CHARACTER SET )
VCHRSET XSETUP
DO I () HERE =$ IF
I SCHRSET UNKERR
THEN LOOP DROP TSTKERR ;
-->
( ---
( --- SCREEN # 39 ---
( ---
( TERMINAL PARAMETER SETUP 020484)
: NUMIN BL WORD HERE NUMBER DROP ;
: SBORDER ( N ---)
DUP 53280 C! IBORDER ! ;
14 SBORDER
: XBORDER NUMIN 15 AND SBORDER ;
: SBKGND ( N ---)
DUP 53281 C! IBKGND ! ;
1 SBKGND
: XBKGND NUMIN 15 AND SBKGND ;
: SCHRCLR ( N ---)
DUP 646 C! ICHRCLR ! ;
6 SCHRCLR
: XCHRCLR NUMIN 15 AND SCHRCLR ;
-->
( ---
( --- SCREEN # 40 ---
( ---
( TERMINAL PARAMETER STORAGE 070284)
: STOR ( BLKADDR INDEX VALADDR ---)
C@ 0 <# BL HOLD # # #> DROP
SWAP 3 * 3 PICK + 3 CMOVE ;
: RECL ( --- VALUE) NUMIN ;
: XTST 95 BLOCK
0 ITSPEED STOR 1 ITWORD STOR
2 ITSTOP STOR 3 ITSHK STOR
4 ITDUP STOR 5 ITPAR STOR
6 ICHRSET STOR 7 ICHRCLR STOR
8 IBKGND STOR 9 IBORDER STOR
DROP UPDATE ;
: XTSTORE XTST FLUSH ;
: XTRECALL BLK @ IN @ 95 BLK ! 0 IN !
RECL STSPEED RECL STWORD
RECL STSTOP RECL STSHK
RECL STDUP RECL STPAR
RECL SCHRSET RECL SCHRCLR
RECL SBKGND RECL SBORDER
IN ! BLK ! ;
-->
( ---
( --- SCREEN # 41 ---
( ---
( TERMINAL-PARAMETER SET 071484)
( 'SET TERMINAL' OPTIONS)
11 CMDTBL CTERMINAL
SPEED XTSPEED
WORD XTWORD
STOPBITS XTSTOP
HANDSHAKE XTSHK
ECHO XTDUP
PARITY XTPAR
SAVE XTSTORE
RESTORE XTRECALL
CASE XCHRSET
CHARCOLOR XCHRCLR
BORDER XBORDER
BACKGROUND XBKGND
: XTERMINAL
CTERMINAL XSETUP
DO I () HERE =$ IF
CTERMINAL I () CMDEXE UNKERR
THEN LOOP DROP TSTKERR ;
-->
( ---
( --- SCREEN # 42 ---
( ---
( SHOW TERMINAL-PARAMETERS 020484 )
: SHOWTERM ( --- )
CR ." TERMINAL PARAMETERS:" CR
VTSPEED ITSPEED @ ()
." SPEED = " TYPE$ CR DROP
VTWORD ITWORD @ ()
." WORD LENGTH = " TYPE$ CR DROP
VTSTOP ITSTOP @ ()
." STOPBITS = " TYPE$ CR DROP
VTSHK ITSHK @ ()
." HANDSHAKE MODE = " TYPE$ CR DROP
VTDUP ITDUP @ ()
." ECHO = " TYPE$ ." DUPLEX" CR
DROP
VTPAR ITPAR @ ()
." PARITY = " TYPE$ CR DROP
VCHRSET ICHRSET @ ()
." CHARACTER SET = " TYPE$ CR
DROP
." CHARACTER COLOR = " ICHRCLR ? CR
." BORDER COLOR = " IBORDER ? CR
." BACKGROUND COLOR = " IBKGND ? CR ;
-->
( ---
( --- SCREEN # 43 ---
( ---
( SET KERMIT OPTIONS 070884)
: XSPKTLEN NUMIN
MAXPACK MIN SPSIZ ! ;
: XSPADDIN NUMIN SPAD ! ;
: XSPADCHR NUMIN PADCHAR ! ;
: XSTIMOUT NUMIN MYTIME ! ;
: XSENDLIN NUMIN EOL ! ;
: XSQUOTE BL WORD HERE 1+ C@
LCOUT MYQUOTE ! ;
0VAR IFLWRN
: XFLWRNOFF 0 IFLWRN ! ;
: XFLWRNON 1 IFLWRN ! ;
-->
( ---
( --- SCREEN # 44 ---
( ---
( SET KERMIT OPTIONS 070884)
: XRPKTLEN NUMIN
MAXPACK MIN RPSIZ ! ;
: XRPADDIN NUMIN MYPAD ! ;
: XRPADCHR NUMIN MYPCHAR ! ;
: XRTIMOUT NUMIN TIMINT ! ;
: XRENDLIN NUMIN MYEOL ! ;
: XRQUOTE BL WORD HERE 1+ C@
LCOUT QUOTE ! ;
: XDELAY NUMIN DELAY ! ;
-->
( ---
( --- SCREEN # 45 ---
( ---
( SET KERMIT OPTIONS 070284)
: XSDST 95 BLOCK 40 +
0 SPSIZ STOR 1 SPAD STOR
2 PADCHAR STOR 3 MYTIME STOR
4 EOL STOR 5 MYQUOTE STOR
DROP UPDATE ;
: XSDSTORE XSDST FLUSH ;
: XSDRECALL BLK @ IN @ 95 BLK ! 40 IN !
RECL SPSIZ !
RECL SPAD !
RECL PADCHAR !
RECL MYTIME !
RECL EOL !
RECL MYQUOTE !
IN ! BLK ! ;
-->
( ---
( --- SCREEN # 46 ---
( ---
( SET KERMIT OPTIONS, STO/RECALL 070284)
: XRCST 95 BLOCK 80 +
0 RPSIZ STOR 1 MYPAD STOR
2 MYPCHAR STOR 3 TIMINT STOR
4 MYEOL STOR 5 QUOTE STOR
DROP UPDATE FLUSH ;
: XRCSTORE XRCST FLUSH ;
: XRCRECALL BLK @ IN @ 95 BLK ! 80 IN !
RECL RPSIZ !
RECL MYPAD !
RECL MYPCHAR !
RECL TIMINT !
RECL MYEOL !
RECL QUOTE !
IN ! BLK ! ;
: RECALL XRCRECALL XSDRECALL XTRECALL ;
: STORE XRCST XSDST XTST
FLUSH ;
-->
( ---
( --- SCREEN # 47 ---
( ---
( SET KERMIT OPTIONS 071484)
7 CMDTBL CSEND
LENGTH-PACKET XSPKTLEN
PADDING XSPADDIN
CHAR-PAD XSPADCHR
TIMEOUT XSTIMOUT
END-OF-LINE XSENDLIN
QUOTE XSQUOTE
SAVE XSDSTORE
RESTORE XSDRECALL
7 CMDTBL CRECEIVE
LENGTH-PACKET XRPKTLEN
PADDING XRPADDIN
CHAR-PAD XRPADCHR
TIMEOUT XRTIMOUT
END-OF-LINE XRENDLIN
QUOTE XRQUOTE
SAVE XRCSTORE
RESTORE XRCRECALL
1 CMDTBL CFLWRN
OFF XFLWRNOFF ON XFLWRNON
-->
( ---
( --- SCREEN # 48 ---
( ---
( SET KERMIT OPTIONS 062984)
: XSEND ( SET SEND PARAMETERS)
CSEND XSETUP
DO I () HERE =$ IF
CSEND I () CMDEXE UNKERR
THEN LOOP DROP TSTKERR ;
: XRECEIVE ( SET RECEIVE PARAMETERS)
CRECEIVE XSETUP
DO I () HERE =$ IF
CRECEIVE I () CMDEXE UNKERR
THEN LOOP DROP TSTKERR ;
: XFLWRN ( SET FILE-WARNING ON/OFF)
CFLWRN XSETUP DO I () HERE =$ IF
CFLWRN I () CMDEXE UNKERR
THEN LOOP DROP TSTKERR ;
-->
( ---
( --- SCREEN # 49 ---
( ---
( SHOW KERMIT OPTIONS 062984)
: SHOWSEND
CR ." SEND PARAMETERS:"
CR ." PACKET-LENGTH = " SPSIZ ?
CR ." NO. PAD CHARS = " SPAD ?
CR ." PAD CHARACTER = " PADCHAR ?
CR ." TIMEOUT INTERVAL = " MYTIME ?
CR ." END-OF-LINE CHAR = " EOL ?
CR ." QUOTE CHARACTER = " MYQUOTE
@ UCIN EMIT CR ;
: SHOWRECEIVE
CR ." RECEIVE PARAMETERS:"
CR ." PACKET-LENGTH = " RPSIZ ?
CR ." NO. PAD CHARS = " MYPAD ?
CR ." PAD CHARACTER = " MYPCHAR ?
CR ." TIMEOUT INTERVAL = " TIMINT ?
CR ." END-OF-LINE CHAR = " MYEOL ?
CR ." QUOTE CHARACTER = " QUOTE
@ UCIN EMIT CR ;
-->
( ---
( --- SCREEN # 50 ---
( ---
( SHOW KERMIT OPTIONS 062984)
: SHOWFLWRN CR ." FILE WARNING IS "
CFLWRN IFLWRN @ () TYPE$ CR DROP ;
: SHOWDELAY CR
." INITIAL DELAY INTERVAL = "
DELAY ? ." SEC" CR ;
-->
( ---
( --- SCREEN # 51 ---
( ---
( SET/SHOW COMMAND TABLES 071284)
5 CMDTBL CSET
TERMINAL XTERMINAL
SEND XSEND
RECEIVE XRECEIVE
FILE-TYPE XTYPE
WARNING-FILE XFLWRN
DELAY XDELAY
5 CMDTBL CSHOW
TERMINAL SHOWTERM
SEND SHOWSEND
RECEIVE SHOWRECEIVE
FILE-TYPE SHOWTYPE
WARNING-FILE SHOWFLWRN
DELAY SHOWDELAY
-->
( ---
( --- SCREEN # 52 ---
( ---
( KERMIT SET/SHOW ROUTINES 063084)
: SET
CSET XSETUP
DO I () HERE =$ IF
CSET I () CMDEXE UNKERR
THEN LOOP DROP TSTKERR ;
: SHOW
CSHOW XSETUP
DO I () HERE =$ IF
CSHOW I () CMDEXE UNKERR
THEN LOOP DROP TSTKERR ;
-->
( ---
( --- SCREEN # 53 ---
( ---
( 1/60-SEC TIMER WORDS 110384)
0 VARIABLE TIVAR
: TICSET ( TICKS --- )
ABS MINUS
DUP )HI TIVAR C! )LO TIVAR 1+ C! ;
: INTSET ( SECONDS --- )
60 * TICSET ; ( 60T )
: TINTSET TIMINT @ INTSET ;
: TI0 TIVAR @ 161 ! ; ( PRESET TIMER)
: TIGET ( --- F) ( CHECK FOR TIMEOUT)
161 C@ 128 < ;
: WAIT DELAY @ INTSET TI0
BEGIN TIGET UNTIL ;
-->
( ---
( --- SCREEN # 54 ---
( ---
( CONNECT-DEFINITIONS 110384)
( MEMTOP SHOULD BE BELOW $CB00 )
HEX CF00 CONSTANT BF1
CE00 CONSTANT BF2 DECIMAL
: CLRIN ( CLEAR INPUT BUFFER)
BF1 256 0 FILL 0 667 ! ;
: CLROUT ( CLEAR OUTPUT BUFFER)
BF2 256 0 FILL 0 669 ! ;
: MODOPEN ( OPEN MODEM FOR I/O)
BLDTOPN$ ( SET CURRENT PARAMETERS)
2 2 0 TOPN$ COUNT OPEN
BF1 247 ! BF2 249 ! ( SET BUFF PTRS)
CLRIN CLROUT ; ( RESET BUFF INDEX)
: MODCLOSE BEGIN 669 C@ 670 C@ = UNTIL
2 CLOSE ; ( WAIT TILL BUFFER EMPTY!)
-->
( ---
( --- SCREEN # 55 ---
( ---
( TERMINAL BREAK-KEY SIMULATION 111084)
: TOGGEL ( REVERSE RS-232 OUTPUT LINE)
56576 DUP C@ 4 XOR SWAP C! ;
: BREAK ( 1/4-SEC BREAK ON RS-232 OUT)
." [BREAK] "
30 TICSET
MODCLOSE
TOGGEL
TI0 BEGIN TIGET UNTIL
TOGGEL
MODOPEN ;
-->
( ---
( --- SCREEN # 56 ---
( ---
( CONNECT-ESCAPE SEQUENCES 110384)
( B=KEYBOARD BYTE, B1=OUTPUT,140=>NULL)
( FLAG=1 AND B1>0 SENDS B1 TO MODEM)
: FL0 0 0 ; ( EXIT TO RESET CHAR SET)
: FL1 -1 0 ; ( DISCONNECT MODEM)
: FL2 140 1 ; ( NULL OUTPUT, NO EFFECT)
: ?ESC ( B --- B1 F, F=1 => TRANSMIT)
1 OVER MYESC = IF 2DROP ." [F8]"
KEYIN DUP EMIT CASE
<U> OF 0 SCHRSET FL0 ENDOF ( UC-ONLY)
<L> OF 1 SCHRSET FL0 ENDOF ( TEXT)
<C> OF FL1 ENDOF ( DISCONNECT)
<B> OF BREAK FL2 ENDOF ( 'BREAK')
<S> OF SHOWSEND SHOWRECEIVE
SHOWFLWRN SHOWDELAY
FL2 ENDOF ( SHOW PARAMETERS)
<T> OF SHOWTERM FL2 ENDOF
<X> OF FL1 ENDOF ( SAME AS C)
<?> OF CR ." OPTIONS: " ( SHOW THEM)
." U L B C S T X ?" CR FL2 ENDOF
ENDCASE THEN ; -->
( ---
( --- SCREEN # 57 ---
( ---
( TERMINAL I/O LOOPS 112584)
: GETKB ( --- B)
GET TDUP @ IF
DUP BYTEPRINT
THEN ;
: GETMOD ( --- B)
2 MOD$ 1 GET#
MOD$ 1+ C@ 127 AND ;
: PUTMOD ( B ---)
DUP IF
<KEY> C!
2 <KEY> 1 PRINT#
ELSE
DROP
THEN ;
-->
( ---
( --- SCREEN # 58 ---
( ---
( TERMINAL I/O LOOPS 111084)
: UCIO ( UPPERCASE TERMINAL)
BEGIN
GETKB ?ESC
WHILE
UCOUT PUTMOD
GETMOD
UCIN BYTEPRINT
REPEAT ;
: LCIO ( LOWERCASE TERMINAL)
BEGIN
GETKB ?ESC
WHILE
LCOUT PUTMOD
GETMOD
LCIN BYTEPRINT
REPEAT ;
-->
( ---
( --- SCREEN # 59 ---
( ---
( TERMINAL I/O LOOPS 111084)
: TERMLOOP
BEGIN
53272 C@ 2 AND IF ( CHAR SET?)
LCIO
ELSE
UCIO
THEN ( HERE IF ?ESC GIVES 0 FLAG)
0< UNTIL ; ( LOOP UNLESS NEGATIVE)
: CONNECT ( ACT AS TERMINAL, W ESC KEY)
." *CONNECT TO REMOTE: F8-C RETURNS"
CR MODOPEN ( OPEN MODEM CONNECTION)
TERMLOOP
MODCLOSE CR ( CLOSE MODEM CONNECTION)
." *RETURN TO LOCAL KERMIT" CR ;
-->
( ---
( --- SCREEN # 60 ---
( ---
( PACKET UTILITY ROUTINES 071584)
( CONVERTS CTRL TO PRINT CHAR BY +32)
: TOCHAR ( N1 --- N2) <SP> + ;
( UNDOES TOCHAR)
: UNCHAR ( N2 --- N1) <SP> - ;
( CONVERTS CTRL <-> PRINT CHAR BY
TOGGLING CTRL BIT)
: CTL ( N1 --- N2) 64 XOR ;
: PRNTE ( PRINTS ERROR PACKETS)
9 DWN ." MSG FROM HOST:" CR
PACKET RLEN @ 0 DO DUP I + C@
UCIN EMIT LOOP DROP ;
: DISPL ." PKT # = " N ?
." TRIES = " NUMTRY ? ;
-->
( ---
( --- SCREEN # 61 ---
( ---
( PACKET UTILITY ROUTINES 071384)
( FILL EXT DATAARRAY W SENDINIT PARAMS)
: SPARA ( ADDATA ---)
RPSIZ @ TOCHAR OVER C!
MYTIME @ TOCHAR OVER 1 + C!
MYPAD @ TOCHAR OVER 2 + C!
MYPCHAR @ CTL OVER 3 + C!
MYEOL @ TOCHAR OVER 4 + C!
MYQUOTE @ SWAP 5 + C! ;
( GET SENDINIT STUFF FROM EXT DATAARRAY)
: RPARA ( ADDATA ---)
DUP C@ UNCHAR SPSIZ !
DUP 1 + C@ UNCHAR TIMINT !
DUP 2 + C@ UNCHAR SPAD !
DUP 3 + C@ CTL PADCHAR !
DUP 4 + C@ UNCHAR EOL !
5 + C@ QUOTE ! ;
: MESSG1 5 DWN ." TRANSFER COMPLETE" ;
: MESSG2 5 DWN ." ??TRANSFER FAILED" ;
-->
( ---
( --- SCREEN # 62 ---
( ---
( SEND/RECEIVE PACKET WORDS 071084)
: NUMTRY+>?
NUMTRY @ 1 NUMTRY +! MAXTRY > ;
: OLDTRY+>?
OLDTRY @ 1 OLDTRY +! MAXTRY > ;
: KSTATE@ KSTATE @ ;
: KSTATE! KSTATE ! ;
: EOLSET
EOL @ 0= IF <CR> EOL ! THEN ;
: QUOTSET
QUOTE @ 0= IF <#> QUOTE ! THEN ;
: 0NUMTRY
0 NUMTRY ! ;
: N+ N @ 1+ 64 MOD N ! ;
: N@ N @ ;
: INITIALIZE 0NUMTRY 0 OLDTRY ! 0 N ! ;
-->
( ---
( --- SCREEN # 63 ---
( ---
( RECEIVE-PACKET [PART A] 071184)
: T7 MOD$1 C@ 127 AND ; ( 7BIT, NO SUM)
: T7+ T7 SWAP OVER + SWAP ; ( W CKSUM)
: T8 MOD$1 C@ ; ( 8BIT TM)
: T8+ T8 SWAP OVER + SWAP ; ( LIKE TM+)
( MGET WAITS FOR NON-ZERO INPUT BYTE. )
( MGET NORMALLY RETURNS F=0, B>32, )
( BUT A NEW PACKET CAUSES F=0, B=<SOH>)
( AND A TIMEOUT CAUSES F=1, B=<SOH>)
: MGET ( --- F B )
0 ( RESET TIMEOUT FLAG)
BEGIN
2 MOD$ 1 GET# MOD$1 C@ ( F B --- )
TIGET IF ( TIMEOUT ON ALARM )
2DROP 1 <SOH> DUP MOD$1 C!
THEN
UNTIL ( LOOP UNTIL B>0 )
T7 ; ( RETURN 7BIT BYTE)
-->
( ---
( --- SCREEN # 64 ---
( ---
( RECEIVE-PACKET [PART B] 071184)
: WAITHEADER ( --- FLD=1/CKSUM=0 )
TI0 ( RESET TIMEOUT CLOCK)
BEGIN MGET ( F B ---) ( AWAIT PACKET)
<SOH> = NOT WHILE DROP REPEAT
IF 7 255 ( IS IT A TIMEOUT?)
ELSE 1 0 THEN ; ( OR A NEW PACKET?)
: GETHEADER ( FLD/CKSUM --- FLD/CKSUM)
MGET <SOH> = IF ( NORMALLY NOT <SOH>)
IF 2DROP 7 255 ( IS IT A TIMEOUT?)
ELSE 2DROP 0 0 THEN ( A NEW PACKET?)
ELSE DROP THEN ; ( DISCARD FLAG)
: FILLPACKET ( FLD/CKSUM --- FLD/CKSUM)
3 PICK @ ( GET # BYTES = PKT LENGTH)
-DUP IF
6 PICK DUP ROT + SWAP DO
MGET <SOH> = IF ( TIMEOUT OR NEW?)
IF 2DROP 7 255 ELSE 2DROP 0 0 THEN
ELSE
DROP T8+ I C! ( STORE 7/8BIT DATA)
THEN
LOOP
THEN ; -->
( ---
( --- SCREEN # 65 ---
( ---
( RECEIVE-PACKET [PART C] 071184)
: RPACK ( ADDATA ADNUM ADLEN --- TYPE)
WAITHEADER ( --- /FLD=1/CHKSUM=0/ )
BEGIN ( LOOP ON FIELD NUMBER, FLD)
OVER CASE
1 OF GETHEADER ( GET LENGTH)
T7+ UNCHAR 3 -
4 PICK ! ENDOF
2 OF GETHEADER ( GET NUMBER)
T7+ UNCHAR
5 PICK ! ENDOF
3 OF GETHEADER ( GET TYPE)
T7+ RTYPE ! ENDOF
4 OF FILLPACKET ENDOF ( GET DATA)
5 OF GETHEADER ( GET CHECKSUM)
T7 UNCHAR RCK !
DUP 192 AND 64 / + 63 AND ENDOF
ENDCASE SWAP 1+ SWAP OVER 5 >
UNTIL DUP RCK @ = IF DROP ELSE
4 DWN 255 =
IF ." ? TIMEOUT "
ELSE ." ? CKSUM ERR"
THEN 0 RTYPE !
THEN 2DROP 2DROP CLRIN RTYPE @ ; -->
( ---
( --- SCREEN # 66 ---
( ---
( SEND-PACKET [PART A] 071584)
: MPUT ( B ---)( OUTPUT 1 CHAR TO MODEM)
MOU$ C! 2 MOU$ 1 PRINT# ;
-->
( ---
( --- SCREEN # 67 ---
( ---
( SEND-PACKET [PART B] 071584)
: SPACK ( ADDDATA TYPE NUM LEN --- )
SPAD @ -DUP IF
0 DO PADCHAR @ MPUT LOOP
THEN <SOH> MPUT
( LENGTH OUTPUT; START CHECKSUM )
DUP 3 + TOCHAR DUP MPUT
( NUM OUTPUT; STACK HAS ON TOP: )
( .../TYPE/NUM/LEN/CHECKSUM/ --- )
ROT TOCHAR DUP ROT + SWAP MPUT
( TYPE OUTPUT )
ROT DUP ROT + SWAP MPUT
( AT DATA OUTPUT STACK HAS ON TOP: )
( /ADDDATA/LEN/CHECKSUM/ --- )
SWAP DUP IF
3 PICK + ROT DO
I C@ DUP ROT + SWAP MPUT
LOOP
ELSE DROP SWAP DROP
THEN DUP 192 AND 64 / + 63 AND
TOCHAR ( CHECKSUM OUT ) MPUT
EOL @ MPUT ; -->
( ---
( --- SCREEN # 68 ---
( ---
( BUFFER-FILL [PART A] 072984 )
0VAR BTEMP ( 7/8BIT BYTE STORAGE)
: BOUT ( B --- BN...B1 N )
DUP <SP> < OVER <DEL> = OR
OVER MYQUOTE @ = OR IF ( SPEC'L CHR?)
CASE
MYQUOTE @ OF BTEMP @ BITS @ AND
MYQUOTE @ 2 ENDOF ( QUOTE ITSELF)
<CR> OF FILTYP @
<B> = IF ( NO CRLF IN 8-BIT)
BTEMP @ CTL MYQUOTE @ 2
ELSE ( CR/LF IN 7-BIT MODES)
74 MYQUOTE @ 77 MYQUOTE @ 4
THEN ENDOF
<LF> OF FILTYP @ ( REDUNDANT LF)
<B> = IF BTEMP @ CTL MYQUOTE @ 2
ELSE 0 THEN ENDOF
ANY OF BTEMP @ BITS @ AND
CTL MYQUOTE @ 2 ENDOF
ENDCASE
ELSE ( NORMAL CHARACTER)
DROP
BTEMP @ BITS @ AND 1
THEN ; -->
( ---
( --- SCREEN # 69 ---
( ---
( BUFFER-FILL [PART B] 071884)
: HEXOUT ( B --- B2 B1 2 )
HEX 0 <# # # #> DROP
DUP 1+ C@ SWAP C@ DECIMAL 2 ;
: UCOOUT ( B --- BN...B1 N)
UCOUT DUP BTEMP ! BOUT ;
: TEXTOUT ( B --- BN...B1 N)
LCOUT DUP BTEMP ! BOUT ;
: ASCOUT ( B --- BN...B1 N)
127 AND DUP BTEMP ! BOUT ;
: BINOUT DUP BTEMP ! 127 AND BOUT ;
-->
( ---
( --- SCREEN # 70 ---
( ---
( BUFFER-FILL [PART C] 071684)
: BUFILL ( BUFFADDR --- SIZE )
BUFFADDR ! 0 II !
BEGIN ( IF NOT EOF AND II < MAXLEN-4 )
FEOLB @ 0= II @ SPSIZ @ 9 - < AND
WHILE
FGET
FILTYP @ CASE ( 1 OR 2 BYTES OUT)
<T> OF TEXTOUT ENDOF ( LC/UC)
<U> OF UCOOUT ENDOF ( UC-ONLY)
<H> OF HEXOUT ENDOF ( HEX CODED)
<B> OF BINOUT ENDOF ( 8BIT BINARY)
ANY OF ASCOUT ENDOF ( ASCII, ETC.)
ENDCASE ( --- BN...B1 N ---)
-DUP IF 0 DO
BUFFADDR @ II @ + C! 1 II +!
LOOP THEN
REPEAT
II @ ; ( RETURNS SIZE=0 FOR EOF )
-->
( ---
( --- SCREEN # 71 ---
( ---
( BUFFER-EMPTY [PART A] 111384)
CREATE HBUF 1 , 0 , ( CONVERSION BUF)
: HEXIN ( LEN ADDR PTR CHR1 --- BYTE)
UCIN HBUF DUP C@ + C! ( STORE BYTE)
HBUF DUP C@ 1 > IF ( 2 BYTES YET?)
HEX NUMBER DROP DECIMAL FPUT
1 HBUF C!
ELSE
DUP C@ 1+ SWAP C!
THEN ;
: TRPUT ( B ---) ( TRANSLATE, FILE CHR)
BITS @ AND
FILTYP @ CASE
<T> OF LCIN ?DUP IF FPUT THEN ENDOF
<U> OF UCIN ?DUP IF FPUT THEN ENDOF
<H> OF HEXIN ENDOF ( IN 2, OUT 1)
ANY OF FPUT ENDOF ( ASCII/BINARY)
ENDCASE ;
: BUMP ( ADDR/PTR --- ADDR/PTR/B7)
OVER OVER + C@
DUP BTEMP ! 127 AND ; -->
( ---
( --- SCREEN # 72 ---
( ---
( BUFFER-EMPTY [PART B] 111384)
: BUFEMP ( LEN/BUFFADDR ---)
0 ( LEN/BUFFADDR/PTR=0 ---)
BEGIN
DUP 4 PICK < ( PTR < LENGTH?)
WHILE
BUMP ( GET A CHARACTER)
QUOTE @ = IF ( QUOTE?)
1+ BUMP ( GET NEXT CHARACTER)
QUOTE @ = IF ( QUOTE?)
BTEMP @ TRPUT ( JUST PUT QUOTE)
ELSE
BTEMP @ CTL TRPUT ( FIX IT)
THEN
ELSE
BTEMP @ TRPUT
THEN
1+ ( INCREMENT PTR)
REPEAT DROP 2DROP ; -->
( ---
( --- SCREEN # 73 ---
( ---
( GET NAME OF FILE TO SEND 071784)
: GNAME ( STR$ ---) ( GET STR FROM KBD)
<"> WORD HERE SWAP TO$ ;
: SNAME ( --- ) ( GET NAME$ FROM KBD)
RNAME$ GNAME
BEGIN ( DON'T QUIT WITHOUT NAME$)
RNAME$ C@ 0= WHILE
CR ." FILENAME: "
QUERY RNAME$ GNAME
REPEAT ;
: OUTNAME ( TRANSLATE NAME$ TO ASCII )
RNAME$ C@ FNAME$ C! ( BYTE COUNT)
RNAME$ C@ 1+ 1 DO ( TRANSFER BYTES)
RNAME$ I + C@
UCOUT ( ALWAYS IN UPPER CASE)
FNAME$ I + C!
LOOP ;
-->
( ---
( --- SCREEN # 74 ---
( ---
( GET FILE-NAME TO RECEIVE 110384)
: GETFIL ( NAMESIZE ---)
WNAME$ C@ 0= IF ( IF NO NAME)
DUP WNAME$ C! 0 DO ( GET FROM F-PKT)
I PACKET + C@ UCIN I 1+ WNAME$ + C!
LOOP
ELSE DROP THEN
BEGIN BEGIN NAMETEST WHILE
3 DWN ." ILLEGAL FILENAME" CR
." NEW NAME: " QUERY
WNAME$ GNAME
REPEAT 1 ( OK SO FAR)
IFLWRN @ IF ( FILE-WARNING ON?)
BEGIN FWTEST 0= WHILE
3 DWN WNAME$ TYPE$ ." EXISTS" CR
." NEW NAME: " QUERY WNAME$ GNAME
DROP 0 ( MUST RETEST)
REPEAT
THEN
UNTIL
IFLWRN @ 0= IF
'S0:' WNAME$ BUF1 CONCAT$ OPENCHN
15 BUF1 COUNT PRINT# CLOSCHN
THEN FWOPEN ; -->
( ---
( --- SCREEN # 75 ---
( ---
( SEND INIT-PACKET 070384)
: SINIT-ACK RECPKT RPARA EOLSET QUOTSET
0NUMTRY N+ FROPEN 0= IF <F>
ELSE <A> THEN ;
: SINIT
CLRIN ( CLEAR OUT OLD NAKS, JUNK)
2 DWN RNAME$ TYPE$
NUMTRY+>? IF <A> EXIT THEN ( ABORT)
PACKET SPARA ( SEND 'S' PACKET)
PACKET <S> N@ 6 SPACK
RECPKT TNUM TLEN RPACK
CASE
<N> OF ( NAK FOR N+1 => ACK FOR N)
TNUM @ N@ 1+ - IF KSTATE@ ELSE
SINIT-ACK THEN ENDOF
<Y> OF ( ACKNOWLEDGES GOOD PACKET N)
TNUM @ N@ - IF KSTATE@ ELSE
SINIT-ACK THEN ENDOF
<E> OF PRNTE <A> ENDOF ( ERR-PACKET)
FALSE OF KSTATE@ ENDOF ( CKSM ERROR)
ANY OF <A> ENDOF ( UNRECOGNIZED)
ENDCASE ;
-->
( ---
( --- SCREEN # 76 ---
( ---
( SEND FILE-PACKET 070384)
: SFILE-ACK 0NUMTRY N+ PACKET BUFILL
SIZE ! <D> ; ( READY TO SEND DATA)
: SFILE
NUMTRY+>? IF <A> EXIT THEN ( ABORT)
FNAME$ COUNT <F> N@ ROT SPACK
RECPKT TNUM TLEN RPACK
CASE ( BASED ON PACKET TYPE)
<N> OF ( NAK FOR N+1 => ACK FOR N)
TNUM @ N@ 1+ - IF KSTATE@ ELSE
SFILE-ACK THEN ENDOF
<Y> OF ( ACKNOWLEDGE GOOD PACKET N)
TNUM @ N@ - IF KSTATE@ ELSE
SFILE-ACK THEN ENDOF
<E> OF PRNTE <A> ENDOF ( ERR-PACKET)
FALSE OF KSTATE@ ENDOF ( CKSM ERROR)
ANY OF <A> ENDOF ( UNRECOGNIZED)
ENDCASE ;
-->
( ---
( --- SCREEN # 77 ---
( ---
( SEND DATA-PACKET 070384)
: SDATA-ACK 0NUMTRY N+ ( RESET ETC.)
PACKET BUFILL DUP SIZE ! ( REFILL )
IF <D> ELSE <Z> THEN ; ( EOF? )
: SDATA
NUMTRY+>? IF <A> EXIT THEN ( ABORT)
PACKET <D> N@ SIZE @ SPACK
RECPKT TNUM TLEN RPACK
CASE ( BASED ON PACKET TYPE)
<N> OF ( NAK FOR N+1 => ACK FOR N)
TNUM @ N@ 1+ - IF KSTATE@ ELSE
SDATA-ACK THEN ENDOF
<Y> OF ( ACKNOWLEDGE GOOD PACKET N)
TNUM @ N@ - IF KSTATE@ ELSE
SDATA-ACK THEN ENDOF
<E> OF PRNTE <A> ENDOF ( ERR-PACKET)
FALSE OF KSTATE@ ENDOF ( CKSM ERROR)
ANY OF <A> ENDOF ( UNRECOGNIZED)
ENDCASE ;
-->
( ---
( --- SCREEN # 78 ---
( ---
( SEND EOF-PACKET 070384)
: SEOF-ACK 0NUMTRY N+ ( RESET ETC.)
( GNXTFL) 0 ( NO GET-NEXT-FILE YET)
IF <F> ELSE <B> THEN ; ( EOT? )
: SEOF
NUMTRY+>? IF <A> EXIT THEN ( ABORT)
PACKET <Z> N@ 0 SPACK
RECPKT TNUM TLEN RPACK
CASE ( BASED ON PACKET TYPE)
<N> OF ( NAK FOR N+1 => ACK FOR N)
TNUM @ N@ 1+ - IF KSTATE@ ELSE
SEOF-ACK THEN ENDOF
<Y> OF ( ACKNOWLEDGE GOOD PACKET N)
TNUM @ N@ - IF KSTATE@ ELSE
SEOF-ACK THEN ENDOF
<E> OF PRNTE <A> ENDOF ( ERR-PACKET)
FALSE OF KSTATE@ ENDOF ( CKSM ERROR)
ANY OF <A> ENDOF ( UNRECOGNIZED)
ENDCASE ;
-->
( ---
( --- SCREEN # 79 ---
( ---
( SEND BREAK-PACKET <EOT> 070384)
: SBREAK-ACK 0NUMTRY N+ ( RESET ETC.)
<C> ; ( SWITCH STATE TO 'C' )
: SBREAK
NUMTRY+>? IF <A> EXIT THEN ( ABORT)
PACKET <B> N@ 0 SPACK
RECPKT TNUM TLEN RPACK
CASE ( BASED ON PACKET TYPE)
<N> OF ( NAK FOR N+1 => ACK FOR N)
TNUM @ N@ 1+ - IF KSTATE@ ELSE
SBREAK-ACK THEN ENDOF
<Y> OF ( ACKNOWLEDGE GOOD PACKET N)
TNUM @ N@ - IF KSTATE@ ELSE
SBREAK-ACK THEN ENDOF
<E> OF PRNTE <A> ENDOF ( ERR-PACKET)
FALSE OF KSTATE@ ENDOF ( CKSM ERROR)
ANY OF <A> ENDOF ( UNRECOGNIZED)
ENDCASE ;
-->
( ---
( --- SCREEN # 80 ---
( ---
( SEND: MAJOR ROUTINES 071584)
: SENDSW ( STATE SWITCHER FOR SEND)
CLR 1 DWN ." SENDING " <S> KSTATE !
WAIT ( DELAY)
INITIALIZE TINTSET
BEGIN DISPL ( SHOW STATUS)
KSTATE@ CASE
<D> OF SDATA KSTATE! ENDOF
<F> OF SFILE KSTATE! ENDOF
<Z> OF SEOF KSTATE! ENDOF
<S> OF SINIT KSTATE! ENDOF
<B> OF SBREAK KSTATE! ENDOF
<C> OF TRUE EXIT ENDOF
<A> OF FALSE EXIT ENDOF
ANY OF FALSE EXIT ENDOF
ENDCASE
AGAIN ;
: SEND ( SEND A FILE )
SNAME OUTNAME ( GET FILE NAME)
MODOPEN SENDSW ( SEND FILE)
IF MESSG1 ( SUCCESS)
ELSE MESSG2 ( FAILURE)
THEN FRCLOSE MODCLOSE ABORTIO
CR PAUSE CLR ; -->
( ---
( --- SCREEN # 81 ---
( ---
( RECEIVE INIT-PACKET 070784)
: RINIT-ACK
RNUM @ N ! ( SYNC PACKETS)
PACKET RPARA ( GET INIT DATA)
PACKET SPARA ( SEND INIT DATA)
PACKET <Y> N@ 6 SPACK
NUMTRY @ OLDTRY ! ( SAVE TRY COUNT)
0NUMTRY ( START NEW ONE)
N+ ( INCREMENT PACKET NO.)
<F> ; ( RETURN 'F')
: RINIT
NUMTRY+>? IF <A> EXIT THEN ( ABORT)
PACKET RNUM RLEN RPACK ( GET PACKET)
CASE ( TYPE?)
<S> OF RINIT-ACK ENDOF ( INIT-PACKET)
<E> OF PRNTE <A> ENDOF ( ERR-PACKET)
FALSE OF KSTATE@ ENDOF ( CHKSUM ERR)
ANY OF <A> ENDOF ( UNRECOGNIZED)
ENDCASE ;
-->
( ---
( --- SCREEN # 82 ---
( ---
( RECEIVE FILE-PACKET [PART A] 063084)
: RFILE-S ( IT WAS ANOTHER INIT-PACKET)
OLDTRY+>? IF <A> EXIT THEN
RNUM @ N@ 1- = IF ( PREV PKT # ?)
PACKET SPARA ( GET INIT PARAMETERS)
PACKET <Y> RNUM @ 6 SPACK ( ACK)
0NUMTRY ( RESTART COUNTER)
KSTATE@ ( KEEP STATE)
ELSE <A> THEN ; ( ABORT)
: RFILE-Z ( IT WAS AN END-OF-FILE PKT)
OLDTRY+>? IF <A> EXIT THEN
RNUM @ N@ 1- = IF ( PREV PKT?)
0 <Y> RNUM @ 0 SPACK ( ACK)
0NUMTRY
KSTATE@
ELSE <A> THEN ; ( ABORT)
-->
( ---
( --- SCREEN # 83 ---
( ---
( RECEIVE FILE-PACKET [PART B] 071584)
: RFILE-F ( IT WAS A FILE-NAME PACKET)
RNUM @ N@ = IF ( CORRECT PACKET # ?)
RLEN @ GETFIL ( -YES: OPEN FILE)
2 DWN WNAME$ TYPE$
0 <Y> N@ 0 SPACK ( ACK)
NUMTRY @ OLDTRY ! ( SAVE TRY COUNT)
0NUMTRY ( RESTART COUNT)
N+ ( INCREMENT PKT #)
<D> ( GET-DATA STATE)
ELSE <A> THEN ; ( ABORT)
: RFILE-B ( IT WAS A BREAK-PACKET)
RNUM @ N@ = IF ( CORRECT PACKET #?)
0 <Y> N@ 0 SPACK ( -YES: ACK)
<C> ( RETURN 'C' = COMPLETE)
ELSE
<A> ( OTHERWISE, ABORT)
THEN ;
-->
( ---
( --- SCREEN # 84 ---
( ---
( RECEIVE FILE-PACKET [PART C] 070384)
: RFILE
NUMTRY+>? IF
<A> EXIT ( ABORT IF)
THEN
PACKET RNUM RLEN RPACK ( GET PACKET)
CASE ( PACKET TYPE?)
<S> OF RFILE-S ENDOF ( INIT-PACKET)
<Z> OF RFILE-Z ENDOF ( EOF-PACKET)
<F> OF RFILE-F ENDOF ( FILE-PACKET)
<B> OF RFILE-B ENDOF ( BREAK-PACKET)
<E> OF PRNTE <A> ENDOF ( ERR-PACKET)
FALSE OF KSTATE@ ENDOF ( CHKSUM ERR)
ANY OF <A> ENDOF ( UNRECOGNIZED)
ENDCASE ;
-->
( ---
( --- SCREEN # 85 ---
( ---
( RECEIVE DATA-PACKET [PART A] 063084)
: RDATA-D ( IT WAS A DATA PACKET)
RNUM @ N@ = IF ( RIGHT PKT # ?)
RLEN @ PACKET BUFEMP ( BUFFER->FILE)
0 <Y> N@ 0 SPACK ( ACK)
NUMTRY @ OLDTRY ! ( SAVE TRY COUNT)
0NUMTRY ( RESET)
N+ ( INCR PKT #)
<D> ( MORE DATA?)
ELSE
OLDTRY+>? IF <A> EXIT THEN
RNUM @ N@ 1- = IF ( PREV PKT # ?)
PACKET SPARA
PACKET <Y> RNUM @ 6 SPACK ( ACK)
0NUMTRY
KSTATE@
ELSE <A> THEN ( SORRY, WRONG NUMBER)
THEN ;
-->
( ---
( --- SCREEN # 86 ---
( ---
( RECEIVE DATA-PACKET [PART B] 072484)
: RDATA-F ( IT WAS A FILE PACKET)
OLDTRY+>? IF <A> EXIT THEN
RNUM @ N@ 1- = IF ( PREV PKT # ?)
0 <Y> N@ 0 SPACK ( ACK)
0NUMTRY ( RESET)
KSTATE@ ( KEEP STATE)
ELSE <A> THEN ;
: RDATA-Z ( IT WAS AN <EOF> PACKET)
RNUM @ N@ = IF ( RIGHT PKT # ?)
0 <Y> N@ 0 SPACK ( ACK)
FWCLOSE ( CLOSE DISK FILE)
NUMTRY @ OLDTRY ! ( SAVE TRY COUNT)
0NUMTRY ( RESET)
N+ ( INCR PKT #)
0 WNAME$ ! ( FORGET OLD FILE NAME)
<F> ( ANOTHER FILE?)
ELSE <A> THEN ;
-->
( ---
( --- SCREEN # 87 ---
( ---
( RECEIVE DATA-PACKET [PART C] 070384)
: RDATA
NUMTRY+>? IF <A> EXIT THEN
PACKET RNUM RLEN RPACK ( GET PACKET)
CASE
<D> OF RDATA-D ENDOF ( DATA-PACKET)
<F> OF RDATA-F ENDOF ( FILE-PACKET)
<Z> OF RDATA-Z ENDOF ( EOF-PACKET)
<E> OF PRNTE <A> ENDOF ( ERR-PACKET)
FALSE OF KSTATE@ ENDOF ( CHKSUM ERR)
ANY OF <A> ENDOF ( UNRECOGNIZED)
ENDCASE ;
-->
( ---
( --- SCREEN # 88 ---
( ---
( RECEIVE: MAJOR ROUTINES 071584)
: RECSW ( STATE SWITCHER FOR RECEIVE)
CLR 1 DWN ." RECEIVING " <R> KSTATE!
INITIALIZE TINTSET
BEGIN DISPL ( SHOW STATUS)
KSTATE@ CASE
<D> OF RDATA KSTATE! ENDOF ( DATA)
<F> OF RFILE KSTATE! ENDOF ( FNAME)
<R> OF RINIT KSTATE! ENDOF ( INIT)
<C> OF TRUE EXIT ENDOF ( DONE)
<A> OF FALSE EXIT ENDOF ( ABORT)
ANY OF FALSE EXIT ENDOF ( ?????)
ENDCASE
AGAIN ;
: RECV ( RECEIVE A FILE)
WNAME$ GNAME ( GET FILE NAME)
MODOPEN RECSW ( ACCEPT FILE)
IF MESSG1 ( SUCCESS)
ELSE MESSG2 ( FAILURE)
THEN WCLOSE MODCLOSE ABORTIO
CR PAUSE CLR ; -->
( ---
( --- SCREEN # 89 ---
( ---
( SERVER COMMAND: GET 071584)
: RSERV
FNAME$ COUNT <R> 0 ROT SPACK RINIT ;
: GETSW
CLR 1 DWN ." RECEIVING" <R> KSTATE!
INITIALIZE TINTSET
BEGIN DISPL ( SHOW STATUS)
KSTATE@ CASE
<R> OF RSERV KSTATE! ENDOF
<F> OF RFILE KSTATE! ENDOF
<D> OF RDATA KSTATE! ENDOF
<C> OF TRUE EXIT ENDOF
<A> OF FALSE EXIT ENDOF
ANY OF FALSE EXIT ENDOF
ENDCASE
AGAIN ;
: GETF ( GET FILENAME FROM KEYBOARD)
SNAME OUTNAME RNAME$ WNAME$ TO$
MODOPEN GETSW ( GET FILE FROM SERVER)
IF MESSG1 ( SUCCESS)
ELSE MESSG2 ( FAILURE)
THEN WCLOSE MODCLOSE ABORTIO
CR PAUSE CLR ; -->
( ---
( --- SCREEN # 90 ---
( ---
( SERVER COMMANDS 071584)
<L> VAR L
: LOGOUT
MODOPEN CLR TINTSET
L <G> 0 1 SPACK ( SEND A 'GL' PKT)
RECPKT TNUM TLEN RPACK
CASE
<E> OF PRNTE FALSE ENDOF
<Y> OF TRUE ENDOF
ANY OF FALSE ENDOF
ENDCASE
CASE
TRUE OF 5 DWN ." LOGGED OUT" ENDOF
FALSE OF MESSG2 ENDOF
ENDCASE
MODCLOSE CLOSCHN ABORTIO
CR PAUSE CLR ;
-->
( ---
( --- SCREEN # 91 ---
( ---
( KERMIT LOCAL COMMANDS 071584)
: KQUIT CLOSCHN ABORTIO ABORT ;
: XDC [COMPILE] DC ;
: HELP CLR
99 96 DO CLR
24 0 DO I J .LINE CR LOOP
PAUSE CLR
LOOP ;
: NEW ( MOVES KERMIT FILES TO NEW DISK)
." INSERT, THEN PUSH ANY KEY:"
CR ." SOURCE DISK"
KEYIN DROP
99 95 DO I BLOCK UPDATE LOOP
CR ." DESTINATION DISK"
KEYIN DROP FLUSH
[COMPILE] SAVESYSTEM ;
-->
( ---
( --- SCREEN # 92 ---
( ---
( KERMIT COMMAND TABLE 071784)
14 CMDTBL CKERMIT
CONNECT CONNECT SEND SEND
RECEIVE RECV GET GETF
BYE LOGOUT HELP HELP
EXIT BASIC QUIT KQUIT
SET SET SHOW SHOW
SAVE STORE RESTORE RECALL
DIRECTORY DIR DISK XDC
NEW NEW
-->
( ---
( --- SCREEN # 93 ---
( ---
( KERMIT INTERACTS WITH USER 111384)
: KERMIT ( ENDLESS LOOP)
0 BLK ! -1 WARNING ! ( FOR TURNKEY)
CLR 1 DWN
." KERMIT-C64/V1.5"
CR ." R. DETENBECK"
CR ." DEPT. OF PHYSICS"
CR ." UNIVERSITY OF VERMONT"
10 DWN
BEGIN
CR ." KERMIT-C64> " QUERY CR
CKERMIT XSETUP
DO
I () HERE =$ IF
CKERMIT I () CMDEXE UNKERR
THEN
LOOP DROP TSTKERR
AGAIN ;
( ---
( --- SCREEN # 94 ---
( ---
( MOVE SCREENS 21-92 120284)
EMPTY-BUFFERS
30 BUFFERS
: MOVEIT ( N1 N2 --- )
SWAP 1- SWAP
BEGIN
CR ." INSERT SOURCE DISK, TYPE 'A' "
KEYIN DUP EMIT 65 = UNTIL
DO
CR ." COPY " I . ." TO " I 1+ .
I DUP 1+ COPY
-1 +LOOP
BEGIN
CR ." INSERT DEST DISK, TYPE 'B' "
KEYIN DUP EMIT 66 = UNTIL
FLUSH ;
80 92 MOVEIT
67 79 MOVEIT
54 66 MOVEIT
41 53 MOVEIT
28 40 MOVEIT
21 27 MOVEIT
( ---
( --- SCREEN # 95 ---
( ---
01 00 00 00 00 00 00 06 01 14
96 00 00 10 13 35
96 00 00 10 13 35
( ---
( --- SCREEN # 96 ---
( ---
KERMIT-C64, V1.5
EQUIPMENT: COMMODORE C64, 1541, 1600
SOURCE LANGUAGE: FORTH
FILE TYPES HANDLED:
TYPE...INTERNAL FORM..TRANSMITTED FORM
TEXT 7-BIT CBMASCII 7-BIT ASCII
(SEQUENTIAL) TRANSLATION*
UC [ SAME, BUT UPPERCASE ONLY ]*
ASCII 7-BIT ASCII 7-BIT ASCII
(SEQUENTIAL) LITERAL COPY**
HEX 8-BIT BINARY ENCODED AS ASCII
(PROGRAM) HEX NIBBLES
BINARY 8-BIT BINARY 8-BIT BINARY
(PROGRAM) LITERAL COPY**
* CBM <-> ASCII CONVERSIONS:
BKSLSH/TAB/FF -> CHR$(221/220/219)
ON INPUT; REVERSED ON OUTPUT.
**KERMIT PROTOCOL: QUOTE CTRL CHAR, BUT
NO 8TH-BIT QUOTE OR REPEAT QUOTE. SEQ
FILES: CR INTERNAL, CRLF TRANSMITTED.
( ---
( --- SCREEN # 97 ---
( ---
PRIMARY KERMIT COMMANDS (V1.5)
BYE = LOGOUT FROM A SERVER.
CONNECT = BECOME A DUMB TERMINAL.
DIRECTORY = SHOW 1541 DISK DIRECTORY.
DISK "XX" = SEND COMMAND XX TO 1541
DISK ON CHANNEL 15.
EXIT = RETURN TO BASIC.
GET "XX" = RECEIVE THE FILE XX
FROM A SERVER.
HELP = DISPLAY THESE SCREENS.
NEW "XX" = PREPARE NEW KERMIT DISK.
SAVE KERMIT AS XX.
SEND "XX" = SEND THE FILE NAMED XX.
RECEIVE = RECEIVE THE FILE WITH THE
NAME SPECIFIED BY SENDER.
RECEIVE "XX"= RECEIVE FILE AND STORE
WITH NAME XX.
RESTORE = SET KERMIT PARAMETERS
FROM FILE 'SCR95'.
SAVE = SAVE KERMIT PARAMETERS
IN FILE 'SCR95'.
SET = ALTER KERMIT PARAMETERS.
SHOW = SHOW KERMIT PARAMETERS.
( ---
( --- SCREEN # 98 ---
( ---
TERMINAL INFORMATION (V1.5):
SETUP HOST COMPUTER FOR DUMB TERMINAL
WHICH ACCEPTS BACKSPACE (E.G., ADM3A).
SPECIAL FUNCTION KEYS IN TERMINAL MODE:
DEL => 127 = RUBOUT/DELETE
F1 => 17 = CTRL-Q = DC1 = XON
F3 => 19 = CTRL-S = DC3 = XOFF
F5 => 8 = CTRL-H = BACKSPACE
F7 => 27 = CTRL-] = ESC
F2 => 18 = CTRL-R = DC2
F4 => 20 = CTRL-T = DC4
F6 => 10 = CTRL-J = LF
F8 => KERMIT TERMINAL-ESCAPE CHARACTER
OPTIONS WITH F8: (STRIKE KEY AFTER F8)
F8-U => SET SCREEN TO UPPERCASE MODE
F8-L => SET SCREEN TO LC/UC MODE
F8-B => SEND 'BREAK' TO HOST
F8-C => DISCONNECT, RETURN TO KERMIT
F8-X => SAME AS F8-C
F8-T => SHOW TERMINAL PARAMETERS
F8-S => SHOW KERMIT PARAMETERS
F8-? => SHOW THESE OPTIONS