IMD 1.18: 22/01/1996 6:30:59 micro cornucopia kaypro user group disk 14 smartmodem programs     BYE COMSMODEM DOC SMODEM DOC>KAYTERM DOC# !"XMODEM COM#$%&XMODEM DOCD'()*+,-./SMODEMK COMM0123456789SMODEMK MAC:;<=>?@ABCDEFGHISMODEMK MACJKLMNOPQRSTUVWXYSMODEMK MACZ[\]^_`abcdefghiSMODEMK MACjklmnopqrstuvwxySMODEMK MACz{|}~SMODEMK MACPHONE 001CRCKLISTCRCCRC COM!"!6""Y!\+w x>22_ }meKAYPRO II BYE ver 1.2 as of 04/29/83 Make sure switches 2,4,6 & 7 are up and others down. $ z $2t>> äǣ1˧2_> 2p @!'ͩqfxAT H0 Z fxAT E0 M0 V0 S0=1 >2]n>>!>>ǣ>"M>"M!x  qfqxAT Z e ]ʌRʝr ݡʠ Type "R" to resume, anythinD COMMODEMPATASMCMODEMPATCOM^14-DISK DOCg else to warm boot: $Resuming... $!">2 >2 >2>2xx !B\  \<]2|!ͬ]O7äBۤBx Enter password: !ۤ`ڈ_ Ҝ ^@O_Ƣ ~x Incorrect_T# ~{±x Please Wait... ͝ > 2]:pACxLoading system... ۤ͝ >>?7:! {:2x[Invalid drive, returning to A:]:! ģģ:2x> [Invalid user number, returning to 0]  A xˣxǣ>Gˣu ! !u *+++~# .d>> ǣǣx Good-bye, call again fxAT H0 Z >2t>>ǣ1˧x [Carrier Lost] 2tͻ*û|\>!~#͕>פ>:2q!"r:tä٣*r+"r|:q=ޤ@!'͕ͩۤŸۤ:>ȯ:tQ>7y :G7b :xáN7#~zANDY KAY !O"2O![GOOVҥ!!"!-ceive object-code informal file (terminal mode). - CRC - (cycle redundancy check option). - Auto line-feed is generated in the Echo mode. - Greatly enhanced menu. - Display number of file sectors in decimal and hex during SEND/RECEIVE file. - XON-XOFF recognition in transfer informal file mode. - Telephone directory - The telephone directory is a separate file. This allows fast editing without the need to recompile the modem program. Also, FOREWORD This program was originally MODEM7.MAC written by Ward Christensen and revised by M.Zeiger and J.Mills for the PMMI modem board. Full credits for expertise and talent that made this program possible, belong solely to these people. Many other individuals contributed to the developement of this program, but mentioning them and their contributions here would make this file somewhat unmanagable. Rightful credits are documented in various v ...V - View as sent/received =========================== ...Q - Quiet, no messages ^O - Off line/exit to menu ...T - return to Terminal mod ^Z - END of file ...E - return to Echo mode ^S - XOFF character ...D - Disconnect phone ^Q - XON character ...C - CRC check/not checksum ^P - Printer (toggle on/off) (receive option only) ^T - Transmit informal file ...A - Answer Mode (& offhook) ^R - Receive informal file ..G!O>**!{z ][Program area too small]$*xV: $:pC 6#G<] $  ǣx+++ ǣ>z~O#~z{~ͬӦTxMessage from Sysop:> xSystem going down in 5 minutes...> ́Ö́mäۤ7BYE COM: $:pCWELCOME TXTSIGNON COM many directories may be accessed. - Auto-dial from internal directory to SMARTMODEM. - Direct dial from program intiation or from menu. - All macros are included in the source listing. - Adapted source code to conform to Microsoft's M-80 macro assembler syntax. *** SMODEM MENU *** COMMANDS - IN MENU MODE ======================= WRT - Write informal file to disk DEL - Erase informal file from disk RET - Return to terminal mode (no data loss)ersions of MODEM. My appologies. Many additional routines included are copyrighted (1980) by Mark M.Zeiger and J.Mills. Permission is granted to use, but not to sell these routnes. Enhancements were added to the original program to take advantage of Smartmodem's Auto Dial feature, Escape to Command Mode and On Hook features. These features include... - Kill a disk file. - Terminal mode/Echo mode toggle. - List device toggle, (terminal mode). - Send/re.O - Orig. Mode (& offhook) ^E - Terminal/Echo (toggle on/off) ^D - Disconnect phone (SMARTMODEM) ^X - Cancel send/receive COMMANDS IN MENU MODE DETAILED EXPLANATION ***** WRITE INFORMAL FILE TO DISK - 'WRT' ----------------------------------- For the porpose of definition, an 'Informal file' is one which is set-up for recieving or transmitting data, without data validity checks, in the terminal mode. W *** SMODEM *** CP/M HAYES-SMARTMODEM PROGRAM =============================== Version 3.6 Adapted by Walter Blady Upgraded to version 3.7 by Jim Mills, CACHE. KAYPRO II Configuration by MICRO CORNUCOPIA PO BOX 223 BEND, OR 97709 A MODEM UTILITY FOR 8080 OR Z80 BASED COMPUTERS USING CP/M 2.+ AND AN EXTERNAL SMARTMODEM *****  DSC - Disconnect phone (SMARTMODEM) CAL - Auto dial from list (SMARTMODEM) XPR - Expert mode (Toggle menu on/off) DIR - Directory CPM - Exit to CP/M K - Kill disk file [fn.ext] S... - Send CP/M file [fn.ext] SECONDARY OPTIONS R... - Receive CP/M file [fn.ext] ================= T - Terminal mode ...B - Batch file mode E - terminal mode with Echo ...S - show as Sent ...R - show as Received COMMANDS - IN TERMINAL MODE   hen data has been saved to an 'Informal file', the file must be closed before continuing with other options. The 'WRT' command writes all remaining buffered data to the disk and then closes the file. Information will be lost if this is not done. DELETE INFORMAL FILE - 'DEL' ---------------------------- This command will delete the 'Informal file' and it won't be saved on the disk. All information held in memory from previous saves will be erased. RETURN TO TERMINAL MODE - 'REIER' message will be sent and SMARTMODEM will go to an on hook (hang-up) state. To redial the same number, give the command 'A/'. All the standard HAYES commands can be issued while in the terminal mode. A second option for dialing a number is from the terminal mode, using the standard SMARTMODEM dial command. Simply type ATD TELEPHONE DIRECTORY ------------------- Directories may be given any name and kept on any disk, but there must always be a 'Default dire eg. Initiate and ask for directory name. SMODEM C (primary option) eg. Initiate and load the default directory 'PHONE.001', then dial the number associated with the directory letter 'M'. SMODEM C M ^ (directory-letter) eg. Initiate and dial the given number. SMODEM C 231-1898 ^ (any number) Auto-dial may also be used from the MENU mode with 'CAL', The commands are exactly the same except the --------- This option terminates the modem program and returns to the cp/m operating system. KILL A DISK FILE - 'K file.name' -------------------------------- Files may be deleted from the disk without leaving the modem program. CP/M rules apply. eg. >>K file.name, >>K *.ASM, >>K B:file.A?M PRIMARY AND SECONDARY OPTIONS DETAILED EXPLANATION ***** There are eight primary options in SMODEM. OrigiT' ------------------------------- The 'RET' command is used to re-enter the terminal mode with no data loss. If information has been saved to an 'Informal file', the user may re-enter the menu mode, but all saved data will be lost if a return to the terminal mode is made with the 'T or E' options. Using the 'RET' allows re-entry to the terminal mode and preserves all saved information. DISCONNECT (SMARTMODEM) - 'DSC' ------------------------------- When Disconnect is inctory' with the name 'PHONE.001' on the default drive. SMODEM automatically loads this file if a direct dial is called for. Phone directories may be set-up in two different ways; (see the models below). These models could be saved to separate files and used as actual directories. More may be set up by duplicating the model over and over. Only the entries need be changed. EXPERT MODE - 'XPR, X' ---------------------- If the 'X' option is included in the command line when code 'CAL' is used instead of the 'C' primary option. If the command 'CAL' is used alone, SMODEM will ask for a directory name. When the phone directory is up, any number in the directory may be dialed by entering a 'directory-letter and pressing return. Or any number may be typed in the command line. The dial command 'ATD' and the selected number are automatically sent to the SMARTMODEM. If you wish to cancel a call while the phone is ringing, press return. The 'NO CARRnate and Answer options are not used since SMARTMODEM handles these automatically. A primary option may be included in a command line when initiating SMODEM, or while in the menu mode, but only ONE is allowed. The exception is with 'T', 'M' and 'E'. They may be used as secondary options during 'send' or 'receive' S... Send a file R... Receive a file T... Terminal mode E Echo mode X Expert mode C... Auto-dial mode M Menu mode itiated, the HAYES default escape code '+++' is first sent to the modem to re-enter the command state, then the 'on-hook' command 'ATH' is sent. This causes the modem to hang up. The program then enters the menu mode. AUTO-DIAL (SMARTMODEM) - 'CAL, C' --------------------------------- The Auto-dial feature allows the user to call a number automatically from one of several phone directories. Auto-dial primary option may be used in three different ways when initiating SMODEM: SMODEM is initiated, it will come up with the menu display turned off. The menu may be toggled on and off during run- time with the 'XPR' option. Therefore it is best to run with the menu off and toggling to it only when necessary, this action permits messages to be seen that would otherwise be lost due to the menus clear screen function. DIRECTORY - 'DIR ' ---------------------- This option prints the specified disk directory to the screen. RE-ENTER CP/M - 'CPM' ------------   K... Kill a CP/M file There are twelve secondary options. These options may be entered in a command line when initiating SMODEM or while in the menu mode. More than one secondary option may be included in a command line. If the (CRC) option is used, then a maximum of six may be included. As you can see, 'T', 'M' and 'E' are also used as secondary options. ...S Print to screen/sending ...R Print to screen/receiving ...V Print send & receive ...Q Don't print messages ce in file.name is NOT allowed with the receive option.) When sending a batch of files, ambiguous references may be used according to the rules of CP/M. eg. >>SBST *.BAS S...Send files B...Batch mode S...Print files to the screen as they're being sent T...When through, enter the terminal mode *.BAS...Send all the files on the default disk with the extention of 'BAS'. eg. >>SBCM file.name1 file.name2...n : SMODEM...Initiate SMODEM S...Send a file Q...Don't print any system messages on the screen T...After the file is sent, go to the terminal mode B:...The file is on drive B: file.name...The name of the file to be sent (File names may contain ambiguous references, according to the rules of CP/M) The 'B' batch file secondary option may ONLY be used from the menu mode. It may not be included in a command line during initiation ofal command. The user is the asked if the received data is object code. (All data is either object code or ASCII.) eg. >>T file.name Once in the terminal mode, any incoming data may be saved to this file by simply pressing the '^R' receive toggle. Data may be intermitantly saved by toggling on or off. As soon as all desired data is saved, the file must be closed with the 'WRT' command, from the menu mode. Incoming material may be temporarily stopped and started by issuing the ...T Return to Terminal mode ...E Return to Echo mode ...D Disconnect ...B Batch files mode ...C (CRC) request ...M Return to Menu mode cyc. redundancy check (option in receive only) ...A Answer Tone connect ...O Originate Tone connect to phone line. to phone line. SENDING/RECEIVING WITH SMODEM ***** (Sending/Receiving FORMAL Files) The clasification 'FORMAL' means that all transmitted data are che S...Send files B...Batch mode M...Enter the menu mode after all files are sent file.name...The list of files to be sent. When receiving files in Batch mode, the file names are NOT specified. They are sent by the sender. SMODEM automatically receives and uses these names on the disk. eg. >>RBCE R...Receive files B...Batch mode C...Send a (CRC) character redundancy request to the sender specifying a (CRC) check of data SMODEM. Command lines entered from the menu mode are virtually the same, except the word 'SMODEM' is not typed. eg. >>RRD file.name ^ (primary option) The above command line means: R...Receive a file R...Type the file to screen as it is being received D...Disconnect the phone after the file is received file.name...The name of the received file. (The file.name doesn't have to match the sender's. Ambiguous referen '^S' XOFF' and '^Q XON' commands. To send an informal file, the '^T' transmit command is given from the terminal mode. eg. ^T Following this command the user is asked if the file to be sent is 'object code', then prompted for the file.name. The data is sent immediately following a carriage return, so care must be taken that the receiver has enough time to prepare. OPTION SUMMARY ***** PRIMARY Ocked for validity against received data. There are two data-check options available. (See information below.) If a primary option is used in a command line when initiating SMODEM, it must be the first character following the name SMODEM, with one space preceeding it. Secondary options immediately follow the primary, with no spaces. Secondary options may be entered in any order. eg. SMODEM SQT B:file.name ^ (primary option) The above command line means instead of the default CHECKSUM method. E...Go to the Echo mode after all files have been received. (Sending/Receiving INFORMAL Files) Files may be sent or received from the Terminal mode. The clasification 'INFORMAL' simply means that data validity checks are NOT made on transmitted data. (You takes your chances.) To save data to an informal file, a file.name must first be specified in the menu mode while giving the 'T' termin  PTIONS =============== SEND A FILE - 'S...' -------------------- Send CP/M files individually or in batch mode using CHECKSUMS or CRC checks. RECEIVE A FILE - 'R...' ----------------------- Receive CP/M files individually or in batch mode using CHECKSUMS or CRC checks. TERMINAL MODE - 'T ' ------------------------------- Enter terminal mode (without echo.). If is specified, then an informal file is set up and data may be or they can be specified using ambiguous file names (CP/M convention). Individual file names are sent to the receiver first, then the file contents, until all files are sent. (CRC) cycle redundancy check - 'C' ---------------------------------- SMODEM defaults to a 'checksum' method of checking data validity during send/receive. Although quite accurate, it is not virtually error free. The secondary option 'C' may be included in the command line to force a (CRC) check of data. Thou are already online and begin whatever command you gave it. SHOW FILE AS SENT - 'S' ----------------------- Selecting this option will display the file being sent, on the screen. SHOW FILE AS RECEIVED - 'R' --------------------------- This option will display the file being received, on the screen. SHOW FILE - 'V' --------------- Display sent or received file on the screen. QUIET MODE - 'Q' ---------------- Surpress all system messages; (don't display on ion. TERMINAL/ECHO (TOGGLE) - ^E --------------------------- Switching between Terminal mode and Echo mode can be accomplished by pressing ^E. A message is printed to warn if ECHO ON or ECHO OFF. PRINTER (TOGGLE) - ^P --------------------- All incoming data may be sent to the printer while in terminal mode. This feature does NOT operate while receiving a file using the 'R' (receive) primary option. A message is printed warning if PRINTER ON or PRINTER OFF. TRANSMIsaved to this file using the (Receive) ^R' toggle. ECHO MODE - 'E' --------------- Enter echo mode. Echo all characters back to the sender. Auto line feeds are sent following each carriage return. Both terminals may NOT be in echo mode at the same time or SMODEM will go boobs up. EXPERT MODE - 'X' ----------------- This mode surpresses the menu display upon initiation of SMODEM. AUTO-DIAL (SMARTMODEM) - 'C ' -------------------------------------- Dial e (CRC) methode is 99.99% error proof. The only restrictions are: - Both sender and receiver must use one of the MODEM series programmes that have the (CRC) option. - The (CRC) option may only be included in a RECEIVE command line. If SMODEM detects a request for (CRC) during a SEND file, it automatically switches over and informs the operater with a screen message. TERMINAL MODE OPTIONS ***** OFF-LINE - ^O ---the screen). TERMINAL MODE - 'T' ------------------- Enter the terminal mode. may not be specified when when using 'T' as a secondary option. DISCONNECT (SMARTMODEM) - 'D' ----------------------------- Issue the 'Escape' code to the HAYES SMARTMODEM, then hang up the telephone and re-enter the menu mode. BATCH MODE - 'B' ---------------- This option is used to send multiple files. File names can be individually specified in the command line, T INFORMAL FILE - ^T --------------------------- This command will send a disk file informally (without error checking). After pressing ^T, the user is prompted for the file.name, and if the file being sent is object code. The file is immediately sent following a carriage return. The transmission can be terminated with the cancel key ^X. OBJECT CODE (SCREEN PROMT) -------------------------- Object code files may be SAVED or SENT while in the terminal mode. The user isa number directly or display the telephone directory and wait for command. SECONDARY OPTIONS ================= ANSWER TONE - 'A' ----------------- Selecting this option tells the smartmodem to go online using answer (higher frequency) tones. ORIGINATE TONE - 'O' -------------------- Selecting this option tells the smartmodem to go online using originate (lower frequency) tones. If neither 'A' or 'O' are specified, SMODEM will assume y---------- This command will allow re-entry to the menu mode without disconnecting the phone. END OF FILE - ^Z ---------------- This command sends an end of file ASCII character. XOFF - ^S --------- The XOFF character tells the sending computer to stop data transmission temporarily. (The sender must recognize XON/XOFF protocol). XOFF is used in conjunction with the XON. XON - ^Q -------- The XON character tells the sending computer to resume data transmiss   prompted during informal file transfer/receive as to whether an object code file is being transmitted. There are no checks to ensure data validity, therefore this feature should only be used when it is not possible to use the 'R' (receive) or 'S' (send) primary options. RECEIVE INFORMAL FILE (TOGGLE) - ^R ----------------------------------- The receive toggle may be used only if a was specified when entering the terminal mode. eg. T Alternately p212-441-3755 R Robert L. .........621-8788 S Sorcerer BBS 1-313-535-9186 T Tony Loutenbach ...223-9238 U V W Walter Blady ......231-1898 X Y Z $ ^ ^ ^ | | | (two spaces) (carriage return | line feed pair (the $ MUST be te noise doesn't inadvertantly stop transmission. PHONE DIRECTORY ***** Two types of directory formats may be set up. (a) TWO ENTRIES PER LINE ------------------------ The directory itself begins with the letter 'A' and ends with the'$'. 'A' MUST BE THE FIRST CHARACTER IN THE FILE. (No CR/LF pairs preceding it.) Do not include the spacing guide below. 123456789012345678901234567890123456789012345678901234567890++ Al source code for the PMMI modem The Baud rate and parity select options may be included in a future version. Auto-dial is a built-in feature of SMARTMODEM, and was not needed. SMODEM must be assembled with Microsoft's M80 Macro assembler. The assembly commands to create a CP/M COM file are: M80 =SMODEM L80 /P:100,SMODEM,SMODEM/N/E note: filename for BIG BOARD I is SMODEM1.MAC BIG BOARD II is SMODEM2.MAC If anyone adds features to this programressing 'R' turns the save feature ON and OFF and the user is prompted with 'SAVE ON' or 'SAVE OFF' message. When the save function is ON, data is simultainiously saved and printed on the screen, and each printed line is preceded by a colon ':' (The colon is not sent to the file.) ECHO MODE (TOGGLE) - ^E ----------------------- Alternately pressing this key toggles between the terminal mode and echo mode. The user is prompted with an 'ECHO ON' or 'ECHO OFF' message. DISCONNECT he last character) not seen, but there) (b) ONE ENTRY PER LINE ---------------------- THERE MUST BE EXACTLY 31 CHARACTERS per line, including the CR/LF pair. Other than that, the rules are the same as the directory above. 1234567890123456789012345678901 A Alphons Stretch....423-1191 B Bernice streetcar..222-0198 C etc...n ^^ $ || (last 2 spaces rep.CR/LF pairs) The length of line in the second directory may Apple CBBS.........499-2908 B Tony Bagshaw.......881-1532 C Conn TRS Pick......839-4561 D Conn TRS Miss......266-9110 E Conn TRS North Y...667-9981 F Frank Aylesworth...633-7497 G Bill Groskuth IRN..421-1922 H Heathkit BBS ......273-3011 I J K.Jeejeebhoy ......924-1517 K Microm CBBS........226-7430 L Les Popelyak ......495-2086 M Missisaga CBBS.....826-5394 N O P P.M.I.CBBS(Punter).624-5431 Q Queens BBSNY.1-, or has any comments or suggestions, I would appreciate hearing them. W.B. 1-(416) 231-1898. 17 Bermuda Ave. Toronto, Ontario Canada M8Y 2P6 Or leave a message on Mississaga Can. RIBBS 1-(416) 826-5394. END (SMARTMODEM) - ^D ---------------------------- This key sends the SMARTMODEM default escape code '+++' then issues the command 'ATH' causing the modem to go to an ON-HOOK state (hang up). CANCEL SEND/RECEIVE - ^X ------------------------ This key may be used to cancel files being sent or received in the informal mode, or files being sent using the primary option 'S'. Files being received with the primary option 'R' can't be cancelled by the receiver. This ensures that lin be made longer, but alterations must be made in the 'dial routines', in the MAC file. CAUTION: -------- All NUMBERS in the directory line will be sent to SMARTMODEM. Only the numbers to be dialed should be present. CONCLUSION ========== This program does not include some of the options that were present in other versions: - Baud rate change - Parity select - Force-send last character typed - Auto dia   The KayPro II (and the other models) emulate the Lear-Seigler ADM-3A terminal. In order to install some screen oriented software it is necessary to know the terminal attributes. The following may help. CURSOR CONTROL cursor left - 8 dec 08H cursor right - 12 dec 0CH cursor down - 10 dec 0AH cursor up - 11 dec 0BH home cursor - 30 dec 1EH clear scr & home 26 dec 1AH carriage return 13 dec 0DH CURSOR POSITION The values for 8 data bits, 1 stop bit, No Parity are: word1 = 68 dec word2 = 193 dec word3 = 106 dec These are values to correctly tell the Z-80 sio chip what to do, each bit is significant. For other values see a Zilog data book. To set the baud rate you just send an integer between 0 and 15 dec to port 0 For 300 baud send 5, for 1200 baud send 7 out(0),5 ' 300 baud OR out(0),7 ' 1200 baud The status port for the RS-232 has 3 registers, only 2 are used for asyncc keyboard status - 7 dec keyboard data - 5 dec parallel status - 9 dec parallel data - 8 dec system status - 29 dec 1DH system data - 28 dec 1CH RS-232 INITIALIZATION procedure initmod(word1,word2,word3 = integer) var sio,resetchan,nointerrupt,reg1,reg3,reg4,reg5 = integer sio = 6 rem { RS-232 status port } resetchan = 24 rem { sio channel reset } nointerrupt = 0 rem { turn off interupts } reg1 = 1 remo send 6 DSR data set ready 7 signal ground 8 DCD data carrier detect 20 DTR data terminal ready Well there you have it the hardeware-software interface for two of the most used communications peripherals on the KayPro the screen and the RS-232 port. ING rows = 0 - 23 dec columns = 0 - 79 dec escape sequence - 27, 61 dec 1BH, 3DH constant offset = 20 dec 14H So in Mbasic to position the cursor at row 12, col 40 print chr$(27)chr$(61)chr$(20+12)chr$(20+40) ESC = row col LINE INSERT / DELETE insert line - 27, 69 dec 1BH, 45H { scroll down } delete line - 27, 82 dec 1BH, 52H { scroll up } CLEAR TO END OF Lhronus communication, 0 and 1. Nothing special needs to be done to read register #0, i.e N=inp(6) works just fine, but in order to get to read register #1 you must write to the status port first, i.e out(6),1 to get register #1 then: N=inp(6) to get the value in register #1. The bits in read register #0 are: 0 = Rx char ready 1 = Int pending 2 = Tx buffer empty 3 = DCD (data carrier detect) 4 = Sync/Hunt (synchronous only) 5 = CTS (Cl { next byte goes to register #1 } reg3 = 3 rem { next byte goes to register #3 } reg4 = 4 rem { next byte goes to register #4 } reg5 = 5 rem { next byte goes to register #5 } begin rem { change 2 byte integer to 1 byte integer with chr function } out(sio),chr(resetchan) out(sio),chr(reg4) : out(sio),chr(word1) out(sio),chr(reg1) : out(sio),chr(nointerrupt) out(sio),chr(reg3) : out(sio),chr(word2) out(sio),chr(reg5) : out(sio),chr(word3) end INE / SCREEN clear to EOL - 24 dec 18H clear to EOS - 23 dec 17H CHANGE CHARACTER SETS set ASCII - 27,65 dec 1BH,41H set greek - 27,71 dec 1BH,47H In order to use the RS-232 port for communications it must be initialized to the proper data word length, parity, and number of stop bits as well as the correct baud rate. Below is an I/O port map and an RS-232 initialization procedure in Sbasic. I/O PORTS RS-232 status - 6 dec RS-232 data - 4 deear to send) 6 = Tx underrun/Eom (?) 7 = Break/Abort The bits in read register #1 are: 0 = All sent 1 = 2 = Field bits in previous & 2nd previous bytes (?) 3 = 4 = Parity error 5 = Rx overrun error 6 = CRC/framing error 7 = End of frame KAYPRO RS-232 PINOUT Only pins 1 - 8 and 20 seem to be used and they go like this: 1 frame ground 2 Tx transmit data 3 Rx recieve data 4 RTS request to send 5 CTS clear t  !9"> 1> x XMODEM v6.2 (CRC capable) :^CC:]R†2 :]/ >>>D>>>>>>>02 SR͊ ++ Invalid Option on XMODEM command ++ Use S for Send - R (or RC) for Receive $͒fP͡ w2 : >| Ç ͒x ---> File Open - Ready to Receive >2 x -> Awaiting initial SOH 2 2 چN wͺtf ͺy Ç !]~ ½͊ ++ No File Name Specified ++ $ ~?#¿͊ ++ Wild Card Options are not Valid ++ $2 2  >>0W@@ : @2 z - : 2 z= : 2 >ͩ Op >M : R y eÐ A xt ͩ Oʝ >K  >2 x -> Awaiting initial NAK/C 2 2  # C* 6>2 : >2 x x -> a x H Received, not NAK/C 2 6 2 !l\͗ 2|2h: X _O!j  s 0B ~ʅ B #y Ð  *> ~#— !" O* yO}o|g |g}!o² " ͩ ͩ * T]* |>C@e a Different Name ++ $2h2|\<͊ ++ ERROR - Can't Make File -- Directory may be full? ++ $>?2h>2 \<¹͊ ++ File not Found ++ $\<¹: o&T: _)))))))" =!oF+++: Җx2 ~2 Ö2h2|\< ͊ ++ Open Error ++ $:]:^J͊ ++ File is Not for Distribution, Sorry ++ $x ---> File open: * ͟ x ( x Hex) Sectors ---> Send time: :_!! ~* H &͟ x mins, !( :_~^ l l l l &͟ x secs at !/ :_ x Baud  MODEM HELP 27/JUNE/83 JIM RAY CORVALLIS OR. As a new user to the world of computers and spending hours and hours trying to fill in the things that the user guides and DOC files on modems don't tell you. I thought that this cookbook type layout might help get you going on the modem. I have not put all the why's and where-for's in, if you want more information you can do your own research, I don't care what makes a program work, I just want the things to work when I need them.  ڕ]7>2 : 1>2 x x -> a x H Received, not SOH 2 >2 : t>2 x x -> : @@ʑx Framing : ʧx Overrun : ʼx Parity x Error(s) on Receive 2  : >: >>C| : <2 x ++ Unable to Copy Block - Aborting ++ y ex ++ Incomplete Receive File Deleted ++ Ð \<͊ ++ Can't Delete Received File ++ $: >2 : ³>2 x x -> Timed Out on Receive 2 : 7ɯ2  ڕ]W ڕ x ---> To cancel: Control-X  1J3&!110$300$450$600$710$1200$O)|X g}oL G\l&e }o|g>o\<͊ ++ Can't close File ++ $ ڨ  |ğ {0B |a }a : =2 * ͕ " : 7@ \% =4 ͊ ++ File Read Error ++ $! y: >2 y2 !@ "  * !͕ " : <2 : O@ \¢ ! o 2 !@ " ͙ | ͊ ++ Error writing File ++ $>0 Ga    >K 7 Here is what you do to get your MODEM UP AND RUNNING. I am using a modem that has the phone lines plugged in, if you have the type that you put the handset in the modem you will have to make some changes. I have a KAYPRO 2 and DATASPEAK modem, and MODEM7 program set up for the KAYPRO. You should know how to use PIP and a few other CP/M commands and have your modem hookup to your computer, phone lines plugged in, it works better that way. I spent an hour trying to get the computer to excep]/L>2 : ">2 x x -> Bad Sector Number Received 2 z2 ͠ ! ڕ]w,X: ʖQ ڕ]: G: ʴ<6 ڕ]˜ ʅͺ>| >| : | : /| ͠ !~| ,y| z| {|  3: <2 ͊ ++ Can't send record - Aborting ++ $1>  9>|  F> | ͊ ++ XMODEM Program Cancelled ++ $* #" >2 : Sʨx -> Received Sector #x -> Sending Sector #* ͟ x ( x H) 2 2 \<͊ ++ File Exists - Us  t a carrier, then found out that the modem was not plugged into the computer. Conventions and codes: "" MEANS PUSH RETURN KEY "CARRIER" IS THE SIGNAL SENT OUT BY THE COMPUTER YOU CALLED. "CTRL" CONTROL KEY (HOLD DOWN AND HIT NEXT KEY LISTED) "ESC" ESCAPE KEY EVERYTHING THAT YOU HAVE TO ENTER ON THE KEYBOARD WILL BE IN [[ ]].. TO BEGIN: CONNECT THE MODEM TO THE PHONE LINE; CONNECT THE MODEM TO THE COMPUTER. TURN THE COMPUTER ON. TURN THE MODEM ON.  HOW TO TRANSFER FILES WHEN YOU ARE IN TO THE OTHER COMPUTER TRY CALLING UP SOME FILES USING THE "TYPE" COMMAND. YOU WILL FIND SOME FILES ARE NOT READABLE LIKE FILE NAMES ENDING IN "OBJ", "DQC"AND "LBR". THESE FILES NAMES HAVE BEEN CHANGED TO EITHER PROTECT THE FILE OR MAKE THEM FASTER TO TRANSFER BY SQUEEZING (SQ)THE FILE. TO TRANSFER A FILE THAT IS READABLE WITH THE "TYPE" COMMAND: OR TO SAVE WHAT IS COMING IN TO YOUR COMPUTER OVER THE PHONE LINE. **************************-STEP-TWOE PASS WORD BUT YOU NEED TO START TYPING THE PASS WORD WITHIN 7sec. (THAT THEY DON'T TELL YOU) AND THE PASS WORD THAT YOU TYPE WILL NOT SHOW ON YOUR SCREEN. (THE ABOVE INFORMATION IS TRUE FOR ONLY TWO RCPM'S THAT I KNOW OF. MOST WILL LET YOU KNOW ABOUT THE NEED FOR TYPING SPEED IN ENTERING THE PASSWORD.) NOW THAT YOU ARE TALKING TO THE OTHER COMPUTER, YOU CAN USE MOST ALL CP/M COMMANDS TO LOOK AT FILES. SOME COMPUTERS ARE SET UP WITTRL E ]] THIS TAKES YOU BACK TO MODEM MENU [[ WRT ]] THIS WILL SAVE THE FILE TO DISK, AND CLOSE THE FILE. (IF YOU LEAVE OUT THIS STEP YOU MAY LOSE PART OR ALL OF THE FILE YOU WANT TO SAVE.) YOU CAN CHECK TO SEE IF YOU GOT THE FILE ON DISK AND NOT LOSE YOUR CARRIER. [[ CPM ]] THIS WILL TAKE YOU TO CPM IN YOUR COMPUTER. B>[[ TYPE filename.type ]] THE FILE YOU TRANSFERRED SHOULD COME UP ON YOUR SCREEN. IF IT DIDN'T THEN TRY AGAIN. YOU STILL HAVE A CARRIER YOU NEED TERM.COM AND MODEM.COM FILES ON ONE DISK, PUT THIS DISK IN DRIVE A BLANK FORMATTED DISK IN DRIVE B *************************--STEP-0NE-***************************************** A>[[ B: ]] B>[[ CTRL C ]] B>[[ A:TERM ]] (Term's Message will appear on the screen) [[ ESC ]] (NOW YOU SHOULD HAVE A B> AFTER THE TERM MESSAGE) B>[[ A:MODEM ]] (NOW YOU SHOULD HAVE THE MODEM MENU UP ON SCREEN ASKING FOR A COMMAND.) [[ T ]] (THIS IS WHERE YOU DIAL THE -************************* USE STEP-ONE TO GET INTO THE OTHER COMPUTER AND WITH "DIR" FIND THE FILE THAT YOU WANT TO TRANSFER, WRITE DOWN THE FILE NAME. [[ CTRL E ]] THIS WILL BRING UP THE MODEM MENU. [[ T filename.type ]] THIS TELLS YOUR COMPUTER THAT YOU WANT TO SAVE A FILE,AND TAKES YOU BACK INTO THE OTHER COMPUTER. (ENTER THE FILE NAME YOU WANT TO SAVE) [[ CTRL Y ]] THIS TURNS ON THE 'SAVE FILE' IN YOUR COMPUTER. THIS H A MENU. OTHERS ARE FAIRLY PLAIN, BUT YOU SHOULD READ WHAT THEY HAVE TO SAY AND FOLLOW DIRECTIONS. YOU SHOULD BE OK; DON'T WORRY ABOUT HURTING ANYTHING IN THE OTHER COMPUTER, YOU CAN'T!! IF YOU GET 'A>' TRY TYPING [[ DIR ]]. THE COMPUTER THAT YOU ARE TALKING TO SHOULD WORK JUST LIKE YOUR OWN COMPUTER, JUST SLOWER. YOU MAY ASK: "NOW THAT I'M IN HOW DO I GET OUT?" 1-SOME COMPUTERS TELL YOU. 2-TRY [[ BYE ]] THIS MAY LOCK-UP YOUR KEYBOARD (USE RESET) 3-HANG UP (SWITCH MODEM TO PHONE). B>[[ A:MODEM ]] THIS WILL GET BACK TO MODEM MENU. [[ T ]] THIS WILL GET YOU BACK TO THE OTHER COMPUTER. [[ ]] YOU SHOULD HAVE 'A>' FROM THE OTHER COMPUTER YOUR READY TO TRY AGAIN OR TRANSFER ANOTHER FILE. PLAY WITH THIS A FEW TIMES SO THAT YOU GET THE HANG OF THINGS, IF THINGS DON'T WORK, TRY CHANGING THEN AROUND LIKE BEFORE OR AFTER CTRL Y. TO TRANSFER FILES THAT HAVE 'OBJ' OR THAT HAS 'Q' AS THE SECOND CHARACTER OF ITS FILE TYPE YOU NEED TO USE THE PROGRAM PHONE NUMBER OF THE COMPUTER THAT YOU WANT TO TALK TO, NO NEED TO RUSH THE COMPUTER WILL WAIT FOR YOU. AFTER THE RING YOU SHOULD GET A STEADY TONE, SWITCH YOUR MODEM FROM PHONE TO MODEM AND YOU SHOULD GET A CARRIER LITE ON YOUR MODEM) HANG UP PHONE [[ ]] (YOU MAY HAVE TO USE 2 OR 3 TO GET THE OPENING MESSAGE OF THE COMPUTER YOU CALLED TO COME ON SCREEN) PASS WORD- SOME COMPUTERS NEED A PASS WORD, IF YOU ARE TO BE IN THERE, ARE LOCAL SYSTEM TELLS YOU TH IS A TOGGLE SWITCH; TO TURN OFF THE 'SAVE FILE' "CTRL Y" A 2nd. TIME. [[ ]] [[ TYPE filename.type ]] THE FILE YOU WANT TO SAVE WILL START TO TYPE OUT ON YOUR SCREEN WITH A ":" (COLON) MARK IN FRONT OF EACH LINE. IF THE ":" IS NOT THERE THEN FILE IS NOT BEING SAVED WHEN THE FILE YOU WANT TO TRANSFER IS COMPLETED. YOU WILL HAVE 'A>' AFTER THE LAST LINE IN THE FILE. [[ C  CALLER XMODEM.COM. THIS PROGRAM SHOULD BE IN THE COMPUTER THAT YOU ARE CALLING. Any file with an extent of 'OBJ' is an executable file IF IT IS RENAMED to 'COM'!! so you have to transfer the file to your system, and then REName it. Any file that has a 'Q' as the second character of its extent has been "squeezed" to eliminate some extra space. You need to transfer the file to your system and then UnSQueeze it with the program "USQ.COM". (USQ.COM may be named with other names all similar toF AWAITING#01. AFTER THE ++TIME OUT++. THAT'S ALL THERE IS TO IT, WHEN THE FILE IS COMPLETED YOU WILL GET, "TRANSFER COMPLETED" AND "A>" YOU CAN TRANSFER ANOTHER FILE OR "CTRL E" TO GET BACK TO THE MODEM MENU. TO TRANSFER A FILE THAT HAS BEEN "SQ" ("Q" IN FILE TYPE) YOU DO NOT CHANGE THE FILE NAME. A>[[ XMODEM S filename.type ]] [[ CTRL E ]] [[ R filename.type ]] YOU CHANGE THE FILE WITH 'USQ.COM' AFTER YOU HAVE SAVED THE FILE. TO SEND A FILE TO THE OTHER COMPUTER YOU JUSͤ͗AdRʮÜ͟8aͨ8ʍͣ ++ FILE TRANSFER COMPLETED ++ îͣ ++ FILE TRANSFER UNSUCCESSFUL ++ îͣ ++ TRANSFER CANCELLED ++ 26# 6 #¼6#ͣ ++ IS OUTGOING FILE OBJECT CODE? >>&͏"͗:&N8Y3ͣANSWER YES OR NO ONLY PLEASE! >2ͣ ++ ENTER FILE NAME TO BE TRANSFERED...C/R TO QUIT ++ COMMAND >>&͏"͗&!ͺ#!*ͱͼ*¸~:<ͱͼ#­3$ USQ.) The program 'XMODEM.COM' is used to transfer files ... and is started with the command "XMODEM S filename.ext" or "XMODEM R filename.ext". The first one (with the S) sends the file to your system, the second Receives a file from your system. ************************-STEP-THREE-****************************** THIS IS WHAT YOU DO TO TRANSFER AN 'OBJ' FILE TO YOUR COMPUTER USE STEP-ONE TO GET INTO THE OTHER COMPUTER FIND THE FILE THAT YOU WANT TO TRANSFER AND WRITE IT DOWN A>[[ X>ATDT$+++$ATH $D!9"&1&> 2&PD>2%/2d:%Xo>2:% MC!&FE/DD>2%**:%TSʦRKg:%q:] >2%/2qͣ ++ IS INCOMING FILE OBJECT CODE? >>&͏"͗:&NPYKͣ ++ ANSWER YES OR NO ONLY PLEASE! ++ >2ͳB&&!,"&>2%ͱBͼ—ͣ ++ ECHO ON ++ /:/2<ͣ ++ PRINTER ON ++ qͣ ++ PRINTER OFF ++ qTq?:%B:T CHANGE THE R AND S AROUND. A>[[ XMODEM R filename.type ]] THE 'R' TELL THE OTHER COMPUTER TO RECEIVE A FILE. [[ CTRL E ]] [[ S filename.type ]] THE 'S' TELLS YOUR COMPUTER TO SEND THE FILE. THAT IS ABOUT ALL I CAN HELP YOU WITH. TO THE OLD HAND AT THESE COMPUTERS BEFORE YOU SAY ANYTHING WHY DID YOU EVEN READ THIS FAR, I WROTE THIS FOR THE VERY NEW USER. '!ͤ@~ 1=1O+1 0x-0Y*: >ͱ/ͼ€ͣ ++ ECHO OFF ++ q™:/2/ /> Ù:%>2&:&x ͧ>B2%>͞:] ö́PD\2&2:%QL^>͞^:%->2&t 8>B2%:] >N ͳ7:%{:%{ͣ ++ FILE OPEN, READY TO RECEIVE ++ :%>†>C͞͸ ڛ\É:%ͣ ++ AWAITING NAME NAK ++ P>͞!&5*&\ "&>͞7 !]MODEM S filename.type ]] YOU WILL GET INFO. LIKE --->FILE OPEN; --->SEND TIME; [[ CTRL E ]] [[ R filename.COM ]] THIS TELLS YOUR COMPUTER TO RECEIVE THE FILE AND CHANGES THE NAME TO 'COM' AT THE SAME TIME. YOU WILL GET ON YOUR SCREEN: AWAITING#01 AWAITING#02 ++TIME OUT++ 00 THIS TELLS YOU THAT YOU HAVE MATCHED UP AND THAT THE FILE IS BEING TRANSFERRED. ALL YOU HAVE TO DO IS SIT BACK AND WAIT. YOU WILL GET A LONG STRING O/2<#ͣ ++ RECEIVE ON ++ Bͣ ++ RECEIVE OFF ++ B!-0q*::ͤ:=̛qq>!22 !,:w#ͤ:w#ͤ>!-0 x*6#}l&)>o,6&6+|&!&ͷ!\& !ͷ!lͷ:& ʜ͖͌ͣ ++ FILE DOES NOT EXIST ++ ͣ ...TYPE 'R' TO RETURN TO MODEM ++ ...TYPE 'A' TO RE-ENTER NAME COMMAND >>ͼ  ~͞:%~ĤK8  # >͞:%ėQKm >u͞:%` ͣ ++ CHECKSUM ERROR ++ P>͞>͞!\͹:%ʡ ͣ ++ AWAITING FILE NAME ++ a ڡ ͳ ʱ 7!]K :% ͣ ++ TIME OUT RECEIVING FILENAME ++ - _  w:%~Ĥ>͞#}- ù :%ėy͞K_ !\͹:%V ͣ ++ CHECKSUM ERROR ++ a V ô >͞ K7>2&2& ! g"&* !\&ͺ# ں :f• *&\ "&!&4Õ !&5‰ ! g"&:&A>@2&!&6!&N!& 6 !&F#& ~ #& ~ ! 2&! '"&͞ͷ ++ WRITE ERROR...DISK FULL ++ $**:VxG: -0w\\V7*͐O:%ʖ:%›: &ʛW:%ʴ:%¹: &ʹW͐O3$'!:%:%ͣ ++ AWAITING INITIAL (NAK) ++ KCͣ ++ (CRC) REQUEST RECEIVED ++ 2%*""""!6]2% ʈ!% €6k#w:%—:%R:%¡è:%>  :%$6ATOR...*&ͣ (0ͣH) >͞:&͞:&/͞>2 &͇!~͞,?2 &y͞͸z͞{͞ EG:%ʞ͗xͣH RECEIVED...NOT (ACK) ++ :&<2& :%ʶ:%ʻ7ͷ ++ CAN'T SEND SECTOR...ABORTING ++ $:%ʞͣ ++ TIMEOUT ON (ACK) ++ Þͱͼ1&K>͞K'> ͣ͞ ++ ROUTINE CANCELLED ++ >B2%%*&#"&}>2%/2:] \<¨ͣ ++ FILE DOES NOT EXIST ++ ^!\^!:%\<ͣ ++ FILES EXISTS, TYPE 'Y' TO ERASE...ͼͤY==========   'ͣ++ ENTER NUMBER/LETTER...C/R TO QUIT >>&͏"͗:&!&~ f#!&5ʥS0ڥ:ږ[ڀuڀñ@G! 'ʑÉÚ:&_> $ʰã~&#±0:ͤͣ ++ DIAL COMPLETED...NOW IN TERMINAL MODE ++ > **>2%/2qͣ ++ FAULTY NUMBER...INSPECT DIRECTORY ++ d!ͣ ++ FILE DOSN'T EXIST ++ d!ͣ ++ BAD NUMBER...CALL AGAIN ++ d!ͣ ++ BAD NUMBER...TRY AGAIN ++ &!\ͺ#d:]CEMTmKSR:% "&+#& ~  :&<2&#& ~   6 *&&~ ? #2 #~ ? "&!&p }\ȇ!o ~ƒ #~+] !e~w#~w\!\l !u6B#6A#6Kl!l6\:\<ã 2h: . >2 !\  ͭ :\2 ! \ ͭ \b ! \ ͭ \! \ ͭ \<7k 2 =Ɓo&  ͭ ] ͭ 2h2|>Ô5^4*%@>2@3~# x­ ɯ2&2&:% ͣ AWAITING SECTOR...*&#ͣ (ͣH) } K $Z $O $R $+++$:%2%:%€:%Y!]:ͣ TRANSFERRED ++ :\2&!\ͷ:&2\!%&:&¦>2&2%/2:%ʚ:%ͣ ++ ALL TRANSFERS COMPLETED ++ >2%/2:%%ͣ ++ DISCONNECTED ++  $͗6$6*q:%q:%/5 x;!l\2|2h ʊ ʊ ʊ pڊ>(͊>)ÊO_> ͤ> ͤOa{_  |{0͊|}\ͣ ++ NO FILE SPECIFIED ++  x.\<ͷ ++ CAN'T MAKE FILE...DIRECTORY FULL ++ $#\*}" &!"}\<ͷ ++ CAN'T OPEN FILE...NOT FOUND ON DISK ++ $:%:%ͣ ++ FILE OPEN...SIZE: * &ͣ (ͣH) SECTORS \<ͷ ++ CAN'T CLOSE FILE...NOT FOUND ON DISK ++ $:&=2&[*&"&:&7 '\ʦ=ʵͷ ++ READ ERROR...END OF FILE ++ $! yʻg>2&y2&! '"&D*&!"&:&<2&:&O '\ͣ ++ BAD OPTION ++ ":m ͣ ++ RE-ENTER PRIMARY OPTION AND FILE NAME ONLY COMMAND >>&͏":m >2>2%/>2%!"O*yO}o|gҭ|g}!o™"͐͐*T]*|>ͣ ++ INVALID OPTION ++  x!%&!%% 2 22/2&:Y!ͣ COMMANDS - IN MENU MODE Configured for: KAYPRO II WRT - Write informal file to disk DEL - Erase informal file from disk SECONDARY OPTIONS DSC - Disconnect phone (SMARTMODEM) ...B -  7G:%# :%H ͗xͣH RECEIVED, NOT (SOH) ++ KH :%>[ >C͞:&<2& ڼ :%x :%~ ʸ ͷ ++ UNABLE TO RECEIVE BLOCK...ABORTING ++ $:%ʿ :%H ͣ ++ TIMEOUT...:&͗H Kڱ WKڱ /.:%:%H ͣ ++ BAD SECTOR NUMBER IN HEADER ++ H z2&>2 &͇!Kڱ w,?:%uQ2 &Kڱ °:&G:&<Kڱ wd:%ʘ:%H ͣ ++ CRC ERROR... :%ʾ:%H ͣ ++ CHECKSUM ERROR... ø >͞:%ͣ SENDING SECT  0ä:% <ɯ2&ͣ ++ MULTIPLE ERRORS ENCOUNTERED ...TYPE 'Q' TO QUIT ...TYPE 'R' TO RETRY COMMAND >>ͼ͗RQ~ʰ͊#ä Ͳͣ:%%>Q2%~#PHONE 001>2!&~*w>2!&~ #!&5| 0|:ږbͣ++ ENTER DIRECTORY NAME >>&͏":& !ͷ͌u!ͷ! ͖ ...Q - Quiet, no messages CPM - Exit to CP/M ...T - return to Terminal mode K - Kill disk file [fn.ext] ...E - return to Echo mode S... - Send CP/M file [fn.ext] ...D - Disconnect phone R... - ReceiKj p ;.PEQ TRUE FALSEP CPM2b DBFSIZQ ,BOTRAMP ERRLIM)Q CHE> ͥ#>ͥ#Ý">#ͥ#> ͥ#> ͥ#Ó"G>#ͥ#> ͥ#> ͥ#xʝ"ͥ#8#Ý">ͥ#5Ý"> ͥ#> ͥ#Ý"> ͥ#> ͥ#F##> w#s#͓#}#͋#*͝#*ͱ#* O4$#^#6 _$q$ $ # q$ $ $# $ _$q$ $ q$#ͅ$ ͅ$6# > X$>X$ > X$>X$w#X$:o$_@w# . q$w#q$~*ʕ$#‡$Ø$ͪ$~*ʦ$#Ú$ͪ$6?#ª$&!\ͺ#!%ͷ:l2%:m g%u%͐%2%%I%́%~9% VERSION WAS PREPARED BY WALTER BLADY FOR USE WITH THE HAYES SMARTMODEM. AN EXTENDED AND MORE FLEXIBLE AUTO-DIAL FEATURE WAS ADDED. THE USER NOW HAS THE ABILITY TO KEEP SEVERAL TELEPHONE DIRECTORIES ON THE DISK AND THESE MAY BE EDITED WHEN NEW INFORMATION MUST BE ADDED. 02/13/82: Fixed program to allow "A" and "O" options to be specified by user. Previously, you had to use direct cmnds to SMARTMODEM or use the dialer routine to connect! Jim Mills, CACHE. ***** \ ve CP/M file [fn.ext] ...C - CRC check (receive only) T - Terminal mode ...A - go offhk in Answer mode E - terminal mode with Echo ...O - go offhk in Orig. mode COMMANDS - IN TERMINAL MODE ^O - Off line/return to menu ^T - Transmit informal file ^Z - END of file ^R - Receive informal file ^S - XOFF character ^X - Cancel send/receive ^Q - XON character ^D - Disconnect phone (SMART .COMMENT \ *** SMODEMK *** CP/M SMARTMODEM PROGRAM ======================= Version 3.6 Adapted by Walter Blady Upgraded to version 3.7 by Jim Mills, CACHE. Configured for: KAYPRO II KAYPRO II Configuration by Micro Cornucopia PO BOX 223 Bend OR 97709 To assemble this program and create a CP/M 'COM' file, use MICROSOFT'S M80 assembler and the following commands: M80 =SMODEMK L80 /P~9%#%ͣ | :%<2%̗%c%$ͣ ++ FILE NOT FOUND ++͗>? !%w#n%!m% _!:%ʜ%@ã%A2%ͣ DRIVE : P  MIQ` DISP>&͏"͗&r"DSCr"CPMr"DIR!r"RETڿ!*&qr"WRT%"r"XPRV"r"DEL"r"CAL:&!l"`"oͲ$^!:& &6>2%/2!&ͷ:%:& *& ->2%/22!&ͷ:/2F#k"a"7SRTEK~ʋ"ƒ"#t">#…"7#j#կz# [#"" ##N# ڝ"G#4+~#D#pxͥ##Ý"#G~w"+xF6 "xͥ#Ý"4Ý"ͥ#:100,SMODEMK,SMODEMK/N/E FOR FULL INFORMATION ON THE USE OF 'SMODEM', PLEASE REFER TO THE FILE 'SMODEM.DOC'. THIS PROGRAM WAS ORIGINALLY MODEM7.MAC WRITTEN BY WARD CHRISTENSEN AND REVISED BY M.ZEIGER AND J.MILLS FOR THE PMMI MODEM BOARD. FULL CREDITS FOR EXPERIENCE AND TALENT THAT MADE THIS PROGRAM POSSIBLE, BELONG SOLELY TO THESE PEOPLE. MANY ADDITIONAL ROUTINES INCLUDED ARE COPYRIGHTED (1980) BY MARK M.ZEIGER AND J.MILLS. PERMISSION IS GRANTED TO USE BUT NOT SELL THESE ROUTINES. THIS  E = TERM/ECHO TOGGLE OFFLIN EQU 'O'-40H ; ^O = OFFLINE WITHOUT DISCONNECT DISCCHR EQU 'D'-40H ; ^D = DISCONNECT TRANCHR EQU 'T'-40H ; ^T = TRANSFER CHARACTER CAN EQU 'X'-40H ; ^X = CANCEL SEND/RECEIVE EOFCHAR EQU 'Z'-40H ; ^Z = END OF FILE SAVECHR EQU 'R'-40H ; ^Y = RECEIVE CHARACTER XOFF EQU 'S'-40H ; ^S = XOFF CHARACTER XON EQU 'Q'-40H ; ^Q = XON CHARACTER CRC EQU 'C' ; CRC CHECK INSTEAD OF CHECKSUM CLS EQU 1AH ; CLEAR SCREEN FOR ADM3A SOH EQU 1: OUT MODATP ;out modem data port RET ANSNDB: ANI MOSNDB ;bit to test/send ready RET CPSNDR: CPI MOSNDR ;value send bit/ready RET INDATP: IN MODATP ;in modem data port RET ANRCVB: ANI MORCVB ;bit test receive ready RET CPRCVR: CPI MORCVR ;value receive ready RET OTCTLP: IN MOCTLP ;modem output control port RET ;SIO PORT A INIT TABLE INITS: DB 04H ;SELECT REG 4 DB 01000100B ;16 X CLOCK, 1 STOP BIT DB 01H ;SELECT REG 1 DB 00000100B ;STATUS AFFECTS VECTORRTMODEM. '+++'= THE HAYES DEFAULT ESCAPE CODE TO RE-ENTER THE COMMAND STATE, AND 'ATH'= THE HANG-UP COMMND. THE '$'= END COMMAND LINE (MUST BE IN PLACE). \ OFFHK: DB '+++$ATH',CR,'$' ;MODEM ESCAPE AND DS 4 ;HANG-UP CODE FASCLK: DB TRUE ;2 MZ OPERATION = FALSE...4 MZ = TRUE BKBYTE: DB TRUE ;TRUE = MAKE .BAK FILE XPRFLG: DB FALSE ;FALSE = PRINT MENU ON INITIALIZATION LSTFLG: DB 0 ;LIST DEVICE FLAG MACFLG: DB 0 ;SEND/RECEIVE OBJECT CODE FLAG ;SIO PORT A ASSIGNMENTS MOCTLMD.LINE INR B ;UP ONE FOR CHAR.COUNTER CALL MOVE JMP DIALPL RSTR1: CPI 'E' ;ECHO MODE? JZ TRMECHO ;YES CPI 'D' ;DISCONNECT? JZ DNTCB ;YES, DISCONNECT & GO MENU CALL MOVEFCB MVI A,FALSE STA NFLFLG CALL INDATP ;GOBBLE UP GARBAGE.. CALL INDATP ;..CHARACTERS ON LINE LDA OPTION ;PROCESS MAIN OPTION CPI 'T' ;TERMINAL MODE? JZ DSKSAVE  ; START OF HEADER EOT EQU 4 ; END OF TEXT ESC EQU 1BH ; ESCAPE ACK EQU 6 ; ACKNOWLEDGE NAK EQU 15H ; NOT ACKNOWLEDGE BDNMCH EQU 75H ; BAD NAME MATCH OKNMCH EQU ACK ; OKAY NAME MATCH LF EQU 0AH ; LINEFEED CR EQU 0DH ; CARRIAGE RETURN FF EQU 0CH ; FORM FEEDE BELL EQU 7 ; BELL CHARACTER YES EQU 59H ; NO EQU 4EH ; JMP START ;BEGINNING OF PROGRAM .COMMENT \ 'STYLE' DEFINES T DB 03H ;SELECT REG 3 DB 11000001B ;8 BITS/RX CHARACTER DB 05H ;SELECT REG 5 DB 11101000B ;8 BITS/TX CHARACTER START: LXI H,0 DAD SP ;GET CP/M'S STACK SHLD STACK ;SAVE IT LXI SP,STACK ;START LOCAL STACK MVI A,' ' STA FCB3+1 CALL START1 START1: CALL INITDR ;INITIALIZE ADDRESSES MVI A,TRUE ; 0FFH STA NFLFLG CMA ; 0 STA SAVFLG CALL PROCOPT ;PROCESS CONTRP EQU 6 ;SIO A CONTROL PORT MOSNDB EQU 4 ;MODEM SEND READY BIT MOSNDR EQU 4 ;VALUE WHEN MODEM SEND READY MORCVB EQU 1 ;MODEM RECEIVE READY BIT MORCVR EQU 1 ;VALUE WHEN MODEM RECEIVE READY MODATP EQU 4 ;MODEM DATA PORT IF CHEK FRMER EQU 00H ;FRAMING ERROR MASK ORUNER EQU 00H ;OVERRUN ERROR MASK PARER EQU 00H ;PARITY ERROR MASK ERRMSK EQU 00H ;MASK TO BLOCK ALL BITS EXCEPT ENDIF ;CHEK ;I/O ROUTINES FOR SERIAL PORT INCTLP: IN MOCTLP ;in modem control port RET OTDATP ;YES CPI 'S' ;SEND A FILE? JZ SENDFIL ;YES CPI 'R' ;RECEIVE A FILE? JZ RCVFIL ;YES CPI 'K' ;KILL A FILE? JZ KILFIL ; YES, GO DO IT JMP MENU ;NO OPTION SPEC'D, GO MENU ;REVISED TERMINAL ROUTINE ALLOWING MEMORY SAVE DSKSAVE:LDA NFLFLG ;NEW FILE FLAG CPI TRUE ;OFFH? (TRUE=NORMAL TERMINAL MODE) JZ TERM ;YES LDA FCB+1 ;FIRST CHAR OF FILENAME CPI ' ' HE DIALING COMMAND THAT WILL BE SENT TO THE HAYES SMARTMODEM WHEN USING THE AUTO DIALING OPTION. 'AT'= ATTENTION...'D'= DIAL. AND THE '$'= END OF COMMAND LINE (MUST BE IN PLACE). COMMANDS TO HAYES MAY ALSO BE ENTERED DIRECTLY IN TERMINAL OR ECHO MODES. 4 EXTRA BYTES ARE ALLOTED FOR LONGER COMMANDS. \ STYLE: DB 'ATDT$' ;MODEM DIALING COMMAND...ENTER A 'P' DS 4 ;OR 'T' FOR PULSE OR TOUCH AFTER THE ;'ATD' IF DESIRED. .COMMENT \ 'OFFHK'DEFINES THE ESCAPE AND HANG-UP CODE SENT TO THE SMAOL OPTIONS LDA OPTION ;GET MAIN OPTION CPI 'X' ;EXPERT FLAG? JNZ RESTAR ;NO MVI A,TRUE ;YES STA XPRFLG ;MAKE EXPERT JMP MENU RESTAR: LDA OPTION ;GET MAIN OPTION CPI ' ' ;NO OPTION SPEC'D? JZ MENU CPI 'M' ;MENU ASKED FOR? JZ MENU ;YES, GO MENU CPI 'C' JNZ RSTR1 LXI H,80H ;POINT TO CP/M CMDBUF LXI D,CMDBUF+1 MOV B,M ;GET LENGTH OF COM   ;FILE SPEC'D JNZ GOODNM ;YES, GOOD NAME MVI A,TRUE ;0FFH STA NFLFLG ; CMA ; 0 STA SAVFLG ; JMP TERM ; GOODNM: CALL ILPRT DB CR,LF,'++ IS INCOMING FILE OBJECT CODE? >>',0 LXI D,CMDBUF CALL INBUFF CALL CRLF LDA CMDBUF+2 CPI NO JZ GODNM2 CPI YES JZ GODNM1 CALL ILPRT DB CR,LF,'++ ANSWER YES OR NO ONLY PLEASE! ++',CR,LF,LF,0 JMP GOODNM GODNM1: MVI A,0FFH STA MACFLG ;DON'T PROCESS THEM ANI 7FH ;STRIP PARITY PUSH PSW ;SAVE FILTERED CHAR. TERML9: POP PSW ;GET FILTERED OR ORG.CHAR. PUSH PSW ;SAVE IT AGAIN CALL TYPE LDA LSTFLG INR A JNZ PUSHON POP PSW CALL LISTDV PUSHON: LDA SAVFLG INR A JNZ NOSAVE POP PSW MOV M,A INX H SHLD HLSAVE ;MENU COMMAND DESTROYS HL-REG.. ;..GET HL WHEN ENTERING VIA 'RET' CMD. CPI LF ;IF NO FRONT PANEL, T+ PRINTER OFF ++',CR,LF,0 JMP TERM TERCON: CPI TRANCHR ;^T TEST FOR TRANSFER REQUEST CZ TRANSFER ;SEND-A-FILE (BLIND SEND) JZ TERM ;LOOP CPI SAVECHR ;^R TEST FOR RECEIVE REQUEST JNZ NOTOG ;NO, CONT. LDA NFLFLG ; YES BUT, DO NOT ALLOW SAVE IF.. CPI TRUE ;..THIS FLAG IS SET. JZ TERML LDA SAVFLG ;SAVE DATA TO DISK? CMA ;MAKE TOGGLE STA SAVFLG ;SAVE IT INR A JNZ PRR1  JZ CTRLQ LDA LSTBY1 ;GET THE LAST BYTES THAT WERE.. MOV M,A ;..SAVED AND PUT THEM IN.. INX H ;..BOTRAM. CALL TYPE DCR D JZ CTRLQ LDA LSTBY2 MOV M,A INX H CALL TYPE CTRLQ: MVI A,XON ;SEND START CHARACTER.. CALL OTDATP ;..TO REMOTE COMPUTER. RET .COMMENT \ THIS SUBROUTINE WILL LOOP UNTIL THE MODEM RECEIVES A CHARACTER OR 100 MILLISECONDS. IF A CHARACTER IS ;SET CODE FLAG ON GODNM2: CALL ERASFIL CALL MOVE2 LXI D,FCB3 MVI C,MAKE CALL BDOS LXI D,FCB3 MVI C,OPEN CALL BDOS LXI H,BOTRAM SHLD HLSAVE MVI A,FALSE STA NFLFLG TERM: CALL STAT ;KEYPRESS? JZ TERML ;NO, CHECK LINE CALL KEYIN ;GET CHAR FROM KBD CPI ECOTOG ;^E? JNZ TERM10 CALL ILPRT DB CR,LF,'++ ECHO ON ++',CR,LF,0 JMP THEN.. JNZ NOCOLON ;..TYPE ":" AFTER EACH LINE FEED.. MVI A,':' ;..WHEN MEMORY SAVE ACTIVE. CALL TYPE NOCOLON:LDA 07H ;CHECK TO SEE IF.. DCR A ;..PAGE BELOW BDOS HAS BEEN.. CMP H ;..REACHED AND DISKSAVE IS NEEDED. CZ INTDSSV JMP TERM NOSAVE: POP PSW JMP TERM SAVFLG: DB FALSE LSTBY1: DB 0 LSTBY2: DB 0 INTDSSV:MVI A,XOFF ;SEND A CTRL-S TO STOP.. CALL OTDATP ;..REMOTE COMPUTE CALL ILPRT DB CR,LF,'++ RECEIVE ON ++',CR,LF,0 JMP TERML PRR1: CALL ILPRT DB CR,LF,'++ RECEIVE OFF ++',CR,LF,0 JMP TERML NOTOG: CALL OTDATP TERML: CALL INCTLP CALL ANRCVB CALL CPRCVR JNZ TERM CALL INDATP PUSH PSW ;SAVE ORG.CHAR. LDA MACFLG ;GET MACHINE LANG.FLAG INR A ;MACHINE LANG.COMING THROUGH? JZ TERML9 ;YES...SKIP FILTER POP PSW ;SAVE ORIG.CHAR CPI 00H ;CHECK FOR NULLS JZ TERM  RECEIVED, A FLAG IS SET TO STORE THE CHARACTER.A MAXIMUM OF TWO CHARACTERS ARE STORED, BUT MORE MAY BE STORED IF DESIRED (SEE COMMENT IN "INTDSSV" ABOVE). \ INMODEM:LXI B,1250 TIMERL: CALL INCTLP CALL ANRCVB CALL CPRCVR JZ GETBYTE DCX B MOV A,B ORA C JNZ TIMERL RET GETBYTE:CALL INDATP INR D RET NMRECS:MVI M,EOFCHAR INX H LXI D,127 DAD D NMREC1:LXI D,-(BOTRAM) DAD D RMECHO ;YES, GO ECHO MODE TERM10: CPI OFFLIN ;^O? JZ MENU ;YES, RETURN TO MENU CPI DISCCHR ;^D? JZ DNTCB ;YES, DISCONNECT & RETURN TO MENU LST: CPI PRINTR ;^P? JNZ TERCON ;NO OUTPUT TO LIST DEV...CONT. LDA LSTFLG ;GET LIST DEV.TOGGLE CMA ;MAKE TOGGLE STA LSTFLG ;SAVE IT INR A JNZ LST1 CALL ILPRT DB CR,LF,'++ PRINTER ON ++',CR,LF,0 JMP TERM LST1: CALL ILPRT DB CR,LF,'+R OUTPUT. MVI D,0 ;D IS THE BUFFER COUNT CALL INMODEM ;GET LAST BYTES SENT.. STA LSTBY1 ;..AFTER CTRL-S. CALL INMODEM ;ADD MORE CALLS TO INMODEM.. STA LSTBY2 ;..AND STA LASTBYT# IF YOU ARE.. ;..LOSING BYTES WHEN MEMORY IS FULL. PUSH D CALL NMREC1 CALL WRTDSK ;WRITE THE RECORDS POP D LXI H,BOTRAM INR D DCR D ;TEST BUFFER COUNT FOR ZERO    MOV A,L ;DIVIDE HL BY 128.. ORA A RAL ;..TO GET THE.. MOV L,H ;..NUMBER OF SECTORS MVI H,0 PUSH PSW DAD H POP PSW MVI A,0 ADC L MOV L,A ;RETRNS WITH NUMBER OF.. RET ;..128 BYTE RECORDS IN HL. WRTDSK: LXI D,BOTRAM NEXTWRT:MVI C,STDMA CALL BDOSRT PUSH D LXI D,FCB3 MVI C,WRITE CALL BDOSRT POP D  DB CR,LF,'++ FILE TRANSFER UNSUCCESSFUL ++',CR,LF,BELL,0 JMP RETURN TRANCAN:CALL ILPRT DB CR,LF,'++ TRANSFER CANCELLED ++',CR,LF,BELL,0 RETURN: XRA A STA MACFLG POP PSW POP B POP D POP H RET ;ENTRY AT +2 WILL LEAVE.. INITFCB:MVI M,0 ;..DRIVE NO. INTACT. INX H ;WILL INITIALIZE AN FCB.. MVI B,11 ;..POINTED TO BY HL-REG. FILLS 1ST POS LOOP10: MVI M,' ' ;..WITH 0, NEXT 11 WITH.. INH MEANS JNZ CONTIN ;FILE DOES NOT EXIST TRNSL1:CALL ILPRT DB CR,LF,'++ FILE DOES NOT EXIST ++',CR,LF,LF,0 TRNSL2:CALL ILPRT DB ' ...TYPE ''R'' TO RETURN TO MODEM ++',CR,LF DB ' ...TYPE ''A'' TO RE-ENTER NAME ',CR,LF,LF DB ' COMMAND >>',BELL,0 CALL KEYIN CALL UCASE CALL TYPE ;ECHO RESPONSE CALL CRLF CPI 'A' JZ GET CPI 'R' JZ RETURN JMP TRNSL2 CONTIN: LXI D,80H  JNZ SNDCH9 TWO: CALL STAT JZ THREE CALL KEYIN CPI CAN JZ SNDCH9 THREE: CALL INDATP CPI XON JNZ TWO SNDCH9: POP H POP D POP B CPI CAN RZ MOV A,M CALL MODOUT PUSH PSW LDA MACFLG INR A JZ SNDC1 POP PSW CPI EOFCHAR RZ PUSH PSW SNDC1: POP PSW ;RESTORE STACK CALL STAT ;TEST TO SEE IF ORA A ;CANCELLATION REQUESTED JZ SKIP12 CALL KEYIN CPI CAN RZ SKIP12 XCHG PUSH D LXI D,128 DAD D POP D XCHG DCX H MOV A,H ORA L JNZ NEXTWRT RET CLOSE3: LXI D,FCB3 MVI C,CLOSE CALL BDOS RET BDOSRT: PUSH B PUSH D PUSH H PUSH PSW CALL BDOS POP PSW POP H POP D POP B RET MOVE2: LXI H,FCB3 CALL INITFCB LXI H,FCB LXI D,FCB3 MVI B,12 CALL MOVE RET ;FILX H ;..WITH BLANKS, AND LAST.. DCR B ;..21 WITH NULLS. JNZ LOOP10 MVI B,21 LOOP11: MVI M,0 INX H DCR B JNZ LOOP11 RET GETNAME:CALL ILPRT DB CR,LF,'++ IS OUTGOING FILE OBJECT CODE? >>',0 LXI D,CMDBUF CALL INBUFF CALL CRLF LDA CMDBUF+2 CPI NO JZ GTNAM2 CPI YES JZ GTNAM1 CALL ILPRT DB 'ANSWER YES OR NO ONLY PLEASE!',CR,LF,LF,0 JMP GETNAME GTNAM1: MVI A,0FFH STA MACFLG ;SET CODE FLAG ON G MVI C,STDMA CALL BDOS READMR: CALL READ80 CPI 1 ;END OF FILE JZ RETRNS CPI 2 ;BAD READ JZ RETRNU CALL SEND80C CPI EOFCHAR ;END OF FILE - OMIT IF OBJECT.. JZ RETRNS ;..CODE IS TO BE SENT. CPI CAN ;CANCELLATION? JZ TRANCAN JMP READMR RETRNS:CALL ILPRT DB CR,LF,'++ FILE TRANSFER COMPLETED ++',CR,LF,BELL,0 JMP RETURN RETRNU:CALL ILPRT : INX H DCR B JNZ SENDCH1 RET MODOUT: PUSH PSW MODOTL: CALL OTCTLP CALL ANSNDB CALL CPSNDR JNZ MODOTL POP PSW CALL OTDATP CALL TYPE RET FCB4: DS 33 ;TERMINAL ECHO MODE TRMECHO:CALL INCTLP CALL ANRCVB CALL CPRCVR JNZ KEYBRD LINECHR:CALL INDATP LINEC2: CALL MODOUT PUSH PSW LDA LSTFLG INR A JNZ KYCONT POP PSW CALL LISTDV PUSH PSW KYCONT: POP PSW CE TRANSFER ROUTINE - CALLED WITH ;CONTROL-T FROM TERMINAL ROUTINE. ;TRANSFER MAY BE CANCELLED WHILE SENDING BY USING CONTROL-X. TRANSFER: PUSH H PUSH D PUSH B PUSH PSW LXI H,FCB4 CALL INITFCB ;INITIALIZES FCBS POINTED.. LXI H,FCB+16 ;..TO BY HL REG. CALL INITFCB GET: CALL GETNAME LDA CMDBUF+2 ;WAS FILE ENTERED CPI 20H JZ TRNSL2 CALL MOVE4 CALL OPEN4 CPI 0FFH ;RETURN WITH 0FFTNAM2: CALL ILPRT DB CR,LF,'++ ENTER FILE NAME TO BE TRANSFERED...C/R TO QUIT ++',CR,LF,LF DB ' COMMAND >>',0 LXI D,CMDBUF CALL INBUFF CALL CRLF RET MOVE4: LXI D,CMDBUF LXI H,FCB4 CALL CPMLINE RET OPEN4: LXI D,FCB4 MVI C,OPEN CALL BDOS RET READ80: LXI D,FCB4 MVI C,READ CALL BDOS RET SEND80C:MVI B,80H LXI H,80H SENDCH1:PUSH B PUSH D PUSH H CALL INDATP CPI XOFF  PI CR JNZ TRMECHO MVI A,LF JMP LINEC2 KEYBRD: CALL STAT JZ TRMECHO CALL KEYIN CPI ECOTOG JNZ KEYBR3 CALL ILPRT DB CR,LF,'++ ECHO OFF ++',CR,LF,0 JMP TERM KEYBR3: CPI OFFLIN JZ MENU CPI DISCCHR JZ DNTCB CPI PRINTR ;^P? JNZ KEYBR2 ;NO OUTPUT TO LIST DEV...CONT. LDA LSTFLG ;GET LIST DEV.TOGGLE CMA ;MAKE TOGGLE STA LSTFLG ;SAVE IT JMP TRMECHO KEYBR2: CALL MODOUT CPI CR JNZ TRMECHO MVI EN, READY TO RECEIVE ++',CR,LF,0 RCVFST: LDA CRCFLG ORA A MVI A,NAK JNZ RCVFL2 MVI A,CRC RCVFL2: CALL SEND RCVLP: CALL RCVSECT JC RCVEOT CALL WRSECT CALL INCRSNO CALL SENDACK JMP RCVLP RCVEOT: CALL WRBLOCK CALL SENDACK CALL CLOSFIL JMP DONE ;SUBROUTINES SENDFN: LDA QFLG ORA A JZ SWNAK CALL ILPRT DB CR,LF,'++ AWAITING NAME NAK ++',CR,LF,0 SWNAK: MVI E,80  ;NO...SEND CHECKSUMS CALL GETACK JC SENDRPT JMP SENDLP SENDEOF:MVI A,EOT CALL SEND CALL GETACK JC SENDEOF JMP DONE ; RECEIVE A FILE RCVFIL: LDA BATCHFLG ;CHECK IF MULT.. ORA A ;..FILE MODE. JNZ RCVC1 MVI A,FALSE ;FLAG WHERE TO RETURN.. STA SENDFLG ;..FOR NEXT FILE TRANS. CALL GETFN ;GET THE FILE NAME. JNC RCVC2 ;CARRY SET MEANS NO MORE FJC SCKSER CPI ACK JNZ ACKLP INX H ;NEXT CHAR DCR D JNZ NAMLPS MVI A,EOFCHAR ;TELL RECEIVER END OF NAME CALL SEND LDA QFLG ORA A CNZ CRLF MOV D,C ;SAVE CHECKSUM MVI B,1 CALL RECV ;GET CHECKSUM.. CMP D ;..FROM RECEIVER. JZ NAMEOK SCKSER: MVI A,BDNMCH ;BAD NAME-TELL RECEIVER CALL SEND LDA QFLG ORA A J A,LF JMP KEYBR2 ; SEND A CP/M FILE SENDFIL:LDA BATCHFLG ;CHECK IF MULTIPLE FILE.. ORA A ;..MODE IS SET. JNZ SENDC1 MVI A,TRUE ;INDICATE BATCH SEND STA SENDFLG LDA FSTFLG ;IF FIRST TIME THRU.. ORA A ;..SCAN THE COMMAND LINE.. CNZ TNMBUF ;..FOR MULTIPLE NAMES. CALL SENDFN ;SENDS FILE NAME TO RECEIVER JNC SENDC2 ;CARRY SET MEANS NO MORE FILES. MVI A, CALL WAITNLP MVI A,ACK ;GOT NAK, SEND ACK CALL SEND LXI H,FILECT DCR M JM NOMRNM LHLD NBSAVE ;GET FILE NAME.. LXI D,FCB ;..IN FCB MVI B,12 CALL MOVE SHLD NBSAVE CALL SENDNM ;SEND IT ORA A ;CLEAR CARRY RET NOMRNM: MVI A,EOT CALL SEND STC RET SENDNM: PUSH H SNDNM1: MVI D,11 ;COUNT CHARS IN NAME MVI C,0 ;ILES. MVI A,'B' ;STOP BATCH.. STA BATCHFLG ;..MODE OPTION. JMP DONE RCVC1: LDA FCB+1 ;MAKE SURE FILE IS NAMED CPI ' ' JZ BLKFILE JMP RCVC3 RCVC2: CALL CKCPM2 CALL CKBAKUP RCVC3: CALL ERASFIL CALL MAKEFIL LDA QFLG ORA A JZ RCVFST LDA BATCHFLG ORA A ;DON'T PRINT MSSG IF.. JZ RCVFST ;...IN MULTI AND QUIET MODE. CALL ILPRT DB CR,LF,'++ FILE OPZ SKCSR1 CALL ILPRT DB CR,LF,'++ CHECKSUM ERROR ++',CR,LF,0 SKCSR1:MVI E,80 ;DO HANDSHAKING OVER CALL WAITNLP ;DON'T PRINT "AWAITING NAK" MSG MVI A,ACK CALL SEND JMP SNDNM1 NAMEOK: MVI A,OKNMCH ;GOOD NAME-TELL RECEIVER CALL SEND POP H RET GETFN: LXI H,FCB CALL INITFCB+2 ;DOES NOT INITIALIZE DRIVE LDA QFLG ORA A JZ GNAMELP CALL ILPRT DB CR,LF,''B' ;STOP BATCH.. STA BATCHFLG ;..MODE OPTION. MVI A,EOT ;FINAL XFER END CALL SEND JMP DONE SENDC1: LDA FCB+1 CPI ' ' JZ BLKFILE SENDC2: CALL CNREC CALL OPENFIL MVI E,80 CALL WAITNAK SENDLP: CALL RDSECT JC SENDEOF CALL INCRSNO XRA A STA ERRCT SENDRPT:CALL SENDHDR CALL SENDSEC LDA CRCFLG ;CRC REQUEST? ORA A CZ SNDCRC ;YES...SEND CRC CHECKS CNZ SENDCKSINIT CHECKSUM LXI H,FCB+1 ;ADDRESS NAME NAMLPS: MOV A,M ;SEND NAME ANI 7FH ;STRIP HIGH ORDER BIT SO CP/M 2.. CALL SEND ;..WON'T SEND R/O FILE DESIGNATION. LDA QFLG ;SHOW NAME IF.. ORA A ;..QFLG NOT SET. MOV A,M CNZ TYPE ACKLP: PUSH B ;SAVE CKSUM MVI B,1 ;WAIT FOR RECEIVER.. CALL RECV ;..TO ACKNOWLEDGE.. POP B ;..GETTING LETTER.   ++ AWAITING FILE NAME ++',CR,LF,0 GNAMELP:CALL HSNAK JC GNAMELP CALL GETNM ;GET THE NAME CPI EOT ;IF EOT, THEN NO MORE FILES JZ NMRNMG ORA A ;CLEAR CARRY RET NMRNMG: STC RET GETNM: PUSH H GETNM1: MVI C,0 ;INIT CHECKSUM LXI H,FCB+1 NAMELPG:MVI B,5 CALL RECV ;GET CHAR JNC GETNM3 LDA QFLG ORA A JZ GETNM2 CALL ILPRT DB CR,LFAME ;SEARCH FOR NAMES (* FORMAT) JC NEXTNM LDA FCB+10 ;IF CP/M 2 $SYS FILE.. ANI 80H ;..DON'T SEND JNZ TNLP2 LHLD NBSAVE ;GET NAME LXI D,FCB ;MOVE IT TO FCB XCHG MVI B,12 CALL MOVE XCHG SHLD NBSAVE ;ADDR OF NEXT NAME LXI H,FILECT ;COUNT FILES FOUND INR M JMP TNLP2 NEXTNM: LXI H,NAMECT ;COUNT NAMES FOUND DCR M JNZ TNLP1 LXI H,N LDA QFLG ;..BY TOO MANY CHARS. ORA A JZ GCKSR1 CALL ILPRT DB CR,LF,'++ CHECKSUM ERROR ++',CR,LF,0 GCKSR1:CALL HSNAK ;DO HANDSHAKING OVER JC GCKSR1 JMP GETNM1 GNRET: POP H RET HSNAK: MVI A,NAK ;SEND NAK UNTIL.. CALL SEND ;..RECEIVING ACK. CALL CKABORT ;DON'T GET HUNG UP HERE MVI B,2 ;WAIT 2 SECONDS.. CALL RECV ;..IN RECEIVE. CPI CAN  LDA NAMECT ;COUNTS NAMES INR A STA NAMECT SCNLP4: INX H ;EAT SPACES DCR B JZ DNSCAN MOV A,M CPI 20H JZ SCNLP4 JMP SCNLP3 DNSCAN: MVI M,20H ;SPACE AFTER LAST CHAR POP H RET ;PLACES NEXT NAME IN BUFFER SO CPMLINE MAY PARSE IT TRTOBUF:LHLD BGNMS MVI B,0 LXI D,FCBBUF+2 TBLP: MOV A,M CPI 20H JZ TRBFEND STAX D INX H ,'++ TIME OUT RECEIVING FILENAME ++',CR,LF,0 GETNM2: JMP GCKSER GETNM3: CPI EOT ;IF EOT, THEN NO MORE FILES JZ GNRET CPI EOFCHAR ;GOT END OF NAME JZ ENDNAME MOV M,A ;PUT NAME IN FCB LDA QFLG ;TYPE IT IF NO QFLG ORA A MOV A,M CNZ TYPE PUSH B ;SAVE CKSUM MVI A,ACK ;ACK GETTING LETTER CALL SEND POP B INX H ;GET NEXT CHAR MOV A,L AMEBUF ;SAVE START OF BUFFER SHLD NBSAVE LDA FILECT CPI 65 ;NO MORE THAN 64 TRANSFERS RC MVI A,64 ;ONLY X'FER FIRST 64 STA FILECT RET ;SCANS CMDBUF COUNTING NAMES AND PUTTING DELIMITER (SPACE) ;AFTER LAST NAME SCAN: PUSH H LXI H,NAMECT MVI M,0 LXI H,CMDBUF+1 ;FIND END OF CMD LINE.. MOV C,M ;..AND PUT SPACE THERE. MVI B,0 LXI H,CMDBUF+2 DAD B  ;IF SENDER ABORTS.. JZ ABORT ;..DURING NAME TRANSFER. CPI ACK ;IF NAK,RETURN WITH.. RZ ;..CARRY CLEAR. STC RET TNMBUF: MVI A,FALSE ;CALL FROM SENDFIL ONLY ONCE. STA FSTFLG STA FILECT CALL SCAN LXI H,NAMEBUF SHLD NBSAVE ;SAVE ADDR OF 1ST NAME TNLP1: CALL TRTOBUF LXI H,FCB LXI D,FCBBUF CALL CPMLINE ;PARSE NAME TO CP/M FORMAT TNLP2: CALL MFNINX D INR B ;COUNT CHARS IN NAME JMP TBLP TRBFEND:INX H MOV A,M ;EAT EXTRA SPACES CPI 20H JZ TRBFEND SHLD BGNMS LXI H,FCBBUF+1 ;PUT # CHARS BEFORE NAME MOV M,B RET ;IN CP/M V.2, IF FILE IS R/O OR SYS, IT IS CHANGED TO 'BAK'. CKCPM2: MVI C,12 CALL BDOS MOV A,L ;TRANSFER VERSION # W.B. ORA A ;RETURN 0 MEANS CP/M 1 RZ MVI C,STDMA LXI  ;DON'T LET NOISE... CPI 7FH ;..CAUSE OVERFLOW.. JZ GCKSER ;..INTO PROGRAM AREA. JMP NAMELPG ENDNAME:LDA QFLG ORA A CNZ CRLF MOV A,C ;SEND CHECKSUM CALL SEND MVI B,1 CALL RECV ;CHECKSUM GOOD? CPI OKNMCH ;YES IF OKNMCH SENT.. JZ GNRET ;..ELSE DO OVER. GCKSER: LXI H,FCB ;CLEAR FCB (EXCEPT DRIVE).. CALL INITFCB+2 ;..SINCE IT MIGHT BE DAMAGED..  MVI M,20H LXI H,CMDBUF+1 MOV B,M INR B INR B SCNLP1: INX H DCR B JZ DNSCAN MOV A,M CPI 20H JNZ SCNLP1 SCNLP2: INX H ;EAT EXTRA SPACES DCR B JZ DNSCAN MOV A,M CPI 20H JZ SCNLP2 SHLD BGNMS ;SAVE START OF NAMES IN CMDBUF INR B DCX H SCNLP3: INX H DCR B JZ DNSCAN MOV A,M CPI 20H JNZ SCNLP3   D,80H CALL BDOS MVI C,SRCHF ;SEARCH FOR FILE LXI D,FCB CALL BDOS CPI 0FFH RZ ADD A ADD A ;MULT A-REG BY.. ADD A ADD A ;..32 TO FIND.. ADD A ;..NAME IN DMA. LXI H,80H ADD L MOV L,A ;HL POINTS TO DIR NAME LXI D,9 DAD D ;POINT TO R/O ATTRIB BYTE MOV A,M ANI 80H ;TEST MSB JNZ MKCHG ;IF SET, MAKE CHANGE  CALLED. CARRY IS SET IF NO MORE NAMES CAN BE FOUND \ ; DEFINE DATA MOVE MACRO MOV1 MACRO ?F,?T,?L,?I IFNB LXI H,?F ENDIF IFNB LXI D,?T ENDIF IFNB LXI B,?L ENDIF IFNB LOCAL ?N,?Z CALL ?Z ?N: DB ?I ?Z: POP H ;GET TO LXI B,?Z-?N ENDIF CALL MOVER MF SET -1 ;;SHOW EXPANSION KUPS CALL BDOS LXI H,6CH ;FCB2 DR FIELD SHOULD.. MVI M,0 ;..0 FOR RENAME. LXI D,FCB MVI C,23 ;RENAME CALL BDOS RET CKBAKUP:LDA BKBYTE ORA A RZ MVI C,SRCHF LXI D,FCB CALL BDOS INR A RZ ;FILE NOT FOUND JMP PLANCHG ;IN "CKCPM2" - RET DONE THERE .COMMENT \ ------------------------------------------------------------- MFACCESS MACRO RRCHN REQ NAME>> MOV1 MFREQ,FCB,12 CPM SRCHN,FCB ;<> MFN02 EQU $ ;<> INR A STC JNZ MFFIX1 STA MFFLG1 RET ;FIX BY M.Z. MFFIX1 EQU $ ;<> DCR A ANI 3 ADD A ADD A ADD A ADD A ADD A ADI 81H MOV L,A MVI H,0 PUSH H ;SAVE NAME POINTER MOV1 ,MFCUR+1,11 ;<> POP H MOV1 ,FCB+1,11 ;<> XRA A STA FCBEXT  INX H ;CHECK SYSTEM ATTRIB BYTE MOV A,M ANI 80H RZ ;NOT $SYS OR $R/O DCX H MKCHG: LXI D,-8 DAD D ;POINT HL TO FILENAME + 1 LXI D,FCB+1 ;MOVE DIR NAME TO FCB.. MVI B,11 ;..WITHOUT CHANGING DRIVE. CALL MOVE LXI H,FCB+9 ;R/O ATTRIB MOV A,M ANI 7FH ;STRIP R/O ATTRIB MOV M,A INX H ;SYS ATTRIB MOV A,M ANI  ENDM ;DEFINE CP/M MACRO - CPM FNC,PARM CPM MACRO ?F,?P PUSH B PUSH D PUSH H IFNB MVI C,?F ENDIF IFNB LXI D,?P ENDIF CALL BDOS POP H POP D POP B ENDM .COMMENT \ ------------------------------------------------ MULTI-FILE ACCESS SUBROUTINE THE ROUTINE IS COMMENTED IN PSEUDO CODE, EACH PSEUDO CODE STATEMENT OUTINES MFFLG1 IS NOT SET LOCAL BECAUSE IT MUST BE RESET IN MAIN MODEM PROGRAM ON AN ABORT MULTI-FILE ACCESS SUBROUTINE. ALLOWS PROCESSING OF MULTIPLE FILES (I.E. *.ASM) FROM DISK. THIS ROUTINE BUILDS THE PROPER NAME IN THE FCB EACH TIME IT IS CALLED. THIS COMMAND WOULD BE USED IN SUCH PROGRAMS AS MODEM TRANSFER, TAPE SAVE, ETC IN WHICH YOU WANT TO PROCESS SINGLE OR MULTIPLE FILES. THE FCB WILL BE SET UP WITH THE NEXT NAME, READY TO DO NORMAL PROCESSING (OPEN, READ, ETC.) WHEN ROUTINE IS STA FCBRNO ;FIX BY M.Z. ;<> RET ;MULTI-FILE ACCESS WORK AREA MFFLG1: DB 0 ;1ST TIME SW MFREQ: DS 12 ;REQ NAME MFCUR: DS 12 ;CURR NAME ;------------------------------------------------ ;MOVE SUBROUTINE MOVER: MOV A,M STAX D INX H INX D DCX B MOV A,B ORA C JNZ MOVER RET ;END OF MFACCESS ROUTINES ;-------------------7FH MOV M,A LXI D,FCB MVI C,30 ;SET NEW ATTRIBS IN DIR CALL BDOS ;MAY BE CALLED BY CKBAKUP BELOW. ITS RETURN DONE HERE PLANCHG:LXI H,FCB ;CHANGE NAME TO TYPE "BAK" LXI D,6CH MVI B,9 ;MOVE DRIVE AND NAME (NOT TYPE) CALL MOVE LXI H,75H ;START OF TYPE IN FCB2 MVI M,'B' INX H MVI M,'A' INX H MVI M,'K' LXI D,6CH MVI C,ERASE ;ERASE ANY PREV BACIS IN <<...>> \ MFNAME EQU $ ;<> CPM STDMA,80H XRA A STA FCBEXT ;<> LDA MFFLG1 ORA A JNZ MFN01 ;<> MVI A,1 STA MFFLG1 ;<> MOV1 FCB,MFREQ,12 ;SAVE ORIG REQ LDA FCB STA MFCUR ;SAVE DISK IN CURR FCB ;<> MOV1 MFREQ,FCB,12 CPM SRCHF,FCB ;<> JMP MFN02 MFN01 EQU $ ;<> MOV1 MFCUR,FCB,12 CPM SRCHF,FCB ;<0 for errors. 3. If there is an error this routine returns with carry flag set. \ IF CHEK RCVERR: PUSH PSW ;SAVE CHAR TRANSMITTED LDA ERRCDE ;GET RECEIVE ERROR CODE ANA A ;IS IT ZERO? JZ RCVER2 ;YES, NO RECEIVE ERROR POP PSW ;RESTORE CHAR TRANSMITTED STC ;SET CARRY ON TO INDICATE AN ERROR RET RCVER2: POP PSW ;RESTORE CHAR TRANSMITTED RET ;RCVDER: Checks for a receive error and displays appropriate ;error message. Then goes to RCVSERR to purge the ENDIF ;CHEK CMP D JNZ RCVCERR CHKSNM: LDA RCVSNO MOV B,A LDA SECTNO CMP B JZ RECVACK INR A CMP B JNZ ABORT RET RCVCRC: MVI E,2 ;NUMBER OF CRC BYTES RCVCR2: MVI B,1 CALL RECV JC RCVSTOT IF CHEK CALL RCVERR ;RS232 ERROR CHECK JC RCVDER ENDIF ;CHEK DCR E JNZ RCVCR2 CALL CHKCRC ORA A JZ CHKSNM LDA VSEEFLG ORA A JZ RCVCRER LDA QFLG ORA A JZ RCVSERR RCVCRER:CALL ILPRT DB  CALL RECV JNC RCVSERR LDA CRCFLG ;WB...REPEAT CRC REQUEST ORA A ; IN CASE SENDER WAS SLOW IN MVI A,NAK ; GETTING STARTED. JNZ RCVS1 MVI A,CRC RCVS1: CALL SEND LDA ERRCT INR A STA ERRCT CPI ERRLIM JC RCVRPT LDA VSEEFLG ORA A JZ RCVCKQ LDA QFLG ORA A JZ RCVSABT RCVCKQ: CALL CKQUIT JZ RCVSECT RCVSABT:CALL CLOSFIL CALL ERXIT DB CR,LF,'++RCVSTOT IF CHEK CALL RCVERR ;RS232 ERROR CHECK JC RCVDER ENDIF ;CHEK MOV D,A MVI B,1 CALL RECV JC RCVSTOT IF CHEK CALL RCVERR ;RS232 ERROR CHECK JC RCVDER ENDIF ;CHEK CMA CMP D JZ RCVDATA LDA VSEEFLG ORA A JZ RCVBSE LDA QFLG ORA A JZ RCVSERR RCVBSE: CALL ILPRT DB CR,LF,'++ BAD SECTOR NUMBER IN HEADER ++',CR,LF,0 JMP RCVSERR RCVDATA:MOV A,D   CR,LF,'++ CRC ERROR...',0 JMP RCVPRN RCVCERR:LDA VSEEFLG ORA A JZ RCVCPR LDA QFLG ORA A JZ RCVSERR RCVCPR: CALL ILPRT DB CR,LF,'++ CHECKSUM ERROR...',0 JMP RCVPRN RECVACK:CALL SENDACK JMP RCVSECT SENDACK:MVI A,ACK CALL SEND RET SENDHDR:LDA QFLG ORA A JZ SENDHNM CALL ILPRT DB ' SENDING SECTOR...',0 PUSH H LHLD SECTNO CALL DECOUT CALL ILPRT DB ' NFLFLG CMA STA SAVFLG LDA FCB+1 CPI ' ' JZ BLKFILE LXI D,FCB MVI C,SRCHF CALL BDOS INR A JNZ KILFL2 CALL ILPRT DB CR,LF,'++ FILE DOES NOT EXIST ++',CR,LF,0 JMP XPRT KILFL2: LXI D,FCB MVI C,ERASE CALL BDOS JMP XPRT ERASFIL:LDA BATCHFLG ;DON'T ASK FOR ERASE.. ORA A ;..IN MULTI-FILE MODE,.. JZ NOASK ;..JUST DO IT. LXI D,FCB MVI C,SRCHF CALL BDOS INR A RZ  JZ GACKV LDA QFLG ORA A JZ CSABORT GACKV: CALL CKQUIT STC RZ CSABORT:CALL ERXIT DB CR,LF,'++ CAN''T SEND SECTOR...ABORTING ++',CR,LF,'$' GETATOT:LDA QFLG ORA A JZ ACKERR CALL ILPRT DB CR,LF,'++ TIMEOUT ON (ACK) ++',CR,LF,0 JMP ACKERR CKABORT: CKABGO: CALL STAT RZ CALL KEYIN CPI CAN RNZ ABORT: LXI SP,STACK ABORTL: MVI B,1 CALL RECV REC: MVI A,'?' ;MATCH ALL EXTENTS STA FCBEXT MVI A,0FFH STA MAXEXT ;INIT MAX EXT NO. MVI C,SRCHF ;GET 'SEARCH FIRST' FNC LXI D,FCB CALL BDOS ;READ FIRST INR A ;WERE THERE ANY? JNZ SOME ;GOT SOME CALL ERXIT DB CR,LF,'++ FILE NOT FOUND ++',CR,LF,'$' ;READ MORE DIRECTORY ENTRIES MOREDIR:MVI C,SRCHN ;SEARCH NEXT LXI D,FCB CALL BDOS ;READ DIR ENTRY INR A ;CHECK FOR END (0FFH) JNZ SOME ;NOT END OF DIR...PROCESS EXTENT LDA MAXEXT ;HIT END...GET HIGHEST EXTENT NO. SEEN MOV L,(0',0 CALL DHXOUT CALL ILPRT DB 'H)',CR,0 POP H SENDHNM:MVI A,SOH CALL SEND LDA SECTNO CALL SEND LDA SECTNO CMA CALL SEND RET SENDSEC:MVI A,1 STA DATAFLG MVI C,0 CALL CLRCRC LXI H,80H SENDC: MOV A,M CALL SEND INR L JNZ SENDC XRA A STA DATAFLG RET SENDCKS:MOV A,C CALL SEND RET SNDCRC: CALL FINCRC MOV A,D CALL SEND CALL ILPRT DB LF,'++ FILES EXISTS, TYPE ''Y'' TO ERASE...',BELL,0 CALL KEYIN PUSH PSW CALL TYPE POP PSW CALL UCASE CPI 'Y' JNZ MENU CALL CRLF NOASK: LXI D,FCB MVI C,ERASE CALL BDOS RET BLKFILE:CALL ILPRT ;ROUTINE IF NO FILE IS NAMED FOR ; "SEND" OR "RECEIVE" DB CR,LF,'++ NO FILE SPECIFIED ++',CR,LF,BELL,0 LXI B,0FFFFH DELAY: DCX B MOV  JNC ABORTL MVI A,CAN CALL SEND ABORTW: MVI B,1 CALL RECV JNC ABORTW MVI A,' ' CALL SEND CALL ILPRT DB CR,LF,'++ ROUTINE CANCELLED ++',CR,LF,BELL,0 MVI A,'B' ;TURN MULTI-FILE MODE.. STA BATCHFLG ;..OFF SO ROUTINE ENDS. JMP DNTCE INCRSNO:PUSH H LHLD SECTNO INX H SHLD SECTNO MOV A,L POP H RET ;ERASE A FILE FROM DISK, MENU MODE KILFIL: MVI A,TRUE STA A ;WHICH GIVES EXTENT COUNT -1 MVI H,0 MOV D,H LDA RCNT ;GET RECORD COUNT OF MAX EXTENT SEEN MOV E,A ;SAVE IT IN DE DAD H DAD H ;MULTIPLY # OF EXTENTS -1 DAD H ; TIMES 128 DAD H DAD H DAD H DAD H DAD D ;ADD IN SIZE OF LAST EXTENT SHLD RCNT ;SAVE TOTAL RECORD COUNT RET ;AND EXIT ;POINT TO DIRECTORY ENTRY SOME: DCR A ;UNDO PREV 'INR A' ANI 3 ;MAKE MODULUS 4 ADD A ;MULTIPLY... ADD A ;..BY 32 BECAUSE ADD A ;..EACH DIRECTORY ADD A ;..ENTRY IS 32 ADD A ;..BYTES LONG  MOV A,E CALL SEND XRA A RET GETACK: MVI B,10 CALL RECVDG JC GETATOT CPI ACK RZ MOV B,A ANI 7FH CPI CAN JZ ABORT LDA QFLG ORA A JZ ACKERR CALL CRLF MOV A,B CALL HEXO CALL ILPRT DB 'H RECEIVED...NOT (ACK) ++',CR,LF,0 ACKERR: LDA ERRCT INR A STA ERRCT CPI ERRLIM RC ;REACHED ERROR LIMIT LDA VSEEFLG ORA A A,B ORA C JNZ DELAY JMP MENU MAKEFIL:LXI D,FCB MVI C,MAKE CALL BDOS INR A RNZ CALL ERXIT DB CR,LF,'++ CAN''T MAKE FILE...DIRECTORY FULL ++',CR,LF,'$' IFNB CNREC: MVI C,FILSIZ ;COMPUTE FILE SIZE FUNC IN CP/M 2.x LXI D,FCB ;POINT TO FILE CONTROL BLOCK CALL BDOS LHLD FCB+33 ;GET RECORD COUNT SHLD RCNT ;STORE IT LXI H,0 ;ZERO HL SHLD FCB+33 ;RESET RANDOM RECORD IN FCB RET ENDIF ;CPM2+ IFB CN   LXI H,80H ;POINT TO BUFFER ADD L ;POINT TO ENTRY ADI 15 ;OFFSET TO RECORD COUNT MOV L,A ;HL NOW POINTS TO REC COUNT MOV B,M ;GET RECORD COUNT DCX H DCX H ;BACK DOWN TO EXTENT NUMBER DCX H LDA MAXEXT ;COMPARE WITH CURRENT MAX. ORA A ;IF NO MAX YET JM BIGGER ;THEN SAVE RECORD COUNT ANYWAY CMP M JNC MOREDIR BIGGER: MOV A,B ;SAVE NEW RECORD COUNT STA RCNT MOV A,M ;SAVE NEW MAX. EXTENT NO. STA MAXEXT JMP MOREDIR ;GO FIND MORE EXTENTS ENDIF ;NOT CPM2+ OPENFIL:LXI D,FCB B MVI C,WRITE CALL BDOS POP B POP D POP H ORA A JNZ WRERR LXI H,80H DAD D XCHG DCR C JNZ DKWRLP XRA A STA SECINBF LXI H,DBUF SHLD SECPTR RET WRERR: MVI C,CAN CALL SEND CALL ERXIT DB CR,LF,'++ WRITE ERROR...DISK FULL ++',CR,LF,'$' RECVDG EQU $ CALL INDATP CALL INDATP RECV: PUSH D LDA FASCLK ;DOUBLE UP THE LOOS LXI D,FCB MVI C,READ CALL BDOS POP D POP B ORA A JZ RDSECOK DCR A JZ REOF CALL ERXIT DB CR,LF,'++ READ ERROR...END OF FILE ++',CR,LF,'$' RDSECOK:LXI H,80H DAD D XCHG INR C MOV A,C CPI DBFSIZ*8 ;BUFFER IN 128 BYTE SECTORS JZ RDBFULL JMP RDSECLP REOF: MVI A,1 STA EOFLG MOV A,C RDBFULL:STA SECINBF LXI H,DBUF  MONOUT: POP PSW PUSH PSW CALL SHOW NOMONOT:POP PSW PUSH PSW CALL UPDCRC ;CALCULATE CRC ADD C MOV C,A SENDW: CALL OTCTLP CALL ANSNDB CALL CPSNDR JNZ SENDW POP PSW CALL OTDATP RET WAITNAK:LDA VSEEFLG ORA A JZ WAITNPR LDA QFLG ORA A JZ WAITNLP WAITNPR:CALL ILPRT DB CR,LF,'++ AWAITING INITIAL (NAK) ++',CR,LF,0 WAITNLP:CALL CKABORT MV MVI C,OPEN CALL BDOS INR A JNZ OPENOK CALL ERXIT DB CR,LF,'++ CAN''T OPEN FILE...NOT FOUND ON DISK ++',CR,LF,'$' OPENOK: LDA BATCHFLG ORA A JNZ OPNOK1 LDA QFLG ORA A RZ OPNOK1:CALL ILPRT DB CR,LF,'++ FILE OPEN...SIZE: ',0 LHLD RCNT ;RECORD COUNT CALL DECOUT ;PRINT SECTORS IN DECIMAL CALL ILPRT DB ' (',0 CALL DHXOUT CALL ILPRT DB 'H) SECTORS',CR,LF,0 RET CLOSFIL:LXI D,FP COUNTER IF ORA A ;4 MZ OR GREATER JZ MSEC MOV A,B ADD A MOV B,A MSEC: LXI D,15000 ;60% OF ORIG 50000 CALL CKABORT MWTI: CALL INCTLP CALL ANRCVB CALL CPRCVR JZ MCHAR DCR E JNZ MWTI DCR D JNZ MWTI DCR B JNZ MSEC POP D STC RET IF CHEK MCHAR: CALL INDATP ANI ERRCDMSK STA ERRCDE ELSE MCHAR: CALL INDATP ENDIF ;CHEK POP D PUSH PSW CALL UP SHLD SECPTR LXI D,80H MVI C,STDMA CALL BDOS JMP RDSECT WRSECT: LHLD SECPTR XCHG LXI H,80H CALL MOVE128 XCHG SHLD SECPTR LDA SECINBF INR A STA SECINBF CPI DBFSIZ*8 ;BUFFER IN 128 BYTE SECTORS RNZ WRBLOCK:LDA SECINBF ORA A RZ MOV C,A LXI D,DBUF DKWRLP: PUSH H PUSH D PUSH B MVI C,STDMA CALL BDOS LXI D,FCI B,1 CALL RECV CPI NAK RZ CPI CRC JZ WAITCRC DCR E JZ ABORT JMP WAITNLP WAITCRC:CALL ILPRT DB CR,LF,'++ (CRC) REQUEST RECEIVED ++',CR,LF,BELL,0 XRA A STA CRCFLG RET INITDR: LHLD 1 LXI D,3 DAD D SHLD VSTAT+1 DAD D SHLD VKEYIN+1 DAD D SHLD VTYPE+1 DAD D SHLD VLISTD+1 ;SIO PORT A INITILIZATION .Z80 ; switch to Z80 code recognition LD B,8 LD C,MOCTLP CB MVI C,CLOSE CALL BDOS INR A RNZ CALL ERXIT DB CR,LF,'++ CAN''T CLOSE FILE...NOT FOUND ON DISK ++',CR,LF,'$' RDSECT: LDA SECINBF DCR A STA SECINBF JM RDBLOCK LHLD SECPTR LXI D,80H CALL MOVE128 SHLD SECPTR RET RDBLOCK:LDA EOFLG CPI 1 STC RZ MVI C,0 LXI D,DBUF RDSECLP:PUSH B PUSH D MVI C,STDMA CALL BDODCRC ;CALCULATE CRC ADD C MOV C,A LDA RSEEFLG ORA A JZ MONIN LDA VSEEFLG ORA A JNZ NOMONIN LDA DATAFLG ORA A JZ NOMONIN MONIN: POP PSW PUSH PSW CALL SHOW NOMONIN:POP PSW ORA A RET SEND: PUSH PSW LDA SSEEFLG ORA A JZ MONOUT LDA VSEEFLG ORA A JNZ NOMONOT LDA DATAFLG ORA A JZ NOMONOT    LD HL,INITS ; table of output words OTIR ; configure sio RET .8080 ; then back to 8080 PROCOPT:LXI D,FCB+1 LDAX D STA OPTION OPTLP: INX D LDAX D CPI ' ' JZ ENDOPT LXI H,OPTBL MVI B,OPTBE-OPTBL OPTCK: CMP M JNZ OPTNO MVI M,0 JMP OPTLP OPTNO: INX H DCR B JNZ OPTCK JMP BADOPT ENDOPT: LDA CRCFLG ORA A JNZ ENDOP1 LDA OPTION CPI 'R' JNZ BADOPT ;CRC ONLY ALLOW STA FCB LXI H,RESTSN ;RESTORE SECTORE NUMBERS.. LXI D,SECTNB ;..FOR NEW FILE TRANSFER. MVI B,SECTNE-SECTNB ;ROUTINE ALSO DONE IN MENU. CALL MOVE LDA SENDFLG ;GOES TO EITHER SEND OR.. ORA A ;..RECEIVE FILE, DEPENDING.. JNZ SENDFIL ;..UPON WHICH ROUTINE SET.. JMP RCVFIL ;..THE FLAG IN MULTI-FILE MODE. DNTCC: MVI A,TRUE ;INDICATE NO FILES BEoop setm2: mvi b,15 ; 2 sec. delay for smartmodem response setm3: call timer dcr b jnz setm3 atten: db 'AT $' zee: db 'Z',cr,'$' o: db 'O',cr,'$' r: db 'R',cr,'$' plus: db '+++$' ENDOP2: LDA VSEEFLG ORA A RNZ STA QFLG RET DONE: LDA BATCHFLG ORA A JNZ DNTCC LDA QFLG ORA A JZ NMSTRNS LXI H,FCB+1 ;PUT FILE NAME IN.. LXI D,FTRNMSG ;..SPACES IN MESSAGE.. MVI B,8ALL MODOUT INX D JMP OFF4 OFF5: CALL TIMER ;SHORT DELAY AT THE END CALL INDATP ;...TIDY UP JMP TERM ;...CLOSE UP SHOP. DNTCE: LDA TERMFLG ;SEE IF RETURN TO.. ORA A ;..TERMINAL MODE.. JZ TERM LDA ECHOFLG ORA A JNZ MENU ;..AFTER X'FER. JMP TRMECHO TIMER: PUSH PSW ;TIME INTERVAL BETWEEN ESCAPE PUSH B ;CODE AND ON-HOOK COMMAND LXI B,3500H TIMER2: DCX B MOV A,B ORA C JNZ TIMER2 POP B PED IN RECEIVE MODE ; the following code added to smodem 3.7 to allow user to ; specify answer or originate mode and go-online by smodem ; command rather than having to do so in terminal mode. endop1: lda origflg ;originate mode requested? ora a jnz endop3 ;no, go next option jmp setmode endop3: lda answflg ;answer mode requested? ora a jnz endop2 ;assume we are in terminal mode, online, break into cmd mode setmode: mvi a,cr call modout lxi d,plus ;'+++' call setm1 ;send itING.. STA FSTFLG ;RESET MULTIFILE TRANS STA NFLFLG ;..USED IN TERMINAL ROUTINE. CMA STA SAVFLG ;STOP MEM.SAVE IN TERM ROUTINE. LDA VSEEFLG ORA A JZ DONETC LDA QFLG ORA A JZ DNTCA DONETC: CALL ILPRT DB CR,LF,'++ ALL TRANSFERS COMPLETED ++',CR,LF,BELL,0 DNTCA: MVI A,TRUE STA NFLFLG CMA STA SAVFLG LDA DISCFLG ;DISCONNECT WHEN THROUGH? ORA  ;..BELOW. CALL MOVE INX D ;PUT FILE TYPE AFTER.. MVI B,3 ;..SKIPPING ONE SPACE.. CALL MOVE ;..BELOW. CALL ILPRT FTRNMSG:DB ' TRANSFERRED ++',CR,LF,0 ;13 SPACES NMSTRNS:LDA FCB ;SAVE DRIVE NO. STA DISKNO LXI H,FCB ;BLANK OUT FILE CONTROL BLOCKS CALL INITFCB LDA DISKNO ;PUT DRIVE NUMBER BACK OP PSW RET ;INITMOD: MOVEFCB:LXI H,FCB+16 LXI D,FCB MVI B,16 CALL MOVE XRA A STA FCBSNO STA FCBEXT RET SHOW: CPI LF JZ CTYPE CPI CR JZ CTYPE CPI 9 JZ CTYPE CPI ' ' JC SHOWHEX CPI 7FH JC CTYPE SHOWHEX:PUSH PSW MVI A,'(' CALL CTYPE POP PSW CALL HEXO MVI A,')' JMP CTYPE LISTDV: PUSH B PUSH D  to modem call setm2 ;delay for smartmodem response lxi d,atten ;'AT ' call setm1 lxi d,zee ;'Z' resets all smodem values call setm1 call setm2 lxi d,atten call setm1 lda origflg ora a jnz setm4 lxi d,r ;'R' changes to originate mode call setm1 call setm2 setm4: lxi d,atten call setm1 lxi d,o ;'O' goes offhook and waits carrier call setm1 jmp endop2 setm1: ldax d ;get a char cpi '$' ;end? rz ;yes, do next call modout inx d ;bump pointer jmp setm1 ;and l A JNZ DNTCE ;...NO, CONT. DNTCB: CALL ILPRT DB CR,LF,'++ DISCONNECTED ++',CR,LF,0 LXI D,80H ;RESET DMA AND SEND '+++' MVI C,STDMA ;...ESCAPE CODE TO SMARTMO. CALL BDOS LXI D,OFFHK OFF1: LDAX D CPI '$' JZ OFF2 CALL MODOUT INX D JMP OFF1 OFF2: CALL CRLF ;C/R COMPLETES ESCAPE MVI B,15 ;2 SECOND DELAY FOR SMARTMO. OFF3: CALL TIMER ;...TO RESPOND. DCR B JNZ OFF3 INX D OFF4: LDAX D ;SEND ON-HOOK COMMAND TOO CPI '$' JZ OFF5 C  PUSH H MOV C,A VLISTD: CALL $-$ POP H POP D POP B RET CTYPE: PUSH B PUSH D PUSH H MOV E,A MVI C,WRCON CALL BDOS POP H POP D POP B RET CRLF: PUSH PSW MVI A,CR CALL TYPE MVI A,LF CALL TYPE POP PSW RET TYPE: PUSH PSW PUSH B PUSH D PUSH H MOV C,A VTYPE: CALL $-$ POP H POP D POP B SET QFLG STA QFLG JMP ABORT ;ABORT OTHER COMPUTER EXIT: LXI D,80H MVI C,STDMA CALL BDOS JMP 0 MOVE128:MVI B,80H MOVE: MOV A,M STAX D INX H INX D DCR B JNZ MOVE RET ;DIALING ROUTINE MODIFIED FOR HAYES SMART MODEM ; DIRNAM: DB 'PHONE 001' DILFLG: DB FALSE ;THIS ROUTINE CHECKS TO SEE IF A DIRECTORY LETTER OR A ;PHONE NUMBER WAS ENTERED IN THE COMMAND LINE. DIALPL: MVI ET IF RETRY ASKED. IF MULTI-FILE MODE, THEN ;NO QUESTIONS ASKED, JUST QUIT CKQUIT: LDA BATCHFLG ORA A JNZ CKQTASK ;ASK FOR RETRY INR A ;RESET ZERO FLG RET CKQTASK:XRA A STA ERRCT CALL ILPRT DB CR,LF,'++ MULTIPLE ERRORS ENCOUNTERED',CR,LF,LF DB ' ...TYPE ''Q'' TO QUIT',CR,LF DB ' ...TYPE ''R'' TO RETRY',CR,LF,LF DB ' COMMAND >>',BELL,0 CALL KEYIN PUSH PSW CALL CRLF PPI 32 JZ MENU ;ZERO MEANS 'NO ENTRY MADE' LXI H,FCB4 CALL INITFCB CALL MOVE4 JMP DI1 ;LOAD THE DEFAULT FILE NAME FROM DEFAULT DRIVE ENTM2: PUSH H LXI H,FCB4 CALL INITFCB ;INITIALIZE FCB LXI D,FCB4+1 LXI H,DIRNAM MVI B,11 ;COUNT CALL MOVE ;GET CHARS.IN POP H ;THIS ROUTINE READS THE FILE TO THE DBUF DI1: PUSH H CALL OPEN4 POP H INR A ;OPEN OK? JZ ERROR2 ;...NO, PRINT NO FILE. PUSH H LXI D,DBUF ;SET DMA. DI2: PUSH D MVI C,STDMA CALL BDOS CALL REA POP PSW RET STAT: PUSH B PUSH D PUSH H VSTAT: CALL $-$ POP H POP D POP B ORA A RET KEYIN: PUSH B PUSH D PUSH H VKEYIN: CALL $-$ POP H POP D POP B RET UCASE: CPI 61H ;CHANGES LOWER CASE CHARACTER.. RC ;..IN A-REG TO UPPER CASE. CPI 7BH RNC ANI 5FH RET DECOUT: PUSH PSW PUSH B PUSH D PUSH H LA,FALSE ;CLEAR DEFAULT DIAL FLAG STA DILFLG LXI H,CMDBUF+1 ;POINT # OF CHARS IN BUFF MOV A,M ;GET # OF CHARS CPI 4 ;WAS A NUMBER OR LETTER ENTRD.? JC ENTNM ;NO, DISPLAY DIREC.& ASK SUI 3 ;REDUCE COUNT FOR 'CAL' MOV M,A ;PUT IT BACK MVI A,TRUE ;SET DEFAULT DIAL FLAG STA DILFLG LXI H,CMDBUF+5 ;POINT TO NUMBER TO DIAL DI8: MOV A,M ;GET CHAR.OR NUMBER CPI 32 ;SPACE? JNZ DI9 ;...NO, IOP PSW CALL UCASE ;INSTEAD OF "ANI 5FH" CPI 'R' RZ CPI 'Q' JNZ CKQUIT ORA A RET ILPRT: XTHL ILPLP: MOV A,M ORA A JZ ILPRET CALL CTYPE INX H JMP ILPLP ILPRET: XTHL RET PRTMSG: MVI C,PRINT JMP BDOS ERXIT: POP D CALL PRTMSG CALL ILPRT DB BELL,0 LDA BATCHFLG ORA A JNZ DNTCE MVI A,'Q' ;RED80 ;128 BYTES SEQUENTIAL POP D ;ONCE MORE INTO THE BREACH LXI H,128 ;LOAD DMA INCREMENT DAD D ;AND INCREMENT IN 'HL' XCHG ;GIVE IT BACK TO 'DE' ORA A ;END OF FILE? JZ DI2 ;...NO, CONT. POP H LDA DILFLG INR A ;DIRECT DIAL TO DEFAULT FILE? JZ DIAL10 ;...YES, DON''T PRINT DIR. ;THIS ROUTINE PRINTS THE DIRECTORY TO THE SCREEN CALL ILPRT DB FF DB ' *** PHONE DIRECTORY ***',CR,LF DB '===============================================================',CR,LF,XI B,-10 LXI D,-1 DECOT2: DAD B INX D JC DECOT2 LXI B,10 DAD B XCHG MOV A,H ORA L CNZ DECOUT MOV A,E ADI '0' CALL CTYPE POP H POP D POP B POP PSW RET DHXOUT: PUSH H PUSH PSW MOV A,H CALL HEXO MOV A,L CALL HEXO POP PSW POP H RET HEXO: PUSH PSW RAR RAR RAR RAR CALL NIBBL POP PSW NIBBL: ANI 0FH CPI 10 JC ISNUM ADI 7 ISNUM: ADI '0' JMP TYPE ;RETRNS W/ ZERO SNX H ;BUMP THE CMDBUF UP, PUSH H LXI H,CMDBUF+1 DCR M ;...AND THE CHAR.COUNTER DOWN. POP H JZ ERROR3 ;ERROR IF NO MORE CHARS. JMP DI8 ;CHECK AGAIN DI9: CPI 48 ;LOWER THAN A NUMBER? JC ERROR3 ;...YES, HOPP IT! CPI 58 ;IS IT A NUMBER? JC DIALPX ;...YES, DIAL DIRECT JMP ENTM2 ;...NO, LOAD DEFAULT FILE '001' ;ASKS FOR DIRECTORY NAME THEN MOVES IT TO THE FCB. ENTNM: CALL ILPRT DB '++ ENTER DIRECTORY NAME >>',0 LXI D,CMDBUF ;GET FILE NAME CALL INBUFF LDA CMDBUF+2 C  0 MVI C,PRINT ;PRINT TO SCREEN LXI D,DBUF CALL BDOS ;THIS ROUTINE ASKS FOR NUMBER TO DIAL COMMD: CALL ILPRT DB '++ ENTER NUMBER/LETTER...C/R TO QUIT >>',0 LXI D,CMDBUF CALL INBUFF CALL CRLF LDA CMDBUF+1 ;NO.OF CHARS.IN BUFFER ORA A ;NULL MEANS WAS TYPED JZ MENU ;ABORT DIALING, RETURN TO MENU LXI H,CMDBUF+2 ;FIRST CHAR.OF NO.TO DIAL ; ENTER THIS ROUTINE WITH HL POINTING TO DIAL LINE DIAL10: MOV A,M ;GET CHAR.OBELL,0 ;ROUTINE TO SEND C/R TO SMARTMODEM AT END OF DIAL MVI A,CR CALL MODOUT ;COMPLETE THE DIALING CALL INDATP ;GOBBLE GARBAGE CALL INDATP MVI C,STDMA LXI D,80H CALL BDOS ;RESTORE ORIG.DMA MVI A,TRUE STA NFLFLG CMA STA SAVFLG JMP TERM ERROR1: CALL ILPRT DB CR,LF,'++ FAULTY NUMBER...INSPECT DIRECTORY ++',CR,LF,LF,0 JMP XPRT9 ERROR2: CALL ILPRT DB CR,LF,'++ FILE DOSN''T EXIST ++',CR,LF,LF,0 JMP XPRT9 ERROR3: CALL ILPRT DB CR,LF,'++ BAD NUMBER...CALL AGAI CHANGED BY ;ALTERING THE 'STYLE' OPTION AT THE BEGINNING OF THIS PRGM. DIALP2: PUSH D MVI A,CR CALL MODOUT LXI D,STYLE ONW1: LDAX D CPI '$' ;SEND 'ATD' TO SMARTMODEM JZ ONW2 CALL MODOUT INX D JMP ONW1 ONW2: POP D ;DIAL DIGIT OR ABORT IF NULL ENCOUNTERED DILP2: MOV A,M ;GET FIRST # FROM BUFFER ORA A ;FAULTY DIRECTORY ENTRY? JZ ERROR1 ;...YES, ABORT DIAL. CALL DIAL ;DIAL IT INX H ;BUMP POI ;..DO EVERYTHING OVER. DB CR,LF,'++ RE-ENTER PRIMARY OPTION AND FILE NAME ONLY ',CR,LF,LF DB 'COMMAND >>',BELL,0 LXI D,CMDBUF CALL INBUFF JMP SETFCB TERMSEL:LDA FCB+17 CPI ' ' JNZ SAVAGN MVI A,FALSE STA SAVFLG MVI A,TRUE STA NFLFLG CMA RET SAVAGN: MVI A,FALSE STA NFLFLG RET .COMMENT \ CRCSUBS (Cyclic Redundancy Code Subroutines) version 1.20 These subroutines wR NUMBER CPI 32 ;SPACE? JNZ DI6 ;...NO, INX H ;BUMP THE CMDBUF UP, PUSH H LXI H,CMDBUF+1 DCR M ;...AND THE CHAR.COUNTER DOWN. POP H JZ ERROR4 JMP DIAL10 ;CHECK AGAIN DI6: CPI 48 ;LOWER THAN A NUMBER? JC ERROR4 CPI 58 ;IS IT A NUMBER? JC DIALPX ;...YES, DIAL DIRECT CPI 91 ;IS IT UPPER CASE? JC DI3 ;...YES, GO POINT TO IT. SUI 6 ;READY FOR LOWER CASE CPI 117 ;IS IT LOWER CASE? JC DI3 ;...YES, POINT. DI5: XRA A ;NO, MAKE NULL JMP DILP2 ;PRINT ERROR MESSN ++',CR,LF,LF,0 JMP XPRT9 ERROR4: CALL ILPRT DB CR,LF,'++ BAD NUMBER...TRY AGAIN ++',CR,LF,LF,0 JMP COMMD ;INITIALIZES CP/M FILE CONTROL BLOCKS AT 5CH AND 6CH SETFCB: LXI D,CMDBUF LXI H,FCB CALL CPMLINE CALL PROCOPT CHECKNM:LDA FCB+1 ;CHECK ON THE PRIMARY OPTION CPI 'C' ;RETURN IF AUTO DIALER OPTION RZ CPI 'E' ;RETURN IF ECHO OPTION RZ CPI 'M' ;RETURN TO MENU RZ CPI 'T' JZ TERMSEL CPI 'K'NTER DCR E ;COUNT DOWN CHARS IN BUFF JNZ DILP2 ;NOT DONE, LOOP JMP DIALDN ;DIALING DONE ;AUTO DIALER DIAL: CPI 48 JC DIA1 ;DIGIT MUST BE AT LEAST 0.. CPI 58 JNC DIA1 ;..AND NOT MORE THAN 9 CALL MODOUT ;NUMBERS PRINTED IN THIS ROUTINE RET DIA1: CALL TYPE ;PRINT ALL EXCEPT NUMBERS RET DIALDN: CALL ILPRT DB CR,LF,'++ DIAL COMPLETED...NOW IN TERMINAL MODE ++',CR,LF,ill compute and check a true 16-bit Cyclic Redundancy Code for a message of arbitrary length. The use of this scheme will guarantee detection of all single and double bit errors, all errors with an odd number of error bits, all burst errors of length 16 or less, 99.9969% of all 17-bit error bursts, and 99.9984% of all possible longer error bursts. (Ref: Computer Networks, Andrew S.Tanenbaum, Prentiss-Hall, 1981) Designed & coded by Paul Hansknecht, June 13, 1981 Copyright (c) 1981, CaAGE DI3: SUI 64 ;MAKE INDEX NO. MOV B,A ;LOAD INDEX NUMBER LXI H,DBUF ;POINT TO START OF DBUF LXI D,31 ;LOAD INCREMENT DI4: DCR B ;ARE WE THERE? JZ DIAL13 ;...YES, DIAL IT. DAD D ;INCREMENT TO NEXT LINE JMP DI4 ;DO AGAIN DIAL13: MVI E,29 ;NO. OF CHAR TO GET FROM TABLE JMP DIALP2 ;GO DIAL DIALPX: LDA CMDBUF+1 ;LOAD CDMBUF COUNT MOV E,A ;...& PUT HERE ;THIS ROUTINE SENDS THE PROPER DIALING INITIATION ;COMMANDS TO THE HAYES SMARTMODEM. IT CAN BE JZ CKFILE CPI 'S' JZ CKFILE CPI 'R' JNZ BDOPT LDA BATCHFLG ;IF MULT FILE MODE, THEN.. ORA A ;..RECV OPT DOES NOT NEED.. RZ ;..NAME. JMP CKFILE BDOPT: CALL ILPRT DB CR,LF,'++ BAD OPTION ++',CR,LF,0 JMP REENT CKFILE: LDA FCB+17 ;IF OPTION THAT NEEDS FILE NAME,.. CPI ' ' ;..THEN CHECK TO SEE IF NAME.. RNZ ;..EXISTS. IF NOT.. REENT: CALL ILPRT  rpenter Associates Box 451 Bloomfield Hills, MI 48013 313/855-3074 This program may be freely reproduced for non-profit use. \ ENTRY CLRCRC,UPDCRC,FINCRC,CHKCRC CLRCRC EQU $ ; Reset CRC Accumulator for a new message. PUSH H LXI H,0 SHLD CRCVAL POP H RET UPDCRC EQU $ ; Update CRC Accumulator using byte in (A). PUSH PSW PUSH B PUSH H MVI B,8 MOV C,A LHLD CRCVAL UPDLOOP:MOV A,C RLC MOV C,A MOV A,L RAL MOV L,A MOV A,H RAL MOV H,A JNC SKIPIT MOV A,H> ',' ...Q - Quiet, no messages',CR,LF DB 'CPM - Exit to CP/M ',' ...T - return to Terminal mode',CR,LF DB 'K - Kill disk file [fn.ext] ',' ...E - return to Echo mode',CR,LF DB 'S... - Send CP/M file [fn.ext] ',' ...D - Disconnect phone',CR,LF DB 'R... - Receive CP/M file [fn.ext] ',' ...C - CRC check (receive only)',CR,LF DB 'T - Terminal mode ',' ...A - go offhk in Answer mode',CR,LF DB 'E - terminal mode with E CALL MOVE LXI H,RESTROPT ;RESTORE OPTION TABLE LXI D,OPTBL MVI B,OPTBE-OPTBL CALL MOVE XRA A STA MFFLG1 ;RESET MFACCESS ROUTINE.. STA LSTFLG STA MACFLG CMA ;..AND MULTI TRANS IN CASE.. STA FSTFLG ;..OF ABORT. MENU1: LDA XPRFLG ;TEST IF MENU SHOULD BE SHOWN ORA A JNZ XPRT1 CALL ILPRT DB CLS,CR,LF DB 'COMMANDS - IN MENU MODE ',' CALL ILCOMP DB 'CPM',0 JNC EXIT CALL ILCOMP DB 'DIR',0 JNC DIR CALL ILCOMP DB 'RET',0 JC NXTOPT1 ;CARRY SET = NO MATCH LHLD HLSAVE ;RETURN TO TERMINAL.. JMP TERM ;..MODE WITH SAVE OPTION.. ;..IF PREVIOUSLY ENABLED. NXTOPT1:CALL ILCOMP DB 'WRT',0 JNC WRTFIL CALL ILCOMP DB 'XPR',0 JNC XPRMODE  ; The generator is X^16 + X^12 + X^5 + 1 XRI 10H ; as recommended by CCITT. MOV H,A ; An alternate generator which is often MOV A,L ; used in synchr. transmission protocols XRI 21H ; is X^16 + X^15 + X^2 + 1. This may be MOV L,A ; used by subst, XOR 80H for XOR 10H and SKIPIT: DCR B ; XOR 05H for XOR 21H in the adj, code. JNZ UPDLOOP SHLD CRCVAL POP H POP B POP PSW RET FINCRC EQU $ ; Finish CRC calc for outbound message. PUSH PSW XRA A CALL UPDCRCcho ',' ...O - go offhk in Orig. mode',CR,LF DB CR,LF DB ' COMMANDS - IN TERMINAL MODE',CR,LF DB '^O - Off line/return to menu ',' ^T - Transmit informal file',CR,LF DB '^Z - END of file ',' ^R - Receive informal file',CR,LF DB '^S - XOFF character ',' ^X - Cancel send/receive',CR,LF DB '^Q - XON character ',' ^D - Disconnect phone (SMARTMODEM)',CR,LF DB '^P - Printer (toggle on/off) ',' ^E - Terminal/Echo (toggle onConfigured for: KAYPRO II',CR,LF DB 'WRT - Write informal file to disk',CR,LF DB 'DEL - Erase informal file from disk ',' SECONDARY OPTIONS',CR,LF DB 'DSC - Disconnect phone (SMARTMODEM) ',' ...B - Batch file mode',CR,LF DB 'RET - Return to terminal mode ',' ...S - show as Sent',CR,LF DB 'CAL - Auto dial from phone directory',' ...R - show as Received',CR,LF DB 'XPR - Expert mode (Toggle) ',' ...V - View as sent/received',CR,LF DB 'DIR - Disk directory >',0 GETCMD: LXI D,CMDBUF ;ENTER COMMAND CALL INBUFF CALL CRLF LXI D,CMDBUF+2 ;POINT TO COMMAND CALL ILCOMP DB 'DSC',0 JNC DNTCB   .. JMP RESTAR ;..AS IF PROGRAM WERE CALLED WITH.. DIR: CALL DIRLST JMP XPRT NEWFILE:LDA FCB3+1 CPI ' ' JZ MENU1 ;IF NO FILE, DON'T ERASE LXI D,FCB3 MVI C,ERASE CALL BDOSRT MVI A,TRUE ;DO NOT ALLOW TERMINAL.. STA NFLFLG ;..SAVE SINCE NO FILE.. CMA ;..SPECIFIED. STA SAVFLG LXI H,FCB3 CALL INITFCB JMP MENU1 WRTFIL: LDA NFLFLG CPI T D XCHG ;ADDRESS FIRST BUFFER BYTE WITH HL INBUFA: CALL CONIN CPI 0DH ;IS IT A RETURN? JZ INBUFR ;IF SO, THEN RETURN CPI 7FH ;IS IT A DELETE? JZ DELETE CPI 8 ;CTRL-H WILL BACKSPACE.. JZ DELETE ;..OVER DELETED CHAR. CPI 'U'-40H ;IS IT A CTRL-U JZ INBUFO ;OUTPUT # CR LF AND START OVER CPI 'R'-40H ;CTRL-R RETYPES LINE JZ RETYPE CPI 'E'-40H ;POINT HL TO 1ST CHAR. PUSH D ILCMPL: MOV A,M ;HL POINTS TO IN-LINE STRING. ORA A ;END OF STRING IF ZERO. JZ SAME LDAX D CMP M JNZ NOTSAME INX H INX D JMP ILCMPL NOTSAME:MVI A,0 ;IF NOT SAME, FINISH THRU.. NSLP: INX H ;..STRING SO RETURN WILL.. CMP M ;..GO TO INSTRUCTION AFTER.. JNZ NSLP ;..STRING AND NOT REMAINDER OF STRING. STC SAME:  ;RESTORE STACK INX H ;ADDRESS COUNT FIELD MOV B,A ;SAVE DELETE CHAR - 7FH OR 08H MOV A,M SUI 1 ;DECREASE COUNT MOV M,A JC NODEL ;DON'T DELETE PAST BEGINING OF BUFFER. XCHG ;RESTORE BUFFER POINTER TO HL DCX H ;POINT TO LAST BYTE INPUTTED MOV A,B ;GET BACK EITHER 7FH OR 08H MOV B,M ;GET CHARACTER BEING DELETED MVI M,20H ;RESTORE BLANRUE JZ MENU1 LDA FCB3+1 ;CHECK THAT FILE WAS REQUESTED CPI ' ' JZ MENU1 LHLD HLSAVE CALL NMRECS ;DISK WRITE ROUTINE AS USED IN.. CALL WRTDSK ;..IN THE INTDSSV ROUTINE. CALL CLOSE3 MVI A,TRUE STA NFLFLG CMA STA MACFLG ;RESET OBLECT FILE SAVE FLAG STA SAVFLG LXI H,FCB3 CALL INITFCB ;BLANK OUT FCB SO WRITTEN FILE.. JMP MENU1 ;..CAN'T BE ERASED. XPRMODE: JZ PCRLF CPI 20H ;NO CONTROL CHARACTERS OTHER.. JC INBUFA ;..THAN ABOVE ALLOWED. MOV B,A ;SAVE INPUTTED CHARACTER XCHG ;SAVE HL IN DE POP H ;GET ADDRESS OF BUFFER IN HL PUSH H ;RESTORE STACK INX H ;ADDRESS COUNT BYTE INR M ;INCREASE COUNT BYTE DCX H ;ADDRESS MAXIMUM MOV A,M ;PUT MAXIMUM IN A INX H ;ADDPOP D INX H ;AVOIDS A NOP INSTRUCTION.. XTHL ;..WHEN RETURNING. RET INBUFF: PUSH PSW PUSH H PUSH B PUSH D ;DE REGISTERS MUST BE PUSHED LAST STRT: CALL CLEAR ;CLEAR THE BUFFER AREA POP D ;GET ADDRESS OF BUFFER ON RETRIES PUSH D ;RESTORE STACK XRA A INX D ;ADDRESS COUNT FIELD STAX D ;INITIALIZE WITH A ZERO IN COUNT BYTE INXK CPI 08H JZ BKSPC MOV A,B ;ECHO CHAR IF 7FH CALL CONOUT JMP INBUFA ;GET NEXT CHARACTER NODEL: INR M ;DON'T LEAVE COUNT NEGATIVE XCHG ;RESTORE POINTER TO HL JMP INBUFA BKSPC: CALL CONOUT ;TRUE ERASE IF 08H MVI A,20H CALL CONOUT MVI A,08 CALL CONOUT JMP INBUFA INBUFO: MVI A,'#' CALL CONOUT MVI A,0DH CALL CONOUT MVI A,0AH LDA XPRFLG CMA STA XPRFLG JMP MENU1 COMPARE:MOV B,M ;COMPARES A-REG WITH LIST.. COMPLP: INX H ;..ADDRESSED BY HL. FIRST ELEMENT.. CMP M ;..OF LIST MUST BE NUMBER OF ELEMENTS.. JZ VALID ;..BEING COMPARED. RETRNS WITH.. DCR B ;..CARRY SET IF A-REG DOES NOT.. JNZ COMPLP ;.. CONTAIN AN ELEMENT IN LIST. STC VALID: RET COMPLIST:DB 5, 'S', 'R', 'T', 'E', 'K' ILCOMP: XTHL RESS COUNT CMP M ;COMPARE COUNT TO MAXIMUM JC ALERT ;IF MAXIMUM, RING BELL AND WAIT FOR CR XCHG ;RESTORE BUFFER POINTER TO HL MOV M,B ;PUT INPUTTED CHARACTER IN BUFFER MOV A,B ;OUTPUT IT CALL CONOUT INX H ;BUMP POINTER JMP INBUFA ;GET NEXT CHARACTER DELETE: XCHG ;SAVE BUFFER POINTER IN DE POP H ;ADDRESS BEGINNING OF BUFFER PUSH H    CALL CONOUT JMP STRT RETYPE: POP D PUSH D INX D ;POINT TO CURRENT NUMBER.. LDAX D ;..OF CHARACTERS. MOV B,A MVI A,'#' CALL CONOUT MVI A,0DH CALL CONOUT MVI A,0AH CALL CONOUT MOV A,B ;TEST IF ZERO INPUT ORA A JZ INBUFA CTLRLP: INX D LDAX D CALL CONOUT DCR B JNZ CTLRLP JMP INBUFA ALERT: MVI DAD D ;POINT TO BYTE AFTER LAST CHAR.. MVI M,0DH ;..IN CMD LINE AND STORE DELIMITER. POP H ;RESTORE HL AND DE. POP D PUSH D PUSH H INX D ;ADDRESS START OF COMMAND. INX D CALL DRIV NAME1: MVI C,8 ;TRANSFER FIRST FILENAME TO FCB. CALL TRANS CPI 0DH JZ DONE2 CPI 20H ;IF SPACE, THEN START OF.. JZ NAME2 ;..SECOND FILENAME. TYPE1: E CHANGED AS WELL. ; CPI 61H ;CHANGE TO UPPER.. ; JC NOUCASE ;..CASE SINCE CP/M.. ; CPI 7BH ;..DOES THE SAME. ; JNC NOUCASE ; ANI 5FH NOUCASE:POP B POP D POP H RET CONIN1: LHLD 1 LXI D,6 DAD D PCHL CONSTAT:PUSH H PUSH D PUSH B CALL CONST1 POP B POP D POP H RET CONST1: LHLD 1 LXI D,3 DAD D PCHL CONOUT: PUSH H PUSH D PUSH  POP H PUSH H LXI B,17 ;POINT TO FIRST CHAR OF SECOND NAME IN FCB. DAD B CALL SCANM POP H POP D POP B POP PSW RET INIT: PUSH H ;INITIALIZES FCB WITH 1 NULL (FOR FIRST DRIV). PUSH B ;..11 BLANKS, 4 NULLS, 1 NULL (FOR 2ND DRIV),. MVI M,0 ;..11 BLANKS, AND 4 NULLS. INX H MVI B,11 MVI A,20H CALL INTFIL MVI B,5 MVI A,0 CALL INA,7 CALL CONOUT DCR M XCHG JMP INBUFA PCRLF: MVI A,0DH CALL CONOUT MVI A,0AH CALL CONOUT JMP INBUFA INBUFR: MVI A,0DH CALL CONOUT MVI A,0AH CALL CONOUT POP D POP B POP H POP PSW RET CLEAR: POP D ;ACCOUNTS FOR CALL POP H ;ADDRESS BUFFER IN HL PUSH H ;RESTORE.. PUSH D ;..STACK MOV B,M POP H ;FILETYPE MUST BE AFTER.. PUSH H ;..EIGHTH BYTE OF NAME. LXI B,9 DAD B MVI C,3 ;TRANSFER TYPE OF FIRST FILE CALL TRANS CPI 0DH JZ DONE2 NAME2: LDAX D ;EAT MULTIPLE SPACES.. CPI 20H ;..BETWEEN NAMES. JNZ NAME2C INX D JMP NAME2 LDAX D CPI 0DH ;TEST IF FIRST NAME.. JZ DONE2 ;..ONLY AND THEN SPACE. NAME2C: POP H B PUSH PSW CALL CONOT1 POP PSW POP B POP D POP H RET CONOT1: LHLD 1 LXI D,9 DAD D MOV C,A PCHL CPMLINE:PUSH PSW PUSH B PUSH D PUSH H CALL INIT ;FILLS FCBS WITH BLANKS AND NULLS XCHG ;GET START OF COMMAND LINE IN HL. INX H ;ADDRESS # BYTES IN CMD LINE. MOV E,M ;LOAD DE PAIR WITH # BYTES. MVI D,0 INX H TFIL MVI B,11 MVI A,20H CALL INTFIL MVI B,4 MVI A,0 CALL INTFIL POP B POP H RET INTFIL: MOV M,A INX H DCR B JNZ INTFIL RET DRIV: INX D ;CHECK 2ND BYTE OF FILENAME. IF IT.. LDAX D ;..IS A ":", THEN DRIV WAS SPECIFIED. DCX D CPI ':' JNZ DEFDR ;ELSE ZERO DEFAULT DRIV ('INIT' PUT ZERO) LDAX D ANI 5FH SUI 40H ;SAVE MAXIMUM IN B INX H ;POINT TO FIRST.. INX H ;..BUFFER BYTE. MVI A,20H CLEARL: MOV M,A INX H DCR B JNZ CLEARL RET CONIN: PUSH H PUSH D PUSH B CONINLP:CALL CONSTAT ORA A JZ CONINLP CALL CONIN1 ;IF YOU WISH ALL COMMANDS GOING TO THE BUFFER TO BE CONVERTED ;TO UPPER CASE THEN RE-INITIALIZE THE FOLLOWING CODE, BUT ;THE AUTO-DIAL ROUTINES AND PHONE DIRECTORY FORMAT WILL HAVE ;TO B ;SECOND NAME STARTS IN 16TH BYTE. PUSH H ;POINT HL TO THIS BYTE. LXI B,16 DAD B CALL DRIV MVI C,8 CALL TRANS CPI 0DH JZ DONE2 TYPE2: POP H ;SECOND TYPE STARTS IN 25TH BYTE. PUSH H LXI B,25 DAD B MVI C,3 CALL TRANS DONE2: POP H PUSH H INX H ;POINT TO FIRST CHAR OF FIRST NAME IN FCB. CALL SCANM ;CHECK FOR * (AMBIGUOUS NAMES).   ;CALCULATE DRIV (A=1, B=2,...).. MOV M,A ;..AND PLACE IT IN FCB. INX D ;ADDRESS FIRST BYTE OF.. INX D ;..IN CMD LINE,.. DEFDR: INX H ;..AND NAME FIELD IN FCB. RET TRANS: LDAX D ;TRANSFER FROM CMD LINE TO FCB.. INX D ;..UP TO NUMBER OF CHARS SPECIFIED.. CPI 0DH ;..BY C-REG. KEEP SCANNING FIELD.. RZ ;..WITHOUT TRANSFER UNTIL DELIMITING.. CPI '.' MVI B,8 CALL MOVE INX D MVI B,3 CALL MOVE CALL ILPRT PRNTNM: DB ' ',' ',' ', ' | ', 0 ;8,1,3 SPACES LDA NAMCT INR A STA NAMCT ANI 03H ORA A CZ CRLF NEXTSR: LXI D,SRCHFCB MVI C,SRCHN ;DO NEXT SEARCH CALL BDOS CPI 0FFH JZ DIRDONE JMP DIRLP NOFILE: CALL ILPRT DB CR,LF,'++ FILE NOT FOUND ++',0 DIRDONE:CALL CRLF RET QSTMAR CALL CPMLINE LXI H,SRCHFCB CALL INITFCB LDA 6CH ;GET DRIVE # STA SRCHFCB LDA 6DH CPI 20H ;IF BLANK GET ALL NAMES PUSH PSW CZ QSTMARK POP PSW CNZ MVNM ;ELSE MOVE NAME INTO FCB CALL DRIVE LXI D,80H MVI C,STDMA CALL BDOS XRA A STA NAMCT ;CR AFTER 4 NAMES LXI D,SRCHFCB MVI C,SRCHF ;DO FIRST SEARCH CALL BDOS DB 0 OPTBL EQU $ ANSWFLG:DB 'A' DISCFLG:DB 'D' ORIGFLG:DB 'O' QFLG: DB 'Q' RSEEFLG:DB 'R' SSEEFLG:DB 'S' VSEEFLG:DB 'V' TERMFLG:DB 'T' ECHOFLG:DB 'E' CRCFLG: DB 'C' BATCHFLG:DS 1 ;SET TO 'B' BY MENU. DOES NOT ALLOW MULTI-.. OPTBE EQU $ ;..FILE XFER WHEN PROGRAM INITIALLY CALLED. RESTROPT: ;MUST BE IN SAME ORDER AS TABLE ABOVE DB 'A','D','O','Q','R','S','V','T','E','C','B' RESTSN: DB 0,0,0,0,0,0 DW DBUF DB 0,0,0,0,0,0 SECTNB EQU $ RCVSNO: ;..FIELD CHAR SUCH AS '.', BLANK, OR.. RZ ;..C/R (FOR END OF CMD LINE). CPI 20H RZ DCR C JM TRANS ;ONCE C-REG IS LESS THAN ZERO, KEEP READING.. MOV M,A ;..CMD LINE BUT DO NOT TRANSFER TO FCB. INX H JMP TRANS SCANM: MVI B,8 ;SCAN FILE NAME ADDRESSED BY HL. TSTNAM: MOV A,M CPI '*' ;IF '*' FOUND, FILL IN REST OF FIELD.. JZ FILL1 ;..WITH '?' FOR AMBIGUOUS NAME. K:MVI A,'?' ;IF BLANK IN FCB, PUT IN 11 ?'s MVI B,11 LXI H,SRCHFCB+1 QSTLP: MOV M,A INX H DCR B JNZ QSTLP RET MVNM: LXI H,6DH LXI D,SRCHFCB+1 MVI B,11 CALL MOVE ;MOVE IN CP/M PROGRAM RET GETADD: ANI 03H ;GET MOD4 FOR CP/M 1.4 ADD A ADD A ADD A ;ADD 32 ADD A ADD A MOV E,A MVI D,0 LXI H,80H ;ADD DMA OFFSET  CPI 0FFH JZ NOFILE DIRLP: CALL GETADD LXI D,15 ;OFFSET FOR RECORD COUNT DAD D MOV A,M ORA A JZ NEXTSR ;NO LIST IF FILE IS ZERO LENGTH LXI D,-5 DAD D ;POINT TO $SYS ATTRIB BYTE MOV A,M ANI 80H JNZ NEXTSR ;NO LIST IF $SYS FILE LXI D,-10 DAD D ;POINT TO BEGINNING OF NAME INX H ;POINT TO FIRST LETTER LXI D,PRNTNM  DB 0 SECTNO: DW 0 ERRCT: DB 0 ERRCDE: DB 0 EOFLG: DB 0 SECPTR: DW DBUF SECINBF:DB 0 MAXEXT: DB 0 RCNT: DW 0 DATAFLG:DB 0 EXACFL: DB 0 SECTNE EQU $ FSTFLG: DB TRUE CMDBUF: DB 80H,0 DS 80H HLSAVE: DS 2 DISKNO: DS 1 SENDFLG:DS 1 NBSAVE: DS 2 BGNMS: DS 2 FILECT: DS 1 NAMECT: DS 1 DS 60 STACK: DS 2 FCB3: DS 33 FCBBUF: DS 15 DBUF EQU $ ;DISK BUFFER...DBFSIZ SET AT ;BEGINNING NAMEBUF EQU DBUF+(DBFSIZ*1024);BUFFER FOR NAMES IN BATCH MO INX H DCR B JNZ TSTNAM JMP TSTTYP FILL1: CALL FILL TSTTYP: MVI B,3 ;SCAN AND FILL TYPE FIELD FOR NAME.. TSTYPL: MOV A,M ;..SPECIFIED ABOVE. CPI '*' JZ FILL2 INX H DCR B RZ JMP TSTYPL FILL2: CALL FILL RET FILL: MVI M,'?' ;ROUTINE TRANSFERS '?'. INX H DCR B JNZ FILL RET DIRLST: LXI D,CMDBUF ;PUT COMMAND LINE IN FCB LXI H,5CH  DAD D RET DRIVE: LDA SRCHFCB ;IF NO DRIVE, CAL ORA A ;LOGGED IN DRIVE JZ CALCDR ADI 40H JMP PRNTHD CALCDR: MVI C,25 CALL BDOS ADI 41H PRNTHD: STA DRNAME CALL ILPRT DB CR,LF,'DRIVE ' DRNAME: DB ' :',CR,LF,LF,0 RET SRCHFCB:DS 33 NAMCT: DS 1 NFLFLG:DB FALSE ;NORMALLY SET TO FALSE. ALLOWS WRITE TO.. ;..MEMORY IN TERMINAL MODE. OPTION:   DE. ;OVERFLOWS ABOVE PROGRAM CODE. ; BDOS EQUATES RDCON EQU 1 WRCON EQU 2 PRINT EQU 9 RDBUF EQU 10 CONST EQU 11 RESET EQU 13 OPEN EQU 15 CLOSE EQU 16 SRCHF EQU 17 SRCHN EQU 18 ERASE EQU 19 READ EQU 20 WRITE EQU 21 MAKE EQU 22 REN EQU 23 STDMA EQU 26 FILSIZ EQU 35 BDOS EQU 5 REIPL EQU 0 FCB EQU 5CH FCBEXT EQU FCB+12 FCBSNO EQU FCB+32 FCBRNO EQU FCB+32 FCB2 EQU 6CH END ............. R ........................... S ........................... T ........................... U ........................... V ........................... W ........................... X ........................... Y ........................... Z ........................... $@ ++ Now searching for "-CATALOG" file++ !  ) .) ! ”>.”#””͡”››tK››͸›* =: =͔="  ʳ ª~#.  ¿~  #~  .+~#0:0~#!A.O.Gy~#0M0 K MMɷ:m2 FSÄCRCKLIST$$$››tK›, › **}|!"*{z*~]*"Ü  DISK FULL: CRCFILE$!"*~#CRC.COM 5.0 6/18/82CRCKFILE???!9" 1 M @ CRC Ver 5.0 CTL-S pauses, CTL-C aborts :] O@ ++Searching for CRCKLIST file++@ Now searching for "CRCKFILE" file++ !  1 .) F!  ͡]͸! ͔0CRCKLIST???CRCKFILE???!9" M à*,*.}|ډ!".*,{z{** u*.".G*.",!".***,}>*.#".ɯ22)! ",". <  NO FILECRC FILE$!   >. @ Checking wi --> FILE: BYE .COM CRC = 48 8B --> FILE: SMODEM .DOC CRC = 10 78 --> FILE: KAYTERM .DOC CRC = 90 F9 --> FILE: XMODEM .COM CRC = AB D8 --> FILE: XMODEM .DOC CRC = 9C 1A --> FILE: SMODEMK .COM CRC = 46 0E --> FILE: SMODEMK .MAC CRC = 79 A5 --> FILE: PHONE .001 CRC = 72 1E --> FILE: CRC .COM CRC = B2 07 --> FILE: D .COM CRC = 66 48 --> FILE: MODEMPAT.ASM CRC = C6 40 --> FILE: MODEMPAT.COM CRC = B9 B8 --> FILE: 14-DISK .DOC CRC = 5B B5*#"ɯ2i2}! "!"]]2 s : ~# ++FILE NOT FOUND++$: F*}’">͇†]<  CANNOT CLOSE CRCFILE$CRCKLISTCRCSK FULL: CRCFILE$  w# !]͐ DONE$!e S!]Q !eZ @ --> FILE: XXXXXXXX.XXX CRC = oS) \<‘@ ++OPEN FAILED++ !" !" * | ʹ) \!~2 #" Ý: ) > T : ) @ ++FILE READ EA Oxgate One.....408-287-5901 B Oxgate Two rb..408-263-2588 C Oxgate Three.......965-4097 D Kelly smith....805-527-9321 E RCPM Snta Clra.408-246-5014 F RCPM 7pm-11 rb.213-549-9296 G Data Exc1 RBBS.213-541-2503 H Data Exc2 RBBS.714-534-1547 I S.Dgo 212 RCPM.714-271-5615 J RBBS Marin county..383-0473 K Larkspur RBBS/RCPM.461-7762 L Sac. CBBS/RBBS.916-483-8718 M ........................... N ........................... O ........................... P ........................... Q ..............th file - ! ~T #M M 2 2 2 2 ! >2 3o: : @ ***No CRC Files found***$> ʉ ʉw#: <2 P6: .6@ Can not parse string ! ~ʽT #ñM ! > 6 #6^#6! ~T #! 4M #x] #e w~ T #>2 @ - s M@ File not found ! 4 >2 o: G: „: G: „@ *Match* 2 ! 4@ <-- is, was --> : ) > T : ) M 2 ! 4<2 ~# @ Not a space between CRC values<2 G-CATALOG???  RROR++ <* |): o% |g}o" 2  ; 0T ~T #~A > T > _h : F{͇2h2|: ʲ !\   :\2 ! \  \ ! \  \! \  \<7=Ɓo&   ]  2h2|2   ~$#~# x  : F} *}= ">͇1 ] ! i* &*; >OK : <2 E:/ *; ^#V*% DMf kK : *; Nf E*; ~ڻWK þE *; ~SK E = ! 6:! ':/ : = !: = : <2 * " !" >! .  * *&͵ "( * *&͵ > j*( #"( *DM*( V"( !" (   K!" }2 : <2 O:* * * "    >! = * DM** +" *( * " Ø* #" *&C 4Ø:!4:!5(  ! I3= : [= t:\a:\=_: :] t ?]\ : ҃! 6?Î : 2   ]Q  ?\\ : DM, Q ! "= *3 ##)*= "; */ &# "! *3 #"#  !! "% >!1 . 2' \: 2 : ʩ: ƀo&"* ~ʛ*# +"# ** DMY қ** DM  *; q#p* " . ** #DM*; -e**  *; w* #" )*= *; s#r*; "; : 2 !S 6!"V * "n >!S d*S &T ) ^#V"K O!l ^#V"M :S =2S M K  a*K "G *; ; KAYMODEM PATCH ; ; ALLOWS USER TO SPECIFY: ; baud rate, word length, stop bits, pairity ; for the Z-80 SIO/DART ; ; WRITTEN: 03/01/83 ; BY: Wayne E. Campeau ; FOR: Anchor Computer Systems ; ; USE: This program is to be patched into the MODEM7 program ; available frome either the CP/M Users Group or the ; Special Interest Group (SIG). ; Some simple changes need to be made for the program to ; run alone (Remove the REENTRY patch). ; ;------------------------------------- match - : ̓ : J M @ Quantity of lines failed parse test - : ̓ : ~ M @ Quantity of file(s) not found - : ̓ * d͔  ͔ 0T  Җ Wyʩ 0T 0ztiil*( * " 3*1 #" " " *5 " > # R : B * +" ! +s#r( ! 6: " * ~2 * #" * +" > ʶ : 2 Ғ * +" : <2 O>ҳ ! 6* #" * ~2 p ̓: AOK = * Ͱ= * ͷ= * Ͱ= *# ͷ= * Ͱ= . g S -A >>!  ~?l W >#^ : /!:' —  ʑ #‹  W ʢ #™ i`N#FogDM!>))덑o|g =¼ DM!>)) = ^#V) ^#V|g}o M "I *K  )*= ^#V"O I G  *G )*= N#F*O ? J*G #"G (*I )*= ^#V*O DM? m*I +"I JI G  *G )*= ^#V"Q *I )*= *G )*= N#Fq#p*I )*= *Q s#r*G #"G *I +"I K I  G M   !M G  :S <2S O!T *G s#r*S &l ) *M s#r*I "M ^I K  X:S <2S O!T *K s#r*S &l ) *I s#r*G "K û!" "    #* #" )*= * #" )*= N#Fq#p   * )*= * ) *= ^#VN#F? H * #" )*= ^#V";  *; ^#V" * )*= ------------------------------------ WBOOT EQU 0000H ;DEFINE WARM BOOT ADDRESS BDOS EQU 0005H ;DEFINE BDOS ENTRY POINT LOADPT EQU 0100H ;DEFINE CP/M LOAD POINT REENTRY EQU LOADPT+0036H ;DEFINE PROGRAM RE-ENTRY POINT INTO MODEM7 ;------------------------------------------------------------------------- ; CP/M DOS CALL NUMBERS CONIN EQU 1 ;DEFINE CONSOLE INPUT CALL CONOUT EQU 2 ;DEFINE CONSOLE OUTPUT CALL DIRIO EQU 6 ;DEFINE DIRECT CONSOLE I/O CALL PMSG EQU 9 ;DEFINE PRINT MESSAGE DOS Hit Space: KK : k Used: /k Not used: k *% DMf : remain on 1 !9" ! J> # ->! . *ͪe> # < * v K  K  K !B r+s+p+qA ?  p*A *? :]$Ž l]Q !]6 !E 6!C 6 :C *C &l ~2D U¼:E 2 :D S:E 2:D F:E 2:D V:E 2:D P:E 2 :D N2E ! _{ozgO{ozgi`N#Fogo&og_{_z#W OK = Y -S {-_ ! s+p+q*  ͼ 2 <2 : ! ڗ  K ! 4Á ! 6: =! ڻ * & NK ! 4œ >3  03} Z; { ) #    COMMAND ;-------------------------------------------------------------------------- ; CHARACTER DEFFINITIONS CNTRL$C EQU 3 ;DEFINE CTRL-C CHAR (^C) CR EQU 13 ;CARRIAGE RETURN LF EQU 10 ;LINE FEED ESC EQU 27 ;ESCAPE CHAR (^[) ;------------------------------------------------------------------------ ; PORT DEFFINITIONS SIO$CONTROL EQU 6 ;SIO STATUS/COMMAND PORT BAUD$PORT EQU 0 ;BAUD RATE CONTROLER PORT ;======================================================================== ;URN PRINT$STOPS: LXI D,STOP$MSG MVI C,PMSG JMP BDOS ;PRINT THE STOP-BITS PROMPT & RETURN PRINT$PAIRITY: LXI D,PAIRITY$MSG MVI C,PMSG JMP BDOS ;PRINT THE PAIRITY PROMPT & RETURN GET$SEL: PUSH B ;SAVE THE MAX NUMBER OF SELECTIONS WAIT: MVI C,DIRIO MVI E,0FFH ;SET FOR INPUT CALL BDOS ; ORA A ;CHECK FOR CHAR READY JZ WAIT ;IF NOT READY THEN WAIT POP B ;GET THE MAX VALUE. INR B ;INC THE MAX VALUE. ANI 7FH ;STRIP THE PAIRITY BIT. CPI CNTRL$C ;IS IT A BREAUD: CALL PRINT$BAUD ;PRINT THE BAUD-RATE PROMPT MVI B,6 ;SET THE MAX NUMBER OF SELECTIONS CALL GET$SEL ;GET THE USERS SELECTION STA BAUD$RATE ;SET THE BAUD RATE RET CONFIG: CALL BITS$MENU ; CALL STOP$MENU ; CALL PAIRITY$MENU ; RET ; BITS$MENU: CALL PRINT$BITS ;PRINT THE WORD LENGTH PROMPT MVI B,3 ;SET THE MAX NUMBER OF SELECTIONS CALL GET$SEL ;GET THE USERS SELECTION STA WORD$LENGTH ;SET THE WORD LENGTH RET ; STOP$MENU: CALL PRINT$STOPS ;PRINT THE STOP BITS PROMP LDA PAIRITY ;GET THE PAIRITY MODE.. LXI H,PAIRITY$TBL ; CALL LOOKUP ; ORA B ;OR THE COMMAND WORDS FOR STOP BITS AND ;PAIRITY MODE TOGETHER. OUT SIO$CONTROL ;NOW SEND THE COMBINED COMMAND WORD. ; MVI A,3 ;ADDRESS REG. 3 OUT SIO$CONTROL ; LDA WORD$LENGTH ;LOAD THE Rx WORD LENGTH LXI H,BITS$TBL2 ; CALL LOOKUP ; OUT SIO$CONTROL ; ; MVI A,5 ;ADDRESS REG. 5 OUT SIO$CONTROL ; LDA WORD$LENGTH ;LOAD THE Tx WORD LENGTH LXI H,BITS$TBL1 ; CALL LOOKUP ; OUT SIO$CONT BEGINING OF PROGRAM ORG LOADPT ;ORG AT THE START OF THE PROGRAM JMP PATCH ; ;========================================================================= ; MAIN BODY OF PROGRAM IS BEYOND THE END OF THE MODEM7 PROGRAM ORG LOADPT+2900H ;ORG AT THE END OF THE PROGRAM ;(DELETE FOR STAND ALONE) PATCH: ; LXI SP,STACK ;DEFINE OUR OWN TEMP. STACK CALL CLS ;CLEAR THE SCREEN CALL BAUD ;GET THE BAUD RATE CALL CLS ;CLEAR THE SCREEN CALL CONFIG ;GET THE CHANNEL CONFIG CALL PROGK? JZ WBOOT ;YEP, ABORT. SBI '0' ;SUBTRACT ASCII OFFSET OF '0' JM DEFAULT ;IF UNDER-FLOW THE USE DEFAULT (0) ;ELSE, CMP B ;COMPARE THE CHAR TO IT JC ECHO$SEL ;IF CHAR <= MAX THEN ECHO THE SELECTION & RET ;ELSE, DEFAULT: XRA A ;SET A=0 ECHO$SEL: PUSH PSW ;SAVE THE ANSWER ADI '0' ;ADD THE ASCII OFFSET OF '0' TO MAKE CHAR PRINTABLE MVI C,DIRIO ;SET THE BDOS FUNCTION MOV E,A ;PUT THE CHAR IN E. CALL BDOS ;PRINT IT POP PSW ;RESTORE THE CHAR. RET ;RETURN ;--T MVI B,2 ;SET THE MAX NUMBER OF SELECTIONS CALL GET$SEL ;GET THE USERS SELECTION STA STOP$BITS ;SET THE STOP BITS RET ; PAIRITY$MENU: CALL PRINT$PAIRITY ;PRINT THE PAIRITY PROMPT MVI B,2 ;SET THE MAX NUMBER OF SELECTIONS CALL GET$SEL ;GET THE USERS SELECTION STA PAIRITY ;SET THE PAIRITY RET ; PRINT$BAUD: LXI D,BAUD$MSG MVI C,PMSG JMP BDOS ;PRINT THE BAUD-RATE PROMPT & RETURN PRINT$BITS: LXI D,BIT$MSG MVI C,PMSG JMP BDOS ;PRINT THE WORD LENGTH PROMPT & RETROL ; ; MVI A,1 ;ADDRESS REG. 1 OUT SIO$CONTROL ; MVI A,00000010B ;ENABLE Tx. OUT SIO$CONTROL ; RET ; LOOKUP: ADD L MOV L,A MVI A,0 ADC H MOV H,A MOV A,M RET ;------------------------------------------------------------------------- BAUD$MSG: DB ' *** KAYPRO-II MODEM PROGRAM *** VERS. 2.0', CR,LF DB CR,LF DB ' Anchor Computer Systems', CR,LF DB ' 323 1st. Ave. So.', CR,LF DB ' Seattle, WA 98104', CR,RAM ;PROGRAM THE CHANNEL CALL CLS ;CLEAR THE SCREEN XRA A ;CLEAR A. JMP REENTRY ;JUMP BACK INTO THE MODEM7 PROGRAM ;(CHANGE TO A JMP WBOOT FOR STAND ALONE) ;========================================================================== ; SUBROUTINES CLS: ;CLEAR THE SCREEN MVI C,DIRIO ; MVI E,ESC ;LEAD-IN CALL BDOS ; ; MVI C,DIRIO ; MVI E,'*' ; CALL BDOS ;CLEAR CODE RET ;RETURN ;------------------------------------------------------------------------- BA----------------------------------------------------------------------- PROGRAM: ;PROGRAM THE I/O CHANNEL LDA BAUD$RATE ; LXI H,BAUD$TBL ; CALL LOOKUP ; OUT BAUD$PORT ; MVI A,18H ;LOAD RESET CODE OUT SIO$CONTROL ;RESET THE SIO CHANNEL MVI A,10H ;LOAD RESET STATUS INTERUPTS CODE OUT SIO$CONTROL ;RESET THEM ; MVI A,4 ;ADDRESS REG. 4 OUT SIO$CONTROL ; LDA STOP$BITS ;GET THE NUMBER OF STOP BITS, LXI H,STOPS$TBL ; CALL LOOKUP ; MOV B,A ;SAVE FOR LOGICAL OR.. ;   LF DB CR,LF DB ' (206) 621-9307 Voice', CR,LF DB ' (206) 621-8665 Data', CR,LF DB CR,LF DB ' 0. 300', CR,LF DB ' 1. 600', CR,LF DB ' 2. 1200', CR,LF DB ' 3. 2400', CR,LF DB ' 4. 4800', CR,LF DB ' 5. 9600', CR,LF DB ' 6. 19.2K', CR,LF DB CR,LF DB ' Choose one of the above BAUD RATES:(0-6)', CR CR,LF DB ' 1. EVEN PAIRITY', CR,LF DB ' 2. ODD PAIRITY', CR,LF DB CR,LF DB ' WHAT IS YOUR SELECTION?' DB '$' ;--------------------------------------------------------------------------- ; SIO CONTROL-WORD TABLES BAUD$TBL: DB 5,6,7,10,12,14,15 BITS$TBL1: DB 11101000B,11001000B,10101000B,10001000B ;REG 5 BITS$TBL2: DB 11000001B,01000001B,10000001B,00000001B ;REG 3 STOPS$TBL: DB 01000100B,01011000B,01001100B ;REG 4 PAIRIT*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \,LF DB CR,LF DB ' Any other key will set 300 BAUD.', CR,LF DB CR,LF DB ' WHAT IS YOUR SELECTION ?' DB '$' BIT$MSG: DB CR,LF DB ' Choose one of the following WORD LENGTHS:', CR,LF DB CR,LF DB ' 0. 8 BITS', CR,LF DB ' 1. 7 BITS', CR,LF DB ' 2. 6 BITS', CR,LF DB ' 3. 5 BITS', CR,LF DB CR,LF DB ' WHAT IS YOUR SELECTION*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \Y$TBL: DB 01000000B,01000011B,01000001B ;REG 4 ; SELECTIONS MADE BY USER BAUD$RATE: DB 0 ; WORD$LENGTH: DB 0 ; STOP$BITS: DB 0 ; PAIRITY: DB 0 ; ;--------------------------------------------------------------------------- DS 100H ;RESERVE SOME STACK SPACE STACK EQU $ ;SET STACK HERE END LOADPT ; *    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \?' DB '$' STOP$MSG: DB CR,LF DB ' Choose from the following STOP BITS:', CR,LF DB CR,LF DB ' 0. 1 STOP BIT ', CR,LF DB ' 1. 1.5 STOP BITS', CR,LF DB ' 2. 2 STOP BITS', CR,LF DB CR,LF DB ' WHAT IS YOUR SELECTION?' DB '$' PAIRITY$MSG: DB CR,LF DB ' Choose from the following PAIRITY SELECTIONS:', CR,LF DB CR,LF DB ' 0. NO PAIRITY', *    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \!  *    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \"  *    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \l set 300 BAUD. WHAT IS YOUR SELECTION ?$ Choose one of the following WORD LENGTHS: 0. 8 BITS 1. 7 BITS 2. 6 BITS 3. 5 BITS WHAT IS YOUR SELECTION?$ Choose from the following STOP BITS: 0. 1 STOP BIT 1. 1.5 STOP BITS 2. 2 STOP BITS WHAT IS YOUR SELECTION?$ *    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \10*(**4*ͬ**6*b*͂*2/>*J*V*j*͂*2/r*͂*2/z*͂*2/+ >- ". . ʃ*0*ڡ*0_:/!/+>>>:/!/+G:/!/+>:/!/+>:/!/+>>*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \Choose from the following PAIRITY SELECTIONS: 0. NO PAIRITY 1. EVEN PAIRITY 2. ODD PAIRITY WHAT IS YOUR SELECTION?$ ȨADXL@CA*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \*    B7ǫ F  ? b  aC S q  4 R pp2h: T >2 !\  :\2 ! \o>g~ *** KAYPRO-II MODEM PROGRAM *** VERS. 2.0 Anchor Computer Systems 323 1st. Ave. So. Seattle, WA 98104 (206) 621-9307 Voice (206) 621-8665 Data 0. 300 1. 600 2. 1200 3. 2400 4. 4800 5. 9600 6. 19.2K Choose one of the above BAUD RATES:(0-6) Any other key wil#  ------------------------- KAYPRO USER DISK #14 ------------------------------ Smart Modem Programs Micro Cornucopia PO Box 223 Bend, OR 97709 ----------------------------------------------------------------------------- SMODEMK.COM SMODEMK.MAC SMODEM.DOC This is a modem program set up to run a Hayes Smart modem. Similar to MODEM7 this program also will dial the number for you from a phone directr Kaypro send a file to you when you are at another machine, without having to enter anything from the Kaypro keyboard. XMODEM.DOC is the documentation file for using XMODEM.COM as well as some comments from a Kaypro user on setting up your modem for the first time. BYE.COM Also needed to run your system remotely. Run BYE and then leave your system turned on and connected to the modem and phone. When you call, BYE will ask you for a password, the password is "ANDY KAY" all uppercory. Multiple phone directories are allowed and may co-exist on the same disk. SMODEMK.MAC is the source file for the M80 assembler. SMODEM.DOC is the users manual for SMODEMK. PHONE.001 is the default directory and can be edited for your own numbers. Before creating a new directory see SMODEM.DOC for important information on directory format. This modem program does not set the baud rate, bits/ character, word length, or parity. Run MODEMPAT.COM to initialize your serial pase. And, since this was set up for the KAYpro I guess that is only right. Once you have answered with ANDY KAY, you will be logged into CP/M on your home system. You will be able to run your home system just as though you were sitting at the console. Then just enter BYE to exit. ort before entering SMODEM. MODEMPAT.ASM MODEMPAT.COM This is a menu driven program to set up your serial port almost any way you want. Just enter: MODEMPAT and answer the questions. KAYTERM.DOC This submission is a quick over view of the information needed to use or write programs to use the CRT and the Modem Port. XMODEM.DOC XMODEM.COM These files are essential for using your Kaypro as a remote communicator. XMODEM allows you to make you$  %  &  '