This file, LUX800.JAR, is a "join archive".  It contains the following
files for ABC800 Kermit:

k.bas
k.hex
kermcsum.asm
kermpack.asm
kmain.doc
kmain.hex

See kmain.doc for English-language documentation.  All other commentary is
in Swedish, written in the 7-bit Swedish National Replacement Character
Set (Swedish ASCII).  You can view the correct Swedish characters by using
a Swedish terminal, the Swedish NRC on a DEC VT200, 300, or 400 terminal,
or SET TERMINAL CHARACTER SET SWEDISH in MS-DOS Kermit 3.0 on an IBM PC or
compatible.

Each file begins with a line having the filename enclosed in triple angle
brackets, for example <<< k.bas >>>.  All the lines up to the next
<<< filename >>> line are the contents of the file.  You can break up this 
"jar" file into its consituent files using a text editor, or with a program 
like the following one, which is written in the C language.  If you call this
program "unjoin" and you have a "jar" file called foo.jar, then you would
break up the jar file by typing "unjoin < foo.jar".
---(cut here)---------------------------
/* unjoin -- Split a "jar file" up into its original component files.  */
/* The jar file is read from standard input.  */
/*
/* This program can be used on UNIX systems, and with Microsoft C */
/*
/* Authors: F. da Cruz, C. Gianone, Columbia University, 1988 */

#include <stdio.h>

int files = 0;
FILE *fd;
char *name;
#define BUFLEN 1000
char buf[BUFLEN];
char msg[100];

main() {
    while(1) {
	if (gets(buf) == NULL) doexit(0);
	if (chkhdr()) {
	    if (files > 0) fclose(fd);
	    if ((fd = fopen(name,"w")) == NULL) {
		sprintf(msg,"Fatal - Can't create %s",name);
		perror(msg);
		doexit(1);
	    } else files++;
	} else {
	    if (files == 0) {
		fprintf(stderr,"Fatal - not a joined file!\n");
		doexit(1);
	    } else {
		fprintf(fd,"%s\n",buf);
	    }
	}
    }
}

chkhdr() {				/* Look for "<<< filename >>>" */
    int i;

    if (buf[0] != '<') return(0);
    if (buf[1] != '<') return(0);    
    if (buf[2] != '<') return(0);
    if (buf[3] != ' ') return(0);
    for (i = 4; (buf[i] != '\0') && (i < BUFLEN); i++) ;
    if (buf[i-1] != '>') return(0);
    if (buf[i-2] != '>') return(0);
    if (buf[i-3] != '>') return(0);
    if (buf[i-4] != ' ') return(0);
    buf[i-4] = '\0';
    name = buf+4;
    return;
}

doexit(x) int x; {			/* Exit from program */
    if (files > 0) fclose(fd);
    fprintf(stderr,
	    "Done, unjoined %d file%c\n",files,(files == 1) ? ' ' : 's');
    exit(x);
}
---(cut here)---------------------------

The ".hex" files listed above are binary files encoded in hexadecimal: 2 hex
characters represent one 8-bit binary byte.  Line breaks should be ignored.
Here is a C program to translate a hex file back into a binary file:

---(cut here)---------------------------
/*  UNHEX.C - Program to translate a hex file from standard input
 *  into an 8-bit binary file on standard output.
 *  Usage: unhex < foo.hex > foo.exe
 *  Christine M. Gianone, CUCCA, October 1986.
 *  Modified Aug 89 to work right with Microsoft C on the PC.
 */

#include <stdio.h>			/* Include this for EOF symbol */
#ifdef MSDOS
#include <fcntl.h>			/* For MS-DOS setmode() symbol */
#endif

unsigned char a, b;			/* High and low hex nibbles */
unsigned int c;				/* Character to translate them into */
unsigned char decode();			/* Function to decode them  */

/* Main program reads each hex digit pair and outputs the 8-bit byte. */

main() {
#ifdef MSDOS
    setmode(fileno(stdout),O_BINARY); /* To avoid DOS text-mode conversions */
#endif
    while ((c = getchar()) != EOF) {	/* Read first hex digit */
	a = c;				/* Convert to character */
        if (a == '\n') {		/* Ignore line terminators */
            continue;
	}
	if (a == '\r') {
	    fprintf(stderr,"Illegal Carriage Return\n");
	    exit(1);
	}
	if ((c = getchar()) == EOF) {	/* Read second hex digit */
	    fprintf(stderr,"File ends prematurely\n");
	    exit(1);
	}
	b = c;				/* Convert to character */
	putchar( ((decode(a) * 16) & 0xF0) + (decode(b) & 0xF) );
    }
    exit(0);				/* Done */
}

unsigned char
decode(x) char x; {		      /* Function to decode a hex character */
    if (x >= '0' && x <= '9')         /* 0-9 is offset by hex 30 */
      return (x - 0x30);
    else if (x >= 'A' && x <= 'F')    /* A-F offset by hex 37 */
      return(x - 0x37);
    else {                            /* Otherwise, an illegal hex digit */
        fprintf(stderr,"\nInput is not in legal hex format\n");
        exit(1);
    }
}
---(cut here)---------------------------
<<< k.bas >>>
2 ! **********************************************************************
3 ! Program          K.BAS            Utg}va  4.11     1990-02-17
4 ! av Bo Kullmar
5 ! Ins{nd av Bo Kullmar
6 ! F|r ABC800M ABC800C ABC802 ABC806
8 ! Testad p} ABC806
9 ! **********************************************************************
10 ! 
11 ! KMAIN.BAS:
12 ! 
20 ! Kermitrutinerna har Lars-G|ran G|ransson, 495, skrivit.
21 ! Vissa rutiner f|r menyhantering mm har Mikael Lid`n, 5651, skrivit.
22 ! En del maskinkodsrutiner av Kristoffer Eriksson, 5357.
23 ! 
24 ! Enbart med UFD-DOS och LUX-NET (med priv. att l{sa bibl. med CALL) kan
25 ! wildcards anv{ndas vid s{ndning av filer med Kermit.
26 ! Programmet kr{ver ej inbyggd terminalrutin eller TERMOPT.REL p} ABC806.
27 ! Cursoradressering och blankning av bildsk{rmen f|ljer ADM3A.
28 ! Kermitrutinerna klarar s}v{l text som bin{rfiler och med eller utan
29 ! paddning av 8:e biten. Checksumma 1 och 2 hanteras. Programmet b|r
30 ! squezas f|r att inte ta f|r mycket minne. Det {r tveksamt om det g}r
31 ! att k|ra osquezat. I squezad version heter programmet KMAIN.BAC.
32 ! [ndra inte radnumreringen f|r Kermitrutinerna, f|r d} upph|r likheten
33 ! med monitorns Kermitrutiner!
34 ! 
35 ! Har du optionsprom ver 10, och f}r din s{ndning stoppad av mottaget XOFF,
36 ! kan du g} tillbaks till menyn, och in i terminall{ge igen, s} ska stoppet
37 ! brytas.
38 ! 
39 ! KMAIN g}r delvis att k|ra osquezat om man tar bort de inledande
40 ! kommentarerna och g{rna kommentarerna i FNF|rbindelse, rad 2890-2910.
400 ! 
401 ! K:
402 ! 
500 ! Detta program anv{nds f|r att s{tta defaultparametrar f|r Kermit-
510 ! programmet KMAIN. Anv{nds {ldre prom i datorn som ej kan maska 7:e biten 
520 ! b|r oldprom s{ttas till "Oldprom=-1" i rad 1010. Kan ej tv} siffror i
530 ! hastigheten anges s} kan detta {ndras ocks}, men d} fungerar ej val av
540 ! split speed i programmet!
550 ! 
560 ! Detta {r en l|sning som jag har valt eftersom det verkar finnas en bugg
570 ! om V24:an |ppnas med fel parameter s} kraschar systemet. Anv{nds gammalt
580 ! prom eller vill Du ha n}gon annan defaulthastighet s} {ndra parameter
590 ! nedan, men kom ih}g om Du {ndrar fel kan KMAIN g} fel!!!
600 ! 
610 ! OBServera att om Du {ndrar parametrar felaktigt h{r s} kommer inte Kermit
620 ! att fungera! S{tt ej Oldprom och beh}ll E som sista bokstav f|r d} g}r
630 ! det inte s} bra! Oldprom anv{nds n{r Du har ett system som inte kan maska
640 ! bort 7:e biten och det {r detta om E:et g|r. Dvs om Du s{tter Oldprom f}r
650 ! Du aldrig ha maskning av 7:e biten p} med den sista siffran i parametern.
660 ! 
990 INTEGER : EXTEND 
1000 COMMON V24def$=16,Oldprom,Mtyp,Key99,Enh$=4,Enh,Printer$=16,Version$=4,Mqbin,Pack$=376,Csum$=40
1010 Version$='4.11'
1020 Dummy=FNInit
1030 ON ERROR GOTO 1050
1040 CHAIN Enh$+'KMAIN'
1050 CHAIN 'KMAIN'
1500 DEF FNInit
1510   ; CHR$(12)
1520   Huvud$=CUR(0,0)+FNF$(CYA)+'K, KERMIT-program f|r ABC800-serien, version '+Version$
1530   Oldprom=0 : V24defhast$='D' : V24defpar$='S' : V24defdatabit$='7'
1540   V24def$='V24:VSA70C24.40E'
1550   Cu=PEEK2(SYS(10)+64)+6
1560   Mtyp=FNMtest : Key99=FNKey99
1570   IF Mtyp=0 POKE 65266,1 ! ATTRIBUTE 1
1580   Enh$=FNRunenh$ : Enh=FNEnhcs(Enh$)
1590   Printer$='PR:VSA58C72.5'
1600   Dummy=FNV24def+FNInitpack+FNInitcsum
1610   RETURN 0
1620 FNEND 
2000 DEF FNMtest LOCAL A
2010   A=INP(53) : OUT 53,4
2020   IF INP(53)=4 OUT 53,A : RETURN 0
2030   ON ERROR GOTO 2070
2040   PREPARE 'MEM:' AS FILE 99
2050   CLOSE 99
2060   RETURN 1
2070   RETURN 2
2080 FNEND 
2090 DEF FNKey99 LOCAL A$=40,S$=10
2100   S$=CHR$(0,0,0,0,0,0,0)
2110   A$=CHR$(62,24,211,34,6,7,33,226,255,197,1,232,3,126,246,0)
2120   A$=A$+CHR$(32,7,11,120,177,32,246,193,201,193,35,126,18,19,43,62)
2130   A$=A$+CHR$(0,119,16,229,201)
2140   Z=CALL(VARPTR(A$),VARPTR(S$))
2150   IF (ASCII(RIGHT$(S$,3)) AND 35)=35 RETURN -1
2160   RETURN 0
2170 FNEND 
2180 DEF FNRunenh$ LOCAL Drive,Adrenhl,Enh$=4,Dselect
2190   Drive=PEEK(64769) AND 31
2200   Adrenhl=PEEK2(SYS(10)+123)
2210   WHILE Adrenhl<>0
2220     Enh$=CHR$(PEEK(Adrenhl+2),PEEK(Adrenhl+3),PEEK(Adrenhl+4),58)
2230     Dselect=PEEK(Adrenhl+7)
2240     IF Drive=Dselect THEN RETURN Enh$
2250     Adrenhl=PEEK2(Adrenhl)
2260   WEND 
2270   RETURN ''
2280 FNEND 
2290 DEF FNEnhcs(Drive$) LOCAL Adrenhl,Enh$=4,Dselect
2300   Adrenhl=PEEK2(SYS(10)+123) : IF Drive$='' RETURN PEEK(PEEK2(24683))
2310   WHILE Adrenhl<>0
2320     Enh$=CHR$(PEEK(Adrenhl+2),PEEK(Adrenhl+3),PEEK(Adrenhl+4),58)
2330     IF Enh$='CON:' OR Enh$='NUL:' OR Enh$='PR:' OR Enh$='V24:' Enh$=''
2340     Dselect=PEEK(Adrenhl+7)
2350     IF Enh$=Drive$ RETURN Dselect
2360     Adrenhl=PEEK2(Adrenhl)
2370   WEND 
2380   RETURN -1
2390 FNEND 
2660 DEF FNV24def LOCAL A$=1,In$=1,P$=1,Tmph$=2
2670   Dummy=FNClr
2680   ; CUR(4,0) FNF$(CYA) 'A  300 bps' : ; FNF$(CYA) 'B  1200/75 bps'
2690   ; FNF$(CYA) 'C  75/1200 bps' : ; FNF$(CYA) 'D  1200 bps' : ; FNF$(CYA) 'E  2400 bps'
2700   ; FNF$(CYA) 'F  4800 bps' : ; FNF$(CYA) 'G  9600 bps' : ; FNF$(CYA) 'H  19200 bps'
2710   ; CUR(13,0) FNF$(YEL) 'V{lj kommunikationshastighet ( A - H ): ';
2720   A$=''
2730   WHILE A$<'A' OR A$>'H' : A$=CHR$(ASCII(FNInmata$(V24defhast$,13,62,1,2,1,CYA+CHR$(138))) AND 223) : WEND 
2740   ; CUR(13,62) FNF$(CYA) A$
2750   ; : ; FNF$(CYA) 'S  Space (0)    M  Mark (1)    O  Odd (Udda)    E  Even (J{mn)'
2760   ; CUR(17,0) FNF$(YEL) 'V{lj paritet (S, M, O, E): ';
2770   WHILE In$<>'S' AND In$<>'M' AND In$<>'O' AND In$<>'E' : In$=CHR$(ASCII(FNInmata$(V24defpar$,17,62,1,2,1,CYA+CHR$(138))) AND 223) : WEND 
2775   ; CUR(17,62) FNF$(CYA) In$
2780   IF In$='S' P$='D'
2790   IF In$='M' P$='C'
2800   IF In$='O' P$='B'
2810   IF In$='E' P$='A'
2830   Tmph$=MID$('2240044455667788',2*(ASCII(A$)-65)+1,2)
2840   MID$(V24def$,6,1)=P$
2850   IF LEN(V24def$)>=15 MID$(V24def$,14,2)=Tmph$ ELSE MID$(V24def$,14,1)=LEFT$(Tmph$,1)
2860   ; CUR(19,0) FNF$(YEL) 'V{lj 8 eller 7 databitar vid Kermit fil|verf|ring ( 8, 7 ): ';
2870   WHILE In$<>'8' AND In$<>'7' : In$=FNInmata$(V24defdatabit$,19,62,1,2,1,CYA+CHR$(138)) : WEND 
2880   IF In$='8' Mqbin=89 ELSE Mqbin=38
2890   RETURN 0
2900 FNEND 
2940 DEF FNClr
2950   ; CUR(1,0) FNF$(GYEL) STRING$(80,127);
2960   ; CUR(21,0) FNF$(GYEL) STRING$(80,127);
2970   ; CUR(0,22) SPACE$(36)
2980   ; Huvud$
2990   ; CUR(2,0);
3000   RETURN 0
3010 FNEND 
3020 DEF FNF$(F{rg$)
3030   IF Mtyp=0 RETURN F{rg$
3040   RETURN ''
3050 FNEND 
3550 DEF FNTkn$(F{rg$) LOCAL B$=1,Rad,Kol
3560   Rad=PEEK(Cu+1) : Kol=PEEK(Cu)
3570   IF Mtyp=0 ; F{rg$ CHR$(PEEK(30720+Rad*80+Kol));
3580   OUT 56,14,57,SWAP%(30720+Rad*80+Kol)
3590   OUT 56,15,57,30720+Rad*80+Kol
3600   OUT 56,10,57,104
3610   ; CUR(0,61) FNF$(CYA) TIME$
3620   WHILE SYS(5)=0 : ; CUR(0,61) FNF$(CYA) TIME$ : WEND 
3630   GET B$
3640   POKE Cu,Kol,Rad
3650   RETURN B$
3660 FNEND 
3750 DEF FNInmata$(In$,Rad,Kol,Inpos,Pa,Max,F{rg$) LOCAL Ut$=100,L{ngd,Pos,Fval,A,Ins,M1$=1,M2$=1,M3$=10,O8
3760   Ut$=In$ : Pos=Inpos : Fval=Pa AND 15 : Z=FNKom99(9)
3770   WHILE -1
3780     ; CUR(Rad,Kol) FNF$(F{rg$) Ut$ STRING$(Max-LEN(Ut$),32-63*(Mtyp<>0)) CHR$(139) ' ';
3790     IF Pos>Max Pos=Max
3800     L{ngd=LEN(Ut$)
3810     ; CUR(Rad,Kol+Pos-1);
3820     A=ASCII(FNTkn$(F{rg$+CHR$(138))) : IF INSTR(1,CHR$(3,4,27,192,129),CHR$(A)) RETURN CHR$(27)
3830     Z=INSTR(1,CHR$(128,161,163,177,179,172,164,127),CHR$(A))
3840     IF Z A=ASCII(RIGHT$(CHR$(193,196,198,212,214,8,9,194),Z))
3850     IF A=24 Ut$='' : Pos=1
3860     IF Pa>15 OR A=13 IF INSTR(1,CHR$(192,193,196,197,198,199,212,214,240,208,13),CHR$(A)) Z=FNKom99(9) : RETURN Ut$
3870     IF A=8 IF Pos>1 Pos=Pos-1 ELSE IF Pa>15 Z=FNKom99(9) : RETURN Ut$
3880     IF A=9 IF Pos<Max Pos=Pos+1 ELSE IF Pa>15 Z=FNKom99(9) : RETURN Ut$
3890     WHILE A=194
3900       IF Pos<=L{ngd Ut$=LEFT$(Ut$+' ',Pos-1)+RIGHT$(Ut$,Pos+1)
3910       IF L{ngd<Pos AND L{ngd>0 IF Pos-L{ngd=1 Ut$=LEFT$(Ut$,L{ngd-1) : Pos=Pos-1 ELSE Pos=L{ngd+1
3920       A=0
3930     WEND 
3940     IF A=132 Ins=(Ins=0) : Z=FNKom99(9-128*Ins)
3950     IF Fval=3 A=A AND 223
3960     IF A=195 AND Pos<=L{ngd Ut$=LEFT$(Ut$+' ',Pos-1)+' '+RIGHT$(Ut$,Pos) : IF LEN(Ut$)>Max Ut$=LEFT$(Ut$,Max)
3970     RESTORE 4060
3980     WHILE O8<=Fval : READ M1$,M2$,M3$ : O8=O8+1 : WEND 
3990     WHILE ((A>=ASCII(M1$) AND A<=ASCII(M2$)) OR INSTR(1,M3$,CHR$(A))>0) AND Pos<=Max
4000       IF L{ngd<Pos Ut$=Ut$+SPACE$(Pos-L{ngd)
4010       Ut$=LEFT$(Ut$,Pos-1)+CHR$(A)+RIGHT$(Ut$,Pos-( NOT Ins))
4020       IF LEN(Ut$)>Max Ut$=LEFT$(Ut$,Max)
4030       Pos=Pos+1 : A=0
4040     WEND 
4050   WEND 
4060   DATA 0,9,' ',0,9,' .-',' ',~,' ',A,],' ',J,J,JjNn,A,],A
4070 FNEND 
4080 DEF FNKom99(K)
4090   IF Key99 OUT 34,K
4100   RETURN 0
4110 FNEND 
53000 ! 
53010 DEF FNInitpack
53020   ! KERMPACK.ASM. 87-08-22 19.49
53030   DIM Pack$=376
53040   Pack$=CHR$(213,221,225,221,110,3,221,102,4,78,6,0,9,235,121,217,87,221,94,5,217,221,110,0,221,102,1,78,9,197,217,193,123,214,94,186,56,101,120)
53050   Pack$=Pack$+CHR$(167,32,97,221,126,2,185,56,91,3,217,126,35,1,0,1,167,40,70,221,190,8,32,17,126,35,214,32,254,94,56,2,62,94,71,126,35,217,3,3,217)
53060   Pack$=Pack$+CHR$(221,190,7,32,7,14,128,126,35,217,3,217,221,190,6,32,31,126,35,217,3,111,230,127,40,15,221,190,8,40,15,221,190,7,40,10,221,190,6,40)
53070   Pack$=Pack$+CHR$(5,125,238,64,24,1,125,217,177,18,19,217,20,217,16,249,217,24,149,221,110,3,221,102,4,114,221,110,0,221,102,1,113,105,96,221,78,2)
53080   Pack$=Pack$+CHR$(175,71,237,66,201,213,221,225,221,110,0,221,102,1,78,6,0,9,235,121,217,87,221,94,2,217,221,110,3,221,102,4,78,35,70,43,197,6,0,9)
53090   Pack$=Pack$+CHR$(217,225,69,76,123,214,10,186,56,6,121,184,40,2,48,24,221,110,0,221,102,1,114,221,110,3,221,102,4,112,35,113,120,185,33,0,0,192,43)
53100   Pack$=Pack$+CHR$(201,4,217,221,126,8,167,40,55,126,43,190,35,32,40,4,120,254,5,56,31,197,221,126,8,217,119,35,241,198,32,119,229,43,221,86,5,20,20)
53110   Pack$=Pack$+CHR$(217,209,19,254,126,32,18,6,0,24,14,24,169,61,32,9,6,1,213,217,225,221,114,5,217,126,35,79,254,128,56,15,221,126,7,167,40,9,18,19)
53120   Pack$=Pack$+CHR$(217,20,217,121,230,127,79,221,126,6,167,40,40,121,230,127,254,127,40,21,254,32,56,17,221,190,6,40,16,221,190,7,40,11,221,190,8,40)
53130   Pack$=Pack$+CHR$(6,24,12,121,238,64,79,221,126,6,18,19,217,20,217,121,18,19,217,20,24,167)
53140   RETURN 0
53150 FNEND 
53160 ! 
53170 DEF FNInitcsum
53180   ! KERMCSUM.ASM. 87-08-16 16.16
53190   DIM Csum$=40
53200   Csum$=CHR$(235,35,35,94,35,86,35,78,35,70,33,0,0,121,176,40,11,26,133,111,62,0,140,103,11,19,24,241,125,7,203,20,7,203,20,125,230,63,111,201)
53210   RETURN 0
53220 FNEND 
<<< k.hex >>>
8F0061000C208000000012002202E127D40A3219874C020090472A2A2A2A2A2A2A2A2A2A
2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A
2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A87430300903E50726F677261
6D202020202020202020204B2E4241532020202020202020202020205574677D76612020
342E31312020202020313939302D30322D313787130400900E617620426F204B756C6C6D
6172871A05009015496E737B6E6420617620426F204B756C6C6D6172872706009022467C
72204142433830304D204142433830304320414243383032204142433830368716080090
1154657374616420707D20414243383036874C090090472A2A2A2A2A2A2A2A2A2A2A2A2A
2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A
2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A87060A00900187100B00900B4B4D41
494E2E4241533A87060C009001873D140090384B65726D6974727574696E65726E612068
6172204C6172732D477C72616E20477C72616E73736F6E2C203439352C20736B72697669
742E874915009044566973736120727574696E657220667C72206D656E7968616E746572
696E67206D6D20686172204D696B61656C204C6964606E2C20353635312C20736B726976
69742E873C16009037456E2064656C206D61736B696E6B6F6473727574696E6572206176
204B726973746F66666572204572696B73736F6E2C20353335372E870617009001874C18
009047456E62617274206D6564205546442D444F53206F6368204C55582D4E455420286D
656420707269762E20617474206C7B7361206269626C2E206D65642043414C4C29206B61
6E873A1900903577696C64636172647320616E767B6E6461732076696420737B6E646E69
6E672061762066696C6572206D6564204B65726D69742E874D1A00904850726F6772616D
6D6574206B727B76657220656A20696E6279676764207465726D696E616C727574696E20
656C6C6572205445524D4F50542E52454C20707D204142433830362E87421B00903D4375
72736F726164726573736572696E67206F636820626C616E6B6E696E672061762062696C
64736B7B726D656E20667C6C6A65722041444D33412E87491C0090444B65726D69747275
74696E65726E61206B6C6172617220737D767B6C207465787420736F6D2062696E7B7266
696C6572206F6368206D656420656C6C6572207574616E87481D009043706164646E696E
6720617620383A6520626974656E2E20436865636B73756D6D612031206F636820322068
616E74657261732E2050726F6772616D6D657420627C72874A1E009045737175657A6173
20667C722061747420696E746520746120667C72206D79636B6574206D696E6E652E2044
6574207B72207476656B73616D74206F6D2064657420677D7287461F009041617474206B
7C7261206F737175657A61742E204920737175657A61642076657273696F6E2068657465
722070726F6772616D6D6574204B4D41494E2E4241432E874B200090465B6E6472612069
6E7465207261646E756D726572696E67656E20667C72204B65726D6974727574696E6572
6E612C20667C7220647D20757070687C72206C696B686574656E87222100901D6D656420
6D6F6E69746F726E73204B65726D6974727574696E657221870622009001874F2300904A
486172206475206F7074696F6E7370726F6D207665722031302C206F636820667D722064
696E20737B6E646E696E672073746F70706164206176206D6F74746167657420584F4646
2C874F2400904A6B616E20647520677D2074696C6C62616B732074696C6C206D656E796E
2C206F636820696E2069207465726D696E616C6C7B6765206967656E2C20737D20736B61
2073746F70706574870D250090086272797461732E8706260090018745270090404B4D41
494E20677D722064656C76697320617474206B7C7261206F737175657A6174206F6D206D
616E2074617220626F727420646520696E6C6564616E6465874B280090466B6F6D6D656E
74617265726E61206F636820677B726E61206B6F6D6D656E74617265726E61206920464E
467C7262696E64656C73652C2072616420323839302D323931302E870690019001870891
0190034B3A8706920190018747F401904244657474612070726F6772616D20616E767B6E
647320667C722061747420737B7474612064656661756C74706172616D65747261722066
7C72204B65726D69742D874FFE01904A70726F6772616D6D6574204B4D41494E2E20416E
767B6E6473207B6C6472652070726F6D2069206461746F726E20736F6D20656A206B616E
206D61736B6120373A6520626974656E20874B08029046627C72206F6C6470726F6D2073
7B747461732074696C6C20224F6C6470726F6D3D2D312220692072616420313031302E20
4B616E20656A2074767D2073696666726F722069874C1202904768617374696768657465
6E20616E67657320737D206B616E206465747461207B6E64726173206F636B737D2C206D
656E20647D2066756E676572617220656A2076616C206176871F1C02901A73706C697420
737065656420692070726F6772616D6D657421870626029001874D300290484465747461
207B7220656E206C7C736E696E6720736F6D206A6167206861722076616C742065667465
72736F6D20646574207665726B61722066696E6E617320656E2062756767874E3A029049
6F6D205632343A616E207C70706E6173206D65642066656C20706172616D657465722073
7D206B726173636861722073797374656D65742E20416E767B6E64732067616D6D616C74
874B4402904670726F6D20656C6C65722076696C6C204475206861206E7D676F6E20616E
6E616E2064656661756C7468617374696768657420737D207B6E64726120706172616D65
746572873E4E0290396E6564616E2C206D656E206B6F6D2069687D67206F6D204475207B
6E647261722066656C206B616E204B4D41494E20677D2066656C21212187065802900187
4F6202904A4F425365727665726120617474206F6D204475207B6E647261722070617261
6D65747261722066656C616B7469677420687B7220737D206B6F6D6D657220696E746520
4B65726D6974874C6C0290476174742066756E676572612120537B747420656A204F6C64
70726F6D206F6368206265687D6C6C204520736F6D20736973746120626F6B7374617620
667C7220647D20677D72874F7602904A64657420696E746520737D2062726121204F6C64
70726F6D20616E767B6E6473206E7B7220447520686172206574742073797374656D2073
6F6D20696E7465206B616E206D61736B61874F8002904A626F727420373A652062697465
6E206F636820646574207B72206465747461206F6D20453A657420677C722E2044767320
6F6D20447520737B74746572204F6C6470726F6D20667D72874F8A02904A447520616C64
726967206861206D61736B6E696E6720617620373A6520626974656E20707D206D656420
64656E207369737461207369666672616E206920706172616D657465726E2E8706940290
018709DE03860F8886118752E8038601EDCEC604801600CEC51E800200CEC524800200CE
C52A800200E1CEC630800A00CEC53E800200EDCEC644801600E1CEC65E800A00CEC56C80
0200C77801CEC672807E01C72800CEC6F4812E00870DF203CC04342E3131B65E80870CFC
03CF00003600B504008707060485130087121004860BC23080CC054B4D41494E9DB9870E
1A04860BCC054B4D41494EB9870CDC058C300121222701008709E60594E9D10CB98749F0
05DDDDD21FD086AC00CF01FDB7089DCC2D4B2C204B45524D49542D70726F6772616D2066
7C72204142433830302D73657269656E2C2076657273696F6E209DC25E809DB60A00871D
FA05DDB51E8088CC0144B6140088CC0153B61E0088CC0137B6280087190406CC10563234
3A56534137304332342E343045B6048087120E06E7D119C740009CD12DE39CB532008715
1806CF00008E00B5248088CF0000FE00B52A808722220695C12480DD8ABE0A8602C7F2FE
B82CDEB8900C4154545249425554452031871A2C06CF0000B501B6308088C23080AC00CF
01FD4F02B53E8087163606CC0D50523A56534135384337322E35B6448087184006CF0000
0E03CF0000C50D9CCF000056129CB5040087074A06A0DDB8870554068D8710D0078C7800
A9236F0000B60179018716DA07C73500D116B500FF888603C73500B82CE1B8871DE40795
C73500D116E18ABE108603C73500B82CC100FFB888A0DDB88707EE078524008712F80786
05CC044D454D3AB9BBC76300B8870A02088606C76300B887070C08A0DEB887071608A0DF
B8870520088D87162A088CE400A120DB0000B6027A0128007A130A0087113408DDDDDDDD
DDDDDDD4D70CB602FF87303E08C73E00C71800C7D300C72200E3E4C72100C7E200C7FF00
C7C500DEC7E800E0C77E00C7F600DDD4E00CB600FF873A4808C200FFC72000E4E8C77800
C7B100C72000C7F600C7C100C7C900C7C100C72300C77E00C71200C71300C72B00C73E00
D4E00C9DB600FF87195208C200FFDDC77700EDC7E500C7C900D4D50C9DB600FF87135C08
C600FFD12BC602FFD12BD217B53800871C660895C202FFE0D20ED10BC7230088A7C72300
8ABE05A0DEA9B887077008A0DDB887057A088D871884088CA700DA239E0000B604D12401
25D2200400412587108E08C701FDD115C71F0088B500FF87109808E7D119C77B009CD12D
B502FF870DA2089A5B00C102FFDD8DB88722AC08C102FFDF9CD115C102FFE09CD115C102
FFE19CD115C73A00D4D40CB604FF870EB608C102FFE49CD115B506FF8713C00895C100FF
C106FF8ABD06A0C204FFB9870CCA08C102FFD12DB502FF8707D4089BA2FF8708DE08A0CC
00B98705E8088D8718F2088CE0001124D70001D224B6030125D220040041258723FC08E7
D119C77B009CD12DB502FF8895C200FFCC008BBE0AA0C76B60D12DD115B8870D06099A91
00C102FFDD8DB887221009C102FFDF9CD115C102FFE09CD115C102FFE19CD115C73A00D4
D40CB604FF87361A0995C204FFCC04434F4E3A8BC204FFCC044E554C3A8B86C204FFCC03
50523A8B86C204FFCC045632343A8B86BE06CC00B604FF870E2409C102FFE49CD115B506
FF87132E0995C204FFC200FF8BBE06A0C106FFB8870C3809C102FFD12DB502FF87074209
9B6CFF87084C09A0DEA9B8870556098D871E640A8C3C040120330400B6047A0101008225
01007A1001009A250200870C6E0ACF00002204B50400873E780A94E1DDD21FB9D086AC00
CF01FD8804B9CC0A41202033303020627073B98894D086AC00CF01FD6F04B9CC0E422020
313230302F373520627073B98754820A94D086AC00CF01FD4F04B9CC0E43202037352F31
32303020627073B98894D086AC00CF01FD3204B9CC0B4420203132303020627073B98894
D086AC00CF01FD1804B9CC0B4520203234303020627073B987528C0A94D086AC00CF01FD
FB03B9CC0B4620203438303020627073B98894D086AC00CF01FDE103B9CC0B4720203936
303020627073B98894D086AC00CF01FDC703B9CC0C482020313932303020627073B98740
960A94EADDD21FB9D083AC00CF01FDA403B9CC28567B6C6A206B6F6D6D756E696B617469
6F6E7368617374696768657420282041202D204820293A20B93B8709A00ACC00B600FF87
4CAA0A9A4400C200FFCC014191C200FFCC01489786B888C21400AC00EAABFDC73E00ABFB
DEABFDDFABFDDEABFDD086C78A00D10C9DACF6CF07FD7D04D10BC7DF0088D10CB600FF88
9BB9FF871AB40A94EAC73E00D21FB9D086AC00CF01FD0D03B9C200FFB98752BE0A948894
D086AC00CF01FDF802B9CC3E532020537061636520283029202020204D20204D61726B20
283129202020204F20204F646420285564646129202020204520204576656E20284A7B6D
6E29B98735C80A94C71100DDD21FB9D083AC00CF01FDA102B9CC1B567B6C6A2070617269
7465742028532C204D2C204F2C2045293A20B93B875ED20A9A5600C202FFCC01538EC202
FFCC014D8E88C202FFCC014F8E88C202FFCC01458E88B888C21E00AC00C71100ABFBC73E
00ABFBDEABFDDFABFDDEABFDD086C78A00D10C9DACF6CF07FD7E03D10BC7DF0088D10CB6
02FF889BA7FF871CD70A94C71100C73E00D21FB9D086AC00CF01FD0C02B9C202FFB98714
DC0A95C202FFCC01538BBE07CC0144B604FF8714E60A95C202FFCC014D8BBE07CC0143B6
04FF8714F00A95C202FFCC014F8BBE07CC0142B604FF8714FA0A95C202FFCC01458BBE07
CC0141B604FF872A0E0BCC1032323430303434343535363637373838DFC200FFD10BC741
009FA7A1DE9CDFD30FB606FF8712180BA2C20480E3DED328B93DC204FFB9872F220B95C2
0480D110EC93BE11A2C20480EBDFD328B93DC206FFB98A12A2C20480EBDED328B93DC206
FFDED20DB987562C0B94C71300DDD21FB9D083AC00CF01FD3701B9CC3C567B6C6A203820
656C6C657220372064617461626974617220766964204B65726D69742066696C7C766572
667C72696E67202820382C203720293A20B93B8746360B9A3E00C202FFCC01388EC202FF
CC01378E88B888C22800AC00C71300ABFBC73E00ABFBDEABFDDFABFDDEABFDD086C78A00
D10C9DACF6CF07FD0302B602FF889BBFFF871C400B95C202FFCC01388BBE09C75900B56C
808A07C72600B56C8087074A0BA0DDB88705540B8D870C7C0B8C7B00C125720000871E86
0B94DEDDD21FB9D093AC00CF01FD6900B9C75000C77F00D213B93B8720900B94C71500DD
D21FB9D093AC00CF01FD4900B9C75000C77F00D213B93B87129A0B94DDC71600D21FB9C7
2400D112B98709A40B94C20A00B9870BAE0B94DFDDD21FB93B8707B80BA0DDB88705C20B
8D870ECC0B8C2B007A062200011A268711D60B95C12480DD8ABE06A0C200FFB98708E00B
A0CC00B98705EA0B8D8718DE0D8C1F0142261601011A26B6037A020100612681268717E8
0DC13200DE9CD115B504FF88C13200D115B506FF8726F20D95C12480DD8ABE1B94C200FF
B9C70078C104FFC75000A19CC106FF9CD115D10CB93B8725FC0D8603C73800B82CEBB82C
C73900B82CC70078C104FFC75000A19CC106FF9CD114B88723060E8603C73800B82CECB8
2CC73900B82CC70078C104FFC75000A19CC106FF9CB88717100E8603C73800B82CE7B82C
C73900B82CC76800B887191A0E94DDC73D00D21FB9D086AC00CF01FD17FFB9D029B98727
240E9A1F00E2D119DD8AB88894DDC73D00D21FB9D086AC00CF01FDF4FEB9D029B9889BDE
FF870A2E0E860AC602FFBC8714380E8602C13200B82CC106FFB82CC104FFB88709420EA0
C202FFB987054C0E8D8738A60E8C8104E225780407822561268126A126D126E9261A26B6
0A0A276400212751277127790199270A0D0100120D01001A0D0A00410F8726B00EC200FF
B60EFF88C106FFB512FF88C108FFEC88B514FF88E6AB00CF01FD3304B53800870ABA0E9A
DD03DEA9B88742C40E94C102FFC104FFD21FB9C20CFFAC00CF01FD40FEB9C20EFFB9C10A
FFC20EFFD1109FC72000C73F00C12480DD8DA7A19FD213B9C78B00D10CB9CC0120B93B87
14CE0E95C112FFC10AFF96BE07C10AFFB512FF870CD80EC20EFFD110B510FF8715E20E94
C102FFC104FFC112FF9CDE9FD21FB93B873AEC0EC20CFFC78A00D10C9DAC00CF01FDF9FD
D10BB516FF8895DEE0E1C71B00C7C000C78100D4D50CC116FFD10CD311BE08A0C71B00D1
0CB9872AF60EDEC78000C7A100C7A300C7B100C7B300C7AC00C7A400C77F00D4D80CC116
FFD10CD311B53800872B000F95C13800BE22C7C100C7C400C7C600C7D400C7D600E5E6C7
C200D4D80CC13800D20ED10BB516FF87180A0F95C116FFC718008ABE0BCC00B60EFF88DE
B512FF8750140F95C108FFEC96C116FFEA8A86BE3F95DEC7C000C7C100C7C400C7C500C7
C600C7C700C7D400C7D600C7F000C7D000EAD4DB0CC116FFD10CD311BE12E6AB00CF01FD
C102B5380088A0C20EFFB987371E0F95C116FFE58ABE2C95C112FFDE96BE0BC112FFDE9F
B512FF8A1A95C108FFEC96BE12E6AB00CF01FD8A02B5380088A0C20EFFB98739280F95C1
16FFE68ABE2E95C112FFC10AFF90BE0BC112FFDE9CB512FF8A1A95C108FFEC96BE12E6AB
00CF01FD5102B5380088A0C20EFFB9870F320F9A8000C116FFC7C2008AB8872A3C0F95C1
12FFC110FF99BE1DC20EFFCC01209DC112FFDE9FD20DC20EFFC112FFDE9CD20E9DB60EFF
8740460F95C110FFC112FF90C110FFDD9688BE2D95C112FFC110FF9FDE8ABE19C20EFFC1
10FFDE9FD20DB60EFF88C112FFDE9FB512FF8A09C110FFDE9CB512FF8708500FDDB516FF
87075A0F9B7DFF872B640F95C116FFC784008ABE1EC118FFDD8AA7B518FF88E6C78000C1
18FFA19FAB00CF01FD9801B5380087166E0F95C114FFE08ABE0BC116FFC7DF0088B516FF
874C780F95C116FFC7C3008AC112FFC110FF9988BE37C20EFFCC01209DC112FFDE9FD20D
CC01209DC20EFFC112FFD20E9DB60EFF8895C20EFFD110C10AFF96BE0CC20EFFC10AFFD2
0DB60EFF8707820F83E20087308C0F9A2800C120FFC114FF99B8889CB706C61AFFBCB706
C61CFFBCB706C61EFFBC88C120FFDE9CB520FF889BD5FF8733960F9AA200C116FFC21AFF
D10B93C116FFC21CFFD10B9988A7DEC21EFFC116FFD10CD311DD9686A7C112FFC10AFF99
88B8871EA00F95C110FFC112FF90BE11C20EFFC112FFC110FF9FD1129DB60EFF8726AA0F
C20EFFC112FFDE9FD20DC116FFD10C9DC20EFFC112FFC118FFAFA79FD20E9DB60EFF871B
B40F95C20EFFD110C10AFF96BE0CC20EFFC10AFFD20DB60EFF8711BE0FC112FFDE9CB512
FF88DDB516FF8707C80F9B5BFF8707D20F9B20FC873ADC0F8E000033302C392C2720272C
302C392C27202E2D272C2720272C7E2C2720272C412C5D2C2720272C4A2C4A2C4A6A4E6E
2C412C5D2C418705E60F8D870EF00F8C3400B927250001790B8715FA0F95C12A80BE0C86
03C72200B82CC100FFB887070410A0DDB887050E108D870608CF9001870C12CF8C960441
2487040087221CCF901D4B45524D5041434B2E41534D2E2038372D30382D32322031392E
3439870D26CF8600C77801CDC67280876D30CFC7D500C7DD00C7E100C7DD00C76E00E0C7
DD00C76600E1C74E00E3DDE6C7EB00C77900C7D900C75700C7DD00C75E00E2C7D900C7DD
00C76E00DDC7DD00C76600DEC74E00E6C7C500C7D900C7C100C77B00C7D600C75E00C7BA
00C73800C76500C77800D4F70CB6728087773ACFC27280C7A700C72000C76100C7DD00C7
7E00DFC7B900C73800C75B00E0C7D900C77E00C72300DEDDDEC7A700C72800C74600C7DD
00C7BE00E5C72000C71100C77E00C72300C7D600C72000C7FE00C75E00C73800DFC73E00
C75E00C74700C77E00C72300C7D900E0E0C7D900D4F90C9DB67280876E44CFC27280C7DD
00C7BE00E4C72000E4EBC78000C77E00C72300C7D900E0C7D900C7DD00C7BE00E3C72000
C71F00C77E00C72300C7D900E0C76F00C7E600C77F00C72800ECC7DD00C7BE00E5C72800
ECC7DD00C7BE00E4C72800E7C7DD00C7BE00E3C72800D4F80C9DB6728087704ECFC27280
E2C77D00C7EE00C74000C71800DEC77D00C7D900C7B100C71200C71300C7D900C71400C7
D900EDC7F900C7D900C71800C79500C7DD00C76E00E0C7DD00C76600E1C77200C7DD00C7
6E00DDC7DD00C76600DEC77100C76900C76000C7DD00C74E00DFD4F60C9DB67280877058
CFC27280C7AF00C74700C7ED00C74200C7C900C7D500C7DD00C7E100C7DD00C76E00DDC7
DD00C76600DEC74E00E3DDE6C7EB00C77900C7D900C75700C7DD00C75E00DFC7D900C7DD
00C76E00E0C7DD00C76600E1C74E00C72300C74600C72B00C7C500E3DDE6D4F80C9DB672
80877162CFC27280C7D900C7E100C74500C74C00C77B00C7D600E7C7BA00C73800E3C779
00C7B800C72800DFC73000C71800C7DD00C76E00DDC7DD00C76600DEC77200C7DD00C76E
00E0C7DD00C76600E1C77000C72300C77100C77800C7B900C72100DDDDC7C000C72B00D4
F70C9DB6728087776CCFC27280C7C900E1C7D900C7DD00C77E00E5C7A700C72800C73700
C77E00C72B00C7BE00C72300C72000C72800E1C77800C7FE00E2C73800C71F00C7C500C7
DD00C77E00E5C7D900C77700C72300C7F100C7C600C72000C77700C7E500C72B00C7DD00
C75600E2C71400C71400D4F70C9DB67280877276CFC27280C7D900C7D100C71300C7FE00
C77E00C72000C71200E3DDC71800EBC71800C7A900C73D00C72000E6E3DEC7D500C7D900
C7E100C7DD00C77200E2C7D900C77E00C72300C74F00C7FE00C78000C73800ECC7DD00C7
7E00E4C7A700C72800E6C71200C71300D4F80C9DB67280877480CFC27280C7D900C71400
C7D900C77900C7E600C77F00C74F00C7DD00C77E00E3C7A700C72800C72800C77900C7E6
00C77F00C7FE00C77F00C72800C71500C7FE00C72000C73800C71100C7DD00C7BE00E3C7
2800EDC7DD00C7BE00E4C72800E8C7DD00C7BE00E5C72800D4F60C9DB67280874A8ACFC2
7280E3C71800E9C77900C7EE00C74000C74F00C7DD00C77E00E3C71200C71300C7D900C7
1400C7D900C77900C71200C71300C7D900C71400C71800C7A700D4E60C9DB67280870794
CFA0DDB887059ECF8D8706A8CF9001870CB2CF8C00008924B100008722BCCF901D4B4552
4D4353554D2E41534D2E2038372D30382D31362031362E3136870DC6CF8600C72800CDC6
F4818774D0CFC7EB00C72300C72300C75E00C72300C75600C72300C74E00C72300C74600
C72100DDDDC77900C7B000C72800E8C71A00C78500C76F00C73E00DDC78C00C76700E8C7
1300C71800C7F100C77D00E4C7CB00C71400E4C7CB00C71400C77D00C7E600C73F00C76F
00C7C900D4F80CB6F4818707DACFA0DDB88705E4CF8D87010000FD00FE563234646566FE
4F6C6470726F6DFE4D747970FE4B65793939FE456E68FE5072696E746572FE5665727369
6F6EFE4D7162696EFE5061636BFE4373756DFE44756D6D79FE496E6974FE4875767564FE
56323464656668617374FE563234646566706172FE56323464656664617461626974FE43
75FE4D74657374FE52756E656E68FE456E686373FE496E69747061636BFE496E69746373
756DFE4472697665FE416472656E686CFE4473656C656374FE496EFE546D7068FE436C72
FE496E6D617461FE467B7267FE546B6EFE526164FE4B6F6CFE496E706F73FE5061FE4D61
78FE5574FE4C7B6E6764FE506F73FE4676616CFE496E73FE4B6F6D3939FFFEFE04800220
1E803920248079202A80A1203080D2203E80D1204480F2205E8032216C8071217280A221
F481CA210400F1210A004A2214007A221E00D22228002223320091233800791A75767564
FE56323464656668617374FE563234646566706172FE56323464656664617461626974FE
4375FE4D74657374FE52756E656E68FE456E686373FE496E69747061636BFE496E
<<< kermcsum.asm >>>
; Fil: KERMCSUM.ASM
; Av:  Kristoffer Eriksson, "SKE" <5357>, 1987.
;
;-Ver--/-Datum----/-Sign-/-Kommentar----------------------------------
; 1.00 / 87-08-15 / SKE  / KERMCSUM
;
; Kontrollsummarutin till Bo Kullmars Kermit-program K.


;*  Summera str{ng f|r Kermit-kontrollsumma.
;*  In: DE = VAROOT(Str{ng$)
;*  Ut:  L = Summa, bittar 5-0,
;*       H = Summa, bittar 13-6.

Csum:       ex     de,hl
            inc    hl
            inc    hl
            ld     e,(hl)             ; DE <- Str{ngens adress.
            inc    hl
            ld     d,(hl)
            inc    hl
            ld     c,(hl)             ; BC <- Str{ngens l{ngd.
            inc    hl
            ld     b,(hl)
            ld     hl,0               ; HL <- Startsumma = 0.
Loop:       ld     a,c                ; Slut?
            or     b
            jr z   CEnd
            ld     a,(de)             ; Summera.
            add    l
            ld     l,a
            ld     a,0
            adc    h
            ld     h,a
            dec    bc
            inc    de
            jr     Loop

CEnd:       ld     a,l
            rlc    a
            rl     h
            rlc    a
            rl     h                  ; H <- bit 13-6.
            ld     a,l
            and    63
            ld     l,a                ; L <- bit 5-0.
            ret
<<< kermpack.asm >>>
; Fil: KERMPACK.ASM
; Av:  Kristoffer Eriksson, "SKE" <5357>, 1987.
;
;-Ver--/-Datum----/-Sign-/-Kommentar----------------------------------
; 1.00 / 87-08-15 / SKE  / KERMPACK
;
; Packnings- och uppackningsrutiner till Bo Kullmars Kermit-program K.


;*  Packa upp buffert.
;*  In: DE pekare till inparametrar enligt:

UInbuff:    =  +0  ;W   Inbuffertens adress
UInbuffs:   =  +2  ;B   Inbuffertens slutposition eller l{ngd-1 (0-255)
UUtbuff:    =  +3  ;W   Utbuffertens adress
UUtbuffl:   =  +5  ;B   Utbuffertens l{ngd i antal byte (94-255)
Qctl:       =  +6  ;B   Tecken som markerar "tecken XOR 64"
Qbin:       =  +7  ;B   Tecken som markerar "tecken OR 128"
Rept:       =  +8  ;B   Tecken som markerar "tecken1-32 stycken tecken2"

;*  In- och utbuffertarnas f|rsta byte anger n{sta oanv{nda position i resp
;*  buffert, r{knat med sig sj{lva som position noll. De uppdateras med
;*  aktuella v{rden vid retur.
;*
;*  Inbuffertens position kan bli upp till 5 h|gre {n dess slutposition,
;*  vilket inneb{r att om slutpositionen {r 251 eller mer kan man f|rlora
;*  positionens mest signifikanta bittar, varvid v{rdet blir 256 f|r l}gt.
;*  Detta beror p} att positionen bara kontrolleras mot l{ngden en g}ng f|r
;*  varje avkodat tecken, och varje tecken kan vara kodat med upp till 5 byte.
;*  [ven om bufferten bara inneh}ller korrekta koder, slutar positionen 1
;*  steg f|rbi slutpositionen (det blir ju f|rsta oanv{nda position), och
;*  {r l{ngden 255 blir det 0 som lagras som position.
;*
;*  Rutinen avbryts n{r n{sta inposition blir st|rre {n slutpositionen
;*  (Inpos > Inslut), eller det blir 93 eller f{rre tecken kvar i utbufferten
;*  (Utpos >= Utl{ngd - 93). Det senare vilkoret {r f|r att garantera att
;*  en Rept-sekvens f}r plats vid uppackning. Den kan bli max 94 tecken.
;*
;*  Rutinen returnerar i HL aktuell inposition - inl{ngden. Observera att
;*  h{r f|rlorar man inte n}gra signifikanta bittar i positionen.
;*
;*  Qctl, Qbin och Rept kan vara noll f|r att markera att de inte anv{nds.


; DE = Aktuell adress i utbuff, D' = Position i utbuff, E' = L{ngd av utbuff,
; HL = Aktuell adress i inbuff, BC' = Position i inbuff,
; B = Repetitionsfaktor, C = OR-faktor.

; Inbuff-positionen ligger i ett dubbelregister eftersom den inte kontrolleras
; mot l{ngden vid varje |kning, och d{rf|r kan r}ka bli h|gre {n 255.

Unpbuff:    push   de
            pop    ix
            ld     l,(ix+UUtbuff)
            ld     h,(ix+UUtbuff+1)
            ld     c,(hl)
            ld     b,0
            add    hl,bc
            ex     de,hl              ; DE <- Aktuell adress i utbuffert.
            ld     a,c
            exx
            ld     d,a                ; D' <- Position i utbuffert.
            ld     e,(ix+UUtbuffl)    ; E' <- Utbuffertens l{ngd.
            exx

            ld     l,(ix+UInbuff)
            ld     h,(ix+UInbuff+1)
            ld     c,(hl)             ; (B = 0)
            add    hl,bc              ; HL <- Aktuell adress i inbuffert.
            push   bc
            exx
            pop    bc                 ; BC' <- Position i inbuffert.

ULoop:      ld     a,e
            sub    94
            cp     d                  ; J{mf|r  (E' - 94) med D'
            jr c   UEnd               ; Avsluta om Utpos > Utl{ngd - 94.
            ld     a,b
            and    a
            jr nz  UEnd               ; Inpos > 255, allts} Inpos > Inslut.
            ld     a,(ix+UInbuffs)
            cp     c
            jr c   UEnd               ; Avsluta om Inpos > Inslut.

UCont:      inc    bc                 ; \ka Inpos i BC'.
            exx
            ld     a,(hl)             ; L{s Inbuffert och |ka Inadress.
            inc    hl
            ld     bc,1 << 8 + 0      ; B <- Reptfaktor 1, C <- OR-faktor 0.
            and    a                  ; Ingen id` att j{mf|ra tecknet 0 med
            jr z   UStoreChar         ; specialtecknen, f|r {r de noll
                                      ; betyder det bara att de inte anv{nds.
UchkRept:   cp     (ix+Rept)
            jr nz  UchkQbin
            ld     a,(hl)             ; H{mta n{sta byte = Repetitionsfaktor.
            inc    hl
            sub    32
            cp     94
            jr c   Ux1                ; A <- max(A,94). S{kerhetskontroll,
            ld     a,94               ;            borde snarare meddela fel.
Ux1:        ld     b,a                ; B <- Repetitionsfaktor.
            ld     a,(hl)             ; A <- Repeterat tecken.
            inc    hl
            exx
            inc    bc                 ; \ka Inpos.
            inc    bc
            exx

UchkQbin:   cp     (ix+Qbin)
            jr nz  UchkQctl
            ld     c,128              ; OR-faktor f|r teckenkod.
            ld     a,(hl)             ; A <- P}verkat tecken.
            inc    hl
            exx
            inc    bc                 ; \ka Inpos.
            exx

UchkQctl:   cp     (ix+Qctl)
            jr nz  UStoreChar
            ld     a,(hl)             ; A <- P}verkat tecken.
            inc    hl
            exx
            inc    bc                 ; \ka Inpos.
            ld     l,a                ; L' <- A  (tempor{r lagring).
            and    127
            jr z   Ux2
            cp     (ix+Rept)          ; S}lla bort tecken som inte p}verkas.
            jr z   Ux3
            cp     (ix+Qbin)
            jr z   Ux3
            cp     (ix+Qctl)
            jr z   Ux3
Ux2:        ld     a,l
            xor    64
            jr     Ux4
Ux3:        ld     a,l
Ux4:        exx

UStoreChar: or     c                  ; OR-faktor
UStoreLoop: ld     (de),a             ; Lagra tecken i Utbuffert.
            inc    de
            exx
            inc    d                  ; \ka Utpos.
            exx
            djnz   UStoreLoop         ; Repetitionsfaktor.

            exx
            jr     ULoop

UEnd:       ld     l,(ix+UUtbuff)
            ld     h,(ix+UUtbuff+1)
            ld     (hl),d             ; (Utbuff) <- D' = Position i utbuffert.
            ld     l,(ix+UInbuff)
            ld     h,(ix+UInbuff+1)
            ld     (hl),c             ; (Inbuff) <- BC' = Position i inbuffert.
            ld     l,c
            ld     h,b
            ld     c,(ix+UInbuffs)
            xor    a                  ; Nolla carry och A.
            ld     b,a
            sbc    hl,bc              ; Returv{rde HL <- Inposition - Inl{ngd.
            ret



;*  Packa buffert.
;*  In: DE pekare till inparametrar enligt:

PUtbuff:    =  +0  ;W   Inbuffertens adress
PUtbuffl:   =  +2  ;B   Inbuffertens l{ngd i antal byte (10-255)
PInbuff:    =  +3  ;W   Utbuffertens adress
ReptPos:    =  +5  ;B   (Intern variabel, aktuell utpos vid start av rept.)
;Qctl:      =  +6  ;B   Tecken som markerar "tecken XOR 64"
;Qbin:      =  +7  ;B   Tecken som markerar "tecken OR 128"
;Rept:      =  +8  ;B   Tecken som markerar "tecken1-32 stycken tecken2"

;*  In- och utbuffertarnas f|rsta byte anger n{sta oanv{nda position i resp
;*  buffert, r{knat med sig sj{lva som position noll. Dessa uppdateras med
;*  aktuella v{rden f|re retur. Inbuffertens andra byte anger dess l{ngd
;*  (0-255) i antal byte inklusive position och l{ngd-bytes.
;*
;*  Rutinen avbryts n{r det }terst}r nio eller f{rre tecken i utbufferten
;*  (Utpos >= Utl{ngd - 9) eller inbuffert {r slut (Inpos >= Inl{ngd).
;*  Marginalen i utbufferten {r till f|r att kodningen av n{sta tecken
;*  garanterat ska f} plats. Fast den {r on|digt stor, eftersom kodningen
;*  av ett tecken kan bli max 5 tecken.
;*
;*  Returnerar i HL -1 om aktuell inposition {r lika med inl{ngden, annars 0.
;*
;*  Qctl, Qbin och Rept kan vara noll f|r att markera att de inte anv{nds.

; DE = Aktuell adress i utbuff, D' = Position i utbuff, E' = L{ngd av utbuff,
; HL = Aktuell adress i inbuff, B' = Position i inbuff, C' = L{ngd av inbuff,
; HL' = Adress i utbuff f|r ev repetionssekvens, B = Repetitionsr{knare.

Packbuff:   push   de
            pop    ix
            ld     l,(ix+PUtbuff)
            ld     h,(ix+PUtbuff+1)
            ld     c,(hl)             ; Position.
            ld     b,0
            add    hl,bc
            ex     de,hl              ; DE <- Aktuell adress i utbuffert.
            ld     a,c
            exx
            ld     d,a                ; D' <- Position i utbuffert.
            ld     e,(ix+PUtbuffl)    ; E' <- Utbuffertens l{ngd.
            exx

            ld     l,(ix+PInbuff)
            ld     h,(ix+PInbuff+1)
            ld     c,(hl)             ; Position.
            inc    hl
            ld     b,(hl)             ; L{ngd.
            dec    hl
            push   bc
            ld     b,0
            add    hl,bc              ; HL <- Aktuell adress i inbuffert.
            exx
            pop    hl
            ld     b,l                ; B' <- Position i inbufferten.
            ld     c,h                ; C' <- Inbuffertens l{ngd.
                                      ; Repetitionsr{knaren B {r nu noll.
PLoop:      ld     a,e
            sub    10
            cp     d                  ; J{mf|r  (E' - 10) med D'
            jr c   PEnd               ; Avsluta om Utpos > Utl{ngd - 10.
            ld     a,c
            cp     b                  ; J{mf|r C' med B'.
            jr z   PEnd
            jr nc  PCont              ; Avsluta om Inpos >= Inl{ngd.

PEnd:       ld     l,(ix+PUtbuff)
            ld     h,(ix+PUtbuff+1)
            ld     (hl),d             ; (Utbuff) <- D' = Position i utbuffert.
            ld     l,(ix+PInbuff)
            ld     h,(ix+PInbuff+1)
            ld     (hl),b             ; (Inbuff) <- B' = Position i inbuffert.
            inc    hl
            ld     (hl),c             ; (Inbuff+1) <- C' = L{ngd.
            ld     a,b
            cp     c
            ld     hl,0
            ret nz
            dec    hl                 ; Returv{rde HL <- Inpos = Inl{ngd.
            ret

PCont:      inc    b                  ; \ka Inpos i B' redan nu.
            exx
            ld     a,(ix+Rept)
            and    a
            jr z   PchkQbin           ; Ingen repetitionskomprimering.

            ld     a,(hl)             ; Aktuellt tecken.
            dec    hl
            cp     (hl)               ; J{mf|r tecknet med f|rra tecknet.
            inc    hl
            jr nz  PInitRept
            inc    b                  ; \ka repetitionsr{knaren.
            ld     a,b
            cp     5
            jr c   Px1                ; Hoppa om inte B > 4.
            push   bc
            ld     a,(ix+Rept)
            exx
            ld     (hl),a             ; Anv{nd den sparade utpekaren och
            inc    hl                 ; {ndra i utbufferten till repetitions-
            pop    af   ; A <- B = Rept.r{kn.                   sekvens med
            add    32                 ; <Rept><Antal+32>, samt }terst{ll
            ld     (hl),a             ; utadressen och utpositionen till
            push   hl                 ; slutet av denna sekvens.
            dec    hl
            ld     d,(ix+ReptPos)
            inc    d
            inc    d
            exx
            pop    de
            inc    de
            cp     94+32              ; J{mf|r B med 94. (A {r nu B+32)
            jr nz  PchkQbin
            ld     b,0                ; Avbryt repeteringsbehandling efter
            jr     PchkQbin           ; maxantalet 94 upprepningar.

PLoop2:     jr     PLoop              ; (F|r l}ngt f|r ett enda jr-hopp.)

Px1:        dec    a                  ; Om f|rra v{rdet p} rept-r{knaren var
            jr nz  PchkQbin           ; noll, ska den startas om.

PInitRept:  ld     b,1                ; Tecknet {r inte likt f|reg}ende.
            push   de                 ; Starta om repetitionsr{knare och
            exx                       ; spara utadress och utposition.
            pop    hl
            ld     (ix+ReptPos),d
            exx

PchkQbin:   ld     a,(hl)             ; Aktuellt tecken.
            inc    hl                 ; Inbuffertadressen|kas f|rst nu.
            ld     c,a
            cp     128
            jr c   PchkQctl           ; Behandla tecken >= 128 med Qbin
            ld     a,(ix+Qbin)
            and    a
            jr z   PchkQctl           ; Avst{ngt.
            ld     (de),a             ; Lagra <Qbin>.
            inc    de
            exx
            inc    d                  ; \ka Utpos.
            exx
            ld     a,c
            and    127                ; Nu slipper vi h|ga bitten.
            ld     c,a

PchkQctl:   ld     a,(ix+Qctl)
            and    a
            jr z   PStoreChar         ; Ingen hantering av ctrl-tecken.
            ld     a,c
            and    127
            cp     127                ; Tecken < 32 och = 127 kod{ndras.
            jr z   PCtrl
            cp     32
            jr c   PCtrl
            cp     (ix+Qctl)          ; Dessa tecken f|reg}as av Qctl men
            jr z   PQctl              ; kod{ndras inte.
            cp     (ix+Qbin)
            jr z   PQctl
            cp     (ix+Rept)
            jr z   PQctl
            jr     PStoreChar
PCtrl:      ld     a,c
            xor    64
            ld     c,a
PQctl:      ld     a,(ix+Qctl)
            ld     (de),a             ; Lagra <Qctl>.
            inc    de
            exx
            inc    d                  ; \ka Utpos.
            exx
PStoreChar: ld     a,c
            ld     (de),a             ; Lagra tecknet.
            inc    de
            exx
            inc    d                  ; \ka Utpos.

            jr     PLoop2
<<< kmain.bas >>>
2 ! **********************************************************************
3 ! Program          KMAIN.BAS        Utg}va  4.11     1990-02-17
4 ! av Bo Kullmar, 1789
6 ! F|r ABC800M ABC802 ABC806 DTC2
8 ! Testad p} ABC806
9 ! Se vidare K.BAS.
21 ! [ndra inte radnummreringen f|r Kermitrutinerna, f|r d} upph|r likheten
22 ! med monitorns Kermitrutiner!
23 ! **********************************************************************
30 EXTEND : INTEGER : OPTION BASE 0
60 COMMON V24def$=16,Oldprom,Mtyp,Key99,Enh$=4,Enh,Printer$=16,Version$=4,Mqbin,Pack$=376,Csum$=40
80 IF PEEK(39)=6 THEN Dtc2=-1 ! ta reda p} om det {r en DTC 2
1000 Dummy=FNInit
1010 IF FNF|rbindelse Rutin=FNMeny(1) ELSE Slut=-1
1020 WHILE NOT Slut
1030   IF Rutin=2 Eko=0 : Rutin=1
1040   IF Rutin=3 Eko=-1 : Rutin=1
1050   WHILE Rutin=4 ! Ta emot filer med Kermit
1060     Dummy=FNDisplaykermit
1070     ; CUR(3,0) FNF$(YEL) 'Mottag filer med Kermit'+Avbryt$
1075     ; FNF$(YEL) 'Avbryt fil|verf|ringen med PF1' SPACE$(9)+'Avbryt |verf|ringen av alla filer med PF8'
1080     CLOSE 20,30 : S{nd=0 : Dump=0 : Nfile=FNFiles(-1) : IF Nfile=-1 OR Ec=-1 GOTO 1260
1090     IF Mqbin=89 Dummy=FNMaskabit7(0,V24)
1100     Dummy=FNRe(Im,1,5)
1110     IF Dummy=0 Dummy=FNFel('Ok, klart')
1115     IF Dummy=-2 Rutin=100
1120     IF Mqbin=89 Dummy=FNMaskabit7(-1,V24)
1130   IF 0 WEND 
1140   IF Rutin=5 AND Dump=0 IF FNRfil Rutin=1
1150   IF Rutin=7 Dump=0 : CLOSE 30 : Rutin=1
1160   WHILE Rutin=6 ! S{nd filer med Kermit
1170     Dummy=FNDisplaykermit
1180     ; CUR(3,0) FNF$(YEL) 'S{nd filer med Kermit  '+Avbryt$
1185     ; FNF$(YEL) 'Avbryt fil|verf|ringen med PF1' SPACE$(9)+'Avbryt |verf|ringen av alla filer med PF8'
1190     CLOSE 20,30 : S{nd=0 : Dump=0 : Nfile=FNFiles(0)
1200     IF Nfile=0 OR Nfile=-1 OR Ec=-1 GOTO 1260
1210     IF Mqbin=89 Dummy=FNMaskabit7(0,V24)
1220     IF Nfile>0 Dummy=FNSw('',Im,1,ASCII('#'),Chktyp,5) : GOTO 1240
1230     IF Nfile-2 Dummy=FNSw(File$(1),Im,1,ASCII('#'),Chktyp,5)
1240     IF Dummy=0 Dummy=FNFel('Ok, klart')
1245     IF Dummy=-2 Rutin=100
1250     IF Mqbin=89 Dummy=FNMaskabit7(-1,V24)
1260   IF 0 WEND 
1270   IF Rutin=8 AND S{nd=0 IF FNSfil Rutin=1
1280   IF Rutin=9 Im=NOT Im
1290   IF Rutin=10 Enh$=FNDefenh$
1295   IF Rutin=11 IF Chktyp=1 Chktyp=2 ELSE Chktyp=1
1300   IF Rutin=1 Dummy=FNConnect
1305   IF Rutin=100 Rutin=1 : Dummy=FNTerm
1310   IF Rutin=12 Slut=-1 : GOTO 1330
1320   Rutin=FNMeny(Rutin)
1330 WEND 
1340 END 
1350 DEF FNInit
1351   ON ERROR GOTO 1495
1357   IF V24def$='' ; CHR$(12) FNF$(RED) 'Du m}ste starta med '+Enh$+'K, detta g|rs nu automatiskt!' : CHAIN Enh$+'K'
1358   ON ERROR GOTO 
1370   DIM Oldsk{rm$=2048,Dirmap$=16,Dirrec$=256,File$(20)=16,Enh$(20)=4,Esc$=1,V24buff$=400
1380   POKE VAROOT(Sk{rm$),0,8,30720,SWAP%(30720),0,8
1390   POKE VAROOT(Dosbuff$),0,1,0,245,0,1
1400   POKE VAROOT(Textbuff$),0,2,0,250,0,0
1405   POKE PEEK2(65500)+2,VAROOT(V24buff$),SWAP%(VAROOT(V24buff$))
1410   V24=9 : Inlu=2 : Outlu=3 : Chktyp=1
1420   ; CHR$(12)
1430   Huvud$=CUR(0,0)+FNF$(CYA)+'K, KERMIT-program f|r ABC800-serien, version '+Version$
1440   Cu=PEEK2(SYS(10)+64)+6
1450   IF PEEK2(PEEK2(65500))>=10 THEN V24xoff=PEEK2(65500)+37 ! (Trol 33 f|r ver 8)
1455   V24tkn=PEEK2(65500)+6 : V24ut=PEEK2(65500)+4
1460   IF Key99 Avbryt$=SPACE$(16)+'Avbryt inmatningen med STOP' ELSE Avbryt$=SPACE$(16)+'Avbryt inmatningen med PF1'
1480   Eko=-1 : Im=0
1490   RETURN 0
1495   ; FNF$(RED) 'Beklagar, hittar ej '+Enh$+'K och kan d{rf|r inte starta programmet!' : STOP 
1500 FNEND 
1510 DEF FNConnect LOCAL I
1520   ; CUR(16,0) FNF$(YEL) 'Kermit: uppkopplad - terminalmod - PF1 till meny.'
1530   WHILE I<1200 : I=I+1 : WEND 
1540   RETURN FNTerm
1550 FNEND 
1560 DEF FNDefenh$ LOCAL E$=4
1570   ; CUR(17,0) FNF$(YEL) 'Specificera standardenhet'+Avbryt$
1580   E$=FNVersal$(FNSpbort$(FNInmata$('',18,0,1,2,4,CYA+CHR$(138)))) : IF E$=CHR$(27) OR E$='' RETURN Enh$
1590   WHILE FNEnhcs(E$)=-1
1600     Dummy=FNFel('Felaktig enhet!')
1610     E$=FNVersal$(FNSpbort$(FNInmata$('',18,0,1,2,4,CYA+CHR$(138)))) : IF E$=CHR$(27) OR E$='' RETURN Enh$
1620   WEND 
1630   RETURN E$
1640 FNEND 
1650 DEF FNFiles(Rsw) LOCAL Nfile,Aa$=162,I,Bin$=10
1655   IF Im Bin$='Bin{rfiler' ELSE Bin$='Textfiler'
1660   Nfile=0
1665   ; CUR(5,0) FNF$(YEL) 'Standardenhet: ' FNF$(CYA) Enh$ : ; CUR(5,39) FNF$(YEL) 'Filtyp: ' FNF$(CYA) Bin$ : ; CUR(7,0) FNF$(YEL) 'Ange filnamn:';
1670   IF Rutin=4 ; TAB(40) 'Lokalt filnamn beh|ver ej anges'
1680   IF Rutin=6 AND (PEEK(24688)=0 OR PEEK(24688)=8) ; TAB(40) 'Jokertecken "*" och "?" kan anv{ndas'
1690   Aa$=FNVersal$(FNSpbort$(FNInmata$('',8,0,1,2,75,CYA+CHR$(138)))) : IF Aa$=CHR$(27) RETURN -1
1700   ; CUR(8,0) FNF$(CYA) Aa$+SPACE$(77-LEN(Aa$))
1710   WHILE Rsw=0 AND (INSTR(1,Aa$,'?') OR INSTR(1,Aa$,'*'))
1720     IF PEEK(24688)<>0 AND PEEK(24688)<>8 RETURN FNFel('Jokertecken kan enbart anv{ndas f|r UFD och LUX-NET DOS!')
1730     IF LEN(Aa$)>16 RETURN FNFel('F|r l}ngt filnamn!')
1740     File$(1)=Aa$
1750     Ec=FNKollenh(1) : IF Ec=-1 RETURN FNFel('Felaktig enhet!')
1760     RETURN -2
1770   WEND 
1780   IF Aa$='' Enh$(1)='' : RETURN 0
1790   Nfile=Nfile+1
1800   K=INSTR(1,Aa$,',')
1810   WHILE K
1820     IF LEN(LEFT$(Aa$,K-1))>16 RETURN FNFel('F|r l}ngt filnamn!')
1830     File$(Nfile)=LEFT$(Aa$,K-1) : Aa$=RIGHT$(Aa$,K+1)
1840     Ec=FNKollenh(Nfile) : IF Ec=-1 RETURN FNFel('Felaktig enhet!')
1850     Nfile=Nfile+1
1860     K=INSTR(1,Aa$,',')
1870     IF Nfile>20 ; FNFel('Max 20 filnamn kan matas in!') : RETURN 0
1880   WEND 
1890   IF LEN(Aa$)>16 RETURN FNFel('F|r l}ngt filnamn!')
1900   File$(Nfile)=Aa$
1910   Ec=FNKollenh(Nfile) : IF Ec=-1 RETURN FNFel('Felaktig enhet!')
1920   IF Rsw RETURN Nfile
1930   ON ERROR GOTO 1960
1940   I=1
1942   WHILE I<=Nfile
1943     IF Enh$(I)='' Enh$(I)=Enh$
1944     OPEN Enh$(I)+File$(I) AS FILE 2
1946     CLOSE 2 : I=I+1
1948   WEND 
1950   ON ERROR GOTO : RETURN Nfile
1960   ON ERROR GOTO : RETURN FNFel('Fil: '+Enh$(I)+File$(I)+' finns inte - avbryter !')
1970 FNEND 
1980 DEF FNTerm LOCAL Ctrlc
1990   Ctrlc=PEEK2(65413) : POKE 65413,0,0
1994   ; CHR$(12);
2000   IF Sk{rmstart=30720 Sk{rm$=Oldsk{rm$ ELSE Sk{rm$=RIGHT$(Oldsk{rm$,Sk{rmstart-30719)+LEFT$(Oldsk{rm$,Sk{rmstart-30720)
2010   POKE Cu,Kol,Rad
2015   IF V24xoff THEN POKE V24xoff,PEEK(V24xoff) AND 253 ! Bryt XOFF
2020   Slut=0
2030   Dummy=FNCursor
2040   WHILE NOT Slut
2050     IF PEEK2(V24tkn)<>0 Z=FNV24in
2060     IF SYS(5)>127 OR S{nd Z=FNTeckin
2070   WEND 
2080   POKE 65413,Ctrlc,SWAP%(Ctrlc)
2090   RETURN 0
2100 FNEND 
2110 DEF FNTeckin LOCAL A$=1
2120   IF S{nd ; #V24,FNS{ndline$; : RETURN 0 ELSE GET A$
2130   IF NOT Eko ; A$; : IF Dump ; #30,A$;
2140   IF ASCII(A$)=192 Slut=-1 : RETURN 0
2150   IF NOT Dtc2 IF ASCII(A$)=(130 AND Key99 OR 215 AND NOT Key99) THEN RETURN FNDump
2160   ; #V24,A$;
2170   RETURN 0
2180 FNEND 
2190 DEF FNV24in LOCAL A,Buff$=80,I
2195   A=PEEK2(PEEK2(65500)+6) : IF A>80 A=80
2200   GET #V24,Buff$ COUNT A
2205   WHILE Oldprom : I=LEN(Buff$) : WHILE I
2210       MID$(Buff$,I,1)=CHR$(ASCII(MID$(Buff$,I,1)) AND 127) : I=I-1
2215   WEND : WEND 
2220   RETURN FNSk{rm(Buff$)
2225 FNEND 
2250 DEF FNCursor LOCAL Rad,Kol,A
2252   IF Dtc2 2302
2260   Rad=PEEK(Cu+1) : Kol=PEEK(Cu) : A=30720+Rad*80+Kol
2270   OUT 56,14,57,SWAP%(A),56,15,57,A,56,10,57,104
2300   RETURN 0
2302   Rad=PEEK(Cu+1) : Kol=PEEK(Cu) : A=PEEK2(PEEK2(121)+8)+Rad*80+Kol
2303   IF A>32767 A=A-2048
2304   GOTO 2270
2305 FNEND 
2310 DEF FNSk{rm(Buff$) LOCAL J,Buff1$=4,Buff2$=1
2315   Z=FNCursor : J=1
2320   WHILE J<=LEN(Buff$)
2325     Buff1$=CHR$(ASCII(RIGHT$(Buff$,J))) : Buff2$=Buff1$
2330     IF Buff1$=CHR$(27) Esc=-1
2335     IF Buff1$=CHR$(30) Buff1$=CUR(0,0)
2340     IF Buff1$=CHR$(11) Buff1$=CUR(PEEK(Cu+1)-1,PEEK(Cu))
2345     IF Buff1$=CHR$(12) IF PEEK(Cu)>=PEEK(Cu+2) Buff1$=CUR(PEEK(Cu+1)+1,0) ELSE Buff1$=CUR(PEEK(Cu+1),PEEK(Cu)+1)
2350     IF Buff1$=CHR$(26) Buff1$=CHR$(12)
2360     IF Esc IF LEN(Styr$)=3 ; Styr$+Buff1$ : Styr$='' : Esc=0 ELSE Styr$=Styr$+Buff1$
2362     IF Esc AND LEN(Styr$)=2 IF Buff1$<>'=' Buff1$=Styr$ : Styr$='' : Esc=0
2364     IF NOT Esc ; Buff1$; : IF Dump ; #30 Buff2$;
2365     J=J+1
2370   WEND 
2380   RETURN FNCursor
2385 FNEND 
2390 DEF FNMeny(Alt) LOCAL Rutin,F$=1,Bin$=10
2395   Slut=0
2400   IF Alt=1 Oldsk{rm$=Sk{rm$ : Rad=PEEK(Cu+1) : Kol=PEEK(Cu) : IF Dtc2 Sk{rmstart=PEEK2(PEEK2(121)+8) ELSE Sk{rmstart=30720
2405   IF Im Bin$='Bin{rfiler' ELSE Bin$='Textfiler'
2410   ; CHR$(12) : Dummy=FNClr
2420   ; 
2425   ; FNF$(CYA) 'Pf 1        Koppla upp terminalf|rbindelse'
2430   ; FNF$(CYA) 'Pf 2        Lokalt eko av tecken'
2435   ; FNF$(CYA) 'SHIFT Pf 2  Ingen lokal ekning av tecken'
2440   ; FNF$(CYA) 'Pf 3        Mottag fil fr}n v{rddator med Kermit'
2445   ; FNF$(CYA) 'SHIFT Pf 3  Dumpa data till lokal fil (utan Kermit)'
2450   ; FNF$(CYA) 'CTRL  Pf 3  Avbryt dumpning till lokal fil'
2455   ; FNF$(CYA) 'Pf 4        S{nd fil till v{rddator med Kermit'
2460   ; FNF$(CYA) 'SHIFT Pf 4  Dumpa fil till v{rddator (utan Kermit)'
2465   ; FNF$(CYA) 'Pf 5        [ndra filtyp f|r Kermit,        nu = ' FNF$(YEL) Bin$
2470   ; FNF$(CYA) 'Pf 6        [ndra standardenhet f|r Kermit, nu = ' FNF$(YEL) Enh$
2472   ; FNF$(CYA) 'Pf 7        [ndra blockchecktyp f|r Kermit, nu =' FNF$(YEL) Chktyp
2475   ; FNF$(CYA) 'Pf 8        Avsluta programmet och bryt terminalf|rbindelsen'
2480   ; FNF$(CYA); : IF (Key99=0 AND NOT Dtc2) ; 'SHIFT Pf 8'; ELSE ; 'PRINT     ';
2485   ; '  Dumpa bildsk{rmen till skrivare ({ven direkt i terminalmode)'
2490   WHILE Rutin=0
2495     ; CUR(17,0) FNF$(YEL) 'V{lj funktion:  ' CHR$(8); : F$=FNTkn$(YEL)
2500     Rutin=INSTR(1,CHR$(192,193,209,194,210,195,226,211,196,197,198,199),F$) : IF Rutin RETURN Rutin
2505   WEND 
2510 FNEND 
2515 DEF FNSfil LOCAL Fil$=16
2520   ; CUR(17,0) FNF$(YEL) 'S{nda fil (utan Kermit)'+Avbryt$
2525   ; FNF$(YEL) 'Filnamn:';
2530   Fil$=FNVersal$(FNSpbort$(FNInmata$('',18,9,1,2,16,CYA+CHR$(138))))
2535   ON ERROR GOTO 2550
2540   OPEN Fil$ AS FILE 20
2545   S{nd=-1 : RETURN S{nd
2550   RETURN 0
2555 FNEND 
2560 DEF FNRfil LOCAL Fil$=16
2565   ; CUR(17,0) FNF$(YEL) 'Dumpa fil (utan Kermit)'+Avbryt$
2570   ; FNF$(YEL) 'Filnamn:';
2575   Fil$=FNVersal$(FNSpbort$(FNInmata$('',18,9,1,2,16,CYA+CHR$(138))))
2580   ON ERROR GOTO 2595
2585   PREPARE Fil$ AS FILE 30
2590   Dump=-1 : RETURN Dump
2595   RETURN 0
2600 FNEND 
2605 DEF FNS{ndline$ LOCAL Sp,St$=80
2610   IF LEN(Textbuff$) GOTO 2625
2615   ON ERROR GOTO 2645
2620   INPUT LINE #20,Textbuff$ : Textbuff$=LEFT$(Textbuff$,LEN(Textbuff$)-1)
2625   ON ERROR GOTO 
2630   Sp=PEEK2(PEEK2(65500)+4)-1
2635   IF LEN(Textbuff$)<=Sp THEN St$=Textbuff$ : Textbuff$='' ELSE St$=LEFT$(Textbuff$,Sp) : Textbuff$=RIGHT$(Textbuff$,Sp+1)
2640   RETURN St$
2645   S{nd=0 : CLOSE 20
2650   RETURN ''
2655 FNEND 
2660 DEF FNF|rbindelse
2860   OPEN V24def$ AS FILE V24
2870   ; CHR$(12);
2880   RETURN -1
2890   ! *** F|re RETURN kan kod l{ggas upp f|r uppringning om man har ett
2900   ! *** modem som klarar detta. Exempel p} s}dan kod finns i programmet
2910   ! *** KERM.BAS f|r TGC modem. Detta program finns i programbanken.
2920   ; 'Kan ej |ppna V24:an! Errcode: ' ERRCODE : STOP 
2930 FNEND 
2940 DEF FNClr
2950   ; CUR(1,0) FNF$(GYEL) STRING$(80,127);
2960   ; CUR(21,0) FNF$(GYEL) STRING$(80,127);
2970   ; CUR(0,22) SPACE$(36)
2980   ; Huvud$
2990   ; CUR(2,0);
3000   RETURN 0
3010 FNEND 
3020 DEF FNF$(F{rg$)
3030   IF Mtyp=0 RETURN F{rg$ ELSE RETURN ''
3050 FNEND 
3060 DEF FNSpbort$(In$) LOCAL A$=100,I,A
3070   I=1
3080   WHILE I<=LEN(In$)
3090     A=ASCII(RIGHT$(In$,I))
3100     IF A<>32 A$=A$+CHR$(A)
3110     I=I+1
3120   WEND 
3400   RETURN A$
3410 FNEND 
3420 DEF FNFeltext(In$)
3430   ; CUR(21,0) CHR$(7) FNF$(RED+NWBG+WHT+FLSH) '<' FNF$(NRML+STDY) In$ FNF$(FLSH) '>' SPACE$(78-LEN(In$)) FNF$(CHR$(128)+NWBG+WHT);
3440   RETURN 0
3450 FNEND 
3460 DEF FNFel(In$) LOCAL A$=1
3470   Z=FNFeltext(In$+'  Kvittera med CE ')
3480   ; CUR(21,LEN(In$)+22); : A$=FNTkn$(RED)
3490   WHILE A$<>CHR$(24)
3500     A$=FNTkn$(RED)
3510   WEND 
3520   ; CUR(21,0) FNF$(GYEL) STRING$(80,127)
3530   RETURN 0
3540 FNEND 
3550 DEF FNTkn$(F{rg$) LOCAL B$=1,Rad,Kol
3560   Rad=PEEK(Cu+1) : Kol=PEEK(Cu)
3570   Z=FNCursor
3580   IF Mtyp=0 ; F{rg$ CHR$(PEEK(30720+Rad*80+Kol));
3610   ; CUR(0,61) FNF$(CYA) TIME$
3620   WHILE SYS(5)=0 : ; CUR(0,61) FNF$(CYA) TIME$ : WEND 
3630   GET B$ : IF NOT Dtc2 IF ASCII(B$)=(130 AND Key99 OR 215 AND NOT Key99) THEN Z=FNDump
3640   POKE Cu,Kol,Rad
3650   RETURN B$
3660 FNEND 
3670 DEF FNPropen(Fil)
3680   WHILE -1
3690     ON ERROR GOTO 3720
3700     PREPARE Printer$ AS FILE Fil
3710     RETURN 0
3720     Z=FNFel('Skrivaren ej p}slagen, kontrollera !  ')
3730   WEND 
3740 FNEND 
3750 DEF FNInmata$(In$,Rad,Kol,Inpos,Pa,Max,F{rg$) LOCAL Ut$=100,L{ngd,Pos,Fval,A,Ins,M1$=1,M2$=1,M3$=10,O8
3760   Ut$=In$ : Pos=Inpos : Fval=Pa AND 15 : Z=FNKom99(9)
3770   WHILE -1
3780     ; CUR(Rad,Kol) FNF$(F{rg$) Ut$ STRING$(Max-LEN(Ut$),32-63*(Mtyp<>0)) CHR$(139) ' ';
3790     IF Pos>Max Pos=Max
3800     L{ngd=LEN(Ut$)
3810     ; CUR(Rad,Kol+Pos-1);
3820     A=ASCII(FNTkn$(F{rg$+CHR$(138))) : IF INSTR(1,CHR$(3,4,27,192,129),CHR$(A)) RETURN CHR$(27)
3830     Z=INSTR(1,CHR$(128,161,163,177,179,172,164,127),CHR$(A))
3840     IF Z A=ASCII(RIGHT$(CHR$(193,196,198,212,214,8,9,194),Z))
3850     IF A=24 Ut$='' : Pos=1
3860     IF Pa>15 OR A=13 IF INSTR(1,CHR$(192,193,196,197,198,199,212,214,240,208,13),CHR$(A)) Z=FNKom99(9) : RETURN Ut$
3870     IF A=8 IF Pos>1 Pos=Pos-1 ELSE IF Pa>15 Z=FNKom99(9) : RETURN Ut$
3880     IF A=9 IF Pos<Max Pos=Pos+1 ELSE IF Pa>15 Z=FNKom99(9) : RETURN Ut$
3890     WHILE A=194
3900       IF Pos<=L{ngd Ut$=LEFT$(Ut$+' ',Pos-1)+RIGHT$(Ut$,Pos+1)
3910       IF L{ngd<Pos AND L{ngd>0 IF Pos-L{ngd=1 Ut$=LEFT$(Ut$,L{ngd-1) : Pos=Pos-1 ELSE Pos=L{ngd+1
3920       A=0
3930     WEND 
3940     IF A=132 Ins=(Ins=0) : Z=FNKom99(9-128*Ins)
3950     IF Fval=3 A=A AND 223
3960     IF A=195 AND Pos<=L{ngd Ut$=LEFT$(Ut$+' ',Pos-1)+' '+RIGHT$(Ut$,Pos) : IF LEN(Ut$)>Max Ut$=LEFT$(Ut$,Max)
3970     RESTORE 4060
3980     WHILE O8<=Fval : READ M1$,M2$,M3$ : O8=O8+1 : WEND 
3990     WHILE ((A>=ASCII(M1$) AND A<=ASCII(M2$)) OR INSTR(1,M3$,CHR$(A))>0) AND Pos<=Max
4000       IF L{ngd<Pos Ut$=Ut$+SPACE$(Pos-L{ngd)
4010       Ut$=LEFT$(Ut$,Pos-1)+CHR$(A)+RIGHT$(Ut$,Pos-( NOT Ins))
4020       IF LEN(Ut$)>Max Ut$=LEFT$(Ut$,Max)
4030       Pos=Pos+1 : A=0
4040     WEND 
4050   WEND 
4060   DATA 0,9,' ',0,9,' .-',' ',~,' ',A,],' ',J,J,JjNn,A,],A
4070 FNEND 
4080 DEF FNKom99(K)
4090   IF Key99 OUT 34,K
4100   RETURN 0
4110 FNEND 
4210 DEF FNDump LOCAL Rad$=0,I
4220   Z=FNPropen(8)
4230   ; #8,CHR$(10,10,10)
4240   I=30720
4250   WHILE I<32640
4260     POKE VAROOT(Rad$),80,0,I,SWAP%(I),80,0 : ; #8 Rad$
4270     I=I+80
4280   WEND 
4290   CLOSE 8 : RETURN 0
4300 FNEND 
4400 DEF FNEsc LOCAL Tkn$=1,Tkn
4410   GET Tkn$
4420   Tkn=ASCII(Tkn$)
4430   IF Tkn<>192 AND Tkn<>199 RETURN 0
4440   ; : ; FNF$(RED) '\verf|ringen av '; : IF Tkn=192 ; 'aktuell fil avbrytes!' : RETURN 1
4450   ; 'alla filer avbrytes!' : RETURN 2
4460 FNEND 
4500 DEF FNKillfile(Lu,File$)
4510   ON ERROR GOTO 4540
4520   CLOSE Lu
4530   KILL File$ : RETURN 0
4540   ; CHR$(13,10) FNF$(RED) 'Kan ej ta bort inkommande fil p} grund av fel: ' ERRCODE : RETURN 0
4550 FNEND 
4600 DEF FNClose(Lu,File$)
4610   ON ERROR GOTO 4630
4620   CLOSE Lu : RETURN 0
4630   ; CHR$(13,10) FNF$(RED) 'Kan ej st{nga ' File$ ' p} grund av fel: ' ERRCODE : RETURN 0
4640 FNEND 
10000 DEF FNReadsec(Disk,Sec) LOCAL D
10010   POKE SYS(10)-511,Disk
10020   D=CALL(24678,Sec)
10030   IF PEEK(SYS(10)-491) RETURN -1
10040   RETURN 0
10050 FNEND 
10060 DEF FNDiscerror$ LOCAL I
10070   RESTORE 10140
10080   WHILE I<4
10090     READ Kod,Text$
10100     IF (PEEK(SYS(10)-491) AND Kod) RETURN Text$
10110     I=I+1
10120   WEND 
10130   RETURN 'ok{nd typ av diskfel!'
10140   DATA 8, 'checksummafel!
10150   DATA 16, 'd}lig disk!
10160   DATA 64, 'skivan skrivskyddad!
10170   DATA 128,'luckan |ppen!
10180 FNEND 
10190 DEF FNEnhcs(Drive$) LOCAL Adrenhl,Enh$=4,Dselect
10200   Adrenhl=PEEK2(SYS(10)+123) : IF Drive$='' RETURN PEEK(PEEK2(24683))
10210   WHILE Adrenhl<>0
10220     Enh$=CHR$(PEEK(Adrenhl+2),PEEK(Adrenhl+3),PEEK(Adrenhl+4),58)
10230     IF Enh$='CON:' OR Enh$='NUL:' OR Enh$='PR:' OR Enh$='V24:' Enh$=''
10240     Dselect=PEEK(Adrenhl+7)
10250     IF Enh$=Drive$ RETURN Dselect
10260     Adrenhl=PEEK2(Adrenhl)
10270   WEND 
10280   RETURN -1
10290 FNEND 
10300 DEF FNKollenh(Ix) LOCAL Kolon,Enh$=4,Ec
10310   Enh$(Ix)=''
10320   Kolon=INSTR(1,File$(Ix),':') : IF Kolon=0 RETURN 0
10330   Enh$=LEFT$(File$(Ix),Kolon) : Ec=FNEnhcs(Enh$)
10340   IF Ec=-1 OR Ec=30 AND PEEK2(65527)=0 RETURN -1
10350   Enh$(Ix)=Enh$ : File$(Ix)=RIGHT$(File$(Ix),Kolon+1)
10360   Enh=Ec : RETURN Ec
10370 FNEND 
10380 DEF FNIx(Fd) LOCAL P
10390   P=PEEK2(65344)
10400   WHILE PEEK(P+2)<>Fd AND P<>0
10410     P=PEEK2(P)
10420   WEND 
10430   RETURN P
10440 FNEND 
10450 DEF FNMaskabit7(Maska,Fd) LOCAL Ix
10455   IF Oldprom RETURN 0
10460   Ix=FNIx(Fd) : IF Ix=0 ; 'Stopp, filen ej |ppnad!' : STOP 
10470   IF Maska POKE PEEK2(Ix+18)+10,((PEEK(PEEK2(Ix+18)+10)-1) OR 4)+1 ELSE POKE PEEK2(Ix+18)+10,((PEEK(PEEK2(Ix+18)+10)-1) AND 251)+1
10480   RETURN 0
10490 FNEND 
10500 DEF FNDisplaykermit
10520   ; CHR$(12) CUR(1,0) FNF$(GYEL) STRING$(80,127) Huvud$
10550   RETURN 0
10560 FNEND 
20040 DEF FNSw(Wc$,Im,Synk,Mqctl,Mchkt,Mt) LOCAL T$=1,S$=1,Ib$=100,Ib,Ub$=101,Ub,Tb$=256,Tb,Npad,Padc,Eol,Time,Chkt,Qctl,Qbin,Rept,Maxl,N,Eof,Fs,F$=40,D,F
20050   Npad=0 : Padc=0 : Eol=13 : Time=8 : Chkt=Mchkt : Rept=126
20060   Ib$=SPACE$(100) : Ib=VARPTR(Ib$) : Tb=VARPTR(Tb$) : Ub=VARPTR(Ub$)
20070   POKE VAROOT(Ub$),100,0,Ub+1,SWAP%(Ub+1)
20080   S$='S' : F=1
20090   N=0
20100   IF INSTR(1,Wc$,'*') OR INSTR(1,Wc$,'?') LET Fs=-1 ELSE LET Fs=0
20110   F$=Wc$
20120   WHILE Fs
20140     Sector=FNOpendir(Enh$(1)) : IF Sector<0 GOTO 20766
20150     WHILE -1
20155       WHILE -1
20160         F$=FNReaddir$ : IF Ec AND Ec<>38 GOTO 20766
20165         IF F$='' GOTO 20765
20170         WHILE MID$(F$,14,1)='D' OR FNWild(Wc$,FNPackfilnamn$(LEFT$(F$,12)))=0
20180           F$=FNReaddir$ : IF Ec AND Ec<>38 GOTO 20766
20182           IF F$='' GOTO 20765
20186         WEND 
20190         F$=FNPackfilnamn$(LEFT$(F$,12))
20195         ; : ; FNF$(CYA) 'S{nder:';
20200       IF FNOpen(Enh$(1),F$,Inlu,1) WEND 
20210     IF 0 WEND 
20220   IF 0 WEND 
20222   WHILE NOT Fs
20223     ; : ; FNF$(CYA) 'S{nder:';
20225     Ec=FNOpen(Enh$(F),File$(F),Inlu,1) : F$=File$(F) : Oms{ndning=0
20228     IF Ec RETURN FNSendpack('E','Fel nr '+NUM$(Ec)+' under |ppnignen av '+F$+'!',1,Chkt,Synk,Npad,Padc,Eol,V24)-2
20229   IF 0 WEND 
20230   WHILE -1
20240     WHILE S$='S'
20250       Ub$=CHR$(FNChar(94),FNChar(Time),FNChar(Npad),FNCtl(Padc),FNChar(Eol),Mqctl)+CHR$(Mqbin)+NUM$(Mchkt)+CHR$(Rept)
20260       T$=FNSendbuff$(N,'S',Ub$,Ib,Synk,Npad,Padc,Eol,Mt,Time,1,V24)
20270       WHILE T$='Y'
20280         Maxl=FNUnchar(PEEK(Ib+2)) : Time=FNUnchar(PEEK(Ib+3))
20290         Npad=FNUnchar(PEEK(Ib+4)) : Padc=FNCtl(PEEK(Ib+5))
20300         Eol=FNUnchar(PEEK(Ib+6)) : Qctl=PEEK(Ib+7)
20310         Qbin=PEEK(Ib+8) : IF Qbin=89 Qbin=Mqbin : IF Qbin=89 Qbin=0
20315         IF Qbin<33 OR Qbin>62 AND Qbin<96 OR Qbin>126 Qbin=0
20320         IF Mchkt<>(PEEK(Ib+9)-48) Chkt=1 ELSE Chkt=Mchkt
20330         IF PEEK(Ib+10)<>Rept Rept=0
20340       IF 0 WEND 
20350       N=(N+1) AND 63
20360       IF T$='Y' S$='F' ELSE S$=T$
20370     WEND 
20380     WHILE S$='F'
20390       T$=FNSendbuff$(N,'F',F$,Ib,Synk,Npad,Padc,Eol,Mt,Time,Chkt,V24)
20400       IF INSTR(1,'NY',T$) S$='D' ELSE S$=T$
20410       N=(N+1) AND 63
20420     WEND 
20430     WHILE S$='D'
20440       Eof=FNFileread(Tb,Im,Inlu)
20450       WHILE Eof=0
20460         POKE Ub,1 : WHILE FNPackbuff(Ub,Maxl-Chkt,Tb,Mqctl,Qbin,Rept) AND Eof=0 : Eof=FNFileread(Tb,Im,Inlu) : WEND 
20465         Paket=Paket+1 : ; CUR(PEEK(Cu+1),38); : ; USING '#####' Paket;
20470         POKE VAROOT(Ub$)+4,PEEK(Ub)-1,0 : T$=FNSendbuff$(N,'D',Ub$,Ib,Synk,Npad,Padc,Eol,Mt,Time,Chkt,V24)
20480         N=(N+1) AND 63
20483         IF PEEK(Ib+1)>2+Chkt AND PEEK(Ib+2)=88 Eof=1
20484         IF PEEK(Ib+1)>2+Chkt AND PEEK(Ib+2)=90 Eof=1 : LET Fs=0 : F=Nfile+1
20485         IF SYS(5) D=FNEsc : IF D=1 Eof=1 ELSE IF D=2 Eof=1 : LET Fs=0 : F=Nfile+1
20490       IF T$='Y' WEND 
20500       IF Eof S$='Z' ELSE S$=T$
20510     WEND 
20520     WHILE S$='Z'
20530       IF Eof=38 OR Eof=34 Ub$='' ELSE Ub$='D'
20540       Dummy=FNClose(Inlu,F$)
20550       T$=FNSendbuff$(N,'Z',Ub$,Ib,Synk,Npad,Padc,Eol,Mt,Time,Chkt,V24)
20560       IF T$='Y' S$='B' ELSE S$=T$
20570       N=(N+1) AND 63
20575       IF Eof<>34 AND Eof<>38 AND Eof<>1 RETURN FNSendpack('E','Fel nr '+NUM$(Eof)+' vid l{sning av '+F$+'!',N,Chkt,Synk,Npad,Padc,Eol,V24)-2
20580     WEND 
20590     WHILE S$='B'
20595       WHILE Fs
20600         F$=FNReaddir$ : IF Ec AND Ec<>38 GOTO 20767
20610         WHILE F$<>''
20620           WHILE MID$(F$,14,1)='D' OR FNWild(Wc$,FNPackfilnamn$(LEFT$(F$,12)))=0
20630             F$=FNReaddir$ : IF Ec AND Ec<>38 GOTO 20767
20631           IF F$<>'' WEND 
20633           WHILE F$<>''
20635             F$=FNPackfilnamn$(LEFT$(F$,12))
20637             ; : ; FNF$(CYA) 'S{nder:';
20640             D=FNOpen(Enh$(1),F$,Inlu,1)
20655           IF 0 WEND 
20660         IF Ec WEND 
20670         IF F$<>'' AND Ec=0 S$='F' ELSE S$='C'
20675       IF 0 WEND 
20676       F=F+1
20677       WHILE NOT Fs AND F<=Nfile
20678         ; : ; FNF$(CYA) 'S{nder:';
20679         Ec=FNOpen(Enh$(F),File$(F),Inlu,1) : F$=File$(F) : S$='F'
20680         IF Ec RETURN FNSendpack('E','Fel nr '+NUM$(Ec)+' under |ppningnen av '+F$+'!',N,Chkt,Synk,Npad,Padc,Eol,V24)-2
20681       IF 0 WEND 
20685       IF NOT Fs AND F>Nfile F$=''
20689       WHILE F$='' OR FNDcd
20690         T$=FNSendbuff$(N,'B','',Ib,Synk,Npad,Padc,Eol,Mt,Time,Chkt,V24)
20700         N=(N+1) AND 63
20710         IF T$='Y' S$='C' ELSE S$=T$
20720       IF 0 WEND 
20730     WEND 
20732     IF S$='e' RETURN -2
20733     IF S$='E' RETURN FNFel(MID$(Ib$,3,PEEK(Ib+1)-2-Chkt))-2
20740     IF S$='C' Ec=0 : RETURN 0
20750     IF INSTR(1,'SFDZBC',S$)=0 RETURN FNSendpack('E','OK[ND pakettyp: '+S$+'!!!',N,Chkt,Synk,Npad,Padc,Eol,V24)-2
20760   WEND 
20765   RETURN FNFel(Wc$+' ger ej tr{ff p} n}gon fil!')-2
20766   RETURN FNFel('Kan ej l{sa '+Enh$(1)+', '+FNDiscerror$)-2
20767   RETURN FNSendpack('E','Kan ej l{sa '+Enh$(1)+', '+FNDiscerror$,1,Chkt,Synk,Npad,Padc,Eol,V24)-2
20770 FNEND 
21040 DEF FNRe(Im,Synk,Mt) LOCAL N,S$=1,T$=1,Ib$=100,Ib,Ub$=50,Buff$=254,Buff,Maxl,Time,Npad,Padc,Eol,Qctl,Qbin,Chkt,Rept,Fo$=20,Fl$=12,Wferr,F,En$=4,D
21050   Maxl=94 : Time=40 : Npad=0 : Padc=0 : Eol=13 : Qctl=0 : Chkt=1 : Rept=0
21055   Wferr=0
21060   Ib=VARPTR(Ib$) : POKE VAROOT(Ib$)+4,100,0
21061   Buff=VARPTR(Buff$)
21070   N=0 : F=0
21072   T$=' '
21080   WHILE -1
21090     S$=FNRpack$(Ib,N,Synk,Time,Mt,Chkt,Npad,Padc,Eol,V24)
21092     WHILE Wferr
21094       Dummy=FNKillfile(Outlu,En$+Fl$)
21096       RETURN FNSendpack('E','Fel vid skrivning p} filen '+En$+Fl$+'. Fel nr '+NUM$(Wferr)+'.',N,Chkt,Synk,Npad,Padc,Eol,V24)-2
21098     WEND 
21100     WHILE S$='S'
21110       IF (PEEK(Ib)<>N AND PEEK(Ib)<>((N-1) AND 63)) OR INSTR(1,' S',T$)=0 RETURN FNSendpack('E','Send-init ???',PEEK(Ib),1,Synk,Npad,Padc,Eol,V24)-2
21120       WHILE S$='S'
21130         Maxl=FNUnchar(PEEK(Ib+2)) : Time=FNUnchar(PEEK(Ib+3))
21140         Npad=FNUnchar(PEEK(Ib+4)) : Padc=FNCtl(PEEK(Ib+5))
21150         Eol=FNUnchar(PEEK(Ib+6)) : Qctl=PEEK(Ib+7)
21160         IF PEEK(Ib+1)<8 Qbin=0 ELSE Qbin=PEEK(Ib+8) : IF Qbin=89 Qbin=Mqbin
21165         IF Qbin<33 OR Qbin>62 AND Qbin<96 OR Qbin>126 THEN Qbin=0
21170         IF PEEK(Ib+1)<9 Chkt=1 ELSE Chkt=PEEK(Ib+9)-48 : IF Chkt<>2 Chkt=1
21180         IF PEEK(Ib+1)<10 Rept=0 ELSE Rept=PEEK(Ib+10) : IF Rept<33 OR Rept>62 AND Rept<96 OR Rept>126 Rept=0
21190         Ub$=CHR$(FNChar(75),FNChar(8),FNChar(0),FNCtl(0),FNChar(13),Qctl,Qbin OR 78 AND Qbin=0)+NUM$(Chkt)
21195         IF Rept THEN Ub$=Ub$+CHR$(Rept) ELSE Ub$=Ub$+' '
21200         D=FNSendpack('Y',Ub$,PEEK(Ib),1,Synk,Npad,Padc,Eol,V24)
21205         N=((PEEK(Ib)+1) AND 63)
21210       IF 0 WEND 
21220     IF 0 WEND 
21230     WHILE S$='F'
21240       IF INSTR(1,'SZF',T$)=0 RETURN FNSendpack('E','Fil-huvud ???',N,Chkt,Synk,Npad,Padc,Eol,V24)-2
21241       IF T$='F' AND Fo$<>FNVersal$(MID$(Ib$,3,PEEK(Ib+1)-2-Chkt)) RETURN FNSendpack('E','Tv} fil-huvuden ???',N,Chkt,Synk,Npad,Padc,Eol,V24)-2
21250       WHILE S$='F'
21260         Fo$=FNVersal$(MID$(Ib$,3,PEEK(Ib+1)-2-Chkt)) : Fl$=''
21270         D=1 : WHILE D<=LEN(Fo$)
21280           WHILE (LEN(Fl$)<8 AND INSTR(1,Fl$,'.')=0) OR (LEN(Fl$)-INSTR(1,Fl$,'.'))<3
21290             IF INSTR(1,'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ][\',MID$(Fo$,D,1))<>0 Fl$=Fl$+MID$(Fo$,D,1)
21300           IF 0 WEND 
21310           IF MID$(Fo$,D,1)='.' Fl$=Fl$+'.'
21320         D=D+1 : WEND 
21325         En$='' : F=F+1 : IF F<=20 IF F<=Nfile AND File$(F)<>'' Fl$=File$(F) : En$=Enh$(F)
21327         ; : ; FNF$(CYA) 'Mottar:'; : Radpos=0 : Oms{ndning=0
21330         Ec=FNOpen(En$,Fl$,Outlu,2) : IF Ec RETURN FNSendpack('E','Kan ej skapa '+En$+Fl$+', fel nr '+NUM$(Ec)+'!',N,Chkt,Synk,Npad,Padc,Eol,V24)-2
21510         IF S$='F' D=FNSendpack('Y','',N,Chkt,Synk,Npad,Padc,Eol,V24) : N=((N+1) AND 63)
21520       IF 0 WEND 
21521       POKE Buff,1
21530     IF 0 WEND 
21600     WHILE S$='D'
21605       D=FNSendpack('Y',Esc$,N,Chkt,Synk,Npad,Padc,Eol,V24) : N=((N+1) AND 63)
21610       POKE Ib,2
21615       IF Esc$='' Paket=Paket+1 : ; CUR(PEEK(Cu+1),38); : ; USING '#####' Paket;
21620       WHILE FNUnpbuff(Ib,PEEK(Ib+1)-1-Chkt,Buff,253,Qctl,Qbin,Rept)<=0 : Ec=FNFilewrite(Buff,Im,Outlu) : IF Ec Wferr=Ec ELSE WEND 
21630       Esc$='' : IF SYS(5) Dummy=FNEsc : IF Dummy=1 Esc$='X' ELSE IF Dummy=2 Esc$='Z'
21640     IF 0 WEND 
21700     WHILE S$='Z'
21705       IF PEEK(Buff)>1 Ec=FNFilewrite(Buff,Im,Outlu) : IF Ec Wferr=Ec
21706       WHILE S$='Z' AND Wferr=0
21710         IF (PEEK(Ib+1)>=3+Chkt AND MID$(Ib$,3,PEEK(Ib+1)-2-Chkt)='D') OR Esc$='X' OR Esc$='Z' D=FNKillfile(Outlu,En$+Fl$) ELSE D=FNClose(Outlu,En$+Fl$)
21720         D=FNSendpack('Y','',N,Chkt,Synk,Npad,Padc,Eol,V24) : N=((N+1) AND 63)
21722       IF 0 WEND 
21730     IF 0 WEND 
21740     WHILE S$='B'
21741       D=FNSendpack('Y','',N,Chkt,Synk,Npad,Padc,Eol,V24) : N=((N+1) AND 63)
21750       Ec=0 : RETURN 0
21760     IF 0 WEND 
21762     IF S$='e' RETURN -2
21763     IF S$='E' RETURN FNFel(MID$(Ib$,3,PEEK(Ib+1)-2-Chkt))-2
21770     IF INSTR(1,'SFDZB',S$)=0 RETURN FNSendpack('E','OK[ND pakettyp: '+S$+'!!!',N,Chkt,Synk,Npad,Padc,Eol,V24)-2
21810     T$=S$
25000   WEND 
25010 FNEND 
30010 DEF FNRpack$(Buff,N,Synk,Time,Mtrye,Check,Npad,Padc,Eol,Lu) LOCAL Maxtrye,T$=1,D
30020   Maxtrye=Mtrye
30030   WHILE Maxtrye
30040     T$=FNGetpack$(Buff,Synk,Time,Check,Lu)
30045     IF T$='E' RETURN 'E'
30050     IF INSTR(1,' T',T$)=0 AND (PEEK(Buff)=N) RETURN T$
30060     IF PEEK(Buff)=((N+1) AND 63) D=FNSendpack('E','Jag har tappat bort ett paket!!!',N,Check,Synk,Npad,Padc,Eol,Lu) : RETURN 'e'
30065     IF T$='D' Oms{ndning=Oms{ndning+1 : ; CUR(PEEK(Cu+1),50); : ; USING '#####' Oms{ndning;
30070     Maxtrye=Maxtrye-1
30080     D=FNSendpack('N','',N,Check,Synk,Npad,Padc,Eol,Lu)
30090   WEND 
30100   D=FNSendpack('E','Avbryter! F|r m}nga oms{ndningar!!!',N,Check,Synk,Npad,Padc,Eol,Lu)
30110   RETURN 'e'
30120 FNEND 
40030 DEF FNSendbuff$(N,Tp$,Buff$,Inbuff,Synk,Npad,Padc,Eol,Mt,Time,Check,Lu) LOCAL Nt,D,S$=1
40040   Nt=Mt
40060   WHILE Nt
40065     D=FNTom(Lu)
40070     D=FNSendpack(Tp$,Buff$,N,Check,Synk,Npad,Padc,Eol,Lu)
40080     S$=FNGetpack$(Inbuff,Synk,Time,Check,Lu)
40082     IF S$='E' RETURN 'E'
40085     IF Tp$='D' AND Nt<>Mt Oms{ndning=Oms{ndning+1 : ; CUR(PEEK(Cu+1),50); : ; USING '#####' Oms{ndning;
40090     IF S$='N' AND N IF ((PEEK(Inbuff)-1) AND 63)=N RETURN 'Y'
40100     IF S$='Y' IF PEEK(Inbuff)=N RETURN 'Y'
40110     IF INSTR(1,' TNY',S$)=0 D=FNSendpack('E','Avbryter! OK[ND pakettyp: '+S$+'!!!',N,Check,Synk,Npad,Padc,Eol,Lu) : RETURN 'e'
40120     Nt=Nt-1
40130   WEND 
40135   D=FNSendpack('E','Avbryter! F|r m}nga oms{ndningar!!!',N,Check,Synk,Npad,Padc,Eol,Lu)
40140   RETURN 'e'
40150 FNEND 
40220 DEF FNFilewrite(Buff,Im,Lu) LOCAL B$=0,Le
40230   POKE VAROOT(B$),253,0,Buff+1,SWAP%(Buff+1),253,0
40240   Le=PEEK(Buff)-1
40250   ON ERROR GOTO 40290
40260   IF Im PUT #Lu LEFT$(B$,Le) ELSE ; #Lu FNExpandtab$(LEFT$(B$,Le));
40270   POKE Buff,1
40280   RETURN 0
40290   RETURN ERRCODE
40300 FNEND 
40380 DEF FNUnpbuff(Inbuff,Inbuffl,Utbuff,Utbuffl,Qctl,Qbin,Rept) LOCAL A$=9
40390   A$=CHR$(Inbuff,SWAP%(Inbuff),Inbuffl,Utbuff,SWAP%(Utbuff),Utbuffl,Qctl,Qbin,Rept)
40400   RETURN CALL(VARPTR(Pack$),VARPTR(A$))
40410 FNEND 
40580 DEF FNFileread(Buff,Im,Lu) LOCAL B$=0
40590   POKE VAROOT(B$),253,0,Buff+2,SWAP%(Buff+2),253,0
40600   ON ERROR GOTO 40640
40610   IF Im GET #Lu B$ COUNT 253 ELSE INPUT LINE #Lu B$
40620   POKE Buff,2,LEN(B$)+2
40630   RETURN 0
40640   POKE Buff,2,0 : RETURN ERRCODE
40650 FNEND 
40730 DEF FNPackbuff(Buff,Buffl,Tmpb,Qctl,Qbin,Rept) LOCAL A$=9
40740   A$=CHR$(Buff,SWAP%(Buff),Buffl,Tmpb,SWAP%(Tmpb),0,Qctl,Qbin,Rept)
40750   RETURN CALL(VARPTR(Pack$)+163,VARPTR(A$))
40760 FNEND 
40950 DEF FNTom(Lu) LOCAL D,D$=50
40960   D=FNAntalintecken
40970   WHILE D
40980     IF D>50 D=50
40990     GET #Lu D$ COUNT D
41000     D=FNAntalintecken
41010   WEND 
41020   RETURN 0
41030 FNEND 
41080 DEF FNAntalintecken=PEEK2(V24tkn) 
41150 DEF FNGetpack$(Buff,Synk,Time,Check,Lu) LOCAL D,B$=0,T$=1,P,A
41160   POKE VAROOT(B$),100,0,Buff,SWAP%(Buff),100,0
41170   IF FNAntalintecken=0 IF FNTimeout(Time) RETURN 'T'
41180   D=ASCII(FNGchr$(1,Lu)) : IF INSTR(1,CHR$(3,4,26),CHR$(D)) RETURN 'T'
41190   WHILE D<>Synk : IF FNAntalintecken=0 IF FNTimeout(Time) RETURN 'T'
41200     D=ASCII(FNGchr$(1,Lu)) : IF INSTR(1,CHR$(3,4,26),CHR$(D)) RETURN 'T'
41210   WEND 
41220   IF FNAntalintecken=0 IF FNTimeout(Time) RETURN 'T'
41230   A=FNUnchar(ASCII(FNGchr$(1,Lu))) : P=1
41240   WHILE P-2<A
41250     D=FNAntalintecken : IF D=0 IF FNTimeout(Time) RETURN 'T' ELSE D=FNAntalintecken
41260     IF D>A-P+2 D=A-P+2
41270     MID$(B$,P,D)=FNGchr$(D,Lu) : P=P+D
41280   WEND 
41290   IF MID$(B$,2,1)<>'S' IF MID$(B$,A-Check+1,Check)<>FNCsum$(CHR$(FNChar(A))+LEFT$(B$,A-Check),Check) RETURN ' '
41291   IF MID$(B$,2,1)='S' IF MID$(B$,A,1)<>FNCsum$(CHR$(FNChar(A))+LEFT$(B$,A-1),1) RETURN ' '
41300   T$=MID$(B$,2,1)
41310   POKE Buff,FNUnchar(PEEK(Buff)),A
41320   RETURN T$
41330 FNEND 
41380 DEF FNGchr$(A,Lu) LOCAL B$=100,I
41390   GET #Lu B$ COUNT A
41391   IF Mqbin<>38 OR Oldprom=0 THEN RETURN B$
41392   I=A : WHILE I
41396     MID$(B$,I,1)=CHR$(ASCII(MID$(B$,I,1)) AND 127) : I=I-1
41398   WEND 
41400   RETURN B$
41410 FNEND 
41460 DEF FNTimeout(T) LOCAL D.
41470   D.=T*198.
41480   WHILE D.<>0. AND FNAntalintecken=0 : D.=D.-1. : IF FNDcd D.=0. ELSE WEND 
41490   RETURN D.=0.
41500 FNEND 
41550 DEF FNAntaluttecken=PEEK2(V24ut) 
41600 DEF FNDcd
41610   OUT 65,16 : RETURN (INP(65) AND 8)=0
41620 FNEND 
41690 DEF FNPutpack(Buff$,Npad,Padc,Lu) LOCAL P,D
41700   P=Npad
41710   D=FNAntaluttecken
41720   WHILE P AND FNDcd=0
41730     IF D>P D=P
41740     PUT #Lu STRING$(D,Padc)
41750     P=P-D : D=FNAntaluttecken
41760   WEND 
41770   P=1 : WHILE P<=LEN(Buff$) AND FNDcd=0
41780     IF D>LEN(Buff$)-P+1 D=LEN(Buff$)-P+1
41790     PUT #Lu MID$(Buff$,P,D)
41800     P=P+D : D=FNAntaluttecken
41810   WEND 
41820   RETURN 0
41830 FNEND 
41880 DEF FNSendpack(T$,Buff$,N,Check,Synk,Npad,Padc,Eol,Lu) LOCAL D,B$=100
41890   B$=CHR$(Synk,FNChar(LEN(Buff$)+Check+2),FNChar(N))+T$+Buff$
41900   D=FNPutpack(B$+FNCsum$(RIGHT$(B$,2),Check)+CHR$(Eol),Npad,Padc,Lu)
41910   IF T$='E' RETURN FNFel(Buff$) ELSE RETURN 0
41920 FNEND 
41960 DEF FNCtl(T)=T XOR 64 
41970 DEF FNChar(T)=T+32 
41980 DEF FNUnchar(T)=T-32 
42040 DEF FNCsum$(B$,C) LOCAL Sum
42050   IF C<>1 AND C<>2 THEN ; 'Ej implementerad typ av checksumma' : STOP 
42060   Sum=CALL(VARPTR(Csum$),PEEK2(PEEK2(65304)))
42070   IF C=1 RETURN CHR$(FNChar(Sum+SWAP%(Sum AND 768) AND 63))
42080   RETURN CHR$(FNChar(SWAP%(Sum) AND 63),FNChar(Sum AND 63))
42090 FNEND 
42460 DEF FNWild(Wc$,St$)
42470   IF LEN(St$)=0 IF LEN(Wc$)=0 OR Wc$='*' THEN RETURN -1 ELSE RETURN 0
42480   IF LEN(Wc$)=0 THEN RETURN 0
42490   IF ASCII(Wc$)=ASCII(St$) RETURN FNWild(RIGHT$(Wc$,2),RIGHT$(St$,2))
42500   IF ASCII(Wc$)=63 THEN RETURN FNWild(RIGHT$(Wc$,2),RIGHT$(St$,2))
42510   IF ASCII(Wc$)<>42 THEN RETURN 0
42520   IF FNWild(RIGHT$(Wc$,2),St$) RETURN -1
42530   RETURN FNWild(Wc$,RIGHT$(St$,2))
42550 FNEND 
42650 DEF FNPackfilnamn$(Fl$) LOCAL F$=12,P
42660   F$=Fl$
42670   P=INSTR(1,F$,' ')
42680   WHILE P : F$=LEFT$(F$,P-1)+RIGHT$(F$,P+1) : P=INSTR(1,F$,' ') : WEND 
42690   RETURN F$
42700 FNEND 
42800 DEF FNExpandtab$(In$) LOCAL I,Sp
42810   ON ERROR GOTO 42920
42820   Textbuff$=In$ : I=0
42830   WHILE I<LEN(Textbuff$)
42840     I=I+1 : Radpos=Radpos+1
42850     IF ASCII(MID$(Textbuff$,I,1))=10 Radpos=0
42860     WHILE ASCII(MID$(Textbuff$,I,1))=9
42870       Sp=MOD(Radpos,8) : Sp=8-Sp : IF Sp=8 Sp=0
42880       Textbuff$=LEFT$(Textbuff$,I-1)+SPACE$(1+Sp)+RIGHT$(Textbuff$,I+1) : Radpos=Radpos+Sp : I=I+Sp
42890     IF 0 WEND 
42900   WEND 
42910   RETURN Textbuff$
42920   Ec=ERRCODE : RETURN ''
42930 FNEND 
60280 DEF FNOpendir(En$) LOCAL Enhet$=4,Adr,Ufd,Bitmap0$=16,Bitmap1$=16,I
60281   Enhet$=En$ : IF Enhet$='' Enhet$=Enh$
60282   IF Enh>=0 AND Enh<=3 Enh=PEEK(PEEK2(24683))+Enh
60283   IF Enh>=12 AND Enh<=15 Adr=6 ELSE Adr=14
60284   IF Enh=30 Enh=PEEK(65529) : Ufd=-1 : Adr=PEEK2(65527)-1
60291   Ec=FNReadsec(Enh,Adr) : IF Ec RETURN -1
60292   Bitmap0$=MID$(Dosbuff$,240,16) : Adr=Adr+1 : Dirmap$=SPACE$(16)
60294   IF Ufd Bitmap1$=STRING$(16,0) ELSE Ec=FNReadsec(Enh,Adr) : IF Ec RETURN -1
60296   IF NOT Ufd Bitmap1$=MID$(Dosbuff$,240,16) : Adr=Adr+1
60300   WHILE I<16
60302     I=I+1
60304     MID$(Dirmap$,I,1)=CHR$(ASCII(MID$(Bitmap0$,I,1))-ASCII(MID$(Bitmap1$,I,1)))
60306   WEND 
60308   Dirrec$='' : IF Enh>=12 AND Enh<=15 AND NOT Ufd Adr=Adr+8
60309   RETURN Adr
60310 FNEND 
60340 DEF FNReaddir$ LOCAL N$=14,A
60342   ON ERROR GOTO 60380
60343   ! 
60344   WHILE LEN(Dirmap$)
60346     WHILE LEN(Dirrec$) : N$=MID$(Dirrec$,5,8)+"."+MID$(Dirrec$,13,3)
60348       Dirrec$=RIGHT$(Dirrec$,17)
60349       IF ASCII(N$)>=48 AND ASCII(N$)<95 GOTO 60356
60350     WEND : A=ASCII(Dirmap$) : Dirmap$=RIGHT$(Dirmap$,2)
60352     IF A Ec=FNReadsec(Enh,Sector) : IF Ec RETURN -1
60353     Dirrec$=Dosbuff$ : Sector=Sector+1
60354   WEND : Ec=38 : RETURN ''
60355   ! 
60356   IF MID$(N$,10,3)='Ufd' N$=LEFT$(N$,8)+'     D'
60358   RETURN N$+SPACE$(39-LEN(N$))
60359   ! 
60380   Ec=ERRCODE : RETURN ''
60390 FNEND 
60420 DEF FNOpen(Enhet$,File$,Nr,Typ) LOCAL En$=4
60430   Paket=0 : Oms{ndning=0
60460   ON ERROR GOTO 60490
60465   IF Enhet$='' En$=Enh$ ELSE En$=Enhet$
60470   OPEN En$+File$ AS FILE Nr
60475   ; TAB(9) En$+File$ TAB(30) 'Paket:';
60480   RETURN 0
60490   IF Typ<>2 Ec=ERRCODE : RETURN Ec
60500   IF ERRCODE<>21 Ec=ERRCODE : RETURN Ec
60510   ON ERROR GOTO 60540
60520   PREPARE En$+File$ AS FILE Nr
60525   ; TAB(9) En$+File$ TAB(30) 'Paket:';
60530   RETURN 0
60540   Ec=ERRCODE : RETURN Ec
60550 FNEND 
62650 DEF FNVersal$(In$) LOCAL Ut$=100,Pekare,V{rde
62660   IF In$='' RETURN ''
62670   Pekare=1
62680   WHILE Pekare<=LEN(In$)
62690     V{rde=ASCII(MID$(In$,Pekare,1))
62700     IF V{rde>95 AND V{rde<127 V{rde=V{rde AND 95
62710     IF V{rde<128 Ut$=Ut$+CHR$(V{rde)
62720     Pekare=Pekare+1
62730   WEND 
62740   RETURN Ut$
62750 FNEND 
<<< kmain.doc >>>
Luxor ABC800/ABC802/ABC806 KERMIT
FACIT DTC/DTC2 KERMIT


Program:        Bo Kullmar (bk@kullmar.se)
                Lars-Goran Goransson (The first two o:s should have double-dots
                above them.)
                Mikael Lide'n
                Kristoffer Eriksson (ske@pkmab.se)
                Mikael Johansson

ABC-Club        All are members of the "ABC-Klubben", Stockholm, Sweden, a
                computer club. The name in english, is the ABC-Club.

                The ABC-Club was founded 1979 as a user group in Sweden for
                the Luxor ABC 8 bits microcomputer.

                Today, Nokia has taken over Luxor and Nokia sells IBM
                compatible PC:s. Today the club has a lot of members that
                use PC:s and other modern computers. The aim of the ABC-Club
                is today to be a user group for the old Luxor ABC computer
                users and PC users in Sweden.

Language:       ABC-BASIC II and some routines in assembler

Documentation:  Bo Kullmar

Version:        4.11

Date:           January 4, 1990


K/KMAIN ABC80X Kermit Capabilities At A Glance:

  Local operation:                   Yes
  Remote operation:                  No
  Transfers text files:              Yes
  Transfers binary files:            Yes
  Wildcard send:                     Yes
  ^X/^Y interruption:                Yes, with Pf1/Pf8
  Filename collision avoidance:      No
  Can time out:                      Yes
  8th-bit prefixing:                 Yes
  Repeat count prefixing:            Yes
  Alternate block checks:            Yes
  Terminal emulation:                Yes, ADM3A
  Communication settings:            Yes
  Transmit BREAK:                    No
  IBM mainframe communication:       No
  Transaction logging:               No
  Session logging:                   No
  Raw transmit:                      Yes
  Act as server:                     No
  Talk to server:                    No
  Advanced server functions:         No
  Advanced commands for servers:     No
  Local file management:             No
  Command/init files:                No
  Command macros:                    No
  Attribute packets:                 No
  Extended-length packets:           No
  Sliding windows:                   No


K and KMAIN are two programs that implement the Kermit file transfer protocol
for the Luxor ABC800 family, i.e. Luxor ABC800, ABC802, ABC806 and Facit
DTC, DTC 2. The computers uses the Zilog Z80 processor and has a proprietary
operating system called ABC-DOS or UFD-DOS. The computers had a big market
share in Sweden before the age of the IBM PC. They were also sold in the other
nordic countries and to a lesser extent in the rest of Europe.


Program Invocation

The K.BAC is the start program and it chains to the main program KMAIN.BAC.
K.BAC is listable and can easily be changed, though this is not the case with
KMAIN.BAC because it is squeezed to reduce memory requirements.

The program can be started with the BASIC command "RUN K" or by using a menu
program. All the text in the program is in swedish and the program is
controlled with panels and function keys.


Parameters

K/KMAIN first requests some communication parameters. If you just press return
you will get the default values that can be seen on the screen. These default
values can easily be changed by altering the start program K.BAC.

The first request is for the communication speed. 300, 1200/75, 75/1200, 1200,
2400, 4800, 9600 and 19200 are supported. Split speed can only be used if
the computer is switched internally for it and if it doesn't have the oldest
version of the communication firmware.

The second request is for the parity. Space, mark, odd and even are supported.

The last request asks whether 8 or 7 data bits are to be used during Kermit
file transfer.

After this the main program is called and the menu is displayed.


The main menu:

Pf 1            Terminal mode
Pf 2            Local echo in terminal mode
SHIFT Pf 2      Remote echo in terminal mode
Pf 3            Receive files from remote Kermit
SHIFT Pf 3      Raw dumping of incoming text to a file
CTRL  Pf 3      Cancel dumping of incoming text to a file
Pf 4            Send files to remote Kermit
SHIFT Pf 4      Raw transmit of a file the remote system
Pf 5            Change file type for Kermit, text or binary
Pf 6            Change default device for Kermit files
Pf 7            Change block check type for Kermit, 1 or 2
Pf 8            End the program and disconnect the connection
SHIFT Pf 8      Hard copy to the printer. If keyboard ABC 99 or DTC 2 is used
                then the print function is the key that is labeled PRINT


Terminal Emulation

When you press Pf 1, your computer acts as a terminal connected to a
remote computer. The characters you type are sent out through the port,
and characters that arrive at the port are displayed on your screen, or
interpreted as a cursor address for the ADM3A terminal.


The Escape Key, Pf 1

The escape key, Pf 1, is used to regain the attention of K/KMAIN during
terminal emulation.  When you press the escape key, Pf 1, K/KMAIN displays
the menu.


Installation of K/KMAIN

If you already have Kermit on your ABC80X, you can use it to obtain new
versions of K/KMAIN by Kermit file transfer.

If you do not have Kermit and there is no one from whom you can borrow a
floppy disk to copy Kermit from, then try to download it on a IBM PC or
IBM AT.

The IBM PC/AT program ABCDISK or WABC can format a diskette for ABC800/
ABC802/ABC806 on an IBM PC or IBM AT with 5.25 " diskettes and copy files
from PCDOS/MSDOS to the ABC-diskette. ABCDISK and WABC are commercial software
that is sold in Sweden.


Program Organization


The programs are:


K.BAC           Startup program, semicompiled ABC-BASIC II code
KMAIN.BAC       Main program, semicompiled ABC-BASIC II code, squeezed


Sources:

K.BAS           Startup program, source in a text file
KMAIN.BAS       Main program, source in a text file
KERMPACK.ASM    Source for assembler packet routines
KERMCSUM.ASM    Source for assembler check sum routines

To change K.BAC, just load it, change it and save it. To change KMAIN, load
KMAIN.BAS, change it, save it as a ".BAC"-file and squeeze it with the utility
program SQUEZ.


Documentation:

KMAIN.DOC       This text
<<< kmain.hex >>>
8F006100DA444C03000036002202E1270404A71C8611860F8614DDB88601EDCEC6048016
00CEC51E800200CEC524800200CEC52A800200E1CEC630800A00CEC53E800200EDCEC644
801600E1CEC65E800A00CEC56C800200C77801CEC672807E01C72800CEC6F4812E0088C7
2700D115E38ABD06DEA9B50400CF00009E03B50A00CF00007F15BE0CDECF01006A0FB510
008A06DEA9B516009A7703C11600AFB888C11000DF8ABE09DDB52300DEB51000C11000E0
8ABE0ADEA9B52300DEB510009A2A01C11000E18AB888CF00004321B50A0094E0DDD21FB9
D083CF0100C315B9CC174D6F747461672066696C6572206D6564204B65726D6974C23000
9DB994D083CF01009C15B9CC1E4176627279742066696C7C766572667C72696E67656E20
6D656420504631B9E6D112CC29417662727974207C766572667C72696E67656E20617620
616C6C612066696C6572206D6564205046389DB98606C71400B82CC71E00B888DDB53A00
DDB54000DEA9CF01004706B54600C14600DEA98AC14C00DEA98A86BE0480F801C16C80C7
59008ABE0DDDC15200CF0200D71FB50A00C15800DEE2CF0300A22AB50A00C10A00DD8ABE
14CC094F6B2C206B6C617274CF0100C115B50A00C10A00DFA98ABE07C76400B51000C16C
80C759008ABE0EDEA9C15200CF02008C1FB50A00DDBE049BD3FEC11000E28AC14000DD8A
88BE0CCF0000E512BE05DEB51000C11000E48ABE10DDB540008606C71E00B888DEB51000
9A6501C11000E38AB888CF0000E71FB50A0094E0DDD21FB9D083CF01006714B9CC17537B
6E642066696C6572206D6564204B65726D69742020C230009DB994D083CF01004014B9CC
1E4176627279742066696C7C766572667C72696E67656E206D656420504631B9E6D112CC
29417662727974207C766572667C72696E67656E20617620616C6C612066696C6572206D
6564205046389DB98606C71400B82CC71E00B888DDB53A00DDB54000DDCF0100EC04B546
00C14600DD8AC14600DEA98A86C14C00DEA98A86BE04809700C16C80C759008ABE0DDDC1
5200CF0200761EB50A00C14600DD96BE1BCC00C15800DECC0123D10BC16500E2CF060024
1FB50A00802300C14600DF9FBE1CDECA016B0080C15800DECC0123D10BC16500E2CF0600
FF1EB50A00C10A00DD8ABE14CC094F6B2C206B6C617274CF01002A14B50A00C10A00DFA9
8ABE07C76400B51000C16C80C759008ABE0EDEA9C15200CF0200F51DB50A00DDBE049B98
FEC11000E58AC13A00DD8A88BE0CCF0000BC10BE05DEB51000C11000E68ABE08C15800AF
B55800C11000E78ABE09CF00001E03B63080C11000E88ABE12C16500DE8ABE07DFB56500
8A05DEB56500C11000DE8ABE09CF00008A02B50A00C11000C764008ABE0DDEB51000CF00
000008B50A00C11000E98ABE09DEA9B51600800C00C11000CF0100EB0BB510009B86FC92
8C4B02492246020085F001C20480CC008BBE5394E9D10CB9D081CF01006F12B9CC144475
206D7D73746520737461727461206D656420C230809DCC1D4B2C20646574746120677C72
73206E75206175746F6D617469736B74219DB9860BC23080CC014B9DB99F8600C70008CD
C67B00EDCDC68500C70001CDC68F00C71400B0EDCDCA016B00C71400B0E1CDCA019900DE
CDC6A900C79001CDC6B3008602C6BD00D12CB82CDDB82CE5B82CC70078B82CC70078D114
B82CDDB82CE5B88602C6C700D12CB82CDDB82CDEB82CDDB82CC7F500B82CDDB82CDEB886
02C6D100D12CB82CDDB82CDFB82CDDB82CC7FA00B82CDDB82CDDB88602C7DCFFD12DDF9C
B82CC6B300D12CB82CC6B300D12CD114B888E6B55200DFB5DB00E0B5E100DEB5650094E9
D10CB988DDDDD21FD086CF01005F119DCC2D4B2C204B45524D49542D70726F6772616D20
667C72204142433830302D73657269656E2C2076657273696F6E209DC25E809DB6E700E7
D119C740009CD12DE39CB5F100C7DCFFD12DD12DE793BD0DC7DCFFD12DC725009CB5F700
C7DCFFD12DE39CB5FD00C7DCFFD12DE19CB50301C12A80BE27EDD112CC1B417662727974
20696E6D61746E696E67656E206D65642053544F509DB630008A24EDD112CC1A41766272
797420696E6D61746E696E67656E206D6564205046319DB63000DEA9B52300DDB55800A0
DDB894D081CF01008C10B9CC1442656B6C616761722C2068697474617220656A20C23080
9DCC284B206F6368206B616E20647B72667C7220696E7465207374617274612070726F67
72616D6D6574219DB986088D8C6C00A126670000B601790994EDDDD21FB9D083CF010029
10B9CC314B65726D69743A207570706B6F70706C6164202D207465726D696E616C6D6F64
202D205046312074696C6C206D656E792EB99A1300C100FFC7B00490B888C100FFDE9CB5
00FF9BEAFFA0CF00002805B88D8CE4006A26DF0000B6017A05040094C71100DDD21FB9D0
83CF0100B80FB9CC195370656369666963657261207374616E64617264656E686574C230
009DB988CC00C71200DDDEDFE1D086C78A00D10C9DCF07000112CF0100990FCF01002A3D
B600FFC200FFC71B00D10C8BC200FFCC008B86BE06A0C23080B99A6200C200FFCF01008A
18DEA98AB888CC0F46656C616B74696720656E68657421CF01001610B50A00CC00C71200
DDDEDFE1D086C78A00D10C9DCF07009E11CF0100360FCF0100C73CB600FFC200FFC71B00
D10C8BC200FFCC008B86BE06A0C23080B99B9BFFA0C200FFB98D8C38049924330401F92A
B60469241A2BA2007909322B0A0088C15800BE12CC0A42696E7B7266696C6572B608FF8A
0FCC095465787466696C6572B608FFDDB502FF94E2DDD21FB9D083CF0100A20EB9CC0F53
74616E64617264656E6865743A20B9D086CF0100880EB9C23080B994E2C72700D21FB9D0
83CF0100740EB9CC0846696C7479703A20B9D086CF0100610EB9C208FFB994E4DDD21FB9
D083CF01004F0EB9CC0D416E67652066696C6E616D6E3AB93B88C11000E18ABE2A94C728
00D11DB9CC1F4C6F6B616C742066696C6E616D6E206265687C76657220656A20616E6765
73B988C11000E38AC77060D115DD8AC77060D115E58A86A788BE2F94C72800D11DB9CC24
4A6F6B65727465636B656E20222A22206F636820223F22206B616E20616E767B6E646173
B988CC00E5DDDEDFC74B00D086C78A00D10C9DCF07002F10CF0100C70DCF0100583BB604
FFC204FFC71B00D10C8BBE05A0DEA9B894E5DDD21FB9D086CF0100850DB9C204FFC74D00
C204FFD1109FD1129DB99ACD00C100FFDD8ADEC204FFCC013FD311DEC204FFCC012AD311
86A788B888C77060D115DD8DC77060D115E58D88BE42A0CC384A6F6B65727465636B656E
206B616E20656E6261727420616E767B6E64617320667C7220554644206F6368204C5558
2D4E455420444F5321CF0100E40DB888C204FFD110ED96BE1CA0CC12467C72206C7D6E67
742066696C6E616D6E21CF0100BF0DB888DECA016B00C204FFB388DECF0100BA16B54C00
C14C00DEA98ABE19A0CC0F46656C616B74696720656E68657421CF01008B0DB8A0DFA9B8
9B30FFC204FFCC008BBE0CDECA019900CC00B3A0DDB888C102FFDE9CB502FFDEC204FFCC
012CD311B51E019AC400C11E01B888C204FFC11E01DE9FD20DD110ED96BE1CA0CC12467C
72206C7D6E67742066696C6E616D6E21CF0100290DB888C102FFCA016B00C204FFC11E01
DE9FD20DB388C204FFC11E01DE9CD20EB604FFC102FFCF01000C16B54C00C14C00DEA98A
BE19A0CC0F46656C616B74696720656E68657421CF0100DD0CB888C102FFDE9CB502FFDE
C204FFCC012CD311B51E01C102FFC7140096BE2994CC1C4D61782032302066696C6E616D
6E206B616E206D6174617320696E21CF01009A0CB8A0DDB89B39FFC204FFD110ED96BE1C
A0CC12467C72206C7D6E67742066696C6E616D6E21CF0100700CB888C102FFCA016B00C2
04FFB388C102FFCF01006715B54C00C14C00DEA98ABE19A0CC0F46656C616B7469672065
6E68657421CF0100380CB888C100FFBE06A0C102FFB8855600DEB506FF9A4700C106FFC1
02FF99B888C106FFCA01990080CC008BBE0CC106FFCA019900C23080B38604C106FFCA01
990080C106FFCA016B00809DB9BBDFB88606DFB888C106FFDE9CB506FF9BB6FF9FA0C102
FFB89FA0CC0546696C3A20C106FFCA019900809DC106FFCA016B00809DCC182066696E6E
7320696E7465202D20617662727974657220219DCF0100990BB88D8CD000E126CB0000B6
01912B88C785FFD12DB500FF8602C785FFB82CDDB82CDDB894E9D10CB93B88C13201C700
788ABE09C27B00B6BD008A1DC27B00C13201C7FF779FD20EC27B00C13201C700789FD20D
9DB6BD008602C1F100B82CC13801B82CC13E01B888C1F700BD128602C1F700B82CC1F700
D115C7FD0088B888DDB51600CF00007801B50A009A2E00C11600AFB888C1FD00D12DDD8D
BE09CF0000D000B54B01E2D119C77F0096C13A0086BE09CF00002400B54B019BCFFF8602
C785FFB82CC100FFB82CC100FFD114B8A0DDB88D8C9600C12C910000B6017A01010088C1
3A00BE149423C15200B82CCF00009B08B93BA0DDB88A07860AC600FFBC88C12300AFBE19
94C200FFB93B88C14000BE0D9423C71E00B82CC200FFB93B88C200FFD10BC7C0008ABE09
DEA9B51600A0DDB888C10400AFBE21C200FFD10BC78200C12A8088C7D700C12A80AF8886
A78ABD08A0CF0000D50FB89423C15200B82CC200FFB93BA0DDB88D8C8D00912C880000B6
037901422D5000790988C7DCFFD12DE39CD12DB500FFC100FFC7500096BE07C75000B500
FF860A23C15200B82CC602FFBCB9C100FFB89A4000C11E80B888C202FFD110B504FF9A2D
00C104FFB8A2C202FFC104FFDED328B93DC202FFC104FFDED30FD10BC77F0088D10CB988
C104FFDE9FB504FF9BD0FF9BBDFFA0C202FFCF0100C500B88D8CBA00592CB50000B60339
2C192C790188C10400BE04816100C1F100DE9CD115B500FFC1F100D115B502FFC70078C1
00FFC75000A19CC102FF9CB504FF8603C73800B82CEBB82CC73900B82CC104FFD114B82C
C73800B82CECB82CC73900B82CC104FFB82CC73800B82CE7B82CC73900B82CC76800B8A0
DDB888C1F100DE9CD115B500FFC1F100D115B502FFC77900D12DE59CD12DC100FFC75000
A19CC102FF9CB504FFC104FFC7FF7F96BE0BC104FFC700089FB504FF8084FF8D8C530121
284E0101422DB603790A6A2D04009A2D010088CF000031FFB54B01DEB502FF9A2501C102
FFC200FFD11099B888C200FFC102FFD20ED10BD10CB604FFC204FFB606FFC204FFC71B00
D10C8BBE06DEA9B56601C204FFC71E00D10C8BBE08DDDDD21FB604FFC204FFE8D10C8BBE
14C1F100DE9CD115DE9FC1F100D115D21FB604FFC204FFE9D10C8BBE34C1F100D115C1F1
00DF9CD11593BE12C1F100DE9CD115DE9CDDD21FB604FF8A14C1F100DE9CD115C1F100D1
15DE9CD21FB604FFC204FFC71A00D10C8BBE07E9D10CB604FFC16601BE29C26C01D110E0
8ABE1694C26C01C204FF9DB988CC00B66C01DDB566018A0BC26C01C204FF9DB66C01C166
01C26C01D110DF8A88BE19C204FFCC013D8EBE10C26C01B604FFCC00B66C01DDB56601C1
6601AFBE1894C204FFB93B88C14000BE0C9423C71E00B8C206FFB93B88C102FFDE9CB502
FF9BD8FEA0CF0000FBFDB88D8C5A040123550401F12DB603D1227A060100322B0A0088DD
B51600C100FFDE8ABE32C2BD00B67B00C1F100DE9CD115B53E01C1F100D115B53801C104
00BE0FC77900D12DE59CD12DB532018A07C70078B53201C15800BE12CC0A42696E7B7266
696C6572B606FF8A0FCC095465787466696C6572B606FF94E9D10CB988CF0000D805B50A
009494D086CF01002406B9CC2A5066203120202020202020204B6F70706C612075707020
7465726D696E616C667C7262696E64656C7365B994D086CF0100EE05B9CC205066203220
202020202020204C6F6B616C7420656B6F206176207465636B656EB994D086CF0100C205
B9CC28534849465420506620322020496E67656E206C6F6B616C20656B6E696E67206176
207465636B656EB994D086CF01008E05B9CC305066203320202020202020204D6F747461
672066696C2066727D6E20767B72646461746F72206D6564204B65726D6974B994D086CF
01005205B9CC3353484946542050662033202044756D706120646174612074696C6C206C
6F6B616C2066696C20287574616E204B65726D697429B994D086CF01001305B9CC2A4354
524C20205066203320204176627279742064756D706E696E672074696C6C206C6F6B616C
2066696CB994D086CF0100DD04B9CC2E506620342020202020202020537B6E642066696C
2074696C6C20767B72646461746F72206D6564204B65726D6974B994D086CF0100A304B9
CC3253484946542050662034202044756D70612066696C2074696C6C20767B7264646174
6F7220287574616E204B65726D697429B994D086CF01006504B9CC315066203520202020
202020205B6E6472612066696C74797020667C72204B65726D69742C2020202020202020
6E75203D20B9D083CF01002904B9C206FFB994D086CF01001C04B9CC3150662036202020
20202020205B6E647261207374616E64617264656E68657420667C72204B65726D69742C
206E75203D20B9D083CF0100E003B9C23080B994D086CF0100D303B9CC30506620372020
2020202020205B6E64726120626C6F636B636865636B74797020667C72204B65726D6974
2C206E75203DB9D083CF01009803B9C16500B894D086CF01008B03B9CC3C506620382020
2020202020204176736C7574612070726F6772616D6D6574206F63682062727974207465
726D696E616C667C7262696E64656C73656EB994D086CF01004303B93B88C12A80DD8AC1
0400AF88A7BE1294CC0A53484946542050662038B93B8A1094CC0A5052494E5420202020
20B93B94CC3E202044756D70612062696C64736B7B726D656E2074696C6C20736B726976
61726520287B76656E20646972656B742069207465726D696E616C6D6F646529B99A7500
C102FFDD8AB894C71100DDD21FB9D083CF0100B902B9CC10567B6C6A2066756E6B74696F
6E3A2020B9E5D10CB93B88D083CF0100FD03B604FFDEC7C000C7C100C7D100C7C200C7D2
00C7C300C7E200C7D300C7C400C7C500C7C600C7C700D4DC0CC204FFD311B502FFC102FF
BE06A0C102FFB89B88FF8D8C910041268C0000B601522E100094C71100DDD21FB9D083CF
01003A02B9CC17537B6E64612066696C20287574616E204B65726D697429C230009DB994
D083CF01001302B9CC0846696C6E616D6E3AB93B88CC00C71200E6DEDFEDD086C78A00D1
0C9DCF07007004CF01000802CF0100992FB600FF8517008604C200FFB9BBC71400B888DE
A9B53A00A0C13A00B8A0DDB88D8C9100A1258C0000B601522E100094C71100DDD21FB9D0
83CF0100A801B9CC1744756D70612066696C20287574616E204B65726D697429C230009D
B994D083CF01008101B9CC0846696C6E616D6E3AB93B88CC00C71200E6DEDFEDD086C78A
00D10C9DCF0700DE03CF01007601CF0100072FB600FF8517008605C200FFB9BBC71E00B8
88DEA9B54000A0C14000B8A0DDB88D8C8D00FA2C880000B602712E8A2E500088C2D100D1
10BE04801F008561009723C71400B82CC6D100BC88C2D100C2D100D110DE9FD20DB6D100
9F88C7DCFFD12DE19CD12DDE9FB500FFC2D100D110C100FF99BD0EC2D100B602FFCC00B6
D1008A19C2D100C100FFD20DB602FFC2D100C100FFDE9CD20EB6D100A0C202FFB988DDB5
3A008606C71400B8A0CC00B98D8C440071223F00008604C20480B9BBC15200B894E9D10C
B93BA0DEA9B894CC1E4B616E20656A207C70706E61205632343A616E2120457272636F64
653A20B9D018B886088D8C5700112E52000094DEDDD21FB9D093CF01004B00B9C75000C7
7F00D213B93B94C71500DDD21FB9D093CF01003100B9C75000C77F00D213B93B94DDC716
00D21FB9C72400D112B994C2E700B994DFDDD21FB93BA0DDB88D8C1D007A06180001A22E
88C12480DD8ABE08A0C200FFB98A05A0CC00B98D8C59005A2A540001CA2EB6037A016400
7909790188DEB504FF9A3700C104FFC200FFD11099B888C200FFC104FFD20ED10BB506FF
C106FFC720008DBE0DC202FFC106FFD10C9DB602FFC104FFDE9CB504FF9BC6FFA0C202FF
B98D8C6700E12E620001CA2E94C71500DDD21FB9E4D10CB9D081D09D9DD0879DD0889DCF
01006AFFB9CC013CB9D08CD0899DCF01005BFFB9C200FFB9D088CF01004FFFB9CC013EB9
C74E00C200FFD1109FD112B9C78000D10CD09D9DD0879DCF01002EFFB93BA0DDB88D8C84
0081257F0001CA2EB6017A01010088C200FFCC1220204B76697474657261206D65642043
45209DCF010072FFB54B0194C71500C200FFD110C716009CD21FB93B88D081CF01004300
B602FF9A1700C202FFC71800D10C8EB888D081CF01002B00B602FF9BE6FF94C71500DDD2
1FB9D093CF0100B1FEB9C75000C77F00D213B9A0DDB88D8CC500322EC00001A22EB6037A
020100392C192C88C1F100DE9CD115B504FFC1F100D115B506FFCF0000BEF5B54B01C124
80DD8ABE1B94C200FFB9C70078C104FFC75000A19CC106FF9CD115D10CB93B94DDC73D00
D21FB9D086CF010044FEB9D029B99A1B00E2D119DD8AB894DDC73D00D21FB9D086CF0100
28FEB9D029B99BE2FF860AC602FFBC88C10400AFBE22C202FFD10BC78200C12A8088C7D7
00C12A80AF8886A78ABD09CF00006B04B54B018602C1F100B82CC106FFB82CC104FFB8A0
C202FFB98D8C5500212F500001512E9A4700DEA9B8850F008605C24480B9BBC100FFB8A0
DDB888CC26536B7269766172656E20656A20707D736C6167656E2C206B6F6E74726F6C6C
65726120212020CF01006EFEB54B019BB6FF8D8CD403922ACF0307CA2E392C192C592F89
2FA12FA22EB60AC22F6400D92F09302930790151300A0D0100120D01001A0D0A00410F88
C200FFB60EFFC106FFB512FFC108FFEC88B514FFE6CF01008E03B54B019A4803DEA9B894
C102FFC104FFD21FB9C20CFFCF01001DFDB9C20EFFB9C10AFFC20EFFD1109FC72000C73F
00C12480DD8DA7A19FD213B9C78B00D10CB9CC0120B93B88C112FFC10AFF96BE07C10AFF
B512FFC20EFFD110B510FF94C102FFC104FFC112FF9CDE9FD21FB93B88C20CFFC78A00D1
0C9DCF010020FED10BB516FFDEE0E1C71B00C7C000C78100D4D50CC116FFD10CD311BE08
A0C71B00D10CB988DEC78000C7A100C7A300C7B100C7B300C7AC00C7A400C77F00D4D80C
C116FFD10CD311B54B01C14B01BE22C7C100C7C400C7C600C7D400C7D600E5E6C7C200D4
D80CC14B01D20ED10BB516FFC116FFC718008ABE0ACC00B60EFFDEB512FFC108FFEC96C1
16FFEA8A86BE3BDEC7C000C7C100C7C400C7C500C7C600C7C700C7D400C7D600C7F000C7
D000EAD4DB0CC116FFD10CD311BE0FE6CF01004F02B54B01A0C20EFFB988C116FFE58ABE
27C112FFDE96BE0BC112FFDE9FB512FF8A16C108FFEC96BE0FE6CF01002102B54B01A0C2
0EFFB988C116FFE68ABE29C112FFC10AFF90BE0BC112FFDE9CB512FF8A16C108FFEC96BE
0FE6CF0100F101B54B01A0C20EFFB99A6D00C116FFC7C2008AB888C112FFC110FF99BE1D
C20EFFCC01209DC112FFDE9FD20DC20EFFC112FFDE9CD20E9DB60EFFC110FFC112FF90C1
10FFDD9688BE2BC112FFC110FF9FDE8ABE18C20EFFC110FFDE9FD20DB60EFFC112FFDE9F
B512FF8A09C110FFDE9CB512FFDDB516FF9B90FFC116FFC784008ABE1BC118FFDD8AA7B5
18FFE6C78000C118FFA19FCF01005801B54B01C114FFE08ABE0BC116FFC7DF0088B516FF
C116FFC7C3008AC112FFC110FF9988BE35C20EFFCC01209DC112FFDE9FD20DCC01209DC2
0EFFC112FFD20E9DB60EFFC20EFFD110C10AFF96BE0CC20EFFC10AFFD20DB60EFF83BE00
9A2600C120FFC114FF99B89CB706C61AFFBCB706C61CFFBCB706C61EFFBC88C120FFDE9C
B520FF9BD7FF9A8C00C116FFC21AFFD10B93C116FFC21CFFD10B9988A7DEC21EFFC116FF
D10CD311DD9686A7C112FFC10AFF9988B888C110FFC112FF90BE11C20EFFC112FFC110FF
9FD1129DB60EFFC20EFFC112FFDE9FD20DC116FFD10C9DC20EFFC112FFC118FFAFA79FD2
0E9DB60EFFC20EFFD110C10AFF96BE0CC20EFFC10AFFD20DB60EFFC112FFDE9CB512FFDD
B516FF9B71FF9BB5FC8EBB0233302C392C2720272C302C392C27202E2D272C2720272C7E
2C2720272C412C5D2C2720272C4A2C4A2C4A6A4E6E2C412C5D2C418D8C1E007130190001
790B88C12A80BE0C8603C72200B82CC100FFB8A0DDB88D8C78004124730000B6023A2C00
00790988E5CF0100A7FBB54B019423E5B82CE7E7E7D30CB988C70078B502FF9A4100C102
FFC7807F90B88602C600FFD12CB82CC75000B82CDDB82CC102FFB82CC102FFD114B82CC7
5000B82CDDB89423E5B8C200FFB988C102FFC750009CB502FF9BBCFF8606E5B8A0DDB88D
8C9200C1278D0000B602322E0100312E860AC600FFBC88C200FFD10BB502FFC102FFC7C0
008DC102FFC7C7008D88BE04A0DDB89494D081CF0100DEF8B9CC105C766572667C72696E
67656E20617620B93B88C102FFC7C0008ABE1D94CC15616B7475656C6C2066696C206176
62727974657321B9A0DEB894CC14616C6C612066696C657220617662727974657321B9A0
DFB88D8C6400A1305F0002E9301A268510008606C100FFB886A1C202FFB9A0DDB894EAE7
D20CB9D081CF01005CF8B9CC2F4B616E20656A20746120626F727420696E6B6F6D6D616E
64652066696C20707D206772756E642061762066656C3A20B9D018B8A0DDB88D8C560001
31510002E9301A26850A008606C100FFB8A0DDB894EAE7D20CB9D081CF0100FDF7B9CC0E
4B616E20656A2073747B6E676120B9C202FFB9CC1220707D206772756E64206176206665
6C3A20B9D018B8A0DDB88D8C3D00313138000271319931B60179048602E7D119C7FF019F
B82CC100FFB888C76660C102FFD217B504FFE7D119C7EB019FD115BE05A0DEA9B8A0DDB8
8D8CBD00BA31B80000B60179098352009A3400C100FFE190B89CB705C5C301BBB706C6C9
01BC88E7D119C7EB019FD115C1C30188A7BE06A0C2C901B988C100FFDE9CB500FF9BC9FF
A0CC156F6B7B6E6420747970206176206469736B66656C21B98E150013382C2027636865
636B73756D6D6166656C218E13001131362C2027647D6C6967206469736B218E1C001A36
342C2027736B6976616E20736B726976736B7964646164218E0000133132382C276C7563
6B616E207C7070656E218D8CB300C92AAE00015232B6038132D2200400C13288E7D119C7
7B009CD12DB502FFC200FFCC008BBE0AA0C76B60D12DD115B89A7900C102FFDD8DB888C1
02FFDF9CD115C102FFE09CD115C102FFE19CD115C73A00D4D40CB604FFC204FFCC04434F
4E3A8BC204FFCC044E554C3A8B86C204FFCC0350523A8B86C204FFCC045632343A8B86BE
06CC00B604FFC102FFE49CD115B506FFC204FFC200FF8BBE06A0C106FFB888C102FFD12D
B502FF9B84FFA0DEA9B88D8CA300512B9E00010133B6031933D2200400C92488C100FFCA
019900CC00B388DEC100FFCA016B0080CC013AD311B502FFC102FFDD8ABE04A0DDB888C1
00FFCA016B0080C102FFD20DB604FFC204FFCF010000FFB506FFC106FFDEA98AC106FFC7
1E008AC7F7FFD12DDD8A8886BE05A0DEA9B888C100FFCA019900C204FFB388C100FFCA01
6B00C100FFCA016B0080C102FFDE9CD20EB388C106FFB53E80A0C106FFB88D8C3D000133
3800014933B601791088C740FFD12DB502FF9A1D00C102FFDF9CD115C100FF8DC102FFDD
8D88B888C102FFD12DB502FF9BE0FFA0C102FFB88D8CA000E1249B000261334933B60101
3388C11E80BE04A0DDB888C102FFCF0100A8FFB504FFC104FFDD8ABE1E94CC1753746F70
702C2066696C656E20656A207C70706E616421B9860888C100FFBE288602C104FFC71200
9CD12DE79CB82CC104FFC712009CD12DE79CD115DE9FA7E186A7DE9CB88A288602C104FF
C712009CD12DE79CB82CC104FFC712009CD12DE79CD115DE9FA7C7FB0088A7DE9CB8A0DD
B88D8C2A00712325000094E9D10CB9DEDDD21FB9D093CF01007FF4B9C75000C77F00D213
B9C2E700B9A0DDB88D8C0B0AC925060A0692336925A933D13301343134B6177A1401007A
1301004A34640049346234650061347A34000179349134B934E1340135293551357935A1
35C935790EF13511367A0628007904790688DDB51CFFDDB51EFFEAB520FFE5B522FFC108
FFB524FFC77E00B52AFFC76400D112B610FFC610FFD12BB512FFC618FFD12BB51AFFC614
FFD12BB516FF8602C614FFD12CB82CC76400B82CDDB82CC116FFDE9CB82CC116FFDE9CD1
14B888CC0153B60EFFDEB538FFDDB52EFFDEC200FFCC012AD311DEC200FFCC013FD31186
BE08DEA9B532FF8A05DDB532FFC200FFB634FF9ADF00C132FFB888DECA01990080CF0100
221EB5E801C1E801DD90BE0480A2089AB900DEA9B89AAD00DEA9B888CF00005A1FB634FF
C14C00C14C00C726008D88BE04807D08C234FFCC008BBE048048089A4800C234FFEBDED3
0FCC01448BC200FFC234FFE9D20DCF0100A61CCF0200EF1BDD8A86B888CF0000111FB634
FFC14C00C14C00C726008D88BE04803408C234FFCC008BBE0480FF079BB5FFC234FFE9D2
0DCF01006B1CB634FF9494D086CF0100D8F2B9CC07537B6E6465723AB93B88DECA019900
80C234FFC1DB00DECF0400A31FBE049B50FFDDBE049B44FFDDBE049B1EFF9A9F00C132FF
AFB89494D086CF010097F2B9CC07537B6E6465723AB93B88C138FFCA01990080C138FFCA
016B0080C1DB00DECF04005B1FB54C00C138FFCA016B0080B634FFDDB50A02C14C00BE4F
A0CC0145CC0746656C206E7220C14C0082D11C9DCC1420756E646572207C70706E69676E
656E206176209DC234FF9DCC01219DDEC124FFC104FFC11CFFC11EFFC120FFC15200CF09
008919DF9FB888DDBE049B5EFF9A0D07DEA9B89A7E01C20EFFCC01538BB888C75E00CF01
00041AC122FFCF0100FC19C11CFFCF0100F419C11EFFCF0100DA19C120FFCF0100E419C1
06FFD4D60CC16C80D10C9DC108FF82D11C9DC12AFFD10C9DB614FFC12EFFCC0153C214FF
C112FFC104FFC11CFFC11EFFC120FFC10AFFC122FFDEC15200CF0C005711B60CFF9ADD00
C20CFFCC01598BB888C112FFDF9CD115CF01009819B52CFFC112FFE09CD115CF01008919
B522FFC112FFE19CD115CF01007A19B51CFFC112FFE29CD115CF01004719B51EFFC112FF
E39CD115CF01005C19B520FFC112FFE49CD115B526FFC112FFE59CD115B528FFC128FFC7
59008ABE14C16C80B528FFC128FFC759008ABE05DDB528FFC128FFC7210090C128FFC73E
0096C128FFC76000908886C128FFC77E009686BE05DDB528FFC108FFC112FFE69CD115C7
30009FA78DBE07DEB524FF8A07C108FFB524FFC112FFE79CD115C12AFF8DBE05DDB52AFF
DDBE049B20FFC12EFFDE9CA7C73F0088B52EFFC20CFFCC01598BBE09CC0146B60EFF8A07
C20CFFB60EFF9B7FFE9A5E00C20EFFCC01468BB888C12EFFCC0146C234FFC112FFC104FF
C11CFFC11EFFC120FFC10AFFC122FFC124FFC15200CF0C001710B60CFFDECC024E59C20C
FFD311BE09CC0144B60EFF8A07C20CFFB60EFFC12EFFDE9CA7C73F0088B52EFF9B9FFF9A
7801C20EFFCC01448BB888C11AFFC102FFC1DB00CF03006112B530FF9A4501C130FFDD8A
B88602C116FFB82CDEB89A3600C116FFC12CFFC124FF9FC11AFFC106FFC128FFC12AFFCF
0600B412C130FFDD8A88B888C11AFFC102FFC1DB00CF03001812B530FF9BC7FFC14102DE
9CB5410294C1F100DE9CD115C72600D21FB93B94B8CC052323232323B9C14102B83B8602
C614FFD12CE19CB82CC116FFD115DE9FB82CDDB888C12EFFCC0144C214FFC112FFC104FF
C11CFFC11EFFC120FFC10AFFC122FFC124FFC15200CF0C001B0FB60CFFC12EFFDE9CA7C7
3F0088B52EFFC112FFDE9CD115DFC124FF9C96C112FFDF9CD115C758008A88BE05DEB530
FFC112FFDE9CD115DFC124FF9C96C112FFDF9CD115C75A008A88BE11DEB530FFDDB532FF
C14600DE9CB538FFE2D119BE2DCF0000D6F5B536FFC136FFDE8ABE07DEB530FF8A18C136
FFDF8ABE11DEB530FFDDB532FFC14600DE9CB538FFC20CFFCC01598BBE049BB8FEC130FF
BE09CC015AB60EFF8A07C20CFFB60EFF9B85FE9AEA00C20EFFCC015A8BB888C130FFC726
008AC130FFC722008A86BE08CC00B614FF8A07CC0144B614FFC1DB00C234FFCF020050F6
B50A00C12EFFCC015AC214FFC112FFC104FFC11CFFC11EFFC120FFC10AFFC122FFC124FF
C15200CF0C000D0EB60CFFC20CFFCC01598BBE09CC0142B60EFF8A07C20CFFB60EFFC12E
FFDE9CA7C73F0088B52EFFC130FFC722008DC130FFC726008D88C130FFDE8D88BE4DA0CC
0145CC0746656C206E7220C130FF82D11C9DCC1020766964206C7B736E696E6720617620
9DC234FF9DCC01219DC12EFFC124FFC104FFC11CFFC11EFFC120FFC15200CF09003115DF
9FB89B13FF9A2202C20EFFCC01428BB89AE300C132FFB888CF00009A19B634FFC14C00C1
4C00C726008D88BE0480E6029AA100C234FFCC008EB89A4500C234FFEBDED30FCC01448B
C200FFC234FFE9D20DCF0100E716CF02003016DD8A86B888CF00005219B634FFC14C00C1
4C00C726008D88BE04809E02C234FFCC008EBE049BB8FF9A4600C234FFCC008EB888C234
FFE9D20DCF0100A416B634FF9494D086CF010011EDB9CC07537B6E6465723AB93B88DECA
01990080C234FFC1DB00DECF0400DC19B536FFDDBE049BB7FFC14C00BE049B5CFFC234FF
CC008EC14C00DD8A88BE09CC0146B60EFF8A07CC0143B60EFFDDBE049B1AFFC138FFDE9C
B538FF9AAC00C132FFAFC138FFC146009988B89494D086CF01009EECB9CC07537B6E6465
723AB93B88C138FFCA01990080C138FFCA016B0080C1DB00DECF04006219B54C00C138FF
CA016B0080B634FFCC0146B60EFFC14C00BE52A0CC0145CC0746656C206E7220C14C0082
D11C9DCC1520756E646572207C70706E696E676E656E206176209DC234FF9DCC01219DC1
2EFFC124FFC104FFC11CFFC11EFFC120FFC15200CF09008B13DF9FB888DDBE049B51FFC1
32FFAFC138FFC146009688BE06CC00B634FF9A6200C234FFCC008BCF0000721286B888C1
2EFFCC0142CC00C112FFC104FFC11CFFC11EFFC120FFC10AFFC122FFC124FFC15200CF0C
008A0BB60CFFC12EFFDE9CA7C73F0088B52EFFC20CFFCC01598BBE09CC0143B60EFF8A07
C20CFFB60EFFDDBE049B9BFF9BDBFDC20EFFCC01658BBE05A0DFA9B888C20EFFCC01458B
BE1DA0C210FFE0C112FFDE9CD115DF9FC124FF9FD30FCF01003BECDF9FB888C20EFFCC01
438BBE08DDB54C00A0DDB888DECC065346445A4243C20EFFD311DD8ABE3EA0CC0145CC10
4F4B5B4E442070616B65747479703A20C20EFF9DCC032121219DC12EFFC124FFC104FFC1
1CFFC11EFFC120FFC15200CF09007412DF9FB89BF0F8A0C200FFCC1B2067657220656A20
74727B666620707D206E7D676F6E2066696C219DCF0100ADEBDF9FB8A0CC0C4B616E2065
6A206C7B736120DECA019900809DCC022C209DCF000025F39DCF010084EBDF9FB8A0CC01
45CC0C4B616E20656A206C7B736120DECA019900809DCC022C209DCF0000F9F29DDEC124
FFC104FFC11CFFC11EFFC120FFC15200CF0900DF11DF9FB88D8CAA085125A508036925A9
333134B617790E7A1301007A1401004A346400493462343200422DFE00412DC935013591
34B934E134513579352935A135DA391400F2390C00093A79063A3A0400790488C75E00B5
16FFC72800B518FFDDB51AFFDDB51CFFEAB51EFFDDB520FFDEB524FFDDB526FFDDB52CFF
C60CFFD12BB50EFF8602C60CFFD12CE19CB82CC76400B82CDDB888C612FFD12BB514FFDD
B506FFDDB52EFFCC0120B60AFF9AFE07DEA9B888C10EFFC106FFC102FFC118FFC104FFC1
24FFC11AFFC11CFFC11EFFC15200CF0A00E107B608FF9A7600C12CFFB888C1E100C230FF
C22AFF9DCF0200F6F0B50A00A0CC0145CC1B46656C2076696420736B7269766E696E6720
707D2066696C656E20C230FF9DC22AFF9DCC092E2046656C206E72209DC12CFF82D11C9D
CC012E9DC106FFC124FFC102FFC11AFFC11CFFC11EFFC15200CF09009210DF9FB89B87FF
9A1602C208FFCC01538BB888C10EFFD115C106FF8DC10EFFD115C106FFDE9FA7C73F0088
A78D88A7DECC022053C20AFFD311DD8A86BE31A0CC0145CC0D53656E642D696E6974203F
3F3FC10EFFD115DEC102FFC11AFFC11CFFC11EFFC15200CF09002810DF9FB89AA901C208
FFCC01538BB888C10EFFDF9CD115CF0100BE10B516FFC10EFFE09CD115CF0100AF10B518
FFC10EFFE19CD115CF0100A010B51AFFC10EFFE29CD115CF01006D10B51CFFC10EFFE39C
D115CF01008210B51EFFC10EFFE49CD115B520FFC10EFFDE9CD115E590BE07DDB522FF8A
1AC10EFFE59CD115B522FFC122FFC759008ABE07C16C80B522FFC122FFC7210090C122FF
C73E0096C122FFC76000908886C122FFC77E009686BD05DDB522FFC10EFFDE9CD115E690
BE07DEB524FF8A1AC10EFFE69CD115C730009FB524FFC124FFDF8DBE05DEB524FFC10EFF
DE9CD115E790BE07DDB526FF8A30C10EFFE79CD115B526FFC126FFC7210090C126FFC73E
0096C126FFC76000908886C126FFC77E009686BE05DDB526FFC74B00CF0100A20FE5CF01
009C0FDDCF0100960FDDCF01007E0FEACF01008A0FC120FFC122FFC74E00C122FFDD8A88
86D4D70CC124FF82D11C9DB610FFC126FFBD0FC210FFC126FFD10C9DB610FF8A0BC210FF
CC01209DB610FFCC0159C210FFC10EFFD115DEC102FFC11AFFC11CFFC11EFFC15200CF09
00910EB532FFC10EFFD115DE9CA7C73F0088A7B506FFDDBE049B54FEDDBE049BE7FD9A95
02C208FFCC01468BB888DECC03535A46C20AFFD311DD8ABE31A0CC0145CC0D46696C2D68
75767564203F3F3FC106FFC124FFC102FFC11AFFC11CFFC11EFFC15200CF09002A0EDF9F
B888C20AFFCC01468BC228FFC20CFFE0C10EFFDE9CD115DF9FC124FF9FD30FCF01003E14
8E88BE37A0CC0145CC1354767D2066696C2D6875767564656E203F3F3FC106FFC124FFC1
02FFC11AFFC11CFFC11EFFC15200CF0900CD0DDF9FB89ADD01C208FFCC01468BB888C20C
FFE0C10EFFDE9CD115DF9FC124FF9FD30FCF0100E013B628FFCC00B62AFFDEB532FF9AA8
00C132FFC228FFD11099B89A7700C22AFFD110E590DEC22AFFCC012ED311DD8A88A7C22A
FFD110DEC22AFFCC012ED3119FA7E09086B888DECC273031323334353637383941424344
45464748494A4B4C4D4E4F505152535455565758595A5D5B5CC228FFC132FFDED30FD311
DD8DBE11C22AFFC228FFC132FFDED30F9DB62AFFDDBE049B86FFC228FFC132FFDED30FCC
012E8BBE0BC22AFFCC012E9DB62AFFC132FFDE9CB532FF9B55FFCC00B630FFC12EFFDE9C
B52EFFC12EFFC7140099BE2CC12EFFC1460099C12EFFCA016B0080CC008E88BE17C12EFF
CA016B0080B62AFFC12EFFCA01990080B630FF9494D086CF01002AE5B9CC074D6F747461
723AB93B88DDB5B702DDB50A02C230FFC22AFFC1E100DFCF0400F011B54C00C14C00BE50
A0CC0145CC0D4B616E20656A20736B61706120C230FF9DC22AFF9DCC092C2066656C206E
72209DC14C0082D11C9DCC01219DC106FFC124FFC102FFC11AFFC11CFFC11EFFC15200CF
09002C0CDF9FB888C208FFCC01468BBE31CC0159CC00C106FFC124FFC102FFC11AFFC11C
FFC11EFFC15200CF0900000CB532FFC106FFDE9CA7C73F0088A7B506FFDDBE049B20FE86
02C114FFB82CDEB888DDBE049B68FD9AF100C208FFCC01448BB888CC0159C2A900C106FF
C124FFC102FFC11AFFC11CFFC11EFFC15200CF0900AD0BB532FFC106FFDE9CA7C73F0088
A7B506FF8602C10EFFB82CDFB888C2A900CC008BBE27C14102DE9CB5410294C1F100DE9C
D115C72600D21FB93B94B8CC052323232323B9C14102B83B9A4800C10EFFC10EFFDE9CD1
15DE9FC124FF9FC114FFC7FD00C120FFC122FFC126FFCF0700D205DD99B888C114FFC100
FFC1E100CF03003705B54C00C14C00BE09C14C00B52CFF8A049BB5FFCC00B6A900E2D119
BE25CF00007DEAB50A00C10A00DE8ABE09CC0158B6A9008A0EC10A00DF8ABE07CC015AB6
A900DDBE049B0CFF9AD900C208FFCC015A8BB888C114FFD115DE96BE1DC114FFC100FFC1
E100CF0300CD04B54C00C14C00BE07C14C00B52CFF9AA200C208FFCC015A8BC12CFFDD8A
88B888C10EFFDE9CD115E0C124FF9C93C20CFFE0C10EFFDE9CD115DF9FC124FF9FD30FCC
01448B88A7C2A900CC01588B86C2A900CC015A8B86BE15C1E100C230FFC22AFF9DCF0200
61EAB532FF8A13C1E100C230FFC22AFF9DCF0200B2EAB532FFCC0159CC00C106FFC124FF
C102FFC11AFFC11CFFC11EFFC15200CF0900240AB532FFC106FFDE9CA7C73F0088A7B506
FFDDBE049B5BFFDDBE049B24FF9A4600C208FFCC01428BB888CC0159CC00C106FFC124FF
C102FFC11AFFC11CFFC11EFFC15200CF0900DC09B532FFC106FFDE9CA7C73F0088A7B506
FFDDB54C00A0DDB888DDBE049BB7FFC208FFCC01658BBE05A0DFA9B888C208FFCC01458B
BE1DA0C20CFFE0C10EFFDE9CD115DF9FC124FF9FD30FCF0100F3E2DF9FB888DECC055346
445A42C208FFD311DD8ABE3EA0CC0145CC104F4B5B4E442070616B65747479703A20C208
FF9DCC032121219DC106FFC124FFC102FFC11AFFC11CFFC11EFFC15200CF09003E09DF9F
B888C208FFB60AFF9BFFF78D8C7C01523A77010A412D790EA9330135493B793B9134B934
E134E930B603A93B7A140100790488C108FFB514FF9A0101C114FFB888C100FFC104FFC1
06FFC10AFFC112FFCF05000405B616FFC216FFCC01458BBE06A0CC0145B988DECC022054
C216FFD311DD8AC100FFD115C102FF8AA788BE06A0C216FFB988C100FFD115C102FFDE9C
A7C73F0088A78ABE48CC0145CC204A6167206861722074617070617420626F7274206574
742070616B6574212121C102FFC10AFFC104FFC10CFFC10EFFC110FFC112FFCF09006408
B518FFA0CC0165B988C216FFCC01448BBE27C10A02DE9CB50A0294C1F100DE9CD115C732
00D21FB93B94B8CC052323232323B9C10A02B83B88C114FFDE9FB514FFCC014ECC00C102
FFC10AFFC104FFC10CFFC10EFFC110FFC112FFCF09000408B518FF9BFCFECC0145CC2341
766272797465722120467C72206D7D6E6761206F6D737B6E646E696E676172212121C102
FFC10AFFC104FFC10CFFC10EFFC110FFC112FFCF0900BC07B518FFA0CC0165B98D8CB601
7A38B1010C790E2A3C422D413CA9339134B934E13431340135793BE930B603793C79047A
13010088C110FFB518FF9A3701C118FFB888C116FFCF01002F03B51AFFC202FFC204FFC1
00FFC114FFC108FFC10AFFC10CFFC10EFFC116FFCF09004F07B51AFFC106FFC108FFC112
FFC114FFC116FFCF05005503B61CFFC21CFFCC01458BBE06A0CC0145B988C202FFCC0144
8BC118FFC110FF8D88BE27C10A02DE9CB50A0294C1F100DE9CD115C73200D21FB93B94B8
CC052323232323B9C10A02B83B88C21CFFCC014E8BC100FF88BE19C106FFD115DE9FA7C7
3F0088A7C100FF8ABE06A0CC0159B988C21CFFCC01598BBE11C106FFD115C100FF8ABE06
A0CC0159B988DECC0420544E59C21CFFD311DD8ABE4CCC0145CC1A417662727974657221
204F4B5B4E442070616B65747479703A20C21CFF9DCC032121219DC100FFC114FFC108FF
C10AFFC10CFFC10EFFC116FFCF09005B06B51AFFA0CC0165B988C118FFDE9FB518FF9BC6
FECC0145CC2341766272797465722120467C72206D7D6E6761206F6D737B6E646E696E67
6172212121C100FFC114FFC108FFC10AFFC10CFFC10EFFC116FFCF09000506B51AFFA0CC
0165B98D8C8800F93A830003412D6925E930B6027A020000B13C8602C606FFD12CB82CC7
FD00B82CDDB82CC100FFDE9CB82CC100FFDE9CD114B82CC7FD00B82CDDB888C100FFD115
DE9FB508FF853900C102FFBE13860E23C104FFB8C206FFC108FFD20DB98A169423C104FF
B8C206FFC108FFD20DCF0100ED07B93B8602C100FFB82CDEB8A0DDB8A0D018B88D8C5000
B93A4B0007413C193D593D913D51357935A135B6017A01090088C100FFC100FFD114C102
FFC104FFC104FFD114C106FFC108FFC10AFFC10CFFD4D90CB60EFFA0C67280D12BC60EFF
D12BD217B88D8C8500F938800003412D6925E930B6017A0200008602C606FFD12CB82CC7
FD00B82CDDB82CC100FFDF9CB82CC100FFDF9CD114B82CC7FD00B82CDDB8853700C102FF
BE13860A23C104FFB8C606FFBCB9C7FD00B88A0B9723C104FFB8C606FFBC8602C100FFB8
2CDFB82CC206FFD110DF9CB8A0DDB88602C100FFB82CDFB82CDDB8A0D018B88D8C500041
394B0006412DD13D013E51357935A135B6017A01090088C100FFC100FFD114C102FFC104
FFC104FFD114DDC106FFC108FFC10AFFD4D90CB60CFFA0C67280D12BC7A3009CC60CFFD1
2BD217B88D8C5100913C4C0001E930B60279047A04320088CF00004200B502FF9A2F00C1
02FFB888C102FFC7320096BE07C73200B502FF860A23C100FFB8C604FFBCB9C102FFB888
CF00001200B502FF9BCEFFA0DDB88D8C0D00293E080000C1FD00D12DB88C1F02EA3B1A02
05412DA9330135793BE930B60579047A0200007A140100791079018602C60CFFD12CB82C
C76400B82CDDB82CC100FFB82CC100FFD114B82CC76400B82CDDB888CF0000AEFFDD8ABE
10C104FFCF01004702BE06A0CC0154B988DEC108FFCF0200BF01D10BB50AFFDEE0E1C71A
00D30CC10AFFD10CD311BE06A0CC0154B99A4800C10AFFC102FF8DB888CF000065FFDD8A
BE10C104FFCF0100FE01BE06A0CC0154B988DEC108FFCF02007601D10BB50AFFDEE0E1C7
1A00D30CC10AFFD10CD311BE06A0CC0154B99BB5FFCF000025FFDD8ABE10C104FFCF0100
BE01BE06A0CC0154B988DEC108FFCF02003601D10BCF0100A303B512FFDEB510FF9A7500
C110FFDF9FC112FF90B888CF0000E7FEB50AFFC10AFFDD8ABE1AC104FFCF01007A01BE08
A0CC0154B98A09CF0000C7FEB50AFFC10AFFC112FFC110FF9FDF9C96BE0DC112FFC110FF
9FDF9CB50AFFA2C20CFFC110FFC10AFFD328B93DC10AFFC108FFCF0200BE00B988C110FF
C10AFF9CB510FF9B88FFC20CFFDFDED30FCC01538EBE39C20CFFC112FFC106FF9FDE9CC1
06FFD30FC112FFCF0100EB02D10CC20CFFC112FFC106FF9FD20D9DC106FFCF0200F8028E
BE06A0CC0120B988C20CFFDFDED30FCC01538BBE2DC20CFFC112FFDED30FC112FFCF0100
AD02D10CC20CFFC112FFDE9FD20D9DDECF0200BE028EBE06A0CC0120B988C20CFFDFDED3
0FB60EFF8602C100FFB82CC100FFD115CF01008802B82CC112FFB8A0C20EFFB98D8C7600
DA3E7100027901E930B6027A0264007909860A23C102FFB8C604FFBCB9C100FFB888C16C
80C726008DC11E80DD8A86BD06A0C204FFB988C100FFB506FF9A2D00C106FFB8A2C204FF
C106FFDED328B93DC204FFC106FFDED30FD10BC77F0088D10CB988C106FFDE9FB506FF9B
D0FFA0C204FFB98D8C4F00993E4A00017914B601780488C100FF82D68846A0B402FF9A29
00C002FFD5008CCF00003BFDDD8A88B888C002FFD5819EB402FFCF00002B00BE08D500B4
02FF8A049BD4FFA0C002FFD50089B88D8C0D00013F080000C10301D12DB88C1D00B93918
00008603C74100B82CEDB8A0C74100D116E588A7DD8AB88D8CCF00713FCA0004422D9134
B934E930B6027910790488C102FFB508FFCF0000BAFFB50AFF9A4100C108FFCF0000BAFF
DD8A88B888C10AFFC108FF96BE07C108FFB50AFF860E23C106FFB8C10AFFC104FFD213B9
88C108FFC10AFF9FB508FFCF000078FFB50AFF9BBCFFDEB508FF9A5A00C108FFC200FFD1
1099CF00006BFFDD8A88B888C10AFFC200FFD110C108FF9FDE9C96BE0FC200FFD110C108
FF9FDE9CB50AFF860E23C106FFB8C200FFC108FFC10AFFD30FB988C108FFC10AFF9CB508
FFCF000016FFB50AFF9BA3FFA0DDB88D8C8C00E9378700097A14422D790E793BA9339134
B934E134E930B60279047A02640088C108FFC202FFD110C106FF9CDF9CCF01007100C104
FFCF01006900D30CC200FF9DC202FF9DB614FFC214FFC214FFDFD20EC106FFCF02006F00
9DC10EFFD10C9DC10AFFC10CFFC110FFCF0400C7FEB512FFC200FFCC01458BBE0DA0C202
FFCF0100E8D8B88A04A0DDB88D8C110059380C00017914C100FFC7400087B88C11003138
0C00017914C100FFC720009CB88C1100C1380C00017914C100FFC720009FB88C9700CA21
9200027A027903B601B13F88C102FFDE8DC102FFDF8D88BD2994CC22456A20696D706C65
6D656E74657261642074797020617620636865636B73756D6D61B9860888C6F481D12BC7
18FFD12DD12DD217B504FFC102FFDE8ABE1BA0C104FFC104FFC7000388D1149CC73F0088
CF01006EFFD10CB9A0C104FFD114C73F0088CF01005CFFC104FFC73F0088CF010050FFD2
0CB98D8CB100E136AC000292338A2E88C202FFD110DD8ABE1BC200FFD110DD8AC200FFCC
012A8B86BD07A0DEA9B88A04A0DDB888C200FFD110DD8ABD04A0DDB888C200FFD10BC202
FFD10B8ABE14A0C200FFDFD20EC202FFDFD20ECF0200ABFFB888C200FFD10BC73F008ABD
14A0C200FFDFD20EC202FFDFD20ECF02008CFFB888C200FFD10BC72A008DBD04A0DDB888
C200FFDFD20EC202FFCF02006DFFBE05A0DEA9B8A0C200FFC202FFDFD20ECF020058FFB8
8D8C59000A37540001F239B6027A060C00791088C200FFB602FFDEC202FFCC0120D311B5
04FF9A2B00C104FFB888C202FFC104FFDE9FD20DC202FFC104FFDE9CD20E9DB602FFDEC2
02FFCC0120D311B504FF9BD2FFA0C202FFB98D8CC800CA3CC30001CA2EB6027909712E85
AC00C200FFB6D100DDB502FF9A9800C102FFC2D100D11090B888C102FFDE9CB502FFC1B7
02DE9CB5B702C2D100C102FFDED30FD10BE78ABE05DDB5B7029A6400C2D100C102FFDED3
0FD10BE68AB888C1B702E5D22EB504FFE5C104FF9FB504FFC104FFE58ABE05DDB504FFC2
D100C102FFDE9FD20DDEC104FF9CD1129DC2D100C102FFDE9CD20E9DB6D100C1B702C104
FF9CB5B702C102FFC104FF9CB502FFDDBE049B99FF9B65FFA0C2D100B988D018B54C00A0
CC00B98D8C560161365101013A3AB606D23F0400014021404240100082401000790988C2
00FFB602FFC202FFCC008BBE07C23080B602FFC13E80DD93C13E80E09988BE0FC76B60D1
2DD115C13E809CB53E80C13E80E993C13E80EC9988BE07E3B504FF8A05EBB504FFC13E80
C71E008ABE18C7F9FFD115B53E80DEA9B506FFC7F7FFD12DDE9FB504FFC13E80C104FFCF
02000BDDB54C00C14C00BE05A0DEA9B888C2C700C7F000EDD30FB608FFC104FFDE9CB504
FFEDD112B68500C106FFBE0AEDDDD213B60AFF8A18C13E80C104FFCF0200CBDCB54C00C1
4C00BE05A0DEA9B888C106FFAFBE15C2C700C7F000EDD30FB60AFFC104FFDE9CB504FF9A
3700C10CFFED90B888C10CFFDE9CB50CFFA2C28500C10CFFDED328B93DC208FFC10CFFDE
D30FD10BC20AFFC10CFFDED30FD10B9FD10CB99BC6FFCC00B68F00C13E80E993C13E80EC
9988C106FFAF88BE09C104FFE59CB504FFA0C104FFB88D8CE800A236E30000B6027A0E0E
00790185CC009A8A00C28500D110B89A4200C28F00D110B888C28F00E2E5D30FCB012E9D
C28F00EAE0D30F9DB600FFC28F00C71100D20EB68F00C200FFD10BC7300093C200FFD10B
C75F009088BE04804D009BBBFFC28500D10BB502FFC28500DFD20EB68500C102FFBE18C1
3E80C1E801CF0200C1DBB54C00C14C00BE05A0DEA9B888C2C700B68F00C1E801DE9CB5E8
019B73FFC72600B54C00A0CC00B988C200FFE7E0D30FCC035566648BBE13C200FFE5D20D
CC062020202020449DB600FFA0C200FFC72700C200FFD1109FD1129DB988D018B54C00A0
CC00B98D8CC9006937C40004D23F1A26C140D940B6013A3A040088DDB54102DDB50A0285
4600C200FFCC008BBE09C23080B608FF8A07C200FFB608FF8604C208FFC202FF9DB9BBC1
04FFB894E6D11DB9C208FFC202FF9DB9C71E00D11DB9CC0650616B65743AB93BA0DDB888
C106FFDF8DBE0BD018B54C00A0C14C00B888D018C715008DBE0BD018B54C00A0C14C00B8
8530008605C208FFC202FF9DB9BBC104FFB894E6D11DB9C208FFC202FF9DB9C71E00D11D
B9CC0650616B65743AB93BA0DDB888D018B54C00A0C14C00B88D8C0000222A7D0001CA2E
B603C22F6400F940314188C200FFCC008BBE05A0CC00B988DEB504FF9A5300C104FFC200
FFD11099B888C200FFC104FFDED30FD10BB506FFC106FFC75F0096C106FFC77F009088BE
0BC106FFC75F0088B506FFC106FFC7800090BE0DC202FFC106FFD10C9DB602FFC104FFDE
9CB504FF9BAAFFA0C202FFB98D870100000000FFFBFF048002001E800100248001002A80
0100308002003E800100448002005E8002006C80010072800200F4810200040001000A00
0100100001001600010023000100300002003A00010040000100460001004C0001005200
010058000100650001006B0006007B000200850002008F00020099000600A9000200B300
0200BD000200C7000200D1000200DB000100E1000100E7000200F1000100F7000100FD00
0100030101001E01010032010100380101003E0101004B010100660101006C010200C301
0100C9010200E80101000A02010041020100B702010002FFC106FFD10C9DB602FFC104FF
DE9CB504FF9BAAFFA0C202FFB98D870100000000FFFBFF048002001E800100248001002A
800100308002003E800100448002005E8002006C80010072800200F4810200040001000A
000100100001001600010023000100300002003A00010040000100460001004C000100