xD COM =(KERNEL ASM KERNEL COM'PACKET89COMPACKET89DOC hvPROTOCOLDTASWEEP COM:) !91ͨ>?2h 2<!m~ gN:>2>g~NJ>2>a0a g#WyGO<Y 2=!\~=z:=_<2tt<tͨDisk:t@ͽͨ: ͨ Label:"ͨDirectory of disk:t@ͽͨͺ##~===###^#V"E###~2K!#)=}2L~@*I"IG*G"G*E+"E|^2#.͛*G:Kto"G!]~ ‰ 6?#‚\<¤\<$=!o ~ :A G #   ~ ~#Ø*?w#"?:A<2AØ:A2B:>|!s#r# =::A2C=|2D:C=22C|! ##:=2c:DO!"?:>ʑ!"?:>ʦ*?"?ð*?^#V#"?*Sͮͻ ~o&)))):L=Gx/Go$N ͣdͣͣͮy>Kͽ:A=2A:M<2MPͨY73Press RETURN to see more files.. l2M2Rͺ!U"SÑ ‘ͨY":R<2R!V=ʵ!`=ʵ!e"SÑ>._ ~ͨͽͨ#> ͽ> ͽ^#V#N#F #>2DN#F#^q#Vpr+sͨY7:Bo&yͨ Files. Used =*GyͨK. Free =*IyͨK.Y6:=_:<_  ڂ |y{0ͽ|/g}/o#}|ͮ~ͽ#ʮͨY! Jͨaaaaaaaaaaaaaaaaaa>sͽͨ ` ` ͨaaaaaaaaaaaaaaaaaa2>uͽͨGY" U CCC CCCIDENT SYS; PACKET89.ASM ; Derived 12/15/89 from the MODEM Controller, MPLINK ; (H19/H89 version of 7/1/81) ; ;PLINK IS A CP/M TRANSIENT COMMAND WHICH ALLOWS THE USER TO ;ESTABLISH A COMMUNICATIONS LINK WITH A REMOTE COMPUTER ; ; ORIGINAL BY L.E. HUGHES EDCAM JULY, 1977 ; ; WITH HEATH EQUATES ADDED BY TOM JORGENSON. ; Optional Triger characters by Steve Vinokuroff. ; ; Revised by Ray Isenson, N6UEto interface pacet NCN and ; give control of the Lineprinter to the BDOS (12/89) ; ;This version is modified to use the H19/H89 special function keys. ;It will run on a non-Heath CPU using the H19 terminal; however, if ;such a system is used, the following equate should be set to zero: ; H8ORH89 EQU 1 ;IF H8 OR H89 COMPUTER SET TO 1 ; ; ;PLINK CURRENTLY SUPPORTS TWO WAY TRANSFER OF TEXT FILES ;BETWEEN THE CP/M DISK AND THE REMOTE COMPUTER. THE FOLLOWING ;CONTROL CODES MAY BE INITIATED FROM THE CONSOLE KEYBOARD: ; ; **************************************************** ; * COMMANDS: * ; * * ; * F1 KEY SAVE INCOMING ASCII IN RAM BUFFER * ; * FOR LATER TRANSFER TO DISK * ; * F2 KEY WRITE RAM BUFFER TO DISK - ASKS * ; * FOR DRIVE AND FILENAME.TYP * ; * F3 KEY TRANSMIT ASCII FILE TO MODEM. * ; * ASKS FOR DRIVE AND FILENAME.TYP * ; * F4 KEY AUTO LOGON * ; * F5 KEY COPY TO PRINTER SWITCH * ; * RED KEY EXIT PLINK TO CP/M WARM BOOT * ; * CONTROL-C ABORT FILE SEND TO MODEM * ; * DELETE BACKSPACE WHEN IN COMMAND MODE * ; * ASKING FOR FILENAME * ; * BACKSPACE SAME AS DELETE * ; * CONTROL-U ABORT CURRENT LINE WHEN IN COMMAND * ; * MODE ASKING FOR FILENAME * ; * * ; **************************************************** ; ; ;SET NUMBER OF DRIVES FOR PARTICULAR SYSTEM ; E.G. 2 = A,B 5 = A,B,C,D,E ; NUMDRV EQU 5 ;ALLOW A: AND B: ONLY ; ; ;BDOS ENTRY POINT AND FUNCTION CODES ; BASE SET 0 ;STANDARD CPM ; BDOS EQU BASE+5 RESDSK EQU 13 ;RESET DISK SYSTEM OFFC EQU 15 ;OPEN FILE CFFC EQU 16 ;CLOSE FILE DFFC EQU 19 ;DELETE FILE RRFC EQU 20 ;READ RECORD WRFC EQU 21 ;WRITE RECORD MFFC EQU 22 ;MAKE FILE LSTOUT EQU 5 ;PRINTER OUTPUT ; ;DEFAULT FCB AND FIELD DEFINITIONS ; FCB EQU BASE+5CH FN EQU 1 ;FILE NAME FIELD (REL) FT EQU 9 ;FILE TYPE FIELD (REL) EX EQU 12 ;FILE EXTENT FIELD (REL) NR EQU 32 ;NEXT RECORD FIELD (REL) DBUF EQU BASE+80H ;DEFAULT DISK BUFFER ADDRESS ; ;ASCII CONTROL CHARACTERS ; CR EQU 0DH ;CARRIAGE RETURN LF EQU 0AH ;LINE FEED DEL EQU 7FH ;DELETE (RUBOUT) BELL EQU 07H ;BELL SIGNAL TAB EQU 09H ;HORIZONTAL TAB XON EQU 11H ;X-ON CHARACTER NULL EQU 00H ;NULL CHAR ESC EQU 1BH ;ESCAPE BL EQU 20H ;BLANK (SPACE) ; ; ;SPECIAL HEATH ONLY BIOS EQUATES ; TICCNT EQU 0BH ;2 MSEC COUNTER ; ; ;THE FOLLOWING "TRIGER" EQUATE IS SET TO "LF" (LINEFEED) ;BY DEFAULT. AN OPTIONAL TRIGER CHAR MAY BE PASSED VIA FCB1 ; ; IE: KERNEL B WILL SET TRIGER TO "BELL" ; ;THE FOLLOWING OPTIONS ARE ALLOWED ; ; 1. B = BELL 07H ; 2. X = XON 11H ; 3. U = UPLOAD NO TRIGER CHECK AT ALL ;ANY OTHER ASCII CHARACTER MAY BE PASSED THROUGH FCB1 ; ; TRIGER EQU LF ;DEFAULT VALUE ; ; ;WARNING CHARACTER FOR LOW MEMORY ; WRNSIG EQU BELL ;IF YOU HAVE ONE, PUT 'BELL' HERE ;...ELSE PUT '*' HERE. ; ;MODEM I/O PORT ADDRESSES ; MODD EQU 330Q ;MODEM BASE PORT MODS EQU MODD+5 ;MODEM STATUS PORT ; ; ;MODEM STATUS PORT BIT DEFINITIONS ; MTBE EQU 20H ;TRANSMITTER READY FLAG MRDA EQU 1H ;RECEIVER READY FLAG MXOR EQU 21H ;TO COMPLEMENT MTBE AND MRDA ; ; **MAIN PROGRAM** ; ORG BASE+100H ; ; LINK: CALL INIT ;INITIALIZE ; ; MAIN LOOP ; LINK3: CALL CITEST ;JUMP IF NO DATA FROM CONSOLE JZ LINK4 CALL RCC ;ELSE READ CONSOLE DATA CPI ESC CZ PCC ;CALL PCC IF ESC (FUNCTION KEY) JZ LINK4 ;JUMP IF PCC HANDLED CHAR ORI 80H ;ELSE SET VALID DATA BIT STA INCH ;AND STORE IN INPUT CHAR BUFFER LINK4: LDA OUTCH ;JUMP IF NO DATA FOR CONSOLE ORA A JP LINK5 ANI 7FH ;ELSE DISCARD VALID DATA BIT CALL WCC ;SEND CHAR TO CONSOLE XRA A ;THEN CLEAR OUTPUT CHAR BUFFER STA OUTCH LINK5: CALL MITEST ;JUMP IF NO DATA FROM MODEM JZ LINK6 CALL RMC2 ;ELSE READ MODEM DATA CALL SAVE ;SAVE CHAR IN TEXT BUFFER IF FLAG ON ORI 80H ;SET DATA VALID BIT STA OUTCH ;STORE IN OUTPUT CHAR BUFFER LINK6: CALL MOTEST ;JUMP IF MODEM XMIT BUFFER BUSY JZ LINK7 LDA INCH ;JUMP IF NO DATA FOR MODEM ORA A JP LINK7 ANI 7FH ;DISCARD VALID DATA BIT OUT MODD ;OUTPUT CHAR TO MODEM XRA A ;...THEN CLEAR INPUT CHAR BUFFER STA INCH LINK7: JMP LINK3 ;END OF MAIN LOOP ; ; PCC - PROCESS CONTROL CHARACTER ; ;BECAUSE THIS SECTION USES THE HEATH HARDWARE CLOCK, THE PROGRAM ;WILL NOT RUN ON OTHER CP/M 2.X SYSTEMS UNLESS A SOFTWARE TIMING ;LOOP IS SUBSTITUTED FOR THE NEXT 8 STATEMENTS. THOSE 8 STATEMENTS ;ARE NOT NECESSARY UNLESS ONE WISHES TO SEND 'ESC' CHARACTERS ;FROM THE CONSOLE TO THE MODEM. WITHOUT THESE TIMING STATEMENTS ;'ESC' MUST BE HIT TWICE TO BE TRANSMITTED ONCE. ; PCC: EQU $ IF H8ORH89 LDA TICCNT ;CHECK FOR SPECIAL FUNCTION KEY ADI 10 ;WAIT 20 MSEC FOR NEXT CHAR MOV C,A ESCTIM: LDA TICCNT CMP C JZ PCC6 ;IF TOO LONG, NOT SPEC FUCNTION KEY CALL CITEST JZ ESCTIM ;LOOP UNTIL CONSOLE INPUT ENDIF CALL RCC ;ESC RECEIVED, GET NEXT CHAR FOR FUNCTION CPI 'Q' ;'RED' KEY MEANS EXIT TO CP/M JNZ PCC1 PUSH H LHLD SIZE MOV A,H ORA L LXI H,TBNE CNZ WCS ;PRINT 'TEXT BUFFER NOT EMPTY' LXI H,AYS ;PRINT 'ARE YOU SURE' CALL WCS POP H CALL RCC ;GET ANSWER CALL WCC ;ECHO IT ANI 5FH ;MAKE UPPER CASE CPI 'Y' ;YES? JZ PCCEX ;EXIT CALL WCCR ;CRLF XRA A ;TELL LINK TO IGNORE THIS CHARACTER RET ; PCC1: CPI 'U' ;'F3' KEY FOR TRANSMIT FILE JNZ PCC2 CALL STF ;TRANSMIT TEXT FILE TO MODEM XRA A ;TELL LINK TO IGNORE THIS CHARACTER RET ; PCC2: CPI 'S' ;'F1' KEY MEANS SAVE ALL IN RAM JNZ PCC3 MVI A,1 ;TURN ON TEXT SAVE FLAG STA FLAG LXI H,PCCMR ;PRINT 'SAVING INCOMING TEXT IN MEMORY' CALL WCS XRA A ;TELL LINK TO IGNORE THIS CHARACTER RET ; PCC3: CPI 'T' ;'F2' KEY MEANS SAVE RAM TEXT TO FILE JNZ PCC4 XRA A ;TURN OFF TEXT SAVE FLAG STA FLAG CALL WTB ;WRITE TEXT BUFFER TO DISK XRA A RET ; PCC4: CPI 'V' ;'F4' KEY MEANS AUTO LOGON JNZ PCC5 LXI H,ALMSG CALL WCS ;PRINT 'AUTO LOGON' LXI H,ALBUF AUTOL: MOV A,M INX H CPI 'Z'-40H ;AUTOLOG DONE ON ^Z JZ ALBRK ANA A ;ZERO MEANS EOS JZ STRFIN CALL WMC CALL RMWC ;READ MODEM, WCC IF AVAILABLE JMP AUTOL ; STRFIN: CALL CITEST ;INPUT FROM CONSOLE JNZ ALBRK ;ABORT IF SO CALL MITEST JZ STRFIN ;WAIT FOR CHAR FROM MODEM CALL RMC2 CALL WCC CPI ':' ;NEXT STRING IF MODEM SENDS ':' JZ AUTOL CPI '+' JZ AUTOL JMP STRFIN ;KEEP WAITING FOR ':' OR '+' ; RMWC: CALL MITEST ;READ MODEM & WRITE CONSOLE IF CHAR RZ CALL RMC2 JMP WCC ; ALBRK: XRA A RET ; ALBUF: DB 'A',0 DB 'CIS02',CR,0 DB CR,0 DB 0 DB '70000,0000',CR,0 DB 'PASSWORD',CR,0 DB 'Z'-40H DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; PCC5: CPI 'W' ;'F5' KEY MEANS COPY TO PRINTER JNZ PCC6 LXI H,PRTFLG MOV A,M CMA MOV M,A ;COMPLEMENT PRINT FLAG ANA A LXI H,PRTOFF ;PRINT 'OFF' JZ PRTLAB LXI H,PRTON ;PRINT 'ON' PRTLAB: CALL WCSNP XRA A RET ; PCC6: ANA A ;LET LINK HANDLE ALL OTHER CONT. CODES RET ; PCCEX: LXI H,DISMS ;PRINT 'EXIT TO CP/M' CALL WCS JMP BASE ;EXIT TO WARM BOOT ; TBNE: DB CR,LF,BELL,'CAUTION: TEXT BUFFER NOT EMPTY',0 AYS: DB CR,LF,'EXIT TO CP/M - ARE YOU SURE (Y OR N)?',0 DISMS: DB CR,LF,'+++ EXIT TO CP/M +++',CR,LF DB ESC,'j',ESC,'Y',BL+24,BL,ESC,'l',ESC,'k',0 ALMSG: DB CR,LF,'AUTOMATIC LOGON',CR,LF,0 PCCMR: DB CR,LF,'SAVING INCOMING TEXT IN MEMORY',CR,LF,0 ; ; STF - SEND TEXT FILE (TO MODEM) ; STF: CALL GFN ;GET NAME OF DISK FILE TO SEND JC STF6 ;JUMP IF FILE NAME ERROR CALL OPEN ;TRY TO OPEN SPECIFIED FILE CPI 255 ;JUMP IF FILE NOT FOUND JZ STF7 STF1: CALL READ ;READ NEXT RECORD INTO DBUF CPI 1 ;JUMP IF END-OF-FILE JZ STF5 LXI H,DBUF ;POINT TO DISK BUFFER MVI C,128 STF2: CALL CCTEST ;CHECK FOR ^C FROM CONSOLE MOV A,M ;FETCH NEXT CHAR FROM DBUF INX H CPI 'Z'-40H ;JUMP IF END-OF-FILE CHARACTER JZ STF5 OVERL2 CPI LF ;IGNORE LINE FEEDS JZ STF4 CALL WMC ;WRITE CHARACTER TO MODEM CALL WCC ;WRITE CHARACTER TO CONSOLE OVERL1 CPI CR ;JUMP IF NOT CARRIAGE RETURN JNZ STF4 STF3: CALL CCTEST ;CHECK FOR ^C ABORT CALL MITEST ;WAIT FOR NEXT MODEM CHARACTER JZ STF3 CALL RMC2 ;CHECK MODEM FOR TRIGGER CHAR. OVERLY CPI TRIGER JNZ STF3 CALL WCCR ;SEND CRLF TO CONSOLE STF4: DCR C ;LOOP THRU REST OF DBUF JNZ STF2 JMP STF1 ;GO GET NEXT RECORD FROM DISK ; STF5: LXI H,STFSM ;PRINT 'FILE SEND COMPLETE' CALL WCS RET ; STF6: LXI H,STFS1 ;PRINT 'FILE NAME ERROR' CALL WCS RET ; STF7: LXI H,STFS2 ;PRINT 'FILE NOT FOUND' CALL WCS RET ; CCTEST: CALL CITEST ;CHAR FROM CONSOLE? RZ ;IF NO CALL RCC CPI 'C'-40H RNZ ;IGNORE IF NOT ^C POP PSW ;CLEAR *RET* FROM STACK LXI H,STFSA ;PRINT 'FILE SEND ABORTED' CALL WCS RET ; STFSM: DB 'FILE SEND COMPLETE',CR,LF,0 STFS1: DB 'FILE NAME ERROR',CR,LF,0 STFS2: DB 'FILE NOT FOUND',CR,LF,0 STFSA: DB CR,LF,'FILE SEND ABORTED',CR,LF,0 ; ; SAVE - SAVE CHAR IN TEXT BUFFER IF FLAG ON ; ; ENTRY CONDITIONS ; A - CHARACTER TO SAVE ; SAVE: PUSH PSW LDA FLAG ORA A JNZ SAVE1 POP PSW RET ; SAVE1: POP PSW CPI DEL ;RUBOUT (DEL) ? RZ ;YES, IGNORE IT CPI 20H ;TEST FOR CONTROL CHARACTERS JNC SAVE2 ;JUMP IF NOT CONTROL CHAR. CPI CR ;ALLOW CR TO BE SAVED JZ SAVE2 CPI LF ;ALLOW LF TO BE SAVED JZ SAVE2 CPI TAB ;ALLOW TAB TO BE SAVED JZ SAVE2 RET ;IGNORE ALL OTHER CONTROL CHARS. ; SAVE2: PUSH H LHLD SIZE ;SIZE = SIZE + 1 INX H SHLD SIZE LHLD PTR MOV M,A INX H SHLD PTR PUSH PSW LHLD BREM DCX H SHLD BREM MVI A,0FFH CMP H JZ SAVEAB ;ABORT IF TBUF FILLED MVI A,3 CMP H MVI A,WRNSIG ;SIGNAL CONSOLE RUNNING OUT OF SPACE CNC WCC PUSH H ;HL = BYTES LEFT IN BUFFER LXI H,BRPOS ;POSITION ON 25TH LINE CALL WCSNP ;CONSOLE WRITE WITHOUT PRINTER POP H CALL DECOUT ;OUTPUT HL AS DECIMAL LXI H,RESCP CALL WCSNP ;RESTORE CURSOR POSITION POP PSW POP H RET ; BRPOS: DB ESC,'j',ESC,'Y',BL+24,BL+75,ESC,'p',0 PRTON: DB ESC,'j',ESC,'Y',BL+24,BL+38,ESC,'pon',ESC,'q ',ESC,'k',0 PRTOFF: DB ESC,'j',ESC,'Y',BL+24,BL+38,ESC,'poff' RESCP: DB ESC,'q',ESC,'k',0 ; ; SAVEAB - RAN OUT OF ROOM, ISSUE MESSAGE AND FLOW ; THROUGH TO DISK SAVE ROUTINE ; SAVEND: DB BELL,CR,LF,'ABORTING - NO ROOM LEFT',0 ; SAVEAB: LXI SP,STACK+64 ;REINITIALIZE STACK LXI H,SAVEND ;PRINT 'ABORTING - NO ROOM LEFT' CALL WCS LXI H,LINK ;SET UP RETURN ADDRESS PUSH H ;LEAVE IT ON THE STACK ; ; WTB - WRITE TEXT BUFFER TO DISK ; WTB: LHLD SIZE ;JUMP IF TEXT BUFFER EMPTY MOV A,L ORA H JZ WTB5 MVI C,RESDSK ;RESET IN CASE READ-ONLY CALL BDOS CALL GFN ;GET FILE NAME JC WTB6 ;JUMP IF FILE NAME ERROR CALL DELT ;DELETE OLD FILE, IF ANY CALL MAKE ;MAKE NEW FILE LHLD SIZE ;DE = TBUF SIZE XCHG LXI H,DBUF ;TOP OF STACK POINTS TO DBUF PUSH H LXI H,TBUF ;HL POINTS TO TBUF WTB1: MVI C,128 ;DISK BUFFER SIZE WTB2: MOV A,M ;FETCH NEXT BYTE OF TBUF INX H XTHL MOV M,A ;STORE IN DBUF INX H XTHL DCX D ;SIZE = SIZE - 1 MOV A,D ;EXIT LOOP IF SIZE = 0 ORA E JZ WTB3 DCR C ;LOOP UNTIL DBUF FULL JNZ WTB2 CALL WRITE ;WRITE FULL DBUF TO DISK JNZ NOWRT ;IF WRITE NOT SUCCESSFUL XTHL ;TOP OF STACK POINTS TO DBUF LXI H,DBUF XTHL JMP WTB1 ;LOOP UNTIL END OF TBUF ; WTB3: POP H ;HL POINTS TO CURRENT PLACE IN DBUF WTB4: MVI M,'Z'-40H ;STORE EOF CODE INX H DCR C ;LOOP THRU REST OF DBUF JNZ WTB4 CALL WRITE ;WRITE LAST SECTOR TO DISK JNZ NOWRT1 ;IF WRITE NOT SUCCESSFUL CALL CLOSE ;CLEAN UP ACT AND GO HOME LXI H,TBUF ;CLEAR TEXT BUFFER SHLD PTR LXI H,0 SHLD SIZE LXI H,BRPOS ;SET CURSOR TO WRITE BYTES REMAINING CALL WCSNP LHLD BLEN SHLD BREM ;REMAINING BUFFER IF BUFFER LENGTH CALL DECOUT LXI H,RESCP ;RESTORE CURSOR POSITION CALL WCSNP LXI H,WTBSM ;PRINT 'BUFFER SAVED ON DISK' CALL WCS RET ; NOWRT: POP H ;WRITE FAILS, CLEAR STACK NOWRT1: LXI H,NWMSG CALL WCS ;TELL USER TO TRY AGAIN JMP WTB ; WTB5: LXI H,WTBS1 ;PRINT 'TEXT BUFFER EMPTY' CALL WCS RET ; WTB6: LXI H,WTBS2 ;PRINT 'FILE NAME ERROR' CALL WCS RET ; NWMSG: DB CR,LF,BELL,'DISK OVERFLOW - DO AGAIN',CR,LF,0 WTBSM: DB CR,LF,'BUFFER SAVED ON DISK',CR,LF DB 'MEMORY SAVE CANCELLED',CR,LF,0 WTBS1: DB 'TEXT BUFFER EMPTY',CR,LF,0 WTBS2: DB 'FILE NAME ERROR',CR,LF,0 ; ; WCS - WRITE CONSOLE STRING ; ; ; ENTRY CONDITIONS ; HL - POINTS TO STRING (TERM BY ZERO BYTE) ; WCS: MOV A,M INX H ORA A RZ CALL WCC JMP WCS ; ; WCSNP - WRITE CONSOLE STRING WITHOUT PRINTER OUTPUT ; ; ; ENTRY CONDITIONS ; HL - POINTS TO STRING (TERM BY ZERO BYTE) ; WCSNP: MOV A,M INX H ORA A RZ CALL WCCNP JMP WCSNP ; ; WCCR - WRITE CONSOLE CARRIAGE RETURN (AND LINE FEED) ; WCCR: MVI A,CR CALL WCC MVI A,LF ; ; WCC - WRITE CONSOLE CHARACTER ; ; ENTRY CONDITIONS: ; A - CHARACTER TO WRITE ; WCC: PUSH PSW PUSH B PUSH D PUSH H MOV C,A ;GET CHARACTER FOR CBIOS PUSH B WCCAL: CALL $-$ ;MODIFIED BY INIT. POP B ;C = CHAR LDA PRTFLG ANA A CNZ PRTOUT ;IF SIMULTANEOUS LISTING WANTED POP H POP D POP B POP PSW RET ; ;SEND CHARACTER TO PRINTER ; VALUE IN (C) ; ; PRTOUT: MOV A,C ;MOVE CHARACTER TO A ANI 7FH ;STRIP 8TH BIT FROM CHARACTER MVI C,LSTOUT;GET LIST OUTPUT FUNCTION MOV E,A ;PUT CHARACTER IN E CALL BDOS ;PRINT THE CHARACTER RET ; WCCNP - WRITE CONSOLE CHARACTER WITHOUT PRINTER OUTPUT ; ; ENTRY CONDITIONS: ; A - CHARACTER TO WRITE ; WCCNP: PUSH PSW PUSH B PUSH D PUSH H MOV C,A ;GET CHARACTER FOR CBIOS WCCAL1: CALL $-$ ;MODIFIED BY INIT. POP H POP D POP B POP PSW RET ; ; RCS - READ CONSOLE STRING (WITH ECHO) ; ; EXIT CONDITIONS ; B - NUMBER OF CHARACTERS READ (<255) ; HL - POINTS TO LAST CHAR STORED (CR) ; RCS: LXI H,IBUF MVI B,0 RCS1: CALL RCC ;READ NEXT CHAR FROM CONSOLE CPI DEL ;JUMP IF NOT DEL JNZ RCS2 INR B ;IGNORE DEL IF IBUF ALREADY EMPTY DCR B JZ RCS1 DCX H ;ELSE DISCARD LAST CHAR MOV A,M ;ECHO DISCARDED CHAR TO CONSOLE CALL WCC DCR B ;DECREMENT COUNT JMP RCS1 ; AND LOOP ; RCS2: CPI 'U'-40H ;JUMP IF NOT CONTROL U JNZ RCS3 CALL WCCR ;ELSE ABORT CURRENT LINE JMP RCS ; AND START OVER ; RCS3: CALL WCC ;ECHO CHAR TO CONSOLE MOV M,A ;STORE CHAR IN IBUF INR B ;INCREMENT COUNT CPI CR ;JUMP IF CARRIAGE RETURN JZ RCS4 INX H ;ELSE ADVANCE POINTER JMP RCS1 ; AND LOOP ; RCS4: MVI A,LF ;ISSUE LINE FEED AND RETURN CALL WCC RET ; ; RCC - READ CONSOLE CHARACTER ; ; EXIT CONDITIONS ; A - CHARACTER READ ; RCC: PUSH B PUSH D PUSH H RCCAL: CALL $-$ ;MODIFIED BY INIT. POP H POP D POP B RET ; ; WMC - WRITE MODEM CHARACTER ; ; ENTRY CONDITIONS ; A - CHARACTER TO WRITE ; ; WMC: PUSH PSW WMCL: IN MODS XRI MXOR ANI MTBE JNZ WMCL POP PSW ANI 7FH ;STRIP PARITY BIT OUT MODD RET ; WMS: MOV A,M ;WRITE STRING TO MODEM INX H ORA A RZ CALL WMC JMP WMS ; ; RMC - READ MODEM CHARACTER ; ; EXIT CONDITIONS: ; A - CHARACTER READ ; ; RMC: IN MODS XRI MXOR ANI MRDA JNZ RMC RMC2: IN MODD ANI 7FH RET ; ; ; GFN - GET FILE NAME ; GFN: LXI H,GFNSD ;PRINT 'WHICH DRIVE?' CALL WCS CALL RCC ;GET ANSWER FROM CONSOLE CALL WCC ;ECHO IT TO CONSOLE ANI 5FH ;MAKE UPPER CASE SUI 'A'-1 JC GFN ;REQUIRE ALPHABETIC JZ GFN CPI NUMDRV+1 JNC GFN STA FCB GFNB: LXI H,GFNS1 ;PRINT 'FILENAME? ' CALL WCS CALL RCS ;READ RESPONSE INTO IBUF LXI H,FCB+FN ;BLANK FILL FN AND FT FIELDS MVI C,11 GFN1: MVI M,BL INX H DCR C JNZ GFN1 LXI H,IBUF ;POINT TO INPUT BUFFER LXI D,FCB+FN ;SCAN OFF FN FIELD MVI C,9 GFN2: MOV A,M ;FETCH NEXT CHAR FROM IBUF INX H CPI 61H ;IF LC, CONVERT TO UC JC GFN2A SUI 20H GFN2A: CPI CR ;JUMP IF END OF LINE JZ GFN5 CPI '.' ;JUMP IF END OF NAME JZ GFN3 STAX D ;ELSE STORE CHAR IN FN FIELD INX D DCR C ;LOOP IF 8 OR LESS CHARS SO FAR JNZ GFN2 JMP GFN6 ;ELSE TAKE ERROR EXIT ; GFN3: LXI D,FCB+FT ;SCAN OFF FT FIELD MVI C,4 GFN4: MOV A,M ;FETCH NEXT CHAR FROM IBUF INX H CPI 61H ;IF LC, CONVERT TO UC JC GFN4A SUI 20H GFN4A: CPI CR ;JUMP IF END OF LINE JZ GFN5 STAX D ;ELSE STORE CHAR IN FT FIELD INX D DCR C ;LOOP IF 3 OR LESS CHARS SO FAR JNZ GFN4 JMP GFN6 ;ELSE TAKE ERROR EXIT ; GFN5: XRA A STA FCB+EX ;SET EXTENT NUMBER TO ZERO STA FCB+NR ;SET RECORD NUMBER TO ZERO STC ;CLEAR ERROR FLAG AND RETURN CMC RET ; GFN6: STC ;SET ERROR FLAG AND RETURN RET ; GFNSD: DB CR,LF,'WHICH DRIVE? ',0 GFNS1: DB CR,LF,'FILENAME? ',0 ; ; OPEN - OPEN DISK FILE ; OPEN: PUSH H PUSH D PUSH B LXI D,FCB MVI C,OFFC CALL BDOS POP B POP D POP H RET ; ; READ - READ RECORD FROM DISK FILE ; READ: PUSH H PUSH D PUSH B LXI D,FCB MVI C,RRFC CALL BDOS POP B POP D POP H RET ; ; CLOSE - CLOSE DISK FILE ; CLOSE: PUSH H PUSH D PUSH B LXI D,FCB MVI C,CFFC CALL BDOS POP B POP D POP H RET ; ; DELT - DELETE DISK FILE ; DELT: PUSH H PUSH D PUSH B LXI D,FCB MVI C,DFFC CALL BDOS POP B POP D POP H RET ; ; WRITE - WRITE RECORD TO DISK ; WRITE: PUSH H PUSH D PUSH B LXI D,FCB MVI C,WRFC CALL BDOS ANA A ;SET 'Z' FLAG FOR ERROR POP B POP D POP H RET ; ; MAKE - MAKE NEW DISK FILE ; MAKE: PUSH H PUSH D PUSH B LXI D,FCB MVI C,MFFC CALL BDOS POP B POP D POP H RET ; ; CITEST - CHECK CONSOLE INPUT STATUS ; CITEST: PUSH B PUSH D PUSH H CITCAL: CALL $-$ ;MODIFIED BY INIT. ORA A ;SET ZERO FLAG POP H POP D POP B RET ;ZERO FLAG CARRIES ANSWER ; ; MITEST - CHECK MODEM INPUT STATUS ; MITEST: IN MODS ;GET MODEM UART STATUS XRI MXOR ;INVERT HIGH-TRUE BITS ANI MRDA ;ANY DATA AVAILABLE? MVI A,0 JNZ MITST1 CMA MITST1: ORA A RET ;ZERO FLAG CARRIES ANSWER ; ; ; MOTEST - CHECK MODEM OUTPUT STATUS ; ; MOTEST: IN MODS ;GET MODEM UART STATUS XRI MXOR ;INVERT HIGH-TRUE BITS ANI MTBE ;UART READY FOR CHARACTER? MVI A,0 JNZ MOTST1 ;ZERO FLAG CARRIES ANSWER CMA MOTST1: ORA A ;SET ZERO FLAG IF READY RET ; ;DECIMAL PRINT SUBROUTINE ;PRINTS H,L AS A DECIMAL NO. ; DECOUT LXI D,-10000 CALL PRTDGT ;PRINT 10'S OF THOUSANDS LXI D,-1000 CALL PRTDGT ;PRINT THOUSANDS LXI D,-100 CALL PRTDGT ;PRINT HUNDREDS LXI D,-10 CALL PRTDGT ;PRINT TENS LXI D,-1 PRTDGT MVI C,'0'-1 ;INITIALIZE COUNT PUSH H ;SO INITIAL INX SP'S WON'T HURT PRT1 INR C ;BUMP COUNT OF SUCCESSFUL SUBTR. INX SP ;"POP" STACK W/O ALTERING REGISTERS INX SP PUSH H ;SAVE H,L DAD D ;DO 1 SUBTRACTION JC PRT1 ;IF RESULT STILL POS., DO IT AGAIN POP H ;RESTORE LAST GOOD VALUE TO H,L MOV A,C JMP WCCNP ;PRINT CHAR & RET ; ; DATA AREA ; BLEN: DS 2 ;BUFFER LENGTH BREM: DS 2 ;BYTES TBUF REMAINING PRTFLG: DB 0 ;PRINTER OFF IF ZERO INCH: DS 1 ;INPUT CHAR BUFFER (TO CYBER) OUTCH: DS 1 ;OUTPUT CHAR BUFFER (FROM CIBER) STACK: DS 80 ;LOCAL STACK IBUF: DS 256 ;INPUT BUFFER ; ; TEXT BUFFER ; FLAG: DS 1 ;TEXT SAVE FLAG PTR: DS 2 ;TEXT BUFFER POINTER SIZE: DS 2 ;TEXT BUFFER SIZE TBUF: EQU $ ;START OF TEXT BUFFER ; ;INITIAL CODE IS PLACED HERE TO SAVE SPACE (BUFFER OVERWRITES IT) ; INIT: POP H ;SAVE RETURN ADDRESS LXI SP,STACK+64 ;CREATE LOCAL STACK PUSH H ;RESTORE RETURN ADDRES TO STACK LHLD BASE+1 ;POINT TO CP/M JMP TABLE LXI D,3 ;GET READY TO ADD 3 DAD D ;POINT TO CON STATUS JMP SHLD CITCAL+1 ;MODIFY CALL ADRS DAD D ;POINT TO CON IN JMP SHLD RCCAL+1 ;MODIFY CALL ADRS DAD D ;POINT TO CON OUT JMP SHLD WCCAL+1 ;MODIFY CALL ADRS SHLD WCCAL1+1 LDA FCB+1 ;SEE IF OPTIONAL TRIGER CHAR CPI 20H ;BLANK.. ? JZ SKP ;..BLANK SO USE DEFAULT "LF" CPI 'B' ;BELL WANTED JZ TRGBEL CPI 'X' ;XON WANTED JZ TRGXON CPI 'U' ;UPLOADING NO CHECKING FOR TRIGER JZ TRGUPL ; SETTRG STA OVERLY+1 ;STORE THE CHARACTER AS IS THEN JMP SKP ; TRGBEL MVI A,BELL JMP SETTRG ; TRGXON MVI A,XON JMP SETTRG ; TRGUPL XRA A ;ZERO OUT JUMP STA OVERL1+1 ;CHANGE CHECK FOR C/R TO NULL STA OVERL2+1 ;AND SEND LINEFEEDS AS WELL ; SKP EQU $ ; ; XRA A ;CLEAR CHAR BUFFERS STA INCH STA OUTCH STA FLAG ;CLEAR TEXT SAVE FLAG LXI H,TBUF ;SET PTR TO TBUF SHLD PTR LXI H,0 ;SIZE = 0 SHLD SIZE LHLD BASE+6 MVI L,0 DCR H ;HL = MAX TBUF TOP LXI D,-TBUF DAD D ;HL = MAX TBUF LEN SHLD BLEN SHLD BREM ;BUFFER BYTES REMAINING LXI H,LINKMS ;PRINT SIGN-ON MESSAGE CALL WCSNP LHLD BLEN ;PRINT BUFFER ON 25TH LINE CALL DECOUT LXI H,RESCP CALL WCSNP RET ;RETURN TO MAIN LOOP ; LINKMS: DB ESC,'E',ESC,'Y',BL+5,BL+22 DB 'H/Z-89 TNC CONTROLLER - RSI - DEC 89' DB CR,LF,LF,LF DB ESC,'x1',ESC,'j',ESC,'Y',BL+24,BL+5 DB ESC,'pSave',ESC,'q ' DB ESC,'pFile',ESC,'q ' DB ESC,'pSend',ESC,'q ' DB ESC,'pN/A',ESC,'q ' DB ESC,'pPrint off',ESC,'q' DB ESC,'Y',BL+24,BL+53,ESC,'pExit',ESC,'q ' DB ESC,'pBuffer = ',0 ; END LINK0 W PUSH B PUSH D PUSH H MOV C,A ;GET CHARACTER FOR CBIOS+R2:)͛26:/2DO:Oد2: O: U+XQ’*|!`Ā!̀͛_YW͔UœS®>2!̀T¼2wV;!̀! ~# +6/͛:+6/ÛACIS02 70000,0000 PASSWORD WU!~/w!?P!/͊ɧ!̀ CAUTION: TEXT BUFFER NOT EMPTY EXIT TO CP/M - ARE YOU SURE (Y OR N)? +++ EXIT TO CP/M +++ jY8 lk AUTOMATIC LOGON SAVING INCOMING TEXT IN MEMORY 4[bT!i~#T M ͛ Mi69/ 9͔ !{̀!̀!̀+!̀FILE SEND COMPLETE FILE NAME ERROR FILE NOT FOUND FILE SEND ABORTED :    *#"*w#"*+">j>>ԛ!&͊R!J͊jY8kpjY8Fponq kjY8Fpoffqk ABORTING - NO ROOM LEFT1!Ò!*} 4*!!~#w#zʻ  !Û6# ¼ !"!"!&͊*}"R!J͊!*̀! ̀w!Z̀!ǹ DISK OVERFLOW - DO AGAIN BUFFER SAVED ON DISK MEMORY SAVE CANCELLED TEXT BUFFER EMPTY FILE NAME ERROR ~#͛À~#ͻÊ> ͛> O:ıy_O!+~͔͛͛w #> ͛! ~# !&!̀͛_@4442\!̀!] 6 # `!] ~#ax ʧ.ʋ oñe~#aڙ ʧ ñ2h2|7?7 WHICH DRIVE? FILENAME? \\\\\\!>B/! >P/mmmm/ 33pyû.ʋ oñe~#aڙ ʧ ñ2h2|7?7 WHICH DRIVE? FILENAME? \\\\\\!>B/! >P/mmmm/ 33pyû.ʋ oñe~#aڙ ʧ ñ2h2|7?7 WHICH DRIVE? FILENAME? \1*"/""":] ! B X U 2F! > > 252*222!"!"*.%'"}"!Z ͊*}R!J͊EY%6H/Z-89 TNC CONTROLLER - RSI - DEC 89 x1jY8%pSaveq pFileq pSendq pN/Aq pPrint offqY8UpExitq pBuffer = |-* HEATH H89/H90 CUSTOMIZED *-@* PACKET *-p* CONTROLLER *-* by *-* R.S. Isenson 1989 * PROTOCOL.DTA4MODEM DRIVER NOW CONFIGURED AS:VBAUD: _FORMAT: j BITS,s STOP BIT(S),  PARITY'Is this the desired configuration =To effect a change, press 'Y' in response to the query or 'N'if no change desired.BAUD: "CHANGE3.PRESS '1' FOR 110, '2' FOR 300, '3' FOR 1200 BAUD h BITSpCHANGE6|PRESS '1' FOR 6 BITS, '2' FOR 7 BITS, '3' FOR 8 BITS SEVENEIGHT  STOP BIT(S)CHANGE3PRESS '1' FOR ONE STOP BIT, '2' FOR TWO STOP BITS  PARITY(CHANGE34PRESS'1' FOR NO PARITY, '2' FOR EVEN, '3' FOR ODD `nPRESS '1' IF THESE CHANGES ARE TO MEMORY ONLY; PRESS '2' IF THEY ARE ALSO TO BE SAVED TO DISC. TEMP.DTA PROTOCOL.DTATEMP.DTA PROTOCOL.DTABCOMMUNICATION PROTOCOL-Wait at end of line for:(Select by number.)V1. Continuous transmit.p2. X-ON/X-OFF Protocol.3. BELL Protocol.&4. Line-feed character (default mode).AT THE PROMPT TYPE 'KERNEL U'AT THE PROMPT TYPE 'KERNEL X' AT THE PROMPT TYPE 'KERNEL B'*AT THE PROMPT TYPE 'KERNEL'HMPLINK FILE MISSING ^PROTOCOL.DTAmSEVEN!.r|'!!b"!! ͦ!G! ͍G!͍G!͍G!!i-!*"͍G!!i!i!>!i!͍G!!i! ͍G!!i!=͍G!!i!m͍G!!i!i!>!i!͍G!!i!͍G!!i!͍G!!i-!*"͍ͥýV͊ G! ͍͗_!v7!͞7!͕ !;!;!;!;!;!!;!%;!);!-;!Ͷ2G!1͍G! !i!Si!%rG! !i!\i!i!gi!i!pi!i!͍G!͍G!͍G!͍!͕!;G! ͍!͏"!͏"|g}o| !ͦ!!ͦ!G!͍G!͍G!͍G!!i!i!%N!(!i!͕!(;(!͏"(!͏"|g}o|t !+͕!a;!aG!x& X%X)X-  X%X)X- X%X)X-G! ͍G!͍G!͍G!͍G!!i!i!ei!(!i!m͕!v;v!͏"v!͏"|g}o|Z ò !y͕!;!G!x&| !ͦ!Xò !ͦ!Xò !ͦ!XG! ͍G!͍G!͍G!͍G!!i!i!i!(!i!͕!;!͏"!͏"|g}o|1 t !͕!;!G!x&Q d !ͦ!Xt !ͦ!X G! ͍G!͍G!͍G!͍G!!i!i!i!(!i!%͕!.;.!͏".!͏"|g}o| K !1͕!g;!gG!x& ( ; !ͦ!X!K !ͦ!X!K !ͦ!X!G! ͍G!͍!k͕!;!G!x& } !v7!͞7!!i!i!N!i!i!N!i!i!i!!N!%N!)N!-r!Ͷ2!q6!/5XV!Z͊ Vt!&!)F!!F!&!-F!Vt!&! F!Vt!&G! ͍G!͍G!͍G!!i!S͍G!!i!m͍G!!i!͍G!!i!͍!:ͦ!!"&!"|g}o|G! ͍[ G! ͍G!͍!"~!x&/;GSG!͍GG!͍GG!͍GG!'͍G!Ͷ2f|tGt; G!E͍G!v7[!͞7!jͦ!X!ͦ!X!ͦ!X!X%X)X-!!i!i!N!i!i!i!N!i!i!i!!N!%N!)N!-r!Ͷ2tt|g}ot|g}ot|g}o|DGG,OODDEVENNOTWOONESIXyYI*ETROMWX@@@@8\@ (2-<BFiP~Zdnx_4:C^ v R t  J  " , 6 @8 TZ ^ l h| r |   1 t C Q d    K &  ( ; T 0o :} D N X b l  1 F [ v     /;GS t *4>H;RA\Df[[[[ BASLIB #240000 5.23 - OWNED BY MICROSOFT, 1980 r+sFDM*"!#*u&##"#ú>22*^#V"##^#V" 2!!!""!"6#6P>2>2>2ccZ_|i#w+! N#F!yw#xw7777 7 7 7 7 77777 88!9"v !6#}|>!|6#z!R"!O"|> d6#s#r#= >2p>2s>2r2u"x!g"0&& STO7G*.. . ........ %*|N:¼*|ʼ  s#r  {w#6"*v*>2A!9N#F~#~~+~#~+^#V######|~#fo!& Internal Error - No Line Number g~#ʣ& at lineV>͊~#fo>& at address|'}'> `=> `=~#*j >~#fo!9"l!*l"n!*n!5~<1=1#~#(#&Syntax Error in DATRETURN without GOSU Type MismatcOut of DatIllegal Function CalOverfloOut of Memor Subscript Out of Rang Division By ZerOut of String SpacString Formula Too CompleRESUME without Erro2Field Overflo3Internal Erro4Bad File Numbe5File Not Foun6Bad File Mod7File Already Ope9Disk I/O Erro:File Already Exist=Disk Ful>Input Past En?Bad Record Numbe@Bad File NamCToo Many FileUnprintable Erro|d}8R; O;`i"!"!"z ,ͲUdb)͍'* ?*?*?*?ti)(*?ti)v'* ?*? ,ZͲ~#ƒx$t!>oͲ$$ͩ!͒4ڕ ²"G{,xPX͒4%!(Oz"y E O{,yĄ͒4% { ,> %%̈́͒4"0 X͒4X 0,X P͒4X X*( 4:~{,~6!($O ~+~ r#6!(ɷw#YN#"!9""y2*|ʷ*!"A~#*(=~ʎIb)i)"( ͍'* ?*?*?*?$(*?$v'* ?*?*(=<~#"(,Žÿ~Ž!"~,"T#"~hh# WÎ"n#"(x"ʃ ʃ+~ xy$$&?Redo from Start * %!*:Oþ*+~+ +w ++~#foͩ!"!5*L~2#~#^#V&++%{;8:( ELSE END ";NS1;",";PR$;","PR1;BA1;BD1;BD2 850 CLOSE 860 GOTO 130 870 IF ERLRNEL B'":END 780 PRINT"AT THE PROMPT TYPE 'KERNEL'":END 790 CLOSE:IF ERR=53 THEN 800 ELSE END 800 IF ERL=860 THEN PRINT"MPLINK FILE MISSING":END 810 OPEN "O",#2,"PROTOCOL.͖z͡zͬzlz͖Ü͡ÜͬÜÜ͖J͡JͬJJ?÷?÷"?H~# ¸x2A':qA7+$<ͨ~<#͗7+~ <#>2A':qF#~#foxĄ8/~#<#8%A>" ,<W*#^ +=t=z{{_|}8O;`i"++"!$"!"2]d83ͻ:}o|gA> <+|6t=!"!"2]!~6#w n& ^#V |!C^#V#"!":* no~!&Ni&o +;*{<t={=> <|d}*<;}|d}|C!*#n& 4C[!^#V#-"R*R^#ͮ^#V#'"T~2Q"R*T*R:QÕ=:Q=:Q?LCHDD[DLAA@? >~#fo^#V#^#V#ͷ=^#V#ͷ=ͬ=^#V#ͬ=h͟=͕=&)))>!>!>!>!>!>^#V#!?O >!>!>!>!>!>^#V#!?V > > > > > >^#V#^#V#n >B >B >B >B >B >^#V#!?n Z  G͒ j y  G͒ ʍ ~#foÏ ##͜ >© ~+~?~´ +# + E^#V#  z !| !|EF^#V ʾB:,!>!!"!!!"!2>2!2!V!=͍!͟=|dÄ!͍!j!!!!CxC!͠A=C$!~##++Ė%>>+V+^+!+r+s%ͩ!~$d͆$ " "%%~#~#fo> @"~d#~#fon&%z\"}͆$~Y"s#O"d|d!9>$>Ñ">Ñ">Ñ">Ñ">Ñ">͚"!+GN"y"#~#fo~#fo"#" µ" y"y<.")")%%~6+}0b)͍'%%%#(#+#.#1#4#7#:#=#@#C#F#I#L#O#_!#4b#5*#"#~#N#F#ڢ#|# >e#yx҇# e#+++6@#yw#xw+++6###!#~6ڳ##b#$*##~#~b#[!*#"#~#^#V#$# >#|##++~_w#~Ww###*#DM~#^#V#l$,$$+zI%+{I%##{z~#q#p_$ya$xa$DM$~#a$$YP+++"#6@###{_zW+r+sɷʻ$*##|™$^R#^#V+"##w#s#r+++r+s##!$$*q&{z*s&?$}|~# $yG͆$x>G͆$x#N#F& $$͖%%*q&*s&>E%&?%͖%%###&%k%& during G.C. gk%& g& Internal Error - String Space Corrup#N#F*#yx%*!#yx%++`i+V+^>`%##6+6+~6  >@++*##"##s#r+$*##~_#~W &jr+s##6"!####!##~#fo-&>&<*#"#*!#}o|g6@#s#r#6"!#*s&*q&"##}w>#w##>X&++6+6%#R#G!~&>2w&|¹&+})N#ҵ&~#fo :w&¨&!9"v!|4 ~ >#dzd}2t{s~`=#=&&~`=#&G~#'#&++ '0:'`=KO|g}oxGKx GzKCZQO7M͗0i'*?}/o|/g#"?|͚'Ei'! ?~wɯ2!?͗0'FC͚'*?͚'E͗0'&C>>?)~O#ß'O8'!$?ý'>!$??2'# '!$?àA!$?ͤ(8?>>'>|}+!Z)è@l(3F+6! ?>B2?!V)[D!R)è@!$?è@~_#~W#~O}GC!0C͙E?(ɇ<o&͚'E*?* ?o("?`i" ?!?^#V#N#F#!V)DkGx{`G!"?6@Fwg>GÄGè(:A'Gw#¨((ý(!$?(?͗0?͗0(*?||<͗0*?(ͷ(!0ͱ('}'(1(: ?2 ?:!?t1~(:!?) )&)|/g}/o:)!t1:!?C)~("?>2A'7(aj9) L}q'͗'_1>2'`h:)~&ʲ0-ʑ)+ʑ)+}0x*.*eʣ)E)}0lʻ)Lʻ)qʻ)Q):A')>)~%+*#<*!=*d)D)F*}0ͨ0}0*)_{_U*e**H'͗0!F(C)͗0 )F*Ñ)}0!F(!()F*}0)v'č'͗0x((=͗0 ('DG+"?`i"?#~+\,-3,0OxG\,#~,`xEQ,y ,>2'a,|,I,,"?`i"?a(#Wj.:',Ù,,ҝ, /60v(0/+~0ʬ,.v(,͗0>"w#6+,6-/</ ,:#p#w#6!'#z_--/z./{'=.p+-p#6!'#:B'~ -*-+--}0-+$0W-#}0W-++wM--W-6%.{-0'-7++6%7(r-͛(j.-_x..0/./-_yc*-e*-{_x-..-.y /O.GO0/-*B'=.P -̈́'ѯ .͛(7j.yc*OzWOe*).7./< //>ͺ'Y/>ͺ'p#=P/!?^(Ì/1(>~(a(m0?/l(/{_#zW#yO++Ҡ/(#a(p#ڒ/>/s0>/N#F#*?/}o|g/"?p#=//w1_cƤ~@zZrN vH Tʚ;@B''d #~: }0 }0 }00?<=:A'Ҥ07-++}0:1O0H0+00:)H#10aM!00}0?)))صo0M!11}:10? ,1? ))))صo1a{ (͗0:!?: ?+(:'2'2'aaWXWX>XTXXXXXXINCLUDŋNBӽSæӔTξUTϓASŕLEAҒALiLOS{INԡSNǢDḄHROVVVONԓHAIΉOMMOΒATVI͆EFDBsEFINtEFSNuEFSTvELETœE`NćQLSŝRRORRDIԓRASŒXO}8R;O;!' ~q2 q2#~f2`iM4G2>O #~goPY!' ůẃ4:G7m;=g;=¥2ѯX;I3!' ~|2́4͡8}8R;!&3! ~+ng}8R;! n&*~L;a:DM'~y24N#V pm3zw w+s#r#6#6DM:ʘ3!" s#r#63! {zV3z1w<3*T]% N#F+q#p###6 b4́4:G7>z4>w+w!(47?*' 6#67~j;#^#fk_4N#~:4++@j;y@j;j; 2 #5~.4 574#422%z j;j;>  54> $54ͭ4z1 2 >ͭ4: 2!1p; 2<[;1*+2~O;#N#F++% Oʸ5Iʸ5RO;*-2|¸5!"-2}_85͡8{8^;zͭ4 8"# 2> >66́4~6.͙< 6: W:'7> ͙<͙<ܖ< 26~*6?# ?7O!!4_7#4_7#4y"t7m;><"+2>2!:":<2*"/2!7""-25*|7##n;2ï7.͹2*/272128"22872129"229R;!)e9)#f9))t9 s9#=[9}_}la)p;ҋ9#xp;"8! "8!) "8!}o|g=;ں9bk:8:=;9:DM*8*8T:"8PY:}o|g*8#"89:DM*8*8T:"8PY92<;*8! ~#fo=;s#rC::<;P:!P:!& t3~# xU:DMͽ:d;Ͳ:! w!( V6 ʊ:zwͻ:d;Ͳ:! ~!í:! ^#V! s#rDMͪ:ͤ:=;}8R;:O;`i"!:";͒4!>o|d,;-:R;*!F"{͆$f$%8;!1;*#;\|}!">6>4>?>=>:>7>5>2>3>@>C>o&o!"!("(Í;:ž;&?Þ;p<;:<>\2<¸;ʝ;͙<+;~͙<;+͙<;͙<͖\͙<2 ͙<>;E<>#;^<6͖n ͙<<{< ;;:̖^͙<@͙<͖<~ ½<> ͙<͙<#î <~=R=*!"<"> <> <:=ʏ=> V> V*<^#V#͟=ɷ!?=!?ö=?=?=w#w#w#w#Žbzͷ=>?=>?= ~#==!=#~ = =Ʌo$ɧGw#>{zj&cb)c#c))c#cc#)*j&)2ÅcO*jPc6@#@͢'s#r6=G~=q#xHw"j>!9,c>fcgb>Åc"c!c,cN>,c#.äco g7%c*j!c#c##c*j##n&c!j c#7~46#,?[C+?g?̈́GOl?!G! ?y#d?+W?̈́G?ÌGO@TG&CÅ?O@C2@!$?[C?:!?ʄG:+?/qAS>!$?*B??S>!$?B: ?<=A!?͎B!S>͌Bx®?!!?5®?2A! ?N#F3F+6'@! ?>BB2?:?PB̈́Gx/F+N+=o@!$?Ã@!?>q#p#=†@!?è@"R>z@i@U@*R>[C;G:!?;G!*?N#F?EBq@GBCx @@PB! ?B@j0 TeB׳]h!I.k O@TG&C,AO@C!$?è@!!?q#~++w+qGAÄGDNn"~`35zr1{r1h!I[CʄGyO2*?æA[CʄG:!?2@ҸA/<2@9҄G:*?O3FG2#?!*?B:#?2?x!$??7B BA4C:?B!"?~++wÄG!?4#B42A+6!$??# Bɯ# -B-BPB/!?Oyw#HBG: ?yB!?Vwz# ^BxQB;G!?͌BqBxA!!?w;GA~w# ŽBO@TG&CíBO@C!$?àAO@TG&CBO@C2@!$?ÐAy2*?! ?Y>~q+BqCNsY+BB W~w+ CC! ?CE&CTG!?w#,CÄG=C}rCFCxCrC3F!?F#^#V#NGxC}$?~#`CG++NyÌG?^C!?TG>ʵCҍC}GCkGʱC!"?6@Fg>G|F!>‡CakTGC_ECÄG!!?~+>wÄGECuGʄG:!?]GC/<*F҄G3FgG!?.D~_#~W#~OG#4 G.GGG~_#~W#~OF]FEKDuGʄG>OCE^DuG F̈́GȯG?E"?y2 ?Fo!F*F!D*?: ?OқD!?4 GóDDg.*?: ?OzҜDDg.*?: ?éDx<=D{_zWxG)yOHGGEDuG`G̈́G?Ey+F+F+Fw`h|7EgyE:?O|g}oxG-|E} E]FElaO E!!?~GxWEƀ:Gw3Fw+ɷ G;GkGx{`G!"?6@Fwg}Ez|E >G|-G{>2!?]F/">x!>~w#FFG#GJ!!?qx!!?-GF#~怩O]G 4Ggo"?" ?kGs#r#q#p}GuG`G}G"?`i" ?*?* ?DM^#V#N#F#xyÌG:!?: ?7|/G}/O!>ïG ҮG7>{_zW}o|g=¥G|g}oGCZQG o-yOzW{_xGG?* ?DM^#V#N#F#x PACKET89.DOC _____________________________________________________________________ Packet89 is a software interface for use between the Heath Z/H-89 or Z/H-90 and a packet TNC. The program may also work on an H-8 depending upon which I/O board the H-8 has. It is a derivative from the MODEM controller called "PLINK". Three files are used, Packet89.COM, Kernel.COM and Protocol.DTA. The first, Packet89, sets the I/O ports for the interface. It allows the user to reset the interface BAUD and the word characteristics (size, number stop bits, parity, etc.). The default port is the DTE port at address 330. If someone else wants a different port he'll have to get it through modification of the source code. The default interface baud is set at 300. On my H-89 this works well even though my TNC/transceiver interface is running at 1200 baud. At 600 baud, if I try to save to the buffer, an occasional character is lost, to buffer, CRT, and printer. At 1200 baud, again, if I try to save to buffer, the computer simply can't handle it. If, on the other hand, incoming text is not going to buffer, i.e., only to CRT and the lineprinter, the computer can handle 1200 baud. This situation was an unknown at the time the program was written, being recognized only as an attempt was made to run at 1200 baud. Because this program can still be used effectively as a telephone modem driver and to permit such use I decided to keep the 1200 baud. Another H-89 may function properly at 600 baud. The program allows for use of a control interface protocol between the TNC and computer. The user establishes this protocol when the program is loaded. In order to transfer a file from disk to TNC, there must be agreement between the computer and the TNC. Normally this is achieved by selecting "continuous transmit"; that is, no protocol by entering "KERNEL U" when requested. Many TNC's will operate in the "X-ON/X-OFF" mode. You may want to try it although I've no idea what will be gained. It, the "LINE FEED Character" and the "BELL Character" protocols have been retained in order to permit the continued use of the program as a telephone MODEM controller. USING THE PROGRAM: Run "Packet89" and respond Y or N when asked if the default protocols are acceptable. (They normally should be.) If a change is desired, enter "N" and follow instructions. When asked about interface protocol select "1" (normally) and enter "KERNEL U" . PIE works quite well to prepare a file before transmitting it via packet If you choose to do this, however, recall that most BBS's ask for CTL-Z at the end of the file. I don't include the CTL-Z in the file but add that manually as soon as I see the "FILE TRANSFER COMPLETE" note on the CRT. I'm afraid that PIE will strip the 8th bit and mess up the "CTL". (Anyhow, by using this technique, I avoid any risk.) I have included a copy of KERNEL.ASM for the use of anyone who has to change the I/O port (or anything else.). There's no reason to muck about with PACKET89 so I didn't include the assembly language version. You should never have to get involved. NOTE: If you don't get satisfactory operation of the disk I/O or the line printer, check your CONFIGUR.COM. Make sure of the ports and the bauds selected for the printer and the TNC. Double check to make sure that your TNC and the program default "PARMS" agree (7 bits, 1 stop, even parity.) These are easily changed by rerunning PACKET89, setting new PARMS, and saving them to disk. For whatever it's worth, on a SSSD (10 hole) disk I have PACKET89.COM, KERNEL.COM, PROTOCOL.DTA, PIE.COM and SWEEP.COM and room for temporary storage of files received or to be sent. I find this gives me maximum flexibility in all modes and plenty room on the disk. CONFIGUR.COM is set to run PACKET89 on cold boot. I'm making the program available to anyone who requests it via a BBS advisory. It should be ideal for MARS or RACES. Feel free to pass it along if you want. 73s RAY, N6UE  73s RAY,SEVEN, 2 ONE, 0 ,EVEN, 24 300 128 1 ]NSWP is copyright (c) 1983 by Dave Rand 10232-160 Street Edmonton, Alberta (403) 484-4114"Q1&*."D22 22!] >?6 !""F Y2Drive :A:<>*>?=_͝  o&2: !"#"8":k!&~}+c#"S Illegal drive code.:_:_͝_,*#+"*:K in # files. *8K free.#_"+*D& OUT OF MEMORY?!""<">1&*#}  No files.)X@L;S*_;) ʍ ʍBʪX@SDʳTUVʗPʌEL;CʎMʬA RYF~WʼY=?YQʧ*#"*&!"*|+"*" Which drive? :AQ :GA22k*8K remaining on drive A>:x22 Which flags (1-4,R,S,A)? :! 6#k!"K*K<#"Kʣ! ʝ#x>x>í1234@@@@RSA Delete file? ͘Y*_]2\ 6 ͝_^͝:e5 R/O. Delete? ͘Y%:e2e\\͝**{ozg))))xj~# x`*+"*&+" Erase Tagged or Untagged files (T/U)? ͘TʸUT>2 Do you wish to be prompted (Y/N/A)? ͘AY>2A!"_~G:w Deleting ---> :Ah Delete (Y/N/A)? ͘AʋYwͨʔy#*#}ʋ+&!"!"|  ~6ʿ#ͪ*>">*<"<*<K (*>K).*_͢Í Tagged files = *_ͿÍ~6#ͪ*>w">*<w"< New drive/user? !~#͊:F2:H2ð2~ʈV#z2u:2H:2F~A$Q$A2F#~:ȷ*0:'G#~:0602Hx 2H>2H!6  !^#6#~)w  Copy to drive/user?  2!~#͊:Y:GG:HZ:FG: Can't copy to same drive and user.*_ ~2G >í2Y:2G:Y!_~+Fc x2G:Y' :G:F' :GG:H'  Skipping, same drive & user --> c :YK b  Copying --> v  SQ/USQ --> v  Setting -->  to :Y ! ~ #“ ! ~ ! ~ #³ @ ~#  1 2 3 4 R/W R/O SYS ARC :FA:H :Go& " >::@  with CRC.:YU ʔ  X  6ͨ| #*& --- Aborted ---Z2Z ~6 2G![ ~ww#¼ ZX !_~  Retagging --> > ͢#*& ͻS v&D  Can't squeeze yet.ͧ !\:F==2S:X2X:WO:U jd O>=2UyO! ##^#Vz y2Wz> {/ͻ!"M!Z :F<2*+"BZ\ *Bq"B*D&/ i : Verifying --> !6 <¶  Can't open file!*M"!"M !q **M&CRC verify error!file ok.*B*+&*+R*B&%*+"B Destination disk full.}o|g Find what? !"K!\k#~  !%" Tag what? !"K!\k#~  !% Tagging --> _> _͢#*&@_]D%> ~?R#G*_ ~2G New name, or *? !"K!lk#~  ?#—:H¬:Gw*_. 2**#"_,*#+""&!"\2\ :G_͝:e-:e2e:v2v\:H_:G:_͝!m[ 2ZZ*+~}ʆ Destination file exists! 2:HʖG:G¾:G_͝͝\_͝!m :G_͝!\Z 2Z>?2f*+Z~}ʱ"Z!m[ Z!)))))*+ f Z.ñ Directory full.<œ!=!o <œi`!fg6  Old name? !"K!k: :H2 New name? !"K!k: !_ͣ€ Renaming -->  ~2G to !mG:2#*&0>. 2~ F:ʺ?G># ºɯ/m> ?~#=:H:G:A n&}  >:y(> ~>.~*#. #~#> ͪK : y*y#y~#~>2J2J<2@Press ^X to abort, space to advance a line, cr to advance a page. >2I*_ͻS v&!jͧ ! *+"/"0ʹʅʅʋj…ʅ_ I:@<2@:IO:J:@G:͠ {ʅʅ2@:@=2@͠ )ʹʠ͑)XZ2Z ~6 2G*+"/"-Z< Can't open file!͝_:H_Ý:G*+"3"1"5!6 :22!~ 6? ~P# ~##~#~  x>UC*"'+|*'|ȯ|g}o"'~#")*+}o|g"#!"!*!"**)"%*)*}o|g"Û*!#"!*#&iÕ*_"*%_" ~O##**Fwx# |}!""##"!*"yK͙b*!"#"!*+"|?*#_* *##"#*_"*!_" #*~ F :ʸ?G># ¸ɷ!":*#}! &ͪ*:": x'& 3&3d&&3} 13yFF> =; Q |G{0*%#*$~.ҁg xʒ|-|#x}o|g:7ʦ)=Þ"8^)))))#~&o))))o$#:7 }>o}}o}}o}#~# a{_:_$ :$27"$))))&!\*K<ʩ@G:ʳ*ʍ0O:ʳ> O0O:ʳ:öpy2H!#*6?w»!#6 . ! #*6?w!#6  #6"K =_.:;<> <!"!yg)a>g>!oUr$s%# K:~̈́#y*MO!" ~W$^"M NSWEEP - Version 1.99 10/07/1983 (c) Dave Rand, 1983 Edmonton, Alberta A - Retag files | Q - Squeeze/Unsqeeze tagged files B - Back one file | R - Rename file(s) C - Copy file | S - Check remaining space D - Delete file | T - Tag file for transfer E - Erase T/U files | U - Untag file F - Find file | V - View file L - Log new disk/user | W - Wildcard tag of files M - Mass file copy | Y - Set file status. P - Print file | ? - Display this help X - Exit to CP/M | cr, sp - Forward one file $