; TITLE 'CLINK - COMMUNICATIONS LINK FOR CP/M - V 3.0' ;;; CLINK - COMMUNICATIONS LINK - VERSION 3.0 ; ; LAWRENCE E. HUGHES OCTOBER, 1978 ; ; PATCHED 2/9/80 - CONFIG DISPLAY - DICK SMITH ; KILLED SMITH'S BUGS OF 2/9/80 -7/12/81 -DON EKSTEDT ; ; REVISION HISTORY ; ; 10/19 0.0 INITIAL VERSION - BASIC LINK FACILITY, ; CONFIGURATION FILE IMPLEMENTED. SITE, ; PHONE, BAUD, PARITY, DBITS, SBITS, MODE, ; DUPLEX, AUTOLF AND CAPS DIRECTIVES. ; ; 10/21 1.0 'LOCAL COMMANDS' IMPLEMENTED. ESCAPE, ; DEBUG, ERROR, LIST, RETURN AND ABORT ; DIRECTIVES ADDED. ; ; 10/22 2.0 ASR FILE TRANSMISSION IMPLEMENTED. ; GARBAGE, EXPAND, READ, CAPTURE, WRITE ; DIRECTIVES ADDED. ; ; 10/23 2.1 SAVE, BREAK, RESET, HELP DIRECTIVES. ; ; 10/29 2.2 ANSWER MODE CHECKED OUT, REMESC ADDED ; ; 10/30 2.3 BUGS FIXED, DIR COMMAND ADDED, HELP ; COMMAND EXPANDED. ; ; 11/04 2.4 VARIOUS BUGS FIXED ; ; 11/18 2.5 ANSWER MODE TIMEOUT ; ; 01/12 3.0 PROTOCOL FILE TRANSFERS. ; ; CLINK IS A CP/M TRANSIENT PROGRAM WHICH ALLOWS THE USER ; TO ESTABLISH A COMMUNICATIONS LINK TO A REMOTE DEVICE ; (TYPICALLY A REMOTE COMPUTER). ALL I/O IS DONE VIA THE ; BDOS OR BIOS ENTRY POINTS. THE ASSUMPTION IS MADE THAT ; THE BAUD RATE OF THE CONSOLE DEVICE IS MUCH GREATER (2X ; OR MORE) THAN THE SELECTED BAUD RATE OF THE MODEM. THIS ; IS ESPECIALLY IMPORTANT IF AUTO LINE-FEED IS SELECTED. ; ; CLINK EXPECTS AS INPUT A FILE WITH ONE OR MORE DIRECTIVES ; (ONE PER LINE) WHICH ALLOW THE USER TO 'PROGRAM' THE ; VARIOUS CONFIGURATION OPTIONS WHICH MIGHT VARY FROM DEVICE ; TO DEVICE. IF A GIVEN OPTION IS NOT SPECIFIED, THE DEFAULT ; VALUE WILL BE USED. THE SYNTAX OF THESE DIRECTIVES IS AS ; FOLLOWS: ; ; ; ; WHERE IS ONE OR MORE SPACES AND/OR TABS, ; IS ONE OF THE WORDS IN THE FOLLOWING TABLE, AND IS ; ONE OF THE LEGAL VALUES SPECIFIED AFTER EACH KEYWORD. ; ; KEYWD POSSIBLE VALUE(S) DEFAULT ; ; SITE (UP TO 80 ALPHANUMERIC CHARS) NONE ; PHONE (UP TO 20 CHARACTERS) NONE ; BAUD 110,300 300 ; PARITY EVEN,ODD,NONE EVEN ; DBITS 7,8 7 ; SBITS 1,2 1 ; MODE ORIGINATE,ANSWER ORIGINATE ; DUPLEX FULL,HALF FULL ; AUTOLF ON,OFF OFF ; CAPS ON,OFF OFF ; ESCAPE (HEX VALUE, 00H=NONE) 1BH ; REMESC (HEX VALUE, 00H=NONE) 00H ; DEBUG ON,OFF OFF ; ERROR SUMMARY,(HEX VALUE, 00H=NONE) 00H ; GARBAGE (HEX VALUE, 00H=NONE) 00H ; EXPAND ON,OFF OFF ; BREAK (HEX VALUE, 00H=NONE) 00H ; ; 'SITE' IS USED ONLY BY THE LIST COMMAND, AND IS OPTIONAL. ; ; THE 'PHONE' NUMBER MAY CONTAIN DIGITS, PARENTHESIS, DASHES, ; BLANKS, AND/OR ASTERISKS. AN ASTERISK WILL CAUSE A ONE SECOND ; PAUSE DURING DIALING. IF NO NUMBER IS SPECIFIED, IT IS ASSUMED ; THAT A CONNECTION ALREADY EXISTS, AND THE DIALING CODE WILL BE ; SKIPPED. ; ; 'BAUD' SELECTS BAUD RATE, EITHER 110 OR 300 ; ; 'PARITY' MAY BE SPECIFIED AS ANY OF THE FOLLOWING: ; EVEN - PARITY BIT CHOSEN TO GIVE EVEN # OF 'ON' BITS ; ODD - PARITY BIT CHOSEN TO GIVE ODD # OF 'ON' BITS ; NONE - INHIBIT THE PARITY BIT ALTOGETHER ; ; 'DBITS' SELECTS THE NUMBER OF DATA BITS (7 OR 8) ; ; 'SBITS' SELECTS THE NUMBER OF STOP BITS (1 OR 2) ; ; NOTE THAT THE TOTAL NUMBER OF BITS IN EACH ASYNCHRONOUS CHAR- ; ACTER TO OR FROM THE MODEM WILL BE DBITS+SBITS+2 IF PARITY IS ; SELECTED, OTHERWISE DBITS+SBITS+1 (START BIT ALWAYS PRESENT). ; ; 'MODE' MAY BE USED TO SELECT CARRIER FREQUENCY. THIS SHOULD ; NORMALLY BE 'ORIGINATE', BUT MAY BE CHANGED TO 'ANSWER' TO ; ALLOW LINKING TO A REMOTE MODEM RUNNING IN 'ORIGINATE' MODE ; (SUCH AS ANOTHER CP/M USER RUNNING CLINK). ; ; 'DUPLEX' MAY BE SPECIFIED AS EITHER OF THE FOLLOWING: ; FULL - DO NOT ECHO CONSOLE CHARACTERS LOCALLY ; HALF - ECHO CONSOLE CHARACTERS LOCALLY ; ; IF THE 'AUTOLF' IS SET TO 'ON', A LINE FEED CHARACTER ; WILL BE SENT TO THE CONSOLE FOLLOWING ANY CARRIAGE RETURN. ; ; THE 'CAPS' OPTION MAY BE USED TO TURN ON OR OFF THE AUTOMATIC ; TRANSLATION OF LOWER CASE LETTERS (TO UPPER CASE) IN BOTH ; DIRECTIONS (TO AND FROM MODEM). ; ; 'ESCAPE' ALLOWS THE USER TO SPECIFY WHICH (IF ANY) ASCII CODE ; WILL BE USED TO TRAP INTO THE 'LOCAL COMMAND' MODE. THE VALUE ; 00H MEANS ALL CODES WILL BE TRANSMITTED TRANSPARENTLY. ANYTIME ; THE SELECTED ESCAPE CODE IS TYPED (FROM THE CONSOLE), A LOCAL ; PROMPT ( -> ) WILL BE DISPLAYED, AFTER WHICH A COMMAND MAY BE ; ENTERED (ANY DIRECTIVE, PLUS 'ABORT' AND 'RETURN' FOR EXITING ; TO CP/M WITH AND WITHOUT DISCONNECT, RESPECTIVELY). WHEN A CR ; IS TYPED, THAT LOCAL COMMAND WILL BE EXECUTED AND CONTROL WILL ; BE RETURNED TO THE MAIN LINK. ; ; 'REMESC' ALLOWS THE USER TO SPECIFY WHICH (IF ANY) ASCII CODE ; WILL BE USED TO LET THE REMOTE USER TRAP INTO THE 'LOCAL ; COMMAND' MODE (FROM HIS REMOTE TERMINAL). OTHERWISE SAME AS ; THE 'ESCAPE' FUNCTION. NOTE THAT THIS FUNCTION IS CURRENLTY ; RESTRICTED TO ALLOWING AN ORIGINATE SYSTEM TO GENERATE A ; REMOTE COMMAND, AND AN ANSWER SYSTEM TO RESPOND TO IT. ; ; 'DEBUG' MAY BE USED TO SWITCH ON AND OFF THE OPTION OF HAVING ; ALL BYTES READ FROM THE MODEM BE DISPLAYED IN HEX, 16 PER LINE, ; FOR PURPOSES OF DEBUGGING PROTOCOLS, DETERMINING LINE CHARAC- ; TERISTICS, ETC. ; ; 'ERROR' MAY BE USED TO REQUEST A SUMMARY OF TRANSMISSION ; ERRORS (PARITY, OVERRUN AND FRAME) BY USING THE PARAMETER ; 'SUMMARY'. BY SPECIFIYING A HEX VALUE, THE CORRESPONDING ; ASCII CHARACTER WILL BE OUTPUT IN PLACE OF ANY CHARACTER ; RECEIVED IN ERROR. THE VALUE 00H IS SPECIAL CASED TO MEAN ; 'OUTPUT THE RECEIVED CHARACTER ANYWAY'. THE ERROR COUNTS ; WILL BE MAINTAINED REGARDLESS. ; ; 'GARBAGE' MAY BE USED TO SPECIFY THE NUMBER OF GARBAGE CHARS. ; TO IGNORE AFTER ANY LINE FEED IS SENT FROM THE HOST. THIS IS ; MOST USEFUL IN CONJUNCTION WITH THE 'SEND' COMMAND. NOTE THAT ; THE 'DEBUG' OPTION MAY BE USED TO DETERMINE WHAT CONSTANT TO ; USE IN THIS DIRECTIVE. ; ; 'LIST' MAY BE USED TO CAUSE THE CURRENT CONFIGURATION DETAILS ; TO BE LISTED TO THE CONSOLE. IT IS PRIMARILY USEFUL FROM WITHIN ; THE LINK (VIA ESCAPE CODE), BUT MAY BE USED IN A CONFIG. FILE. ; ; 'EXPAND' MAY BE USED TO SELECT OR DESELECT THE OPTION OF ; EXPANDING TABS TO BLANKS DURING A 'SEND' OPERATION. IT DOES ; NOT AFFECT TABS ANYWHERE ELSE. ; ; 'BREAK' MAY BE USED TO SPECIFY ANY ASCII CODE TO BE USED AS ; A TRIGGER TO BREAK THE COMMUNICATIONS LINE FOR 150 MS. MANY ; TIMESHARING SERVICES USE THIS CONDITION AS IF IT WERE A ; CHARACTER, SO PROVISIONS HAVE BEEN MADE TO GENERATE IT. ; ; IT IS SUGGESTED THAT THE USER DETERMINE THE LINE CHARACTER- ; ISTICS FOR EACH POSSIBLE REMOTE SITE HE WILL BE DIALING INTO, ; AND CREATE A SEPARATE CONFIGURATION FILE FOR EACH. A TYPICAL ; FILE MIGHT BE AS FOLLOWS: ; ; SITE FSU CYBER 74, 300 BAUD ROTARY ; PHONE 1-904-644-6566 ; PARITY NONE ; DBITS 8 ; ESCAPE 18H (CTRL-X) ; ; ALL UNSPECIFIED OPTIONS WILL DEFAULT TO THE VALUES LISTED IN ; THE TABLE. IF THIS INFORMATION HAD BEEN WRITTEN TO THE FILE ; 'FSU74.CON', ONE COULD DIAL INTO THAT SITE WITH THE COMMAND: ; ; CLINK FSU74.CON ; ; IN ADDITION TO THE ABOVE DIRECTIVES, THE FOLLOWING DIRECTIVES ; MAY BE USED FROM WITHIN THE LINK, VIA THE ESCAPE CODE: ; ; RETURN RETURN TO CP/M WITHOUT DISCONNECT ; ABORT DISCONNECT AND RETURN TO CP/M ; READ D:FN.FT READ SPECIFIED FILE TO REMOTE HOST ; CAPTURE CAPTURE MODEM INPUT IN MEMORY BUFFER ; WRITE D:FN.FT WRITE MEMORY BUFFER TO DISK FILE ; SEND D:FN.FT SEND FILE USING PROTOCOL ; RECV D:FN.FT RECEIVE FILE USING PROTOCOL ; BLOCK N SET BLOCK SIZE TO N PAGES (SEND) ; LIST LIST CURRENT CONFIG. TO CONSOLE ; SAVE D:FN.FT WRITE CURRENT CONFIG. TO DISK FILE ; RESET RESET ERROR COUNTS ; DIR AFN SAME AS CP/M DIR COMMAND ; HELP REQUEST LIST OF ALL LOCAL COMMANDS ; ; 'READ' MAY BE USED TO SEND A FILE TO THE REMOTE DEVICE AS ; IF IT WERE COMING FROM THE CONSOLE KEYBOARD. IF RUNNING IN ; HALF DUPLEX, THE BYTES WILL JUST BE WRITTEN AS FAST AS THE ; MODEM WILL ACCEPT THEM. IF RUNNING IN FUL DUPLEX, THE BYTES ; ECHOED BY THE REMOTE DEVICE WILL BE COMPARED AGAINST THE ; BYTES SENT, AND AN ERROR COUNT MAINTAINED. WHEN EOF IS READ ; ON THE SPECIFIED FILE, AN ERROR SUMMARY WILL BE PRINTED (IN ; FULL DUPLEX ONLY) A BELL WILL BE WRITTEN TO THE CONSOLE, AND ; CONTROL WILL BE RETURNED TO THE MAIN LOOP. ; ; 'CAPTURE' MAY BE USED TO RESET THE MEMORY BUFFER POINTER AND ; SET A FLAG SO THAT ALL BYTES INPUT FROM THE MODEM WILL ALSO ; BE STORED SEQUENTIALLY IN MEMORY. ; ; 'WRITE' MAY BE USED TO WRITE 'CAPTURED' DATA TO A DISK FILE. ; NOTE THAT THIS ALSO CLEARS THE 'CAPTURE' FLAG. ; ; 'SEND' MAY BE USED TO TRANSMIT ANY CP/M FILE, INCLUDING .COM ; FILES (IF DATA PATH IS 8 BITS WIDE), USING AN ASYNCHRONOUS ; PROTOCOL WHICH HAS FAIRLY ELABORATE ERROR DETECTION AND AUTO ; RECOVERY (VIA RE-TRANSMISSION). AT PRESENT THIS WILL WORK ; ONLY WITH ANOTHER CLINK 3.0 SYSTEM WHICH IS EXECUTING A RECV. ; ; 'RECV' MAY BE USED TO RECEIVE A FILE (DIRECTLY TO DISK) WHICH ; IS BEING TRANSMITTED BY A CLINK 3.0 SYSTEM DOING A SEND. ; ; 'BLOCK' MAY BE USED TO SET THE BLOCK (MESSAGE) SIZE IN 'SEND', ; IN TERMS OF 256 BYTE PAGES. DEFAULT VALUE IS 4 (1024 BYTES). ; ; 'LIST' MAY BE USED TO VIEW THE CURRENT CONFIGURATION DETAILS. ; ; 'SAVE' MAY BE USED TO WRITE THE CURRENT CONFIGURATION DETAILS ; TO THE SPECIFIED DISK FILE, WHICH MAY LATER BE USED AS A ; CONFIGURATION INPUT FILE. ; ; 'DIR' MAY BE USED TO DETERMINE WHICH FILES ARE CURRENTLY ; ON ANY MOUNTED DISKETTE. THE RULES FOR THE PARAMETER ARE ; THE SAME AS IN THE STANDARD CP/M DIR COMMAND. ; ; 'HELP' MAY BE USED AT ANY TIME TO REVIEW AVAILABLE COMMANDS ; SYMBOL DEFINITIONS 0005 = ENTRY EQU 0005H ;BDOS ENTRY POINT 000A = RSFC EQU 10 ;READ STRING 000F = OFFC EQU 15 ;OPEN FILE 0010 = CFFC EQU 16 ;CLOSE FILE 0011 = SFFC EQU 17 ;SEACH FIRST 0012 = SNFC EQU 18 ;SEARCH NEXT 0013 = DFFC EQU 19 ;DELETE FILE 0014 = RRFC EQU 20 ;READ RECORD 0015 = WRFC EQU 21 ;WRITE RECORD 0016 = MFFC EQU 22 ;MAKE FILE 001A = SAFC EQU 26 ;SET ADDRESS 005C = TFCB EQU 005CH ;DEFAULT FILE CONTROL BLOCK 0001 = FN EQU 01 ;FILE NAME OFFSET 0009 = FT EQU 09 ;FILE TYPE OFFSET 000C = EX EQU 12 ;EXTENT OFFSET 0020 = NR EQU 32 ;NEXT RECORD OFFSET 0080 = MDATA EQU 80H ;MODEM DATA PORT 0081 = MSTAT EQU 81H ;MODEM STATUS PORT 0082 = MCTRL EQU 82H ;MODEM CONTROL PORT ; MODEM STATUS INPUT PORT DEFINITIONS 0080 = RI EQU 80H ;RING INDICATE 0040 = CD EQU 40H ;CARRIER DETECT 0010 = OE EQU 10H ;OVERRUN ERROR 0008 = FE EQU 08H ;FRAMING ERROR 0004 = PE EQU 04H ;PARITY ERROR 0002 = TRE EQU 02H ;TRANSMIT REG. EMPTY 0001 = RRF EQU 01H ;RECEIVER REG. FULL ; MODEM STATUS OUTPUT PORT DEFINITIONS 0010 = PI EQU 10H ;PARITY INHIBIT 0008 = SBS EQU 08H ;STOP BIT SELECT 0004 = LS2 EQU 04H ;LENGTH SELECT 2 0002 = LS1 EQU 02H ;LENGTH SELECT 1 0001 = EPE EQU 01H ;EVEN PARITY ENABLE ; MODEM CONTROL OUTPUT PORT DEFINITIONS 0080 = OH EQU 80H ;OFF HOOK 0020 = RID EQU 20H ;RING INDICATE DISABLE 0010 = ST EQU 10H ;SELF TEST 0008 = BK EQU 08H ;BREAK 0004 = MS EQU 04H ;MODE SELECT (1 = ORIGINATE) 0002 = TXE EQU 02H ;TRANSMIT ENABLE 0001 = BRS EQU 01H ;BIT RATE SELECT ; ASCII CHARACTERS 0000 = NULL EQU 00H ;NULL CHARACTER 0001 = SOH EQU 01H ;START OF HEADER 0002 = STX EQU 02H ;START OF TEXT 0003 = ETX EQU 03H ;END OF TEXT 0004 = EOT EQU 04H ;END OF TRANSMISSION 0005 = ENQ EQU 05H ;ENQUIRE 0006 = ACK EQU 06H ;ACKNOWLEDGE 0007 = BEL EQU 07H ;BELL 0008 = BS EQU 08H ;BACKSPACE 0009 = TAB EQU 09H ;HORIZONTAL TAB 000A = LF EQU 0AH ;LINE FEED 000D = CR EQU 0DH ;CARRIAGE RETURN 0010 = DLE EQU 10H ;DATA LINK ESCAPE 0015 = NAK EQU 15H ;NEGATIVE ACKNOWLEDGE 0016 = SYN EQU 16H ;SYNCH 0017 = ETB EQU 17H ;END OF TEXT BLOCK 0018 = CAN EQU 18H ;CANCEL 0019 = ESC EQU 19H ;ESCAPE 8005 = CRCPOL EQU 8005H ;CRC-16 POLYNOMIAL 0100 ORG 100H 0100 210000 CLINK: LXI H,0 ;SAVE ENTRY STACK POINTER 0103 39 DAD SP 0104 22241D SHLD OLDSP 0107 31A61D LXI SP,STACK+128 ;SETUP LOCAL STACK 010A 2A0600 LHLD ENTRY+1 ;HL = FWA OF BDOS 010D 7D MOV A,L ;ROUND DOWN TO NEAREST MULT. OF 128 010E E680 ANI 80H 0110 6F MOV L,A 0111 22D61F SHLD MAXADR ;SAVE AS MAX. ADDRESS 0114 1100FC LXI D,-1024 ;SUBTRACT 1024 0117 19 DAD D 0118 22D81F SHLD CCPADR ;SAVE AS CCP ADDRESS 011B AF XRA A ;CLEAR CCP OVERWRITE FLAG 011C 32A81D STA CCPF 011F CDD014 CALL CJV ;CREATE BIOS JUMP VECTOR 0122 AF XRA A ;CLEAR CONTROL PORT BYTES 0123 32AA1D STA CR1 0126 32AB1D STA CR2 0129 3E96 MVI A,IBUFL ;INITIALIZE IBUF 012B 32321F STA IBUF+0 012E AF XRA A ;DEFAULT TO NO SITE, NO PHONE 012F 32B41E STA SITEL 0132 32051F STA PHONEL 0135 0605 MVI B,LS2+EPE ;EVEN PARITY, 7 DATA BITS, 1 STOP BIT 0137 CD0615 CALL CR1ON 013A 0605 MVI B,MS+BRS ;ORIGINATE, 300 BAUD 013C DB81 IN MSTAT ;IF INCOMING CARRIER IS ON... 013E E640 ANI CD 0140 CA4501 JZ $+5 0143 0687 MVI B,OH+MS+BRS+TXE ;...THEN LEAVE OUR CARRIER ON 0145 CD2115 CALL CR2ON 0148 3E4F MVI A,'O' 014A 321A1F STA MODE 014D AF XRA A 014E 32A91D STA COF ;DIRECT CONSOLE OUTPUT TO CONSOLE 0151 321B1F STA ECHO ;DEFAULT TO FULL DUPLEX 0154 321C1F STA AUTOLF ;DEFAULT TO NO AUTO LINE FEED 0157 321D1F STA CAPS ;DEFAULT TO UPPER/LOWER CASE 015A 32201F STA DEBUG ;DEFAULT TO DEBUG OFF 015D 32221F STA ERROR ;DEFAULT TO NO ERROR CODE 0160 32231F STA GARBAGE ;DEFAULT TO NO GARBAGE CHARS. 0163 32241F STA EXPAND ;DEFAULT TO NO TAB EXPANSION 0166 32251F STA CAPTURE ;CLEAR CAPTURE FLAG 0169 32261F STA BREAK ;DEFAULT TO NO 'BREAK' TRIGGER 016C 3E11 MVI A,11H ;DEFAULT TO CNTL Q REMESC 016E 321F1F STA REMESC 0171 3E1B MVI A,1BH ;DEFAULT TO ESCAPE CODE OF ESC 0173 321E1F STA ESCAPE 0176 3E04 MVI A,4 ;DEFAULT TO 4 PAGE MESSAGES 0178 32E31F STA BLKSZ 017B 210000 LXI H,0 ;CLEAR ERROR COUNTS 017E 22281F SHLD PERR 0181 222A1F SHLD OERR 0184 222C1F SHLD FERR 0187 21FFFF LXI H,0FFFFH ;SETUP FOR INFINITE TIMEOUT 018A 22E61F SHLD TIME 018D 210020 LXI H,MBUF ;CLEAR MEMORY BUFFER 0190 22D41F SHLD MBUFP 0193 214515 LXI H,MSG0 ;PRINT 'CLINK VX.X' 0196 CD1E14 CALL WASC 0199 3A5D00 LDA TFCB+FN ;JUMP IF NO FILE NAME 019C FE20 CPI ' ' 019E CA0902 JZ CLINKH 01A1 115C00 LXI D,TFCB ;OPEN USER'S CONFIG. FILE 01A4 CDC711 CALL OPEN 01A7 FEFF CPI 255 ;JUMP IF OK 01A9 C2B501 JNZ CLINK0 01AC 215215 LXI H,MSG1 ;PRINT 'FILE NOT FOUND' 01AF CD1E14 CALL WASC 01B2 C35604 JMP CLINKX ;EXIT 01B5 AF CLINK0: XRA A ;'REWIND' FILE 01B6 327C00 STA TFCB+NR 01B9 32AE1D STA DIBUFC ;RESET DISK INPUT BUFFER 01BC CD4614 CALL WEOLC 01BF CDF711 CLINK1: CALL RASS ;READ LINE FROM FILE 01C2 DA0002 JC CLINK2 ;JUMP ON END OF FILE 01C5 CDFE10 CALL EASC ;ECHO ASCII STRING TO CONSOLE 01C8 CD5805 CALL PCD ;PROCESS CONFIGURATION DIRECTIVE 01CB DAD701 JC DIRERR 01CE D4E001 CNC MCD ;IF OK SEE IF MORE CD'S. 01D1 CD5805 CALL PCD ;YES SO PROCESS 01D4 D2BF01 JNC CLINK1 ;LOOP IF OK 01D7 216315 DIRERR: LXI H,MSG2 ;PRINT 'DIRECTIVE ERROR' 01DA CD1E14 CALL WASC 01DD C35604 JMP CLINKX ;EXIT ; 01E0 CD8913 MCD: CALL GNC ;GET THE NEXT CHAR. 01E3 DABF01 JC CLINK1 ;CARRY SET SO NO MORE CHARS. 01E6 FE20 CPI ' ' ;SPACE ? 01E8 C2E001 JNZ MCD ;NO SO LOOP 01EB CDD210 MCD1: CALL SNB ;YES SO GET RID OF SPACES 01EE DABF01 JC CLINK1 ;OUT OF CHARS 01F1 2A301F LHLD IBUFP ;NOW WE GOT A CHAR. 01F4 2B DCX H ;SO MOVE POINTER BACK 01F5 22301F SHLD IBUFP ;AND STORE IT 01F8 3A331F LDA IBUFC ;GET THE COUNTER 01FB 3C INR A ;BACK IT UP TOO 01FC 32331F STA IBUFC ;AND STORE IT 01FF C9 RET ;RETURN SO WE CAN PCD AGAIN 0200 115C00 CLINK2: LXI D,TFCB ;CLOSE CONFIG. FILE 0203 CDD311 CALL CLOSE 0206 CD4614 CALL WEOLC 0209 214916 CLINKH: LXI H,MSG14 ;PRINT 'ENTER DIRECTIVES' 020C CD1E14 CALL WASC 020F 210B16 CLINKF: LXI H,MSG10 ;PRINT PROMPT 0212 CD1E14 CALL WASC 0215 CD7413 CALL RASC 0218 CD4614 CALL WEOLC 021B 3A331F LDA IBUFC 021E B7 ORA A 021F CA3102 JZ CLINKG 0222 CD5805 CALL PCD 0225 D20F02 JNC CLINKF 0228 216315 MODERR: LXI H,MSG2 ;PRINT 'DIRECTIVE ERROR' 022B CD1E14 CALL WASC 022E C30F02 JMP CLINKF 0231 3A1A1F CLINKG: LDA MODE ;JUMP IF ORIGINATE MODE 0234 FE4F CPI 'O' 0236 CABB02 JZ CLINKB 0239 DB81 CLINK9: IN MSTAT ;WATCH FOR RING INDICATE 023B E680 ANI RI 023D CA5102 JZ CLINKM ;JUMP IF ACTIVE 0240 CDA313 CALL CCA ;CHECK FOR ESCAPE FROM CONSOLE 0243 D23902 JNC CLINK9 0246 47 MOV B,A 0247 3A1E1F LDA ESCAPE 024A B8 CMP B 024B CA0902 JZ CLINKH ;JUMP IF PRESENT 024E C33902 JMP CLINK9 0251 0682 CLINKM: MVI B,OH+TXE ;GO OFF-HOOK AND BRING UP CARRIER 0253 CD2115 CALL CR2ON 0256 015802 LXI B,600 0259 DB81 CLINKA: IN MSTAT ;CHECK FOR INCOMING CARRIER 025B E640 ANI CD 025D C27202 JNZ CLINCA ;CARRIER DETECTED 0260 CDEA14 CALL WAIT50 0263 0B DCX B 0264 78 MOV A,B 0265 B1 ORA C 0266 C25902 JNZ CLINKA 0269 217515 LXI H,MSG3 ;NO CARRIER DETECTED 026C CD1E14 CALL WASC 026F C34904 JMP EXIT 0272 3E01 CLINCA MVI A,1 ;DIRECT CONSOLE OUTPUT TO MODEM 0274 32A91D STA COF 0277 214515 LXI H,MSG0 ;PRINT 'CLINK VX.X' 027A CD1E14 CALL WASC 027D CD4614 CALL WEOLC 0280 21C005 LXI H,KWTAB+0*10 ;PRINT 'SITE ' 0283 CD030C CALL W8CC 0286 21B51E LXI H,SITE ;PRINT SITE NAME 0289 3AB41E LDA SITEL 028C 47 MOV B,A 028D 04 INR B 028E 05 XXX1: DCR B 028F CA9A02 JZ XXX2 0292 7E MOV A,M 0293 23 INX H 0294 CD5A14 CALL WACC 0297 C38E02 JMP XXX1 029A CD4614 XXX2: CALL WEOLC 029D 21BA06 LXI H,KWTAB+25*10 ;PRINT 'REMESC ' 02A0 CD030C CALL W8CC 02A3 3A1F1F LDA REMESC ;PRINT REMOTE ESCAPE CODE 02A6 CD0414 CALL WHBC 02A9 3E48 MVI A,'H' 02AB CD5A14 CALL WACC 02AE CD4614 CALL WEOLC 02B1 CD4614 CALL WEOLC 02B4 AF XRA A ;REDIRECT CONSOLE OUTPUT TO CONSOLE 02B5 32A91D STA COF 02B8 C30A03 JMP CLINK5 ;JUMP INTO MAIN LOOP 02BB DB81 CLINKB: IN MSTAT ;CHECK FOR CARRIER 02BD E640 ANI CD 02BF CACB02 JZ CLINK8 ;JUMP IF NOT PRESENT 02C2 21E315 LXI H,MSG9 ;PRINT 'CARRIER PRESENT, LINK RESUMED' 02C5 CD1E14 CALL WASC 02C8 C30A03 JMP CLINK5 02CB 0680 CLINK8: MVI B,OH ;GO OFF HOOK 02CD CD2115 CALL CR2ON 02D0 0628 MVI B,40 ;DELAY FOR 2 SECONDS 02D2 CDEA14 CALL WAIT50 02D5 05 DCR B 02D6 C2D202 JNZ $-4 02D9 CD6204 CALL DIAL ;DIAL NUMBER, IF PRESENT 02DC 015802 LXI B,600 ;SETUP FOR 30 SECOND TIMEOUT 02DF DB81 CLINK3: IN MSTAT ;READ MODEM STATUS PORT 02E1 E640 ANI CD ;BRANCH ON CARRIER DETECT 02E3 C2FD02 JNZ CLINK4 02E6 CDEA14 CALL WAIT50 ;PAUSE FOR 50 MS 02E9 0B DCX B ;DECREMENT TIMEOUT COUNT 02EA 78 MOV A,B ;LOOP UNTIL ZERO 02EB B1 ORA C 02EC C2DF02 JNZ CLINK3 02EF 217515 LXI H,MSG3 ;PRINT 'NO CARRIER DETECTED' 02F2 CD1E14 CALL WASC 02F5 0682 MVI B,OH+TXE ;DISCONNECT 02F7 CD2D15 CALL CR2OFF 02FA C35604 JMP CLINKX ;EXIT 02FD 0602 CLINK4: MVI B,TXE ;TURN ON OUTGOING CARRIER 02FF CD2115 CALL CR2ON 0302 3E07 MVI A,BEL ;RING BELL ON CONSOLE 0304 CD5A14 CALL WACC 0307 CD4614 CALL WEOLC ;WRITE END OF LINE TO CONSOLE 030A CDA313 CLINK5: CALL CCA ;CHECK FOR CONSOLE ACTIVITY 030D D28103 JNC CLINK6 ;JUMP IF NONE 0310 32AC1D STA CCHAR 0313 3A261F LDA BREAK ;IF 'BREAK' TRIGGER, SEND BREAK 0316 B7 ORA A 0317 CA2703 JZ CLINKE 031A 21AC1D LXI H,CCHAR 031D BE CMP M 031E C22703 JNZ CLINKE 0321 CD4205 CALL SBRK 0324 C38103 JMP CLINK6 0327 3A1E1F CLINKE: LDA ESCAPE ;JUMP IF NO ESCAPE CODE 032A B7 ORA A 032B CA5003 JZ CLINKC 032E 21AC1D LXI H,CCHAR 0331 BE CMP M 0332 C25003 JNZ CLINKC 0335 210B16 LXI H,MSG10 ;PRINT LOCAL PROMPT 0338 CD1E14 CALL WASC 033B CD7413 CALL RASC ;READ STRING FROM CONSOLE 033E CD4614 CALL WEOLC 0341 CD5805 CALL PCD ;PROCESS DIRECTIVE 0344 D28103 JNC CLINK6 ;JUMP IF OK 0347 216315 LXI H,MSG2 ;PRINT 'DIRECTIVE ERROR' 034A CD1E14 CALL WASC 034D C38103 JMP CLINK6 ;CONTINUE 0350 3A1D1F CLINKC: LDA CAPS ;CONVERT LOWER CASE IF CAPS LOCK ON 0353 B7 ORA A 0354 3AAC1D LDA CCHAR 0357 C43C15 CNZ CLC 035A D380 OUT MDATA ;WRITE CHAR TO MODEM 035C 3A1B1F LDA ECHO ;JUMP IF FULL DUPLEX 035F B7 ORA A 0360 CA6903 JZ CLINKI 0363 3AAC1D LDA CCHAR ;ECHO CHARACTER TO CONSOLE 0366 CD5A14 CALL WACC 0369 3A1A1F CLINKI: LDA MODE ;JUMP IF ORIGINATE MODE 036C FE4F CPI 'O' 036E CA8103 JZ CLINK6 0371 3AAC1D LDA CCHAR 0374 FE0D CPI CR ;JUMP IF CHAR. NOT CR 0376 C28103 JNZ CLINK6 0379 3E0A MVI A,LF ;SEND A LINE FEED 037B CDC414 CALL WACM 037E CD5A14 CALL WACC 0381 DB81 CLINK6: IN MSTAT ;CHECK FOR MODEM RDA 0383 E601 ANI RRF 0385 CA3904 JZ CLINK7 ;JUMP IF NONE 0388 DB80 IN MDATA ;READ CHARACTER 038A 32AD1D STA MCHAR 038D 3A1A1F LDA MODE ;JUMP IF WE'RE NOT IN ANSWER MODE 0390 FE41 CPI 'A' 0392 C2C803 JNZ CLINKL 0395 3A1F1F LDA REMESC 0398 B7 ORA A 0399 CAC803 JZ CLINKL 039C 21AD1D LXI H,MCHAR 039F BE CMP M 03A0 C2C803 JNZ CLINKL 03A3 3E01 MVI A,1 ;REDIRECT CONSOLE OUTPUT TO MODEM 03A5 32A91D STA COF 03A8 210B16 LXI H,MSG10 ;PRINT LOCAL PROMPT 03AB CD1E14 CALL WASC 03AE CD0D13 CALL RASM ;READ RESPONSE INTO IBUF 03B1 CD4614 CALL WEOLC 03B4 CD5805 CALL PCD ;PROCESS DIRECTIVE 03B7 D2C003 JNC CLINKK ;JUMP IF OK 03BA 216315 LXI H,MSG2 ;PRINT 'DIRECTIVE ERROR' 03BD CD1E14 CALL WASC 03C0 3E00 CLINKK: MVI A,0 ;REDIRECT CONSOLE OUTPUT TO CONSOLE 03C2 32A91D STA COF 03C5 C30A03 JMP CLINK5 ;DO NOT ECHO REMESC CHAR 03C8 3AAD1D CLINKL: LDA MCHAR ;RESTORE MODEM CHAR 03CB CDBC04 CALL CAPT ;CAPTURE DATA IF FLAG SET 03CE CD0305 CALL ERRCK ;CHECK FOR ERRORS 03D1 3A1A1F LDA MODE ;JUMP IF ORIGINATE MODE 03D4 FE4F CPI 'O' 03D6 CAF103 JZ CLINKJ 03D9 3AAD1D LDA MCHAR 03DC CDC414 CALL WACM ;ECHO CHARACTER TO REMOTE USER 03DF E67F ANI 7FH 03E1 FE0D CPI CR ;JUMP IF NOT CARRIAGE RETURN 03E3 C2F103 JNZ CLINKJ 03E6 3E0A MVI A,LF ;WRITE LINE FEED TO REMOTE USER 03E8 CDC414 CALL WACM 03EB CD5A14 CALL WACC ;ECHO TO LOCAL TERMINAL TOO 03EE CDBC04 CALL CAPT ;CAPTURE GENERATED LINE FEED 03F1 3A201F CLINKJ: LDA DEBUG ;JUMP IF DEBUG NOT ON 03F4 B7 ORA A 03F5 CA1904 JZ CLINKD 03F8 3AAD1D LDA MCHAR 03FB CD0414 CALL WHBC ;WRITE BYTE TO CONSOLE IN HEX 03FE 3E20 MVI A,' ' ;PRINT ONE SPACE 0400 CD5A14 CALL WACC 0403 3A211F LDA DEBUGC ;INCREMENT DEBUG COUNT 0406 3C INR A 0407 32211F STA DEBUGC 040A FE10 CPI 16 ;CONTINUE IF DEBUGC < 16 040C DA3904 JC CLINK7 040F AF XRA A ;RESET DEBUGC 0410 32211F STA DEBUGC 0413 CD4614 CALL WEOLC ;WRITE END OF LINE TO CONSOLE 0416 C33904 JMP CLINK7 ;CONTINUE 0419 3A1D1F CLINKD: LDA CAPS ;CONVERT LOWER CASE IF CAPS LOCK ON 041C B7 ORA A 041D 3AAD1D LDA MCHAR 0420 C43C15 CNZ CLC 0423 CD5A14 CALL WACC ;WRITE TO CONSOLE 0426 E67F ANI 7FH ;JUMP IF NOT CARRAIGE RETURN 0428 FE0D CPI CR 042A C23904 JNZ CLINK7 042D 3A1C1F LDA AUTOLF ;JUMP IF AUTOLF NOT SET 0430 B7 ORA A 0431 CA3904 JZ CLINK7 0434 3E0A MVI A,LF ;WRITE LINEFEED TO CONSOLE 0436 CD5A14 CALL WACC 0439 DB81 CLINK7: IN MSTAT ;CHECK INCOMING CARRIER 043B E640 ANI CD 043D C20A03 JNZ CLINK5 ;LOOP IF STILL PRESENT 0440 CD4614 CALL WEOLC 0443 218B15 LXI H,MSG4 ;PRINT 'CARRIER LOST' 0446 CD1E14 CALL WASC 0449 0682 EXIT: MVI B,OH+TXE ;... ELSE DISCONNECT 044B CD2D15 CALL CR2OFF 044E 3A1A1F LDA MODE ;IF MODE = ANSWER, 0451 FE41 CPI 'A' 0453 CA3902 JZ CLINK9 ;... THEN GO BACK TO IDLE STATE 0456 3AA81D CLINKX: LDA CCPF ;IF CCP OVERWRITE FLAG SET... 0459 B7 ORA A 045A C20000 JNZ 0000H ;... THEN RELOAD CP/M 045D 2A241D LHLD OLDSP ;ELSE JUST JUMP BACK INTO CCP 0460 F9 SPHL 0461 C9 RET ;RETURN TO CP/M ;; DIAL - DIAL SPECIFIED PHONE NUMBER ; ; ENTRY CONDITIONS ; ; PHONEL LENGTH OF PHONE NUMBER STRING ; ; PHONE PHONE NUMBER STRING 0462 3A051F DIAL: LDA PHONEL ;RETURN IF STRING EMPTY 0465 B7 ORA A 0466 C8 RZ 0467 219A15 LXI H,MSG5 ;PRINT 'NOW DIALING ' 046A CD1E14 CALL WASC 046D 21061F LXI H,PHONE ;POINT TO PHONE NUMBER STRING 0470 3A051F LDA PHONEL 0473 4F MOV C,A 0474 7E DIAL1: MOV A,M ;FETCH NEXT CHARACTER OF NUMBER 0475 23 INX H 0476 CD5A14 CALL WACC ;WRITE DIGIT TO CONSOLE 0479 FE2A CPI '*' ;JUMP IF NOT ASTERISK 047B C28704 JNZ DIAL2 047E 0614 MVI B,20 ;PAUSE FOR 1 SECOND 0480 CDEA14 CALL WAIT50 0483 05 DCR B 0484 C28004 JNZ $-4 0487 D630 DIAL2: SUI '0' ;CONVERT, IGNORE NON-NUMERICS 0489 DAB404 JC DIAL4 048C FE0A CPI 10 048E D2B404 JNC DIAL4 0491 B7 ORA A ;JUMP IF NON-ZERO DIGIT 0492 C29704 JNZ DIAL3 0495 3E0A MVI A,10 ;'0' REQUIRES 10 CLICKS 0497 0680 DIAL3: MVI B,OH ;GO BACK ON-HOOK 0499 CD2D15 CALL CR2OFF 049C CDEA14 CALL WAIT50 ;PAUSE 50 MS 049F 0680 MVI B,OH ;GO OFF-HOOK AGAIN 04A1 CD2115 CALL CR2ON 04A4 CDEA14 CALL WAIT50 ;PAUSE 50 MS 04A7 3D DCR A ;DECREMENT CLICK COUNT 04A8 C29704 JNZ DIAL3 ;LOOP UNTIL ZERO 04AB 060A MVI B,10 ;PAUSE FOR 500 MS 04AD CDEA14 CALL WAIT50 04B0 05 DCR B 04B1 C2AD04 JNZ $-4 04B4 0D DIAL4: DCR C ;DECREMENT DIGIT COUNT 04B5 C27404 JNZ DIAL1 ;LOOP UNTIL ZERO 04B8 CD4614 CALL WEOLC ;WRITE END OF LINE TO CONSOLE 04BB C9 RET ;EXIT ;; CAPT - CAPTURE DATA IF FLAG SET ; 04BC B7 CAPT: ORA A ;DO NOT CAPTURE NULLS 04BD C8 RZ 04BE E5 PUSH H 04BF F5 PUSH PSW 04C0 3A251F LDA CAPTURE ;EXIT IF FLAG NOT SET 04C3 B7 ORA A 04C4 CA0005 JZ CAPT1 04C7 F1 POP PSW 04C8 F5 PUSH PSW 04C9 2AD41F LHLD MBUFP ;HL = MEMORY BUFFER POINTER 04CC 77 MOV M,A ;SAVE BYTE IN MEMORY BUFFER 04CD 23 INX H ;INCREMENT POINTER 04CE 22D41F SHLD MBUFP 04D1 2F CMA 04D2 D3FF OUT 0FFH 04D4 2F CMA 04D5 3AD91F LDA CCPADR+1 ;JUMP IF MBUFP < CCPADR 04D8 BC CMP H 04D9 D20005 JNC CAPT1 04DC 3AD81F LDA CCPADR 04DF BD CMP L 04E0 D20005 JNC CAPT1 04E3 3E01 MVI A,1 ;SET 'CCP OVERWRITE' FLAG 04E5 32A81D STA CCPF 04E8 3AD71F LDA MAXADR+1 ;RETURN IF MBUFP < MAXADR 04EB BC CMP H 04EC D20005 JNC CAPT1 04EF 3AD61F LDA MAXADR 04F2 BD CMP L 04F3 D20005 JNC CAPT1 04F6 21B916 LXI H,MSG19 ;PRINT 'MEMORY OVERFLOW' 04F9 CD1E14 CALL WASC 04FC AF XRA A ;TURN OFF CAPTURE FLAG 04FD 32251F STA CAPTURE 0500 F1 CAPT1: POP PSW 0501 E1 POP H 0502 C9 RET ;; ERRCK - ERROR CHECK ; 0503 E5 ERRCK: PUSH H 0504 F5 PUSH PSW 0505 DB81 IN MSTAT ;CHECK FOR PARITY ERROR 0507 E604 ANI PE 0509 CA1605 JZ ERRCK1 ;JUMP IF NOT PRESENT 050C 2A281F LHLD PERR ;INCREMENT PARITY ERROR COUNT 050F 23 INX H 0510 22281F SHLD PERR 0513 C33505 JMP ERRCK4 0516 DB81 ERRCK1: IN MSTAT ;JUMP IF NO OVERRUN ERROR 0518 E610 ANI OE 051A CA2705 JZ ERRCK2 051D 2A2A1F LHLD OERR ;INCREMENT OVERRUN ERROR COUNT 0520 23 INX H 0521 222A1F SHLD OERR 0524 C33505 JMP ERRCK4 0527 DB81 ERRCK2: IN MSTAT ;JUMP IF NO FRAME ERROR 0529 E608 ANI FE 052B CA3F05 JZ ERRCK5 052E 2A2C1F LHLD FERR ;INCREMENT FRAME ERROR COUNT 0531 23 INX H 0532 222C1F SHLD FERR 0535 3A221F ERRCK4: LDA ERROR ;CHECK ERROR CODE 0538 B7 ORA A 0539 CA3F05 JZ ERRCK5 ;JUMP IF 00H 053C E1 POP H ;DISCARD TOP OF STACK (PSW/A) 053D E1 POP H ;RESTORE REAL HL 053E C9 RET 053F F1 ERRCK5: POP PSW ;RESTORE CHARACTER 0540 E1 POP H ;RESTORE HL 0541 C9 RET ;; SBRK - SEND BREAK ; 0542 C5 SBRK: PUSH B 0543 0608 MVI B,BK ;OPEN LINE 0545 CD2115 CALL CR2ON 0548 0603 MVI B,3 ;WAIT 150 MS 054A CDEA14 SBRK1: CALL WAIT50 054D 05 DCR B 054E C24A05 JNZ SBRK1 0551 0608 MVI B,BK ;CLOSE LINE 0553 CD2D15 CALL CR2OFF 0556 C1 POP B 0557 C9 RET ;; PCD - PROCESS CONFIGURATION DIRECTIVE ; ; ENTRY CONDITIONS ; ; IBUFC NUMBER OF BYTES IN INPUT BUFFER ; ; IBUFP POINTER TO NEXT BYTE IN INPUT BUFFER ; ; EXIT CONDITIONS ; ; C-FLAG SET IF ERROR 0558 2A301F PCD: LHLD IBUFP ;CONVERT IBUF TO ALL UPPER CASE 055B 3A331F LDA IBUFC 055E 47 MOV B,A 055F 7E PCD0: MOV A,M 0560 CD3C15 CALL CLC 0563 77 MOV M,A 0564 23 INX H 0565 05 DCR B 0566 C25F05 JNZ PCD0 0569 21CA1F LXI H,KWBUF ;BLANK FILL KEYWORD BUFFER 056C 0608 MVI B,8 056E 3620 PCD1: MVI M,' ' 0570 23 INX H 0571 05 DCR B 0572 C26E05 JNZ PCD1 0575 21CA1F LXI H,KWBUF 0578 0608 MVI B,8 057A CD8913 PCD2: CALL GNC ;GET NEXT CHAR FROM IBUF 057D DA9305 JC PCD3 ;BRANCH ON END OF LINE 0580 FE20 CPI ' ' ;BRANCH ON BLANK 0582 CA9305 JZ PCD3 0585 FE09 CPI TAB ;BRANCH ON TAB 0587 CA9305 JZ PCD3 058A 77 MOV M,A ;STORE BYTE IN KWBUF 058B 23 INX H 058C 05 DCR B ;DECREMENT COUNT 058D F27A05 JP PCD2 ;LOOP IF STILL ROOM 0590 C3BB05 JMP PCDX1 ;FLAG ERROR AND EXIT 0593 21C005 PCD3: LXI H,KWTAB ;POINT TO KEYWORD TABLE 0596 11CA1F PCD4: LXI D,KWBUF ;POINT TO KEYWORD 0599 0608 MVI B,8 ;NUMBER OF BYTES TO COMPARE 059B 0E00 MVI C,0 ;START WITH NO DISCREPANCY 059D 1A PCD5: LDAX D ;FETCH NEXT BYTE OF KWBUF 059E AE XRA M ;LOG. DIFF. WITH BYTE FROM TABLE 059F B1 ORA C ;ACCUMULATE DISCREPANCY 05A0 4F MOV C,A 05A1 13 INX D ;INCREMENT POINTERS 05A2 23 INX H 05A3 05 DCR B ;DECREMENT COUNT 05A4 C29D05 JNZ PCD5 ;LOOP UNTIL ZERO 05A7 0C INR C ;JUMP IF NO DISCREPANCY 05A8 0D DCR C 05A9 CAB605 JZ PCD6 05AC 23 INX H ;SKIP ADDRESS FIELD 05AD 23 INX H 05AE 7E MOV A,M ;LOOP IF NOT END OF TABLE 05AF B7 ORA A 05B0 C29605 JNZ PCD4 05B3 C3BB05 JMP PCDX1 ;FLAG ERROR AND EXIT 05B6 5E PCD6: MOV E,M ;FETCH ADDRESS INTO DE 05B7 23 INX H 05B8 56 MOV D,M 05B9 EB XCHG ;SWAP ADDRESS INTO HL 05BA E9 PCHL ;AND AWAY WE GO! 05BB 37 PCDX1: STC ;ERROR EXIT 05BC C9 RET 05BD 37 PCDX2: STC ;NORMAL EXIT 05BE 3F CMC 05BF C9 RET 05C0 5349544520KWTAB: DB 'SITE ' 05C8 ED06 DW PCDA 05CA 50484F4E45 DB 'PHONE ' 05D2 1207 DW PCDB 05D4 5041524954 DB 'PARITY ' 05DC 3707 DW PCDC 05DE 4442495453 DB 'DBITS ' 05E6 6707 DW PCDD 05E8 5342495453 DB 'SBITS ' 05F0 8A07 DW PCDE 05F2 4D4F444520 DB 'MODE ' 05FA A807 DW PCDF 05FC 4455504C45 DB 'DUPLEX ' 0604 D107 DW PCDG 0606 4155544F4C DB 'AUTOLF ' 060E EE07 DW PCDH 0610 4241554420 DB 'BAUD ' 0618 1408 DW PCDI 061A 4341505320 DB 'CAPS ' 0622 3208 DW PCDJ 0624 4553434150 DB 'ESCAPE ' 062C 5808 DW PCDK 062E 41424F5254 DB 'ABORT ' 0636 7408 DW PCDL 0638 5245545552 DB 'RETURN ' 0640 7D08 DW PCDM 0642 4445425547 DB 'DEBUG ' 064A 8608 DW PCDN 064C 4552524F52 DB 'ERROR ' 0654 B008 DW PCDO 0656 5245414420 DB 'READ ' 065E F808 DW PCDP 0660 4741524241 DB 'GARBAGE ' 0668 1B0A DW PCDQ 066A 4C49535420 DB 'LIST ' 0672 3C0A DW PCDR 0674 455850414E DB 'EXPAND ' 067C DD0B DW PCDS 067E 4341505455 DB 'CAPTURE ' 0686 200C DW PCDT 0688 5752495445 DB 'WRITE ' 0690 2E0C DW PCDU 0692 425245414B DB 'BREAK ' 069A A60C DW PCDV 069C 5341564520 DB 'SAVE ' 06A4 C20C DW PCDW 06A6 5245534554 DB 'RESET ' 06AE 000D DW PCDX 06B0 48454C5020 DB 'HELP ' 06B8 0F0D DW PCDY 06BA 52454D4553 DB 'REMESC ' 06C2 4B0D DW PCDZ 06C4 4449522020 DB 'DIR ' 06CC 670D DW PCEA 06CE 53454E4420 DB 'SEND ' 06D6 E10D DW PCEB 06D8 5245435620 DB 'RECV ' 06E0 CE0E DW PCEC 06E2 424C4F434B DB 'BLOCK ' 06EA 8B0F DW PCED 06EC 00 DB 0 ; PCDA - PROCESS 'SITE' DIRECTIVE 06ED AF PCDA: XRA A 06EE 32B41E STA SITEL 06F1 CDD210 CALL SNB ;SCAN TO PARAMETER 06F4 DABD05 JC PCDX2 ;EXIT IF NO PARAMETER 06F7 21B51E LXI H,SITE ;POINT TO 'SITE' BUFFER 06FA 063C MVI B,60 ;MAX LENGTH 06FC 77 PCDA1: MOV M,A ;STORE CHAR IN 'SITE' BUFFER 06FD 23 INX H 06FE 3AB41E LDA SITEL ;INCREMENT 'SITE' LENGTH 0701 3C INR A 0702 32B41E STA SITEL 0705 CD8913 CALL GNC ;GET NEXT CHARACTER 0708 DABD05 JC PCDX2 ;BRANCH ON END OF LINE 070B 05 DCR B ;DECREMENT COUNT 070C F2FC06 JP PCDA1 ;LOOP IF STILL ROOM 070F C3BB05 JMP PCDX1 ; PCDB - PROCESS 'PHONE' DIRECTIVE 0712 AF PCDB: XRA A 0713 32051F STA PHONEL 0716 CDD210 CALL SNB ;SCAN TO PARAMETER 0719 DABD05 JC PCDX2 ;EXIT IF NO PARAMETER 071C 21061F LXI H,PHONE ;POINT TO 'PHONE' BUFFER 071F 0614 MVI B,20 ;MAX SIZE 0721 77 PCDB1: MOV M,A ;STORE CHAR IN 'PHONE' BUFFER 0722 23 INX H 0723 3A051F LDA PHONEL ;INCREMENT 'PHONE' LENGTH 0726 3C INR A 0727 32051F STA PHONEL 072A CD8913 CALL GNC ;GET NEXT CHAR 072D DABD05 JC PCDX2 ;BRANCH ON END OF LINE 0730 05 DCR B ;DECREMENT COUNT 0731 F22107 JP PCDB1 ;LOOP IF STILL ROOM 0734 C3BB05 JMP PCDX1 ; PCDC - PROCESS 'PARITY' DIRECTIVE 0737 CDD210 PCDC: CALL SNB ;SKIP TO PARAMETER 073A D8 RC 073B FE45 CPI 'E' ;JUMP IF NOT 'EVEN' 073D C24D07 JNZ PCDC1 0740 0601 MVI B,EPE ;ENABLE EVEN PARITY 0742 CD0615 CALL CR1ON 0745 0610 MVI B,PI 0747 CD1215 CALL CR1OFF 074A C3BD05 JMP PCDX2 ;EXIT 074D FE4F PCDC1: CPI 'O' ;JUMP IF NOT 'ODD' 074F C25A07 JNZ PCDC2 0752 0611 MVI B,EPE+PI ;ENABLE ODD PARITY 0754 CD1215 CALL CR1OFF 0757 C3BD05 JMP PCDX2 075A FE4E PCDC2: CPI 'N' ;JUMP IF NOT 'NONE' 075C C2BB05 JNZ PCDX1 075F 0610 MVI B,PI ;INHIBIT PARITY 0761 CD0615 CALL CR1ON 0764 C3BD05 JMP PCDX2 ; PCDD - PROCESS 'DBITS' DIRECTIVE 0767 CDD210 PCDD: CALL SNB ;SCAN TO PARAMETER 076A D8 RC 076B FE37 CPI '7' ;JUMP IF NOT '7' 076D C27D07 JNZ PCDD1 0770 0604 MVI B,LS2 ;SELECT 7 DATA BITS 0772 CD0615 CALL CR1ON 0775 0602 MVI B,LS1 0777 CD1215 CALL CR1OFF 077A C3BD05 JMP PCDX2 077D FE38 PCDD1: CPI '8' ;JUMP IF NOT '8' 077F C2BB05 JNZ PCDX1 0782 0606 MVI B,LS2+LS1 ;SELECT 8 DATA BITS 0784 CD0615 CALL CR1ON 0787 C3BD05 JMP PCDX2 ; PCDE - PROCESS 'SBITS' DIRECTIVE 078A CDD210 PCDE: CALL SNB ;SCAN TO PARAMETER 078D D8 RC 078E FE31 CPI '1' ;JUMP IF NOT '1' 0790 C29B07 JNZ PCDE1 0793 0608 MVI B,SBS ;SELECT 1 STOP BIT 0795 CD1215 CALL CR1OFF 0798 C3BD05 JMP PCDX2 079B FE32 PCDE1: CPI '2' ;JUMP IF NOT '2' 079D C2BB05 JNZ PCDX1 07A0 0608 MVI B,SBS ;SELECT 2 STOP BITS 07A2 CD0615 CALL CR1ON 07A5 C3BD05 JMP PCDX2 ; PCDF - PROCESS 'MODE' DIRECTIVE 07A8 CDD210 PCDF: CALL SNB ;SCAN TO PARAMETER 07AB D8 RC 07AC CD3C15 CALL CLC 07AF 321A1F STA MODE 07B2 FE4F CPI 'O' ;JUMP IF NOT 'ORIGINATE' 07B4 C2BF07 JNZ PCDF1 07B7 0604 MVI B,MS ;SELECT ORIGINATE MODE 07B9 CD2115 CALL CR2ON 07BC C3BD05 JMP PCDX2 07BF FE41 PCDF1: CPI 'A' ;JUMP IF NOT 'ANSWER' 07C1 C22802 JNZ MODERR 07C4 0604 MVI B,MS ;SELECT ANSWER MODE 07C6 CD2D15 CALL CR2OFF 07C9 3E01 MVI A,1 ;FORCE HALF DUPLEX 07CB 321B1F STA ECHO 07CE C3BD05 JMP PCDX2 ; PCDG - PROCESS 'DUPLEX' DIRECTIVE 07D1 CDD210 PCDG: CALL SNB ;SCAN TO PARAMETER 07D4 D8 RC 07D5 FE46 CPI 'F' ;JUMP IF NOT 'FULL' 07D7 C2E107 JNZ PCDG1 07DA AF XRA A ;CLEAR ECHO FLAG 07DB 321B1F STA ECHO 07DE C3BD05 JMP PCDX2 07E1 FE48 PCDG1: CPI 'H' ;JUMP IF NOT 'HALF' 07E3 C2BB05 JNZ PCDX1 07E6 3E01 MVI A,1 ;SET ECHO FLAG 07E8 321B1F STA ECHO 07EB C3BD05 JMP PCDX2 ; PCDH - PROCESS 'AUTOLF' DIRECTIVE 07EE CDD210 PCDH: CALL SNB ;SCAN TO PARAMETER 07F1 D8 RC 07F2 FE4F CPI 'O' ;ERROR IF 1ST CHAR NOT 'O' 07F4 C2BB05 JNZ PCDX1 07F7 CD8913 CALL GNC ;GET 2ND CHAR 07FA D8 RC 07FB FE4E CPI 'N' ;JUMP IF NOT 'ON' 07FD C20808 JNZ PCDH1 0800 3E01 MVI A,1 ;SET AUTOLF FLAG 0802 321C1F STA AUTOLF 0805 C3BD05 JMP PCDX2 0808 FE46 PCDH1: CPI 'F' ;JUMP IF NOT 'OFF' 080A C2BB05 JNZ PCDX1 080D AF XRA A ;CLEAR AUTOLF FLAG 080E 321C1F STA AUTOLF 0811 C3BD05 JMP PCDX2 ; PCDI - PROCESS 'BAUD' DIRECTIVE 0814 CDD210 PCDI: CALL SNB ;SCAN TO PARAMETER 0817 D8 RC 0818 FE31 CPI '1' ;JUMP IF NOT '110' 081A C22508 JNZ PCDI1 081D 0601 MVI B,BRS ;SELECT 110 BAUD 081F CD2D15 CALL CR2OFF 0822 C3BD05 JMP PCDX2 0825 FE33 PCDI1: CPI '3' ;JUMP IF NOT '300' 0827 C2BB05 JNZ PCDX1 082A 0601 MVI B,BRS ;SELECT 300 BAUD 082C CD2115 CALL CR2ON 082F C3BD05 JMP PCDX2 ; PCDJ - PROCESS 'CAPS' DIRECTIVE 0832 CDD210 PCDJ: CALL SNB ;SCAN TO PARAMETER 0835 D8 RC 0836 FE4F CPI 'O' ;ERROR IF 1ST CHAR NOT 'O' 0838 C2BB05 JNZ PCDX1 083B CD8913 CALL GNC ;GET 2ND CHAR 083E D8 RC 083F FE4E CPI 'N' ;JUMP IF NOT 'ON' 0841 C24C08 JNZ PCDJ1 0844 3E01 MVI A,1 ;TURN ON CAPS LOCK 0846 321D1F STA CAPS 0849 C3BD05 JMP PCDX2 084C FE46 PCDJ1: CPI 'F' ;JUMP IF NOT 'OFF' 084E C2BB05 JNZ PCDX1 0851 AF XRA A ;TURN OFF CAPS LOCK 0852 321D1F STA CAPS 0855 C3BD05 JMP PCDX2 ; PCDK - PROCESS 'ESCAPE' PARAMETER 0858 CDD210 PCDK: CALL SNB ;SCAN TO PARAMETER 085B D8 RC 085C CDE310 CALL DHD ;DECODE FIRST HEX DIGIT 085F D8 RC 0860 87 ADD A ;LEFT SHIFT 4 (X 16) 0861 87 ADD A 0862 87 ADD A 0863 87 ADD A 0864 47 MOV B,A ;SAVE IT 0865 CD8913 CALL GNC ;DECODE SECIND HEX DIGIT 0868 D8 RC 0869 CDE310 CALL DHD 086C D8 RC 086D 80 ADD B ;ADD TO SHIFTED 1ST DIGIT 086E 321E1F STA ESCAPE ;SAVE IT AS NEW ESCAPE CODE 0871 C3BD05 JMP PCDX2 ;NORMAL EXIT ; PCDL - PROCESS 'ABORT' DIRECTIVE 0874 21A715 PCDL: LXI H,MSG7 ;PRINT 'LINK TERMINATED' 0877 CD1E14 CALL WASC 087A C34904 JMP EXIT ; PCDM - PROCESS 'RETURN' DIRECTIVE 087D 21B915 PCDM: LXI H,MSG8 ;PRINT 'LINK INTERUPPTED' 0880 CD1E14 CALL WASC 0883 C35604 JMP CLINKX ; PCDN - PROCESS 'DEBUG' DIRECTIVE 0886 CDD210 PCDN: CALL SNB ;SCAN TO PARAMETER 0889 D8 RC 088A FE4F CPI 'O' ;ERROR IF FIRST CHAR NOT 'O' 088C C2BB05 JNZ PCDX1 088F CD8913 CALL GNC ;GET NEXT CHAR 0892 D8 RC 0893 FE4E CPI 'N' ;JUMP IF NOT 'ON' 0895 C2A408 JNZ PCDN1 0898 3E01 MVI A,1 ;TURN ON DEBUG MODE 089A 32201F STA DEBUG 089D AF XRA A ;CLEAR DEBUG COUNT 089E 32211F STA DEBUGC 08A1 C3BD05 JMP PCDX2 08A4 FE46 PCDN1: CPI 'F' ;JUMP IF NOT 'OFF' 08A6 C2BB05 JNZ PCDX1 08A9 AF XRA A ;TURN OFF DEBUG MODE 08AA 32201F STA DEBUG 08AD C3BD05 JMP PCDX2 ; PCDO - PROCESS 'ERROR' DIRECTIVE 08B0 CDD210 PCDO: CALL SNB ;SCAN TO PARAMETER 08B3 D8 RC 08B4 FE53 CPI 'S' ;JUMP IF NOT 'SUMMARY' 08B6 C2E008 JNZ PCDO1 08B9 2A281F LHLD PERR ;PRINT PARITY ERROR COUNT 08BC CDB513 CALL WDWC 08BF 211616 LXI H,MSG11 ;PRINT ' PARITY ERRORS' 08C2 CD1E14 CALL WASC 08C5 2A2A1F LHLD OERR ;PRINT OVERRUN COUNT 08C8 CDB513 CALL WDWC 08CB 212716 LXI H,MSG12 ;PRINT ' OVERRUN ERRORS' 08CE CD1E14 CALL WASC 08D1 2A2C1F LHLD FERR ;PRINT FRAME ERROR COUNT 08D4 CDB513 CALL WDWC 08D7 213916 LXI H,MSG13 ;PRINT ' FRAME ERRORS' 08DA CD1E14 CALL WASC 08DD C3BD05 JMP PCDX2 ;EXIT 08E0 CDE310 PCDO1: CALL DHD ;DECODE 1ST HEX DIGIT 08E3 D8 RC 08E4 87 ADD A ;LEFT SHIFT 4 08E5 87 ADD A 08E6 87 ADD A 08E7 87 ADD A 08E8 47 MOV B,A ;SAVE IT 08E9 CD8913 CALL GNC ;GET 2ND DIGIT 08EC D8 RC 08ED CDE310 CALL DHD ;DECODE 2ND DIGIT 08F0 D8 RC 08F1 80 ADD B ;BUILD COMPLETE BYTE 08F2 32221F STA ERROR ;SAVE AS ERROR CODE 08F5 C3BD05 JMP PCDX2 ;EXIT ; PCDP - PROCESS 'READ' DIRECTIVE 08F8 CD2B11 PCDP: CALL GFN ;GET FILE NAME INTO TFCB 08FB D8 RC 08FC AF XRA A 08FD 326800 STA TFCB+EX 0900 115C00 LXI D,TFCB ;TRY TO OPEN FILE 0903 CDC711 CALL OPEN 0906 FEFF CPI 255 0908 C21409 JNZ PCDP1 090B 215215 LXI H,MSG1 ;PRINT 'FILE NOT FOUND' 090E CD1E14 CALL WASC 0911 C3BD05 JMP PCDX2 ;NORMAL EXIT 0914 AF PCDP1: XRA A 0915 327C00 STA TFCB+NR 0918 32AE1D STA DIBUFC 091B 210000 LXI H,0 ;CLEAR TRANSMISSION ERROR COUNT 091E 222E1F SHLD TERR 0921 CDF711 PCDP2: CALL RASS ;READ NEXT LINE FROM FILE 0924 DAF709 JC PCDP6 ;BRANCH ON EOF 0927 CDA313 CALL CCA ;CHECK FOR CONSOLE ACTIVITY 092A DAF709 JC PCDP6 ;ABORT TRANSMISSION IF PRESENT 092D AF XRA A ;CLEAR COLUMN COUNT FOR TAB EXPANSION 092E 32271F STA COL 0931 CD8913 PCDP3: CALL GNC ;GET NEXT CHAR 0934 DA9D09 JC PCDP4 ;BRANCH ON END OF LINE 0937 47 MOV B,A 0938 3A1D1F LDA CAPS ;CONVERT L.C. IF CAPS LOCK ON 093B B7 ORA A 093C 78 MOV A,B 093D C43C15 CNZ CLC 0940 FE09 CPI TAB ;JUMP IF NOT TAB 0942 C27909 JNZ PCDP3C 0945 3A241F LDA EXPAND ;JUMP IF EXPAND NOT SELECTED 0948 B7 ORA A 0949 3E09 MVI A,TAB 094B CA7909 JZ PCDP3C 094E 3E20 PCDP3A: MVI A,' ' ;SEND ANOTHER BLANK 0950 CDC414 CALL WACM 0953 47 MOV B,A 0954 3A1B1F LDA ECHO ;CHECK DUPLEX FLAG 0957 B7 ORA A 0958 78 MOV A,B 0959 CC9614 CZ RACM ;AWAIT ECHO IF 'FULL' 095C CD8914 CALL XWACC ;WRITE CHAR TO CONSOLE 095F B8 CMP B ;COMPARE WITH CHAR WE SENT 0960 CA6A09 JZ PCDP3B ;JUMP IF IDENTICAL 0963 2A2E1F LHLD TERR ;ELSE INCREMENT TRANS. ERROR COUNT 0966 23 INX H 0967 222E1F SHLD TERR 096A 3A271F PCDP3B: LDA COL ;INCREMENT COLUMN COUNT 096D 3C INR A 096E 32271F STA COL 0971 E607 ANI 07H ;LOOP UNTIL MOD(COL,8)=0 0973 C24E09 JNZ PCDP3A 0976 C33109 JMP PCDP3 ;GO GET NEXT CHAR FROM FILE 0979 CDC414 PCDP3C: CALL WACM ;WRITE CHAR TO MODEM 097C 47 MOV B,A 097D 3A1B1F LDA ECHO ;CHECK DUPLEX FLAG 0980 B7 ORA A 0981 78 MOV A,B 0982 CC9614 CZ RACM ;AWAIT REMOTE ECHO IF 'FULL' 0985 CD8914 CALL XWACC ;WRITE CHAR TO CONSOLE 0988 B8 CMP B ;COMPARE WITH CHAR WE SENT 0989 CA9309 JZ PCDP3D ;JUMP IF IDENTICAL 098C 2A2E1F LHLD TERR ;INCREMENT ERROR COUNT 098F 23 INX H 0990 222E1F SHLD TERR 0993 3A271F PCDP3D: LDA COL ;INCREMENT COLUMN COUNT 0996 3C INR A 0997 32271F STA COL 099A C33109 JMP PCDP3 ;LOOP UNTIL EOF 099D 3E0D PCDP4: MVI A,CR ;SEND CARRIAGE RETURN 099F CDC414 CALL WACM 09A2 47 MOV B,A 09A3 3A1B1F LDA ECHO ;CHECK DUPLEX FLAG 09A6 B7 ORA A 09A7 78 MOV A,B 09A8 CC9614 CZ RACM ;AWAIT REMOTE ECHO IF 'FULL' 09AB CD8914 CALL XWACC ;WRITE CHAR TO CONSOLE 09AE B8 CMP B ;COMPARE WITH CHAR WE SENT 09AF CAB909 JZ PCDP9 ;JUMP IF IDENTICAL 09B2 2A2E1F LHLD TERR ;ELSE INCREMENT ERROR COUNT 09B5 23 INX H 09B6 222E1F SHLD TERR 09B9 3A1A1F PCDP9: LDA MODE ;JUMP IF ORIGINATE MODE 09BC FE4F CPI 'O' 09BE CACC09 JZ PCDP5 09C1 3E0A MVI A,LF 09C3 CDC414 CALL WACM ;SEND LF TO MODEM 09C6 CD8914 CALL XWACC ;SEND LF TO CONSOLE 09C9 C32109 JMP PCDP2 ;LOOP UNTIL EOF 09CC CD9614 PCDP5: CALL RACM ;AWAIT REMOTE LINE FEED 09CF E67F ANI 7FH 09D1 FE0A CPI LF 09D3 C2CC09 JNZ PCDP5 09D6 CD8914 CALL XWACC ;ECHO LF TO CONSOLE 09D9 21F401 LXI H,500 ;SETUP FOR HALF-SECOND TIMEOUT 09DC 22E61F SHLD TIME 09DF 3A231F LDA GARBAGE ;GET GARBAGE COUNT 09E2 47 MOV B,A 09E3 04 INR B 09E4 05 PCDP8: DCR B ;DECREMENT COUNT 09E5 CAEE09 JZ PCDP7 ;JUMP WHEN ZERO 09E8 CD9614 CALL RACM ;DISCARD ANOTHER CHAR 09EB C3E409 JMP PCDP8 ;LOOP UNTIL COUNT = 0 09EE 21FFFF PCDP7: LXI H,0FFFFH ;RESET TO INF. TIMEOUT 09F1 22E61F SHLD TIME 09F4 C32109 JMP PCDP2 ;LOOP UNTIL EOF 09F7 115C00 PCDP6: LXI D,TFCB ;CLOSE FILE 09FA CDD311 CALL CLOSE 09FD 3E07 MVI A,BEL ;RING BELL 09FF CD5A14 CALL WACC 0A02 CD4614 CALL WEOLC ;RETURN CARRIAGE 0A05 3A1B1F LDA ECHO ;RETURN IF HALF DUPLEX 0A08 B7 ORA A 0A09 C2BD05 JNZ PCDX2 0A0C 2A2E1F LHLD TERR ;PRINT TRANS. ERROR COUNT 0A0F CDB513 CALL WDWC 0A12 217216 LXI H,MSG15 ;PRINT ' TRANSMISSION ERRORS' 0A15 CD1E14 CALL WASC 0A18 C3BD05 JMP PCDX2 ;EXIT ; PCDQ - PROCESS 'GARBAGE' DIRECTIVE 0A1B CDD210 PCDQ: CALL SNB ;SCAN TO PARAMETER 0A1E D8 RC 0A1F CDE310 CALL DHD ;DECODE FIRST HEX DIGIT 0A22 D8 RC 0A23 32231F STA GARBAGE 0A26 87 ADD A ;LEFT SHIFT 4 0A27 87 ADD A 0A28 87 ADD A 0A29 87 ADD A 0A2A 47 MOV B,A ;SAVE IT 0A2B CD8913 CALL GNC ;DECODE SECOND HEX DIGIT 0A2E DABD05 JC PCDX2 ;RETURN IF NO SECOND DIGIT 0A31 CDE310 CALL DHD 0A34 D8 RC 0A35 80 ADD B ;ADD TO SHIFTED 1ST DIGIT 0A36 32231F STA GARBAGE ;SAVE AS NEW GARBAGE COUNT 0A39 C3BD05 JMP PCDX2 ; PCDR - PROCESS 'LIST' DIRECTIVE 0A3C 21C005 PCDR: LXI H,KWTAB+0*10 ;PRINT 'SITE ' 0A3F CD030C CALL W8CC 0A42 21B51E LXI H,SITE ;PRINT SITE STRING 0A45 3AB41E LDA SITEL 0A48 47 MOV B,A 0A49 04 INR B 0A4A 05 PCDR1: DCR B 0A4B CA560A JZ PCDR2 0A4E 7E MOV A,M 0A4F 23 INX H 0A50 CD5A14 CALL WACC 0A53 C34A0A JMP PCDR1 0A56 CD4614 PCDR2: CALL WEOLC 0A59 21CA05 LXI H,KWTAB+1*10 ;PRINT 'PHONE ' 0A5C CD030C CALL W8CC 0A5F 21061F LXI H,PHONE ;PRINT PHONE NUMBER 0A62 3A051F LDA PHONEL 0A65 47 MOV B,A 0A66 04 INR B 0A67 05 PCDR3: DCR B 0A68 CA730A JZ PCDR4 0A6B 7E MOV A,M 0A6C 23 INX H 0A6D CD5A14 CALL WACC 0A70 C3670A JMP PCDR3 0A73 CD4614 PCDR4: CALL WEOLC 0A76 21F205 LXI H,KWTAB+5*10 ;PRINT 'MODE ' 0A79 CD030C CALL W8CC 0A7C 3AAB1D LDA CR2 ;JUMP IF NOT ORIGINATE 0A7F E604 ANI MS 0A81 CA8A0A JZ PCDR5 0A84 21F316 LXI H,MSG24 ;PRINT 'ORIGINATE' 0A87 C38D0A JMP PCDR6 0A8A 21FF16 PCDR5: LXI H,MSG25 ;PRINT 'ANSWER' 0A8D CD1E14 PCDR6: CALL WASC 0A90 21FC05 LXI H,KWTAB+6*10 ;PRINT 'DUPLEX ' 0A93 CD030C CALL W8CC 0A96 3A1B1F LDA ECHO ;JUMP IF HALF DUPLEX 0A99 B7 ORA A 0A9A C2A30A JNZ PCDR7 0A9D 210817 LXI H,MSG26 ;PRINT 'FULL' 0AA0 C3A60A JMP PCDR8 0AA3 210D17 PCDR7: LXI H,MSG27 ;PRINT 'HALF' 0AA6 CD1E14 PCDR8: CALL WASC 0AA9 0609 MVI B,9 ;SPACE OVER 9 0AAB CD5014 CALL WSPC 0AAE 21D405 LXI H,KWTAB+2*10 ;PRINT 'PARITY ' 0AB1 CD030C CALL W8CC 0AB4 3AAA1D LDA CR1 ;JUMP IF NO PARITY INHIBIT 0AB7 E610 ANI PI 0AB9 CAC20A JZ PCDR9 0ABC 21DE16 LXI H,MSG21 ;PRINT 'NONE' 0ABF C3D30A JMP PCDRB 0AC2 3AAA1D PCDR9: LDA CR1 ;JUMP IF NOT EVEN 0AC5 E601 ANI EPE 0AC7 CAD00A JZ PCDRA 0ACA 21E516 LXI H,MSG22 ;PRINT 'EVEN' 0ACD C3D30A JMP PCDRB 0AD0 21EC16 PCDRA: LXI H,MSG23 0AD3 CD1E14 PCDRB: CALL WASC 0AD6 21DE05 LXI H,KWTAB+3*10 ;PRINT 'DBITS ' 0AD9 CD030C CALL W8CC 0ADC 3AAA1D LDA CR1 ;PRINT # OF DATA BITS 0ADF E606 ANI LS2+LS1 0AE1 0F RRC 0AE2 C635 ADI '5' 0AE4 CD5A14 CALL WACC 0AE7 060C MVI B,12 ;SPACE 12 0AE9 CD5014 CALL WSPC 0AEC 21E805 LXI H,KWTAB+4*10 ;PRINT 'SBITS ' 0AEF CD030C CALL W8CC 0AF2 3AAA1D LDA CR1 ;PRINT # OF STOP BITS 0AF5 E608 ANI SBS 0AF7 0F RRC 0AF8 0F RRC 0AF9 0F RRC 0AFA C631 ADI '1' 0AFC CD5A14 CALL WACC 0AFF CD4614 CALL WEOLC 0B02 210606 LXI H,KWTAB+7*10 ;PRINT 'AUTOLF ' 0B05 CD030C CALL W8CC 0B08 3A1C1F LDA AUTOLF ;PRINT STATE 0B0B CD0F0C CALL ONOFF 0B0E 060A MVI B,10 ;SPACE OVER 10 0B10 CD5014 CALL WSPC 0B13 211006 LXI H,KWTAB+8*10 ;PRINT 'BAUD ' 0B16 CD030C CALL W8CC 0B19 3AAB1D LDA CR2 ;JUMP IF 300 0B1C E601 ANI BRS 0B1E C2270B JNZ PCDRC 0B21 211217 LXI H,MSG28 ;PRINT '110' 0B24 C32A0B JMP PCDRD 0B27 211817 PCDRC: LXI H,MSG29 ;PRINT '300' 0B2A CD1E14 PCDRD: CALL WASC 0B2D 211A06 LXI H,KWTAB+9*10 ;PRINT 'CAPS ' 0B30 CD030C CALL W8CC 0B33 3A1D1F LDA CAPS ;PRINT STATE 0B36 CD0F0C CALL ONOFF 0B39 060A MVI B,10 ;SPACE OVER 10 0B3B CD5014 CALL WSPC 0B3E 212406 LXI H,KWTAB+10*10 ;PRINT 'ESCAPE ' 0B41 CD030C CALL W8CC 0B44 3A1E1F LDA ESCAPE ;PRINT HEX VALUE 0B47 CD0414 CALL WHBC 0B4A 3E48 MVI A,'H' 0B4C CD5A14 CALL WACC 0B4F CD4614 CALL WEOLC 0B52 214206 LXI H,KWTAB+13*10 ;PRINT 'DEBUG ' 0B55 CD030C CALL W8CC 0B58 3A201F LDA DEBUG ;PRINT STATE 0B5B CD0F0C CALL ONOFF 0B5E 060A MVI B,10 ;SPACE OVER 10 0B60 CD5014 CALL WSPC 0B63 214C06 LXI H,KWTAB+14*10 ;PRINT 'ERROR ' 0B66 CD030C CALL W8CC 0B69 3A221F LDA ERROR ;PRINT HEX VALUE 0B6C CD0414 CALL WHBC 0B6F 3E48 MVI A,'H' 0B71 CD5A14 CALL WACC 0B74 CD4614 CALL WEOLC 0B77 216006 LXI H,KWTAB+16*10 ;PRINT 'GARBAGE ' 0B7A CD030C CALL W8CC 0B7D 3A231F LDA GARBAGE ;PRINT VALUE 0B80 CD0414 CALL WHBC 0B83 3E48 MVI A,'H' 0B85 CD5A14 CALL WACC 0B88 060A MVI B,10 ;SPACE OVER 10 0B8A CD5014 CALL WSPC 0B8D 217406 LXI H,KWTAB+18*10 ;PRINT 'EXPAND ' 0B90 CD030C CALL W8CC 0B93 3A241F LDA EXPAND ;PRINT STATE 0B96 CD0F0C CALL ONOFF 0B99 CD4614 CALL WEOLC 0B9C 219206 LXI H,KWTAB+21*10 ;PRINT 'BREAK ' 0B9F CD030C CALL W8CC 0BA2 3A261F LDA BREAK 0BA5 CD0414 CALL WHBC 0BA8 3E48 MVI A,'H' 0BAA CD5A14 CALL WACC 0BAD 060A MVI B,10 ;SPACE OVER 10 0BAF CD5014 CALL WSPC 0BB2 21BA06 LXI H,KWTAB+25*10 ;PRINT 'REMESC ' 0BB5 CD030C CALL W8CC 0BB8 3A1F1F LDA REMESC 0BBB CD0414 CALL WHBC ;PRINT REMOTE ESCAPE CODE 0BBE 3E48 MVI A,'H' 0BC0 CD5A14 CALL WACC 0BC3 CD4614 CALL WEOLC 0BC6 21E206 LXI H,KWTAB+29*10 ;PRINT 'BLOCK ' 0BC9 CD030C CALL W8CC 0BCC 3AE31F LDA BLKSZ ;PRINT BLOCK SIZE IN HEX 0BCF CD0414 CALL WHBC 0BD2 3E48 MVI A,'H' 0BD4 CD5A14 CALL WACC 0BD7 CD4614 CALL WEOLC 0BDA C3BD05 JMP PCDX2 ;NORMAL EXIT ; PCDS - PROCESS 'EXPAND' DIRECTIVE 0BDD CDD210 PCDS: CALL SNB ;SCAN TO PARAMETER 0BE0 D8 RC 0BE1 FE4F CPI 'O' ;ERROR IF 1ST CHAR NOT 'O' 0BE3 C2BB05 JNZ PCDX1 0BE6 CD8913 CALL GNC ;GET 2ND CHAR 0BE9 D8 RC 0BEA FE4E CPI 'N' ;JUMP IF NOT 'ON' 0BEC C2F70B JNZ PCDS1 0BEF 3E01 MVI A,1 ;TURN ON EXPAND FLAG 0BF1 32241F STA EXPAND 0BF4 C3BD05 JMP PCDX2 ;EXIT 0BF7 FE46 PCDS1: CPI 'F' ;ERROR IF NOT 'OFF' 0BF9 C2BB05 JNZ PCDX1 0BFC AF XRA A ;TURN OFF EXPAND FLAG 0BFD 32241F STA EXPAND 0C00 C3BD05 JMP PCDX2 ;EXIT 0C03 0608 W8CC: MVI B,8 0C05 7E W8CC1: MOV A,M 0C06 23 INX H 0C07 CD5A14 CALL WACC 0C0A 05 DCR B 0C0B C2050C JNZ W8CC1 0C0E C9 RET 0C0F B7 ONOFF: ORA A ;JUMP IF OFF 0C10 CA190C JZ ONOFF1 0C13 211E17 LXI H,MSG30 ;PRINT 'ON' 0C16 C31C0C JMP ONOFF2 0C19 212217 ONOFF1: LXI H,MSG31 ;PRINT 'OFF' 0C1C CD1E14 ONOFF2: CALL WASC 0C1F C9 RET ; PCDT - PROCESS 'CAPTURE' DIRECTIVE 0C20 3E01 PCDT: MVI A,1 ;SET CAPTURE FLAG 0C22 32251F STA CAPTURE 0C25 210020 LXI H,MBUF ;RESET BUFFER POINTER 0C28 22D41F SHLD MBUFP 0C2B C3BD05 JMP PCDX2 ;EXIT ; PCDU - PROCESS 'WRITE' DIRECTIVE 0C2E AF PCDU: XRA A ;TURN OFF CAPTURE FLAG 0C2F 32251F STA CAPTURE 0C32 2AD41F LHLD MBUFP ;HL = POINTER TO LAST DATA + 1 0C35 110020 LXI D,MBUF ;DE = POINTER TO FIRST DATA 0C38 7D MOV A,L ;HL = HL - DE = DATA LENGTH 0C39 93 SUB E 0C3A 6F MOV L,A 0C3B 7C MOV A,H 0C3C 9A SBB D 0C3D 67 MOV H,A 0C3E 22A61D SHLD SIZE 0C41 B5 ORA L ;JUMP IF HL>0 0C42 C24E0C JNZ PCDU1 0C45 218916 LXI H,MSG16 ;PRINT 'MEMORY BUFFER EMPTY' 0C48 CD1E14 CALL WASC 0C4B C3BD05 JMP PCDX2 ;EXIT 0C4E CD2B11 PCDU1: CALL GFN ;GET USER'S FILE NAME 0C51 D8 RC 0C52 AF XRA A 0C53 326800 STA TFCB+EX 0C56 115C00 LXI D,TFCB ;CREATE FILE 0C59 CD8612 CALL DELETE 0C5C CD9212 CALL MAKE 0C5F FEFF CPI 255 ;JUMP IF OK 0C61 C26D0C JNZ PCDU2 0C64 219F16 LXI H,MSG17 ;PRINT 'DISK FULL' 0C67 CD1E14 CALL WASC 0C6A C3BD05 JMP PCDX2 ;EXIT 0C6D AF PCDU2: XRA A ;REWIND FILE 0C6E 327C00 STA TFCB+NR 0C71 32311E STA DOBUFC 0C74 21341E LXI H,DOBUF 0C77 22321E SHLD DOBUFP 0C7A 2AA61D LHLD SIZE ;DE = NUMBER OF BYTES TO SAVE 0C7D EB XCHG 0C7E 210020 LXI H,MBUF ;HL = FWA OF DATA 0C81 7E PCDU3: MOV A,M ;FETCH NEXT CHAR FROM MBUF 0C82 23 INX H 0C83 CD9E12 CALL WACD ;WRITE ASCII CHAR TO DISK 0C86 D2920C JNC PCDU4 ;JUMP IF OK 0C89 21AB16 LXI H,MSG18 ;PRINT 'WRITE ERROR' 0C8C CD1E14 CALL WASC 0C8F C3BD05 JMP PCDX2 ;EXIT 0C92 1B PCDU4: DCX D ;DECREMENT SIZE 0C93 7A MOV A,D ;LOOP UNTIL ZERO 0C94 B3 ORA E 0C95 C2810C JNZ PCDU3 0C98 CDC112 CALL FLUSH ;FLUSH LAST OUTPUT BUFFER 0C9B CD4614 CALL WEOLC ;RETURN CARRIAGE 0C9E 3E07 MVI A,BEL ;RING BELL 0CA0 CD5A14 CALL WACC 0CA3 C3BD05 JMP PCDX2 ;EXIT ; PCDV - PROCESS 'BREAK' DIRECTIVE 0CA6 CDD210 PCDV: CALL SNB ;SCAN TO PARAMETER 0CA9 D8 RC 0CAA CDE310 CALL DHD ;DECODE 1ST HEX DIGIT 0CAD D8 RC 0CAE 87 ADD A ;LEFT SHIFT 4 0CAF 87 ADD A 0CB0 87 ADD A 0CB1 87 ADD A 0CB2 47 MOV B,A ;SAVE IT 0CB3 CD8913 CALL GNC ;GET 2ND DIGIT 0CB6 D8 RC 0CB7 CDE310 CALL DHD ;DECODE IT 0CBA D8 RC 0CBB 80 ADD B ;BUILD COMPLETE BYTE 0CBC 32261F STA BREAK ;SAVE AS NEW BREAK TRIGGER 0CBF C3BD05 JMP PCDX2 ; PCDW - PROCESS 'SAVE' DIRECTIVE 0CC2 CD2B11 PCDW: CALL GFN ;GET FILE NAME 0CC5 D8 RC 0CC6 AF XRA A 0CC7 326800 STA TFCB+EX 0CCA 115C00 LXI D,TFCB ;CREATE FILE 0CCD CD8612 CALL DELETE 0CD0 CD9212 CALL MAKE 0CD3 FEFF CPI 255 ;JUMP IF OK 0CD5 C2E10C JNZ PCDW2 0CD8 219F16 LXI H,MSG17 ;PRINT 'DISK FULL' 0CDB CD1E14 CALL WASC 0CDE C3BD05 JMP PCDX2 0CE1 AF PCDW2: XRA A ;REWIND FILE 0CE2 327C00 STA TFCB+NR 0CE5 32311E STA DOBUFC 0CE8 21341E LXI H,DOBUF 0CEB 22321E SHLD DOBUFP 0CEE 3E02 MVI A,2 ;REDIRECT CONSOLE OUTPUT TO DISK 0CF0 32A91D STA COF 0CF3 CD3C0A CALL PCDR ;WRITE CONFIG FILE 0CF6 CDC112 CALL FLUSH ;FLUSH BUFFER, CLOSE FILE 0CF9 AF XRA A ;REDIRECT CONSOLE OUTPUT TO CONSOLE 0CFA 32A91D STA COF 0CFD C3BD05 JMP PCDX2 ;EXIT ; PCDX - PROCESS 'RESET' DIRECTIVE 0D00 210000 PCDX: LXI H,0 0D03 22281F SHLD PERR 0D06 222A1F SHLD OERR 0D09 222C1F SHLD FERR 0D0C C3BD05 JMP PCDX2 ; PCDY - PROCESS 'HELP' DIRECTIVE 0D0F CDD210 PCDY: CALL SNB ;SCAN TO PARAMETER 0D12 D21E0D JNC PCDY1 ;JUMP IF FOUND 0D15 21A017 LXI H,HMSG0 ;ELSE PRINT HELP MESSAGE 0 0D18 CD1E14 CALL WASC 0D1B C3BD05 JMP PCDX2 0D1E FE31 PCDY1: CPI '1' ;JUMP IF NOT '1' 0D20 C22C0D JNZ PCDY2 0D23 219F18 LXI H,HMSG1 ;ELSE PRINT HELP MESSAGE 1 0D26 CD1E14 CALL WASC 0D29 C3BD05 JMP PCDX2 0D2C FE32 PCDY2: CPI '2' ;JUMP IF NOT '2' 0D2E C23A0D JNZ PCDY3 0D31 219D1A LXI H,HMSG2 ;ELSE PRINT HELP MESSAGE 2 0D34 CD1E14 CALL WASC 0D37 C3BD05 JMP PCDX2 0D3A FE33 PCDY3: CPI '3' ;JUMP IF NOT '3' 0D3C C2480D JNZ PCDY4 0D3F 21B51B LXI H,HMSG3 ;ELSE PRINT HELP MESSAGE 3 0D42 CD1E14 CALL WASC 0D45 C3BD05 JMP PCDX2 0D48 C3BB05 PCDY4: JMP PCDX1 ;FOR NOW, FLAG ERROR ; PCDZ - PROCESS 'REMESC' DIRECTIVE 0D4B CDD210 PCDZ: CALL SNB ;SCAN TO PARAMETER 0D4E D8 RC 0D4F CDE310 CALL DHD ;DECLARE 1ST HEX DIGIT 0D52 D8 RC 0D53 87 ADD A ;LEFT SHIFT 4 BITS 0D54 87 ADD A 0D55 87 ADD A 0D56 87 ADD A 0D57 47 MOV B,A 0D58 CD8913 CALL GNC ;GET 2ND DIGIT 0D5B D8 RC 0D5C CDE310 CALL DHD ;DECODE IT 0D5F D8 RC 0D60 80 ADD B ;ACCUMULATE BYTE 0D61 321F1F STA REMESC ;SAVE AS NEW REMOTE ESCAPE CODE 0D64 C3BD05 JMP PCDX2 ;EXIT ; PCEA - PROCESS 'DIR' DIRECTIVE 0D67 CD2B11 PCEA: CALL GFN ;GET FILE NAME 0D6A D8 RC 0D6B 215D00 LXI H,TFCB+FN ;JUMP IF ANY NON-BLANK CHARS 0D6E 060B MVI B,11 0D70 7E PCEA0: MOV A,M 0D71 FE20 CPI ' ' 0D73 C2870D JNZ PCEA6 0D76 23 INX H 0D77 05 DCR B 0D78 C2700D JNZ PCEA0 0D7B 215D00 LXI H,TFCB+FN 0D7E 060B MVI B,11 ;ESLE FILL FN ANF FT WITH ? 0D80 363F PCEA5: MVI M,'?' 0D82 23 INX H 0D83 05 DCR B 0D84 C2800D JNZ PCEA5 0D87 AF PCEA6: XRA A ;CLEAR COLUMN COUNT 0D88 32271F STA COL 0D8B 326800 STA TFCB+EX ;RESET TO EXTENT #0 0D8E 115C00 LXI D,TFCB 0D91 CDDF11 CALL SRCHF ;SEARCH FOR 1ST OCCURANCE 0D94 FEFF CPI 255 0D96 CAD80D JZ PCEAX 0D99 E603 PCEA1: ANI 3 ;MASK OFF LOW 2 BITS 0D9B 87 ADD A ;MULTIPLY BY 32 0D9C 87 ADD A 0D9D 87 ADD A 0D9E 87 ADD A 0D9F 87 ADD A 0DA0 218000 LXI H,0080H ;ADD TO 80H 0DA3 85 ADD L 0DA4 6F MOV L,A 0DA5 23 INX H ;SKIP 1ST BYTE 0DA6 060B MVI B,11 ;NUMBER OF BYTES 0DA8 7E PCEA2: MOV A,M ;FETCH NEXT BYTE 0DA9 23 INX H 0DAA CD5A14 CALL WACC ;WRITE TO CONSOLE 0DAD 05 DCR B 0DAE C2A80D JNZ PCEA2 0DB1 21271F LXI H,COL ;INCREMENT COLUMN COUNT 0DB4 34 INR M 0DB5 7E MOV A,M 0DB6 E603 ANI 3 ;JUMP IF DIVISIBLE BY 4 0DB8 CAC40D JZ PCEA3 0DBB 21D816 LXI H,MSG20 ;PRINT VERTICAL LINE 0DBE CD1E14 CALL WASC 0DC1 C3C70D JMP PCEA4 ;LOOP 0DC4 CD4614 PCEA3: CALL WEOLC ;ISSUE END OF LINE 0DC7 115C00 PCEA4: LXI D,TFCB 0DCA CDEB11 CALL SRCHN ;SEARCH FOR NEXT OCCURANCE 0DCD FEFF CPI 255 ;LOOP IF FOUND 0DCF C2990D JNZ PCEA1 0DD2 CD4614 CALL WEOLC ;ISSUE END OF LINE 0DD5 C3BD05 JMP PCDX2 ;EXIT 0DD8 215215 PCEAX: LXI H,MSG1 ;PRINT 'FILE NOT FOUND' 0DDB CD1E14 CALL WASC 0DDE C3BD05 JMP PCDX2 ; PCEB - PROCESS 'SEND' DIRECTIVE 0DE1 0606 PCEB: MVI B,LS2+LS1 ;FORCE 8 DATA BITS 0DE3 CD0615 CALL CR1ON 0DE6 CD2B11 CALL GFN ;GET FILE NAME INTO TFCB 0DE9 D8 RC 0DEA AF XRA A 0DEB 326800 STA TFCB+EX 0DEE 115C00 LXI D,TFCB ;TRY TO OPEN FILE 0DF1 CDC711 CALL OPEN 0DF4 FEFF CPI 255 0DF6 C2020E JNZ PCEB1 0DF9 215215 LXI H,MSG1 ;PRINT 'FILE NOT FOUND' 0DFC CD1E14 CALL WASC 0DFF C3BD05 JMP PCDX2 ;EXIT 0E02 AF PCEB1: XRA A 0E03 327C00 STA TFCB+NR ;REWIND FILE 0E06 32DA1F STA EOF ;CLEAR END-OF-FILE FLAG 0E09 3ADA1F PCEB2: LDA EOF ;JUMP IF END-OF-FILE FLAG SET 0E0C B7 ORA A 0E0D C2B40E JNZ PCEB7 0E10 CD031D CALL CONST ;JUMP IF NO CONSOLE ACTIVITY 0E13 B7 ORA A 0E14 CA200E JZ PCEB2A 0E17 219117 LXI H,MSG38 ;PRINT 'SEND ABORTED' 0E1A CD1E14 CALL WASC 0E1D C3B40E JMP PCEB7 ;GO SEND EOT 0E20 010000 PCEB2A: LXI B,0 ;COUNT = 0 0E23 110020 LXI D,MBUF ;INITIAL MBUF POINTER 0E26 CD5F12 PCEB3: CALL RDREC2 ;READ NEXT RECORD INTO MBUF 0E29 FE01 CPI 1 ;JUMP ON EOF 0E2B CA490E JZ PCEB3A 0E2E 7B MOV A,E ;INCREMENT MBUF POINTER 0E2F C680 ADI 128 0E31 5F MOV E,A 0E32 D2360E JNC $+4 0E35 14 INR D 0E36 79 MOV A,C ;INCREMENT COUNT 0E37 C680 ADI 128 0E39 4F MOV C,A 0E3A D23E0E JNC $+4 0E3D 04 INR B 0E3E 78 MOV A,B 0E3F 21E31F LXI H,BLKSZ 0E42 BE CMP M 0E43 DA260E JC PCEB3 0E46 C3530E JMP PCEB3B ;GO SEND DATA MESSAGE 0E49 3E01 PCEB3A: MVI A,1 ;SET END-OF-FILE FLAG 0E4B 32DA1F STA EOF 0E4E 78 MOV A,B ;GO SEND EOT IF COUNT = 0 0E4F B1 ORA C 0E50 CAB40E JZ PCEB7 0E53 60 PCEB3B: MOV H,B ;SAVE COUNT 0E54 69 MOV L,C 0E55 22DB1F SHLD OCNT 0E58 3E00 PCEB4: MVI A,NULL ;SEND DATA MESSAGE 0E5A 32DD1F STA OCODE 0E5D CDAC0F CALL SEND 0E60 CDF40F PCEB5: CALL RECV 0E63 D26F0E JNC PCEB5A ;JUMP IF OK 0E66 216C17 LXI H,MSG36 ;PRINT 'INVALID CRC' 0E69 CD1E14 CALL WASC 0E6C C3A90E JMP PCEB6 0E6F 2AE41F PCEB5A: LHLD TOC 0E72 7C MOV A,H 0E73 B5 ORA L 0E74 C2800E JNZ PCEB5B 0E77 215A17 LXI H,MSG35 ;PRINT 'TIMEOUT' 0E7A CD1E14 CALL WASC 0E7D C3580E JMP PCEB4 0E80 3AE01F PCEB5B: LDA ICODE ;FETCH INPUT MESSAGE TYPE 0E83 FE04 CPI EOT ;JUMP IF ECHOED EOT 0E85 CABF0E JZ PCEB8 0E88 FE06 CPI ACK ;CONTINUE TO NEXT MSG IF ACK 0E8A CA090E JZ PCEB2 0E8D FE15 CPI NAK ;RETRANSMIT IF NAK 0E8F C2A30E JNZ PCEB5C 0E92 214917 LXI H,MSG34 ;PRINT 'RETRANSMITTING' 0E95 CD1E14 CALL WASC 0E98 3ADD1F LDA OCODE ;JUMP IF LAST MSG WAS EOT 0E9B FE04 CPI EOT 0E9D CAB40E JZ PCEB7 0EA0 C3580E JMP PCEB4 ;ELSE RETRANS. DATA MESSAGE 0EA3 217A17 PCEB5C: LXI H,MSG37 ;PRINT 'UNKNOWN MESSAGE' 0EA6 CD1E14 CALL WASC 0EA9 3E15 PCEB6: MVI A,NAK ;SEND NAK 0EAB 32DD1F STA OCODE 0EAE CDAC0F CALL SEND 0EB1 C3600E JMP PCEB5 0EB4 3E04 PCEB7: MVI A,EOT ;SEND EOT 0EB6 32DD1F STA OCODE 0EB9 CDAC0F CALL SEND 0EBC C3600E JMP PCEB5 ;AWAIT EOT ECHO 0EBF 115C00 PCEB8: LXI D,TFCB ;CLOSE FILE 0EC2 CDD311 CALL CLOSE 0EC5 212617 LXI H,MSG32 ;PRINT 'FILE SENT' 0EC8 CD1E14 CALL WASC 0ECB C3BD05 JMP PCDX2 ;NORMAL EXIT ; PCEC - PROCESS 'RECV' DIRECTIVE 0ECE 0606 PCEC: MVI B,LS2+LS1 ;FORCE 8 DATA BITS 0ED0 CD0615 CALL CR1ON 0ED3 CD2B11 CALL GFN ;GET FILE NAME 0ED6 D8 RC 0ED7 AF XRA A 0ED8 326800 STA TFCB+EX 0EDB 115C00 LXI D,TFCB 0EDE CD8612 CALL DELETE ;DELETE EXISTING FILE, IF ANY 0EE1 CD9212 CALL MAKE ;MAKE NEW ONE 0EE4 FEFF CPI 255 ;JUMP IF OK 0EE6 C2F20E JNZ PCEC1 0EE9 219F16 LXI H,MSG17 ;PRINT 'DISK FULL' 0EEC CD1E14 CALL WASC 0EEF C3BD05 JMP PCDX2 0EF2 AF PCEC1: XRA A 0EF3 327C00 STA TFCB+NR 0EF6 3EFF MVI A,0FFH ;'AWAITING FIRST MSG' CODE 0EF8 32DD1F STA OCODE 0EFB CDF40F PCEC2: CALL RECV ;RECEIVE MESSAGE 0EFE D20A0F JNC PCEC2A ;JUMP IF OK 0F01 216C17 LXI H,MSG36 ;PRINT 'INVALID CRC' 0F04 CD1E14 CALL WASC 0F07 C3430F JMP PCEC3 0F0A 2AE41F PCEC2A: LHLD TOC ;BRANCH IF NO TIMEOUT 0F0D 7C MOV A,H 0F0E B5 ORA L 0F0F C2220F JNZ PCEC2B 0F12 3ADD1F LDA OCODE ;LOOP IF AWAITING FIRST MSG 0F15 3C INR A 0F16 CAFB0E JZ PCEC2 0F19 215A17 LXI H,MSG35 ;PRINT 'TIMEOUT' AND SEND NAK 0F1C CD1E14 CALL WASC 0F1F C3430F JMP PCEC3 0F22 3AE01F PCEC2B: LDA ICODE ;FETCH MESSAGE CODE 0F25 FE15 CPI NAK ;JUMP IF NAK 0F27 C2330F JNZ PCEC2C 0F2A 214917 LXI H,MSG34 ;PRINT 'RETRANSMITTING' 0F2D CD1E14 CALL WASC 0F30 C34D0F JMP PCEC6 0F33 FE04 PCEC2C: CPI EOT ;JUMP IF EOT 0F35 CA740F JZ PCEC9 0F38 FE00 CPI NULL ;JUMP IF DATA MESSAGE 0F3A CA530F JZ PCEC7 0F3D 217A17 LXI H,MSG37 ;PRINT 'UNKNOWN MESSAGE' 0F40 CD1E14 CALL WASC 0F43 3E15 PCEC3: MVI A,NAK ;SEND NAK 0F45 C34A0F JMP PCEC5 0F48 3E06 PCEC4: MVI A,ACK ;SEND ACK 0F4A 32DD1F PCEC5: STA OCODE 0F4D CDAC0F PCEC6: CALL SEND ;SEND MESSAGE 0F50 C3FB0E JMP PCEC2 ;GO READ RESPONSE 0F53 110024 PCEC7: LXI D,MBUF2 ;FWA OF INPUT BUFFER 0F56 2ADE1F LHLD ICNT ;HL = # OF BYTES READ 0F59 CDE612 PCEC8: CALL WRREC2 ;WRITE NEXT RECORD FROM MBUF 0F5C 7B MOV A,E ;ADD 128 TO POINTER 0F5D C680 ADI 128 0F5F 5F MOV E,A 0F60 D2640F JNC $+4 0F63 14 INR D 0F64 7D MOV A,L ;SUBTRACT 128 FROM COUNT 0F65 D680 SUI 128 0F67 6F MOV L,A 0F68 D26C0F JNC $+4 0F6B 25 DCR H 0F6C 7C MOV A,H ;LOOP UNTIL COUNT = 0 0F6D B5 ORA L 0F6E C2590F JNZ PCEC8 0F71 C3480F JMP PCEC4 ;GO SEND ACK, LOOP UNTIL EOF 0F74 3E04 PCEC9: MVI A,EOT 0F76 32DD1F STA OCODE 0F79 CDAC0F CALL SEND 0F7C 115C00 LXI D,TFCB 0F7F CDD311 CALL CLOSE 0F82 213917 LXI H,MSG33 ;PRINT 'FILE RECEIVED' 0F85 CD1E14 CALL WASC 0F88 C3BD05 JMP PCDX2 ; PCED - PROCESS 'BLOCK' DIRECTIVE 0F8B CDD210 PCED: CALL SNB 0F8E D8 RC 0F8F CDE310 CALL DHD 0F92 D8 RC 0F93 32E31F STA BLKSZ 0F96 87 ADD A 0F97 87 ADD A 0F98 87 ADD A 0F99 87 ADD A 0F9A 47 MOV B,A 0F9B CD8913 CALL GNC 0F9E DABD05 JC PCDX2 0FA1 CDE310 CALL DHD 0FA4 D8 RC 0FA5 80 ADD B 0FA6 32E31F STA BLKSZ 0FA9 C3BD05 JMP PCDX2 ;; SEND - SEND MESSAGE USING PROTOCOL ; ; ENTRY CONDITIONS ; ; OCODE MESSAGE TYPE (ACK,NAK,EOT,NUL) ; ; OCNT MESSAGE LENGTH (IF OCODE=NUL) ; ; MBUF MESSAGE (IF OCODE=NUL) 0FAC 3E01 SEND: MVI A,SOH ;SEND START OF HEADER 0FAE CDC414 CALL WACM 0FB1 210000 LXI H,0 ;CLEAR CRC 0FB4 22E11F SHLD CRC 0FB7 3ADD1F LDA OCODE ;SEND MESSAGE TYPE 0FBA CD9110 CALL WACMC 0FBD FE00 CPI NULL ;JUMP IF NOT DATA MESSAGE 0FBF C2E70F JNZ SEND2 0FC2 2ADB1F LHLD OCNT ;FETCH MESSAGE LENGTH 0FC5 7C MOV A,H ;SEND HIGH BYTE 0FC6 CD9110 CALL WACMC 0FC9 7D MOV A,L ;SEND LOW BYTE 0FCA CD9110 CALL WACMC 0FCD 3E02 MVI A,STX ;SEND START OF TEXT 0FCF CD9110 CALL WACMC 0FD2 44 MOV B,H ;BC=COUNT 0FD3 4D MOV C,L 0FD4 210020 LXI H,MBUF ;HL = FWA OF MESSAGE 0FD7 7E SEND1: MOV A,M ;FETCH NEXT BYTE OF MESSAGE 0FD8 23 INX H 0FD9 CD9110 CALL WACMC ;SEND NEXT DATA BYTE 0FDC 0B DCX B ;DECREMENT COUNT 0FDD 78 MOV A,B ;LOOP UNTIL ZERO 0FDE B1 ORA C 0FDF C2D70F JNZ SEND1 0FE2 3E03 MVI A,ETX ;SEND END OF TEXT 0FE4 CD9110 CALL WACMC 0FE7 3AE21F SEND2: LDA CRC+1 ;SEND HIGH BYTE OF CRC 0FEA CDC414 CALL WACM 0FED 3AE11F LDA CRC ;SEND LOW BYTE OF CRC 0FF0 CDC414 CALL WACM 0FF3 C9 RET ;EXIT ;; RECV - RECEIVE MESSAGE USING PROTOCOL ; ; ENTRY CONDITIONS ; ; TIME TIMEOUT COUNT (IN MILLISECONDS) ; ; EXIT CONDITIONS ; ; TOC REMAINING TIME (ZERO IF TIMED OUT) ; ; C-FLAG SET IF ERROR DETECTED ; ; ICODE INPUT MESSAGE TYPE (ACK/NAK/EOT/NUL) ; ; ICNT INPUT MESSAGE COUNT (IF ICODE=NUL) ; ; MBUF2 INPUT MESSAGE (IF ICODE=NUL) 0FF4 21E803 RECV: LXI H,1000 ;SETUP FOR 1 SECOND TIMEOUT 0FF7 22E61F SHLD TIME 0FFA 060A MVI B,10 ;TRY 10 TIMES FOR SOH 0FFC CD9614 RECV0: CALL RACM ;READ CHARACTER 0FFF FE01 CPI SOH ;JUMP IF SOH 1001 CA1110 JZ RECV1 1004 05 DCR B ;NON-SOH OR TIMEOUT, 1005 C2FC0F JNZ RECV0 ;TRY AGAIN 1008 210000 LXI H,0 ;FAKE TIMEOUT 100B 22E41F SHLD TOC 100E C38010 JMP RECVX ;AND EXIT 1011 210000 RECV1: LXI H,0 ;CLEAR CRC 1014 22E11F SHLD CRC 1017 21F401 LXI H,500 ;SETUP FOR HALF-SECOND TIMEOUT 101A 22E61F SHLD TIME 101D CD9C10 CALL RACMC ;READ MESSAGE TYPE 1020 DA8010 JC RECVX 1023 32E01F STA ICODE 1026 FE00 CPI NULL ;JUMP IF NOT DATA MESSAGE 1028 C26510 JNZ RECV4 102B CD9C10 CALL RACMC ;READ HIGH BYTE OF COUNT 102E DA8010 JC RECVX 1031 67 MOV H,A 1032 CD9C10 CALL RACMC ;READ LOW BYTE OF COUNT 1035 DA8010 JC RECVX 1038 6F MOV L,A 1039 22DE1F SHLD ICNT ;SAVE COUNT 103C 44 MOV B,H ;BC = COUNT 103D 4D MOV C,L 103E CD9C10 RECV2: CALL RACMC ;LOOP UNTIL STX READ 1041 DA8010 JC RECVX 1044 FE02 CPI STX 1046 C23E10 JNZ RECV2 1049 210024 LXI H,MBUF2 ;FWA OF INPUT BUFFER 104C CD9C10 RECV3: CALL RACMC ;READ DATA BYTE 104F DA8010 JC RECVX 1052 77 MOV M,A ;STORE IN BUFFER 1053 23 INX H 1054 0B DCX B ;DECREMENT COUNT 1055 78 MOV A,B ;LOOP UNTIL ZERO 1056 B1 ORA C 1057 C24C10 JNZ RECV3 105A CD9C10 CALL RACMC ;ERROR IF NEXT BYTE NOT ETX 105D DA8010 JC RECVX 1060 FE03 CPI ETX 1062 C28910 JNZ RECVE 1065 CD9614 RECV4: CALL RACM ;READ TRANSMITTED CRC INTO DE 1068 DA8010 JC RECVX 106B 57 MOV D,A 106C CD9614 CALL RACM 106F DA8010 JC RECVX 1072 5F MOV E,A 1073 2AE11F LHLD CRC ;FETCH COMPUTED CRC INTO HL 1076 7B MOV A,E ;ERROR IF NOT SAME 1077 BD CMP L 1078 C28910 JNZ RECVE 107B 7A MOV A,D 107C BC CMP H 107D C28910 JNZ RECVE 1080 21FFFF RECVX: LXI H,0FFFFH ;RETURN TO INF. TIMEOUT 1083 22E61F SHLD TIME 1086 37 STC 1087 3F CMC 1088 C9 RET 1089 21FFFF RECVE: LXI H,0FFFFH ;RETURN TO INF. TIMEOUT 108C 22E61F SHLD TIME 108F 37 STC ;ERROR EXIT 1090 C9 RET ;; WACMC - WRITE ASCII CHARACTER TO MODEM (WITH CRC) ; 1091 CDC414 WACMC: CALL WACM ;WRITE CHAR TO MODEM 1094 CDA810 CALL UCRC ;UPDATE CRC 1097 2F CMA ;DISPLAY ON LIGHTS 1098 D3FF OUT 0FFH 109A 2F CMA 109B C9 RET ;; RACMC - READ ASCII CHARACTER FROM MODEM (WITH CRC) ; 109C CD9614 RACMC: CALL RACM ;READ CHARACTER FROM MODEM 109F F5 PUSH PSW 10A0 CDA810 CALL UCRC ;UPDATE CRC 10A3 2F CMA ;DISPLAY ON LIGHTS 10A4 D3FF OUT 0FFH 10A6 F1 POP PSW 10A7 C9 RET ;; UCRC - UPDATE CRC ; 10A8 F5 UCRC: PUSH PSW ;SAVE REGS 10A9 C5 PUSH B 10AA E5 PUSH H 10AB 47 MOV B,A ;SAVE DATA BYTE 10AC 0E08 MVI C,8 ;# BITS PER BYTE 10AE E680 UCRC1: ANI 80H ;GET MOST SIG. BIT 10B0 2AE11F LHLD CRC ;HL = CRC 10B3 AC XRA H ;XOR M.S.B. INTO CRC 10B4 67 MOV H,A 10B5 29 DAD H ;LEFT SHIFT CRC 1 BIT 10B6 D2C110 JNC UCRC2 ;JUMP IF M.S.B. ZERO 10B9 7C MOV A,H ;HL = HL XOR CRC POLYNOMIAL 10BA EE80 XRI CRCPOL SHR 8 10BC 67 MOV H,A 10BD 7D MOV A,L 10BE EE05 XRI CRCPOL AND 0FFH 10C0 6F MOV L,A 10C1 22E11F UCRC2: SHLD CRC ;REPLACE CRC 10C4 0D DCR C ;EXIT WHEN DONE 10C5 CACE10 JZ UCRC3 10C8 78 MOV A,B ;SHIFT DATA BYTE LEFT 1 BIT 10C9 87 ADD A 10CA 47 MOV B,A 10CB C3AE10 JMP UCRC1 ;LOOP 10CE E1 UCRC3: POP H ;RESTORE REGS, RETURN 10CF C1 POP B 10D0 F1 POP PSW 10D1 C9 RET ;; SNB - SCAN TO NON-BLANK (AND NON-TAB) ; 10D2 CD8913 SNB: CALL GNC ;GET NEXT CHAR 10D5 D8 RC ;RETURN IF END OF LINE 10D6 FE20 CPI ' ' ;LOOP IF BLANK 10D8 CAD210 JZ SNB 10DB FE09 CPI TAB ;LOOP IF TAB 10DD CAD210 JZ SNB 10E0 37 STC ;NORMAL EXIT 10E1 3F CMC 10E2 C9 RET ;; DHD - DECODE HEX DIGIT ; 10E3 FE41 DHD: CPI 'A' ;JUMP IF F 10E5 DAF210 JC DHD1 10E8 FE47 CPI 'F'+1 10EA D2F210 JNC DHD1 10ED D637 SUI 'A'-10 ;DECODE A THRU F 10EF C3FB10 JMP DHD2 ;EXIT 10F2 FE30 DHD1: CPI '0' ;ERROR IF <0 OR >9 10F4 D8 RC 10F5 FE3A CPI '9'+1 10F7 3F CMC 10F8 D8 RC 10F9 D630 SUI '0' ;DECODE 0 THRU 9 10FB 37 DHD2: STC ;EXIT 10FC 3F CMC 10FD C9 RET ;; EASC - ECHO ASCII STRING TO CONSOLE ; 10FE 3A331F EASC: LDA IBUF+1 ;FETCH STRING LENGTH 1101 B7 ORA A ;RETURN IF EMPTY 1102 C8 RZ 1103 47 MOV B,A ;B = LENGTH 1104 21341F LXI H,IBUF+2 ;HL = FWA OF STRING 1107 0E00 MVI C,0 ;C = COLUMN COUNT 1109 7E EASC1: MOV A,M ;FETCH NEXT CHAR FROM IBUF 110A 23 INX H 110B FE09 CPI TAB ;JUMP IF NOT TAB 110D C21F11 JNZ EASC3 1110 3E20 EASC2: MVI A,' ' ;EXPAND TAB 1112 CD5A14 CALL WACC 1115 0C INR C 1116 79 MOV A,C 1117 E607 ANI 07H 1119 C21011 JNZ EASC2 111C C32311 JMP EASC4 ;CONTINUE 111F CD5A14 EASC3: CALL WACC ;WRITE CHAR 1122 0C INR C ;INCREMENT COLUMN COUNT 1123 05 EASC4: DCR B ;DECREMENT COUNT 1124 C20911 JNZ EASC1 ;LOOP THRU ENTIRE BUFFER 1127 CD4614 CALL WEOLC ;WRITE END OF LINE TO CONSOLE 112A C9 RET ;EXIT ;; GFN - GET FILE NAME INTO TFCB ; 112B 215C00 GFN: LXI H,TFCB ;AREA TO STORE NAME 112E 3600 MVI M,0 ;DEFAULT TO CURRENT DRIVE 1130 23 INX H 1131 060B MVI B,11 ;BLANK FILL FN AND FT 1133 3620 GFN1: MVI M,' ' 1135 23 INX H 1136 05 DCR B 1137 C23311 JNZ GFN1 113A CDD210 CALL SNB ;SCAN TO FILE NAME 113D DAC211 JC GFNX 1140 0608 MVI B,8 ;MAX CHARS IN NAME 1142 215D00 LXI H,TFCB+FN ;START SCANNING FN 1145 C35B11 JMP GFN2A 1148 215D00 GFN1A: LXI H,TFCB+FN ;OOPS - THAT WAS A DRIVE NAME 114B 7E MOV A,M 114C D640 SUI 'A'-1 114E 325C00 STA TFCB+0 1151 3620 MVI M,' ' 1153 0608 MVI B,8 1155 CD8913 GFN2: CALL GNC ;GET NEXT CHAR 1158 DAC211 JC GFNX 115B FE2A GFN2A: CPI '*' ;JUMP IF ASTERISK 115D CA7B11 JZ GFN2B 1160 FE2E CPI '.' ;JUMP IF END OF FN 1162 CA8E11 JZ GFN3 1165 FE20 CPI ' ' 1167 CAC211 JZ GFNX 116A FE3A CPI ':' ;THIS IS NO FN, ITS A DRIVE ID! 116C CA4811 JZ GFN1A 116F CD3C15 CALL CLC ;CONVERT LOWER CASE 1172 77 MOV M,A ;SAVE IN FN 1173 23 INX H 1174 05 DCR B ;DECREMENT COUNT 1175 F25511 JP GFN2 ;LOOP IF STILL ROOM 1178 C3C511 JMP GFNE ;ELSE ERROR 117B 05 GFN2B: DCR B ;FILL REST OF FN WITH '?' 117C 363F GFN2C: MVI M,'?' 117E 23 INX H 117F 05 DCR B 1180 C27C11 JNZ GFN2C 1183 CD8913 CALL GNC ;GET NEXT CHAR 1186 DAC211 JC GFNX ;EXIT IF END OF NAME 1189 FE2E CPI '.' ;ERROR IF NOT PERIOD 118B C2C511 JNZ GFNE 118E 216500 GFN3: LXI H,TFCB+FT ;SCAN OFF FT FIELD 1191 0603 GFN4: MVI B,3 ;MAX CHARS IN FT 1193 CD8913 GFN5: CALL GNC ;GET CHAR 1196 DAC211 JC GFNX ;EXIT IF END OF NAME 1199 FE2A CPI '*' ;JUMP IF ASTERISK 119B CAAF11 JZ GFN5B 119E FE20 CPI ' ' ;EXIT IF END OF NAME 11A0 CAC211 JZ GFNX 11A3 CD3C15 CALL CLC ;CONVERT LOWER CASE 11A6 77 MOV M,A ;SAVE IN FT 11A7 23 INX H 11A8 05 DCR B ;DECREMENT COUNT 11A9 F29311 JP GFN5 ;LOOP IF STILL ROOM 11AC C3C511 JMP GFNE ;ELSE ERROR 11AF 05 GFN5B: DCR B ;FILL REST OF FT WITH '?' 11B0 363F GFN5C: MVI M,'?' 11B2 23 INX H 11B3 05 DCR B 11B4 F2B011 JP GFN5C 11B7 CD8913 CALL GNC ;EXIT IF END OF NAME 11BA DAC211 JC GFNX 11BD FE20 CPI ' ' 11BF C2C511 JNZ GFNE ;ELSE ERROR 11C2 37 GFNX: STC ;NORMAL EXIT 11C3 3F CMC 11C4 C9 RET 11C5 37 GFNE: STC ;ERROR EXIT 11C6 C9 RET ;; OPEN - OPEN SPECIFIED FILE ; ; ENTRY CONDITIONS: ; ; DE FWA OF FCB OF FILE ; ; EXIT CONDITIONS: ; ; A 255 IF FILE NOT FOUND 11C7 E5 OPEN: PUSH H 11C8 D5 PUSH D 11C9 C5 PUSH B 11CA 0E0F MVI C,OFFC 11CC CD0500 CALL ENTRY 11CF C1 POP B 11D0 D1 POP D 11D1 E1 POP H 11D2 C9 RET ;; CLOSE - CLOSE SPECIFIED FILE ; ; ENTRY CONDITIONS: ; ; DE FWA OF FCB OF FILE ; ; EXIT CONDITIONS ; ; A 255 IF UNABLE TO CLOSE 11D3 E5 CLOSE: PUSH H 11D4 D5 PUSH D 11D5 C5 PUSH B 11D6 0E10 MVI C,CFFC 11D8 CD0500 CALL ENTRY 11DB C1 POP B 11DC D1 POP D 11DD E1 POP H 11DE C9 RET ;; SRCHF - SEARCH FOR FIRST OCCURANCE (OF AFN IN DIRECTORY) ; 11DF E5 SRCHF: PUSH H 11E0 D5 PUSH D 11E1 C5 PUSH B 11E2 0E11 MVI C,SFFC 11E4 CD0500 CALL ENTRY 11E7 C1 POP B 11E8 D1 POP D 11E9 E1 POP H 11EA C9 RET ;; SRCHN - SEARCH FOR NEXT OCCURANCE (OF AFN IN DIRECTORY) ; 11EB E5 SRCHN: PUSH H 11EC D5 PUSH D 11ED C5 PUSH B 11EE 0E12 MVI C,SNFC 11F0 CD0500 CALL ENTRY 11F3 C1 POP B 11F4 D1 POP D 11F5 E1 POP H 11F6 C9 RET ;; RASS - READ ASCII STRING FROM SOURCE FILE ; ; EXIT CONDITIONS ; ; IBUFC NUMBER OF CHARS READ ; ; IBUFP POINTER TO 1ST CHAR ; ; C-FLAG SET IF EOF READ 11F7 E5 RASS: PUSH H 11F8 C5 PUSH B 11F9 21321F LXI H,IBUF 11FC 46 MOV B,M ;B = MAX CHAR COUNT 11FD 23 INX H 11FE 3600 MVI M,0 1200 23 INX H 1201 22301F SHLD IBUFP ;SET IBUF POINTER 1204 CD3412 RASS1: CALL RACS ;READ NEXT CHAR FROM SOURCE 1207 DA3012 JC RASS3 ;JUMP ON PHYSICAL EOF 120A FE1A CPI 'Z'-40H ;JUMP ON LOGICAL EOF 120C CA3012 JZ RASS3 120F FE0A CPI LF ;IGNORE LINE FEEDS 1211 CA0412 JZ RASS1 1214 FE0D CPI CR ;JUMP ON END-OF-LINE 1216 CA2B12 JZ RASS2 1219 04 INR B ;LOOP IF NO ROOM IN IBUF 121A 05 DCR B 121B CA0412 JZ RASS1 121E 77 MOV M,A ;STORE IN IBUF 121F 23 INX H 1220 3A331F LDA IBUFC ;INCREMENT IBUF COUNT 1223 3C INR A 1224 32331F STA IBUFC 1227 05 DCR B ;DECREMENT MAX COUNT 1228 C30412 JMP RASS1 ;LOOP 122B 37 RASS2: STC ;NORMAL EXIT 122C 3F CMC 122D C33112 JMP RASS4 1230 37 RASS3: STC ;EOF EXIT 1231 C1 RASS4: POP B 1232 E1 POP H 1233 C9 RET ;; RACS - READ ASCII CHARACTER FROM SOURCE ; ; EXIT CONDITIONS ; ; A CHARACTER READ ; ; C-FLAG SET IF PHYSICAL EOF 1234 E5 RACS: PUSH H 1235 3AAE1D LDA DIBUFC ;JUMP IF DISK INPUT BUFFER NOT EMPTY 1238 B7 ORA A 1239 C24C12 JNZ RACS1 123C CD6512 CALL RDREC ;READ NEXT RECORD INTO DIBUF 123F FE01 CPI 1 ;BRANCH ON PHYSICAL EOF 1241 CA5C12 JZ RACS2 1244 21B11D LXI H,DIBUF ;RESET DIBUF POINTER 1247 22AF1D SHLD DIBUFP 124A 3E80 MVI A,80H ;RESET DIBUF COUNT 124C 3D RACS1: DCR A ;DECREMENT COUNT 124D 32AE1D STA DIBUFC 1250 2AAF1D LHLD DIBUFP ;FETCH CHAR AT POINTER 1253 7E MOV A,M 1254 23 INX H ;INCREMENT POINTER 1255 22AF1D SHLD DIBUFP 1258 E1 POP H ;NORMAL EXIT 1259 37 STC 125A 3F CMC 125B C9 RET 125C E1 RACS2: POP H ;EOF EXIT 125D 37 STC 125E C9 RET ;; RDREC - READ RECORD FROM SOURCE FILE ; 125F E5 RDREC2: PUSH H 1260 D5 PUSH D 1261 C5 PUSH B 1262 C36B12 JMP RDREC1 1265 E5 RDREC: PUSH H 1266 D5 PUSH D 1267 C5 PUSH B 1268 11B11D LXI D,DIBUF 126B 0E1A RDREC1: MVI C,SAFC 126D CD0500 CALL ENTRY 1270 115C00 LXI D,TFCB 1273 0E14 MVI C,RRFC 1275 CD0500 CALL ENTRY 1278 F5 PUSH PSW 1279 118000 LXI D,80H 127C 0E1A MVI C,SAFC 127E CD0500 CALL ENTRY 1281 F1 POP PSW 1282 C1 POP B 1283 D1 POP D 1284 E1 POP H 1285 C9 RET ;; DELETE - DELETE EXISTING FILE ; 1286 E5 DELETE: PUSH H 1287 D5 PUSH D 1288 C5 PUSH B 1289 0E13 MVI C,DFFC 128B CD0500 CALL ENTRY 128E C1 POP B 128F D1 POP D 1290 E1 POP H 1291 C9 RET ;; MAKE - MAKE NEW FILE ; ; ENTRY CONDITIONS ; ; DE FWA OF FILE CONTROL BLOCK 1292 E5 MAKE: PUSH H 1293 D5 PUSH D 1294 C5 PUSH B 1295 0E16 MVI C,MFFC 1297 CD0500 CALL ENTRY 129A C1 POP B 129B D1 POP D 129C E1 POP H 129D C9 RET ;; WACD - WRITE ASCII CHARACTER TO DEST. FILE ; ; ENTRY CONDITIONS ; ; A CHARACTER TO WRITE 129E E5 WACD: PUSH H 129F F5 PUSH PSW 12A0 3A311E LDA DOBUFC ;JUMP IF BUFFER NOT YET FULL 12A3 FE80 CPI 128 12A5 DAB212 JC WACD1 12A8 CDEC12 CALL WRREC ;WRITE BUFFER TO FILE 12AB 21341E LXI H,DOBUF ;RESET BUFFER POINTER 12AE 22321E SHLD DOBUFP 12B1 AF XRA A ;RESET BUFFER COUNT 12B2 3C WACD1: INR A ;INCREMENT BUFFER COUNT 12B3 32311E STA DOBUFC 12B6 F1 POP PSW ;GET CHAR BACK 12B7 2A321E LHLD DOBUFP ;STORE CHAR AT POINTER 12BA 77 MOV M,A 12BB 23 INX H ;INCREMENT POINTER 12BC 22321E SHLD DOBUFP 12BF E1 POP H 12C0 C9 RET ;; FLUSH - FLUSH BUFFER TO DEST. FILE ; 12C1 E5 FLUSH: PUSH H 12C2 D5 PUSH D 12C3 3E1A MVI A,1AH ;INSURE AT LEAST ONE EOF CHAR 12C5 CD9E12 CALL WACD 12C8 2A321E LHLD DOBUFP ;FETCH POINTER 12CB 3A311E LDA DOBUFC ;FETCH COUNT 12CE FE80 FLUSH1: CPI 128 ;JUMP IF BUFFER FILL 12D0 CADA12 JZ FLUSH2 12D3 361A MVI M,1AH ;INSERT ANOTHER EOF CHAR 12D5 23 INX H ;BUMP POINTER 12D6 3C INR A ;INCREMENT COUNT 12D7 C3CE12 JMP FLUSH1 ;LOOP 12DA CDEC12 FLUSH2: CALL WRREC ;WRITE BUFFER TO FILE 12DD 115C00 LXI D,TFCB ;CLOSE FILE 12E0 CDD311 CALL CLOSE 12E3 D1 POP D ;EXIT 12E4 E1 POP H 12E5 C9 RET ;; WRREC - WRITE NEXT RECORD TO DEST. FILE ; 12E6 E5 WRREC2: PUSH H 12E7 D5 PUSH D 12E8 C5 PUSH B 12E9 C3F212 JMP WRREC1 12EC E5 WRREC: PUSH H 12ED D5 PUSH D 12EE C5 PUSH B 12EF 11341E LXI D,DOBUF 12F2 0E1A WRREC1: MVI C,SAFC 12F4 CD0500 CALL ENTRY 12F7 115C00 LXI D,TFCB 12FA 0E15 MVI C,WRFC 12FC CD0500 CALL ENTRY 12FF F5 PUSH PSW 1300 118000 LXI D,80H 1303 0E1A MVI C,SAFC 1305 CD0500 CALL ENTRY 1308 F1 POP PSW 1309 C1 POP B 130A D1 POP D 130B E1 POP H 130C C9 RET ;; RASM - READ ASCII STRING FROM MODEM ; 130D E5 RASM: PUSH H 130E D5 PUSH D 130F C5 PUSH B 1310 3A321F LDA IBUF 1313 47 MOV B,A 1314 0E00 MVI C,0 ;CLEAR CURRENT STRING LENGTH 1316 21341F LXI H,IBUF+2 1319 CD9614 RASM1: CALL RACM ;READ ASCII CHAR FROM MODEM 131C CDC414 CALL WACM 131F E67F ANI 7FH 1321 CD8914 CALL XWACC 1324 CD3C15 CALL CLC 1327 FE0D CPI CR ;JUMP IF CR 1329 CA6613 JZ RASM4 132C FE08 CPI 'H'-40H ;JUMP IF NOT BACKSPACE 132E C24113 JNZ RASM2 1331 0C INR C ;IGNORE IF AT START OF LINE 1332 0D DCR C 1333 CA1913 JZ RASM1 1336 0D DCR C ;DECREMENT COUNT 1337 2B DCX H ;DECREMENT POINTER 1338 CDC414 CALL WACM ;ECHO BS TO MODEM 133B CD8914 CALL XWACC 133E C31913 JMP RASM1 ;LOOP UNTIL CR 1341 FE15 RASM2: CPI 'U'-40H ;JUMP IF NOT CTRL-U 1343 C25E13 JNZ RASM3 1346 3E0D MVI A,CR ;WRITE END OF LINE TO MODEM 1348 CDC414 CALL WACM 134B CD8914 CALL XWACC 134E 3E0A MVI A,LF 1350 CDC414 CALL WACM 1353 CD8914 CALL XWACC 1356 21341F LXI H,IBUF+2 ;RESET INPUT BUFFER 1359 0E00 MVI C,0 135B C31913 JMP RASM1 135E 77 RASM3: MOV M,A ;STORE CHAR IN BUFFER 135F 23 INX H ;INCREMENT POINTER 1360 0C INR C ;INCREMENT COUNT 1361 79 MOV A,C 1362 B8 CMP B ;LOOP IF STILL ROOM 1363 DA1913 JC RASM1 1366 79 RASM4: MOV A,C ;SAVE BUFFER COUNT 1367 32331F STA IBUF+1 136A 21341F LXI H,IBUF+2 ;RESET INPUT BUFFER POINTER 136D 22301F SHLD IBUFP 1370 C1 POP B 1371 D1 POP D 1372 E1 POP H 1373 C9 RET ;; RASC - READ ASCII STRING FROM CONSOLE ; 1374 E5 RASC: PUSH H 1375 D5 PUSH D 1376 C5 PUSH B 1377 11321F LXI D,IBUF 137A 0E0A MVI C,RSFC 137C CD0500 CALL ENTRY 137F 21341F LXI H,IBUF+2 ;RESET INPUT BUFFER POINTER 1382 22301F SHLD IBUFP 1385 C1 POP B 1386 D1 POP D 1387 E1 POP H 1388 C9 RET ;; GNC - GET NEXT CHARACTER FROM IBUF ; ; ENTRY CONDITIONS ; ; IBUFP POINTS TO NEXT CHAR IN IBUF ; ; IBUFC CONTAINS # OF CHARS LEFT ; ; EXIT CONDITIONS ; ; IBUFP INCREMENTED BY ONE ; ; IBUFC DECREMENTED BY ONE ; ; A RETURNED CHARACTER ; ; C-FLAG SET IF END OF LINE 1389 3A331F GNC: LDA IBUFC ;JUMP IF IBUFC > 0 138C B7 ORA A 138D C29213 JNZ GNC1 1390 37 STC ;ELSE SET EOL FLAG, EXIT 1391 C9 RET 1392 3D GNC1: DCR A ;DECREMENT IBUFC 1393 32331F STA IBUFC 1396 E5 PUSH H 1397 2A301F LHLD IBUFP ;FETCH POINTER 139A 7E MOV A,M ;GET CHAR AT POINTER 139B 23 INX H ;INCREMENT POINTER 139C 22301F SHLD IBUFP 139F E1 POP H 13A0 37 STC ;CLEAR EOL FLAG, EXIT 13A1 3F CMC 13A2 C9 RET ;; CCA - CHECK FOR CONSOLE ACTIVITY ; ; EXIT CONDITIONS ; ; A CHARACTER READ, IF ANY ; ; C-FLAG SET IF CHARACTER FOUND 13A3 E5 CCA: PUSH H 13A4 D5 PUSH D 13A5 C5 PUSH B 13A6 CD031D CALL CONST 13A9 0F RRC 13AA D2B113 JNC CCAX 13AD CD061D CALL CONIN 13B0 37 STC 13B1 C1 CCAX: POP B 13B2 D1 POP D 13B3 E1 POP H 13B4 C9 RET ;; WDWC - WRITE DECIMAL WORD TO CONSOLE ; ; ENTRY CONDITIONS ; ; HL VALUE TO WRITE IN DECIMAL 13B5 E5 WDWC: PUSH H 13B6 D5 PUSH D 13B7 C5 PUSH B 13B8 0E00 MVI C,0 ;CLEAR 'DIGIT PRINTED' FLAG 13BA 111027 LXI D,10000 ;WRITE TEN THOUSANDS DIGIT 13BD CDDE13 CALL WNDC 13C0 11E803 LXI D,1000 ;WRITE THOUSANDS DIGIT 13C3 CDDE13 CALL WNDC 13C6 116400 LXI D,100 ;WRITE HUNDREDS DIGIT 13C9 CDDE13 CALL WNDC 13CC 110A00 LXI D,10 ;WRITE TENS DIGIT 13CF CDDE13 CALL WNDC 13D2 110100 LXI D,1 ;WRITE UNITS DIGIT 13D5 0E01 MVI C,1 ;FORCE UNITS DIGIT TO PRINT 13D7 CDDE13 CALL WNDC 13DA C1 POP B 13DB D1 POP D 13DC E1 POP H 13DD C9 RET ;; WNDC - WRITE NEXT DIGIT TO CONSOLE ; ; ENTRY CONDITIONS ; ; HL VALUE TO PRINT NEXT DIGIT OF ; ; DE DECIMAL ORDER OF MAGNITUDE ; ; C ZERO MEAN LEADING DIGIT NOT YET PRINTED ; ; EXIT CONDITIONS ; ; HL OLD.HL - (OLD.HL / DE) * DE ; ; C SET IF DIGIT PRINTED 13DE 0600 WNDC: MVI B,0 ;CLEAR COUNT 13E0 7D WNDC1: MOV A,L ;HL = HL - DE 13E1 93 SUB E 13E2 6F MOV L,A 13E3 7C MOV A,H 13E4 9A SBB D 13E5 67 MOV H,A 13E6 DAED13 JC WNDC2 ;BRANCH IF HL < 0 13E9 04 INR B ;ELSE INCREMENT COUNT 13EA C3E013 JMP WNDC1 ;AND LOOP 13ED 19 WNDC2: DAD D ;ADD DE BACK IN ONCE 13EE 78 MOV A,B ;GET COUNT 13EF B7 ORA A 13F0 C2FD13 JNZ WNDC3 ;JUMP IF NON-ZERO 13F3 0C INR C ;JUMP IF DIGIT PRINTED ALREADY 13F4 0D DCR C 13F5 C2FD13 JNZ WNDC3 13F8 3E20 MVI A,' ' ;PRINT A BLANK AND EXIT 13FA C35A14 JMP WACC 13FD 0E01 WNDC3: MVI C,1 ;SET 'DIGIT PRINTED' FLAG 13FF C630 ADI '0' ;WRITE DIGIT IN ASCII 1401 C35A14 JMP WACC ;; WHBC - WRITE HEX BYTE TO CONSOLE ; ; ENTRY CONDITIONS ; ; A BYTE TO WRITE IN HEX 1404 F5 WHBC: PUSH PSW 1405 0F RRC 1406 0F RRC 1407 0F RRC 1408 0F RRC 1409 CD0D14 CALL WHDC 140C F1 POP PSW 140D F5 WHDC: PUSH PSW 140E E60F ANI 0FH 1410 FE0A CPI 10 1412 DA1714 JC $+5 1415 C607 ADI 7 1417 C630 ADI '0' 1419 CD5A14 CALL WACC 141C F1 POP PSW 141D C9 RET ;; WASC - WRITE ASCII STRING TO CONSOLE ; ; ENTRY CONDITIONS ; ; HL FWA OF STRING, TERM. BY ZERO BYTE 141E 0E00 WASC: MVI C,0 1420 7E WASC1: MOV A,M 1421 B7 ORA A 1422 C8 RZ 1423 23 INX H 1424 FE09 CPI TAB 1426 C23814 JNZ WASC3 1429 3E20 WASC2: MVI A,' ' 142B CD5A14 CALL WACC 142E 0C INR C 142F 79 MOV A,C 1430 E607 ANI 7 1432 C22914 JNZ WASC2 1435 C32014 JMP WASC1 1438 CD5A14 WASC3: CALL WACC 143B 0C INR C 143C FE0A CPI LF 143E C22014 JNZ WASC1 1441 0E00 MVI C,0 1443 C32014 JMP WASC1 ;; WEOLC - WRITE END OF LINE TO CONSOLE ; 1446 3E0D WEOLC: MVI A,CR 1448 CD5A14 CALL WACC 144B 3E0A MVI A,LF 144D C35A14 JMP WACC ;; WSPC - WRITE SPACES TO CONSOLE ; 1450 3E20 WSPC: MVI A,' ' ;BLANK 1452 CD5A14 WSPCS: CALL WACC 1455 05 DCR B 1456 C25214 JNZ WSPCS 1459 C9 RET ;; WACC - WRITE ASCII CHARACTER TO CONSOLE ; ; ENTRY CONDITIONS ; ; A CHARACTER TO WRITE 145A E5 WACC: PUSH H 145B D5 PUSH D 145C C5 PUSH B 145D F5 PUSH PSW 145E 47 MOV B,A 145F 3AA91D LDA COF 1462 B7 ORA A 1463 C26D14 JNZ WACC1 1466 48 MOV C,B 1467 CD091D CALL CONOUT 146A C38414 JMP WACC3 146D 3D WACC1: DCR A 146E C27C14 JNZ WACC2 1471 78 MOV A,B 1472 CDC414 CALL WACM 1475 48 MOV C,B 1476 CD091D CALL CONOUT 1479 C38414 JMP WACC3 147C 3D WACC2: DCR A 147D C28414 JNZ WACC3 1480 78 MOV A,B 1481 CD9E12 CALL WACD 1484 F1 WACC3: POP PSW 1485 C1 POP B 1486 D1 POP D 1487 E1 POP H 1488 C9 RET ;; XWACC - GO DIRECTLY TO CONSOLE ; 1489 E5 XWACC: PUSH H 148A D5 PUSH D 148B C5 PUSH B 148C F5 PUSH PSW 148D 4F MOV C,A 148E CD091D CALL CONOUT 1491 F1 POP PSW 1492 C1 POP B 1493 D1 POP D 1494 E1 POP H 1495 C9 RET ;; RACM - READ ASCII CHAR FROM MODEM (WITH OPTIONAL TIMEOUT) ; ; ENTRY CONDITIONS ; ; TIME MILLISECONDS BEFORE TIMEOUT (FFFF=INF.) ; ; EXIT CONDITIONS ; ; A CHARACTER READ (ALL 8 BITS) ; ; C-FLAG SET IF TIMEOUT ; ; TOC NUMBER OF MILLISECONDS REMAINING 1496 E5 RACM: PUSH H 1497 2AE61F LHLD TIME ;RESET TIMEOUT COUNT 149A 22E41F SHLD TOC 149D DB81 RACM1: IN MSTAT ;JUMP IF DATA AVAILABLE 149F E601 ANI RRF 14A1 C2BE14 JNZ RACM2 14A4 2AE41F LHLD TOC ;LOOP IF INF. TIMEOUT 14A7 23 INX H 14A8 7C MOV A,H 14A9 B5 ORA L 14AA CA9D14 JZ RACM1 14AD 2B DCX H 14AE CDF814 CALL WAIT1 ;WAIT ANOTHER MILLISECOND 14B1 2B DCX H ;DECREMENT COUNT 14B2 22E41F SHLD TOC 14B5 7C MOV A,H ;LOOP IF STILL NON-ZERO 14B6 B5 ORA L 14B7 C29D14 JNZ RACM1 14BA E1 POP H 14BB AF XRA A ;RETURN NULL CHAR 14BC 37 STC ;SET TIMEOUT FLAG 14BD C9 RET 14BE DB80 RACM2: IN MDATA ;READ DATA FROM MODEM 14C0 E1 POP H 14C1 37 STC ;CLEAR TIMEOUT FLAG 14C2 3F CMC 14C3 C9 RET ;; WACM - WRITE ASCII CHAR TO MODEM ; ; ENTRY CONDITIONS ; ; A CHARACTER TO WRITE (ALL 8 BITS) 14C4 F5 WACM: PUSH PSW 14C5 DB81 WACM1: IN MSTAT 14C7 E602 ANI TRE 14C9 CAC514 JZ WACM1 14CC F1 POP PSW 14CD D380 OUT MDATA 14CF C9 RET ;; CJV - CREATE (BIOS) JUMP VECTOR ; 14D0 2A0100 CJV: LHLD 0001H ;HL = FWA OF REAL VECTOR 14D3 2B DCX H 14D4 2B DCX H 14D5 2B DCX H 14D6 11FD1C LXI D,BOOT ;FWA OF LOCAL VECTOR 14D9 012700 LXI B,13*3 ;NUMBER OF BYTES TO MOVE 14DC C3DF14 JMP MOVE ;COPY REAL VECTOR INTO LOCAL ONE ;; MOVE - MOVE BLOCK OF MEMORY ; ; ENTRY CONDITIONS ; ; HL FWA OF SOURCE BLOCK ; ; DE FWA OF DESTINATION AREA ; ; BC NUMBER OF BYTES TO MOVE 14DF 78 MOVE: MOV A,B 14E0 B1 ORA C 14E1 C8 RZ 14E2 7E MOV A,M 14E3 23 INX H 14E4 12 STAX D 14E5 13 INX D 14E6 0B DCX B 14E7 C3DF14 JMP MOVE ;; WAIT50 - WAIT 50 MS ; 14EA F5 WAIT50: PUSH PSW 14EB E5 PUSH H 14EC 21D80A LXI H,2776 14EF 2B WAIT51: DCX H 14F0 7C MOV A,H 14F1 B5 ORA L 14F2 C2EF14 JNZ WAIT51 14F5 E1 POP H 14F6 F1 POP PSW 14F7 C9 RET ;; WAIT1 - WAIT 1 MS ; 14F8 F5 WAIT1: PUSH PSW 14F9 E5 PUSH H 14FA 213700 LXI H,55 14FD 2B WAIT11: DCX H 14FE 7C MOV A,H 14FF B5 ORA L 1500 C2FD14 JNZ WAIT11 1503 E1 POP H 1504 F1 POP PSW 1505 C9 RET ;; CR1ON - TURN ON BIT(S) ON MODEM CONTROL REG. ONE ; ; ENTRY CONDITIONS ; ; B ONES IN POSITIONS TO TURN ON 1506 F5 CR1ON: PUSH PSW 1507 3AAA1D LDA CR1 150A B0 ORA B 150B 32AA1D STA CR1 150E D381 OUT MSTAT 1510 F1 POP PSW 1511 C9 RET ;; CR1OFF - TURN BIT(S) OFF ON MODEM CONTROL REG. ONE ; ; ENTRY CONDITIONS ; ; B ONES IN POSITIONS TO TURN OFF 1512 F5 CR1OFF: PUSH PSW 1513 78 MOV A,B 1514 2F CMA 1515 47 MOV B,A 1516 3AAA1D LDA CR1 1519 A0 ANA B 151A 32AA1D STA CR1 151D D381 OUT MSTAT 151F F1 POP PSW 1520 C9 RET ;; CR2ON - TURN ON BIT(S) ON MODEM CONTROL REG. TWO ; ; ENTRY CONDITIONS ; ; B ONES IN POSITIONS TO TURN ON 1521 F5 CR2ON: PUSH PSW 1522 3AAB1D LDA CR2 1525 B0 ORA B 1526 32AB1D STA CR2 1529 D382 OUT MCTRL 152B F1 POP PSW 152C C9 RET ;; CR2OFF - TURN BIT(S) OFF ON MODEM CONTROL REG. TWO ; ; ENTRY CONDITIONS ; ; B ONES IN POSITIONS TO TURN OFF 152D F5 CR2OFF: PUSH PSW 152E 78 MOV A,B 152F 2F CMA 1530 47 MOV B,A 1531 3AAB1D LDA CR2 1534 A0 ANA B 1535 32AB1D STA CR2 1538 D382 OUT MCTRL 153A F1 POP PSW 153B C9 RET ;; CLC - CONVERT LOWER CASE (TO UPPER CASE) ; ; ENTRY CONDITIONS ; ; A CHARACTER TO CONVERT 153C FE61 CLC: CPI 'A'+20H 153E D8 RC 153F FE7B CPI 'Z'+20H+1 1541 D0 RNC 1542 D620 SUI 20H 1544 C9 RET 1545 434C494E4BMSG0: DB 'CLINK V3.0',CR,LF,0 1552 46494C4520MSG1: DB 'FILE NOT FOUND',CR,LF,0 1563 4449524543MSG2: DB 'DIRECTIVE ERROR',CR,LF,0 1575 4E4F204341MSG3: DB 'NO CARRIER DETECTED',CR,LF,0 158B 4341525249MSG4: DB 'CARRIER LOST',CR,LF,0 159A 4E4F572044MSG5: DB 'NOW DIALING ',0 15A7 4C494E4B20MSG7: DB 'LINK TERMINATED',CR,LF,0 15B9 4C494E4B20MSG8: DB 'LINK INTERRUPTED, CARRIER STILL PRESENT',CR,LF,0 15E3 4341525249MSG9: DB 'CARRIER ALREADY PRESENT, LINK RESUMED',CR,LF,0 160B 0D0A434F4DMSG10: DB CR,LF,'COMMAND>',0 1616 2050415249MSG11: DB ' PARITY ERRORS',CR,LF,0 1627 204F564552MSG12: DB ' OVERRUN ERRORS',CR,LF,0 1639 204652414DMSG13: DB ' FRAME ERRORS',CR,LF,0 1649 454E544552MSG14: DB 'ENTER DIRECTIVES - END WITH EMPTY LINE',CR,LF,0 1672 205452414EMSG15: DB ' TRANSMISSION ERRORS',CR,LF,0 1689 4D454D4F52MSG16: DB 'MEMORY BUFFER EMPTY',CR,LF,0 169F 4449534B20MSG17: DB 'DISK FULL',CR,LF,0 16AB 5752495445MSG18: DB 'WRITE ERROR',CR,LF,0 16B9 0707070D0AMSG19: DB BEL,BEL,BEL,CR,LF,'*** MEMORY OVERFLOW ***',CR,LF,0 16D8 20207C2020MSG20: DB ' | ',0 16DE 4E4F4E450DMSG21: DB 'NONE',CR,LF,0 16E5 4556454E0DMSG22: DB 'EVEN',CR,LF,0 16EC 4F4444200DMSG23: DB 'ODD ',CR,LF,0 16F3 4F52494749MSG24: DB 'ORIGINATE',CR,LF,0 16FF 414E535745MSG25: DB 'ANSWER',CR,LF,0 1708 46554C4C00MSG26: DB 'FULL',0 170D 48414C4600MSG27: DB 'HALF',0 1712 3131300D0AMSG28: DB '110',CR,LF,0 1718 3330300D0AMSG29: DB '300',CR,LF,0 171E 4F4E2000 MSG30: DB 'ON ',0 1722 4F464600 MSG31: DB 'OFF',0 1726 46494C4520MSG32: DB 'FILE TRANSMITTED',CR,LF,0 1739 46494C4520MSG33: DB 'FILE RECEIVED',CR,LF,0 1749 5245545241MSG34: DB 'RETRANSMITTING',CR,LF,0 175A 54494D454FMSG35: DB 'TIMEOUT OCCURED',CR,LF,0 176C 494E56414CMSG36: DB 'INVALID CRC',CR,LF,0 177A 554E4B4E4FMSG37: DB 'UNKNOWN MESSAGE TYPE',CR,LF,0 1791 53454E4420MSG38: DB 'SEND ABORTED',CR,LF,0 17A0 48454C5020HMSG0: DB 'HELP FOR CLINK IS AVAILABLE UNDER 3 HEADINGS,',CR,LF 17CF 414E44204D DB 'AND MAY BE ACCESSED BY THE COMMAND HELP N ',CR,LF 17FE 5748455245 DB 'WHERE N IS AN INTEGER FROM 1 TO 3 AS FOLLOWS:',CR,LF 182D 0D0A DB CR,LF 182F 2020202020 DB ' 1 - TERMINAL CONFIGURATION DIRECTIVES',CR,LF 185B 2020202020 DB ' 2 - LOCAL COMMANDS',CR,LF 1874 2020202020 DB ' 3 - ASR FILE TRANSMISSION/RECEPTION',CR,LF 189E 00 DB 0 189F 5349544509HMSG1: DB 'SITE NAME OF REMOTE SITE',CR,LF 18BB 50484F4E45 DB 'PHONE NUMBER OF REMOTE SITE',CR,LF 18DA 4241554409 DB 'BAUD 300,110 SET BAUD RATE',CR,LF 18F7 5041524954 DB 'PARITY EVEN,ODD,NONE SET PARITY',CR,LF 1918 4442495453 DB 'DBITS 7,8 SET # OF DATA BITS',CR,LF 1937 5342495453 DB 'SBITS 1,2 SET NUMBER OF STOP BITS',CR,LF 195B 4D4F444509 DB 'MODE ORIG,ANS SET CARRIER FREQS, ETC.',CR,LF 1982 4455504C45 DB 'DUPLEX FULL,HALF REMOTE/LOCAL ECHO',CR,LF 19A6 4155544F4C DB 'AUTOLF OFF,ON AUTO LF AFTER RCVD CR',CR,LF 19CC 4341505309 DB 'CAPS OFF,ON AUTO LC TO UC TRANSLATION',CR,LF 19F4 4553434150 DB 'ESCAPE (HEX VALUE) SET LOCAL ESCAPE CODE',CR,LF 1A1E 52454D4553 DB 'REMESC (HEX VALUE) SET REMOTE ESCAPE CODE',CR,LF 1A49 4552524F52 DB 'ERROR (HEX VALUE) SET ERROR SUBST. CODE',CR,LF 1A72 425245414B DB 'BREAK (HEX VALUE) SET BREAK TRIGGER CODE',CR,LF 1A9C 00 DB 0 1A9D 5245545552HMSG2: DB 'RETURN RETURN TO CP/M',CR,LF 1AB6 41424F5254 DB 'ABORT DISCONNECT, RETURN TO CP/M',CR,LF 1ADA 4552524F52 DB 'ERROR SUMMARY REQUEST ERROR SUMMARY',CR,LF 1B00 5245534554 DB 'RESET CLEAR ERROR COUNTS',CR,LF 1B1C 4445425547 DB 'DEBUG OFF,ON HEX DISPLAY OF RCVD DATA',CR,LF 1B44 4C49535409 DB 'LIST LIST CURRENT CONFIGURATION',CR,LF 1B67 5341564509 DB 'SAVE D:FN.FT SAVE CONFIGURATION ON FILE',CR,LF 1B91 4449520941 DB 'DIR AFN SAME AS CP/M DIR COMMAND',CR,LF 1BB4 00 DB 0 1BB5 4341505455HMSG3: DB 'CAPTURE START CAPTURING RCVD DATA',CR,LF 1BDA 5752495445 DB 'WRITE D:FN.FT WRITE CAPTURED DATA TO FILE',CR,LF 1C06 5245414409 DB 'READ D:FN.FT READ FILE, SEND TO MODEM',CR,LF 1C2E 4741524241 DB 'GARBAGE (HEX VALUE) IGNORE N CHARS AFTER LF',CR,LF 1C5B 455850414E DB 'EXPAND OFF,ON EXPAND TABS DURING READ',CR,LF 1C83 53454E4409 DB 'SEND D:FN.FT TRANSMIT FILE WITH PROTOCOL',CR,LF 1CAE 5245435609 DB 'RECV D:FN.FT RECEIVE FILE WITH PROTOCOL',CR,LF 1CD8 424C4F434B DB 'BLOCK N SET MESSAGE SIZE IN PAGES',CR,LF 1CFC 00 DB 0 ; LOCAL BIOS JUMP VECTOR 1CFD BOOT: DS 3 1D00 WBOOT: DS 3 1D03 CONST: DS 3 1D06 CONIN: DS 3 1D09 CONOUT: DS 3 1D0C LIST: DS 3 1D0F PUNCH: DS 3 1D12 READER: DS 3 1D15 HOME: DS 3 1D18 SELDSK: DS 3 1D1B SETTRK: DS 3 1D1E READ: DS 3 1D21 WRITE: DS 3 ; SCRATCH RAM AREA 1D24 OLDSP: DS 2 ;ENTRY STACK POINTER 1D26 STACK: DS 128 ;LOCAL STACK 1DA6 SIZE: DS 2 ;SCRATCH LOCATION 1DA8 CCPF: DS 1 ;CCP OVERWRITE FLAG 1DA9 COF: DS 1 ;CONSOLE OUTPUT FLAG (FOR WACC) 1DAA CR1: DS 1 ;CONTROL REGISTER ONE (BUFFER) 1DAB CR2: DS 1 ;CONTROL REGISTER TWO (BUFFER) 1DAC CCHAR: DS 1 ;CONSOLE CHARACTER BUFFER 1DAD MCHAR: DS 1 ;MODEM CHARACTER BUFFER 1DAE DIBUFC: DS 1 ;DISK INPUT BUFFER COUNT 1DAF DIBUFP: DS 2 ;DISK INPUT BUFFER POINTER 1DB1 DIBUF: DS 128 ;DISK INPUT BUFFER 1E31 DOBUFC: DS 1 ;DISK OUTPUT BUFFER COUNT 1E32 DOBUFP: DS 2 ;DISK OUTPUT BUFFER POINTER 1E34 DOBUF: DS 128 ;DISK OUTPUT BUFFER 1EB4 SITEL: DS 1 ;LENGTH OF 'SITE' STRING 1EB5 SITE: DS 80 ;SITE STRING 1F05 PHONEL: DS 1 ;LENGTH OF PHONE STRING 1F06 PHONE: DS 20 ;PHONE STRING 1F1A MODE: DS 1 ;MODE - 'A'=ANSWER 'O'=ORIGINATE 1F1B ECHO: DS 1 ;FULL/HALF DUPLEX FLAG 1F1C AUTOLF: DS 1 ;AUTO LINE-FEED FLAG 1F1D CAPS: DS 1 ;CAPS LOCK FLAG 1F1E ESCAPE: DS 1 ;ESCAPE CODE 1F1F REMESC: DS 1 ;REMOTE ESCAPE CODE 1F20 DEBUG: DS 1 ;DEBUG FLAG 1F21 DEBUGC: DS 1 ;DEBUG COUNT 1F22 ERROR: DS 1 ;ERROR CODE 1F23 GARBAGE: DS 1 ;NUMBER OF GARBAGE CHARS TO IGNORE 1F24 EXPAND: DS 1 ;TAB EXPANSION FLAG 1F25 CAPTURE: DS 1 ;CAPTURE FLAG 1F26 BREAK: DS 1 ;BREAK TRIGGER 1F27 COL: DS 1 ;COLUMN COUNTER FOR TAB EXPANSION 1F28 PERR: DS 2 ;PARITY ERROR COUNT 1F2A OERR: DS 2 ;OVERRUN ERROR COUNT 1F2C FERR: DS 2 ;FRAME ERROR COUNT 1F2E TERR: DS 2 ;TRANSMISSION ERROR COUNT 0096 = IBUFL EQU 150 ;INPUT BUFFER LENGTH 1F30 IBUFP: DS 2 ;INPUT BUFFER POINTER 1F32 IBUF: DS IBUFL+2 ;INPUT BUFFER 1F33 = IBUFC: EQU IBUF+1 ;INPUT BUFFER COUNT 1FCA KWBUF: DS 10 ;KEYWORD BUFFER 1FD4 MBUFP: DS 2 ;MEMORY BUFFER POINTER 1FD6 MAXADR: DS 2 ;MAX MEMORY BUFFER ADDRESS 1FD8 CCPADR: DS 2 ;FIRST WORD ADDRESS OF CCP 1FDA EOF: DS 1 ;END OF FILE FLAG 1FDB OCNT: DS 2 ;OUTPUT MESSAGE COUNT 1FDD OCODE: DS 1 ;OUTPUT MESSAGE TYPE 1FDE ICNT: DS 2 ;INPUT MESSAGE COUNT 1FE0 ICODE: DS 1 ;INPUT MESSAGE TYPE 1FE1 CRC: DS 2 ;CYCLIC REDUNDANY CHECK 1FE3 BLKSZ: DS 1 ;BLOCK SIZE FOR SEND 1FE4 TOC: DS 2 ;TIMEOUT COUNTER 1FE6 TIME: DS 2 ;TIMEOUT INITIAL VALUE 2000 ORG ($+127)/128*128 2000 = MBUF EQU $ ;START OF MEMORY BUFFER 2400 = MBUF2 EQU MBUF+1024 ;START OF SECOND BUFFER 2000 0000 DW 00H 2002 END CLINK