os9@cbdkc1.UUCP (05/13/87)
OS-9 Discussions Tuesday, May 12th 1987 Volume 3 : Issue 1
Today's Topics:
PDCom.bas for 6809
[Today's package has the single source included. All of the comments
I've received over this past month will be included in issue 2. You
should note that this is coming to you via comp.os.os9. This last
month had a number of changes, including the conversion to spread the
mod groups into their logical heirarchy, cbdkc1 upgraded to a new
version of UNIX (new to it, that is), cbdkc1 upgraded to news 2.11.8,
and our spool directory filled up a couple times. If you don't see
your article included in issue 2, then do please send it to me again!
- JDD ]
--------------------------------------------------------------------------
Date: Thu, 9 Apr 87 17:52:33 EDT
From: mnetor!lsuc!jimomura
Subject: PDCom.bas for 6809
Hi John:
The following is a public domain terminal package written in
BASIC09 for the Color Computer (or any standard OS-9 Level I or II
based on the 6809 processor). It supports XModem downloads and
ASCII send uploads. The purpose of this code is essentially twofold.
First, for people who don't have an OS-9 system and want to buy one
(particularly the new CoCo3 with level II) it provides a quick way
to get online with the view to downloading something a bit better.
If typed in without comments it's actually quite short. This is
particularly true if you just type in the download and main
terminal parts and forgo the upload portion.
The second purpose is to provide source code for people interested
in writing better terminal packages. The code is very strongly
assembly language oriented rather than BASIC oriented, so it's
easy to port this to C or assembly language. We currently have
a few freely usable terminal packages for OS-9, but all seem to
have usage restrictions. Greg Morse's Xcom9 is my current favorite,
but it is Freeware and not properly usable if you want to write
one for yourself (with a view to potential sales). Similarly,
I am aware of a BASIC09 program for CIS users only. This program
is influenced by Xcom9 (particularly in the command structure),
but is completely new source code. As such the routines I've
used can be used by anybody for any purpose.
Cheers! -- Jim O.
PROCEDURE pdcom
0000 (* Public Domain Telecom program *)
0023 (* By Jim Omura, Toronto, Ontario, Canada *)
004F (* Version: 6809 BASIC09 see Version constant below *)
0086
0087 (* Declare Constant and Variable types *)
00B0
00B1 BASE 0
00B3
00B4 TYPE registers=cc,a,b,dp:BYTE; x,y,u:INTEGER \(* Structure *)
00E8 DIM regs:registers
00F1
00F2 DIM bitstrip:BOOLEAN
00F9 DIM blockcntr:BYTE \(* Xmodem *)
010C DIM blockcomp:BYTE \(* Xmodem block No. Complement *)
0134 DIM blocklen:INTEGER \(* Xmodem block length *)
0154 DIM blocknum:REAL \(* Disk blocks *)
016C
016D DIM callcode:BYTE
0174 DIM cr:BYTE \(* Cursor Return *)
018E DIM crossflag:BOOLEAN \(* Set when Download or Upload *)
01B6 DIM casebyte:BYTE
01BD DIM checksum:BYTE \(* For Xmodem *)
01D4 DIM chrpntr:INTEGER
01DB DIM command:STRING[256]
01E7
01E8 DIM datablock:STRING[128] \(* For Xmodem diskfile *)
020D DIM diskfile:BYTE \(* path number for disk file *)
0233 DIM eolflag:BOOLEAN \(* End of line flag for Send routine *)
0261 DIM errorcntr:BYTE \(* For Xmodem timeout *)
0280 DIM exitflag:BOOLEAN \(* Xmodem loop *)
0298 DIM halfduplex:BOOLEAN
029F DIM keyin:STRING
02A6 DIM local_esc:STRING[1]
02B2
02B3 DIM modbuf:STRING[256] \(* General IO Buffer *)
02D6 DIM modbfoffst:INTEGER \(* Offset for pointer to capture buffer *)
0307 DIM modbufpntr:INTEGER
030E DIM modparhldr:STRING[32] \(* Holds original SCF settings *)
033B DIM modpath:BYTE
0342
0343 DIM parpntr:INTEGER \(* Pointer to SCF param. holder *)
036C DIM pathname:STRING[256] \(* Filename for uploads and downloads *)
03A0 DIM schrcntr:INTEGER \(* Send Character counter *)
03C3 DIM schrpntr:INTEGER \(* Send Character pointer *)
03E6 DIM startime:INTEGER \(* For Xmodem timeout *)
0405 DIM timerr:BOOLEAN \(* Timeout error for Xmodem *)
042A DIM timeout:INTEGER \(* For Xmodem timeout *)
0449 DIM transdone:BOOLEAN \(* Transfer finished *)
0467 DIM veriflag:BOOLEAN \(* For Xmodem *)
047E DIM version:STRING[9] \(* PDCom version number *)
04A4 DIM xabort:BOOLEAN
04AB
04AC DIM ack,can,xeof,eot,nak,soh:BYTE \(* Xmodem protocol *)
04DC
04DD (* set constants *)
04F0
04F1 cr=$0D \(* dec 13 *)
0505 local_esc=CHR$($19) \(* Local escape is ^Y *)
0526
0527 ack=$06 \can=$18 \xeof=$1A \eot=$04 \(* Xmodem protocols *)
055D nak=$15 \soh=$01 \(* More Xmodem protocols *)
0588 version="00.03.01"
0597
0598 (* Initialize variables *)
05B2
05B3 bitstrip=TRUE
05B9 crossflag=FALSE
05BF modbufpntr=ADDR(modbuf)
05C9 modbfoffst=0
05D0 parpntr=ADDR(modparhldr)
05DA halfduplex=TRUE
05E0
05E1 (* ****************************************** *)
0611
0612 (* device initialization *)
062D
062E OPEN #modpath,"/t2":UPDATE
063C
063D (* Set Modem path *)
0651 regs.a=modpath
065D regs.b=0 \(* SS.OPT gets current driver settings *)
0691 regs.x=parpntr
069D callcode=$8D \(* I$GtStt *)
06B2 RUN syscall(callcode,regs)
06C1
06C2 FOR modbfoffst=0 TO 31
06D2 POKE modbufpntr+modbfoffst,0
06DE NEXT modbfoffst
06E9
06EA (* Preserve Speed, parity, bits--see PD.PAR.OPT etc.*)
0720 FOR modbfoffst=19 TO 22
0730 POKE modbufpntr+modbfoffst,PEEK(parpntr+modbfoffst)
0742 NEXT modbfoffst
074D
074E regs.x=modbufpntr
075A callcode=$8E \(* I$SetStt *)
0770 RUN syscall(callcode,regs)
077F
0780 PRINT "PDCom v. "; version; " active--Control-Y for Menu."
07B0
07B1 (* -------------------------------------------- *)
07E3
07E4 100 SHELL "tmode -echo"
07F6
07F7 LOOP \(* Terminal IO and capture buffer loop *)
0822 RUN inkey(keyin) \(* Get keyboard input *)
0844 IF keyin<>"" THEN
0850
0851 EXITIF keyin=local_esc THEN \(* Test for ESCape *)
0873 GOTO 900 \(* Tmode echo and menu *)
0890 ENDEXIT
0894
0895 PRINT #modpath,keyin;
08A0 IF halfduplex THEN
08A9 PRINT keyin;
08AF ENDIF \(* Local Echo *)
08C2 ENDIF
08C4
08C5 (* Check for data *)
08D9 regs.a=modpath
08E5 regs.b=1 \(* #SS.RDY -- Is port ready? *)
090F callcode=$8D \(* I$GetStt *)
0925 RUN syscall(callcode,regs)
0934
0935 regs.cc=LAND(regs.cc,1) \(* Carry Set=1 *)
0958
0959 IF regs.cc=0 THEN \(* Get a character *)
097E regs.a=modpath
098A regs.y=1
0995 chrpntr=modbufpntr+modbfoffst
09A1 regs.x=chrpntr
09AD callcode=$89 \(* I$Read *)
09C1 RUN syscall(callcode,regs)
09D0
09D1 (* Bitstrip *)
09DF IF bitstrip THEN
09E8 POKE chrpntr,LAND(PEEK(chrpntr),$7F)
09F6 ENDIF \(* Bit Strip *)
0A08
0A09 (* *** Print out to screen *** *)
0A2A regs.a=0
0A35 regs.x=chrpntr
0A41 callcode=$8A \(* I$Write *)
0A56 RUN syscall(callcode,regs)
0A65 ENDIF \(* End Modem input routine *)
0A84
0A85 ENDLOOP
0A89
0A8A (* ------------------------------------------- *)
0ABB
0ABC 900 SHELL "tmode echo"
0ACD
0ACE 1000 (* Menu Loop *)
0AE0 PRINT "Menu:"
0AE9 PRINT
0AEB PRINT " $ -- pass to system"
0B03 PRINT
0B05 PRINT " b -- bitstrip toggle"
0B1E PRINT " e -- local echo toggle"
0B39 PRINT " q -- quit"
0B47 PRINT " r -- receive a file"
0B5F PRINT " s -- send a file"
0B74 PRINT " t -- terminal"
0B86 PRINT " x -- xmodem"
0B96 PRINT
0B98
0B99 1050 PRINT ">";
0BA2 LOOP
0BA4 RUN inkey(keyin)
0BAE EXITIF keyin<>"" THEN
0BBA PRINT
0BBC ENDEXIT \(* Character received. *)
0BD9 ENDLOOP \(* Wait for character input *)
0BFB
0BFC IF keyin="$" THEN
0C09 INPUT "OS9>",command
0C15 PRINT
0C17 SHELL command \(* Shell doesn't need RUN *)
0C38 PRINT
0C3A ENDIF \(* System Call *)
0C4D
0C4E keyin=CHR$(LAND(ASC(keyin),$5F)) \(* Upper Case Filter *)
0C73
0C74 IF keyin="B" THEN
0C81 bitstrip=NOT(bitstrip)
0C8A IF bitstrip THEN
0C93 PRINT "Bitstrip enable"
0CA6 ELSE
0CAA PRINT "Bitstrip disabled"
0CBF ENDIF \(* Bitstrip off *)
0CD4 ENDIF \(* Bitstrip toggle *)
0CEC
0CED IF keyin="E" THEN
0CFA halfduplex=NOT(halfduplex)
0D03 IF halfduplex THEN
0D0C PRINT "Local Echo enabled"
0D22 ELSE
0D26 PRINT "No Local Echo"
0D37 ENDIF \(* Echo Status Report *)
0D51
0D52 ENDIF \(* Local Echo Toggle *)
0D6B
0D6C IF keyin="Q" THEN
0D79 GOTO 9000
0D7D ENDIF \(* Normal Exit *)
0D90
0D91 IF keyin="R" THEN
0D9E PRINT "Receive buffer not implimented yet."
0DC5 ENDIF
0DC7
0DC8 IF keyin="S" THEN
0DD5 GOTO 2000 \(* ASCII upload support *)
0DF3 ENDIF
0DF5
0DF6 IF keyin="T" THEN
0E03 GOTO 100 \(* returns to Main Loop *)
0E21 ENDIF
0E23
0E24 IF keyin="X" THEN
0E31 GOTO 4000
0E35 ENDIF
0E37
0E38 GOTO 1050
0E3C
0E3D (* ----------------------------------------------- *)
0E72
0E73 2000 (* ASCII Upload Support *)
0E90
0E91 IF crossflag THEN \(* Only 1 path is left open for safety *)
0EC3 CLOSE #diskfile
0EC9 crossflag=FALSE \(* Don't set crossflag ... *)
0EEC (* ... because may not successfully open a file *)
0F1E ENDIF \(* Files open *)
0F31
0F32 ON ERROR GOTO 2900
0F38 INPUT "File name?: ",pathname
0F4C OPEN #diskfile,pathname:READ
0F58 crossflag=TRUE
0F5E PRINT "Sending "; pathname
0F6E ON ERROR \(* Kill error trap *)
0F86
0F87 (* Initialize Local Variables *)
0FA7
0FA8 blocknum=0
0FB0 schrpntr=ADDR(datablock)
0FBA transdone=FALSE
0FC0 xabort=FALSE
0FC6
0FC7 LOOP \(* Send the file *)
0FDC
0FDD (* Get a block from disk *)
0FF8
0FF9 eolflag=FALSE
0FFF schrcntr=0
1006
1007 (* READ #diskfile,datablock -- CR doesn't seem to be stored *)
1045 regs.a=diskfile
1051 regs.x=schrpntr
105D regs.y=128
1068 callcode=$8B \(* I$ReadLn *)
107E RUN syscall(callcode,regs)
108D
108E blocklen=regs.y-1 \(* Cursor Return not sent *)
10B8
10B9 regs.cc=LAND(regs.cc,1) \(* Carry Set *)
10DA
10DB EXITIF regs.cc=1 THEN \(* Might be EOF or a real error *)
110D transdone=TRUE
1113 ENDEXIT
1117
1118 EXITIF xabort THEN
1121 ENDEXIT
1125
1126 LOOP \(* Send Characters *)
113D
113E RUN inkey(keyin)
1148
1149 EXITIF keyin=local_esc THEN \(* Check keyboard for abort *)
1174 xabort=TRUE
117A PRINT "Abort entered"
118B ENDEXIT
118F
1190 IF schrcntr=blocklen THEN \(* Must put here for 0 len record *)
11C1 eolflag=TRUE
11C7 ENDIF \(* End of line *)
11DA
11DB EXITIF eolflag THEN
11E4 ENDEXIT
11E8
11E9 IF keyin<>"" THEN
11F5 PRINT #modpath,keyin;
1200 IF halfduplex THEN
1209 PRINT keyin;
120F ENDIF \(* Local Echo *)
1221 ENDIF \(* Send Keyboard input *)
123D
123E regs.a=modpath \(* Check for incoming data *)
1267 regs.b=1 \(* #SS.RDY *)
127F callcode=$8D \(* I$GetStt *)
1295 RUN syscall(callcode,regs)
12A4 regs.cc=LAND(regs.cc,1) \(* Carry set *)
12C5
12C6 IF regs.cc=0 THEN \(* Get the character *)
12EC regs.a=modpath
12F8 regs.y=1 \(* One character at a time *)
1320 chrpntr=modbufpntr+modbfoffst \(* This isn't really... *)
1346 regs.x=chrpntr \(* necessary unless we impliment ... *)
1379 (* concurrent down & uploads. *)
1399 callcode=$89 \(* I$Read *)
13AD RUN syscall(callcode,regs)
13BC
13BD POKE chrpntr,LAND(PEEK(chrpntr),$7F) \(* Bitstrip always *)
13E0
13E1 regs.a=0 \(* Print character to screen *)
140B regs.x=chrpntr
1417 callcode=$8A \(* I$Write *)
142C RUN syscall(callcode,regs)
143B
143C ELSE \(* No Character waiting *)
145A
145B (* Get a Character from disk buffer *)
1481
1482 chrpntr=schrcntr+schrpntr
148E
148F
1490 (* Send it to modem *)
14A6 regs.a=modpath
14B2 regs.y=1
14BD regs.x=chrpntr
14C9 callcode=$8A \(* I$Write *)
14DE RUN syscall(callcode,regs)
14ED
14EE IF halfduplex THEN \(* local echo *)
1507 (* print character locally *)
1524 regs.a=0 \(* Standard output *)
1544 RUN syscall(callcode,regs)
1553 ENDIF \(* local echo *)
1565
1566 schrcntr=schrcntr+1 \(* Inc. the counter *)
1587
1588 ENDIF \(* Character waiting *)
15A1
15A2 ENDLOOP \(* Send Characters *)
15BB
15BC PRINT #modpath,CHR$(cr); \(* Send End of Line character *)
15E8
15E9 LOOP \(* Wait for CR from receiver *)
160B
160C EXITIF NOT(eolflag) THEN
1616 ENDEXIT
161A
161B EXITIF xabort THEN
1624 ENDEXIT
1628
1629 regs.a=modpath \(* Check for incoming data *)
1652 regs.b=1
165D callcode=$8D \(* I$GetStt *)
1673 RUN syscall(callcode,regs)
1682 regs.cc=LAND(regs.cc,1)
1694
1695 IF regs.cc=0 THEN \(* Characters waiting *)
16BD
16BE regs.y=1
16C9 chrpntr=modbufpntr+modbfoffst
16D5 regs.x=chrpntr
16E1 callcode=$89 \(* I$Read *)
16F5 RUN syscall(callcode,regs)
1704
1705 POKE chrpntr,LAND(PEEK(chrpntr),$7F) \(* Bitstrip *)
1721
1722 IF PEEK(chrpntr)=cr THEN \(* EOL returned *)
1743 eolflag=FALSE \(* Clear the EOL flag to exit loop *)
176E PRINT CHR$(cr);
1775 ELSE
1779 regs.a=0 \(* Print to Screen *)
1799 regs.x=chrpntr
17A5 callcode=$8A \(* I$Write *)
17BA RUN syscall(callcode,regs)
17C9 ENDIF \(* Characters waiting *)
17E4 ENDIF \(* Modem Char. waiting *)
1800
1801 RUN inkey(keyin)
180B IF keyin=local_esc THEN
1818 xabort=TRUE
181E PRINT
1820 PRINT "Abort entered"
1831 ELSE
1835 PRINT #modpath,keyin;
1840 IF halfduplex THEN
1849 PRINT keyin;
184F ENDIF \(* Local Echo *)
1861 ENDIF \(* Local Escape *)
1876 (* Put timer here *)
188A
188B ENDLOOP \(* Wait for CR from receiver *)
18AE
18AF ENDLOOP \(* Send the file *)
18C6
18C7 CLOSE #diskfile \(* Close the file *)
18E1 crossflag=FALSE
18E7
18E8 GOTO 1000
18EC
18ED (* ----------------------------------------------- *)
1922
1923 2900 (* Error Handler for 'S'end *)
1944
1945 PRINT "Cannot open "; pathname
1959 GOTO 1000
195D
195E (* ----------------------------------------------- *)
1993
1994 4000 (* XModem Support Subroutine *)
19B6
19B7 PRINT "Xmodem download only"
19CF INPUT "continue (y/n)?: ",keyin
19E8
19E9 IF keyin="N" OR keyin="n" THEN
19FE GOTO 1000 \(* Abort Xmodem *)
1A14 ENDIF
1A16
1A17 (* open diskfile *)
1A2A
1A2B IF crossflag THEN \(* Only 1 path is left open for safety *)
1A5D CLOSE #diskfile
1A63 crossflag=FALSE \(* Don't set crossflag ... *)
1A86 (* ... because may not successfully open a file *)
1AB8 ENDIF \(* Files open *)
1ACB
1ACC ON ERROR GOTO 5000
1AD2 INPUT "File name?: ",pathname
1AE6 PRINT "Creating "; pathname
1AF7 CREATE #diskfile,pathname:UPDATE
1B03 ON ERROR \(* Kill error trap *)
1B1B crossflag=TRUE
1B21
1B22 (* Initialize Local Variables *)
1B42
1B43 blockcntr=0
1B4A blocklen=132 \(* Only 128 databyte block supported *)
1B78 blocknum=0
1B80 errorcntr=0
1B87 transdone=FALSE
1B8D xabort=FALSE
1B93
1B94 PRINT #modpath,CHR$(nak); \(* Signal ready to receive *)
1BBD
1BBE LOOP \(* Receive Blocks *)
1BD4
1BD5 EXITIF xabort THEN
1BDE PRINT "Xmodem Aborted"
1BF0 ENDEXIT
1BF4
1BF5 EXITIF errorcntr>9 THEN
1C01 xabort=TRUE
1C07 PRINT "Too Many Errors"
1C1A ENDEXIT \(* Too Many Errors *)
1C33
1C34 EXITIF transdone THEN
1C3D PRINT "Xmodem Transfer Successful"
1C5B ENDEXIT
1C5F
1C60 blockcntr=blockcntr+1 \(* First Block is 1--not 0 *)
1C88 blocknum=blocknum+1
1C94 modbfoffst=0 \(* Clear Data Buffer Offset Value *)
1CBF timerr=FALSE
1CC5
1CC6 LOOP \(* Receive a Block *)
1CDD
1CDE EXITIF xabort THEN
1CE7 ENDEXIT
1CEB
1CEC EXITIF timerr THEN
1CF5 ENDEXIT
1CF9
1CFA EXITIF modbfoffst>131 THEN
1D06 (* Regular Exit -- block received *)
1D2A ENDEXIT \(* Regular Exit *)
1D41
1D42 EXITIF transdone THEN
1D4B (* Regular Exit -- Transmission completed *)
1D77 ENDEXIT \(* Transdone at Block Receive Level *)
1DA1
1DA2 startime=VAL(RIGHT$(DATE$,2)) \(* Set Start of Timeout *)
1DC7 chrpntr=modbufpntr+modbfoffst
1DD3 exitflag=FALSE \(* Clear Exitflag *)
1DED
1DEE LOOP \(* Get Character *)
1E03
1E04 EXITIF exitflag THEN
1E0D ENDEXIT
1E11
1E12 regs.a=modpath \(* Test for Data Ready *)
1E37 regs.b=1 \(* #SS.RDY *)
1E4F callcode=$8D \(* I$GetStt *)
1E65 RUN syscall(callcode,regs)
1E74 regs.cc=LAND(regs.cc,1) \(* carry set *)
1E95
1E96 IF regs.cc=0 THEN
1EA5
1EA6 regs.a=modpath \(* Get the Character *)
1EC9 regs.y=1
1ED4 regs.x=chrpntr
1EE0 callcode=$89 \(* I$Read *)
1EF4 RUN syscall(callcode,regs)
1F03
1F04 exitflag=TRUE
1F0A
1F0B IF modbfoffst=0 THEN \(* First Character *)
1F2D
1F2E IF PEEK(chrpntr)=eot THEN \(* Crossload done? *)
1F51 PRINT #modpath,CHR$(ack);
1F5D transdone=TRUE
1F63 ENDIF \(* Crossload done *)
1F79
1F7A IF PEEK(chrpntr)=can THEN \(* Crossload Abort *)
1F9D PRINT "Abort Character Received"
1FB9 xabort=TRUE
1FBF ENDIF \(* Crossload abort error *)
1FDC
1FDD IF PEEK(chrpntr)<>1 THEN \(* Re-synch *)
1FF8 modbufoffst=modbufoffst-1 \(* Ignore Character *)
201A ENDIF \(* Re-synch *)
202A
202B ENDIF \(* first character *)
2042
2043 modbfoffst=modbfoffst+1
204E
204F ELSE \(* No Character ready *)
206C timeout=VAL(RIGHT$(DATE$,2))
2077
2078 IF startime>timeout THEN \(* Correct for modulo wrap *)
20A2 timeout=timeout+60
20AD ENDIF \(* Correction for modulo 60 seconds per minute *)
20E0
20E1 IF timeout-startime>20 THEN \(* Timeout exceeded *)
2107 PRINT "Timeout ";
2114 timerr=TRUE
211A exitflag=TRUE
2120 ENDIF \(* Timeout exceeded *)
2139 ENDIF \(* Character ready condition *)
215B
215C ENDLOOP \(* Get Character *)
2173
2174 ENDLOOP \(* Receive a Block *)
218D
218E (* Buffer test and save *)
21A8
21A9 IF transdone THEN
21B2 (* Skip Disk Save--no data *)
21CF ELSE
21D3
21D4 veriflag=TRUE \(* Initialize Verify flag *)
21F6
21F7 IF xabort THEN
2200 veriflag=FALSE
2206 GOTO 4050
220A ENDIF \(* Xabort at disk save *)
2225
2226 IF timerr THEN
222F veriflag=FALSE
2235 GOTO 4050
2239 ENDIF \(* Time out error *)
224F
2250 IF blockcntr<>PEEK(modbufpntr+1) THEN
2261 veriflag=FALSE
2267 PRINT "Blkcntr ";
2274 ENDIF \(* Block number error *)
228E
228F blockcomp=255-blockcntr \(* 1's complement of Block No. *)
22BB
22BC IF blockcomp<>PEEK(modbufpntr+2) THEN
22CD veriflag=FALSE
22D3 PRINT "Blkcomp ";
22E0 ENDIF \(* Block Complement error *)
22FE
22FF (* calc. Checksum *)
2313 checksum=0
231A FOR chrpntr=modbufpntr+3 TO modbufpntr+130
2332 checksum=checksum+PEEK(chrpntr)
233F NEXT chrpntr
234A
234B IF checksum<>PEEK(modbufpntr+131) THEN
235C veriflag=FALSE
2362 PRINT "Chksm ";
236D ENDIF \(* Checksum error *)
2383
2384 4050 IF veriflag THEN \(* Block Verified? *)
23A5 SEEK #diskfile,(blocknum-1)*128 \(* Save the Block *)
23CB datablock=MID$(modbuf,4,128)
23D8 PUT #diskfile,datablock
23E2 PRINT "Received Block "; blocknum
23F9 errorcntr=0 \(* Reset Error Counter *)
2419 PRINT #modpath,CHR$(ack);
2425 ELSE \(* Block not OK *)
243B blockcntr=blockcntr-1 \(* Must start this block over *)
2466 blocknum=blocknum-1
2472 errorcntr=errorcntr+1
247D PRINT "Error #"; errorcntr
248C IF xabort THEN \(* Signal abort or repeat *)
24B1 PRINT #modpath,CHR$(can);
24BD ELSE
24C1 PRINT #modpath,CHR$(nak);
24CD ENDIF \(* Signal Abort or Repeat *)
24EB ENDIF \(* Block verified *)
2501
2502 ENDIF \(* Transdone condition *)
251D
251E ENDLOOP \(* Receive Blocks *)
2536
2537 CLOSE #diskfile
253D GOTO 1000 \(* Return to Main Menu *)
255A
255B
255C (* ----------------------------------------------------- *)
2597
2598 (* *** Error Handler *** *)
25B3 (* for XModem file Open *)
25CD
25CE 5000 PRINT "file exist"
25DF GOTO 1000 \(* Returns to Main Menu *)
25FD
25FE (* **************************************************** *)
2638
2639 (* Normal Exit *)
264A
264B (* Close off Devices *)
2662
2663 9000 CLOSE #modpath
266C
266D SHELL "tmode echo"
267B
267C END
267E
267F (* *************************************************** *)
-------------------------------------
The views expressed in OS-9 Discussions are those of the individual authors
only. Copies of digests are available by mail request.
------
Moderator: John Daleske cbosgd!cbdkc1!daleske daleske@cbdkc1.ATT.COM
Submissions should go to: cbosgd!os9 os9@cbosgd.ATT.COM
Comments to the moderator cbosgd!os9-request os9-request@cbosgd.ATT.COM
*********************
End of OS-9 Discussions
*********************