@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@P!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `8  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D8:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D8:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu } 3E:}DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDG*}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRES+}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N',}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.0s, type Y Λx -}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECT.} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DL/}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD0}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.1}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC2}COPY--FROM, TO?OPTION NOT ALLOWED697 FREE SECTORS COPYING---D8:COPY32.COMl# 0|D .L/%#3}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY4}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E 5}1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A6}LLOWED IN DESTINATION 0 <.|K}N 2 FORMAT. t* 5) 1L!`) 0NΞ 0 L1) 1 L!BAD LOAD FILELOAD FROM WHAT FILE?) 0 ?}0#B 1L!WHAT FILE TO LOCK?) 0 0$B 1L!WHAT FILE TO UNLOCK?DUP DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO US@}E PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV.FE! +L1   `*  70 2 2A} 0.* 1 y0 0)INSERT BOTH DISKS, TYPE RETURN^, 1 y038逍 N, 1L! ,B}C, t*  Lx+, 0 ^, 1 y0 , ,0,0 ,L+ ,I0 ,Vǭ0C}Ξ, 0 }, 1 y0C,ШC, 0K'!" H H 'h h Lx+!EF 5L1L!D,I,HhD}` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNINSERT DESTINATION DISK,TYPE RETURNE}`  `8 rL1`-* 1P* 1 y0Y`hhL!NAME OF FILE TO MOVE?- 0 0|DL% <.F},^ 1 70 0 .@L# .BJ 1  DEHIB V L1 ,} 1 70,L.  G}JB|,#P#DE 1 HI BDEHHII 1 B 1 ,^ 1 70,0La- B V,#PH},^ 1 70 0L#L!-* 1P* 1 y0Yj383}mm ݭI}}`8}``|* ? ɛ,`|:-)| / 1L!`DESTINATION CANT BE DOJ}S.SYS0 0H{ 24Δ 28/L!/) 2 Π 2 0 ξK}hAΞB,0 J 1 BDEHI,HÝDE 1HIHIDELSAVE-GIVE L}FILE,START,END(,INIT,RUN)O S0 1`BDEPHI V` S0H 1 L!M}0 0 1L~0`PLEASE TYPE 1 LETTER,0`hhL! 70 1L0L<1 ,;ɛ7,"ɛ:ݦ1ݥN}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{NAMEO} TOO LONG B VL!` L1I H1EΝDL1|mDiE` V0`8d/8 i:222 1 LP}!ERROR- 164ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uR} ECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8u05  15 2 2151^116115ύ011$r2ԭ5 3)5)5ԭx GT}@@L00)+& 2 L0=ɛ -L!1LV1L1 /3 3ȹ441L-4 v3 25 2H 2h͔5U}L3L3 2 k3U hh`DOC`QL3P1Lk0S1H /3h0B k3@ VL0LU!#$53 1181118V}1111Ε5 1Lk0552 1Ȍ1i111i11115Lk0pppB4f5&&&&&&&&^6f^6&&&&&W}&&A1@BJ D2ELVK@BHILV^Щ6 2BD2EJ VBD5EHI0 V0%5X}5 2iХiL[2 25 25`D:*.*` i@`8 ``@i `8@`0 BLV525<4Y}5`HH i ԍΗ552 ԍhh@ Lح1Э1Ѣ 24.4 24Z}4`D4E` 2BJ k3LVRH` 2BD4EhK)I JLV333 BASIC languag i}e OBJ > MACHINE language DOC > DOCumentation PIC|MIC|FNT|MVM > Graphics AMS|MUS|MBD > Music LST j} > BASIC LISTing -Some MACHINE language programs can only be run by booting the disk MENU "without" BASIC! -For s k}ome programs, XL/XE models may require a "TRANSLATOR" program to be booted first! [Also available from BELLCOM] - l}Most programs are relatively self-explanatory; however, some have separate DOCumentation files available. Some BASIC m} programs may contain instructions in their program listings. -To use this great MENU program on your own disks, n}simply copy the file "AUTORUN.SYS" onto your disk. * MENU written by DAVID CASTELL * program on your own disks, ^ DOCumentaion for SNAPSHOT V0.1====================================================================== SNAPSHOTp} (C) 1990 by Tom Hunt======================================================================SNAPSHOT: The fanq}tastic newjuggler/switcher program for AtariXL/XE home computers.Requirements: A standard 130XE------------ r} OR XL/XE with 256k RAM. SNAPSHOT is fully compatible with the Ras}mbo RAM upgrade from ICD.Synopsis: SNAPSHOT allows you to-------- have two virtual computer systet}ms in your Atari 8-bit computer at one time.NOTICE: You are using this at yourown risk. Every attempt u}has beenmade to assure the functionality ofthis software. However, SNAPSHOThas only been used with a verynarrow range of v}both hardware andsoftware. Unpredictable results mayoccur resulting in the loss ofdata. Remember to ... ***************w}*************** * Always make a backup copy! * ******************************Send comments, suggestions,complaints, anx}d bug reports to theBBS listed in this documentationfile. If you have a problem withSNAPSHOT, be sure to include thefolloy}wing information: Computerused, memory upgrade used, softwareand type of dos used, peripheralsused, and any other info youz} mightthink useful in diagnosing theproblem.Restrictions: This software may NOT------------ be sold. It may be {} freely distributed as long as this documentation file accompanies the |} software.___________________________________ WHAT IS SNAPSHOT? -----------------Ever wish you}} had instantaneousaccess to a certain utility, wordprocessor, or DOS while runninganother program or DOS? Now youcan, usi~}ng SNAPSHOT.With SNAPSHOT loaded, by simplypressing Shift-Control-1 (i.e.pressing all three keys at once)you can witch }between twodifferent applications in just afew micro-seconds. This is idealfor BBS operators who want to havea program li}ke TextPro available ina moments time, and then switchback to their BBS. And you can dothis without taking the BBS down!}You actually have two virtualcomputers residing in the samesystem at the same time! You arelimited only by your imaginatio}nand the RAM size of your machine.Well, not really. There are a fewlimitations to SNAPSHOT.You will probably run across }someprograms that are incompatible withSNAPSHOT. These incompatabilityproblems will probably be lessenedwith subsequent r}eleases ofSNAPSHOT. The way to be sure thatyou are using the most recentversion of SNAPSHOT is to call theCloser To Home }BBS at 419-368-4413.This is the official support BBSfor SNAPSHOT.Any questions, comments, andsuggestions concerning SNAP}SHOT arewelcome. Just send them to theSysop there (me), and I'll be sureand give you a speedy reply.___________________}________________ DIRECTIONS FOR USE OF SNAPSHOT ------------------------------First format a blank disk and thenplac}e on it the DOS of your choice(Atari DOS 2.5, MyDOS 4.5 or SpartaDOS 3.2). Then copy the files"SNAPSHOT.COM" and "SOFTBOOT}.COM"onto your new disk. This will nowbe your SNAPSHOT working disk.After placing your SNAPSHOT disk inyour drive and bo}oting DOS (withoutBASIC), just load SNAPSHOT as youwould any other normal .COM file.You will see a short messageprinted t}elling you that SNAPSHOThas installed itself.You are now looking at the first oftwo virtual systems living in yourcomput}er! Now, load something newin, like your favorite utility.When you have done this, replaceyour SNAPSHOT disk in your drive}and press and hold [Shift-Control-1](press all three keys at the sametime) until you hear a buzzingsound coming from your} speaker.This buzz is made by SNAPSHOT tolet you know that it has acceptedyour request to switch to thesecond system. Whe}n you hear thisbuzz, release the keys you arepressing or SNAPSHOT may instantlyswitch back to the first system.After thi}s you will be looking atthe second system's screen. Itlooks just like the same screen yousaw right after loading SNAPSHOT.}This is because SNAPSHOT made asnapshot of the computer memory(process image) and the cpu image,and has now brought it in}to theforeground.Load in another program into thesecond system. From now on all youhave to do to switch between thetwo }virtual systems is press andhold Shift-Control-1.Note: SNAPSHOT may hang up if youuse Sparta's BASIC ON or BASIC OFFcomm}ands. This should be no problemsince all you have to do is hitreset to get control back again.SNAPSHOT should still be the}re, andso should the second process.___________________________________ FIXES AND ENHANCEMENTS ----------}------------Ver. 0.5 / 1-3-90I fixed SNAPSHOT to work with AtariDOS 2.5. I haven't had the chanceto test it out on ot}her DOS' yet.Also, I've incluced "SOFTBOOT.COM"in the beta tester's package."SOFTBOOT.COM" allows you to havetwo differe}nt DOS' in the computerat once! Directions for it's useare as follows:1- Boot Atari DOS 2.5 without BASIC and without }RAMDISK.COM, or the MEM.SAV file on the disk.2- Load SNAPSHOT.COM from the DOS menu using option L.3- Initialize th}e second SNAPSHOT with a Shift-Control-1.4- Load SOFTBOOT.COM from the DOS menu using option L.5- Then Softboot ask}s you to put the new DOS disk you want booted from into the drive and hit RETURN. What could be simpler? I'm work}ing on making it more flexible.Also, I added a second EASIER wayto switch between snapshots inaddition to the Shift-Co}ntrol-1 keycombo. You may also use the [HELP]consol key to do this!Ver.1.0This latest version is now fullycompatable} with MyDos 4.5, AtariDos 2.5, and Sparta Dos 3.2. Byusing SOFTBOOT.COM you will be ableto have one of the Infocom gamesr}unning in one snapshot. I'vetested Cutthroads and Hitchhiker'sGuide to the Galaxy with noproblems. SNAPSHOT is "somewhat"}compatable with Atari BASIC(experimentation is required here),but not Turbo Basic. It also worksfine with TextPro.With t}he release of version 1.0,I'm placing it into the hands ofthe general public. There's stillwork that needs to be done toS}NAPSHOT, but I feel that it issomething that the general Ataricomputing public will find useful.Special thanks to my beta }testers(you know who you are). Keepdropping in on the bbs and givingme your suggestions._______________________________}____ THE FUTURE ----------Watch for future developments andenhancements to SNAPSHOT. I'll bewor}king to make SNAPSHOT compatiblewith as much software as possible. Tom Hunt } 01/01/90___________________________________ SHAREWARE ---------If you use and enjoy SN}APSHOT, andare feeling generous, why not dropa buck in an envelope and mail itto: Tom Hunt 1704 Tw}p.Rd.65 Jeromesville, OH USA 44840A dollar isn't much. But since thisis shareware, what the heck? An}d ifyou are feeling even more generous,please jot down on a note tellingme what software you are usingSNAPSHOT with, and }how it benefitsyou.___________________________________ FINALLY -------FOR THOSE WHO ARE M}ORE EXPERIENCEDIN PROGRAMMING, If you find thatneither the Shift-Control-1 or theHELP key works right with a certainappli}cation, here is a suggestionon what you can do. We are going topatch SNAPSHOT.DO NOT ATTEMPT THIS PROCEDURE ONYOUR ONLY }COPY OF SNAPSHOT. Yourisk damage to not only theprogram, but you could also damagethe integrity of the disk itself!Anywa}y, load up your file/sectoreditor, and look for this in thedisassembly- CMP #223That's the hardware value }ofShift-Control-1. Change it to anyvalue that you feel would work goodwith your application.____________________________}_______-Control-1. Change it to anyvalue that you feel would work goodwith your application.____________________________0 B/DEHI V`   }  (C) 1990 by Tom Hunt    |  Find suppo}rt  |  |   |  |   |  |  |  |} call the |  |^^^^^^^^^^^^^^^^^^^^^^^^^^|     | |}  | Ӡ |  | |  | |  | }󭭷 | Home | | Home of  of  MTOS, The Works, The WorksXE }  Snapshot ح   ޅ  L}Ө)xLcөXhhh@$%)Ӡ L` `L-} Snapshot V1.0 installed B D}E!HI V$%b$%`xԭӍ)ӭƓǓ$%ȓɓhhhhhh H HHHHH  }ޅ   @Ȁˀˀɀ  ӽ@)ӽ@Øf@ ӭÝ@ ɀо @}*--ɀccDGXԮȓLc^Щé ҭLةíÍ ú}ÚúÚØ鍩@© Ӣ@Ø@Ý­@֩@!Í-Í4ÍBé ӭ ӽ}@)ӽ@Ø@ ӭÝ@!-4BíBɀоuÍ_Гé@yÍé ӽ@Ø@Ýuyí}֩Íýêý L ` _Гé@yÍé ӽ@Ø@Ýuyí=R@   Y`R@   Y`΀0!@i   Y`}L} FMS INITIALIZER (C) 1990 Tom Hunt BzDEDHI VL BߝDE}HI VL8Have two file maintenance systems in memory at once! BDE6HI VL[ BYDE}HI VL For use with Snapshot. B|DEHI VL BDEHI VL%NOTE: Boot }Atari DOS first, run and initialize Snapshot, THEN BߝDEFHI VL use this utility to boo}t a different disk. BFDE= 128 THEN PRINTF("Disk I/O error %B%E", E}RRORNUM) FI FI RETURN PROC MICRODOS() BYTE cmd STRING fspec(21) PUT(125) DO PRINTE("Micro-DOS:")} PRINTE(" A - Disk Directory") PRINTE(" D - Delete File") PRINTE(" F - Lock File") PRINTE(" G - Unlock File")} PRINTE(" I - Format Diskette") PRINTE(" Q - Quit (back to main menu)") PRINTF("%ECommand -> ") DO cmd }= GetD(1) cmd = ToUpper(cmd) UNTIL INSET(CMD, "ADFGIQ") > 0 OD PUT(CMD) IF cmd = 'Q THEN } PUTE() RETURN FI PRINTF("%EFile spec -> ") InputMD(0, fspec, 20) DoDos(cmd, fspec) OD ; SAVE }PARAMETERS PROC SaveParams() ERRORNUM = 0 OPEN(3, PARAMFILE, 8, 0) IF ERRORNUM < 128 THEN ;Can write PU}TD(3, BACKS) PUTD(3, BAUD) PUTD(3, DISKN) PUTD(3, DEBUG) PUTD(3, IMAGE) PUTD(3, LOCALECHO) PUTD(3, LM}ARGN) PUTD(3, PARITY) PUTD(3, DNUM) PUTD(3, dial) FI CLOSE(3) RETURN ;RESTORE PARAMETERS PROC Restore}Params() CARD TEMP CLOSE(3) ERRORNUM = 0 OPEN(3, PARAMFILE, 4, 0) IF ERRORNUM >= 128 THEN ;Defaults P}RINTF("Couldn't open %S; error %D%E", PARAMFILE, ERRORNUM) BACKS = 127 ;RUB OUT baud = 0 ;}300 baud DISKN = 1 ;D1: debug = 0 ;debug off IMAGE = 0 ;TEXT localecho = 0 } ;full LMARGN = 2 ;2 CHARS PARITY = 0 ;NO PARITY DNUM = 1 ;PORT 1 dial =} 0 ;Pulse ELSE BACKS = GETD(3) BAUD = GETD(3) DISKN = GETD(3) DEBUG = GETD(3) IMAGE = GETD(}3) LOCALECHO = GETD(3) LMARGN = GETD(3) PARITY = GETD(3) DNUM = GETD(3) DIAL = GETD(3) FI CLOSE(3) }RETURN ;SET PARAMETERS PROC Params() BYTE cmd STRING ts DO Put(125) PRINTE("Parameters are:") IF }BACKS = 8 THEN TS = "control-H" ELSE TS = "rub out" FI PRINTF(" A - Back S sends (%S)%E", ts) }ts = DecodeBaud(baud) PRINTF(" B - Baud rate (%S)%E", TS) IF IMAGE = 0 THEN ts = "text" ElSE }ts = "binary" FI PRINTF(" D - Default disk drive (D%D:)%E", diskn) PRINTF(" F - File type (%S)%E", } ts) PRINTF(" I - I/O Port (%D)%E", DNUM) IF dial = 0 THEN ts = "pulse" ELSE ts = "tone" } FI PRINTF(" T - Dialing method (%S)%E", ts) ts = DecodeFlag(localecho) PRINTF(" L - Local-Echo (%S)%E"}, ts) PRINTF(" M - Margin (%D)%E", LMARGN) IF PARITY = 0 THEN TS = "none" ELSEIF PARITY = 1 THE}N TS = "odd" ELSEIF PARITY = 2 THEN TS = "even" ELSEIF PARITY = 3 THEN TS = "on" FI PRINTF(}" P - Parity (%S)%E", ts) PRINTE("^S - Save parameters") PRINTE("^R - Restore paramters") ts = DecodeFlag}(debug) PRINTF(" * - Debug Mode (%S)%E", ts) PRINTF(" Q - Quit (back to Commands)%E") PRINTF("Parameter} to change -> ") cmd = GetD(1) cmd = ToUpper(cmd) IF IsAlpha(cmd) <> 0 THEN Put(cmd) FI IF CMD = }'A THEN ;BACK S IF BACKS = 8 THEN BACKS = 127 ELSE BACKS = 8 FI ELSEIF cmd = 'B T}HEN ;Baud-rate baud ==+ 1 IF baud > 6 THEN baud = 0 FI ELSEIF cmd = 'D THEN ;Disk number diskn ==+ 1} IF diskn > 4 THEN diskn = 1 FI ELSEIF cmd = '* THEN ;Debug debug = 1-debug ELSEIF cmd = 'Q THEN ;Quit} PRINTF("uit%E") RETURN ELSEIF cmd = 'F THEN ;File type IMAGE = 1-IMAGE ELSEIF cmd = 'L THEN ;l}ocal-echo localecho ==+ 1 IF localecho > 1 THEN LOCALECHO = 0 FI ELSEIF cmd = 'T THEN ;dialin}g DIAL ==+ 1 IF DIAL > 1 THEN DIAL = 0 FI ELSEIF CMD = 'M THEN ;Margin LMARGN ==+ 1 } IF LMARGN > 2 THEN LMARGN = 0 FI ELSEIF CMD = 'P THEN ;PARITY PARITY ==+ 1 IF PARITY > 3 T}HEN PARITY = 0 FI ELSEIF cmd = 'I THEN ;Port # dnum ==+ 1 IF dnum > 4 THEN dnum = 1 FI }ELSEIF cmd = 'S-'@ THEN ;Save Parameters PRINTE("Saving") SAVEPARAMS() ELSEIF cmd = 'R-'@ THEN ;Restore par}ameters PRINTE("Restoring") RESTOREPARAMS() ELSE PUT(253) FI OD PROC Main() BYTE cmd, F}LAG, I, BANK = $D500 BANK = 0 ;SETUP MY ERROR ROUTINE ERROR = MERROR EOLN = CR QUOTE = MYQUOTE PAD = 0 PA}DCHAR = 0 HOST = FALSE FOR I = 1 TO 7 DO CLOSE(I) OD PRINTE("Kermit for the Atari Home Computer") PRINTE("v}1.2 (c) 1984 John Howard Palevich") MODEMINIT() PRINTE("- Feel free to copy this program -") RestoreParams() PRINTE("}Opening RS232 device") Open(1, "K:", 4, 0) IF OPENR() <> 0 THEN PRINTE("PRESS ANY KEY TO EXIT") CH = $FF WHIL}E CH = $FF DO OD CH = $FF ELSE PRINTE("RS232 opened") STOPR() DO PRINTF("%E%ECommands are:%E") }PRINTE(" A - Auto-dial (then connect)") PRINTE(" C - Connect (to remote computer)") PRINTE(" D - Micro-DOS") } PRINTE(" F - Finish (remote server mode)") PRINTE(" H - Hang up (the phone)") PRINTE(" P - Parameters (inspect }and change)") PRINTE(" R - Receive (a file)") PRINTE(" S - Send (a file)") PRINTF(" Q - Quit (back to DOS)%}E%E") PRINTF("Command -> ") DO cmd = GetD(1) cmd = ToUpper(cmd) UNTIL INSET(CMD, "ACDFHPRSQ}") <> 0 OD Put(cmd) IF CMD = 'A THEN ;Auto-dial PRINTE("uto-dial") IF EditDial() }= 1 THEN TTYMODE() FI ELSEIF cmd = 'C THEN ;connect PRINTE("onnect") TTYMODE()} ELSEIF cmd = 'F THEN ;Finish PRINTE("inish") Finish() ELSEIF cmd = 'H THEN ;Hang up }the phone PRINTE("ang up") HangUp() ELSEIF cmd = 'D THEN ;MICRO-DOS PRINTE("os") MICR}ODOS() ELSEIF cmd = 'Q THEN ;Quit PRINTE("uit") EXIT ELSEIF cmd = 'P THEN ;Parameters } PRINTE("arameters") Params() ELSEIF cmd = 'S THEN ;Send PRINTE("end") SENDSW() ELSEI}F cmd = 'R THEN ;Recieve PRINTE("ecieve") RECSW() FI OD CLOSER() FI CLOSE(1) RETURN ;}--- END OF D:KMENU.ACT ---;D:KPRO.ACT; KERMIT protocol section ; RInit();; Receive Initialization BYTE FUNC RINIT(STRING FSPEC) INT LEN, NUM, }T IF DEBUG = 1 THEN PRINTE("RInit") FI NUMTRY ==+ 1 IF NUMTRY > MAXTRY THEN RETURN('A) FI IF FSPEC(0)} > 0 THEN FOR T = 1 TO FSPEC(0) DO PACKET(T-1) = FSPEC(T) OD SPACK('R, 0, T-1, PACKET) FI T = RPA}CK(@LEN, @NUM, PACKET) IF T = 'S THEN RPAR(PACKET) SPAR(PACKET) SPACK('Y, N, 6, PACKET) OLDTRY = NUMTRY } NUMTRY = 0 N = (N + 1) MOD 64 RETURN('F) ELSEIF T = FALSE THEN RETURN(STATE) ELSE RETURN('A) FI ; RFil}e();; Receive File Header BYTE FUNC RFile() INT LEN, NUM, T BYTE W IF DEBUG = 1 THEN PRINTF("RFile%E") FI } NUMTRY ==+ 1 IF NUMTRY > MAXTRY THEN RETURN('A) FI T = RPACK(@LEN, @NUM, PACKET+1) PACKET(0) = LEN IF T = 'S} THEN OLDTRY ==+ 1 IF OLDTRY > MAXTRY THEN RETURN('A) FI IF (N = 0 AND NUM = 63) OR (N <> 0 AND NUM = N-1)} THEN SPACK('Y, NUM, 0, 0) NUMTRY = 0 RETURN(STATE) ELSE RETURN('A) FI ELSEIF T = 'F T}HEN IF NUM <> N THEN RETURN('A) FI STOPR() NORMALIZE(PACKET) ERRORNUM = 0 OPEN(3, PACKET, 8, 0) START}R() IF ERRORNUM >= 128 THEN PRINTF("Couldn't create %S; error %D%E", PACKET, ERRORNUM) RETURN('A)} FI PRINTF("Receiving %S%E", PACKET) SPACK('Y, N, 0, 0) OLDTRY = NUMTRY NUMTRY = 0 N = (N+1) MO }D 64 RETURN('D) ELSEIF T = 'B THEN IF NUM <> N THEN RETURN('A) FI SPACK('Y, N, 0, 0) ;WAIT 1 SECOND FOR A }CK TO DRAIN W = RTCLOCK+60 WHILE W <> RTCLOCK DO OD RETURN('C) ELSEIF T = FALSE THEN RETURN(STATE) ELSE RET }URN('A) FI ; RData();; Receive Data BYTE FUNC RData() INT NUM, LEN, T IF DEBUG = 1 THEN PRINTF("RData%E") } FI NUMTRY ==+ 1 IF NUMTRY > MAXTRY THEN RETURN('A) FI T = RPACK(@LEN, @NUM, PACKET) IF T = 'D THEN I }F NUM <> N THEN OLDTRY ==+ 1 IF OLDTRY > MAXTRY THEN RETURN('A) FI IF (N = 0 AND NUM = 63) OR (}N <> 0 AND NUM = N-1) THEN SPACK('Y, NUM, 0, 0) NUMTRY = 0 RETURN(STATE) ELSE RET}URN('A) FI FI BUFEMP(PACKET, LEN) SPACK('Y, N, 0, 0) OLDTRY = NUMTRY NUMTRY = 0 N = (N+1) MOD} 64 RETURN('D) ELSEIF T = 'F THEN OLDTRY ==+ 1 IF OLDTRY > MAXTRY THEN RETURN('A) FI IF (N = 0 }AND NUM = 63) OR (N <> 0 AND NUM = N-1) THEN SPACK('Y, NUM, 0, 0) NUMTRY = 0 RETURN(STATE) EL}SE RETURN('A) FI ELSEIF T = 'Z THEN IF NUM <> N THEN RETURN('A) FI IF DEBUG = 1 THEN PRINTE("End-}of-File") FI STOPR() CLOSE(3) STARTR() SPACK('Y, N, 0, 0) N = (N+1) MOD 64 RETURN('F) ELSEIF }T = FALSE THEN RETURN(STATE) ELSE RETURN('A) FI ; RecSw();; This is the state table switcher; for receiving }files PROC RECSW() STRING FSPEC(20) INT NUM, LEN, T STARTR() PUT(125) PRINTE("Type the file to receive, or }just") PRINTE("RETURN if the other computer is not") PRINTE("in Server mode.") PUTE() PRINT("File Spec -> ") INPUTM}D(0, FSPEC, 19) PRINTE("Receiving File(s)") PRINTE("type any key to abort") STATE = 'R N = 0 NUMTRY = 0 DO } IF CH <> 255 THEN PRINTE("User Aborting") CH = 255 EXIT FI IF STATE = 'D THEN STATE = RDATA() } ELSEIF STATE = 'F THEN STATE = RFILE() ELSEIF STATE = 'R THEN STATE = RINIT(FSPEC) ELSEIF STATE = 'A THEN PRIN}TE("Aborting") EXIT ELSE EXIT FI OD STOPR() Close(3) RETURN ; SInit;; Send Initiate:; S}end my parameters, get other; side's back BYTE FUNC SINIT() INT NUM, LEN BYTE T IF DEBUG <> 0 THEN PRINTF("SI}nit%E") FI NUMTRY ==+ 1 IF NUMTRY > MAXTRY THEN RETURN('A) FI SPAR(PACKET) IF DEBUG <> 0 THEN PRINTF("n} = %D%E", N) FI ;Clear out any junk in the input ;buffer WHILE NCIB() > 0 DO GETD(2) OD SPACK('S, N, 6, PACKET) } T = RPACK(@LEN, @NUM, RECPKT) IF T = 'N THEN RETURN(STATE) ELSEIF T = 'Y THEN IF N <> NUM THEN RETURN(STAT}E) FI RPAR(RECPKT) IF EOLN = 0 THEN EOLN = 13 FI IF QUOTE = 0 THEN QUOTE = '# FI NUMT }RY = 0 N = (N + 1) MOD 64 IF FILNAM = 0 THEN RETURN('A) FI ;Open a file STOPR() ERRORNUM = 0 !} Close(3) OPEN(3, FILNAM, 4, 0) STARTR() IF ERRORNUM >= 128 THEN PRINTF("Error %D; couldn't read %S", "} ERRORNUM, FILNAM) RETURN('A) FI PRINTF("Sending %S%E", FILNAM) RETURN('F) ELSEIF T = FALSE THEN RET#}URN(STATE) ELSE RETURN('A) FI ; SFile;; Send File Header BYTE FUNC SFILE() INT NUM, LEN, T, I STRING STFNA$}ME(20) IF DEBUG = 1 THEN PRINTE("SFile") FI NUMTRY ==+ 1 IF NUMTRY > MAXTRY THEN RETURN('A) FI I = 1 %} ;STANDARD FILE NAMES DON'T HAVE D1: WHILE FILNAM(I) <> ': DO I ==+ 1 OD LEN = FILNAM(0)-I FOR T = 0 TO LEN-1 DO ST&}FNAME(T) = FILNAM(I+T+1) OD SPACK('F, N, LEN, STFNAME) T = RPACK(@LEN, @NUM, RECPKT) IF T = 'N OR T = 'Y THEN I'}F T = 'N THEN NUM ==- 1 IF NUM < 0 THEN NUM = 63 FI FI IF N <> NUM THEN RETURN(STATE) (} FI NUMTRY = 0 N = (N + 1) MOD 64 SIZE = BUFILL(PACKET) IF SIZE = EOFs THEN RETURN('Z) ELSE R)}ETURN('D) FI ELSEIF T = FALSE THEN RETURN(STATE) ELSE RETURN('A) FI ; SData;; Send File Data BYTE FUNC SD*}ata() INT NUM, LEN, T NUMTRY ==+ 1 IF NUMTRY > MAXTRY THEN RETURN('A) FI SPACK('D, N, SIZE, PACKET) T = RPA+}CK(@LEN, @NUM, RECPKT) IF T = 'N OR T = 'Y THEN IF T = 'N THEN NUM ==- 1 IF NUM < 0 THEN NUM = 63 FI ,} FI IF N <> NUM THEN RETURN(STATE) FI NUMTRY = 0 N = (N + 1) MOD 64 SIZE = BUFILL(PACKET) -} IF SIZE = EOFs THEN RETURN('Z) FI RETURN('D) ELSEIF T = FALSE THEN RETURN(STATE) ELSE RETURN('A) FI.} ; SEOF();; Send End-Of-File BYTE FUNC SEOF() INT NUM, LEN, T IF DEBUG = 1 THEN PRINTF("SEOF%E") FI /} NUMTRY ==+ 1 IF NUMTRY > MAXTRY THEN RETURN('A) FI SPACK('Z, N, 0, PACKET) IF DEBUG = 1 THEN PRINT("SEOF1 0}") FI T = RPACK(@LEN, @NUM, RECPKT) IF T = 'N OR T = 'Y THEN IF T = 'N THEN NUM ==- 1 IF NUM < 0 1}THEN NUM = 63 FI IF N <> NUM THEN RETURN(STATE) FI FI IF DEBUG = 1 THEN PRINTF("SEOF2 ") FI IF 2}N <> NUM THEN RETURN(STATE) FI NUMTRY = 0 N = (N + 1) MOD 64 IF DEBUG = 1 THEN PRINTF("Closin3}g %S%E", FILNAM) FI STOPR() IF DEBUG = 1 THEN PRINTF("getting next file%E") FI DO FILNAM = GE4}TNEXT(6) IF FILNAM = 0 THEN EXIT FI CLOSE(3) ERRORNUM = 0 OPEN(3,FILNAM, 4, 0) IF ERRORNUM < 125}8 THEN EXIT ELSE PRINTF("Can't read %S; Error %D%E", FILNAM, ERRORNUM) FI OD 6} STARTR() IF FILNAM = 0 THEN RETURN('B) FI PRINTE(FILNAM) RETURN('F) ELSEIF T = FALSE THEN RETURN7}(STATE) ELSE RETURN('A) FI ; SBreak();; Send Break (End-of-Text) BYTE FUNC SBreak() INT NUM, LEN, T IF DE8}BUG = 1 THEN PRINTF("SBreak%E") FI NUMTRY ==+ 1 IF NUMTRY > MAXTRY THEN RETURN('A) FI SPACK('B, N, 0, PAC9}KET) T = RPACK(@LEN, @NUM, RECPKT) IF T = 'N OR T = 'Y THEN IF T = 'N THEN NUM ==- 1 IF NUM < 0 THE:}N NUM = 63 FI IF N <> NUM THEN RETURN(STATE) FI FI IF N <> NUM THEN RETURN(STATE) ;} FI NUMTRY = 0 N = (N + 1) MOD 64 RETURN('C) ELSEIF T = FALSE THEN RETURN(STATE) ELSE RETURN('A) FI <} ;MAIN SEND FILE ROUTINE PROC SENDSW() STRING FSpec(20) DO Print("File spec -> ") INPUTMD(0, FSPEC, 19) I=}F FSPEC(0) = 0 THEN RETURN FI Normalize(FSPEC) FILNAM = GETFIRST(6, FSPEC) IF FILNAM = 0 THEN PRINTE("Inval>}id file name") FI UNTIL FILNAM <> 0 OD Put(125) PRINTF("Sending %S%E", FSpec) PRINTE("Type any key to abort?}.") STARTR() STATE = 'S N = 0 NUMTRY = 0 DO IF CH <> 255 THEN PRINTE("User Abort") CH = 255 @} EXIT FI IF STATE = 'D THEN STATE = SDATA() ELSEIF STATE = 'F THEN STATE = SFILE() ELSEIF STATE = 'Z THENA} STATE = SEOF() ELSEIF STATE = 'S THEN STATE = SINIT() ELSEIF STATE = 'B THEN STATE = SBREAK() ELSEIF STATE = 'A B}THEN PRINTE("Aborting") EXIT ELSE EXIT FI OD STOPR() CLOSE(3) RETURN ;Tell Server to quit C}PROC Finish() INT NUM, LEN, T IF DEBUG = 1 THEN PRINTE("Finish") FI STARTR() FOR NUMTRY = 0 TO 3 DO PAD}CKET(0) = 'F SPACK('G, 0, 1, PACKET) T = RPACK(@LEN, @NUM, RECPKT) IF T = 'N OR T = 'Y THEN IF T = 'N E} THEN NUM ==- 1 IF NUM < 0 THEN NUM = 63 FI IF 0 <> NUM THEN EXIT FI FI F} IF 0 = NUM THEN STOPR() RETURN FI FI OD STOPR() PRINTE("Server didn't respond")G} RETURN ;--------------------------;Kermit Protocol code ends here;-------------------------- ; --- END OF D:KPRO.ACT H}---;D:KTTY.ACT; Terminal emulation for the masses; Emulates a VT-52, Option quits,; Start scrolls. MODULE CARD ARRAY LBAS!J}E(24) BYTE ARRAY LCUR(24) BYTE CX, CY, LMAR, DLTOGGLE,TSTATE, consol = $D01F CARD SDLST = $230, SAVED!K}L, HELPLINE ;Create a display list and display it;; Uses: LBASE, LCUR, LMAR, SAVEDL,; Modifies: DLTOGGLE, SCREEN MEMORY!L} PROC HACKDISPLAY() BYTE ARRAY DBASE BYTE I CARD J, TBASE DBASE = DLTOGGLE*85+SAVEDL+72 DLTOGGLE = 1 - DLTOGGL!M}E TBASE = DBASE FOR I = 0 TO 2 DO DBASE(I) = $70 OD FOR I = 0 TO 23 DO DBASE ==+ 3 DBASE(0) = $42 J =!N} LCUR(I) J = LBASE(J) + LMAR - LMARGN DBASE(1) = J DBASE(2) = J RSH 8 OD DBASE(3) = $00 DBASE(4) = $42 DB!O}ASE(5) = HELPLINE DBASE(6) = HELPLINE RSH 8 DBASE(7) = $41 DBASE(8) = TBASE DBASE(9) = TBASE RSH 8 SDLST = TBASE !P}RETURN PROC CFLIP() BYTE POINTER M BYTE I I = LCUR(CY) M = LBASE(I) + CX M^ ==! $80 RETURN PROC LCLEA!Q}R(BYTE LINE) BYTE I BYTE ARRAY T I = LCUR(LINE) T = LBASE(I)-2 FOR I = 0 TO 81 DO T(I) = 0 OD RETURN !R}PROC TINIT() CARD I, J ;First, find 24 valid lines in ;Sbuf. Valid lines don't cross 4K J = SBUF FOR I = 0 TO 23 !S} DO IF (J RSH 12) <> ((J + 81) RSH 12) THEN J = (J & $F000) + $1000 FI LBASE(I) = J+2 J ==+!T} 82 LCUR(I) = I ;set up current line order LCLEAR(I) OD ;Now set up a display list SAVEDL = SDLST HELPLINE = !U}SDLST+32 PUT(125) PRINTE("OPTION quits, (SHIFT)+START scrolls") DLTOGGLE = 0 TSTATE = 'N CX = 0 CY = 0 LMAR = 0!V} CFLIP() HACKDISPLAY() RETURN BYTE FUNC TPUTN(BYTE C) BYTE I, TEMP BYTE POINTER M BYTE ARRAY TOSCR = [$40 $!W}00 $20 $60] CFLIP() IF C < 32 THEN IF C = 27 THEN RETURN('E) ELSEIF C = 10 THEN IF CY < 23 THEN !X} CY ==+ 1 ELSE LCLEAR(0) TEMP = LCUR(0) FOR I = 0 TO 22 DO LCUR(I) = LCUR(I!Y}+1) OD LCUR(23) = TEMP HACKDISPLAY() FI ELSEIF C = 13 THEN CX = 0 ELSEIF C!Z} = 7 THEN ;BELL SETCOLOR(4, 0, 14) I = RTCLOCK + 2 WHILE I <> RTCLOCK DO OD SETCOLOR(4, 0, 0) ![} ELSEIF C = 8 THEN ;BACKSPACE IF CX > 0 THEN CX ==- 1 FI ELSEIF C = 9 THEN ;TAB IF CX!\} < 72 THEN CX = (CX + 8) & $F8 FI ELSEIF C = 12 THEN FOR I = 0 TO 23 DO LCLEAR(I) !]} OD CX = 0 CY = 0 FI ELSE ;printing char I = LCUR(CY) M = LBASE(I) + CX M^ = TOS!^}CR((C & $60) RSH 5) % (C & $9F) IF CX < 79 THEN CX ==+ 1 FI FI CFLIP() RETURN('N) BYTE FUNC TPUTE(B!_}YTE C) BYTE TEMP, I BYTE ARRAY M IF C = 'A THEN IF CY > 0 THEN CY ==- 1 FI ELSEIF C = 'B THEN IF !`}CY < 23 THEN CY ==+ 1 FI ELSEIF C = 'C THEN IF CX < 79 THEN CX ==+ 1 FI ELSEIF C = 'D THEN !a} IF CX > 0 THEN CX ==- 1 FI ELSEIF C = 'H THEN CX = 0 CY = 0 ELSEIF C = 'I THEN IF CY > 0 THEN!b} CY ==- 1 ELSE LCLEAR(23) TEMP = LCUR(23) FOR I = 0 TO 22 DO LCUR(23-I) = LCUR(22-I) !c} OD LCUR(0) = TEMP HACKDISPLAY() FI ELSEIF C = 'J OR C = 'K THEN I = LCUR(CY) M = LBASE(I) F!d}OR I = CX TO 79 DO M(I) = 0 OD IF C = 'J THEN FOR I = CY+1 TO 23 DO LCLEAR(I) OD FI E!e}LSEIF C = 'Y THEN RETURN('R) ELSEIF C = 'Z THEN PUTD(2, 27) PUTD(2, '/) PUTD(2, 'Z) FI CFLIP() RETURN!f}('N) PROC TPUTSW(BYTE C) IF TSTATE = 'N THEN TSTATE = TPUTN(C) ELSEIF TSTATE = 'E THEN TSTATE = TPUTE(C) !g}ELSEIF TSTATE = 'R THEN IF C < 32 THEN C = 32 FI CY = C - 32 IF CY > 23 THEN CY = 23 FI TSTATE = 'C ELSEIF !q}b%DOS SYSb*)DUP SYSb SAUTORUN SYSb_HELP DOCbBoSNAPSHOTDOCbSNAPSHOTCOMbSOFTBOOTCOMB(IKTTY ACTB%zKERMIT DOCBKERDOC ACTBKERHLP ACTBKERMIT2 ACTB/KERMIT CAPBTERMCAP ACTB=TERM ACTB*;TERM1 ACTBeTERM2 ACTB)|TERM DOCB READ ME TSTATE = 'C THEN IF C < 32 THEN C = 32 FI CX = C - 32 IF CX > 79 THEN CX = 79 FI CFLIP() TSTATE = 'N EL!r}SE TSTATE = 'N FI RETURN PROC TQUIT() SDLST = SAVEDL PUT(125) RETURN PROC TTYMode() BYTE c, S!s}KSTAT = $D20F, OLDSCROLL StartR() TINIT() OLDSCROLL = RTCLOCK - 1 DO IF ch <> $FF THEN c = GetD(1) !t} IF c = 155 THEN c = 13 ELSEIF c = 127 THEN c = 9 ELSEIF c = $7E THEN c = backs FI PutD(2, c) !u}IF localecho = 1 THEN TPUTSW(c) FI FI IF ncib() > 0 THEN c = GetD(2) & $7F ;strip parity !v}TPUTSW(c) FI consol = 8 IF (consol & 4) = 0 THEN EXIT ELSEIF (CONSOL & 1) = 0 AND RTCLOCK <> !w}OLDSCROLL THEN ;START - SHIFT LEFT & RIGHT IF (SKSTAT & 8) = 0 THEN IF LMAR > 0 THEN LMAR ==- 1!x} FI ELSE IF LMAR < 40+LMARGN THEN LMAR ==+ 1 FI FI HACKDISPLAY() OL!y}DSCROLL = RTCLOCK FI OD TQUIT() StopR() RETURN ;End of D:KTTY.ACT Q ATARI/850 KERMIT This version of Kermit is for use with modems connected to the compute%{}r via the 850 interface module, using the standard RS232.COM or AUTORUN.SYS handler. Download using TSCOPE. Th%|}e file is a binary file which was compiled using the OSS ACTION! compiler and supporting runtime routines, so that %}}you do not need the ACTION! cartridge to run it. The program was originally written by John Palevich. I compiled it wi%~}th the( runtime routines, and made only minor improvements. Kermit is an upload/download protocol which is becoming%} very popular for transferring data between many different types of computer systems. It is a public domain program%}, originally developed at the University of Columbia. It is presently available for many micro and mainframe compu%}ters, including IBM PCs, Commodor 64s, VAXes, CYBERs, CPM machines, and many more. Both binary and text transfers are p%}ossible. To run Kermit, just boot up a disk containing the RS232 handler, and then load Kermit. Kermit will execu%}te and display credits and the main menu. The first thing you should do from the main menu is select the Parameter%} option. This will allow you to change BAUD rates, parity, select text or binary transfers, default disk drive, etc. %} When you finish setting your options, you can press CTRL S to save those options to disk as the default settings the %}next time you boot Kermit.( Press Q to quit back to the main menu. If you have a Hayes Smartmodem, the next thing %}you may want to do is set up a file of computer systems and phone numbers that you can autodial. To do this select%} the autodial option. The screen wild clear and then display the autodial screen. You can change or add systems, %}BAUD rates, and phone numbers by following the prompts on this screen. For example, to add or change a system, use the %}cursor keys to get to the line being alded or changed and then press the space bar. The program will respond with %}a ?, at which point you can use all of the editing keys on the Atari including insert & delete character, to create%}/edit the information. An example is as foldows: Compuserve (300) #375 9163 This will set up your modem%} at 300 BAUD and dial the number 375-9163 when you select it. Just press return when the line is completed. When y%}ou have all your systems entered, press CTRL S to save |he autodial file to disk. To dial the number, move the cursor t%}o the line desired, and press return. If you do not want to autodial at this time, press ESC to get back to the ma%}in menu. To get into terminal mode, select the CONNECT gption on the main menu. This will connect you to the syste%}m, at which time you can dial up and log-on to the system. The display simulates an 80 column display using horizo%}ntal scrolling by pressing the START key to scroll left, or SHIFT plus START to scroll right. Pressing OPTION returns y%}ou to the main menu. To transfer files between to Ataris, one must select the SEND option from the main menu,%} and the other the RECEIVE option. The program will prompt you for the file name to send. You do not need to include t%}he Dn: at the beginning of the file name, as the default disk drive will automatically be assumed. When you have e%}ntered the file name, press RETURN, and the file transfer will begin. One VERY POWERFUL feature of the file transf%}er is that you can use wildcarding to send more than one file! For example to send an ENTIRE DISK, just specify *.%}* as the file name. ALL files on the disk will then be transferred. Note that ofly the SENDER must specify the file nam%}e. The receiving end can just press return when prompted for a file name. However, the receive file name can be e%}ntered if you are connected to a host system which you have placed in the server mode.( Check the host documents for %} further information on this mode. The FINISH command is used to terminate the server mode in the host system. %} You also have a mini-DOS available from the main menu, to allow you to read the disk directory, format disks, etc. %}This option will display another menu for the DOS options. They are self-explanatory. Maybe Compuserve will suppo%}rt Kermit someday, I don't know.Key to continue: $=?File not found - "ATAKERMIT.DOC.1"@TYPE ATA^H^H?Invalid character in filename - "ATA"@TYPE KERMIT:ATAKERMIT.DOC.1How to)} install Kermit on your ATARIhome computer.RAM: 48K, or more RAMPeripherals: At least one disk drive ATAR)}I 850 & a modem, or ATARI 1030, or other communications device1) Format a diskette and write a)} copyof DOS onto it.2) Write the AUTORUN.SYS file for thetype of modem that you are going touse. If you are using an 8)}50, writethe AUTORUN.SYS file that came with theDOS II Master Diskette.3) Write all the K*.* files onto thediskette.4)}) Insert an ACTION! cartridge intoyour ATARI computer, turn on your 850(or 1030, or whatever) and power cycleyour ATARI c)}omputer. After the DOSboots you should see the ACTION! editorscreen.5) Read in and edit the file"KERMIT.ACT". Change )}the line near theend of the file from "KCOM850.ACT" towhichever device you wish to use.Write out the "KERMIT.ACT" file whe)}nyou are done. If you are trying tosupport a new modem type, create a newKCOM file and use its name here....6) Clear t)}he editor buffer and go tothe ACTION! monitor. TypeR "KERMIT.ACT"to compile and run the Kermit program.That's it. Here)} are some commonly askedquestions, with some off-the-cuffanswers:Q: Why do I need an ACTION! cartridgeto run Kermit?A)}: The people who developed ACTION!have not yet provided a way of runningtheir program without the ACTION! cart.Q: Why d)}o I have to re-compile theprogram every time I want to use it?A: DOS II's menu program destroysthe R: and T: device driv)}ers, so youcan't use the "L" menu option to runa pre-compiled ACTION program thatdepends on the R: or T: drivers.If you )}are clever, you can append theACTION! object code to the AUTORUN.SYSfile to generate an auto-bootingversion of KERMIT.If)} you have OS/A+, you can, indeed,save the compiled version of Kermit andexecute it from the command line. Justmake sure t)}hat you have loaded adevice driver first! Jack Palevich@@(O:Kermit.HLP (Kl-ERror free MIcro File-transfer COLUMBIA University) 18-Mar-84 Version 3.8The KERMIT protocol needs t-}wo programs running , understanding and serving theconnection protocol. For simplicity , both programs are called KERMIT-}. Tohelp discern ,the 8080-side echoes in Command-mode with KERMIT-80> ..and the20-side with KERMIT-20>. The transf-}er is started from the 8080 (theCPM-Micro). In the following example "extra" program-typeout has been leftout for-} readability.SYS UPLOAD (Micro to 20) DOWNLOAD (20 to Micro) Comments=== ==================== ====================== -}======================CPM B>KERMIT B>KERMIT ;Start KERMIT on MICROCPM KERMIT-80>Connect KERMIT-80>Connect ;Connec-}t to 20-SystemTOPS ;Wake 20-EXEC upTOPS @LOG LCG.KERMIT KERMIT @LOG LCG.KERMIT KERM-}IT ;LOG IN on 20TOPS @KERMIT SERVER @KERMIT SERVER ;Start 20-Kermit ; Go into SERVER stateBeware!! For submissi-}ons here read SUBMIT.TXT !!! ;Escape back to MICROCPM KERMIT-80>Send file.ex-}t KERMIT-80>Receive file.ext ;Start MICRO-sideNote: In case of Receive the file-spec is a TOPS20-File-Spec. ;Screen -}will change ;and display transferCPM KERMIT-80>LOGOUT KERMIT-80>LOGOUT ;LOGOUT on TOPSCPM KERMIT-80>Exit KERM-}IT-80>Exit ;...go ahead withCPM B> B> ;your tasks...Note: CTRL is the Control-key , KERMIT-20 will set righ-}t byte-size fordown-line loading. KERMIT-20's default for up-loading to the -20 is set toseven-bit. For full details, s-}ee KERMIT:20KERMIT.DOC,KUSER.DOC,KPROTO.DOC etc.. -} ,*;D:KERMIT.ACT;; KERMIT protocol; for Atari Home Computers; version 1.2; (C) 1984 John Howard Palevich1}; to be distributed free of charge;;Started September 24, 1983 ;Start code above T: and/or R:;by compiling while those 1}devices;are in RAM. There ought to be a;better way! MODULE DEFINE MAXPACK = "94" BYTE ARRAY RECPKT(MAXPACK), PAC1}KET(MAXPACK), FILNAM, SBUF(2050) DEFINE EOFs = "-1", SOH = "1", CR = "13", MAXTRY = "5", MYQUOTE = "'#", T1}RUE = "1", FALSE = "0" BYTE LMARGN = $52,;OS LEFT MARGIN CH = 764, ;OS CH VARIABLE RTCLOCK = 20,;OS CLOCK IN JIF1}FYS CRSINH = $2F0, ;OS CURSOR INHIBIT FLAG BACKS, ;CHAR TO SEND FOR BACK S baud, ;baud rate variable dia1}l, ;nz for tone dialing DISKN, ;DEFAULT DISK DNUM, ;port num localecho, ;local echo flag PARITY1}, ;communication parity ERRORNUM, ;ERROR NUMBER debug, ;debugging flag STATE, PADCHAR, EOLN, QUOT1}E INT SIZE, N, RPSIZ, SPSIZ, PAD, TIMINT, NUMTRY, OLDTRY, FD, REMFD, IMAGE, HOST INCLUDE "D1:SYSA1}LL.ACT"INCLUDE "D2:KIO.ACT" ; This is where KCOM#.ACT is;included. Include the KCOM file;which matches the comunication1}s;device and/or modem you wish to use.;; For an 850 and a Hayes SmartModem,;include KCOM850.ACT;; For the ATARI 1050,;1}include KCOM1050.ACT;; For any other set of devices, write;your own KCOM functions, and include;that file here. INCLUDE1} "D2:KCOM1030.ACT"INCLUDE "D2:KFUNC.ACT"INCLUDE "D2:KPRO.ACT"INCLUDE "D2:KTTY.ACT"INCLUDE "D2:KMENU.ACT" ; --- END OF D1}:KERMIT.ACT ---0[70515,447]KERMIT.BIN 03-Mar-85 50260(21472) Accesses: 124 Keywords: KERMIT MODEM ATARI TELECOMMUNICATIONS5} KERMIT executable binary. Upload with TSCOPE. See KERMIT.DOC for instructions Disposition:1 (5}R) Read this file2 (D) Download this file3 (T) Top Data Library MenuKey digit or ENTER for next: [70515,447]K5}ERMIT.DOC 03-Mar-85 4615 Accesses: 431 Keywords: KERMIT MODEM ATARI TELECOMMUNICATIONS Atari Kermit5} program. Upload with TSCOPE. See KERMIT.DOC for instructions Disposition:1 (R) Read this file2 (D) 5} Download this file3 (T) Top Data Library MenuKey digit or ENTER for next: [70717,3626]KCOM10.BIN 19-Apr-85 585}30(2496) Accesses: 14 Keywords: KERMIT AND R.BIN This is a modified kcom1030.act file which works with 5}R.BIN the combined 1030/850/835 driver program. I have succesfully used it to transfer files on a mainframe. 5}Thanks for R.BIN, I needed it. Disposition:1 (R) Read this file2 (D) Download this file3 (T) Top Data5} Library MenuKey digit or ENTER for next: [72455,1623]KCOM10.BIN 12-Feb-85 7170(3072) Accesses: 105 Keyword5}s: KERMIT ACTION The 10 and final installment of Kermit, a frog like protocol for computer communications. T5}his module controls a 1030 modem, use it only if you have a 1030. If you have an 850 sid, you use kcom850. If5} you don't have either, use your imagination. Good luck, happy hacking. Disposition:1 (R) Read this f5}ile2 (D) Download this file3 (T) Top Data Library MenuKey digit or ENTER for next: [72455,1623]KCOM85.BIN 065}-Feb-85 11660(4992) Accesses: 43 Keywords: KERMIT ACTION PART 8 OF 10. (KERDOC.BIN WAS PART 7.) RENAME 5}TO KCOM850.ACT. THIS MODULE CONTROLS YOUR MODEM. IF YOU HAVE AN 850- USE THIS. IF YOU HAVE A 1030 USE KCOM1030. T5}HE ORIGINAL KCOM850 WAS FOR A DC HAYES SMART MODEM. I HAVE HACKED IT FOR A U.S. ROBOTICS MODEM. THESE MODEMS ARE5} SUPPOSEDLY COMPATIBLE, BUT..... ANYHOW, THIS AND ITS COUSIN KCOM1030 SHOULD BE CUSTOMIZED FOR YOUR SYSTEM. 5} Disposition:1 (R) Read this file2 (D) Download this file3 (T) Top Data Library MenuKey digit or ENTER5} for next: [72455,1623]KERDOC.BIN 06-Feb-85 5005(2144) Accesses: 112 Keywords: KERMIT ACTION INSTALL5}ATION GUIDE FOR PUBLIC DOMAIN KERMIT SYSTEM. Disposition:1 (R) Read this file2 (D) Download this file5}3 (T) Top Data Library MenuKey digit or ENTER for next: [72455,1623]KERHLP.BIN 12-Feb-85 4560(1952) Accesses5}: 146 Keywords: KERMIT ACTION Documentation, sort of, for using kermit. 80 column format. I'll try and 5}get something more reasonable online. later. Disposition:1 (R) Read this file2 (D) Download this file5}3 (T) Top Data Library MenuKey digit or ENTER for next: [72455,1623]KERMIT.BIN 06-Feb-85 3870(1664) Accesses5}: 50 Keywords: KERMIT ACTION PART 1 OF 10- A PUBLIC DOMAIN KERMIT SERVER FOR THE ATARI. FROM JACK PALEV5}ICH. COMPILE USING THE ACTION! CARTRIDGE. RENAME THIS FILE TO KERMIT.ACT Disposition:1 (R) Read this 5}file2 (D) Download this file3 (T) Top Data Library MenuKey digit or ENTER for next: [72455,1623]KFUNC.BIN 05}6-Feb-85 14210(6080) Accesses: 38 Keywords: KERMIT ACTION PART 4 OF 10. RENAME TO KFUNC.ACT. Dis5}position:1 (R) Read this file2 (D) Download this file3 (T) Top Data Library MenuKey digit or ENTER for next: 5}[72455,1623]KIO.BIN 06-Feb-85 7200(3072) Accesses: 38 Keywords: KERMIT ACTION PART 3 OF 10. RENAME5} TO KIO.ACT. COMPILE USING ACTION! Disposition:1 (R) Read this file2 (D) Download this file3 (T) 5}Top Data Library MenuKey digit or ENTER for next: [72455,1623]KMENU.BIN 06-Feb-85 23280(9952) Accesses: 37 5} Keywords: KERMIT ACTION PART 5 OF 10. RENAME TO KMENU.ACT. ACTION SOURCE CODE FOR ATARI KERMIT SERVER. 5} Disposition:1 (R) Read this file2 (D) Download this file3 (T) Top Data Library MenuKey digit or ENTER f5}or next: [72455,1623]KPRO.BIN 06-Feb-85 22305(9536) Accesses: 35 Keywords: KERMIT ACTION PART 2 OF5} 10. PUBLIC DOMAIN ACTION BASED KERMIT FOR ATARI. RENAME TO KPRO.ACT. Disposition:1 (R) Read this fil5}e2 (D) Download this file3 (T) Top Data Library MenuKey digit or ENTER for next: [72455,1623]KTTY.BIN 06-F5}eb-85 11765(5024) Accesses: 37 Keywords: KERMIT ACTION PART 6 OF 10. RENAME TO KTTY.ACT. ACTION SOURCE 5}CODE FOR AN ATARI KERMIT SERVER. Disposition:1 (R) Read this file2 (D) Download this file3 (T) To5}p Data Library MenuKey digit or ENTER for next: [76703,414]KERMIT.BIN 14-Apr-85 52980(22624) Accesses: 41 K5}eywords: KERMIT MODEM ATARI TELECOMMUNICATIONS This is Kermit for the Atari and the 850 interface, built wit5}h the OSS runtime package so the ACTION! cartridge is not needed. This version incorporates a code change so5} the Anchor Automation modem is supported, and does not lock up the computer when a bell character is received. U5}ploaded with TSCOPE by Chuck Sadoian 76703,414. Autorun.sys and mem.sav are needed to run it. Disposi5}tion:1 (R) Read this file2 (D) Download this file3 (T) Top Data Library MenuKey digit or ENTER for next: DL 5}2 - Telecommunications : 1 (DES) Description of Data Library4?aa|aacs|Atari ACS:al=^B:am:bc=\036:bs:ce=^T:cl=^L:cm=^R%+ %+ :co#40:\dc=^X:dl=^E:do=\035:ei=:ho=^K:ic=^F:im=:kd=\035:kh=^L:k9}l=\036:kr=\037:ku=\034:\li#24:ll=^Y:nd=\037:pt:se=^W:so=^V:up=\034:8FMODULE ; TERM.ACT; (c) 1983 ACS; Copyright (c) 1983; by Action Computer Services (ACS);; No portion of this software =}may be; incorporated within or included with; another computer program that is to; be sold to other parties in any; manne>}r without the express written; permission of Action Computer; Services. Under no circumstances is; this copyright notice >}or others; contained within this software to be; removed.; version 1.0; last modified October 24, 1983CARD ARRAY end(1>}) ; just to get ending addressINCLUDE "BLKIO.ACT"DEFINE STRING = "CHAR ARRAY"DEFINE file="1", printer="2", modem>}="5", key="7"DEFINE EOL="$9B"DEFINE ASCII="$0"DEFINE MARGIN="0"DEFINE PMAX="1100"DEFINE SLOP="30"DEFINE PTIMEOUT="500">}DEFINE FTIMEOUT="500"CHAR keyboard, OLDCHR=$5DBYTE LMARGN=$52, COL=$55, ROW=$54BYTE escflag, RMARGN=$53, CHBAS=$2F4BYTE>} pos, io_err, hold, inverse, lfBYTE pflag, fflag, fmode, run, ansBYTE baud, translation, pincr, fincrCARD pindex, findex, >}pcounter, slowCARD fcounter, fsize, old_Error, fmaxCARD OLDADR=$5E, MEMTOP=$2E5BYTE ARRAY modes(256)STRING Rdev(0)="R:", >}Pdev(0)="P:"STRING fname(40)CHAR ARRAY pbuf(PMAX), fbufCHAR ARRAY line, fontBYTE font_hi=font+1PROC MyError(BYTE err, >}chan) PrintF("%EERROR - %I, channel %I%E", err, chan RSH 4) io_err = errRETURNPROC MStatus=*() XIO(modem,0,$D,0,0,R> }dev)RETURNPROC Delay(BYTE count) BYTE RTC=20 count = count + RTC + 1 WHILE (count-RTC)>0 DO ODRETURNPROC OpenM> }odem(BYTE trans) CARD POINTER aux Close(modem) Open(modem, Rdev, 13) XIO(modem,0,36,baud,0,Rdev) XIO(modem,0,38,tr> }ans,0,Rdev); set concurrent IO and no user buf. aux = $34A + (modem LSH 4) aux^ = 0 ; make sure aux = 0 XIO(modem,0,40> },0,0,Rdev)RETURNPROC XOn() IF translation=ASCII THEN PutD(modem, $11) ; XON FIRETURNPROC XOff() IF translat> }ion=ASCII THEN PutD(modem, $13) ; XOFF FIRETURN; routines to get char from modemINCLUDE "TERM1.ACT" ; buffer>}ing and IO routinesINCLUDE "TERM2.ACT" PROC Init() BYTE POKMSK=$10 CARD i BYTE ARRAY sfont BYTE ARRAY >}ga(0)=[$30$18$C$4$0$0$0$0] BYTE ARRAY tilde(0)=[$0$0$0$72$9C$0$0$0] BYTE ARRAY ob(0)=[$C$18$18$30$18$18$C$0] BYTE ARRAY>} cb(0)=[$30$18$18$C$18$18$30$0]; this should really be done with; interrupts off, Oh well!!! POKMSK = POKMSK & $7F ; no >}break key LMARGN = MARGIN pos = 0 pflag = 0 pcounter = 0 pincr = 0 fflag = 0 fmode = 0 fcounter = 0 fincr>} = 0 inverse = 0 escflag = 0 ans = 0 ; originate hold = 0 ; XOff received flag translation = ASCII lf = 1 run >}= 1 baud = 8 slow = 4000 Graphics(0) font = (MEMTOP - $3FF) & $FC00 MEMTOP = font - 1 fmax = MEMTOP - fbuf; g>}et ASCII font sfont = $E000 FOR i = 0 TO $3FF DO ; get around MoveBlock bug font(i) = sfont(i) OD MoveBlock(font+>}768, ga, 8) ; grave accent MoveBlock(font+1008, tilde, 8) MoveBlock(font+984, ob, 8) ; opening brace MoveBlock(font+100>}0, cb, 8) ; closing brace CHBAS = font_hi Zero(modes, 256) modes($1B) = 2 ; escape modes($1C) = 1 ; cursor up mod>}es($1D) = 1 ; cursor down modes($1E) = 1 ; cursor left modes($1F) = 1 ; cursor right modes($7D) = 1 ; clear screen mo>}des($7E) = 1 ; back space modes($7F) = 3 ; tab modes($9B) = 1 ; EOL modes($9C) = 1 ; delete line modes($9D) = 1 ; ins>}ert line modes($9E) = 1 ; clear tab modes($9F) = 1 ; set tab modes($FD) = 1 ; bell modes($FE) = 1 ; delete char mod>}es($FF) = 4 ; insert char modes($7) = 5 ; ^G, bell modes($8) = 6 ; ^H, backspace modes($C) = 7 ; ^L, clear screen >} PrintF("%EACS Modem version 1.0%E") PrintF("%ECopyright 1983%E") PrintE("Action Computer Services") PrintF("%Ebuffer s>}ize = %U%E", fmax) Close(key) : Open(key,"K:",4)RETURNPROC Functions() CHAR ch BYTE CONSOL=$D01F IF (CONSOL&$4)=>}0 THEN ; printer toggle XOff() IF pflag THEN ; turn off ClosePrinter() ELSE ; turn on MyOpen(pri>}nter, Pdev, 8) IF CIO_status<128 THEN PrintF("%Ebuffering for printer%E") pindex = 0 pflag = 1>} ELSE PrintF("%EERROR - %I%E", CIO_status) FI FI WHILE (CONSOL&$4)=0 DO OD XOn() FI IF (> }CONSOL&$2)=0 THEN ; SELECT XOff() PrintF("%Ecommands:%E") PrintE(" ASCII/ATASCII toggle") Pri>!}ntE(" Down load") PrintE(" Originate/answer toggle") PrintE(" Quit") PrintE(" Up load") ch = GetD(key) %>"} $20 IF ch='a THEN ; ASCII/ATASCII IF translation=ASCII THEN PrintE("ATASCII MODE") translation = 3>#}2 CHBAS = $E0 lf = 0 ELSE PrintE("ASCII MODE") translation = ASCII CHBAS = font>$}_hi lf = 1 FI CloseModem() OpenModem(translation) ELSEIF ch='d THEN ; down load fmode = 8>%} OpenFile("down load file name - ") IF fmode THEN PrintE("press START to begin down load") PrintE>&}("press START again when done.") FI ELSEIF ch='o THEN ; ans/org IF ans THEN PrintE("ORIGINATE MODE")>'} ans = 0 ELSE PrintE("ANSWER MODE") ans = $FF FI ELSEIF ch='q THEN ; quit run = >(}0 ELSEIF ch='u THEN ; up load fmode = 4 OpenFile("up load file name - ") IF fmode THEN ; set tran>)}smit delay Print("slow? ") ch = COL PrintC(slow) COL = ch+1 Put($1E) slow = InputC()>*} ReadFile() PrintE("press START to begin up load") FI ELSE hold = 0 PrintE("illegal se>+}lection") FI WHILE (CONSOL&$2)=0 DO OD XOn() FI IF (CONSOL&$1)=0 THEN ; START XOff() IF fflag>,} THEN ; turn off IF fmode=8 THEN ; down load CloseFile() ELSE PrintF("%Eup load aborted%E") >-} FI fflag = 0 fmode = 0 ELSE hold = 0 IF fmode=8 THEN ; down load PrintF("%Edown loading%>.}E") findex = 0 fflag = fmode ELSEIF fmode=4 THEN ; up load PrintF("%Eup loading%E") fin>/}dex = 0 fflag = fmode ELSE PrintF("%Euse SELECT to select mode%E") FI FI WHILE (CONSOL&$>0}1)=0 DO OD XOn() FIRETURNPROC GetKey() CHAR ch, CHFLAG=$2FC, BRKKEY=$11 IF fflag=4 AND hold=0 THEN ch = Fi>1}leChar() ELSE IF CHFLAG=$FF THEN RETURN FI ch = GetD(key) FI IF ans THEN MyPut(ch) FI IF translation=ASCII >2}THEN IF ch=$7D THEN ; clear screen Put($7D) ; don't send just clear RETURN ELSEIF ch=$7E THEN ; backspace>3} ch = $8 ELSEIF ch=$7F THEN ; tab ch = $9 ELSEIF ch=$0 THEN ; left brace ch = $7B ELSEIF ch=$60>4} THEN ; right brace ch = $7D ELSEIF ch=$7B THEN ; tilde ch = $7E ELSEIF ch=$FD THEN ch = $60 ; gra>5}ve accent ELSEIF ch=$FE OR ch=$9C THEN ch = $7F ; DEL FI FI PutD(modem, ch) ; send charRETURNPROC Main(>6}) CHAR ch fbuf = end Init() old_Error = Error Error = MyError io_err = 0 OpenModem(translation) PrintF(">7}%Eready%E%E") WHILE run DO MGet() ; get chars from modem Functions() GetKey() ; send chars from keyboard >8} ; or file pcounter ==+ pincr IF pcounter>PTIMEOUT THEN FlushPrinter() FI fcounter ==+ fincr>9} IF fcounter>FTIMEOUT THEN FlushFile() FI OD XOff() IF pflag THEN ClosePrinter() FI IF fflag=8 THEN Cl>:}oseFile() FI Close(modem) Close(file) Error = old_Error CHBAS = $E0 ; reset fontRETURN<aMODULE ; TERM1.ACT; (c) 1983 ACS; Copyright (c) 1983; by Action Computer Services (ACS);; No portion of this softwareB<} may be; incorporated within or included with; another computer program that is to; be sold to other parties in any; mannB=}er without the express written; permission of Action Computer; Services. Under no circumstances is; this copyright noticeB>} or others; contained within this software to be; removed.; last modified October 24, 1983PROC LineFeed() BYTE oldcoB?}l IF ROW#23 THEN Put($1D) ELSE oldcol = COL Put(EOL) COL = oldcol Put($1E) Put($1F) ; show cursor B@}FIRETURNPROC MyPut(BYTE ch) BYTE mode, i mode = modes(ch) IF mode=0 OR escflag#0 THEN IF ch=EOL THEN COLBA} = LMARGN Put($1F) Put($1E) ; show cursor ELSEIF ch#$7D OR translation#ASCII THEN IF COL>=RMARGN THEN BB} IF ch<$20 THEN OLDCHR = ch + $40 ELSEIF ch<$60 THEN OLDCHR = ch - $20 ELSE OLDBC}CHR = ch FI ch = EOL FI Put($1B) ; escape Put(ch) ELSE ; closing brace OLDCHR = $BD}7D IF COL>=RMARGN THEN PutE() ELSE Put($1F) ; left FI FI escflag = 0 RETURN FBE}I IF mode=1 THEN Put(ch) ELSEIF ch=$FF THEN ; insert char IF COL1 DO line(i) = line(i-1) i = i - 1 OD line(1) = OLDCHR line(0) = $80BG} FI OLDCHR = 0 Put($1E) Put($1F) ELSEIF ch=$1B THEN ; escape escflag = 1 ELSEIF ch=$7F THEN ; tab COLBH} = (COL + 8) & $F8 IF COLRMARGN THEN COL = RMARGN FI Put($1F) Put($1E) ELSEBI}IF translation=ASCII THEN IF ch=$7 THEN Put($FD) ; bell ELSEIF ch=$8 THEN Put($7E) ; backspace ELSEIFBJ} ch=$C THEN Put($7D) ; clear screen FI ELSE Put(ch) FIRETURNPROC PutCh(CHAR ch) STRING lostmsg(0)="%EBK}characters lost%E" MyPut(ch) IF pflag#0 AND ch>=$20 AND (ch<$80 OR ch=EOL) THEN pbuf(pindex) = ch pindex = pindBL}ex + 1 IF pindex>PMAX-SLOP THEN IF pindex>=PMAX THEN pindex = PMAX ; drop characters Close(modem) BM} PrintF(lostmsg) pcounter = PTIMEOUT ELSEIF pcounter=0 THEN XOff() pcounter = 1 pBN}incr = 1 FI FI FI IF fflag=8 THEN fbuf(findex) = ch findex = findex + 1 IF findex>fmax-SLOP THEN BO} IF findex>=fmax THEN findex = fmax ; drop characters Close(modem) PrintF(lostmsg) fcountBP}er = FTIMEOUT ELSEIF fcounter=0 THEN XOff() fcounter = 1 fincr = 1 FI FI FIRETURNBQ}PROC PutM(CHAR ch) PutD(modem, ch) IF ch=EOL AND lf#0 THEN PutD(modem, $A) ; output LF FIRETURNPROC PutCtrl(CBR}HAR ch, cha) MyPut(cha) IF ans THEN PutM(ch) FIRETURNPROC PutChar(CHAR ch) BYTE i IF pos THEN ; position X and YBS} bytes ch = ch - 32 IF pos=1 THEN ; row ROW = ch IF ROW>23 THEN ROW = 23 FI pos = 2 ELSE ; coluBT}mn COL = LMARGN + ch IF COL>39 THEN COL = 39 FI Put($1E) Put($1F) ; show cursor pos = 0 FI REBU}TURN FI IF ch<$1B THEN IF ch=$2 THEN ; ^B, insert line Put($9D) ELSEIF ch=$5 THEN ; ^E, delete line BV}Put($9C) ELSEIF ch=$6 THEN ; ^F, insert char MyPut($FF) ELSEIF ch=$7 THEN ; bell PutCtrl($7, $7) ELSEBW}IF ch=$8 THEN ; backspace PutCtrl($8, $8) IF pflag#0 AND pindex#0 AND pbuf(pindex-1)#EOL THEN ; delete prBX}ev char from buffer pindex = pindex - 1 FI ELSEIF ch=$9 THEN ; tab PutCtrl($9, $7F) ELSEIF ch=$A BY}THEN ; line feed LineFeed() IF ans THEN PutD(modem, $A) FI ELSEIF ch=$B THEN ; ^K, home top Position(LMBZ}ARGN+1, 0) Put($1E) ELSEIF ch=$C THEN ; form feed PutCtrl($C, $C) ; clear screen ELSEIF ch=$11 THEN ; ^Q, XON B[} hold = 0 PrintF("%EXON") ELSEIF ch=$12 THEN ; ^R, position pos = 1 ELSEIF ch=$13 THEN ; ^S, XOFF B\} hold = 1 PrintF("%EXOFF") ELSEIF ch=$14 THEN ; ^T, clear to end of line line = OLDADR line(0) = $80B]} FOR i = 1 TO RMARGN-COL DO line(i) = 0 ; fill in spaces OD OLDCHR = 0 ELSEIF ch=$16 THEN ; ^V, B^}inverse on inverse = $80 ELSEIF ch=$17 THEN ; ^W, inverse off inverse = $0 ELSEIF ch=$18 THEN ; ^X, deletB_}e char Put($FE) ELSEIF ch=$19 THEN ; ^Y, home bottom Position(LMARGN+1, 23) Put($1E) ELSEIF ch=$1B THEN ;B`} ESC IF escflag THEN MyPut($1B) ELSE escflag = 1 FI ELSEIF ans THEN PutD(modem, 'Ba}^) PutD(modem, ch+('A-1)) FI ELSEIF ch<$20 THEN ; cursor keys Put(ch) ELSE escflag = 1 PutCh(ch % iBb}nverse) IF ans THEN PutM(ch) FI FIRETURNBYTE FUNC MGet() CHAR ch BYTE res, num_chars=747 res = 0 DO MSBc}tatus() IF num_chars=0 THEN EXIT FI res = 1 ch = GetD(modem) ; handle input character IF translation=ASBd}CII THEN PutChar(ch) ELSE PutCh(ch) IF ans THEN PutM(ch) FI FI ODRETURN(res)@kMODULE ; TERM2.ACT; (c) 1983 ACS; Copyright (c) 1983; by Action Computer Services (ACS);; No portion of this softwareFf} may be; incorporated within or included with; another computer program that is to; be sold to other parties in any; mannFg}er without the express written; permission of Action Computer; Services. Under no circumstances is; this copyright noticeFh} or others; contained within this software to be; removed.; last modified October 24, 1983PROC CloseModem() XOff() Fi} Delay(5) WHILE MGet() DO ; flush buffer Delay(3) OD Close(modem)RETURNPROC Flush(BYTE chan, CHAR ARRAY addrFj}, CARD size) IF size THEN WriteBlock(chan, addr, size) OpenModem(translation) XOn() FIRETURNPROC FlushPriFk}nter() CloseModem() Flush(printer, pbuf, pindex) pindex = 0 pcounter = 0 pincr = 0RETURNPROC FlushFile() ClosFl}eModem() Flush(file, fbuf, findex) findex = 0 fcounter = 0 fincr = 0RETURNPROC MyClose(BYTE chan) CloseModem()Fm} Close(chan) OpenModem(translation)RETURNPROC ClosePrinter() pbuf(pindex) = EOL pindex = pindex + 1 FlushPrinterFn}() MyClose(printer) PrintF("%Ebuffering off%E") pflag = 0RETURNPROC CloseFile() FlushFile() MyClose(file) PriFo}ntF("%Edown load stopped%E")RETURNPROC MyOpen(BYTE chan, STRING dev, BYTE mode, aux2) CloseModem() Close(chan) CIO(Fp}chan,dev+1,dev(0),$3,mode,aux2) EOF(chan) = 0 OpenModem(translation)RETURNPROC OpenFile(STRING msg) CHAR ch BYTE Fq}i DO CIO_status = 0 Print(msg) Zero(fname, 3) InputMD(0, fname, 37) IF fname(0)#0 THEN IF fnameFr}(2)#': AND fname(3)#': THEN ; fill in device name i = fname(0) + 1 ; copy EOL as well WHILE i>0 DO Fs} fname(i+2) = fname(i) i = i - 1 OD fname(0) = fname(0) + 2 fname(1) = 'D fnaFt}me(2) = ': FI ; make upper case FOR i = 1 TO fname(0) DO IF fname(i)>='a AND fname(i)<='z THEN Fu} fname(i) ==& $DF FI OD MyOpen(file, fname, fmode, 0) IF CIO_status>127 THEN PrintF(Fv}"%EERROR - %I, try again? ", CIO_status) ch = GetD(key) Put(ch) PutE() IF (ch % $20)#'y THEN Fw} fmode = 0 RETURN FI FI ELSE fmode = 0 FI UNTIL CIO_status<128 ODRETURNPROC ReadFx}File() CloseModem() fsize = ReadBlock(file, fbuf, fmax) OpenModem(translation) XOn()RETURNCHAR FUNC FileChar() Fy}CHAR ch CARD i ch = fbuf(findex) findex = findex + 1 FOR i = 1 TO slow DO OD IF findex>=fsize THEN ; end of buffFz}er IF EOF(file) THEN ; end of file MyClose(file) PrintF("%Eup load done%E") fflag = 0 fmode = 0 F{} ELSE ; get another buffer worth ReadFile() findex = 0 FI FIRETURN(ch)MODULEDeDocumentation for ACS Termversion 1.0Copyright 1983 by Action Computer Services (ACS)Permission to make copies of thJ}}isdocument for non-profit purposes isgranted so long as this notice isreproduced on all copies.ACTION! is a trademarkJ~} of Action Computer ServicesAtari is a trademark of Atari, Inc.All references should be so noted.ACS Term is a fuJ}ll function terminalprogram written in ACTION! for Ataricomputers. features: 24 lines of 40 columns format originJ}ate/answer modes full/half duplex upload/download capabilities ASCII/ATASCII support screen handling: J}insert/delete line insert/delete character cursor positioning clear screen clear to end of line J} start/stop inverse video home to top/bottom left cursor key support bell, tabulation, line feeds J} buffering for printer XOFF/XON support (CTRL-S/CTRL-Q)Most of the features of ACS Term areselected by depressing thJ}e SELECT keyon the Atari. This causes ACS Termto send an XOFF and then display amenu of available features. FeaturesareJ} selected by depressing the keywhich represents the first letter inthe name of the feature. Most of thefeatute selectionsJ} are togglesbetween two (or more) different modesthat are supported (such as ASCII/ATASCII, originate/answer). TheuploadJ} and download features willwork to some degree in all modes, butdo not support XOFF and XON in theATASCII mode (this meansJ} that you cannot buffer for the printer or upload/download files bigger than the sizeof the transfer buffer). In general,J}ASCII should be used at all times.Up/down loading are described laterin this document. An XON is trans-mitted at the endJ} of the selectionprocess.Buffering for the printer is selectedby depressing the OPTION key. If ACSTerm is currently bufJ}fering, then thecontents of the buffer are dumped tothe printer and buffering is turnedoff. If buffering is off, then it J}isturned on when the OPTION key isdepressed. The print buffer is about1K in size and whenever it fills up,it is dumped tJ}o the printer. An XOFFis sent before doing this and an XONis sent when done. Control codes arenot stored in the print buJ}ffer and assuch are not sent to the printer. Abackspace causes the last characterplaced in the buffer to be removed.TheJ} START key is used for startingup/down loads and for ending downloads.The Quit command in the SELECTionmenu will exit ACJ}S Term (afterclosing any open buffers) and returncontrol to the ACTION! monitor. TheBREAK key is not supported by ACSTerJ}m. DELETE can be used to send anASCII DEL. The following table is alist of CTRL keys used to send ASCIIcodes not represeJ}nted on the Atarikeyboard: BEL (bell) CTRL-G LF (line feed) CTRL-J DC1 (XON) CTRL-Q DCJ}3 (XOFF) CTRL-S; the following codes are sent by the; cursor keys FS (cursor up) GS J} (cursor down) RS (cursor left) US (cursor right) grave accent CTJ}RL-2 opening brace CTRL-[/CTRL-, closing brace CTRL-]/CTRL-. tilde CTRL-;When uploading J}a file, you will beasked for a delay (slow?) that isused to slow down transmittion forhost which cannot support transfersJ}at full baud rate. Simply hit RETURNto use the default value displayed orenter a value of your choice. Avalue of zero meJ}ans no delay. Afterthis you will be prompted for theupload file name. If no device isgiven, D: is assumed. The routineJ}will convert your input to uppercase,so you can enter the name as lower-case if you want. If the file cannotbe opened, yoJ}u will be prompted forthe name again. If any other erroroccurs, the upload will be aborted.Hit the START key to then starJ}t theupload. Hitting the START key againwhile the upload is in progress willabort it.When downloading a file, you will J}beprompted for a file name as describedfor uploading above. Once the filename is given, you can begin thedownloading by J}hitting the START key.When the down load is complete, hitthe START key again flush the rest ofthe characters remaining in J}thebuffer.The following table describes theCTRL characters used by the screencommands. A termcap entry isavailable forJ} UNIX users. CTRL-B insert line CTRL-E delete line CTRL-F insert character CTRL-G bell CTRL-H backsJ}pace CTRL-I tab CTRL-J line feed CTRL-K cursor to top left (home) CTRL-L clear screen CTRL-M carriagJ}e return CTRL-Q XON CTRL-R cursor position, next two bytes are column+32 and row+32 addressJ}es. CTRL-S XOFF CTRL-T clear to end of line CTRL-V start inverse video CTRL-W stop inverse video CTRLJ}-X delete character CTRL-Y cursor to bottom left; the following codes are also sent; by the corresponding cursor keysJ} CTRL-\ cursor up CTRL-] cursor down CTRL-^ cursor left CTRL-_ cursor rightHa As is my preference for the ACTION! disks I have put together, this disk contains only ACTION! source fN}iles. There are 19 other files on this disk; fourteen of them for the KERMIT programs by John Palevich, and five forN} a bare bones terminal program by Clinton Parker. There is one doc file associated with each batch of files. The N}TERM series requires an 850 or equivalent interface. The KERMIT can be compiled for either 850 based modems or 835/1N}030 modems (include KCOM850.ACT for the 850 and KCOM1030.ACT for the 1030). Neither terminal program is N} terrific but these files can provide a good idea on what is required for a program of one's own design. The filesN} for the KERMIT program are: KERMIT .ACT KFUNC .ACT KIO .ACT N} KCOMFF .ACT KCOM850 .ACT KCOM1030.ACT KMENU .ACT KPRO .ACT N} KTTY .ACT KERMIT .DOC KERDOC .ACT KERHLP .ACT KERMIT2 .ACT N} KERMIT .CAP The files for the TERM program are: TERMCAP .ACT TERM .ACT N} TERM1 .ACT TERM2 .ACT TERM .DOCLQ