IMD 1.16: 28/05/2007 16:31:15 -FOG/UTL013         -FOG/UTL013CTERM C 1CTERM COM@CTERM DOC PLNK0124ASM< PLNK0124COM DIRLABELASMSDIRLABELCOM SWEEP36 COM\ !"#$%&'()*+,DISK DOC -/* Configurable Terminal Program, (c) 1981 by Joe Felsenstein */ /* OK to copy for nonprofit purposes */ /* This is the version preconfigured for the Osborne-1 */ #include "B:BDSCIO.H" #define TRUE 1 #define FALSE 0 #define BUFRSIZE 32000 #define CTRLD 4 #define CTRLE 5 #define CTRLF 6 #define CTRLG 7 #define LF 10 #define CR 13 #define CTRLR 18 #define CTRLW 23 #define CTRLZ 26 /* these following d  eclarations declare the configuration parameters */ int halfduplex; char cpch; /* external storage location for CPM 2.x BDOS(6, ) calls */ char iobuf[BUFSIZ]; /* the IO buffer */ char filename[80]; /* room for a file name */ char buffer[BUFRSIZE printf("%s\n","(type Y or N)"); c = getchar(); printf("\n"); if ((c=='Y') | (c=='y')) striplf = TRUE; else striplf = FALSE; ]; /* the storage buffer */ int stash, buflong, bsize; modemrdy() { int cx; cx = call(0x4000, 0, 0, 0, 0); if ((cx & 0x01) != 0) return(TRUE); else return(FALSE); } modemread() { int x; x = bdos(3, 0); /* Os gotcr = FALSE; for (i = 1; i <= buflong; i++) { c = buffer[i]; if ( (c == LF) && gotcr && striplf ) ; else modemsend (c); borne modem port is CP/M Reader device */ return (x); } keyrdy() { int x; cpch = bdos (6, 0xFF); if (cpch != 0) x = 1; else x = 0; return(x); } keyread() { char ch; ch = cpch; /* if keyrdy, char if (!halfduplex) putch (c); if (striplf) gotcr = (c == CR); } printf("%s\n", "------ FINISHED TRANSMITTING BUFFER -----"); break; case CTRLE : break;  was stored in cpch */ return(ch); } modemsend(ch) char ch; { int cx; cx = bdos(5, ch); /* Osborne modem output is on CP/M list device */ if (halfduplex) putch(ch); } buferrmsg() { printf("%c%c%c%s", CTRLG, CTRLG, CTRLG,  case CTRLF : printf("%s", "name of file to read from your disk? "); gets(filename); i = fopen(filename, iobuf); buflong = 0; if (i == -1) "BUFFER FULL! "); printf("%s\n", "BUFFER FILLING TURNED OFF!"); } docommand(ch) char ch; { int i, gotcr, striplf; char c; switch (ch) { case CTRLD : printf("%s", "Want to change to ? ");  printf("%s %s\n", "Can't find file:", filename); else { i = c = getc(iobuf); while ( (i != -1) && (c != CTRLZ) ) { buffer[++buflong] = c;    putch(c); i = c = getc(iobuf); if (buflong == bsize) { buferrmsg(); i = -1; } }  } configure() { char c; int i; printf("\n%s\n", "Want terminal to be half-duplex? (Y or N)"); c = getchar(); halfduplex = (toupper(c) == 'Y'); c = call(0x1F70, 0, 0, 0, 0); /* move modem ready routine */ poke (0x0003, fclose (iobuf); printf("%s\n", "------- FINISHED READING FILE --------"); } break; case CTRLR : stash = !stash; if (stash) (peek(0x0003) & 0xF3) | 0x04); /* set IOBYTE */ } main () { char ch, kch; int x, i; printf("%s\n", "Configurable Terminal Program, v2.0"); printf("%s\n", "(c) 1981 by Joe Felsenstein"); printf("%s\n\n", "OK to copy for nonpr buflong = 0; break; case CTRLW : printf("%s ", "name of file to write on your disk:"); gets(filename); i = fcreat(filename, iobuf); if (i != -1) { ofit purposes"); configure(); printf("\n%s\n", "Commands: (^ indicates these are control characters)"); printf("%s\n", " ^D Dump contents of buffer to modem"); printf("%s\n", " ^E Exit to CP/M"); printf("%s\n", " ^F Fi for (i = 1; i <= buflong; i++) { putch(c = buffer[i]); putc(c, iobuf); } putc(CTRLZ, iobuf); fflush(iobuf); ll buffer from CP/M file (asks for name)"); printf("%s\n", " ^R toggles filling of buffer from modem port"); printf("%s\n", " ^W Writes buffer to CP/M file (asks for name)"); printf("%s\n", "Now you are a terminal (control-E to stop fclose(iobuf); printf("%s\n", "---------- FILE WRITTEN ------------"); } else printf("%s %s\n", "ERROR IN CREATING FILE:", filename); break; } being one)..."); stash = FALSE; buflong = 0; bsize = BUFRSIZE; do { if (modemrdy()) { ch = modemread(); if (stash) { if (buflong == bsize) { buferrmsg(); stash = !stas  h; } else buffer[++buflong] = ch; } putch(ch & 0177); } if (keyrdy()) { kch = keyread() & 0177; /* automatically strip parity bit */ switch (kch) {  case CTRLD : case CTRLE : case CTRLF : case CTRLR : case CTRLW : docommand(kch); break; default : modemsend(kch); break; } } } while ( kch != CTRLE); exit(); }  docommand(kch); break; default : modemsend(kch); br  *K͞+Ae_'+FÎr ͖ 8{ Ăw#w#w^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z5>s͋5>@2=#R1Ϳ5#(,#:==2=)(@#>s͋5#͘(Y#X1:>͋5:&=͋5c1Ϳ5#f1Ϳ52=#(—#>͋5:&=͋5>{͋5c1Ϳ5#(#:$=µ#>}͋5c1Ú#:$=;-͘(#>&͋5͋5f2Ú#:$=$v+è":7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o=$,v+2#:$=>$$>͋5v+>͋5>@2$=2#*="<1Ϳ5:=2="<|s$}d$[2Ϳ5z$g$[3Ϳ5>G>)͋5$#͞*D)͏,Ͷ,v++4ʱ$m5 W È & < ] '@!9DM!\ ! ͡! ! ͡! ! ͤ͡! ! ͡#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r! !0 ͡!4 !K ͡!O ! ͡! ! ͡! ! ͡! !1 ͡*Yw#w*[w#w*]6#6}ͧ|ͪ`isMY|M[M]¸ͭMY|͝*Ys#r*[^#Vr+s*Y`ins`in&|g}oͰͳ|E Ͷ|g}o+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:77! s! n}' ' ' ' ' 6 ! n&͹E ! n&ͼE ! n}qͿ!9Configurable Terminal Program, v2.0%s (c) 1981 by Joe Felsenstein%s OK to copy for nonprofit purposes%s Commands: (^ indicates these are control characters)!a{   `OE!y6$ -7rBo&))T])))!yV5:=b#:=#:$=2#v+:<"(">6͋5:&=͋5#*&=|"M1Ϳ5#>6͋5:&=͋5>#͋5>6͋5:'=͋5#*&="<(#>͋5:&=͋ %s ^D Dump contents of buffer to modem%s ^E Exit to CP/M%s ^F Fill buffer from CP/M file (asks for name)%s ^R toggles filling of buffer from modem port%s ^W Writes buffer to CP/M file (asks for name)%s Now you   are a terminal (control-E to stop being one)...%s J mCÛxÖá!9DM! ! 8 ; `is`in&> Y͝*s#r!!!!!pA `is!G |g}o|g}o!D !9Want terminal to be half-duplex? (Y or N) %s  ` * l *###* { `is#r͐#|`i6#6͐M[ڌ͐*Yn! si *###! n&~ `i^#Vr+s?*###!~ *###́ *###x !!` * !! ` !9Want to change to <x!9DM!!!!!@ `is#r͐|g}o|H !N N !N !9] è!9DM!!Z `is#r͐ !9Î m! !!!! ͋ ! ! ͋ BUFFER FULL! %c%c%c%sBUFFER FILLING TURNED OFF!%s è!9DM!CR>? %s(type Y or N)%s ------ FINISHED TRANSMITTING BUFFER -----%s name of file to read from your disk? %sCan't find file:%s %s ------- FINISHED READING FILE --------%s name of file to write on your disk:%s ---------- FILE WRITTEN ---------! *##sw}& `i6#6, `iw#w͐3 !9!9DMw`is`in&T !9Ä mC'&ûÈ 8Ð!9DM! n}ʮ ʾ!!` ! !` c ! s!` ! n}Y͝! n}y͝|g}o|! ---%s ERROR IN CREATING FILE:%s %s 0è&!9DM! n&!*`is#r\|d! n&-!9vÉ!y9DM! `ip`is!9áû!9DM! n&͞|! n&! n&!9DM͐!͐s#rz!6#6! w#w! w#w`i6#6͐M[ڮ͐*Yn! s! n} e͐|e͐|eq! n&f \|†! n&i ͐|ʢ! n} ͝! s#r`i^#Vr+s!!G` !K!q` * l *###* o `is#r*[w#w͐##w#w͐~#fo%Cè,!9DM͐|<͐+++|S!͐##^#Vr+sz}͐^#Vr+sn&!͐͐~#fo"`is#r!ں͐##^#Vr+s͐##͐?+s#r͐͐s#r͐^#Vr+sn&!#|"* !t!` *###r ! s`is#6͐#|ʲ! n}ʲ*[^#Vr+s*Y! ns! n&i *###r ! s`is#6M[M]¯u `i6#69*###x !!` MY|͝*Ys#rMY|*[w#w!!9 â!9DM͐'!͐~#fo >å!9DM͐͐;s#rzc!͐͐s#r͐##6#6͐~#foÜè!9DM͐+|¼! n&͓͐++|! n&!͖͐+++|! n&!͖͐+++  +|1! n} ! !͖! n&!͖͐##^#Vr+szb͐^#Vr+s! ns&!͐͐~#fo͙ʌ!͐##6#6͐͐s#r͐^#Vr+s! ns&nÿ!9DM͐!͐##~#fosns{! ^#Vr+s! n}K! ^#Vr+s!K! ^#Vr+s6 $a! ^#Vr+s`insw! ^#Vr+s`insX͐6!9Ï!9DM͐n}ʹ! ^#Vr+sn&͌×!9DM! n&aͯ! n&zͯ!9DM͐͐ !͐##~#fo`is#r͐͐͐~#fo͐Z!͐+?`is#r͐##~#fo|!͐͐͐͐##~#fo͐s#r͐~#fo͐s#r!!͐~#fo͐##6#6͐͐ @͐^#Vr+s͐ -͐05͐7s!&Ë͐ ͐͐ ͉͐`is͐ ͐͐ )͐`in&#&Ë!9!9DM! n&0ͯڿ! n&9ͯÔ!9DM`iw#w͐~#fon&}͐ ?͐^#Vrs#r!!9)ÔÛ!h9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{z`in}%d! ! s#r! 6#6! s! s! s͐n}-¹! ^#Vr+s! 4͐n}0! 4͐n& }! #!! s#r! ^#Vr+sn+snѯg`is#r͐!9 _ ;   :woR2w&!o u . &7**DM:!**7*:w n&7:O*o` 6  #F#x~#7,2q*&`is{.1! #! s#r! 4! ^#Vr+sn`is`in&&}D]UʙXʢOʫCS"N͐~#fo|! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 ñ! 6ñ! 6! ~#fo! n&! ^#Vr+s~#fo! ѯgs#rÚ! ^#Vr+s!:q):$=$=r:qo&7:)~:,"s!"u*|ʂ**s‡! ~‚6*u*+"*"*u#"uN#î*7*ͨ\!*ͫ   > _  ^#Vr+s~#fos! ^#Vr+sÚ! n}5! 6#6! ^#Vr+s~#fo! s#r͐n}ʚ͐|ʚ! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+sP͐6! ! s#r! n}! ^#Vr+s!! ^#Vr+s! n}!0! sö͐! ^#Vr+7:)~:,"s!"u*|*ul*~#C"*s*ul#"u*+"07*|DM**͹ڝ><~# x‘ ><~+ x­|}?7:,*:*}|2q   :qw ! {w !\&! , FNxg>Goyc$@! ~# y>2:*2@>2:@o Configurabl Termi na program bu instea th versio preconfigure fo the Osborne-1. 5 T ru th progra jus typ CTERM Answe th questio a t whethe yo wan hal o ful duplex Th rest is self-explanatory (more or les "I !" :1 R O*UR X* G:xl :  *̩ : l x͖ *#"EH DH 0:~ ! ^4! w͆ Æ *! 6z͖ {͖ 4>R>V>D >P >L >NCONSTLOCs). 6 Onc i CTERM ^ permit yo t fil you buffer wit name fil yo have an ^ permit yo t dum you buffer content t th seria por fo transmis sion ^Ҡ permit yo t ope you buffe fo incomin data an ^ CTERM EXPLANATION copyright (c) by Joe Felsenstein, 1982. It is OK to copy cterm and this text for nonprofit purposes. 1 CTER n longe assume tha th CP/ seria por i addresse RDR:=PTR: CTER take car o t repeate wil clos you buffe (E.g i "toggles you buffer) ^ wil the permi yo t "write (e.g save th dat loade i you buffe afte ^Ҡ i use int fil name b you NOTE Whe ^ i used i start fillin fro ha itself T boo CTERM al yo hav t d i typ CTERM carriag return answe ye o n t hal duplex an you'r off sta comman i n longe necessary. 2 Th bau rat fo CTER i determine b th syste SETU programth beginnin o th buffer causin los o al previou content o th buffer ^ wil permi yo t exi fro th termina progra int CP/ comman line 7 Al othe character type g ou th seria port Al character r whic ha th tw option o 30 bau an 120 baud Yo shoul chec t mak sur th bau rat i wha yo want 3 Th source-cod fil CTERM. i i BD C which run beautifull i Osborne-1's. 4 Thi versio i NO th fuleceive a tha por g ont th screen. 8 Buffe siz shoul b 32,00 character (NO 32K) Originall bu i th progra limite i t 8K bu thi ha bee repaired 9 Thi progra i full legal Owin t th wisdo a  n public-spiritednes o B Software' Leo Zolman, the plac n restrictio o royaltie o distribution o compile code Pleas fee fre t distribut the cod t othe Osborn users Al as i that: a N on mak profi fro th distribution of this software. b. No one attempt to remove my name or copyright. Joe Felsenstein Seattle, 2/5/82 Document revised by D. Slaughter 5/4/82; PLINK.ASM ; (latest version JAN 24 1982 by BC Reagan) ; (prior version OCT 18 1980) ; ; PLINK - SUPPORT COMMUNICATIONS LINK WITH CYBER ; ;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 ; ; This version by Keith Petersen, W8SDZ. ; WITH HEATH EQUATES ADDED BY TOM JORGENSON ; ; TRS-80 MODEL 1 mods by Steve Vinokuroff, Vanc CBBS ; Optional Triger characters   by Steve Vinokuroff ; TRS-80 mods by Dennis Breckenridge, Burnaby CBBS ; D.C.Hayes mods by Bruce Ratoff, Iselin NJ Remote CP/M ; CP/M Alternate Console Device mods added by ; Ben Reagan, Lynnwood, WA ; ;This program currently supports the following mY SAVE INCOMING ASCII IN RAM BUFFER * ; * FOR LATER TRANSFER TO DISK * ; * CONTROL Q WRITE RAM BUFFER TO DISK - ASKS * ; * FOR DRIVE AND FILENAME.TYP * ; * DELETE BACKSPACE WHEN IN COMMAND MODE * ; * ASKING FOR FILENAME * ; * Codems ; or computers via conditional assembly. ; ; 1. PMMI modem ; 2. ANY serial i/o board (TUART INCLUDED) ; 3. TRS-80 model 1 ; 4. TRS-80 model 2 ; 5. HEATH H8 WITH 8251 UART AT PORT 330Q ; 6. D.C.Hayes 80-103A or Micromodem 100 ; 7. External ONTROL U ABORT CURRENT LINE WHEN IN COMMAND * ; * MODE ASKING FOR FILENAME * ; * * ; * (NOTE: ALL OTHER CONTROL CODES ARE PASSED TO * ; * MODEM OUTPUT) * ; **************************************************** ; ; ;CONDITIONAdumb modem connected to a physical CP/M ; device (TTY, CRT, BAT, or UC1 but different than ; local console) ; 8. OSBORNE 1 ; ;-->NOTE: IF ASSEMBLED AS WRITTEN WILL WORK WITH AN external dumb ; modem connected to the CP/M 'CRL ASSEMBLY SWITCHES <<-- SET FOR YOUR SYSTEM ; TUART SET 0 ;CROMEMCO TUART I/O BOARD PMMI EQU 0 ;PUT A 1 HERE IF YOU HAVE A PMMI DCH EQU 0 ;PUT A 1 HERE IF YOU HAVE A D.C.HAYES TRS1 EQU 0 ;PUT A 1 HERE IF YOU HAVE TRS80-MOD1 TRSPT EQU 0 ;PUT 1 HERE IT' device port. ; ;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: ; ; **************************************************F YOU HAVE TRS80-MOD2 ;USING PICKLES & TROUT CP/M 2.X H84 EQU 0 ;PUT 1 HERE IF YOU HAVE H8/H8-4 CPMDUM EQU 1 ;PUT 1 HERE IF YOU ARE USING A CP/M ;CONSOLE I/OBYTE DEVICE WITH AN EXTERNAL ;DUMB (ACOUSTIC) MODEM. BE SURE TO ;SET THE ALTERNA** ; * COMMANDS: * ; * * ; * CONTROL E EXIT PLINK TO CP/M WARM BOOT * ; * CONTROL T TRANSMIT ASCII FILE TO MODEM. * ; * ASKS FOR DRIVE AND FILENAME.TYP * ; * CONTROL C ABORT FILE SEND TO MODEM * ; * CONTROL TE CONSOLE DEVICE BELOW. IF CPMDUM ALTCON EQU 1 ;PUT ALTERNATE (MODEM) CONSOLE ;DEVICE HERE. 0=TTY 1=CRT 2=BAT 3=UC1 ;IMPORTANT: THE 'ALTCON' MUST BE ;DIFFERENT THAN THE NORMAL CONSOLE ;DEVICE USED BY THE LOCAL OPERATOR, ;SINCE THIS   PROGRAM SWITCHES BETWEEN ;THE TWO DEVICES. ENDIF IF H84 TUART SET 1 ENDIF ; OSBORNE EQU 1 ;PUT 1 HERE IF OSBORNE 1 ; INIT$REQUIRED EQU 1 ;PUT 1 HERE IF INITIALIZATION NEEDED ;(NEEDED FOR MOST VERSIONS INCLUDING ; 'CPMDUMSK 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 ; ;THE FOLL') ; IF TRS1 OR PMMI OR TUART OR DCH PORT EQU 1 ENDIF ; IF TRSPT OR CPMDUM PORT EQU 0 ;STILL NEED THE SWITCH ENDIF ; ; ; ;BDOS ENTRY POINT AND FUNCTION CODES ; IF NOT TRS1 BASE SET 0 ;STANDARD CPM ENDIF ; IF TRS1 OR H84 BASE SET 4OWING "TRIGER" EQUATE IS SET TO "LF" (LINEFEED) ;BY DEFAULT. AN OPTIONAL TRIGER CHAR MAY BE PASSED VIA FCB1 ; ; IE: PLINK B WILL SET TRIGER TO "BELL" ; ;THE FOLLOWING OPTIONS ARE ALLOWED ; ; 1. B = BELL 07H ; 2. X = XON 11H ; 3. U = UPLOAD NO200H ;TRS-80 MODEL 1 CP/M BASE ADDRESS ENDIF ; 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  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 ADIOGET EQU 7 ;GET I/O STEERING BYTE IOSET EQU 8 ;SET I/O STEERING BYTE ; ; TRS80 PICKLES AND TROUT SIO CALLS ; OFFSET BY -3 THAT IS ADD 3 TO ALL CALLS ; SETSIO EQU 30H ;SET UP Z80 SIO SIOTST EQU 33H ;READ SIO STATUS SIOINP EQU 36H ;INPUT A CHAR SIODRESSES ; IF PMMI MODD EQU 0C1H ;MODEM DATA PORT MODS EQU 0C0H ;MODEM STATUS PORT MODINIT EQU 29H ;INITIALIZE BYTE ORIGINATE, ;7 DATA, EVEN PARITY, 1 STOP ENDIF ; IF DCH MODD EQU 80H ;MODEM DATA PORT MODS EQU 81H ;MODEM STATUS PORT MODINIOUT EQU 39H ;OUTPUT A CHAR ; ;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 DIT EQU 05H ;7 DATA, EVEN PARITY, 1 STOP ENDIF ; IF TRS1 MODD EQU 0EBH ;TRS80 MOD 1 RS232 DATA PORT MODS EQU 0EAH ; AND THE RS232 STATUS PORT ENDIF ; IF TUART MODD EQU 0D8H ;<<--MODIFY FOR YOURS MODS EQU 0DDH ;<<--MODIFY FOR YOURS ENDIF ; ;  MODEM STATUS PORT BIT DEFINITIONS ; IF PMMI MTBE EQU 01H ;MODEM TRANS. BUFFER READY FLAG MRDA EQU 02H ;MODEM RECEIVE DATA AVAIL. FLAG MXOR EQU 03H ;MASK TO MAKE MTBE AND MRDA "LOW TRUE" ENDIF ; IF DCH MTBE EQU 02H ;MODEM TRANS. BUFFER READY FLA 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 JMP SKP ; SKP EQU $ IF H84 MVI A,80H; SET DLAB BG MRDA EQU 01H ;MODEM RECEIVE DATA AVAIL. FLAG MXOR EQU 03H ENDIF ; IF TRS1 MTBE EQU 40H ;TRS80 MOD1 RS232 BUFFER READY MRDA EQU 80H ;MODEM RECEIVE DATA AVAIL. MXOR EQU 0C0H ENDIF ; IF TUART ;<<--OR ANY OTHER SERIAL I/O MTBE EQU 20H ;<<--MOIT IN 8250 UART OUT 0DBH; 8250 AT PORT D8H (330Q) NOP ! NOP ! NOP NOP ! NOP MVI A,01H; MSB OF BAUD RATE DIVISOR OUT 0D9H; ...TO UART NOP ! NOP ! NOP NOP ! NOP MVI A,80H; LSB OF BAUD RATE DIVISOR OUT 0D8H; ...TO UART NOP ! NOP ! NOP NODIFY FOR YOURS MRDA EQU 1H ;<<--MODIFY FOR YOURS MXOR EQU 21H ;<<--MODIFY FOR YOURS ENDIF ; ; **MAIN PROGRAM** ; ORG BASE+100H LINK: IF NOT OSBORNE LXI SP,STACK+64 ;CREATE LOCAL STACK ENDIF LHLD BASE+1 ;POINT TO CP/M JP ! NOP MVI A,03H; 8 BITS, 1 STOP BIT, NO PARITY, DLAB RESET OUT 0DBH; ...TO UART NOP ! NOP ! NOP NOP ! NOP MVI A,0; RESET CONTROL REGISTER OUT 0DCH; ...TO UART JMP CONT ENDIF IF INIT$REQUIRED AND NOT H84 AND NOT CPMDUM OR PMMI AND NOT H8MP 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 LDA FCB+1 ;SEE IF OPTIO4 MVI A,MODINIT OUT MODS ;INITIALIZE MODEM PORT ENDIF ; IF TUART MVI A,80H ;DSR ON BIT 7 PARL PORT B OUT 54H ENDIF ; IF TRSPT ;MUST SET UP SERIAL CHANNEL RESET: LXI H,INITR ;STORE RETURN ADDRESS PUSH H LHLD 1 LXI D,SETSIO ;SIO SENAL 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 TUP ROUTINE DAD D PUSH H ;STORE ON STACK MVI C,00H ;NO PARITY CHAN-A MVI D,0E6H ;8 bits ,1 STOP MVI E,3 ;300 BAUD MVI L,00H ;DISABLE EXT/ACK SIO FUNCTIONS MVI H,'S'-40H ;CONTROL S (X-ON) RET ;TROUGH SETUP PROG INITR NOP ;DO IT TO   IT ENDIF ; IF TRS1 ;INIT FOR TRS80 MOD1 RS232 OUT 0E8H ;RESET RS232 IN 0E9H ;READ THE SWITCHES ANI 0F8H ORI 5 OUT 0EAH ;SET DSR AND CTS MVI A,55H ;300 BAUD OUT 0E9H ENDIF ; ; IF PORT IN MODD ;CLEAR MODEM UART READ BUH ;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 ; IF PORT OUT MODD ;OUTPUT CHAR FFERS IN MODD ENDIF ; IF CPMDUM SAVIO: PUSH H ! PUSH D ! PUSH B ! PUSH PSW MVI C,IOGET ;SAVE ENTRY I/OBYTE CALL BDOS STA ORGIO POP PSW ! POP B ! POP D ! POP H ENDIF ; CONT XRA A ;CLEAR CHAR BUFFERS STA INCH STA OUTCH STA FLAG ;TO MODEM ENDIF ; IF TRSPT PUSH B ;STORE REGISTERS PUSH H PUSH D CALL WMC ;SEND CHAR POP D POP H POP B ENDIF ; IF CPMDUM CALL WMC ;SEND CHAR TO MODEM ENDIF ; XRA A ;...THEN CLEAR INPUT CHAR BUFFER STA INCH LINK7: JMP LINCLEAR TEXT SAVE FLAG LXI H,TBUF ;SET PTR TO TBUF SHLD PTR LXI H,0 ;SIZE = 0 SHLD SIZE LXI H,LINKMS ;PRINT SIGN-ON MESSAGE CALL WCS ; ; MAIN LOOP ; LINK3: CALL CITEST ;JUMP IF NO DATA FROM CONSOLE JZ LINK4 CALL RCC ;ELSE READ CONSK3 ;END OF MAIN LOOP ; LINKMS: DB CR,LF,'PLINK as of 24-JAN-82' IF TUART DB CR,LF,'(For TUART I/O)' ENDIF IF PMMI DB CR,LF,'(For PMMI Modem)' ENDIF IF DCH DB CR,LF,'(For DCH Modem)' ENDIF IF TRS1 DB CR,LF,'(For TRS80-MOD1)' ENDIFOLE DATA CPI 20H CC PCC ;CALL PCC IF CONTROL CHAR JC 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 DIS IF TRSPT DB CR,LF,'(For TRS80-MOD2)' ENDIF IF H84 DB CR,LF,'(For H8/H8-4)' ENDIF IF CPMDUM DB CR,LF,'(For CP/M Alternate Console Device' DB CR,LF,'with External Dumb Modem)' ENDIF DB CR,LF,LF,'READY',CR,LF,LF,0 ; ; PCC - PROCESS CCARD 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 80ONTROL CHARACTER ; PCC: CPI 'E'-40H ;JUMP OUT IF CTRL E JNZ PCC1 PUSH H 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   STC ;TELL LINK TO IGNORE THIS CHARACTER ; IF TRSPT POP PSW ;GOBBLE UP CALL ADDRESS JMP RESET ;RE-INITIALIZE SIO ENDIF ; IF PORT OR CPMDUM RET ENDIF ; PCC1: CPI 'T'-40H ;JUMP IF NOT CONTROL-T JNZ PCC2 CALL STF ;TRANSMIT TEXT FILE TOLE 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  MODEM STC ;TELL LINK TO IGNORE THIS CHARACTER RET ; PCC2: CPI 'Y'-40H ;JUMP IF NOT CONTROL-Y JNZ PCC3 MVI A,1 ;TURN ON TEXT SAVE FLAG STA FLAG LXI H,PCCMR ;PRINT 'SAVING INCOMING TEXT IN MEMORY' CALL WCS STC ;TELL LINK TO IGNORE T MVI C,128 STF2: 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 HIS CHARACTER RET ; PCC3: CPI 'Q'-40H ;JUMP IF NOT CONTROL-Q JNZ PCC4 XRA A ;TURN OFF TEXT SAVE FLAG STA FLAG CALL WTB ;WRITE TEXT BUFFER TO DISK STC RET ; PCC4: STC ;LET LINK HANDLE ALL OTHER CONT. CODES CMC RET ; PCCEX: LX;JUMP IF NOT CARRIAGE RETURN JNZ STF4 STF3: CALL CITEST ;CHECK CONSOLE DATA READY JZ STF3A ;NO DATA THERE CALL RCC ;GET CONSOLE CHARACTER CPI 'C'-40H ;CONTROL C ABORTS IT JZ STF8 STF3A: CALL MITEST ;WAIT FOR NEXT MODEM KHARACTER JZ STF3 CAI H,DISMS ;PRINT 'MODEM NOT DISCONNECTED' CALL WCS JMP BASE ;EXIT TO WARM BOOT ; AYS: DB CR,LF,'EXIT TO CP/M - ARE YOU SURE (Y OR N)?',0 IF PMMI OR DCH DISMS: DB CR,LF,'++DON''T FORGET - THE MODEM ' DB 'IS NOT DISCONNECTED++',CR,LF DB 'USE "MOLL 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 WCSDEM D" TO DISCONNECT',0 ENDIF ; IF NOT PMMI AND NOT DCH DISMS: DB CR,LF,'+++ EXIT TO CP/M +++',CR,LF,0 ENDIF ; 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 FI RET ; STF6: LXI H,STFS1 ;PRINT 'FILE NAME ERROR' CALL WCS RET ; STF7: LXI H,STFS2 ;PRINT 'FILE NOT FOUND' CALL WCS RET ; STF8: LXI H,STFSA ;PRINT 'FILE SEND ABORTED' CALL WCS RET ; STFSM: DB 'FILE SEND COMPLETE',CR,LF,0 STFS1: D  B '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  - 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 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 CP 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 I 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 LDA BASE+7 ;GET SYSTEM SIZE SUI 1 ;SO WE DONT CRASH CDBUF 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 XTHL ;TOP OF STACK POINTS TO DBUF LXI H,DBUF XTHL JMP WTB1 ;LOOP UNTP/M CMP H ;ARE WE OUT OF ROOM? JZ SAVEAB ;YES, ABORT SUI 4 ;LEAVE SOME ROOM (1K) CMP H MVI A,WRNSIG ;SIGNAL CONSOLE RUNNING OUT OF SPACE CC WCC POP PSW POP H RET ; ; SAVEAB - RAN OUT OF ROOM, ISSUE MESSAGE AND FLOW ; THROUGH TO DISIL 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 CALL CLOSE ;CLEAN UP ACT AND GO HOME LXI H,TBUF ;CLK 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 ; ; WTBEAR TEXT BUFFER SHLD PTR LXI H,0 SHLD SIZE LXI H,WTBSM ;PRINT 'BUFFER SAVED ON DISK' CALL WCS RET ; WTB5: LXI H,WTBS1 ;PRINT 'TEXT BUFFER EMPTY' CALL WCS RET ; WTB6: LXI H,WTBS2 ;PRINT 'FILE NAME ERROR' CALL WCS RET ; WTBSM: D  B 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 BYTECHO 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 - RE) ; WCS: MOV A,M INX H ORA A RZ CALL WCC JMP WCS ; ; 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 AD CONSOLE CHARACTER ; ; EXIT CONDITIONS ; A - CHARACTER READ ; RCC: PUSH B PUSH D PUSH H RCCAL: CALL $-$ ;MODIFIED BY INI\. POP H POP D POP B RET ; ; WMC - WRITE MODEM CHARACTER ; ; ENTRY CONDITIONS ; A - CHARACTER TO WRI ; WCC: PUSH PSW PUSH B PUSH D PUSH H MOV C,A ;GET CHARACTER FOR CBIOS WCCAL: CALL $-$ ;MODIFIED BY INIT. POP H POP D POP B POP PSW RET ; ; RCS - READ CONSOLE STRING (WITH ECHO) ; ; EXIT CONDITIONS ; B - NUMBER OF CHARACTERTE ; ; IF PORT WMC: PUSH PSW WMCL: IN MODS XRI MXOR ANI MTBE JNZ WMCL POP PSW ANI 7FH ;STRIP PARITY BIT OUT MODD RET ENDIF ; IF TRSPT WMC: PUSH H PUSH D PUSH PSW WMCL: CALL MOTEST ;TEST STATUS JZ WMCL ;LOOP TILL TX EMPTS 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 Y POP PSW ;RESTORE CHAR ANI 7FH ;STRIP PARITY PUSH B ;STORE B MOV C,A ;PUT CHAR INTO C MVI B,00H ;CHANNEL A LXI H,WMCRE ;STORE RETURN ADDRESS PUSH H LHLD 1 ;GET BASE ADDRESS LXI D,SIOOUT DAD D PCHL ;JUMP TO IT WMCRE: POP B ;RESTORE 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 ;EIT POP D POP H RET ENDIF ; IF CPMDUM WMC: PUSH H ! PUSH D ! PUSH B PUSH PSW WMCL: LDA ORGIO ;GET ENTRY I/OBYTE ANI 0FCH ;SAVE ALL BITS EXCEPT 0 & 1 ADI ALTCON ;SET BITS 0 & 1 TO 'CRT' MOV E,A MVI C,IOSET ;SET NEW I/OBYTE CALL BDOS    POP PSW ANI 7FH CALL WCC ;OUTPUT CHAR TO MODEM LDA ORGIO ;RESTORE ENTRY I/OBYTE MOV E,A MVI C,IOSET ;SET I/OBYTE CALL BDOS POP B ! POP D ! POP H RET ; ; RMC - READ MODEM CHARACTER ; ; EXIT CONDITIONS: ; A - CHARACTER READ ; ; ;ALLOW 16 DRIVES (AS IN CP/M 2.X) 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,' ' INX H DCR C JNZ GFN1 LXI H,IBUF  IF PORT RMC: IN MODS XRI MXOR ANI MRDA JNZ RMC RMC2: IN MODD ANI 7FH RET ENDIF ; IF TRSPT RMC: CALL MITEST ;CHAR AVAILABLE JZ RMC ;LOOP IF NOT READY RMC2: PUSH B ;STORE B PUSH D PUSH H MVI B,00H ;CHANNEL A LXI H,RMCRE ;RE;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 GTURN ADDRESS PUSH H LHLD 1 LXI D,SIOINP DAD D PCHL RMCRE: POP H POP D POP B ANI 7FH ;STRIP PARITY RET ENDIF ; IF CPMDUM RMC: RMC2: PUSH H ! PUSH D ! PUSH B LDA ORGIO ;GET ENTRY I/OBYTE ANI 0FCH ;SAVE ALL BITS EXCEPT 0 & 1 ADFN3 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 LCI ALTCON ;SET BITS 0 & 1 TO 'CRT' MOV E,A MVI C,IOSET ;SET NEW I/OBYTE CALL BDOS CALL RCC ;INPUT CHAR FROM MODEM PUSH PSW LDA ORGIO ;RESTORE ENTRY I/OBYTE MOV E,A MVI C,IOSET ;SET I/OBYTE CALL BDOS POP PSW ANI 7FH POP B ! POP D ! PO, 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 EXTENP H RET ENDIF ; ; ; 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 17 T 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 ; SH B PUSH H PUSH D MVI B,00 ;CHANNEL A LXI H,MITSTR PUSH H LHLD 1 LXI D,SIOTST DAD D PCHL MITSTR: POP D POP H ANI 01 ;TX EMPTY POP B RET ;ZERO FLAG HOLDS THE ANSWER ENDIF ; IF CPMDUM MITEST: PUSH H ! PUSH D ! PUSH B LDA  ; 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 DORGIO ;GET ENTRY I/OBYTE ANI 0FCH ;SAVE ALL BITS EXCEPT 0 & 1 ADI ALTCON ;SETS BITS 0 & 1 TO 'CRT' MOV E,A MVI C,IOSET ;SET NEW I/OBYTE CALL BDOS CALL CITEST ;GET INPUT STATUS PUSH PSW ;SAVE IT LDA ORGIO ;RESTORE ENTRY I/OBYTE MOV E,A M POP H RET ; ; WRITE - WRITE RECORD TO DISK ; WRITE: PUSH H PUSH D PUSH B LXI D,FCB MVI C,WRFC CALL BDOS 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 CAVI C,IOSET ;SET I/OBYTE CALL BDOS POP PSW ;INPUT STATUS POP B ! POP D ! POP H RET ENDIF ; ; MOTEST - CHECK MODEM OUTPUT STATUS ; ; IF PORT MOTEST: IN MODS ;GET MODEM UART STATUS XRI MXOR ;INVERT HIGH-TRUE BITS ANI MTBE ;UART READY FOR LL 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 - CHECKCHARACTER? MVI A,0 JNZ MOTST1 ;ZERO FLAG CARRIES ANSWER CMA MOTST1: ORA A ;SET ZERO FLAG IF READY RET ENDIF ; IF TRSPT MOTEST: PUSH B PUSH H PUSH D MVI B,00 ;CHANNEL A LXI H,MOTSTR PUSH H LHLD 1 LXI D,SIOTST DAD D PCHL MOT MODEM INPUT STATUS ; IF PORT MITEST: IN MODS ;GET MODEM UART STATUS XRI MXOR ;INVERT HIGH-TRUE BITS ANI MQRDA ;ANY DATA AVAILABLE? MVI A,0 JNZ MITST1 CMA MITST1: ORA A RET ;ZERO FLAG CARRIES ANSWER ENDIF ; ; IF TRSPT ; MITEST: PUSTR: ANI 02 ;BUFFER EMPTY POP D POP H POP B RET ENDIF ; IF CPMDUM MOTEST: MVI A,0 ;ALWAYS REPORT 'CRT' (MODEM) ;OUTPUT STATUS AS READY. ;*** MAY NOT WORK IN ALL SYSTEMS *** CMA ORA A RET ENDIF ; ; DATA AREA ; 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 ORGIO: DS 1 ;ENTRY I/OBYTE BUFFER (USED WITH ;EXTERNAL MODEM ON CP/M 'CRT' DEVICE) ; ; TEXT BUFFER ; FLAG: DS 1  External Dumb Modem) READY @!v*_Ym7J7\>2!7j2 77?! EXIT TO CP/M - ARE YOU SURE (Y OR N)? +++ EXIT TO CP/M +++ SAVING INCOMING TEXT IN MEMORY |9@'2!~#2 +;TEXT SAVE FLAG PTR: DS 2 ;TEXT BUFFER POINTER SIZE: DS 2 ;TEXT BUFFER SIZE TBUF: EQU $ ;START OF TEXT BUFFER ; END LINK ; 4 +r*G} X  !N!c!u!FILE SEND COMPLETE FILE NAME ERROR FILE NOT FOUND FILE SEND ABORTED :¦ ҿ ʿ ʿ ʿ*#"*w#":> ABORTING - NO ROOM LEFT1!!*}n |uEc*!!~#w#zM 2T!06# NT6!"!"!|!! BUFFER SAVED ON DISK MEMORY SAVE CANCELLED TEXT BUFFER EMPTY FILE NAME ERROR ~#> > O!* +~w $#> :_:_:_*:_!*_@|||2\! !] 6 # ¨!] ~#a . ·e~#a  2h2|7?7 WHI*"v".":] CB/X4U92$C>)>)22C2222!"!"!rʅ* !څ2:2}ʦX͜2͟ʼ:42o PLINK as of 24-JAN-82 (For CP/M Alternate Console Device withCH DRIVE? FILENAME? \\\\\\:_r:_>/  DY). ; 5) TYPE B:DIRLABEL ; 6) PLACE ANOTHER DISC IN DRIVE A AND REPEAT ; AS MANY TIMES AS YOU WOULD LIKE. ; ; 8/82 Revised by Jim Woolley, FOG Disk Librarian ; 4 files/line, " | " between files, unidirectional print ; (unidir. print = esc,U,1 may only work with Graftrax) ; ; 9/82 Revised by Dennis McFerran, FOG, to look for disk ; number on USER 15. This was you can ERA *.* without ; effecting the disk number. Also if there is room on ; the label, the program will now; 6/25/82---THIS PROGRAM, WHICH WAS ADAPTED FROM ; THE FMAP(CATALOG) PROGRAM, WILL LIST ; YOUR FILE DIRECTORY ON A LABEL SIZED ; OUTPUT. IT WAS WRITTEN USING AN EPSON ; MX-100. I DON'T KNOW WHETHER OR NOT IT ; print SPACE LEFT on ; the disk and the DATE that you labelled the disk. ; ;*********EQUATE TABLE - BDOS*********************** ; * RDCHR EQU 1 ;READ CHAR FROM CONSOLE * WRCHR EQU 5 ;WRITE CHR TO PRINTER * PRINT EQU 9 ;PRINT WILL WORK WITH MX-80 BUT TRY IT. IT USES ; EPSON CONTROL CODES SO WOULD PROBABLY HAVE ; TO BE MODIFIED FOR OTHER PRINTERS. ; ; ANY SUGGESTIONS OR COMMENTS SHOULD BE FORWARDED ; TO: DENNIS MC FERRAN ; 1038 POLK LAN CONSOLE BUFF * RDCON EQU 10 ;READ CONS BUFFER * CONST EQU 11 ;CHECK CONS STAT * FSRCHF EQU 17 ; " " * FSRCHN EQU 18 ; " " * FCB EQU 5CH ;FILE CONTROL BLOCK * BDOS EQU 5 ; * TPATOP EQU 0C700H-1;TOPE ; SAN JOSE, CA 95117 ; (408-296-6021) ; ; ; TO USE-------- ; 1) PLACE DISC WITH THIS PROGRAM ON IT IN DRIVE B ; 2) TURN ON YOUR PRINTER. ; 3) PLACE DISC THAT YOU WOULD LIKE TO LABEL IN DRIVE A: ; 4) GET INTO CPM (IF YOU'RE NOT THERE ALREA OF TRANSIENT PROG AREA* DATEBUFF EQU TPATOP-16;BEGINNING OF DATE BUFFER * ; * ;**********EPSON MX-100 PRINTER CODES*************** ESCAPE EQU 27 ; * SPACING EQU 65 ;LINE SPACING * CONDON EQU 15 ;CONDENSE  D PRINTING ON * CONDOFF EQU 18 ;CONDENSED PRINTING OFF * UNIDIR EQU 'U' ;UNIDIRECTIONAL PRINT * FORLEN EQU 67 ;SETS FORM LENGTH * FORMFEED EQU 12 ;FORM FEED * CR EQU 13 ;CARRIAGE RETURN * LF EQU 10 ;LINE FEED  MVI C,FSRCHF ;GET 'SEARCH FIRST' FNC LXI D,FCB CALL BDOS ;READ FIRST INR A ;WERE THERE ANY? STA TEMP ;SAVE CNZ SOME1 ;GOT SOME - PRT TITLE, CONT LXI D,NONMSG MVI C,9 CALL BDOS JMP EXIT1 SOME1 CALL SOME MVI E,00 MVI C,32 CALL* ;*************************************************** ; ORG 100H START LXI H,0 ;SAVE THE OLD STACK DAD SP ;H=STACK SHLD STACK ;SAVE IT LXI SP,STACK ;GET NEW STACK ;RESET SYSTEM MVI C,13 CALL BDOS ;SAVE FILE WRITE REQUEST CHAR LDA FC BDOS JMP PRTTL ;READ MORE DIRECTORY ENTRIES MOREDIR MVI C,FSRCHN ;SEARCH NEXT LXI D,FCB CALL BDOS ;READ DIR ENTRY INR A ;CHECK FOR END (0FFH) RZ ;GOTFCB1 ;NO MORE - SORT & PRINT ;POINT TO DIRECTORY ENTRY SOME DCR A ;UNDO PREV 'INR A' B+17 STA FILESW ;DATE REQUEST MVI A,'$' STA DATEBUFF+10 MVI A,8 STA DATEBUFF DTE LDA DATEBUFF+8 CPI '8' JZ OKDATE LXI D,DATEREQ MVI C,PRINT CALL BDOS MVI C,RDCON LXI D,DATEBUFF CALL BDOS JMP DTE ;NO ANI 3 ;MAKE MODULUS 4 ADD A ;MULTIPLY... ADD A ;..BY 32 BECAUSE ADD A ;..EACH DIRECTORY ADD A ;..ENTRY IS 32 ADD A ;..BYTES LONG LXI H,81H ;POINT TO BUFFER ;(SKIP TO FN/FT) ADD L ;POINT TO ENTRY MOV L,A ;SAVE (CAN'T CARRY TO H) ;MOVE  FCB SPECIFIED? MKBLANK MVI A,' ' STA DATEBUFF+2 RET OKDATE LDA DATEBUFF+2 CPI '0' CZ MKBLANK LXI H,FCB+1 MOV A,M CPI ' ' JNZ GOTFCB ;NO FCB - MAKE FCB ALL '?' MVI B,11 ;FN+FT COUNT QLOOP MVI M,'?' ;STORE '?' IN FCB INX H DCR BENTRY TO TABLE XCHG ;ENTRY TO DE LHLD NEXTT ;NEXT TABLE ENTRY TO HL MVI B,31 ;ENTRY LENGTH TMOVE LDAX D ;GET ENTRY CHAR MOV M,A ;STORE IN TABLE INX D INX H DCR B ;MORE? JNZ TMOVE SHLD NEXTT ;SAVE UPDATED TABLE ADDR LDA COUNT ;GET PREV JNZ QLOOP ;LOOK UP THE FCB IN THE DIRECTORY GOTFCB MVI C,FSRCHF ;GET 'SEARCH FIRST' FNC LXI D,FCB CALL BDOS ;READ FIRST INR A ;WERE THERE ANY? STA TEMP ;SAVE CNZ SOME ;GOT SOME - PRT TITLE, CONT GOTFCB1 MVI E,15 MVI C,32 CALL BDOS COUNT INR A STA COUNT JMP MOREDIR ;PRINT TITLE PRTTL LXI H,TTL CALL WRCON ;SORT AND PRINT SPRINT LDA COUNT ;INIT THE ORDER TABLE LXI H,ORDER LXI D,TABLE LXI B,31 ;ENTRY LENGTH BLDORD MOV M,E ;SAVE LO ORD ADDR INX H MOV M,D ;SA  VE HI ORD ADDR INX H XCHG ;TABLE ADDR TO HL DAD B ;POINT TO NEXT ENTRY XCHG DCR A ;MORE? JNZ BLDORD ;..YES LDA COUNT ;GET COUNT STA FILCOUNT;SAVE AS # TO PRINT STA SCOUNT ;SAVE AS # TO SORT DCR A ;ONLY 1 ENTRY? JZ DONE ;..YES, SO SKINX H ;UNUSED MOV A,M ;GET REC COUNT DCR A ;FUDGE RAR ;DIVIDE RAR ;..BY 8 RAR ANI 1FH ;DELETE GARBAGE INR A ;MAKE RELATIVE TO 1, NOT 0 MVI B,16 ;SAVE AS MAX # EXTENTS MOV A,M ;RELOAD RECORD COUNT INX H ;SKIP RECORD COUNT EXTLP MOIP SORT SORT XRA A ;GET A ZERO STA SWITCH ;SHOW NONE SWITCHED LDA SCOUNT ;GET COUNT DCR A ;USE 1 LESS STA TEMP ;SAVE # TO COMPARE STA SCOUNT ;SAVE HIGHEST ENTRY JZ DONE ;EXIT IF NO MORE LXI H,ORDER ;POINT TO ORDER TABLE SORTLP CALL COMPR ;CV A,M ;GET EXTENT BYTE ORA A ;EMPTY? JZ ENDEXT ;..YES PUSH PSW LDA EXTCOUNT INR A DAA INR A DAA STA EXTCOUNT POP PSW INX H ;POINT TO NEXT CHR DCR B ;MORE IN EXTENT? JZ ENDEXT MVI A,0 CMP M JNZ EXTLP ;YES OMPARE 2 ENTRIES CM SWAP ;SWAP IF NOT IN ORDER INX H ;BUMP ORDER INX H ;..TABLE POINTER LDA TEMP ;GET COUNT DCR A STA TEMP JNZ SORTLP ;CONTINUE ;ONE PASS OF SORT DONE LDA SWITCH ;ANY SWAPS DONE? ORA A JNZ SORT ;SORT IS ALL DONE - PRINENDEXT MVI B,16 LDA NFILE ;GET # FILES INR A ;BUMP DAA ;MAKE DECIMAL STA NFILE ;SAVE IT BACK LDA PRCOUNT DCR A STA PRCOUNT CPI 0 JZ CLCR LXI H,SPACES CALL WRCON JMP CLCRPLUS CLCR CALL CR1 ;END, TYPE C/R MVI A,4 T ENTRIES DONE LXI H,ORDER SHLD NEXTT MVI A,4 STA PRCOUNT ;PRINT AN ENTRY ENTRY MVI C,CONST ;CK STATUS OF KB CALL BDOS ;ANY KEY PRESSED? DCR A JZ ABORT ;YES, ABORT LHLD NEXTT ;GET ORDER TABLE POINTER MOV E,M ;GET LO ADDR INX H MOV STA PRCOUNT ;SEE IF MORE ENTRIES CLCRPLUS LDA COUNT DCR A STA COUNT JNZ ENTRY ;YES, MORE JMP EXIT ;TYPE CHAR IN A TYPE PUSH B PUSH D PUSH H MOV E,A MVI C,WRCHR CALL BDOS POP H POP D POP B RET WRCON MVI A,24H  D,M ;GET HI ADDR INX H SHLD NEXTT ;SAVE UPDATED TABLE POINTER XCHG ;TABLE ENTRY TO HL MVI B,8 ;FILE NAME LENGTH CALL TYPEIT ;TYPE FILENAME MVI A,'.' CALL TYPE MVI B,3 ;GET THE FILETYPE CALL TYPEIT INX H ;SKIP EXTENT INX H ;SKIP CMP M RZ MOV A,M PUSH H CALL TYPE POP H INX H JMP WRCON TYPEIT MOV A,M CALL TYPE INX H DCR B JNZ TYPEIT RET SPACE MVI A,' ' JMP TYPE CR1 MVI E,13 ;PRINT MVI C,5 ;C/R CALL BDOS MVI E,10 ;LF MVI C,5 JMP BDOS TEMP DS 1   ;SAVE DIR ENTRY ;ERROR EXIT ERXIT POP D ;GET MSG MVI C,PRINT JMP CALLB ;PRINT MSG, EXIT ;ABORT - READ CHAR ENTERED ABORT MVI C,RDCHR CALLB CALL BDOS ;DELETE THE CHAR ;FALL INTO EXIT ;EXIT - ALL DONE , RESTORE STACK EXIT LDA FILCOUNT CPI MOV E,M ;LOAD LO INX H MOV D,M ;LOAD HI INX H MOV C,M INX H MOV B,M ;BC, DE NOW POINT TO ENTRIES TO BE COMPARED XCHG CMPLP LDAX B CMP M INX H INX B JZ CMPLP POP H RET ;COND CODE TELLS ALL ;SWAP ENTRIES IN THE ORDER TABLE SWAP 25 ;DID IT PRINT MORE THAN SIX LINES JNC EXIT1 ;IF SO DON'T PRINT SPACE MESSAGE CPI 24 ;DID IF PRINT 6 FULL LINES JZ NOCRLF ;IF SO DON'T DO EXTRA CR/LF CPI 21 ;DID IT PRINT MORE THAN FIVE LINES JNC NOCRLF2 ;IF SO DON'T DO EXTRA CR MVI A,1 STA SWITCH ;SHOW A SWAP WAS MADE MOV C,M INX H PUSH H ;SAVE TABLE ADDR+1 MOV B,M INX H MOV E,M MOV M,C INX H MOV D,M MOV M,B POP H MOV M,D DCX H ;BACK POINTER TO CORRECT LOC'N MOV M,E RET ;HEX OUTPUT XO PUSH PSW /LF CPI 20 JZ NOCRLF2 CPI 16 JZ NOCRLF2 CPI 12 JZ NOCRLF2 CPI 8 JZ NOCRLF2 CPI 4 JZ NOCRLF2 MVI A,CR CALL TYPE MVI A,LF CALL TYPE NOCRLF2 MVI A,CR CALL TYPE MVI A,LF CALL TYPE NOCRLF LXI H,EXTMSG CALL WRCON LDA ;SAVE CHAR RAR RAR RAR RAR CALL NIBBL ;PRINT LEFT NIBBLE POP PSW ;GET VALUE BACK NIBBL ANI 0FH ;ISOLATE NIBBLE CPI 10 ;NUMBER? JC XNUM ;YES ADI 7 ;FUDGE ALPHA HEX XNUM ADI '0' ;MAKE PRINTABLE JMP TYPE DS 30 ;STACK AREA STACK DS 2 ; EXTCOUNT MOV B,A MVI A,92H SUB B DAA CALL XO MVI A,'K' CALL TYPE LXI H,LABDAT CALL WRCON LXI H,DATEBUFF+2 CALL WRCON EXIT1 MVI E,00 MVI C,32 CALL BDOS LXI H,RESPRINT CALL WRCON LHLD STACK ;GET OLD STACK SPHL SAVE OLD STACK HERE NFILE DB 0 ;NUMBER OF FILES PRINTED ; NEXTT DW TABLE ;NEXT TABLE ENTRY EXTCOUNT DB 02 EXTMSG DB 'Space Left on Disk = $' COUNT DB 0 ;ENTRY COUNT SCOUNT DB 0 ;# TO SORT PRCOUNT DB 0 ;COUNTER FOR ITEMS ON LINE FILCOUNT DB ;MOVE TO STACK RET ;..AND RETURN RESPRINT DB FORMFEED,CONDOFF,ESCAPE,SPACING,12 DB ESCAPE,FORLEN,66 ;EPSON CODES DB ESCAPE,UNIDIR,0,'$' ;TO RESTORE PRINTER TO NORMAL ;COMPARE ROUTINE FOR SORT COMPR PUSH H ;SAVE TABLE ADDR  0 SPACES DB ' | $' DATEREQ DB 'Please enter today''s date as mm/dd/yy---->$' NONMSG DB CR,LF,'++This program is looking for a file with the name' DB CR,LF,' -disknam.###(disk number) in USER 15. This becomes' db CR,LF,' the disc referenc  e and will remain on the disc even' db CR,LF,' if you ERA *.*.' db CR,LF,LF,'Please save your disk number now as follows:' db CR,LF,' A> USER 15' db CR,LF,' A> SAVE 0 -disknam.### ' db CR,LF,' this dash--^ is mandatory' db CR,LF,' A> USER 0',CR,LF,'$' TTL DB ESCAPE,FORLEN,0,1 ;SET PAGE LENGTH AT 1". DB ESCAPE,SPACING,8 ;SET LINE SIZE TO 8/72" DB ESCAPE,UNIDIR,1 ;SET UNIDIRECTIONAL PRINT. DB CONDON,'$' ;SET CONDENSED PRINT. LABDAT DB ' Label Date--$' SWITCH DB 0 ;SWAP SWITCH FOR SORT FILESW DS 1 ;'F' IF WRITING FILE BUFAD DW 80H ;OUTPUT ADDR MYFCB DB 0,'NAMES SUB',0 DS 19 DB 0 ORDER DS 128 ;ORDER TABLE TABLE EQU $ ;READ ENTRIES IN HERE END 100H DS 1 ;'F' IF WRITING FILE BUFAD DW 80H ;OUTPUT ADDR MYFCB DB 0,'NAMES SUB',0 DS 19 DB 0 ORDER DS 128 ;ORDER TABLE TABL  !9"1 :m2>$2>2:8@  > 2:0:!]~ Z 6?#S\<2ġ \<2Ċ R͡ \<=!o*w#´":<2×!~ͺ:!Is#r# =:22= 2:=22 !p##:=2:!">2 =*^#V#">.ͭ###~=<~#~y:<'<'2#y>]:<'2:=2ʘ!ͺà>2:=2+_>$~ͭ#ú~ͭ#> í   :R0&&& &&&> ͭ> ͭ> ͭ> ͭ!ͺ:G>'͖>Kͭ!ͺ!ͺ !dͺ* A CBU$^#V#N#F #y>2N#F#^q#Vpr+s͟ ڨ0í_>$~ͭ#ú~ͭ#ISpace Left on Disk = $ | $Please enter today's date as mm/dd/yy---->$ ++This program is looking for a file with the name -disknam.###(disk number) in USER 15. This becomes the disc reference and will remain on the disc even if you ERA *.*. Please save your disk number now as follows: `^>2rh!"ph4!7|;R8C!@c>UB]ͥ4͙4~R*5og#}͙4w͙4~og@ }3>!sh&U͝4#![cxuT>2th!uh]c>_U,͝4#͝4#>U!^c> Us8+M>DTG!uh>_U!hcuh>VT!uhUͰQ}2th*ph:thogͼX͝4#hc>GpU͝4#h A> USER 15 A> SAVE 0 -disknam.### this dash--^ is mandatory A> USER 0 $CAU$ Label Date--$rNAMES SUBsc even if you ERc>GpU͝4#!hcxuT,I52th!h͓!uhU͙4#T!h &U4L?w5!|h6:|h9!h~#RC!`/B!jc> Uʹ8]RC!`/B*h> $Sʹ8!tc>Uʹ8]!h/RC! a/B|4*h X^#V> $Sʹ8!vc>Uʹ8|4+*h   X>Uʹ8]ͨ4!h&U!h!}h&U!yc}hxuT!h~#!zc}hxuT!{c}hxuTRC>/E!|c>UB]6!~c}hxuT!c}hxuT!hʹ/6!c}hxuT̀.6!c}hxuT!h/6!c}hxuTDRC!auT|4*h X~|4*h XA*h#"h|4*h X|4*h X-T*h#"hÕ*h"hp ͙4~og+"h!h> "h!cͱX*nh##~og+++7R"h*h*h X"h!"h#"h*h"h*h*hͼX |4*h X~og"h|4/B!c>Uʹ8]!hc>pU!h)2h!h"2~hRAC>/E]6!c}hxuTY6!c}hxuTnͬ 6!yc}hxuTƒ46!c}hxuT˜ -6!c}hxuT­)6!zc}hxuTs 6!c}hxuT!h>0!hʹ/6!c}hxuT!h16!c}h*h X~og)))))|4*h X~og"h:hJ !"h*h#"h*h))))"h*h >ogkX"h*h*h|4+++*h Xs#r*h*h+*hkX*h X"h*h*h|4*h Xs#r|4*h X^#V*h"h*h#"hR+ C!a/B*h>xuT 16!c}hxuT"6!{c}hxuT6!|h6_ͥ4x!ch >98|q͙4#c>GpU͙4 c>GpU~!hc> pU͙4 6?͙46?͙4~=2h!h4:th2h:ph2hþ:th2h:th2h͡4"h!h/5!"h:h2h:h2h:hog:hogͼX\!hP5͙4"h!h $Sʹ8!c>Uʹ8*h> $Sʹ8!c>Uʹ8]R^ C!&a/B!c>Uʹ8*h> $Sʹ8!c> Uʹ8]Ro C>/E]; R C!2a/B!c>Uʹ8]!h)2h:h¢ :hog+"i!h> "h!cͱX*nh##~og+++7*hSͦVR"hR) C>/E!7a/B!c>Uʹ8*h> 42h:hU*h#"h͡4#:hog)))))!h>G_U!h|4*h X&U͡4 :hog)))))!h>_U!h|4*h X&U͡4 :hog)))))~|4*h Xw͡4:hog)))))~|4*h Xw:h|4*h$Sʹ8!c>Uʹ8!h>Uʹ8!c>Uʹ8]R: C>/E] ^#V"i*i~2i!i4D5"nh75"i*nh^#V>ogkX#"i*nh^#V#"i!" i*i"i*i* iͼX !" i* i | *i~! iF!Tր *i+"i* i#" iæ *i#"i* i#" iÓ *i|!h~# |4* Xw͡4:hog)))))~|4*h Xw|4+*h X~c>GpU42h!h4 {̈́!"h"h!h"hÁ!h~#…!"h#"h*h"h*h*hͼXz|4*h X|4*h XxuT|4*h X|4*h Xxh# X"i|4*h## X"i|4*h### X"i|4"i!"i*i*i))6#6*h*i++*i))s#r!i#{*i*i))^#V"#i*i++*i))^#V"%i*i+"i*#i*%iͼXx*#i"i*%i"!i*i*!i>ogkX"i*i*i*i X-T*!i  *iͼX *i*i X*ixuT5 *i#"i *i*i*!i XxuT` *!i+"!i5 *!i*iͼX *i*i*i X-T*i*i X*i*!i X-T*i*!i X*i-T*i#"i*!i+"!i *i#"i*%i*iͼX*!iUʹ8]R*C>/E!ra/B!jd>Uʹ8]RLC>/E!ya/B!d>#Uʹ8]RnC>/E!a/B!d>Uʹ8]RC>/E!a/B!d>$Uʹ8]RC>/E!a/B!d>-Uʹ8]RC>/E!a/B!e>3Uʹ8]RC>/E!a/B!9e>Uʹ8]RC>*#iͼXͼXC*#i*i*i))s#r*!i*i++*i))s#r*i"#iu*i*i*i))s#r*%i*i++*i))s#r*!i"%iï t 1^#V"'i*'i!c xuTš!*h")i!"+i*)i*+iͼX*+i*)i>ogkX"-i|4*-i X>U|4*-i XT*'i /E!a/B!Le>Uʹ8]R:C>/E!a/B!he>Uʹ8]R\C>/E!a/B!e>Uʹ8]R~C>/E!a/B!e>Uʹ8]RC>/E!a/B!e>Uʹ8]RC>/E!a/B!e>Uʹ8]RC>/E!a/B!e>Uʹ8]R%C>/E!a/B!e>U_T*-i#"+i*-i+")iæ*h*+iͼX-!"+i*+iÐRQC!Ea/B!c>Uʹ8]!1i)2/i:/ic:/i͙4w!sh0i>GpU:xh2th!uhyh>[U?^#V"5i*5i~og>$S!:i&U*5i~og |!:i{?TG!7i>_U!:i>?TG!7i>_U!7iUÏUH^#V"Bi*Biʹ8!sh>Uʹ8!uhUʹ8!c>Uʹ8]͙4~=2i!i4RTC!a/B!e>Uʹ8]qC!a/B?!yi28"i!yi*i#=TG!i>_U!iK!yiVT¶!]cyi>28|!cyi>28|ͿRC>/E]!ik!i &"Di>2Fi*Bin&}2Gi:Giog:FiogͼX?*Di:Fiog>w!Fi4*BiUÏUÞ^#V"Hi*HiU!~c>Us8"Ji!Ji~#ʒ*Hi*Ji=TG!Ri> _U!Pi͡ÏUÝ!c>UÏU^#V"_i!ai6!"ni*_in&"pi*pi*niͼX*_i*ni]8TG!ti>pU!ri!ai ͣT*ni#"niü!aiUU!iRC>/E]üi~# !|4*h# X"i͙4~*iw|4*i^#V X*i#>GpU|4*i^#V X*i >GpU*i 6?*ic>GpU*i> DT*iG>pU*i > ?T*iG>pU*i6*i6?*ic>GpU|4UI^#V"ui*uin&"wi*wi |/*wi |>*wi }3>*uiG&U*ui>UÏURiC!Ja/B!c> Uʹ8]RC>/E!Qa/B!d>Uʹ8]RC!Xa/B!&d>Uʹ8]RC!_a/B!7d>Uʹ8]&RC>/E!fa/B!Hd> Uʹ8]RC!ka/B!Qd>*i^#V X"i!iP5*i"i!i4ʥRC>/E!a/B!f>Uʹ8!sh>Uʹ8|4*i^#V X"i!c>U!i͓Tʹ8*i> Uʹ8!f>Uʹ8]!i͵'RC!a/B!f>Uʹ8]*i"i!i/RC!a/B!$f>Uʹ8]ͨ4!i&U  !i!i&U!AfixuT&!i<5'*i~ORLC!b/B!Bf>Uʹ8]lRlC!b/B!Qf> Uʹ8]*i"i!i/RC!b/B!Zf>Uʹ8]R C!b/B!sh>Uʹ8|4*i^#V X"i!c>U!i͓Tʹ8*i>Uʹ8!af>Uʹ8*i>*j |e*j*j]> DT!j*j]> DTuT*j*j]> DTG!c>uT[*j#"j>ò^#V"j*j!af>28"j!j~#ʽ*j*j+M8TG!j>pU*j*j#=TG!j>pU*j!j>lU!jzf>GpU!j6!"j*j |:j/4!j*j]>Uʹ8]!iAf>GpU*i~TR;C!b/B!bf>Uʹ8]ͨ4!i&U!i!i&U!AfixuT»*i"i!i"5*i|4*i^#V X>GpU*i|4*i^#V X>GpU0RC>/E!$b/B!ef> Uʹ8]C!)b/B?!iuT*!j6!j*j>?TcpU*j#"j!j6!"j*j |:j/!j*j]>DTG!]c>uT‰!j6!j*j>?TcpU*j#"j?!j>U!af>U!jTTÏU^#V"j͡4"j!j/5*j"j!j42j:j>3>͡4 :jog)))))i!ci>28#=TG!j>_U!jK!iVT:!-jk!i &UReC!.b/B!of> Uʹ8]C!3b/B?!i/E]!i!ci>28#=TG!1j>_U!/jK!iVT!Fjk!j &U!"j*h"Hj*Hj*jͼX!Jj͟_T >|j~# |4*h# X"j*j~*jw|4*j^#V X*j#>GpU|4*j^#V X*j >GpU*j 6?*jc>GpU*j~=2j!j4|4*j^#V X"j!jP5!j͵VRC>/E!8b/B!f>Uʹ8]*j"j!Tj3!Xj &U!Nj*j#"jR/C>/E]Üdj~# 8|4*fj^#V X>U!af>U|4*fj^#V XTT!lj &U!"hj*hj |*dj*hj]> DTG!xj>pU!cxjxuT!lj*hj]> DTxjpU*hj#"hjÔ!"jj"hj*hj |R!j/R#C!=b/B!}f>Uʹ8]ͨ4!j&U!j!j&U!AfjxuTT!j<5V!j5RyC!Bb/B!f> Uʹ8]>é RC!Gb/B!f>Uʹ8]ͨ4!j&U!j!Af_Tʹ͙4"j!j|4+*h X!]cxuT* *h|4*h X^#!lj*hj]> DTG!xj>pU!~cxjxuTH!lj*jj]> DTxjpU*jj#"jj*hj#"hj*jj"hj*hj |!lj*hj]> DT~cpU*hj#"hjX!{jlj> _U!yjkÏUhj~# ¤|4*j^#V X>U!af>U|4*j^#V XTT!j &U!"jVͼX"h*h|4+++*h X^#VͼX"h*h+"h*h"j*h"j*j*jͼX |4*j X|4*j# X-T*j#"j= *h*hͼX R C>/E]!"h"R C>/E!Lb/B!f>)Uʹ8]ͨ4!j&U!j!c_T2jR!C>/E!Qb/  B!f>%Uʹ8]ͨ4!j&U!j!g_T2j:jW!RW!C>/E!Vb/B!g>Uʹ8]Rh!C>/E]!j6!"j*h"j*j*jͼX/:j/!|4+*j X!]cxuTʸ!:j!!!:j!!*j#"jy!?":jr"R!C>/E![b/B!g>Uʹ8]!!b/B!g>Uʹ8!k>Uʹ8!Mk͓ʹ8!c>Uʹ8]:hW&RW&C!b/B!g>Uʹ8]*)k#"%k!k6!k6:k'!"k*)k~=2Qk!Ok4|4*j^#V X"Rk!RkP5!"k*k+"Tk*Tk*kͼX/:k/ '*%k*k)"Xk!Vk/5*k@ "k*)k"\k!Zk 5'!k6*k"j/R!"C!`b/B!$g> Uʹ8]ͨ4!j&U!j!j&U!AfjxuT["͙4"j!j2~ho"!cjxuTo"!j6"R"C>/E!eb/B!-g>Uʹ8]!j/͙4"j!j2~h4"ͨ4!j&U!j6)j~# "*j~"*j~og@ }3>!k&U|4*hk*k#"kó&!"k*'k~=2`k!^k4!akP5!"k*k+"ck*ck*kͼX/:k'*%k*k)"gk!ek/5*'k"kk!ik5t'!k6!k6:h'*%k*k)"qk!mk͎5"!k*k@ "k*k#"k2'k&*'k"uk!sk4 S2~h:h:k(*)k "%k*'k6*'k 6*'k"yk!wk4 S2~h!k6:k~(# X"'k*'k#")k*j~*'kw|4*j^#V X*'k#>GpU|4*j^#V X*'k >GpU*'k 6*)k*'k$-T͙4~*)kw!shkxuT­#*'k {DT5gpU:xh#|4*j^#V X~2k#:xh2k!+kP5*'k"/k!-k͵Y$RV$C>/E!jb!"k"k*k+"{k*{k*kͼX/:k/{(*%k*k)"k!}k/5*'k"k!k 5Q(!k6g(*%k*k)"k!k͎5"#k*k@ "k*k#"k('*!k*#kͼXʴ(!k6R(C>/E!b/B!g>Uʹ8]:k(R(C!b/B!g>Uʹ8]*'k 6?*'k"k!k5ñ)!shkxuT±)/B!k>Uʹ8!c>U!1k͓Tʹ8*'k#>Uʹ8!af>Uʹ8*'k >Uʹ8!6g>Uʹ8]>*'k"5k!3k5!shkxuT|4*j^#V X~!k %*)k"9k!7k͵%R%C>/E!vb/B!k>Uʹ8!c>U!;k͓Tʹ8!af>Uʹ8*)k#>Uʹ8*)k >U|4*j^#V X~!k:thT)RT)C>/E!b/B!g>#Uʹ8!g> Uʹ8]|4*j^#V X~!kʱ)*'k*)k-T*'k"k!k4ʫ)*'k"k!k5!k"5*)k"k!k4 S2~h:k-k~# )!h6R)C!b/B! h>Uʹ8]R&ʹ8!Ng>Uʹ8]>*)k"?k!=k5*'k 6*)k6*'k"Ck!Ak5_%R]%C!b/B!gg>Uʹ8]|4*j^#V X"Ek!EkP5*)k"Ik!Gk4 S2~h͎4*h XͼX >@ogkX"k:h%!"!k*!k"#kR%C>/E!b/B!g>Uʹ8]*j"Kk!Kk/R3&C*C!b/B!b*k^#V XUʹ8]*k^#V+++|,R*C!b/B?!kVTc*>!ck>28}2k:kʍ*!k:k_8T~cpU!~ck>28}2k!kK8TG!k>pU!k*k&U:k*!k=TG!yh>_U!hh> pU,!k:kog++M8TG!yh>  _U!k:kog#=TG!k>_U!kK!k28!]ck>28|Y+!kk!k28}2k:k}+!hk> lU+!k:kog+M8T!h> DTpU!k:kog#=T!h > DTpU!h> DT͙4#>pU!h > DT͙4 >pU!hk*k^#V+|.0*h*ks#rR+0C>/E]:0*k^#V+r+s1^#V"k|4+*k^#V X!]cxuT0|4+*k^#V X]c>GpU|4*k^#V X^#V*h"h|4+++*k^#V X^#V*h"hR1C!b/B!0h>Uʹ8*h> $Sʹ8!Jh>Uʹ8*h> $SK> DTG!c>uT2h!hyh>VT9,!yhuh>[U:th2xhy,!]cyh>VTO,>2xhy,!yhU!h> Us8|l,>y,!yhUͰQ}2xh*ph:xhogͼX,>,,C!b/B?*k&U]*k!h>uT,>*k"k!k*k&U*kn& "k:rhog*kͼX*k+|,>ʹ8!Mh>Uʹ8]1^#V"k|4+*k^#V X!]cxuTˆ1*h|4*k^#V X^#VͼX"h*h|4+++*k^#V X^#VͼX"h|4+*k^#V X~c>GpUR1C!b/B!Oh>Uʹ8*h> $Sʹ8!Jh>Uʹ8*h> $Sʹ8!Mh>Uʹ8]*k"k!kʹ/a4|4*k}}.R&-C!b/B!c>Uʹ8]!k)2k:k8-:xhG-!k6L-!k6!k6!"k*h"k*k*kͼX/:kG.|4+*k X!]cxuT&.:k-|4*k X~2xh!k͓!yhGpU*h|4*k X^#V4*h# X"l͙4~*lw|4*h X*l#>GpU|4*h X*l >GpU*l 6*l 6R2C>/E]|4*h X"l!lP5!l4 S2~h*l#" l͎4*h XͼX >@ogkX" l* l> og7" l!l6!l6:l:l/A4!X"h*h|4+++*k X^#VͼX"h4=.ͨ4!k&U!k6*k#"k]-:kk.Rk.C!b/B!h> Uʹ8]R|.C>/E]/R.C>/E]!"k*h"k*k*kͼX.|4+*k X!hxuT.R.C>/E!b/B!(h>Uʹ8]!k/!k>0*k#"kÝ."l"l* l+"l*l*lͼX/:l/`3* l*l"l!l/5*l "l!l 5V3!l6*l" l*l#"l3!"l"l* l+"l*l*lͼX/:l>4!"l!hh>S!jh>ST͠Q"l*l*lͼX/:l3* l*l*l!l>GpU!lhlxuT3!l63!!lͳ4*l#"lã3*l "lR/C>/E]ñ/^#V"kR/C!b/B!sh>Uʹ8|4*k^#V X"k!c>U!k͓Tʹ8|4*k^#V X>Uʹ8!af>Uʹ8|4*k^#V X>Uʹ8]/^#V"k*k^#V*hͼX|/R/C>/E]*k6#6/*k^#V#r+s;0^#V"444ͨ4!l&U!mhlxuT/4ͨ4!l&U44!l6*l#"lp32!#l4 S2~hR`4C>/E]ͩ_^#V#Nd4WY *n**n{ozg̀4|g}o!\!l!3>d4Y!4* >  d4Yl4l4l4!  l4l4l4l4l4l4l4 d4Y l4d4yg)r5|g}!o f55x!b5r#s#|5l4l45ң5_ҩ5go˜5:>2/`ͬ:Ͷ:":: : Ϳ:ͬ: :.9:ͬ:Ͷ:9:Ϳ:ͬ:*:eC:E†:ͬ:+S:ͬ:\:-\:ͬ:Ͷ:XGͬ:Ͷ:z:xGGGͬ:‚:GyOʕ: Xͬ:Æ::*`ҧ:Ϳ:Ø:y2.`ʳ:~#z0 0!2`_w!*`~:4_!`sXX2-`G:.`<2*`=X:`XB;;:`;!.`5!1`4X:,`G:+`(;!/`:>20`e;͢?!+`54;:,`!.`<_!`>w w>+W;!-`~5>.͝;G:0`x0„;:-`> !/`~ʗ;5!-`4!*`5-20`x!*`^4{;Ҷ;!`~0>0"'l*`~2+l:/`;R>;X:+l2,l>V?>!,l;5~/o :2`<>9?><>*|7|{zͶ7|XDM̓XogX7QY,8QY!9ͫ?> < <*:,l!9q#=<">>2-l<2.l2/l͝;2*l:.l_:+l">*`~2)l:)l9<:-lo<:-l2-l2>o<:/l=O:-lͲ>ͪ>:/lO:*lͪ>)>( ͪ><:-l2-l:/lO:*lͪ>)>(<:)l2>h=:)l>=:)l͏>=:/lO:)lͲ>ͪ>)>V+|73333$8!!ͫU/<|éXF98e8Oe8\8# i8G8d8D8glʬ8~ ʢ8ʛ8#Ï8#Ä8H o&>"`88BZ!988~#͢?8> ͢?8&99x2+`y 82,`.<:)l2-l:/lO> ͪ>)>.<:-lX=:*l05=:/lO> ͪ>b=:/l=O:)lͲ>ͪ>:/lO:*lͪ>:-l2-lb=:/lO:*lͪ>)>(<:)lV¦=:-lʔ=:-l2-l2>”=:/l=O:-lͲ>ͪ>:-l =<2-l->.<:/lO:)lp>=:-l=:)lB==:-l*=> ͪ>)>.<:/lO:)lC=D:/`=> ͪ> ͪ>>:)l"%l9<;*%l“9x2+`=XA 29A2929G:+`=Xx2,`"%l9!.`F6!`~#V9x=21`;>E͢?:1`+o9-/ͪ> >Rͪ>>ͪ> >Bͪ>)>)>.<:,l*'l!/l4!.l4S+-$G:+lOx*`## I><>S?>>+?>>-?>>C?>>D?>:/,.B!.lN*`# Ⱦ†>G:.l_:+lO x*`# Ⱦ¡>!i#9w$G:/`>x+->S>x+>-S>>+>-> 3B >x=>Gj?> "?"  :J` ??!9`x>?͙?>E> 6?>> ͢?(? H?xB?>͙?> S?j?>x]?>>=E]?ʗ?x!7`?͗?j?:H`ʊ?ڗ?:7`> ͢??>25l!3l8E:H`ʾ?!7`Ҿ?> ?> ??22l!0lEA?y<>?= ?x@O)Bo͈A####Wp~0D!`m>UG3!!!`ʹF!`"tm!rmxHXD!`m>UG3!R.!!`ʹF!`"xm!vmxHmD*hm"zm!zmxH!|mF*lm^#V!@`s#r*nm^#V!B`s#r*jm^#V'T|*P`'T|GʲD!mE*jm^#V}*P`}GD!mE:`D*jm^#V}*P`}GD!mE:`EA @60#1@E@>ew#.@e#@x1@͓A @{AGZ+y=\@x=T@0 \@60$^@w h@+6.$y=>@x=>@@x<@!9ͩA ̩A ʨ@ ʨ@w# XÐ@H !9 ʻ@+wð@xOo>g9x ͩAX @ @w#@)B=@<)B<_)BK)B *jm^#V}E!mE^#V"m!a`"m*m"m!m{Z2m!m8E^#V"m:|`GE:~`sE*mpE*m5!m6:m mE͠E_ENEßE!mE*mE*m5!?`6!mE:?`ʜE*m6yEH2m:mE!a`"m!"m!m{Z!7`6#6!m6 :`E!mE^#V"m!3`"m*m"m!m;MF!a`"m!@oW͈A##pAUAK0X *A0_X *AXK0w# 7AxUA͓A A{AGZkA+w`Ax͓ApAx͓AX{Ao>g9##ͩAX ʓA ʓA XH½A!6l{Z> 3B AAHA AxA> BA AABx!7`B"m!m{ZFóF:|`F*m~ ,F*7`#"7`óF*m~ @F!7`6#6óF:`F*m~ bF*;`#";`!9`6#6óF*m~ ³F*9`#"9`!9`#F!9`6#6*9`*J`#ͼX|³F!a`"m!"m!m{ZFE!?`6"m!9"m!mF! 9^m~# F*m^#V|F*m*m -TBA:H`BB:7`HB>2Dl!Bl8E!El{Z×BB^B^#VpBNB͗B3B#FiB#NiB#^#r+s#^#V++r+s~3B53BB5^Bq#p3BOB4~ ҵB_Bs#r#s#r#q!B{ZBBa`BB Format Overflow*c`-&t`!flCO:`yC!*m nb"G*m !m>lUU*mT!m&U*m~#hG*m^#V)))|hG*m6P#6*m~#¢G*m^#V))|G*m6#6âG*m6<#6*m6#6*m6#6*m6#6*m 6*m^#V}oQ}2m*m^#V}G!m44*m9GC~#'CCyCO:|`*CsCͦC3C{;C*H`|dCj& *H`*7`ͼX#ͼX> ܮC> ܮCͦC> C{=>'ĮC!9ʕC=~#'ŽC{>'̮CͮCyC{=>'ĮC{>b̮C*7`++|2m!mEɯC>C>2m"m"m`i"m!9"m! mCfm ~# C*fm~[D*fm^#V}H>2m*m^#V}:H*m~#:H*m6#6*m"m*m"m*m"m!m͛L*m^#V|wH*m"n!"n!m{Z^#V^#V0^:c`ڕH!H{Z2c`O!t`¤H6éH +~#w!d` s#r!c`4]HHa`HH I/O Stack Overflow:?`H!3`" n!nͫMH!n6I:?`2n#  !?`6:n I*7`#"7`:n $I!7`6#6:n"O"O*O^#V#"O^#V2I>I"O>I"O|CI|~2I>IyasIA =.:;<>[]y *OeI ͏IÛIeI$͏IeI1ڽI o&))))\xH  I#w I͏I͕I*O# JA JG͏IDNÂO(ICIʂO~WK>DNʂO*O~,N>ÂO5NPÂO*O!*~!/2O*O|YN(^#V^I^I{zlNzN2OzʛN:ONͧKqÖNNK#vN*O|N*~N=!ON:OLNNwíNM>(ICIʂO|}ʂO~> ҂O<ÂO(ICIʂO|O*eI:J 6Jp4͏I+ͧI8J#eIDJ#*0J6?4Jw͏IJeIKJ͏I8J#6 DJ.„J͏I ͧIxJeIʄJ#*pJ6?tJw͏I_JeIʋJ͏IxJ#6 „J%#6J*O##^ ~?¤J# JxCON CON RDR PUN LST M!J ~͕I$҂O"N#F#~2Iq#p#w>ÂO(IUIʂO>‚O*~^I!qO=cO>!*O" s#r#w=ÂO*O }!fn6 4>2en*bn!4#4#4~#N#F#y#x#:en*bn!!:dnOOҺO:fn ɯ*O+>K^#VFK#{#z>K6#6FK r+s! nF#~ڝK! n6P  F^ F^! n^r+s6 #6 ! n4^N*O|K}=ºKmKKJKO>~KK>LN*O|LYJ=KyKF^L~G~#~O?:P#~:P! p! y! q<>P<ͺOɯ~#N#F#w#q#pͱO͡O~hP#!!@P! 6?<ʣP= _!xڗPPFNvPwxG>O>G!$q#p#6P"_n"bn2anx2dn͡O2enͱO!an~5iQO Q=6Q:dn6Q*bn>~L=L>Lq2O*O/"OMKrL{WKFK*O*O#:OO[LFK#s#rdL`KMK4LWKLFKr+s{ƒL!O4*O+>|ʒL+}o(I2I~2O2I"OCI:OҡMJLG:OҡM*OpL4#6ÂO^I:OL͌L*O++"OL}+L͒L}|2O"< Qen6Q*_n:dnO*bn:fn'Qy OBQ:dnºO*_nw# Gx|g}ovQ"gn>3R*gn"in̓QͰQ*in"in̓QͰQ*inG!9!x R R+Q$%XgR-Q0X:X0T])X)XX)Xo|O^I͌L"O1'Y|ʡM##"O6*Os#rI O{ O*O:Ow?M6bM*O"OÂO*Ow#wÂO(ICIʂOͧK2IqÂO(ICIʂO2INKÂO*O~" 4#4#4(ICIʂO~M5N;PʂOWK>gXþQ{R$%X}R|Xz-̩Xo&9}O!9 w#AR60#60! 9~ pR!97>?'w#aR-!9~͵RʉR~#͵RvR! 9~.›R+60çR0§R6 #R+r>o&9y>o&90w+R6.!9͌W}!RX/"S)X=S|/G!͇S mS>0|S rS>-3~ST]))ԇS寕iO>`G>0 ҪS<âS DM0 > og|SͩX!ͰWSw#GOS\{E=XD=XzE=XD=X\e. +X 1XS\e. X!>)ҖX ҞX=ʧX)ÐXɯo>g^#V#N#F{ozg||/=!X{ZXXXXX Conversion2Y!X{ZXYYYS!9!7>?'w# Tȇ!T)'Tyw# -T~#DT~#W #ÙT!9Oo>gyͽT~#o>gxGTGpUwF#"knxUT*kn!9G_>WObk++ Y2"Yx2!Y!Y{Z!Y"Y#Y%Y#}OD*n~iY##~#fo0Y!EY{ZMYNYOYQYSY Free Space Exhausted##^#V#{_zW2Z{_zW5Y4zY{ڸY##^#V# ##s#rs#r#s#r+++~sw#r####}*n}|,Z*{z,Z+F+N+V+5^{2Z{z2Z}|2Z{ Z Zi`~ U~+Uy~#/XͩX#"nn"xn`i"vn͌W*nn"nn!mnw`i"pn͛V͞V"rn*pn*vn͂V"pnsw#r##q#p i`N#F#^#V~2Zq4#p+i`##s#r8Z_TZ_ FREE Request Out-of-Range$ Free Space Overwrite$GKғZMbkÓZ`\F_\N_\N#F_\^#V"`y2`xҦZi&͠]ZZx½Z>Z!a`{#z*@`*B`]xyxZD[_!|\^#V͛V"tn*xn X͛VͩX*tn*rn|DVͩX*vn͂VͩX*pn|\V)))\V\V*vn͂V*pn))WV)\V:nnO:onGz|Vz|V ))kVkV:mnðWͩXDM>!=))ҍV ÓV͞V|g}omWVQWV͌W2zn"{n!}nr#q#p͌W*{n"{n!znw!nr#q#p:~nG:n=X:nG:n=X:}nG:n=X͛[>[>(@[yw[>)@[|![3[\|-[3[͛[ͭ[é_>,@[>[> _F^ F^ F^0:@[@[N[N[>[|\[}\[ ڇ[dԉ[ ͉[ڔ[Ë[xN[N #~@[Ý[!n\͛[*n!9{_z[{[ [[>[>#@[*n>=^#V#h[[[>: :~nG:n=X:nG:n=X:nG:n=X (W .W 5W|e. ?Wo&:zn*{nDMðW"n!eW^#V!9*n3333!W^#V!9!33333333###~›WGOW_goހ_W+~G~+N+f.zWzW ))WW}W$WWWxWWW> Y>Yyƀ\>?@[!f\͛[͛[>=@[^#V|8\}/\.))\Û[#F>A[> #S\~ >.[~ [=D\^#V# File: Traceback:\\\\\\\\ ERROR FIXED OVERFLOW OVERFLOW UNDERFLOW ZERO DIVIDE END OF FILE UNDEFINED FILE KEYNULCONCONRDRPUNLST%  BADG!`~/]]_ Condition Stack Overflow$4Ox!n w#s#r#s#r!9!` s#r!`N!n +++++h]#{]#zʆ]++~h]++!`5!~# •]Ñ]!`N!n +++++°]#~#]+{]#z]++~ð]#^#V=!c`~0^5:c`_!d`^#V"a`3`    and user (and v to verif.~# ^*P`)))))|` )| ^*3`|}*`"7`:c`*a`3`w# =^*`{ W^ [^!#"`Í^Copyright (c) 1980 Digital Research, v1.3 !"n"n"n2`2c`*n ^"nq#p##}o"n*}o|^__+w+w+r+s4w#w#s#r<2n++*ns#r"n*ny): and user: : Sorry, CP/M2.2 is required.??*1234567890 No files. . k :LSX ABC ToDEMRTUV???????????? Files occupying k(k remaining) Which******k remaining on Drive : NewSWEEP vers#"n*nDM!nx~Ÿ_#~+Ÿ_+F+Nq#p*n+"nʚ_ҝ_=P_!+~O~#~G!>w!/xx_yʕ_ >O6# o_ __=ɯ ~#fo++_!n~#_*n_©____  Insufficient Memory$ Invalid I/O List End of Exeion 3.6 - July 2, 1982by Robert FisherDePaul UniversityChicago, IllinoisCommands:A: Again. Retag # files.B: Backup to last file.C: Copy file with optional verify.D: Delete file.E: Erase all tagged/untagged files.L: Login new disk and user and reset scution$ ` 8 8 8SYSINSYSPRINT ystem.M: Mass copy of tagged files with optional verify.R: Rename file(s).S: Space remaining on disk.T: Tag file for transfer.U: Untag a file.V: View a file at console.X: Exit to CP/M.?: Redisplay menu.sp or cr: Next file.Drive New name or * :     $ ' '                 Cannot rename. already exists.File is R/O. Okay to rename?(Y/N)YO.K. to rename Renaming ====> . ? Old name: New name: is R/O. Delete anyway?(Y/N) Deleted. Delete? (Y/N):Erase tagged or untagged files? (T/U) : Do you wish to be prompted? (Y/N) :&   NType A at prompt to abort.Erase ?(Y/N/A)Erasing $is R/O. File not copied. is R/O. File not copied. Out of directory spaceCopying =====> with verification CRC check failed. Error. Disk full. Warning: source = target. Re-log drive for an accurate lllll2l5l>l?la`@lDlMlNla`OlQl Invalid Format Itemdirectory. drive0123456789#****Aborted.Tagging Total of tagged files = k (k) Total of tagged files = ( thhh hhhhchchhhwhhhhh02h +hh<h> J h chimmmmmm Stream/Record Sequen/Direct Input/Output Keyed Access P< $contmxm3`Tmm*m8mFmdmemmm mmmmm mmmmmmmm.datmmmmmnn ./i-&')*+(%12c0iRitiiihieyiiiiiii nnnji1jiijjXjyfjj{jjjjjjjjhjjjjjjjk/kk5k9kk?kCkIkkQkXk\k`kkgkkk!kqkukykkk#kkkkk'kkkkkckxhkkkk'   DISK.DOC -FOG/UTL.013 First Osborne Group (FOG) Utility Disk This disk contains CTERM and PLNK0124, two terminal emulator programs for communicating with a modem. To run either, place the .COM file in drive A. At the A> prompt, type program where program is CTERM or PLNK0124. For instructions, refer to CTERM.DOC or PLNK0124.ASM. When using CTERM, the boot disk must have system tracks configured for a serial RS232 printer. Use  SETUP to toggle the printer as a serial device. Then press and . DIRLABEL, submitted by Dennis McFerran of FOG, is similar to DSCLABEL found on -FOG/UTL.009. To print a label of file names extracted from a disk directory, place DIRLABEL.COM in drive B and the disk to be labeled in drive A. At the A> prompt, type B:DIRLABEL For information, refer to DIRLABEL.ASM. SWEEP36 is an update of SWEEP14 found on -FOG/UTL.005. To run, place SWEEP36.COM in drive A. At the A> prompt, type SWEEP36 The program is self-prompting. Jim Woolley FOG Disk Librarian October, 1982