This file, LUX80.JAR, is a "join archive".  It contains the following
files for Luxor ABC80 Kermit:

kerm.asm
kerm.doc
kerm.hex
kerm.inf
kerm.txt
kerm1.asm
kerm2.asm
kerm3.asm
kerm4.asm
kerm5.asm
kerm6.asm
kerm7.asm
kermasm.inf
kermdump.bas
kermdump.inf
kermquit.bas

See kerm.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 <<< kerm.doc >>>.  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)---------------------------
<<< kerm.asm >>>
; KERM.ASM
; Anders Franz`n <5258>
; Stockholm 1987-08-24

         TITLE Kerm
         OBJ  2
         SAVE DR1:KERM.BAC

PGM      EQU  193:0     Adress f|r pgm
STACK    EQU  249:0     SP f|r KERM
SPACE    EQU  34:74     Space i ROM

BUFF1    EQU  244:0     Terminaldata
BUFF2    EQU  250:0     Tangenttryck
BUFF3    EQU  249:0     Mottagen packet
BUFF4    EQU  249:128   Packet att s{nda
BUFF5    EQU  247:0     Data i packet
BUFF6    EQU  251:0     Kommando Kermit
BUFF7    EQU  251:50    Radbuffer filer
BUFFTED  EQU  254:64

         INCLUDE KERM1
         INCLUDE KERM2
         INCLUDE KERM3
         INCLUDE KERM4
         INCLUDE KERM5
         INCLUDE KERM6
         INCLUDE KERM7

SLUT     END  START
<<< kerm.doc >>>
Luxor ABC80 KERMIT


Program:        Anders Franz`n

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

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

                Today, Nokia has taken over Luxor and Nokia sells IBM
                compatible PC:s. The club has today 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:       All routines in assembler Zilog Z80

Documentation:  Anders Franz`n

Version:        1.0

Date:           Sept 24, 1987


KERM ABC80 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
  Filename collision avoidance:      Yes
  Can time out:                      Yes
  8th-bit prefixing:                 Yes
  Repeat count prefixing:            Yes
  Alternate block checks:            Yes
  Terminal emulation:                No
  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


KERM is a program that implements the Kermit file transfer protocol
for the Luxor ABC80. The computer use the Zilog Z80 processor and
has a proprietary operating system called ABC-DOS. The computer 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 KERM.BAC is the main program. Start the program with the BASIC
command "RUN KERM". All the text in the program is in english.




Terminal Emulation

The characters you type are sent out the port, and characters that
arrive at the port are displayed on your screen.


Installation of KERM

If you already have Kermit on your ABC80, you can use it to obtain new
versions of KERM 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 ABC80
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 program is:

KERM.BAC        Main program


Sources:

KERM.ASM
KERM1.ASM
KERM2.ASM
KERM3.ASM
KERM4.ASM
KERM5.ASM
KERM6.ASM
KERM7.ASM

Documentation:

KERM.DOC	This text
KERM.INF	Short infofile in swedish
KERM.TXT        Big documentation in swedish
KERMASM.INF	Info about the sources in swedish

Utility programs:

KERMDUMP.BAS	Source for a program that dumps the session on file
KERMDUMP.INF	Info in swedish
KERMQUIT.BAS	Source for a sample program for exits back to Kermit
<<< kerm.hex >>>
[encoded data, 36208 characters]
7A65202457635F630A66690A66690A6578697420300A
<<< kerm.inf >>>
KERM.INF
Info om programmet KERM
Anders Franz`n <5258>
Stockholm september 1987

KERM {r ett Kermitprogram f|r ABC80. Kermit {r
ett protokoll med vars hj{lp man kan |verf|ra
filer felfritt mellan tv} datorer.

KERM {r avsett f|r ABC80 med minst 16K RAM,
flexskiva (fungerar utan flexskiva men d} endast
som terminal), bildsk{rmen kan vara antingen
40 eller 80 tecken bred och det spelar ingen
roll vilken checksumma datorn har. Som en extra
finess kan KERM finnas i datorns minne samtidigt
som texteditorn TED (kr{ver 32K RAM).

F|ljande filer ing}r f|r tillf{llet i KERM-paketet:

KERM    .BAC  Program f|r start av KERM.
KERM    .TXT  Stor bruksanvisning. F}r plats i TED
              om man har 32K RAM.
KERM    .INF  Denna informationsfil.
KERMQUIT.BAS  Ett exempel p} hur man fr}n BASIC
              kan }teranropa KERM. Prova att i
              KERM skriva kommandot QUIT KERMQUIT.

Buggfix av: J|rgen Westman <5074>    1990-01-09

Felet i KERM best}r av att KERM inte kan k|ra mot en kermit
som inte klarar av REPT.

Det {r faktiskt tv} fel i KERM7.

Ist{llet f|r SPACE s{nds NUL som respons vid mottagning p}
ett init packet som inte har n}got REPT tecken.

Vid s{ndning s} v{ljs aldrig REPT bort. S} om mottagaren inte
vill ha REPT s} s{nder KERM NUL som ett REPT tecken.

mvh JW

K{llkodfilen KERM7.ASM {r uppdaterad med J|rgens patch och s} {ven
sj{lva programmet KERM.BAC. /Bo Kullmar 900113


<<< kerm.txt >>>
 +------------------------------------+
 !                                    !
 !      KERM                          !
 !      Kermit f|r ABC80              !
 !      bruksanvisning                !
 !                                    !
 !      Stockholm september 1987      !
 !      Anders Franz`n <5258>         !
 !                                    !
 +------------------------------------+


INNEH]LL
========

1  Allm{nt

2  Uppstart

3  Kommandon
    3.1  CLOSE
    3.2  CONNECT
    3.3  DELETE <DRx:> filnamn
    3.4  DIR <,S> <DRx:> <filnamn>
    3.5  DUMP <DRx:> filnamn
    3.6  EXIT
    3.7  HELP
    3.8  LOG <DRx:> filnamn
    3.9  QUIT <<DRx:> filnamn>
    3.10  RECEIVE <<DRx:> filnamn>
    3.11  SAVE <DRx:> filnamn
    3.12  SEND <DRx:> filnamn-1 <,filnamn-2>
    3.13  SET <parameter <v{rde>>
    3.14  SHOW
    3.15  TED
    3.16  TYPE <DRx:> filnamn

4  Parametrar
    4.1  ACCESS
    4.2  BUAD
    4.3  CHECK
    4.4  DEBUG
    4.5  DUPLEX
    4.6  EOL
    4.7  ESCAPE
    4.8  FILE
    4.9  FLOW
    4.10  LENGTH
    4.11  MARKER
    4.12  NEWLINE
    4.13  NUMPAD
    4.14  PADCHAR
    4.15  PARITY
    4.16  PAUSE
    4.17  QBIN
    4.18  QCTL
    4.19  REPT
    4.20  RETRY
    4.21  TEDESC
    4.22  TEDMODE
    4.23  TIMEOUT

5  Tips vid problem

6  Diverse |vrigt



1  ALLM[NT
==========

KERM   {r  ett  Kermit-program  f|r  ABC80.  Kermit  {r  ett
fil|verf|ringsprotokoll som ser till att dina filer |verf|rs
korrekt.  Filerna  delas  upp  i  mindre enheter, paket, som
checksummekontrolleras. Om n}got fel finns  i  ett  |verf|rt
paket  sker  oms{ndning.  Man kan skicka filer till och fr}n
ABC80 med KERM.

Programmet  kr{ver  flexskiva  f|r  att  Kermit  skall kunna
anv{ndas. Om man bara har kassettbandspelare kan man  endast
anv{nda  KERM  som  en  terminal. Datorn beh|ver endast vara
utrustad  med  16K  RAM,  det  spelar  ingen   roll   vilken
checksumma datorn har och 80-teckentillsats kan anv{ndas.

Ett Kermit-program  best}r  av tv} delar. Kermitdelen tolkar
kommandon som man matar in fr}n tangentbordet, det kan t  ex
vara  en beg{ran om fil|verf|ring. Med terminaldelen kopplar
man upp sig mot en annan dator och kan kommunicera genom att
skriva  och l{sa p} bildsk{rmen. Med ett tangenttryck hoppar
man mellan de tv} delarna.




2  UPPSTART
===========

Programmet KERM kan startas p} tre olika s{tt:

o  RUN KERM
   N{r programmet k|rs hamnar man direkt i Kermitdelen.

o  RUN parmprogram
   M|jlighet finns att skapa ett eller flera parmprogram som
   inneh}ller  parameterinst{llningar.  I  st{llet  f|r  att
   beh|va st{lla alla parametrar i Kermiten varje  g}ng  man
   anv{nder  programmet  kan man st{lla dem en g}ng f|r alla
   och sedan spara dessa i ett parmprogram. Genom att skriva
   RUN <parmprogram> st{lls parametrarna som man sj{lv vill,
   parmprogrammet g|r sedan CHAIN till KERM. Man  kan  skapa
   hur m}nga parmprogram man vill.

o  CHAIN "program"
   Om man sist i programmet KERM l{gger till  en  programrad
   som g|r CHAIN till  valfritt  BASIC-program  kommer  b}de
   KERM och det andra programmet att lagras i datorns minne.
   Det {r m|jligt att hoppa mellan de tv} programmen,  t  ex
   kan man g|ra CHAIN till texteditorn TED som d} kommer att
   f} ett extra val p} TED-menyn, n{mligen  m|jligheten  att
   hoppa till Kermit. J{mf|r kommandot QUIT (kapitel 3.9).




3  KOMMANDON
============

N{r man befinner sig  i  Kermitdelen  anv{nder  man  sig  av
kommandon   f|r   att  utr{tta det man vill. Nedan f|ljer en
beskrivning av samtliga kommandon i bokstavsordning.

I den syntax som anv{nds f|r att beskriva kommandon  betyder
hakarna  frivilliga  till{gg.  Filnamn  kan ibland anges med
wildcards d{r fr}getecken ers{tter  ett  godtyckligt  tecken
och stj{rna ett eller flera tecken. Exempelvis betyder *.BAC
alla BAC-filer. Eftersom wildcard-rutinen l{ser  biblioteket
p}  flexskivan  {r det inte s{kert att den fungerar p} vissa
typer  av  DOS,  i  s}  fall  m}ste  man  ange  filnamn utan
wildcards varvid l{sning av skivan sker p} vanligt s{tt.

N{r  man  matar  in kommandon i Kermitdelen beh|ver man inte
skriva hela kommandot.  Det  r{cker  oftast  med  de  f|rsta
bokst{verna, i annat fall s{ger KERM ifr}n.


3.1  CLOSE
----------

Avbryter  loggning  eller  dumpning och |ppen fil st{ngs. Se
kommandona DUMP och LOG.


3.2  CONNECT
------------

Medf|r   hopp   till  terminaldelen.  F|r att }terv{nda till
Kermitdelen m}ste man trycka p} den sk escape-tangenten  som
normalt {r CTRL-[, det {r m|jligt att med SET-kommandot byta
escape-tangent. F|r att underl{tta  f|r  anv{ndaren  beh|ver
man  i KERM inte anv{nda kommandot  CONNECT  f|r  att  hoppa
till terminaldelen, det g}r lika bra med escape-tangenten.


3.3  DELETE <DRx:> filnamn
--------------------------

Tar  bort  en  eller  flera filer fr}n flexskiva. F|r att ta
bort flera filer m}ste wildcards anv{ndas, men d} {r det bra
att  k{nna  till  att om inte drive anges s} sker s|kning p}
flera skivor.


3.4  DIR <,S> <DRx:> <filnamn>
------------------------------

DIR visar  vad  som  finns  p}  flexskivorna.  Storleken  p}
filerna  visas om man skriver DIR,S. Urval kan ske genom att
ange specifik drive och/eller filnamn med wildcards.


3.5  DUMP <DRx:> filnamn
------------------------

Med DUMP kan man s{nda iv{g textfiler precis som om man hade
skrivit  dem  f|r  hand  i terminaldelen. N{r man skrivit in
kommandot |ppnas filen och n{r man hoppar till terminaldelen
b|rjar  texten  i  filen  att  s{ndas  iv{g. F|r att avbryta
dumpningen innan hela filen s{nts iv{g }terv{nder  man  till
Kermitdelen  och  anv{nder  kommandot  CLOSE.  Observera att
wildcards inte kan anv{ndas i filnamnet.


3.6  EXIT
---------

F|r att l{mna programmet KERM och ta bort det helt ur minnet
anv{ndes kommandot EXIT som har samma effekt som  ett  tryck
p} datorns reset-knapp. Eventuell |ppen fil st{ngs.


3.7  HELP
---------

Med  kommandot  HELP  visas  alla  kommandon  som  finns  p}
bildsk{rmen.


3.8  LOG <DRx:> filnamn
-----------------------

Om man vill logga allt som tas emot i  terminaldelen  p}  en
fil anv{nder man kommandot LOG. N{r man skrivit in kommandot
|ppnas filen och n{r man hoppar  till  terminaldelen  b|rjar
allt  som  tas  emot  fr}n  modemet  samt allt som skrivs p}
tangentbordet att loggas. F|r att avbryta loggningen  hoppar
man  till Kermitdelen och anv{nder kommandot CLOSE. Om filen
blir s} stor att skivan inte r{cker till s{nds ett XOFF  (om
XON/XOFF anv{nds) och ett felmeddelande visas. Observera att
wildcards inte kan anv{ndas i filnamnet.


3.9  QUIT <<DRx:> filnamn>
--------------------------

Med  kommandot  QUIT l{mnar man KERM och hamnar i BASIC. N{r
man {r i BASIC kan man k|ra BASIC-program precis som vanligt
och n{r som helst }terv{nda till KERM med
  Z=CALL(PEEK(65063)+256*PEEK(65064)+16)
N{r man }terv{nder till KERM ligger BASIC-programmet kvar  i
minnet.  Om  det finns ett BASIC-program i minnet kommer det
att exekveras n{r man hoppar till BASIC  med  QUIT.  Om  ett
programnamn  anges efter QUIT kommer KERM att ladda in detta
program fr}n flexskiva och d{refter  hoppa  till  BASIC  och
exekvera programmet (j{mf|r RUN i BASIC).  Innan  hopp  sker
till BASIC kommer alla |ppna filer att st{ngas.

Genom att skriva QUIT TED kan man,  om  det  inte  redan  {r
gjort,  starta  upp  texteditorn TED. Fr}n TED-menyn kan man
sedan }terv{nda till KERM. Om man {r i BASIC och TED finns i
minnet kan man hoppa till TED som vanligt med "RUN TED:".

M|jligheten att ha BASIC-program i minnet samtidigt som KERM
g|r datorn mycket flexibel. Med QUIT kan man t{nka  sig  att
man  anl{nder  till  ett  menysystem d{r valfria rutiner kan
ligga. Med ett val p} denna egna meny kan man t ex v{lja att
hoppa tillbaka till KERM. Notera att om man har TED i minnet
eller bara har 16K RAM i datorn s}  kan  man  inte  utnyttja
BASIC-en till n}gra st|rre utsv{vningar.


3.10  RECEIVE <<DRx:> filnamn>
------------------------------

Med RECEIVE tar man emot filer  som  s{nds  fr}n  ett  annat
Kermit-program.  Innan  man  anv{nder  kommandot m}ste man i
terminaldelen tala om f|r den  andra  datorn,  den  som  man
kommunicerar  med,  att  den skall s{nda en fil. Hur man g|r
det framg}r av dokumentation i v{rddatorn. D{refter, n{r den
andra  datorns  Kermit-program b|rjar s{nda, hoppar man till
Kermitdelen  och  anv{nder  kommandot  RECEIVE.

Kermit-protokollet |verf|r namnet p} filerna som s{nds  till
mottagande  dator och om man vill lagra en fil hemma hos sig
under ett annat namn {n det den har i v{rddatorn  anger  man
detta  filnamn efter RECEIVE. Ibland {r det m|jligt att fr}n
v{rddatorn beg{ra |verf|ring av flera filer p}  en  g}ng,  i
s} fall skall man inte ange n}got filnamn efter RECEIVE.

Man kan avbryta fil|verf|ringen p} ett snyggt s{tt genom att
trycka CTRL-X eller CTRL-Z. F|r att  avbryta  s{ndningen  av
en  fil  som  |verf|rs  trycker man CTRL-X varvid v{rddatorn
forts{tter med n{sta fil om man beg{rt att den skall  skicka
fler  filer  p}  en g}ng. Med CTRL-Z avbryter man s{ndningen
dels av den fil som |verf|rs samt, om man beg{rt  |verf|ring
av  flera  filer,  {ven dessa. D} man avbryter fil|verf|ring
tas den fil som inte hunnit  bli  helt  |verf|rd  bort  fr}n
flexskivan.   F|r   att  avbryta  fil|verf|ringen med CTRL-X
eller CTRL-Z kr{vs dock att v{rddatorn  till}ter  detta,  om
intte s} avbryts |verf|ringen p} ett brutalare s{tt.

Det  absolut  h}rdaste  s{ttet att avbryta RECEIVE p} {r att
trycka p} escape-tangenten men d} f}r inte  v{rddatorn  reda
p}  att |verf|ringen avbrutits. Ofta kan man dock avbryta en
v{rddators f|rs|k att s{nda p} ett lika h}rt s{tt,  om  inte
s}  slutar  v{rddatorn  att  s{nda automatiskt efter en viss
tid.


3.11  SAVE <DRx:> filnamn
-------------------------

Med SAVE sparar man de inst{llningar man gjort med kommandot
SET  p} flexskiva. Ett BASIC-program skapas som, n{r det vid
ett annat tillf{lle exekveras,  g|r  CHAIN  till  programmet
KERM  varvid alla sparade inst{llningar }ter tr{der i kraft.
Genom att ange valfritt filnamn  (utan  wildcards)  kan  man
spara  olika  parameterints{llningar i olika filer och p} s}
vis snabbt starta KERM f|rberedd f|r  kommunikation  med  en
viss v{rddator.


3.12  SEND <DRx:> filnamn-1 <,filnamn-2>
----------------------------------------

F|r  att  s{nda filer till ett annat Kermit-program anv{nder
man SEND. Innan man anv{nder kommandot i  den  egna  datorn,
m}sste  man  i  terminaldelen tala om f|r v{rddatorn att man
vill s{nda en fil. Dokumentation i andra datorn ber{ttar hur
man  g}r  till  v{ga  med  detta.  D{refter  hoppar man till
Kermitdelen och sl}r in kommandot SEND f|ljt av ett  filnamn
som  talar  om vilken fil man vill s{nda. Det {r m|jligt att
s{nda fler filer p} en g}ng  om  man  anv{nder  wildcards  i
filnamnet.

Filnamn-2  (beh|ver  inte  anges) talar om under vilket namn
som  v{rddatorn  skall  lagra  filen.  Observera  att  ingen
syntaxkontroll  sker  av  detta andra filnamn s} d{r kan man
skriva vad som  helst  under  f|ruts{ttning  att  v{rddatorn
f|rst}r  detta.  Om  man  anv{nder  wildcards  i  det f|rsta
filnamnet, och allts} beg{r |verf|ring av fler filer,  skall
man inte ange filnamn-2.

Det  {r  m|jligt  att  avbryta fil|verf|ringen p} ett snyggt
s{tt med CTRL-X  och  CTRL-Z  precis  som  d}  man  anv{nder
kommandot  RECEIVE.  CTRL-X  avbryter s{nding av aktuell fil
och forts{tter med n{sta medan  CTRL-Z  avbryter  s{ndningen
av  alla filer. Avbrutna filer tas bort hos v{rddatorn under
f|ruts{ttning att dess Kermitprogram klarar av  att  hantera
avbrott med CTRL-X och CTRL-Z.

Liksom  d}  man  anv{nder RECEIVE kan man avbryta s{ndningen
med escape-tangenten men d} f}r inte v{rddatorn reda p}  att
|verf|ringen  slutat  och  den v{ntar p} mer data {nda tills
den f}r timeout.


3.13  SET <parameter <v{rde>>
-----------------------------

Med  kommandot SET f|r{ndrar man v{rdet hos en parameter. Om
man  bara  sl}r  SET  utan  n}gon  parameter   listas   alla
tillg{ngliga  parametrar  och  om  man  sl}r SET f|ljt av en
parameter men utan n}got v{rde visas alla v{rden  som  denna
parameter   kan  erh}lla.  I  kapitel  fyra  redovisas  alla
parametrar som finns.


3.14  SHOW
----------

F|r  att  se  den  aktuella inst{llningen p} alla parametrar
anv{nder man kommandot SHOW. Om man  vill  {ndra  v{rdet  p}
n}gon parameter anv{nds kommandot SET.


3.15  TED
---------

Om texteditorn TED finns i minnet samtidigt  som  programmet
KERM  kan  man  hoppa  fr}n  Kermitdelen  till TED-menyn med
kommandot TED.  F|r  att  hoppa  tillbaka  till  Kermitdelen
v{ljer   man  KERMIT  p} TED-menyn. Notera att man i st{llet
f|r att anv{nda kommandot TED kan  anv{nda  den  s}  kallade
TEDESC-tangenten (se kapitel 4.21).

Om  n}gon fil {r |ppen st{ngs denna, ett meddelande visas p}
sk{rmen och inget hopp sker till TED. Man f}r d}  skriva  in
kommandot  TED  en  andra g}ng om man fortfarande vill hoppa
till TED. Detta beror p} att TED  och  KERM  anv{nder  samma
bufferareor  f|r  l{sning/skrivning  av filer. Kommandot TED
ers{tts allts} med CLOSE  (kapitel  3.1)  om  n}gon  fil  {r
|ppen.


3.16  TYPE <DRx:> filnamn
-------------------------

Om  man  vill  titta  p}  inneh}llet  i en fil som ligger p}
flexskiva kan man anv{nda kommandot TYPE. Det {r m|jligt att
titta  p}  b}de textfiler och BAC-filer. Om man vill g|ra en
paus i listningen trycker man p}  valfri  tangent,  f|r  att
forts{tta  trycker  man  en andra g}ng p} en tangent. Om man
vill stega en rad i taget anv{nder man mellanslagstangenten.
F|r  att  avbryta listning trycker man CTRL-C. Wildcards kan
inte anv{ndas i filnamnet.




4  PARAMETRAR
=============

Det  finns  ett  antal  parametrar som p}verkar det s{tt som
KERM arbetar p}.  Samtliga  parametrar  kan  st{llas  in  p}
|nskat v{rde med kommandot SET (kapitel 3.13).


4.1  ACCESS
-----------

Anger hur KERM skall bete sig n{r en fil tas emot med Kermit
och en fil med samma namn redan finns p} flexskiva.

PREPARE      Skriv |ver den gamla filen.
KILL         Ta bort den gamla filen, skapa d{refter den
             nya.
STOP         Avbryt |verf|ringen av filen.


4.2  BAUD
---------

\verf|ringshastighet  via  V24-porten.  F|ljande  v{rden  {r
till}tna (mottagningshastighet anges f|rst):
300/300, 1200/75, 75/1200, 1200/1200, 2400/2400, 4800/4800


4.3  CHECK
----------

Typ  av  checksummeber{kning som skall ske vid |verf|ring av
filer  med  KERM.  Varje  paket  som  s{nds  f|rses  med  en
checksumma  som  kan  vara  en  eller tv} bytes l}ng. Det {r
st|rre sannolikhet att den checksumma som bara best}r av  en
byte  feltolkas  men  den  g}r  }  andra  sidan (f|rsumbart)
snabbare att |verf|ra. Om v{rddatorns Kermit inte klarar  av
den  tv} bytes l}nga checksumman kommer enbytechecksumma att
anv{ndas.


4.4  DEBUG
----------

Med debug-funktionen kan man se vad de olika paket som s{nds
verkligen inneh}ller. F|ljande v{rden finns:

OFF     Debug-funktionen avslagen.
PACKET  Visa alla paket och deras inneh}ll p} bildsk{rmen.
DUMP    Logga alla tecken som s{nds och tas emot i datorns
        RAM-minne med start p} adress 135:0 (34560). Med
        l{mpligt BASIC-program kan man sedan PEEK-a fram
        tecknen. Notera att detta bara kan g|ras om man
        har 32K RAM-minne. OBS! Metoden kan vara farlig
        eftersom ev inneh}ll i minnet f|rst|rs. Om t ex
        TED finns i minnet f|rst|rs programmet TED!


4.5  DUPLEX
-----------

Anger om de tecken som s{nds fr}n terminaldelen i KERM skall
visas p} bildsk{rmen eller ej. Normalt skall  de  inte  g|ra
det, ist{llet  ekar  v{rddatorn  tillbaka  alla  tecken  som
s{nds. Till}tna v{rden {r:

HALF   Iv{gs{ndna tecken visas p} bildsk{rmen.
FULL   V{rddatorn s{nder tillbaka alla iv{gs{nda tecken.


4.6  EOL
--------

EOL {r det tecken som avslutar varje paket i Kermit. Normalt
{r detta 13  (CR)  men   kan   {ndras.  Till}tna  v{rden  {r
ASCII-koder 0-127.


4.7  ESCAPE
-----------

Den   tangent   som   man  anv{nder  f|r  att  hoppa  mellan
Kermitdelen och terminaldelen i KERM kallas  escape-tangent.
Normalv{rdet {r 27 (CTRL-[) men kan {ndras. Till}tna  v{rden
{r ASCII-koder 0-127.


4.8  FILE
---------

Kermit  skiljer  p}  textfiler  och  bin{rfiler.   Textfiler
{r filer som endast inneh}ller tecken med ASCII-v{rden 0-127
(en fil som kan l{sas in i en  editor  eller  ordbehandlare)
medan en bin{rfil kan  inneh}lla  bytes  med  v{rden  0-255.
Innan man s{nder en fil med Kermit m}ste man tala om vad f|r
typ  av  fil  det  r|r  sig  om,  detta  g|r  man i KERM med
FILE-parametern. F|rljande v{rden finns:

TEXT     Textfil
BIN      Bin{rfil (t ex .BAC och .ABS)
AUTO     KERM k{nner automatiskt av vilken filtyp det {r.
         Detta fungerar p} text-, BAC- och ABS- filer.


4.9  FLOW
---------

FLOW  anger  om  fl|deskontroll  skall  anv{ndas eller inte.
Till}tna v{rden {r:

OFF       Ingen fl|deskontroll.
XON/XOFF  Fl|deskontroll med XON och XOFF.


4.10  LENGTH
------------

Med LENGTH kan man {ndra den maximala paketl{ngden som  KERM
skall  ta  emot.  Vid d}lig f|rbindelse kan man minska detta
v{rde f|r att p} s} vis f} s{krare |verf|ring  n{r  man  tar
emot   filer.   Observera  att  man  inte  kan  p}verka  den
maximala paketl{ngd som KERM skall anv{nda n{r filer  s{nds,
det beror p} att denna maxl{ngd best{ms av den andra datorns
Kermit. Till}tna v{rden p} LENGTH {r 20-94.


4.11  MARKER
------------

MARKER {r det tecken  som  inleder  varje  paket  i  Kermit.
Normalt  {r detta 1 (CTRL-A) men kan {ndras. Till}tna v{rden
{r ASCII-koder 0-127.


4.12  NEWLINE
-------------

Med NEWLINE kan man, n{r man befinner sig  i  terminaldelen,
f}  mottaget  LF att tolkas som CRLF samt att CRLF s{nds n{r
man trycker p} RETURN. Detta anv{nds vid  kommunikation  med
vissa v{rddatorer. Till}tna v{rden {r ON och OFF.


4.13  NUMPAD
------------

Somliga v{rddatorer kr{ver att ett paket ska f|reg}s av  ett
antal  PAD-tecken.  Antalet  PAD-tecken anges med parametern
NUMPAD. Normalt {r NUMPAD satt till noll, till}tna v{rden {r
0-127.


4.14  PADCHAR
-------------

Anger  vilket PAD-tecken som skall f|reg} ett paket. Normalt
anv{nds ej n}gra PAD-tecken, se parametern NUMPAD.  Till}tna
v{rden {r ASCII-koder 0-127.


4.15  PARITY
------------

PARITY anger den paritet som skall anv{ndas vid |verf|ringen
b}de  i  Kermitdelen  och  i  terminaldelen. F|ljande v{rden
finns:

NONE     Paritetsbiten anv{nds inte. Detta {r att
         rekommendera vid |verf|ring av bin{rfiler med
         Kermit (under f|ruts{ttning att v{rddatorn klarar
         PARITY NONE). Paritetsbiten kan anv{ndas f|r data
         och |verf|ringen g}r d{rf|r 50% snabbare.
SPACE    Paritetsbiten s{tts alltid till noll.
MARK     Paritetsbiten s{tts alltid till ett.
EVEN     Antalet ettor i varje byte som s{nds {r alltid
         j{mt.
ODD      Antalet nollor i varje byte som s{nds {r alltid
         udda.


4.16  PAUSE
-----------

Om  v{rddatorn  har  sv}rt  att  h}lla  samma  h|ga  tempo i
|verf|ringen som KERM kan man med hj{lp av parametern  PAUSE
f}  en  paus innan KERM s{nder iv{g ett paket. Pausens l{ngd
anges i tiondels sekunder och till}tna v{rden {r 0-127.  Ett
v{rde p} 10 medf|r allts} en sekunds paus.


4.17  QBIN
----------

Om man inte anv{nder PARITY NONE kan inte paritetsbiten i en
byte anv{ndas f|r att f|ra |ver data.  Om  man  skall  s{nda
bin{rfiler  tvingas man d} i Kermit att dela upp en byte som
{r st|rre {n 127 i tv} bytes. Man kan s{ga att man  placerar
ett shifttecken f|re den byte som skall s{ndas liksom man p}
ett tangentbord anv{nder shifttangenten  f|r  att  f}  flera
funktioner   p}  en  tangent.  Det  tecken  som  skall  vara
"shifttecken" kallas QBIN. Normalt {r detta 38 (&)  men  kan
{ndras, till}tna v{rden {r ASCII-koder 0-127.


4.18  QCTL
----------

Kontrolltecken  som  ing}r  i  en  fil  som man s{nder m}ste
"prefixas" med ett tecken f|re (j{mf|r  QBIN!).  Det  tecken
som   placeras   f|re  kontrolltecken  kallas QBIN. Till}tna
v{rden {r ASCII-koder 0-127, normalv{rde 34 (#).


4.19  REPT
----------

Om det i en fil som |verf|rs med Kermit f|rekommer  fler  {n
tre  tecken  i  f|ljd som {r exakt lika s} packas dessa ihop
till tre bytes. Det tecken som  inleder  denna  trio  kallas
REPT  och {r normalt 126 (~). Tiil}tna v{rden {r ASCII-koder
0-127.


4.20  RETRY
-----------

Om ett paket inte |verf|rs korrekt till}ter Kermit  att  ett
antal  omf|rs|k  g|rs. Antalet omf|rs|k s{tts med parametern
RETRY (normalt fem). Till}tna v{rden {r 1-30.


4.21  TEDESC
------------

Om texteditorn TED finns i minnet samtidigt som KERM kan man
med en tangenttryckning l{mna antingen  terminaldelen  eller
Kermit-delen  f|r  att  hoppa till TED. N{r man p} TED-menyn
v{ljer att }terg} kommer man att  hoppa  till  terminaldelen
eller  Kermit-delen  beroende  p}  varifr}n  man utgick. Den
tangent som skall anv{ndas f|r att hoppa till TED kan v{ljas
med  parametern  TEDESC.  Om  ingen TEDESC |nskas kan v{rdet
s{ttas till samma som ESCAPE. Till}tna v{rden {r ASCII-koder
0-127.  Notera att ett tryck p} TEDESC-tangenten {r detsamma
som  att  anv{nda  kommandot  TED  om  man  befinner  sig  i
Kermit-delen.


4.22  TEDMODE
-------------

Om man har texteditorn TED i minnet samtidigt som  KERM  kan
man,  n{r man {r i terminaldelen, logga konversationen i TED
eller s{nda iv{g text som finns i  TED.  Parametern  TEDMODE
kan f} f|ljande v{rden:

OFF     Varken s{nd eller logga.
SEND    S{nd iv{g texten som finns i TED. S{ndningen b|rjar
        inte f|rr{n man hoppat till terminaldelen.
SAVE    Sparar konversationen i terminaldelen i TED.


4.23  TIMEOUT
-------------

N{r filer s{nds med Kermit }ker paket fram och tillbaka.  Om
ett  paket  inte  anl{nder  ligger KERM och v{ntar ett visst
antal sekunder innan timeout sker. Om antalet  omf|rs|k  (se
parametern  RETRY)  fortfarande {r st|rre {n noll l{gger sig
KERM }ter i v{nteloop.  N{r  alla  omf|rs|k  gjorts  avbryts
fil|verf|ringen.  Timeout-tiden,  som  anges i sekunder, kan
st{llas. KERM's normalv{rde {r 10 sekunder vilket  {r  lagom
f|r  att hinna skriva och l{sa p} flexskiva. Till}tna v{rden
{r 1-30 sekunder.




5  TIPS VID PROBLEM
===================

Data|verf|ring {r en komplicerad process och kan  misslyckas
av olika anledningar. H{r f|ljer n}gra tips:

Om  telef|rbindelsen  {r  d}lig kan man prova att minska den
maximala paketl{ngden, p} s} vis |kar sannolikheten att  man
f}r  |ver  ett paket till den andra sidan. Checksummetyp tv}
b|r anv{ndas. Maximala antalet omf|rs|k som  ska  g|ras  kan
|kas.  Anv{nd  s}  l}g  hastighet som m|jligt, helst 300/300
baud.

F}r man TIMEOUT pga att v{rddatorn v{grar acceptera mottagna
paket  skall man |ka PAUSE-parameterns v{rde. Det {r vanligt
att  v{rddatorn   f|rs|ker   rensa   sin   mottagningsbuffer
samtidigt  som  KERM  b|rjar s{nda, en liten paus f|re varje
paket som s{nds ger v{rddatorn tid  att  f|rbereda  sig  f|r
mottagning. KERM {r mycket snabb, ofta alltf|r snabb!

Har man problem med att  |verf|ra  bin{rfiler  anv{nder  man
troligen  felaktig  paritet. Se till att KERM anv{nder samma
paritet som v{rddatorn. F|r att kunna anv{nda  paritet  NONE
kr{vs att v{rddatorn klarar av detta.

En  l}ngsam  flexskiveenhet  kan medf|ra att v{rddatorn ofta
r}kar ut f|r TIMEOUT. \ka d} v{rdet p} parametern TIMEOUT.




6  DIVERSE \VRIGT
=================

Under mottagning och s{ndning  av  filer  med  Kermit  visas
information om |verf|ringen p} bildsk{rmen. Det som visas {r
filnamn,  antal  oms{ndningar  (hur  m}nga  paket  som  inte
|verf|rts  korrekt  och  d{rf|r  m}ste  s{ndas  om), antalet
|verf|rda paket, antalet bytes data,  antal  block  i  filen
(blocksiffran  {r tyv{rr ej exakt) samt status. F|ljande kan
}terfinnas i statusf{ltet:

   (nn)     Filstorlek vid SEND, endast om wildcards anges.
   ERR nn   Ett fel har intr{ffat, se ABC80's fellista.
   CTRL-X   KERM-anv{ndaren har tryckt CTRL-X.
   CTRL-Z   KERM-anv{ndaren har tryckt CTRL-Z.
   FLUSH    \verf|ringen avbruten med CTRL-X eller CTRL-Z,
            filen borttagen om kommandot var RECEIVE.
   OK       \verf|ringen av denna fil klar, filen st{ngd.

Terminaldelen  i KERM lagrar alla inkomna tecken i en buffer
innan de skrivs ut p} bildsk{rmen. Om 64 eller  fler  tecken
lagras  i bufferten s{nds ett XOFF (om XON/XOFF anv{nds) och
f|rst n{r det finns 32 eller f{rre tecken i bufferten  s{nds
ett  XON. Detta ger |kad performance d} man anv{nder LOG f|r
att spara data p} fil.

Om man har TED i minnet  samtidigt  som  KERM  kommer  TED's
LIB-rutin  att  bytas  ut n{r man fr}n TED-menyn hoppar till
KERM f|rsta g}ngen. Detta g|rs f|r att spara  RAM-minne  och
kan  ses p} texten som talar om hur mycket utrymme som finns
p} skivorna, den kommer att vara p} engelska.

Programmet KERM s{nker  stacken  och  lagrar  sin  maskinkod
mellan  den s{nkta stacken och DOS-buffertarna. Allt utrymme
ovanf|r  stacken  f}r  anses  som  upptaget  eftersom   KERM
anv{nder  stora  areor  f|r  buffertar av olika slag. Om man
l{mnar KERM  med  kommandot  QUIT  kommer  stackpekaren  att
beh}lla  det  s{nkta v{rdet. Det betyder att programmet KERM
finns kvar intakt i minnet och kan }teranv{ndas med
  Z=CALL(PEEK(65063)+256*PEEK(65064)+16)

Om man vill ta bort  programmet  KERM  ur  minnet  utan  att
trycka p} reset kan man g|ra QUIT till ett BASIC-program som
}terst{ller stackpekaren  till  normalv{rde.  Om  programmet
d{refter  g|r CHAIN "" {r KERM borttaget och datorn fungerar
som om KERM aldrig anv{nts. Man kan {ven g|ra QUIT till  ett
parmprogram  (se  kommando SAVE, kapitel 3.11) f|r att p} s}
vis starta upp KERM med andra parametrar.
<<< kerm1.asm >>>
; KERM1.ASM
; Anders Franz`n <5258>
; Stockholm 1987-09-20

         ORG  251:0

START    LD   A,(254:64)
         AND  A
         JRNZ ST1       Inga parametrar
         LD   HL,255:128
         LD   DE,PARMAREA
         LD   BC,PARMLEN
         LDIR
ST1      LD   SP,STACK
         LD   HL,KERMIT
         PUSH HL
         LD   (KERMSP),SP
         LD   SP,PGM
         LD   (254:39),SP S{nk stack
         CALL INIT      Init av terminal
         XOR  A
         LD   (FIL+5),A Fil ej |ppen!!
         LD   HL,TERMBILD
         LD   E,L
         LD   D,H
         LD   (HL),32
         INC  DE
         LD   BC,24*80-1
         LDIR
         LD   HL,KERMBILD
         LD   E,L
         LD   D,H
         LD   (HL),32
         INC  DE
         LD   BC,24*80-1
         LDIR
         LD   HL,TXT1
         LD   DE,TERMBILD
         LD   BC,TXT2-TXT1
         LDIR
         LD   DE,KERMBILD
         LD   BC,TXT3-TXT2
         LDIR
         LD   HL,(254:32) HEAP
         LD   DE,PGM
         SBC  HL,DE
         JRNC ST4       Program f|rst|rt
         LD   IX,(254:28) BOFA
         LD   HL,(254:28)
ST2      LD   A,(HL)
         CP   1
         JRZ  ST4       Slut p} program
         LD   C,A
         LD   A,(IX+3)
         CP   134
         JRNZ ST3
         LD   A,(IX+4)
         CP   145
         JRZ  ST5       CHAIN 'program'
ST3      ADD  IX,BC
         ADD  HL,BC
         JR   ST2

ST4      CALL 10:112    NEW
         LD   SP,STACK
         JP   KERMIT

ST5      LD   C,5
         ADD  HL,BC
         EX   DE,HL     DE --> uttryck
         LD   A,(13:63)
         CP   255
         JPZ  13:63     CHAIN
         JP   13:61

TXT1     DM "Terminal"
TXT2     DM "K E R M I T"
         DM "   for ABC80"
         DM "   Stockholm 1987"
TXT3

         ORG  PGM

         DEFM "5  KERMIT    "
         JP   TEDFIX    Retur fr}n TED
         JP   TEDFIX1   Retur fr}n BASIC
R[KNA    JP   192:0
TILLBUFF JP   192:3
SPARRAD  JP   192:6

TEDFIX   LD   A,(TEDFLG)
         AND  A
         JRNZ TEDFIX1   Retur till KERM
         POP  AF
         PUSH AF
         SUB  4
         LD   (R[KNA+2),A
         LD   (TILLBUFF+2),A
         LD   (SPARRAD+2),A
         LD   (TEDFLG),A TED i minnet!
         LD   IX,248:0  TED's LIB-rutin
         LD   HL,TEDLIB
         LD   (IX+14),L Ny LIB-rutin
         LD   (IX+15),H f|r TED!
         CALL INIT      Init av terminal
         LD   (TEDSP),SP
         LD   SP,STACK
         JP   KERMIT

TEDFIX1  LD   (TEDSP),SP
         LD   SP,(KERMSP)
         RET

TEDSP    DW 0
KERMSP   DW 0

TERMBILD DS 24*80
         DW 0:2
KERMBILD DS 24*80
         DW 0:2

VISABILD LD   IX,3:116
         LD   B,24
VB1      PUSH BC
         LD   E,(IX+0)
         LD   D,(IX+1)
         INC  IX
         INC  IX
         LD   A,(1:216) 40 eller 80
         LD   C,A
         LD   B,0
         LDIR
         CP   40
         JRNZ VB2
         LD   C,A
         ADD  HL,BC
VB2      POP  BC
         DJNZ VB1
         LD   E,(HL)
         INC  HL
         LD   D,(HL)
         LD   (253:243),DE Mark|r
         RET

SPARBILD LD   IX,3:116
         LD   B,24
SB1      PUSH BC
         LD   L,(IX+0)
         LD   H,(IX+1)
         INC  IX
         INC  IX
         LD   A,(1:216) 40 eller 80
         LD   C,A
         LD   B,0
         LDIR
         CP   40
         JRNZ SB2
         LD   L,E
         LD   H,D
         LD   (HL),32
         INC  DE
         LD   BC,39
         LDIR
         INC  HL
SB2      POP  BC
         DJNZ SB1
         LD   HL,(253:243) Mark|r
         EX   DE,HL
         LD   (HL),E
         INC  HL
         LD   (HL),D
         RET

;Filhantering, tar hand om ev fel
FILCONTR PUSH HL
         LD   HL,FILC3
         EX   (SP),HL
         LD   (254:54),SP RUN-timestack
         PUSH HL
         LD   HL,FILC2
         LD   (IY+30),L ONERRORGOTO
         LD   (IY+31),H
         LD   (IY+14),0 RUN-mode
         LD   (IY+15),0 NOTRACE
         LD   HL,FILC1
         EX   (SP),HL
         PUSH DE
         RET

FILC1    INC  SP
         INC  SP
         RET

FILC2    DB   4,0,1,145 BASIC-return

FILC3    LD   A,(IY+34) Errcode
         AND  127
         SCF
         RET

PREPARE  LD   A,1
         JR   OPEN1

PREPBAC  LD   A,4
         JR   OPEN1

OPEN     XOR  A
OPEN1    LD   IX,FIL
         LD   DE,0:62
         CALL FILCONTR
         RET

ERROR    AND  127
         LD   L,A
         LD   H,0
         PUSH HL
         LD   HL,ERROR1
         LD   BC,ERROR2-ERROR1
         CALL 0:11
         POP  HL
         CALL SKRIVTAL
         CALL 7:66
         RET

ERROR1   DM 13,10,7,"ERR "
ERROR2

;Omvandla str{ng i buffert till tal DE
G\RTAL   LD   A,(24:30)
         CP   126
         JPZ  24:30
         JP   24:28

;Omvandla tal till str{ng i buffert
SKRIVTA1 LD   DE,253:213 Tempbuffer
         PUSH DE
         LD   A,(24:96) Kolla checksumma
         CP   175
         PUSH AF
         CALLZ 24:96    \vers{tt till
         POP  AF        ASCII
         CALLNZ 24:98
         EX   DE,HL
         POP  DE
         AND  A         Ber{kna l{ngd
         SBC  HL,DE     p} str{ngen
         LD   C,L
         LD   B,H
         EX   DE,HL
         RET

;Skriv ut talet HL
SKRIVTAL CALL SKRIVTA1
         CALL 0:11      Skriv ut str{ng
         RET

;Skriver talet HL som max kan best}
;av x tecken. X lagras i A innan anrop
;varefter talet skrivs ut h|gerst{llt.
SKRTAL   PUSH DE        Spara utfyllnad
         PUSH AF
         CALL SKRIVTA1
         POP  AF
         EX   (SP),HL
         PUSH BC
         SUB  C
         LD   C,A
         CALLNZ 0:11    Skriv utfyllnad
         POP  BC
         POP  HL
         CALL 0:11
         RET

;Kollar om wildcard finns. Fixar
;i ordning filnamn.
DRIVEFIX RST  32
         LD   (WILDSTR),HL
         LD   BC,7:0
         LD   (WILDANT),BC
         PUSH HL
         LD   BC,0:255
         DEC  HL
DF1      LD   E,A       Spara f|reg tkn
         RST  24
         INC  C         R{kna antal tkn
         CP   "*"
         JRZ  DF2
         CP   "?"
         JRNZ DF3
DF2      INC  B         R{kna wildcards
DF3      CP   ","
         JRNZ DF4
         LD   A,13
         LD   (HL),A    Byt "," till CR
         INC  HL        Filnamn-2
DF4      CP   13
         JRNZ DF1
         RST  32
         LD   (FILPEK),HL Spara fil-2
         POP  HL
         LD   A,E       Sista tecknet
         CP   ":"
         JRZ  DF5       Endast enhet!
         LD   A,B
         LD   (WILDFLG),A
         AND  A
         JRZ  DF6       Inga wildcards!
DF5      LD   A,(HL)
         AND  95
         XOR  "D"
         RETNZ
         RST  24
         AND  95
         XOR  "R"
         RETNZ
         RST  24
         SUB  48
         CCF
         RETNC
         CP   8
         RETNC
         LD   C,A       Spara drive-nr
         RST  24
         XOR  ":"
         RETNZ
         RST  24
         LD   (WILDSTR),HL Skippa enhet
         LD   B,1          En drive
         LD   (WILDANT),BC
         AND  A
         RET

DF6      LD   DE,255:150 BC=l{ngd
         CALL 0:65      Fixa filnamn
         RETC           Fel!
         LD   HL,255:150+11
         LD   DE,255:128
         LD   BC,3
         LD   A,(HL)
         LDIR
         CP   32
         JRZ  DF7       Enhet saknas
         LD   A,":"
DF7      LD   (DE),A
         INC  DE
         LD   HL,255:150
         LD   C,8
         LDIR
         LD   A,"."
         LD   (DE),A
         INC  DE
         LD   C,3
         LDIR
         LD   A,13
         LD   (DE),A
         AND  A
         RET


;J{mf|r str{ng med wildcard, om str{ng
;passar s{tts carry. Rekursiv rutin.
;DE! str{ng
WILDCARD LD   HL,(WILDSTR)
WC1      RST  32
         EX   DE,HL
         RST  32
         EX   DE,HL
         CP   13
         JRNZ WC2
         LD   A,(HL)
         CP   13
         SCF
         RETZ
         XOR  "*"
         RETNZ
         PUSH HL
         RST  24
         POP  HL
         XOR  13
         RETNZ
         SCF
         RET

WC2      LD   A,(HL)
         CP   13
         RETZ
         LD   A,(DE)
         CP   96
         JRC  WC3
         AND  95
WC3      CP   (HL)
         JRNZ WC5
WC4      PUSH HL
         PUSH DE
         INC  HL
         INC  DE
         CALL WC1
         POP  DE
         POP  HL
         RET

WC5      LD   A,(HL)
         CP   "?"
         JRZ  WC4
         XOR  "*"
         RETNZ
         PUSH HL
         PUSH DE
         INC  HL
         CALL WC1
         POP  DE
         POP  HL
         RETC
         PUSH HL
         PUSH DE
         INC  DE
         CALL WC1
         POP  DE
         POP  HL
         RET

WILDSTR  DW 0   Pekar p} wildcard
WILDANT  DW 0   C=n{sta drive B=antal
WILDFLG  DB 0   Finns wildcards?
FILPEK   DW 0   Peka p} ev filnamn-2

;Leta efter ord i tabell
STRSCAN  LD   C,0
         PUSH DE
         CALL STR
         POP  DE
         RETZ           Hittat
         RETM           Finns ej
         PUSH HL
         PUSH DE
         LD   HL,STRSC1
         LD   BC,STRSC2-STRSC1
         CALL 0:11
         POP  DE
         POP  HL
         LD   C,128
         CALL STR
         CALL 7:66
         SCF
         RET

STRSC1   DM 13,10,7,"Be more specific"
STRSC2

;Leta i tabell
;IN HL! text
;   DE! tabell
;    C  0=leta 128=skriv alla ounika
;UT  Z  funnen
;    M  ej hittad
;    P  ej unikt
;    A  ev kod
;   HL  ev n{sta ord
STR      RST  32
         XOR  13
         DEC  A
         RETM           Tom textrad
         EXX
         LD   B,1       CRLF f|re f|rsta
         EXX
         EX   DE,HL     HL! tabell
STR1     LD   B,(HL)    Spara tabellkod
         LD   (STR8),HL Spara tabellord
         PUSH DE        Spara text
STR2     LD   A,(DE)    Tecken i text
         INC  DE
         CP   96
         JRC  STR3
         AND  95        G|r versal
STR3     INC  HL
         CP   (HL)      J{mf|r tkn
         JRZ  STR2      Lika
         CP   32
         JRZ  STR4
         CP   ","
         JRZ  STR4
         CP   13
         JRNZ STR6      Textord ej slut
STR4     DEC  DE        Peka p} tkn
         LD   (STR9),DE Spara n{sta ord
         LD   A,B
         EX   AF        Spara kod & NC!
         INC  C         R{kna tr{ffar
         BIT  7,C
         JRZ  STR6      Skriv ej ounika
         EXX
         DJNZ STR5
         CALL 7:66
         LD   B,3       Tre ord/rad
         LD   A,(1:216)
         CP   40
         JRZ  STR5
         LD   B,5
STR5     LD   HL,(STR8)
         LD   A,-10     Rak v{nsterkant
         LD   DE,SPACE  Avskiljare
         CALL SKRIVTAB  Skriv tabellord
         EXX
STR6     LD   A,(HL)
         INC  HL
         BIT  7,A
         JRZ  STR6      Leta tabordslut
         DEC  HL
         INC  A
         JRZ  STR7      Slut p} tabell
         POP  DE        Peka p} text
         JR   STR1

STR7     POP  DE        Text
         LD   HL,(STR9) N{sta ord
         RST  32
         EX   AF        ]terst{ll kod
         AND  A         Clear carry
         RES  7,C
         DEC  C
         RETZ           Hittad (NC)
         EX   DE,HL     HL! text
         RET

STR8     DW 0
STR9     DW 0


;Spara tecken i TED
TEDSPAR  LD   A,(TEDFLG)
         AND  A
         RETZ           TED ej i minnet
         LD   IX,TEDKOL
         LD   A,(SLASK)
         CP   32
         JRNC TS2
         CP   9
         JRZ  TS3
         CP   10
         JRZ  TS5
         CP   12
         JRZ  TS4
         CP   13
         JRZ  TS1
         CP   8
         RETNZ
         DEC  (IX+0)
         RETP
TS1      LD   (IX+0),0
         RET

TS2      LD   HL,FLAGG
         SET  5,(HL)    Data i buffer
         LD   HL,BUFFTED
         LD   E,(IX+0)
         LD   D,0
         ADD  HL,DE
         LD   (HL),A    Spara tecken
TS3      INC  (IX+0)    \ka kolumn
         LD   A,(IX+0)
         CP   160
         RETNZ          Rad ej full
TS4      LD   (IX+0),0
TS5      LD   DE,(TEDINRAD)
         PUSH DE
         LD   HL,(253:243)
         PUSH HL        Spara mark|r
         CALL SPARRAD
         POP  HL
         POP  DE
         JRC  TS6
         INC  DE
         LD   (TEDINRAD),DE
         CALL TILLBUFF
         LD   HL,FLAGG
         RES  5,(HL)    Buffer t|md
         RET

TS6      LD   (253:243),HL
         XOR  A
         LD   (TEDSAVE),A
         LD   DE,(3:162)
         CALL 2:103     Blanka rad 23
         LD   HL,FLAGG
         SET  0,(HL)    L{mna terminal
         SET  6,(HL)    TED full
         LD   A,3
         LD   (FELKOD),A
         RET

TEDSEND  LD   A,(TEDSAVE)
         XOR  2
         RETNZ
         LD   A,(TEDFLG)
         AND  A
         RETZ           TED ej i minnet
         LD   A,(TEDKOL)
         AND  A
         JRNZ TSE4      TED-buff ej tom
         LD   HL,(TEDANRAD)
         LD   A,H
         OR   L
         JRNZ TSE1      Fler rader kvar
         XOR  A
         LD   (TEDSAVE),A
         RET

TSE1     DEC  HL
         LD   (TEDANRAD),HL
         LD   HL,BUFFTED
         LD   (TEDUTPOS),HL
         LD   DE,(TEDUTRAD)
         INC  DE
         LD   (TEDUTRAD),DE
         CALL TILLBUFF
         LD   HL,BUFFTED+159
         LD   B,160
         LD   A,32
TSE2     CP   (HL)
         DEC  HL
         JRNZ TSE3
         DJNZ TSE2
         DEC  HL
TSE3     INC  HL
         INC  HL
         LD   (HL),13
         LD   A,B
         INC  A         R{kna med CR
TSE4     DEC  A
         LD   (TEDKOL),A
         LD   HL,(TEDUTPOS)
         LD   A,(HL)
         INC  HL
         LD   (TEDUTPOS),HL
         SCF            Flagga
         RET

TEDINRAD DW 0
TEDUTRAD DW 0
TEDANRAD DW 0
TEDUTPOS DW 0
TEDKOL   DB 0
<<< kerm2.asm >>>
; KERM2.ASM
; Anders Franz`n <5258>
; Stockholm 1987-09-13


BAUD75   EQU  2:117
BAUD300  EQU  9:213
BAUD1200 EQU  39:82
BAUD2400 EQU  78:165
BAUD4800 EQU  157:74

; Flaggor
; 0  L{mna terminal
; 1  Hoppa till TED
; 2  XOFF mottaget
; 3  XOFF s{nt
; 4  Inbuff full
; 5  Data i TED-buff
; 6  TED full
; 7  Fel p} DUMP/LOG-fil

INIT     LD   HL,BUFF1
         LD   (INBUFF),HL
         LD   A,L       Rensa mottagar-
         LD   (INPOS),A buffert
INIT1    LD   HL,BUFF2
         INP  56        Undvik
         LD   (HL),A    dubbeltryck!
         LD   (UTBUFF),HL
         LD   A,L       Rensa tangent-
         LD   (UTPOS),A buffert
         LD   H,36
         LD   (TIMER),HL
         LD   A,(FLAGG)
         AND  00011100B
         LD   (FLAGG),A
         CALL FIXBAUD
         CALL FIXTED
         RET

TERMINAL LD   (RETUR),SP
         LD   HL,TERMBILD
         CALL VISABILD
         CALL 2:147
         EX   DE,HL
         SET  7,(HL)    T{nd mark|r
         CALL INIT1     T|m tangentbuff
         CALL INTON     Sl} p} interrupt
         CALL XON       Ev s{nd XON
TERM1    CALL TAN       Polla tangenter
         LD   HL,FLAGG
         BIT  0,(HL)
         JPNZ EXIT      Avsluta!
         BIT  2,(HL)
         JRNZ TERM2     XOFF mottaget
         CALL CHECKTAN  Kolla om tangent
         CALLC TKNUT    Behandla tangent
         INP  58
         AND  2         B{rv}g?
         JRNZ TERM2     Nej, hoppa
         CALL TEDSEND   S{nda fr}n TED?
         CALLC TKNUT    Behandla tkn
         LD   A,(DMP)
         AND  A
         CALLNZ DISK    Ev tkn fr}n fil
         CALLC TKNUT    Behandla tkn
TERM2    CALL MOTTAG    L{s inputbuffer
         CALLC TKNIN    Behandla tkn
         INP  58
         AND  2         B{rv}g?
         JRZ  TERM1     Ja, hoppa
         LD   HL,FLAGG
         RES  2,(HL)    Inget XOFF
         JR   TERM1

; L{mna terminalrutinen
EXIT     CALL XOFF      S{nd XOFF
         LD   HL,FLAGG
         BIT  5,(HL)
         CALLNZ TS5     Spar i TED
         CALL 2:147
         EX   DE,HL
         RES  7,(HL)    Sl{ck mark|r
         LD   DE,TERMBILD
         CALL SPARBILD
         CALL INTOFF    Sl} av interrupt
         LD   SP,(RETUR)
         RET

;Sl} p} interrupt
INTON    DI             St{ng interrupt
         LD   A,I
         LD   (IREG),A  Spara register
         LD   HL,VEKTOR Interruptvektor
         LD   A,H       H|g byte till
         LD   I,A       CPU:ns I-reg
         LD   A,L       L}g byte till
         OUT  57        PIO:ns port A
         LD   A,4FH     Programmera PIO
         OUT  57        f|r inputmode
         EXX
         LD   HL,S1
         LD   DE,R1
         EXX
         EI             Sl} p} interrupt
         RET

;Sl} av interrupt
INTOFF   LD   A,(BITAR) H}ller byte p}
         AND  A         att s{ndas?
         JRNZ INTOFF    Ja, v{nta
         DI
         LD   A,255
         OUT  57        PIO i bitmode
         OUT  57        Alla bitar in
         LD   A,(IREG)
         LD   I,A       ]terst{ll I-reg
         LD   A,52      L}g byte till
         OUT  57        PIO:ns port A
         EI             Sl} p} interrupt
         LD   A,200     L}ng tid timer
         LD   (253:247),A tangentbordet
         XOR  A
         LD   (253:245),A Ingen tangent
         RET

;Behandla intkn
TKNIN    CP   10
         JRNZ TKNIN2
         LD   A,(NEWLINE)
         DEC  A
         JRNZ TKNIN1
         LD   A,13
         CALL SKRIV
TKNIN1   LD   A,10
TKNIN2   CALL SKRIV
         RET

;Kolla om tkn mottaget
MOTTAG   LD   DE,(INBUFF)
         LD   HL,FLAGG
         BIT  4,(HL)
         JRZ  MOT2      Buffer ej full
         LD   A,(INPOS)
         SUB  E
         JPP  MOT1
         NEG
MOT1     CP   32
         JRNC MOT2      Buffer ej t|md
         CALL XON
         RES  4,(HL)    Ingen panik!
MOT2     LD   A,(INPOS)
         CP   E         Mottaget tkn?
         RETZ           Nej, retur
         LD   E,A
         INC  A         Detta tkn
         LD   (INPOS),A behandlat
         LD   A,(DE)    Tag mottaget tkn
         SCF
         RET

;Polla tangentbordet
CHECKTAN LD   HL,(UTBUFF)
         LD   A,(UTPOS)
         CP   L         Tangent i buff?
         RETZ           Nej, retur
         LD   L,A
         INC  A
         LD   (UTPOS),A
         LD   A,(HL)
         AND  127
         SCF
         RET

;Polla tangentbordet
TAN      LD   HL,(UTBUFF)
         INP  56        L{s tangentbord
         BIT  7,A       Tangent nere?
         JRZ  TAN4      Nej, hoppa
         LD   B,18      L}ng tid
         CP   (HL)      Repetering?
         JRNZ TAN1      Nej, hoppa
         LD   BC,(TIMER)
         INC  B
         DJNZ TAN4
         LD   B,3
TAN1     LD   (TIMER),BC
         LD   C,A
         XOR  A
         OUT  6
         LD   A,57
         OUT  6         Klick
         LD   A,(ESCAPE)
         OR   128
         CP   C
         JRZ  TAN2      ESCAPE
         LD   A,(TEDFLG)
         AND  A
         JRZ  TAN3      TED ej i minnet
         LD   A,(TEDESC)
         OR   128
         CP   C
         JRNZ TAN3      Ej TED-escape
         SCF
TAN2     LD   (HL),C
         LD   HL,KERMAREA
         SET  3,(HL)
         LD   HL,FLAGG
         SET  0,(HL)
         RETNC
         SET  1,(HL)
         RET

TAN3     LD   A,C
         LD   (HL),A
         INC  L
         LD   (UTBUFF),HL
TAN4     LD   (HL),A    Spara nul{get
         RET

;Behandla uttkn
TKNUT    CP   13
         JRNZ TKNUT1    Ej CR
         LD   C,A
         LD   A,(NEWLINE)
         DEC  A
         LD   A,C
         JRNZ TKNUT1
         CALL TKNUT1    Tolka <RETURN>
         LD   A,10      som CRLF
TKNUT1   LD   C,A
         LD   A,(DUPLEX)
         AND  A         Halv duplex?
         LD   A,C
         CALLZ SKRIV    Ja, till sk{rm
         CALL S[ND      S{nd tangenten
         RET

;Skriver tkn p} sk{rm
SKRIV    AND  127
         LD   (SLASK),A Spara tkn
         CALL 2:147
         EX   DE,HL
         RES  7,(HL)    Sl{ck mark|r
         LD   A,(SLASK)
         CP   32
         JRNC SKR5
         CP   7
         JRZ  SKR1
         CP   8
         JRZ  SKR2
         CP   9
         JRZ  SKR6
         CP   10
         JRZ  SKR7
         CP   12
         JRZ  SKR3
         CP   13
         JRNZ SKR9
         LD   (IX+1),0
         JR   SKR8

SKR1     XOR  A
         OUT  6
         LD   A,131
         OUT  6         Pling!
         JR   SKR9

SKR2     DEC  HL
         DEC  (IX+1)    Minska kolumn
         JPP  SKR9
         LD   A,(2:111) 39 eller 79
         LD   (IX+1),A
         DEC  (IX+0)    F|reg}ende rad
         JPP  SKR8
         JR   SKR7

SKR3     CALL 2:118
         JR   SKR8

SKR5     LD   (HL),A    Skriv p} sk{rm
SKR6     INC  HL
         INC  (IX+1)    \ka kolumn
         LD   A,(2:111) 39 eller 79
         CP   (IX+1)
         JRNC SKR9      Raden ej slut
         LD   (IX+1),0
SKR7     CALL 2:56      Ny rad ev scroll
SKR8     CALL 2:147
         EX   DE,HL
SKR9     SET  7,(HL)    T{nd mark|r
         LD   A,(TEDSAVE)
         DEC  A
         CALLZ TEDSPAR  Spara text i TED
         LD   A,(LOG)
         AND  A
         LD   A,(SLASK)
         RETZ           Ingen loggning
         CP   10
         JRZ  SKR10     Rad ska loggas
         CP   32
         RETC
         LD   HL,(LOGBUFF)
         LD   (HL),A
         INC  L
         LD   (LOGBUFF),HL
         RET

SKR10    LD   HL,(LOGBUFF)
         LD   (HL),13
         INC  L
         LD   (HL),10
         INC  L
         LD   DE,BUFF3
         AND  A
         SBC  HL,DE
         LD   C,L
         LD   B,H
         EX   DE,HL
         LD   IX,FIL
         LD   DE,8:150
         CALL FILCONTR  Skriv rad
         JRC  SKR12
         LD   HL,BUFF3
         LD   (LOGBUFF),HL
         LD   A,(SLASK) ]terst{ll
         RET

SKR12    LD   (FELKOD),A
         LD   HL,FLAGG
         SET  0,(HL)    L{mna terminal
         SET  7,(HL)    Fel p} LOG-fil
         LD   A,(SLASK) ]terst{ll
         RET

;S{nder tkn fr}n fil
DISK     LD   IX,KERMAREA
         CALL GETFIL    H{mta ett tkn
         CCF
         RETC           Retur om OK
         AND  A
         JRNZ DISK1     Annat fel {n EOF
         LD   IX,FIL
         LD   DE,8:144
         CALL FILCONTR  Close
         JRC  DISK1
         XOR  A
         LD   (DMP),A
         RET

DISK1    LD   (FELKOD),A
         LD   HL,FLAGG
         SET  0,(HL)    L{mna terminal
         SET  7,(HL)    Fel p} DUMP-fil
         RET

;S{nd XOFF om XON {r s{nt
XOFF     LD   A,(FLOW)
         DEC  A
         RETNZ          XOFF anv{nds ej
         PUSH HL
         LD   HL,FLAGG
         BIT  3,(HL)    XOFF s{nt?
         LD   A,19
         CALLZ S[ND     Nej, s{nd XOFF
         LD   HL,FLAGG
         SET  3,(HL)
         POP  HL
         RET

;S{nd XON om XOFF {r s{nt
XON      LD   A,(FLOW)
         DEC  A
         RETNZ          XON anv{nds ej
         PUSH HL
         LD   HL,FLAGG
         BIT  3,(HL)    XOFF s{nt?
         LD   A,17
         CALLNZ S[ND    Ja, s{nd XON
         LD   HL,FLAGG
         RES  3,(HL)
         POP  HL
         RET

;S{nd iv{g tecknet A
S[ND     PUSH HL        Spara register
         PUSH DE
         PUSH BC
         LD   C,A       Byte att s{nda
         INP  58
         AND  2         Finns b{rv}g?
         JRZ  S[ND1     Ja, hoppa
         XOR  A
         OUT  6
         LD   A,131     Pling i
         OUT  6         h|gtalaren
         SCF
         JR   S[ND7     S{nd inget!

S[ND1    LD   B,10      Tio bitar
         LD   A,(PARITET)
         AND  A
         JRZ  S[ND5     S{nd byte "r}"
         RES  7,C
         DEC  A
         JRZ  S[ND5     Alltid noll
         DEC  A
         JRZ  S[ND4     Alltid ett
         DEC  A
         LD   A,C
         JRZ  S[ND3     J{mn paritet
         AND  A
         JPPO S[ND5     Hoppa om udda
         JR   S[ND4

S[ND3    AND  A
         JPPE S[ND5     Hoppa om j{mn
S[ND4    SET  7,C
S[ND5    PUSH BC
         CALL TAN       Polla tangenter
         POP  BC
         LD   A,(BITAR) P}g}r s{ndning?
         AND  A
         JRNZ S[ND5     Ja, v{nta
         LD   (BYTE),BC Spara B och C
S[ND7    POP  BC        ]terst{ll
         POP  DE        register
         POP  HL
         RET            Klart !

;S{nd och ta emot data
TERMINT  EX   AF
         EXX
         JP   (HL)      Hoppa

S1       CALL REC
         INP  58
         OR   16+8      RTS + ettbit
         OUT  58
         LD   A,(BITAR)
         AND  A         Startbit (NC)
         JRZ  S1        Inget att s{nda
         LD   B,A
         LD   HL,0
         LD   (S5+7),HL
         LD   A,(BYTE)
         LD   C,A       Byte att s{nda
S3       LD   (S5+16),BC
         LD   C,58
         IN   B,(C)
         SET  3,B       TxD=1
         JRC  S4        Hoppa om ettbit
         RES  3,B       TxD=0
S4       OUT  (C),B     Skicka iv{g bit
S5       CALL REC
         LD   HL,(BAUDSEND)
         LD   BC,0
         ADD  HL,BC
         LD   (S5+7),HL
         JRNC S5
         LD   BC,0
         RR   C
         DJNZ S3
         XOR  A
         LD   (BITAR),A
         JR   S1

REC      EX   DE,HL
         JP   (HL)

R1       CALL END       V{nta 128 us
         INP  58        L{s V24-porten
         RRC  A         Linjen l}g?
         JRNC R1        Ja, b|rja om
R2       CALL END       V{nta 128 us
         INP  58        L{s V24-porten
         RRC  A         Startbit?
         JRC  R2        Nej, inte {nnu
         LD   HL,206:164 19% av bittid
         LD   (R5+7),HL
R3       CALL END
         INP  58        L{s V24-porten
         RRC  A         St|rning?
         JRC  R2        Ja, b|rja om
         LD   HL,(BAUDREC)
         LD   DE,(R5+7)
         ADD  HL,DE     Har halva bit-
         LD   (R5+7),HL tiden g}tt?
         JRNC R3        Nej, v{nta...
         LD   B,9
R4       RR   C         Spara bit i C
         LD   (R5+16),BC
R5       CALL END       V{nta 128 us
         LD   HL,(BAUDREC)
         LD   DE,0
         ADD  HL,DE     Har n{sta bit
         LD   (R5+7),HL kommit in nu?
         JRNC R5        Nej, v{nta
         LD   BC,0
         INP  58        L{s V24-porten
         RRC  A         Biten till carry
         DJNZ R4        Upprepa om fler
         JRNC R1        Ej stoppbit
         CALL END
         LD   A,(R5+16)
         LD   HL,(INBUFF)
         LD   (HL),A    Spara tkn
         INC  L
         LD   (INBUFF),HL
         LD   C,A
         LD   A,(INPOS)
         SUB  L
         LD   HL,FLAGG
         JPP  R6
         NEG
R6       CP   64
         JRC  R7        Buffer ej full
         BIT  4,(HL)
         JRNZ R7        Redan noterat
         LD   A,(BITAR)
         AND  A
         JRNZ R7        Tkn s{nds tyv{rr
         CALL XOFF      S{nd XOFF
         SET  4,(HL)    Notera buff full
R7       LD   A,(PARITET)
         AND  A
         LD   A,C
         JRZ  R8        Paritet NONE
         AND  127       Ev paritet bort
R8       CP   17
         JRZ  R9        XON
         CP   19
         JPNZ R2        Ej XOFF
         SET  2,(HL)    Flagga XOFF
         JP   R2

R9       RES  2,(HL)    Sl{ck flagga
         JP   R2        f|r XOFF

END      LD   HL,(TIMER)
         DEC  HL
         LD   (TIMER),HL
         POP  DE        Adress i "s{nd"
         POP  HL        Adress i "rec"
         EXX            ]terst{ll
         EX   AF        registren
         EI             Sl} p} interrupt
         RETI           Interrupt klart

         ORG  $/2*2+2   J{mn adress!

VEKTOR   DW TERMINT     Interruptvektor
BAUDREC  DW BAUD1200    Mottagningsfart
BAUDSEND DW BAUD75      S{ndningsfart
BYTE     DB 0           Byte att s{nda
BITAR    DB 0           Antal bitar
INBUFF   DW 0           Mottaget data
INPOS    DW 0           Sista position
UTBUFF   DW 0           Tangentdata
UTPOS    DW 0           Sista position
TIMER    DW 0           Repetition
IREG     DB 0           V{rde p} I-reg
FLAGG    DB 0
SLASK    DB 0
FELKOD   DB 0           Felkod LOG/DUMP
LOGBUFF  DW 0
RETUR    DW 0
<<< kerm3.asm >>>
; KERM3.ASM
; Anders Franz`n <5258>
; Stockholm 1987-09-20


KERMIT   CALL KERMV
KERM1    LD   HL,KERM4
         LD   BC,KERM5-KERM4
         CALL 0:11      Skriv promt
KERM2    CALL 7:66
         LD   HL,BUFF6
         LD   BC,39
         PUSH HL
         CALL GETLINE
         POP  HL
         RST  32
         CP   13
         JRZ  KERM2     Tom rad
         LD   BC,KERM1
         PUSH BC        Returadress
         LD   DE,CMDTAB
         PUSH DE
         CALL STRSCAN
         POP  DE
         RETC           Ambigious
         JRNZ KERM3
         LD   DE,CMDJTB
         JP   1:58      Utnyttja ROM!

KERM3    PUSH DE
         LD   HL,KERM5
         LD   BC,KERM6-KERM5
         CALL 0:11
         POP  HL
         JP   HELP1

KERM4    DM 13,10,"KERMIT"
KERM5    DM 13,10,7,"Command must be"
KERM6

GETLINE  LD   DE,3:78
         LD   (253:251),DE
         PUSH IX
         LD   B,C
GETL2    CALL 3:91
         JRNZ GETL2
GETL3    CALL 3:91
GETL4    CALL 0:2
         CP   9
         CALLZ 3:72
         CP   13
         JPZ  2:229
         CP   24
         JRZ  GETL2
         CP   8
         JRZ  GETL3
         PUSH HL
         PUSH DE
         PUSH BC
         PUSH IX
         PUSH AF
         LD   HL,(ESCAPE)
         CP   L
         JRNZ GETL5
         CALL CONNECT
         JR   GETL6

GETL5    LD   HL,(TEDESC)
         CP   L
         CALLZ TED
GETL6    POP  AF
         POP  IX
         POP  BC
         POP  DE
         POP  HL
         CP   32
         JRC  GETL4
         LD   (DE),A
         CP   96
         JRC  GETL7
         AND  95
GETL7    LD   (HL),A
         INC  HL
         INC  (IX+1)
         LD   A,(2:111)
         CP   (IX+1)
         CALLC 2:52
         DJNZ GETL4
         JP   2:228

CMDTAB   DM 128,"CLOSE"
         DM 129,"CONNECT"
         DM 130,"DELETE"
         DM 131,"DIR"
         DM 132,"DUMP"
         DM 130,"ERASE"
         DM 133,"EXIT"
         DM 134,"HELP"
         DM 130,"KILL"
         DM 135,"LOG"
         DM 136,"QUIT"
         DM 137,"RECEIVE"
         DM 138,"SAVE"
         DM 139,"SEND"
         DM 140,"SET"
         DM 141,"SHOW"
         DM 142,"TED"   Rensa tabell om
         DM 143,"TYPE"
         DM 255         TED saknas

CMDJTB   DW CLOSE       128
         DW CONNECT     129
         DW DELETE      130
         DW DIRH        131
         DW DUMP        132
         DW BASIC       133
         DW HELP        134
         DW LOGG        135
         DW QUIT        136
         DW KERMREC     137
         DW SAVE        138
         DW KERMSEND    139
         DW SET         140
         DW SHOW        141
         DW TED         142
         DW TYPE        143

CONNECT  CALL KERMS
CON1     CALL TERMINAL
         LD   A,(FLAGG)
         BIT  1,A
         JPNZ TED1      TED-escape
         CALL KERMV
         LD   A,(FLAGG)
         BIT  6,A
         JRNZ CON2      TED full
         BIT  7,A
         RETZ           LOG/DUMP-FIL ok
         LD   A,(FELKOD)
         CALL ERROR
         CALL CLOSE
         LD   SP,STACK
         JP   KERM1

CON2     LD   HL,CON3
         LD   BC,CON4-CON3
         CALL 0:11
         LD   SP,STACK
         JP   KERM1

CON3     DB 13,10,7
         DM "TED filled",13,10
CON4

TED      LD   A,(TEDFLG)
         AND  A
         RETZ           TED ej i minnet!
         CALL KERMS
TED1     LD   A,(DMP)
         LD   C,A
         LD   A,(LOG)
         OR   C
         JRZ  TED2      Ingen fil |ppen
         CALL KERMV
         CALL CLOSE     St{ng fil
         LD   SP,STACK
         JP   KERM1     Stanna i KERM

TED2     CALL TED3      Anropa TED
         LD   A,(FLAGG)
         BIT  1,A
         JPNZ CON1      TED-escape
         JP   KERMV

TED3     LD   (KERMSP),SP
         LD   SP,(TEDSP)
         RET            Till TED

TEDFLG   DB 0

KERMSEND CALL DRIVEFIX  Fixa filnamn
         LD   A,21
         JPC  ERROR
         CALL CLOSE
         CALL INIT      Rensa buffertar
         CALL INTON     Sl} p} interrupt
         CALL XON
         CALL SEND
         CALL XOFF
         CALL INTOFF    Sl} av interrupt
         CALL 7:66
         RET

KERMREC  LD   (FILPEK),HL Ev filnamn
         CALL CLOSE
         CALL INIT      Rensa buffertar
         CALL INTON     Sl} p} interrupt
         CALL XON
         CALL RECEIVE
         CALL XOFF
         CALL INTOFF    Sl} av interrupt
         CALL 7:66
         RET

QUIT     PUSH HL        Spara ev pgm
         CALL CLOSE
         CALL KERMS
         LD   HL,254:64 Inga parametrar
         LD   (HL),L    om QUIT KERM
         POP  HL
         CALL BASIC1    Anropa BASIC
KERMV    LD   HL,KERMBILD
         CALL VISABILD
         RET

KERMS    LD   DE,KERMBILD
         CALL SPARBILD
         RET

BASIC    CALL CLOSE
         JP   0:0

BASIC1   LD   (KERMSP),SP
         LD   SP,(254:39)
         LD   A,(13:76)
         CP   231
         JPZ  13:76     RUN i BASIC
         JP   13:74

;Visar vilka kommandon som finns
HELP     LD   HL,CMDTAB
HELP1    LD   B,1
HELP2    DJNZ HELP3
         CALL 7:66
         LD   B,3
         LD   A,(1:216)
         CP   40
         JRZ  HELP3
         LD   B,5
HELP3    LD   A,-10
         LD   DE,SPACE
         CALL SKRIVTAB
         LD   A,(HL)
         INC  A
         JRNZ HELP2
         CALL 7:66
         RET

;Visa parametrar
SHOW     CALL 7:66
         LD   IX,PARMAREA
         LD   HL,SHOWTAB
         PUSH HL
         LD   HL,SETTAB
SHOW1    LD   B,2       Antal/rad
         LD   A,(1:216)
         CP   40
         JRZ  SHOW2
         LD   B,3
SHOW2    LD   A,-7      Rak v{nsterkant
         LD   DE,PUNKTER
         CALL SKRIVTAB
         EX   (SP),HL
         PUSH BC
         LD   E,(HL)
         INC  HL
         LD   D,(HL)
         INC  HL
         LD   C,(HL)
         INC  HL
         LD   B,(HL)
         INC  HL
         PUSH HL
         EX   DE,HL
         LD   A,(IX)
         INC  IX
         OR   128
         CP   254
         JRZ  SHOW3
         CP   255
         JRZ  SHOW3
         CPIR
         JRZ  SHOW4
SHOW3    AND  127
         LD   L,A
         LD   H,0
         LD   A,9
         LD   DE,PUNKTER
         CALL SKRTAL
         JR   SHOW5

SHOW4    DEC  HL
         LD   A,9
         LD   DE,PUNKTER
         CALL SKRIVTAB
SHOW5    POP  HL
         POP  BC
         EX   (SP),HL
         LD   A,(HL)
         INC  A
         JRZ  SHOW6
         PUSH HL
         PUSH BC
         LD   HL,SPACE
         LD   BC,2
         CALL 0:11
         POP  BC
         POP  HL
         DJNZ SHOW2
         CALL 7:66
         JR   SHOW1

SHOW6    POP  HL
         CALL 7:66
         RET

;IN  DE Typ av delare
;     A L{ngd f{lt >0 rak h|gerkant
;                  <0 rak v{nsterkant
SKRIVTAB PUSH BC
         LD   BC,-1
         INC  HL        Skippa highbyte
         PUSH HL
SKRIVT1  BIT  7,(HL)
         INC  HL
         INC  BC        R{kna l{ngd ord
         JRZ  SKRIVT1
         DEC  HL
         EX   (SP),HL   Spara n{sta ord
         PUSH DE        Spara avskiljare
         AND  A
         JPM  SKRIVT2   Rak v{nsterkant
         PUSH HL
         PUSH BC
         EX   DE,HL
         SUB  C
         LD   C,A
         CALLNZ 0:11    Skriv avskiljare
         XOR  A
         POP  BC        L{ngd p} ord
         POP  HL        Pekar p} ord
SKRIVT2  PUSH AF
         PUSH BC
         CALL 0:11      Skriv ord
         POP  BC
         POP  AF
         POP  HL        Avskiljare
         NEG
         SUB  C
         LD   C,A
         CALLP 0:11     Skriv avskiljare
         POP  HL        N{sta ord
         POP  BC
         RET

PUNKTER  DM ".........."

;[ndra parametrar
SET      LD   DE,SETTAB
         PUSH DE
         CALL STRSCAN
         POP  DE
         RETC           Ambigious
         JRNZ SET1
         LD   DE,SETJTB
         JP   1:58      Utnyttja ROM!

SET1     PUSH DE
         LD   HL,SETF1
         LD   BC,SETF2-SETF1
         CALL 0:11      Felmeddelande
         POP  HL
         JP   HELP1

SET2     PUSH DE
         LD   HL,SETF2
         LD   BC,SETF3-SETF2
         CALL 0:11      Felmeddelande
         POP  HL
         JP   HELP1

SETF1    DM 13,10,7,"Parameter must be"
SETF2    DM 13,10,7,"Value must be"
SETF3

SETTAB   DM 128,"ACCESS"
         DM 129,"BAUD"
         DM 130,"CHECK"
         DM 131,"DEBUG"
         DM 132,"DUPLEX"
         DM 133,"EOL"
         DM 134,"ESCAPE"
         DM 135,"FILE"
         DM 136,"FLOW"
         DM 137,"LENGTH"
         DM 138,"MARKER"
         DM 139,"NEWLINE"
         DM 140,"NUMPAD"
         DM 141,"PADCHAR"
         DM 142,"PARITY"
         DM 143,"PAUSE"
         DM 144,"QBIN"
         DM 145,"QCTL"
         DM 146,"REPT"
         DM 147,"RETRY"
         DM 148,"TEDESC"
         DM 149,"TEDMODE"
         DM 150,"TIMEOUT"
         DM 255

SETJTB   DW [ACC        128
         DW [BAUD       129
         DW [CHECK      130
         DW [DEBUG      131
         DW [DUPL       132
         DW [EOL        133
         DW [ESCAPE     134
         DW [FILE       135
         DW [FLOW       136
         DW [LENGTH     137
         DW [MARKER     138
         DW [NEWL       139
         DW [NUMPAD     140
         DW [PADCHAR    141
         DW [PAR        142
         DW [PAUSE      143
         DW [QBIN       144
         DW [QCTL       145
         DW [REPT       146
         DW [RETRY      147
         DW [TEDESC     148
         DW [TED        149
         DW [TIME       150


[BAUD    LD   DE,PBAUD
         LD   BC,BAUD
         CALL [TAB
         JP   FIXBAUD

PBAUD    DM 128,"300/300"
         DM 129,"1200/75"
         DM 130,"75/1200"
         DM 131,"1200/1200"
         DM 132,"2400/2400"
         DM 133,"4800/4800"
         DM 255
PBAUDS

[DUPL    LD   DE,PDUPL
         LD   BC,DUPLEX
         JP   [TAB

PDUPL    DM 128,"HALF"
         DM 129,"FULL"
         DM 255
PDUPLS

[PAR     LD   DE,PPAR
         LD   BC,PARITET
         JP   [TAB

PPAR     DM 128,"NONE"
         DM 129,"SPACE",129,"0"
         DM 130,"MARK",130,"1"
         DM 131,"EVEN"
         DM 132,"ODD"
         DM 255
PPARS

[FLOW    LD   DE,PFLOW
         LD   BC,FLOW
         JP   [TAB

PFLOW    DM 128,"OFF"
         DM 129,"XON/XOFF"
         DM 255
PFLOWS

[TIME    LD   DE,TIME
         JR   [TAL

[RETRY   LD   DE,RETRY
[TAL     PUSH DE
         CALL G\RTAL
         POP  BC
         EX   DE,HL
         LD   DE,PTAL
         JPC  SET2
         LD   A,H
         AND  A
         JPNZ SET2
         LD   A,L
         CP   1
         JPC  SET2
         CP   31
         JPNC SET2
         LD   (BC),A
         CALL 7:66
         AND  A
         RET

PTAL     DM 254,"1-30"
         DM 255
PTALS

[FILE    LD   DE,PFILE
         LD   BC,FILE
         JP   [TAB

PFILE    DM 128,"TEXT"
         DM 129,"BIN"
         DM 130,"AUTO"
         DM 255
PFILES

[LENGTH  CALL G\RTAL
         EX   DE,HL
         LD   DE,PLENGTH
         JPC  SET2
         LD   A,H
         AND  A
         JPNZ SET2
         LD   A,L
         CP   20
         JPC  SET2
         CP   95
         JPNC SET2
         LD   (LENGTH),A
         CALL 7:66
         RET

PLENGTH  DM 254,"20-94"
         DM 255
PLENGTHS

[MARKER  LD   DE,MARKER
         JP   [TKN

[CHECK   LD   DE,PCHECK
         LD   BC,CHECK
[TAB     PUSH DE
         PUSH BC
         CALL STRSCAN
         POP  BC
         POP  DE
         RETC           Ambigious
         JPNZ SET2
         AND  127
         LD   (BC),A
         CALL 7:66
         RET

PCHECK   DM 129,"1"
         DM 130,"2"
         DM 255
PCHECKS

[EOL     LD   DE,EOL
         JR   [TKN

[NUMPAD  LD   DE,NUMPAD
         JR   [TKN

[PADCHAR LD   DE,PADCHAR
         JR   [TKN

[QCTL    LD   DE,QCTL
         JR   [TKN

[QBIN    LD   DE,QBIN
         JR   [TKN

[ESCAPE  LD   DE,ESCAPE
         JR   [TKN

[TEDESC  LD   DE,TEDESC
         JR   [TKN

[REPT    LD   DE,REPT
[TKN     PUSH DE        Spara variabel
         CALL G\RTAL
         POP  BC
         EX   DE,HL
         LD   DE,PTKN
         JPC  SET2
         LD   A,H
         AND  A
         JPNZ SET2
         LD   A,L
         BIT  7,A
         JPNZ SET2
         LD   (BC),A
         CALL 7:66
         AND  A
         RET

PTKN     DM 254,"0-127"
         DM 255
PTKNS

[ACC     LD   DE,PACC
         LD   BC,ACCESS
         JP   [TAB

PACC     DM 128,"PREPARE"
         DM 129,"KILL"
         DM 130,"STOP"
         DM 255
PACCS

[DEBUG   LD   DE,PDEBUG
         LD   BC,DEBUG
         JP   [TAB

PDEBUG   DM 128,"OFF"
         DM 129,"PACKET"
         DM 130,"DUMP"
         DM 255
PDEBUGS

[TED     LD   DE,PTED
         LD   BC,TEDSAVE
         CALL [TAB
         RET

PTED     DM 128,"OFF"
         DM 129,"SAVE"
         DM 130,"SEND"
         DM 255
PTEDS

[NEWL    LD   DE,PNEWL
         LD   BC,NEWLINE
         JP   [TAB

PNEWL    DM 128,"OFF"
         DM 129,"ON"
         DM 255
PNEWLS

[PAUSE   LD   DE,PAUSE
         JP   [TKN

SHOWTAB  DW PACC,PACCS-PACC         128
         DW PBAUD,PBAUDS-PBAUD      129
         DW PCHECK,PCHECKS-PCHECK   130
         DW PDEBUG,PDEBUGS-PDEBUG   131
         DW PDUPL,PDUPLS-PDUPL      132
         DW PTKN,PTKNS-PTKN eol     133
         DW PTKN,PTKNS-PTKN escape  134
         DW PFILE,PFILES-PFILE      135
         DW PFLOW,PFLOWS-PFLOW      136
         DW PLENGTH,PLENGTHS-PLENGTH 137
         DW PTKN,PTKNS-PTKN marker  138
         DW PNEWL,PNEWLS-PNEWL      139
         DW PTKN,PTKNS-PTKN numpad  140
         DW PTKN,PTKNS-PTKN padchar 141
         DW PPAR,PPARS-PPAR         142
         DW PTKN,PTKNS-PTKN pause   143
         DW PTKN,PTKNS-PTKN qbin    144
         DW PTKN,PTKNS-PTKN qctl    145
         DW PTKN,PTKNS-PTKN rept    146
         DW PTAL,PTALS-PTAL retry   147
         DW PTKN,PTKNS-PTKN TEDesc  148
         DW PTED,PTEDS-PTED         149
         DW PTAL,PTALS-PTAL time    150

FIXBAUD  LD   A,(BAUD)
         INC  A
         LD   HL,FIXBAUD2-5
         LD   BC,5
FIXBAUD1 ADD  HL,BC
         DEC  A
         JRNZ FIXBAUD1
         LD   A,(HL)    Kort tid f|r
         INC  HL        tangentrepeet
         LD   (TAN1-1),A
         LD   E,(HL)
         INC  HL
         LD   D,(HL)
         INC  HL
         LD   (BAUDSEND),DE
         LD   E,(HL)
         INC  HL
         LD   D,(HL)
         INC  HL
         LD   (BAUDREC),DE
         RET

FIXBAUD2 DB 3
         DW BAUD300,BAUD300
         DB 5
         DW BAUD75,BAUD1200
         DB 2
         DW BAUD1200,BAUD75
         DB 2
         DW BAUD1200,BAUD1200
         DB 2
         DW BAUD2400,BAUD2400
         DB 2
         DW BAUD4800,BAUD4800

FIXTED   LD   A,(TEDFLG)
         AND  A
         RETZ           TED ej i minnet
         CALL R[KNA     Ant rader i TED
         LD   (TEDANRAD),DE
         INC  DE
         LD   (TEDINRAD),DE
         CALL TILLBUFF
         XOR  A
         LD   (TEDKOL),A
         LD   L,A
         LD   H,A
         LD   (TEDUTRAD),HL
         RET

PARMAREA

ACCESS   DB 0    Kolla om fil finns
BAUD     DB 1    Baud
CHECK    DB 2    Checksummetyp
DEBUG    DB 0    Debug-mode
DUPLEX   DB 1    Duplex
EOL      DB 13   End of packet
ESCAPE   DB 27   Esccape-tkn terminal
FILE     DB 2    Filtyp
FLOW     DB 1    Flow controll
LENGTH   DB 94   Packetl{ngd
MARKER   DB 1    Start of packet
NEWLINE  DB 0    Tolka <RETURN> som CRLF
NUMPAD   DB 0    Antal PAD-tkn
PADCHAR  DB 0    PAD-tecken
PARITET  DB 0    Paritet
PAUSE    DB 0    Paus innan packet s{nds
QBIN     DB "&"
QCTL     DB "#"
REPT     DB "~"
RETRY    DB 5    Antal omf|rs|k
TEDESC   DB 0    Hopp-till-TED-tangent
TEDSAVE  DB 0    Spara/s{nda text i TED
TIME     DB 10   Timeout

PARMLEN  EQU $-PARMAREA

LOG      DB 0    Logga p} disk
DMP      DB 0    S{nd iv{g fil
<<< kerm4.asm >>>
; KERM4.ASM
; Anders Franz`n <5258>
; Stockholm 1987-09-13


;Ny LIB-rutin f|r TED
TEDLIB   LD   HL,TL4
         LD   BC,TL5-TL4
         CALL 0:11
TL1      CALL 0:2
         LD   HL,TL6
         LD   BC,8
         CPIR
         JRZ  TL2       Siffra 0-7
         LD   C,8
         CPIR
         RETNZ          Ej shift+siffra
         XOR  A         Visa filstorlek
TL2      LD   (255:212),A
         LD   HL,TL7
         LD   (WILDSTR),HL
         LD   A,C       \nskad drive
         OR   128       Flagga TED-lib
         CALL DIR
         JRNC TEDLIB
         LD   HL,TL5
         LD   BC,TL6-TL5
         CALL 0:11
         JR   TL1

TL4      DB 27,61,32+23,32+0,7
         DM "*  \NSKAD DRIVE ?"
TL5      DB 27,61,32+23,32+0,7
         DM "*  SKIVAN EJ KLAR."
TL6      DM "76543210"
         DM '/&%$#"!='
TL7      DB "*",13

;Huvudrutin f|r LIB
DIRH     RST  32
         CP   ","
         JRNZ DIRH1
         INC  HL
         RST  32
         AND  95
         CP   "S"
         JRNZ DIRH1
         RST  24
         XOR  A         Filstorlek visas
DIRH1    LD   (255:212),A Spara flagga
         CALL DRIVEFIX
         LD   HL,(WILDSTR)
         LD   A,(HL)
         CP   13
         JRNZ DIRH2     Argument finns
         LD   (HL),"*"  Default alla
         INC  HL
         LD   (HL),A
DIRH2    CALL 7:66
         LD   BC,(WILDANT)
DIRH3    LD   A,C
         PUSH BC
         CALL DIR
         POP  BC
         INC  C
         DJNZ DIRH3
         RET

DIR      LD   C,A
         AND  127
         PUSH BC
         CALL LIBINIT
         POP  BC
         RETC
         BIT  7,C
         LD   HL,DIR19
         LD   BC,DIR20-DIR19
         CALLNZ 0:11    Skriv om TED-lib
         LD   DE,0:32*7 Sp}r 0 sektor 7
         CALL LIBL[S    L{s sektor
         RETC           Felkod >0
         LD   HL,245:0  Inl{st sektor
         LD   E,L
         LD   D,L       DE <-- noll
         LD   B,160     Antal bytes
         XOR  A
DIR1     CP   (HL)      Unders|k byte
         INC  HL
         JRNZ DIR5      Ej noll
         PUSH HL
         LD   HL,8
         ADD  HL,DE     \ka antalet
         EX   DE,HL     sektorer med 8
         POP  HL
DIR5     DJNZ DIR1      Upprepa
         LD   (255:200),DE Ant sektorer
         LD   DE,0:32*0 Sp}r 0 sektor 0
         CALL LIBL[S    L{s sektor
         RETC           Felkod > 0
         LD   HL,DIR15
         LD   BC,DIR17-DIR15
         CALL 0:11      Skriv "DRx:"
         LD   HL,245:135
         LD   BC,120:0  Max 120 tecken
DIR6     LD   A,(HL)
         INC  HL
         CP   10        Volymnamn slut ?
         JRZ  DIR7      Ja, hoppa
         CP   13
         JRZ  DIR7      Ja, hoppa
         CP   32        Finns volymnamn?
         JRC  DIR8      Nej, hoppa
         CP   128
         JRNC DIR8      Nej, hoppa
         INC  C         \ka r{knare
         DJNZ DIR6      Upprepa om fler
DIR7     LD   A,C
         AND  A         Fanns volymnamn?
         JRZ  DIR8      Nej, hoppa
         LD   B,0       BC=l{ngd p} text
         LD   HL,245:135
         CALL 0:11      Skriv volymnamn
DIR8     CALL 7:66
         CALL FIRSTFIL
         RETC
         JRZ  DIR14
         LD   B,1
DIR9     DJNZ DIR11
         CALL 7:66
         LD   A,(1:216)
         CP   40
         LD   B,2
         JRZ  DIR10
         LD   B,4
DIR10    LD   A,(255:212)
         AND  A
         JRZ  DIR11     Storlek visas
         INC  B
DIR11    PUSH BC
         LD   HL,255:132
         LD   BC,12
         CALL 0:11      Skriv filnamn
         LD   BC,1
         LD   A,(255:212) Ska filstorlek
         AND  A           visas ?
         JRNZ DIR12     Nej
         LD   HL,(255:146)
         LD   A,4
         LD   DE,SPACE
         CALL SKRTAL
         LD   BC,3
DIR12    LD   HL,SPACE
         CALL 0:11      Skriv space
         POP  BC
         CALL PAUS
         RETC           CTRL-C
         PUSH BC
         CALL NEXTFIL
         POP  BC
         RETC
         JRNZ DIR9
DIR14    CALL 7:66
         CALL 7:66
         LD   HL,(255:202) Lediga sekt
         CALL SKRIVTAL
         LD   HL,DIR17
         LD   BC,DIR18-DIR17
         CALL 0:11
         LD   HL,(255:200) Ant sektorer
         CALL SKRIVTAL
         LD   HL,DIR18
         LD   BC,DIR19-DIR18
         CALL 0:11
         RET

DIR15    DM 13,10,"DR"
DIR16    DM "x:  "
DIR17    DM " of "
DIR18    DM " sectors free."
         DM 13,10
DIR19    DB 12,27,61,32+3,32+0
         DM "LIB",13,10
         DM "====="
         DB 27,61,32+6,32+0
DIR20

LIBINIT  LD   (253:1),A Selektera drive
         ADD  48
         LD   (DIR16),A
         LD   DE,0:32*6 Sp}r 0 sektor 6
         CALL LIBL[S    L{s sektor
         RETC           Felkod > 0
         LD   HL,245:0  Inl{st sektor
         LD   E,L
         LD   D,L       DE <-- noll
         LD   C,160     Antal byte
LIB1     LD   B,8       ]tta bitar
LIB2     RR   (HL)      Testa bit
         JRC  LIB3      Upptagen
         INC  DE        \ka r{knare
LIB3     DJNZ LIB2      Repetera
         INC  HL        N{sta byte
         DEC  C         Slut ?
         JRNZ LIB1      Nej, upprepa
         LD   (255:202),DE Lediga sekt
         LD   HL,245:239 Kopiera vilka
         LD   DE,255:204 sektorer i
         LD   C,8        biblioteket
         LDIR            som {r anv{nda
         AND  A
         RET

FIRSTFIL LD   DE,2:0    Sp}r 2 sektor 0
         JR   NX2

NEXTFIL  LD   HL,(DRFIL)
         LD   DE,(DRSEKT)
         LD   A,L
         ADD  16        N{sta fil i
         LD   L,A       biblioteket
         LD   (DRFIL),HL
         AND  A         Sektor slut ?
         JRNZ NX3       Nej, kolla fil
NX1      LD   A,E
         ADD  32        N{sta sektor
         LD   E,A       p} sp}r tv}
         AND  A         Sektorer slut ?
         RETZ           Ja, retur!
NX2      LD   (DRSEKT),DE
         PUSH DE        Spara sektor-nr
         LD   HL,255:204
         SRL  E         Dela E med 32
         SRL  E
         SRL  E
         SRL  E
         SRL  E
         LD   D,0
         ADD  HL,DE     Sl} i tabell
         LD   A,(HL)    [r sektorn
         CP   2         anv{nd ?
         POP  DE
         JRC  NX1       Nej, tag n{sta
         CALL LIBL[S    L{s sektor
         RETC           Felkod > 0
         LD   HL,245:16 Biblioteket
         LD   DE,252:16 Kassettbuffer 2
         LD   BC,240
         PUSH DE
         LDIR
         POP  HL        Filbeskrivning
         LD   (DRFIL),HL
NX3      LD   A,(HL)
         AND  A         Finns fil ?
         JRZ  NEXTFIL   Nej, hoppa
         INC  A
         JRZ  NEXTFIL
         PUSH HL
         LD   DE,4
         ADD  HL,DE     Peka p} filnamn
         EX   DE,HL
         LD   HL,255:128
         LD   (HL),"D"
         INC  HL
         LD   (HL),"R"
         INC  HL
         LD   A,(DIR16)
         LD   (HL),A
         INC  HL
         LD   (HL),":"
         INC  HL
         EX   DE,HL
         PUSH DE
         LD   BC,8
         LDIR           Spara filnamn
         LD   A,"."
         LD   (DE),A
         INC  DE
         LD   BC,3
         LDIR           Spara extension
         LD   A,13
         LD   (DE),A
         POP  DE
         CALL WILDCARD  Kolla filnamn
         POP  HL
         JPNC NEXTFIL   Passar ej
         LD   A,(255:212) Ska filstorlek
         AND  A           visas ?
         RETNZ          Nej, retur
         LD   D,(HL)    Sp}r segmrecord
         INC  HL
         LD   A,(HL)
         AND  224       Ta bort status
         LD   E,A       Sektor*32
         CALL LIBL[S    L{s segmrecord
         RETC           Felkod > 0
         LD   DE,245:4  Segmbeskrivning
         LD   HL,0      R{knare f|r
         LD   B,L       filstorleken
NX4      LD   A,(DE)
         INC  A         Fler segment ?
         JRZ  NX5       Nej, hoppa
         INC  DE        Skippa sp}radr
         LD   A,(DE)
         INC  DE
         AND  31        Maska fram antal
         INC  A         sektorer i segm
         LD   C,A
         ADD  HL,BC     \ka r{knare
         JR   NX4       N{sta segment

NX5      LD   (255:146),HL
         OR   1
         RET

DRSEKT   DW 0
DRFIL    DW 0

; LIBL[S l{ser en sektor p} skivan.
LIBL[S   PUSH DE
         PUSH BC
         PUSH HL
         CALL 96:102    L{s sektor
         POP  HL
         POP  BC
         POP  DE
         LD   A,(253:21)
         AND  A         Felkod > 0 ?
         RETZ
         SCF
         RET

TYPE     PUSH HL
         CALL CLOSE
         POP  HL
         CALL OPEN
         JPC  ERROR
         CALL 7:66
TYP1     LD   HL,BUFF6
         LD   BC,255
         LD   DE,8:147
         PUSH HL
         CALL FILCONTR  L{s in en rad
         POP  HL
         JRC  TYP3      EOF, BAC el ERR
         EX   DE,HL
         LD   (HL),10
         INC  HL
         SBC  HL,DE
         LD   C,L
         LD   B,H
         EX   DE,HL
         CALL 0:11
         CALL PAUS
         JRNC TYP1      Ej CTRL-C
TYP3     CP   186
         JRZ  TYP4      Kanske BAC-fil
         AND  A
         JPNZ ERROR     Ej EOF
         LD   DE,8:144
         CALL FILCONTR  Close
         JPC  ERROR
         CALL 7:66
         RET

TYP4     LD   L,(IX+8)
         LD   H,(IX+9)
         LD   A,(HL)
         INC  HL
         CP   130
         JRZ  TYP5
         CP   131
         JRNZ TYP3      Ej BAC-fil
TYP5     LD   A,(HL)
         AND  A
         JRZ  TYP6      Forts n{sta blk
         DEC  A
         JRZ  TYP3      Slut p} pgm
         LD   DE,BUFF6
         PUSH DE
         PUSH IX
         CALL 17:149    \vers{tt BAC-rad
         POP  IX
         EX   (SP),HL
         EX   DE,HL
         LD   (HL),10   LF sist i rad
         INC  HL
         AND  A
         SBC  HL,DE
         LD   C,L
         LD   B,H
         EX   DE,HL
         CALL 0:11
         CALL PAUS
         POP  HL        N{sta rad
         JRNC TYP5
         JR   TYP3

TYP6     LD   DE,8:153
         CALL FILCONTR  L{s n{sta block
         JRNC TYP5
         JR   TYP3

DELETE   PUSH HL
         CALL CLOSE
         POP  HL
         CALL DRIVEFIX
         LD   A,21
         JPC  ERROR
DEL1     LD   A,(WILDFLG)
         AND  A
         JRZ  DEL4      Ej wildcard
         BIT  7,A
         JRNZ DEL3      Drive initierad
         SET  7,A
         LD   (WILDFLG),A
DEL2     LD   BC,(WILDANT)
         DEC  B
         RETM           Slut p} drivear
         LD   A,C       Drivenummer
         INC  C
         LD   (WILDANT),BC
         CALL LIBINIT
         JRC  DEL2
         CALL FIRSTFIL
         JRC  DEL2
         JRZ  DEL2      Drive tom
         JR   DEL4

DEL3     CALL NEXTFIL
         JRC  DEL2
         JRZ  DEL2      N{sta drive
DEL4     LD   HL,DEL6
         LD   BC,DEL7-DEL6
         CALL 0:11
         LD   HL,255:128 Filnamn
         LD   BC,16
         PUSH HL
         CALL 0:11
         POP  HL
         RST  32
         CALL OPEN
         JRC  DEL5
         LD   DE,8:159
         CALL FILCONTR  Delete fil
DEL5     CALLC ERROR
         CALL PAUS
         RETC           CTRL-C
         LD   A,(WILDFLG)
         AND  A
         JRNZ DEL1
         RET

DEL6     DM   13,10,"delete "
DEL7

CLOSE    LD   A,(LOG)
         AND  A
         JRNZ CL1
         LD   A,(DMP)
         AND  A
         RETZ
CL1      LD   HL,CL2
         LD   BC,CL3-CL2
         CALL 0:11
         XOR  A
         LD   (LOG),A
         LD   (DMP),A
         LD   IX,FIL
         LD   DE,8:127
         CALL FILCONTR  Close
         JPC  ERROR
         CALL 7:66
         RET

CL2      DB 13,10
         DM "Closing DUMP/LOG file"
CL3

LOGG     PUSH HL
         CALL CLOSE
         POP  HL
         CALL PREPARE
         JPC  ERROR
         LD   HL,BUFF3
         LD   (LOGBUFF),HL
         LD   IX,KERMAREA
         LD   (IX+29),1 Textfil
         LD   A,255
         LD   (LOG),A
         RET

DUMP     PUSH HL
         CALL CLOSE
         POP  HL
         CALL OPEN
         JPC  ERROR
         LD   IX,KERMAREA
         XOR  A
         LD   (IX+20),A Kommando DUMP
         LD   (IX+27),A Inget data l{st
         LD   (IX+29),1 Textfil
         DEC  A
         LD   (DMP),A
         RET

SAVE     PUSH HL
         CALL CLOSE
         POP  HL
         CALL PREPBAC
         JPC  ERROR
         LD   E,(IX+8)
         LD   D,(IX+9)
         LD   A,D
         AND  A
         LD   A,52
         JPZ  ERROR     Buffer saknas
         LD   HL,SAV2
         LD   BC,SAV3-SAV2
         LDIR
         EX   DE,HL
         LD   DE,PARMAREA
         LD   B,PARMLEN
SAV1     LD   (HL),","
         INC  HL
         LD   (HL),199
         INC  HL
         LD   A,(DE)
         INC  DE
         LD   (HL),A
         INC  HL
         LD   (HL),0
         INC  HL
         LD   (HL),186
         INC  HL
         DJNZ SAV1
         EX   DE,HL
         LD   HL,SAV3
         LD   BC,SAV8-SAV3
         LDIR
         CALL 8:156     Skriv block
         CALL 8:127     St{ng filen
         RET

SAV2     DB 130         BASIC-pgm

         DB 5*1+10
         DB 10,0,134,129
         DB 199,64,254,186
         DB ",",199,0,0,186
         DB 13

         DB 5*PARMLEN+10
         DB 20,0,134,129
         DB 199,128,255,186

SAV3     DB 13

SAV4     DB SAV7-SAV4
         DB 30,0,134,145        CHAIN
         DB 203,34,SAV6-SAV5    str{ng
SAV5     DB "KERM.BAC"
SAV6     DB 187,13
SAV7     DB 1           Slut p} pgm
SAV8

PAUS     CALL 3:62
         SCF
         RETNZ          CTRL-C
         PUSH IX
         INP  56
         AND  127
         CP   32
         JRZ  PAUS1     Tangentbroms
         LD   A,(253:245)
         AND  128
         JRZ  PAUS2     Tangent ej nere
         CALL 0:2
PAUS1    CALL 0:2
PAUS2    POP  IX
         AND  A
         RET
<<< kerm5.asm >>>
; KERM5.ASM
; Anders Franz`n <5258>
; Stockholm 1987-09-24

PACKNR   DW 0
ANTBYTES DW 0
ANTBUF   DW 0
NAKNR    DW 0
KERMAREA DS 40
FIL      DS 15
         DB 0

;Ta emot en fil som s{nds med Kermit
RECEIVE  INP  58
         AND  2
         JPNZ TIMEOUT   Ingen b{rv}g
         LD   HL,KTXT1
         LD   BC,KTXT2-KTXT1
         CALL WRITE
         LD   IX,KERMAREA
         LD   (IX+0),0  Inga flaggor
         CALL RDEFAULT
         LD   A,(TIME)
         LD   (IX+12),A Default maxtid
         LD   (IX+8),1  Start CH-typ
         LD   (IX+23),0 Packetr{knare
         LD   (IX+26),"S"
RE1      LD   A,(RETRY)
         LD   (IX+20),A Max ant f|rs|k
         JR   RE3

RE2      DEC  (IX+20)
         JPZ  TIMEOUT   F|r m}nga f|rs|k
         LD   A,(IX+26)
         CP   "D"
         JRNZ RE3       V{ntar ej data
         LD   HL,(NAKNR) R{kna antalet
         INC  HL         felaktiga paket
         LD   (NAKNR),HL
         CALL SKRIVFIL
RE3      BIT  3,(IX+0)
         JPNZ TIMEOUT   ESCAPE
         LD   A,(IX+12)
         LD   (IX+21),A S{tt tid kvar
         LD   A,(IX+26)
         CP   "S"
         JPZ  RINIT     Kermitparametrar
         CP   "F"
         JPZ  RFIL      Filhuvud
         CP   "D"
         JPZ  RDATA     Data i fil
         RET            Klart

;V{nta p} Kermitparametrar
RINIT    CALL GPACK     Ta emot packet
         JPC  RE2       Fel, f|rs|k igen
         LD   A,(IX+25)
         CP   "E"
         JPZ  RERROR    Avbryt!
         CP   "S"
         JPNZ RE2       Fel packettyp
         LD   HL,KTXT2
         LD   BC,KTXT3-KTXT2
         CALL WRITE
         CALL RFIX
         LD   C,(IX+8)
         PUSH BC
         LD   (IX+8),1  CH-typ 1
         LD   (IX+24),9
         LD   (IX+25),"Y"
         CALL SPACK     Positivt svar
         POP  BC
         LD   (IX+8),C
         JPC  TIMEOUT   Time out
         LD   HL,KTXT4
         LD   BC,KTXT5-KTXT4
         CALL WRITE     Filrubrik
         LD   A,(IX+23)
         INC  A
         AND  63
         LD   (IX+23),A
         LD   (IX+26),"F"
         JP   RE1

;V{nta p} filhuvud
RFIL     CALL GPACK     Ta emot packet
         JPC  RE2       Fel, f|rs|k igen
         LD   A,(IX+25)
         CP   "S"
         JPZ  RFIL1     Oms{ndning
         CP   "Z"
         JPZ  RFIL5     Oms{ndning
         CP   "F"
         JPZ  RFIL6     Filnamn
         CP   "B"
         JPZ  RBREAK    Break
         CP   "E"
         JPZ  RERROR
         JP   FELPACK

;Behandla oms{ndning parametrar
RFIL1    LD   A,(IX+23)
         DEC  A
         CP   (IX+22)
         JPNZ RE2       Ej oms{ndning
         CALL RFIX
         LD   C,(IX+8)
         PUSH BC
         LD   (IX+8),1  CH-typ 1
         LD   (IX+24),9
         LD   (IX+25),"Y"
         CALL SPACK     Positivt svar
         POP  BC
         LD   (IX+8),C
         JPNC RE1
         JP   TIMEOUT

;Fixa parametrar att s{nda
RFIX     CALL RPARM
         LD   A,(LENGTH)
         LD   (IX+1),A
         LD   A,(TIME)
         LD   (IX+2),A
         LD   A,(NUMPAD)
         LD   (IX+3),A
         LD   A,(PADCHAR)
         LD   (IX+4),A
         LD   A,(EOL)
         LD   (IX+5),A
         LD   A,(QCTL)
         LD   (IX+6),A
         LD   (IX+7),"Y" Vi klarar av
         LD   A,(PARITET) ev QBIN
         AND  A
         JRZ  RFIX1     Paritet NONE
         LD   A,(IX+17)
         AND  A         S{ndare klarar
         JRZ  RFIX2     ej av QBIN
         LD   (IX+7),A
         CP   "Y"       S{ndare beg{r
         JRNZ RFIX2     QBIN
         LD   A,(QBIN)
         LD   (IX+7),A
         LD   (IX+17),A
         JR   RFIX2     Vi beg{r QBIN

RFIX1    LD   A,(IX+17)
         AND  A         S{ndare klarar
         JRZ  RFIX2     ej av QBIN
         LD   (IX+7),A
         CP   "Y"       S{ndare beg{r
         JRNZ RFIX2     QBIN
         LD   (IX+17),0 Ingen vill ha
RFIX2    LD   A,(CHECK)
         LD   (IX+8),A
         CP   (IX+18)
         JRZ  RFIX3     B}da har samma
         LD   (IX+8),1
         LD   (IX+18),1
RFIX3    LD   A,(IX+19)
         LD   (IX+9),A
         CALL SPARM
         RET

;Behandla oms{ndning EOF
RFIL5    LD   A,(IX+23)
         DEC  A
         CP   (IX+22)
         JPNZ RE2       Ej oms{ndning
         LD   (IX+24),0 Inget data
         LD   (IX+25),"Y"
         CALL SPACK     Positivt svar
         JPNC RE1
         JP   TIMEOUT

;Filnamn
RFIL6    LD   A,(IX+23)
         CP   (IX+22)
         JPNZ RE2       Fel packetnr
         LD   HL,0
         LD   (PACKNR),HL
         LD   (ANTBYTES),HL
         LD   (ANTBUF),HL
         LD   (NAKNR),HL
         CALL CRLF      Ny rad
         LD   HL,BUFF3  Peka p} data
         LD   DE,255:128
         LD   C,(IX+24) L{ngd filnamn
         LD   B,0
         PUSH HL
         PUSH DE
         CALL 0:65      Fixa filnamn
         POP  HL
         LD   BC,8
         CALL WRITE
         PUSH HL
         LD   HL,KTXT6
         LD   BC,1
         CALL WRITE     "."
         POP  HL
         LD   BC,3
         CALL WRITE     Extension
         CALL SKRIVFIL
         POP  HL
         LD   (IX+37),0 Ej CTRL-XZ {nnu
         SET  5,(IX+0)  Till}t CTRL-XZ
         PUSH HL
         LD   E,(IX+24) L{ngd data
         LD   D,0
         ADD  HL,DE
         LD   (HL),13   Slut p} filnamn
         POP  HL        Pekar p} filnamn
         LD   DE,(FILPEK)
         LD   A,(DE)
         CP   13
         JRZ  RFIL7
         EX   DE,HL     Lokalt filnamn
RFIL7    LD   A,(ACCESS)
         AND  A         Strunta i om
         JRZ  RFIL8     filen finns
         PUSH HL
         PUSH IX
         CALL OPEN
         POP  IX
         POP  HL        Pekar p} filnamn
         JRNC RFIL9     Filen finns!
         AND  127
         CP   21
         JPNZ FELFIL    Annat fel
RFIL8    PUSH IX
         CALL PREPARE
         POP  IX
         JPNC RFIL13    Det gick bra
         JP   FELFIL

RFIL9    LD   A,(ACCESS)
         CP   1
         JRZ  RFIL12    Kill
         LD   HL,RFIL10
         LD   BC,RFIL12-RFIL10
         CALL WRITE
         LD   HL,RFIL11
         LD   BC,RFIL12-RFIL11
         LD   (IX+24),C
         LD   DE,BUFF4
         LDIR
         LD   (IX+25),"E"
         CALL SPACK     Error!
         JP   AVBRYT

RFIL10   DM 13,10,7
RFIL11   DM "File already "
         DM "exists on disk"

RFIL12   PUSH HL
         PUSH IX
         LD   IX,FIL
         LD   DE,8:159
         CALL FILCONTR  Kill
         POP  IX
         POP  HL        Pekar p} filnamn
         JPNC RFIL8     Forts{tt...
         JP   FELFIL

RFIL13   LD   HL,(ANTBUF)
         INC  HL
         LD   (ANTBUF),HL
         CALL SKRIVFIL
         LD   (IX+29),0 Filtyp ok{nd
         LD   (IX+24),0
         LD   (IX+25),"Y"
         LD   A,(IX+37)
         AND  A
         JRZ  RFIL14    Ej CTRL-XZ
         LD   (BUFF4),A S{nd tkn i ACK!
         INC  (IX+24)   L{ngd ett
         SET  4,(IX+0)  V{nta p} Z-pack
         RES  5,(IX+0)  F|rbjud CTRL-XZ
RFIL14   CALL SPACK     Positivt svar
         JPC  TIMEOUT
         LD   HL,(PACKNR)
         INC  HL
         LD   (PACKNR),HL
         CALL SKRIVFIL
         LD   A,(IX+23)
         INC  A
         AND  63
         LD   (IX+23),A
         LD   (IX+26),"D"
         JP   RE1

;Break
RBREAK   LD   A,(IX+23)
         CP   (IX+22)
         JPNZ RE2       Fel packetnr
         LD   (IX+24),0
         LD   (IX+25),"Y"
         CALL SPACK     Positivt svar
         JPC  TIMEOUT
         LD   (IX+26),"C"
         JP   RE1

RDATA    CALL GPACK     Ta emot packet
         JPC  RE2       Fel, f|rs|k igen
         LD   A,(IX+25)
         CP   "Z"
         JPZ  REOF      EOF
         CP   "E"
         JPZ  RERROR
         BIT  4,(IX+0)  S{ndaren klarar
         JPNZ REOF1     inte av CTRL-XZ
         CP   "D"
         JPZ  RDATA1    Data
         CP   "F"
         JPZ  RDATA3    Oms{ndning
         JP   FELPACK

;Data i fil
RDATA1   LD   A,(IX+23)
         CP   (IX+22)
         JRNZ RDATA3    Fel packetnr
         CALL UNPACK    Packa upp data
         JPC  FELFIL    Fel vid skrivn
         LD   HL,(PACKNR)
         INC  HL
         LD   (PACKNR),HL
         CALL SKRIVFIL
         LD   (IX+24),0
         LD   (IX+25),"Y"
         LD   A,(IX+37)
         AND  A
         JRZ  RDATA2    Ej CTRL-XZ
         LD   (BUFF4),A S{nd tkn i ACK!
         INC  (IX+24)   L{ngd ett
         SET  4,(IX+0)  V{nta p} Z-pack
         RES  5,(IX+0)  F|rbjud CTRL-XZ
RDATA2   CALL SPACK     Positivt svar
         JPC  TIMEOUT
         LD   A,(IX+23)
         INC  A
         AND  63
         LD   (IX+23),A
         JP   RE1

;Behandla oms{ndning filnamn el data
RDATA3   LD   A,(IX+23)
         DEC  A
         CP   (IX+22)
         JPNZ RE2       Ej oms{ndning
         LD   (IX+24),0
         LD   (IX+25),"Y"
         CALL SPACK     Positivt svar
         JPNC RE1
         JP   TIMEOUT

;End Of File
REOF     LD   A,(IX+23)
         CP   (IX+22)
         JPNZ RE2       Fel packetnr
         RES  5,(IX+0)  F|rbjud CTRL-XZ
         BIT  4,(IX+0)
         JRZ  REOF2     Ej CTRL-XZ
         LD   A,(IX+24) L{ngd packet
         AND  A
         JRZ  REOF1     Tom
         DEC  A
         JRNZ REOF1     Mer {n ett tkn
         LD   A,(BUFF3) Data i packet
         CP   "D"
         JRNZ REOF1     Ej "avbryt"
         RES  4,(IX+0)  CTRL-XZ funkade
REOF1    PUSH IX
         LD   IX,FIL
         LD   DE,8:159
         CALL FILCONTR  Kill
         POP  IX
         JPC  FELFIL
         LD   A,32
         LD   (253:244),A
         LD   HL,KTXT7
         LD   BC,KTXT8-KTXT7
         CALL WRITE
         BIT  4,(IX+0)
         JRZ  REOF6     CTRL-XZ funkade
         LD   HL,REOF7
         LD   BC,REOF8-REOF7
         LD   DE,BUFF4
         LD   (IX+24),C
         LDIR
         LD   (IX+25),"E"
         CALL SPACK     Error!
         JP   AVBRYT

REOF2    LD   A,(IX+29) Typ av fil
         PUSH IX
         LD   IX,FIL
         CP   1
         JRZ  REOF3     Textfil
         BIT  7,(IX+14)
         JRZ  REOF4     Buffert tom
         CALL 8:156     Skriv buffert
         RES  7,(IX+14) Buffert tom
REOF3    LD   HL,(ANTBUF)
         INC  HL
         LD   (ANTBUF),HL
REOF4    LD   DE,8:127
         CALL FILCONTR  Close
         POP  IX
         JRNC REOF5
         CALL SKRIVERR
         JR   REOF6

REOF5    LD   A,32
         LD   (253:244),A
         LD   HL,KTXT5
         LD   BC,KTXT6-KTXT5
REOF6    CALL WRITE
         LD   (IX+24),0
         LD   (IX+25),"Y"
         CALL SPACK     Positivt svar
         JPC  TIMEOUT
         LD   A,(IX+23)
         INC  A
         AND  63
         LD   (IX+23),A
         LD   (IX+26),"F"
         JP   RE1

REOF7    DM "User interrupt"
REOF8

;Skriv data p} fil
PUTFIL   LD   A,(IX+29) Typ av fil
         CP   1
         JRZ  PF2       Textfil
         CP   2
         JRZ  PF5       Bin{rfil
         LD   A,(FILE)
         AND  A
         JRZ  PF1       Textfil
         CP   1
         JRZ  PF4       Bin{rfil
         LD   A,(HL)    Annars unders|k
         AND  A         byte i filen!
         JRZ  PF4       ABS-fil
         CP   128
         JRNC PF4       Annan bin{rfil
PF1      LD   (IX+29),1 Typ textfil
PF2      PUSH IX
         LD   IX,FIL
         LD   E,(IX+13)
         PUSH DE
         LD   DE,8:150
         CALL FILCONTR  Skriv rad
         POP  DE
         POP  IX
         RETC
         LD   A,(FIL+13)
         CP   E
         CCF
         RETNC
         LD   HL,(ANTBUF)
         INC  HL
         LD   (ANTBUF),HL
         AND  A
         RET

PF4      LD   (IX+29),2 Typ bin{rfil
         PUSH IX
         LD   IX,FIL
         INC  (IX+13)
         LD   A,(IX+9)
         POP  IX
         AND  A
         LD   A,52      ERR 52
         SCF
         RETZ           Buffert saknas
PF5      PUSH IX
         LD   IX,FIL
         LD   E,(IX+10) Position i buff
         LD   D,(IX+11)
PF6      LD   A,B
         OR   C
         JRZ  PF7
         LDI            L{gg tkn i buff
         SET  7,(IX+14) Data i buffert
         DEC  (IX+13)   Kvar i buffert
         JRNZ PF6       Buffert ej full
         PUSH HL
         PUSH BC
         CALL 8:156     Skriv buffert
         LD   HL,(ANTBUF)
         INC  HL
         LD   (ANTBUF),HL
         POP  BC
         POP  HL
         RES  7,(IX+14) Buffert tom
         INC  (IX+13)
         JR   PF6

PF7      LD   (IX+10),E
         LD   (IX+11),D
         POP  IX
         RET

KTXT1    DB 13,10
         DM "Waiting for init packet",13
KTXT2    DM "Init packet received   ",13
KTXT3    DB 13,10
         DM "Sending init packet",13
KTXT4    DM "filename      bad "
         DM "pkt bytes blk status"
KTXT5    DM "OK    "
KTXT6    DM "."
KTXT7    DM "FLUSH "
KTXT8    DM "ERR "
KTXT9    DM "("
KTXT10   DM ")"


;Visa text i errorpacket p} sk{rm
RERROR   LD   HL,RERR1
         LD   BC,RERR2-RERR1
         CALL WRITE
         LD   HL,BUFF3  Peka p} data
         LD   C,(IX+24) L{ngd data
         LD   B,0
         CALL WRITE     Skriv text
         JP   AVBRYT

RERR1    DM 13,10
         DM "Received message:"
         DM 13,10
RERR2    EQU  $

;Fel vid filhantering, s{nd error
FELFIL   PUSH AF
         CALL SKRIVERR  Skriv p} sk{rm
         POP  AF
         LD   (IX+24),0
         OR   128
         LD   HL,FELF4
         LD   BC,FELF5-FELF4
         CPIR
         JRNZ FELF3
         DEC  HL        Peka p} kod
FELF1    INC  HL
         BIT  7,(HL)
         JRNZ FELF1     Skippa highbyte
         PUSH HL
         LD   BC,0
FELF2    INC  HL
         INC  BC
         BIT  7,(HL)
         JRZ  FELF2
         POP  HL
         LD   (IX+24),C
         LD   DE,BUFF4
         LDIR
FELF3    LD   (IX+25),"E"
         CALL SPACK     Error!
         JP   AVBRYT

FELF4    DM 128+21
         DM "Can't find file"
         DM 128+35
         DM 128+36
         DM 128+37
         DM 128+38
         DM 128+44
         DM 128+45
         DM 128+46
         DM 128+47
         DM 128+48
         DM 128+49
         DM "I/O-error"
         DM 128+39
         DM 128+43
         DM "Writeprotection"
         DM 128+41
         DM "Disk full"
         DM 128+42
         DM "Disk not ready"
         DM 255
FELF5    EQU  $

FELPACK  LD   HL,FPK1
         LD   BC,FPK3-FPK1
         CALL WRITE
         LD   HL,FPK2
         LD   BC,FPK3-FPK1
         LD   (IX+24),C
         LD   DE,BUFF4
         LDIR
         LD   (IX+25),"E"
         CALL SPACK     S{nd error
         JR   AVBRYT

FPK1     DM 10,13
FPK2     DM "Wrong packet received"
FPK3     EQU  $

TIMEOUT  INP  58
         AND  2
         LD   HL,TIM2
         LD   BC,TIM3-TIM2
         JRNZ TIM1      Ingen b{rv}g
         BIT  3,(IX+0)
         LD   HL,TIM3
         LD   BC,TIM4-TIM3
         JRNZ TIM1      ESCAPE nedtryckt
         LD   HL,TIM4
         LD   BC,TIM5-TIM4
TIM1     CALL 0:11
AVBRYT   PUSH IX
         LD   IX,FIL
         LD   DE,8:127
         CALL FILCONTR  Close
         POP  IX
         CALLC SKRIVERR
         LD   (IX+26),"A"
         SCF
         RET

TIM2     DM 13,10,7,"No connection"
TIM3     DM 13,10,7,"Abort"
TIM4     DM 13,10,7,"Timeout"
TIM5     EQU $
<<< kerm6.asm >>>
; KERM6.ASM
; Anders Franz`n <5258>
; Stockholm 1987-09-13


;S{nd en eller flera fil med Kermit
SEND     INP  58
         AND  2
         JPNZ TIMEOUT   B{rv}g saknas
         LD   HL,KTXT3
         LD   BC,KTXT4-KTXT3
         CALL WRITE
         LD   IX,KERMAREA
         LD   (IX+0),0
         LD   (IX+23),0 Packetr{knare
         LD   A,(LENGTH)
         LD   (IX+1),A
         LD   A,(TIME)
         LD   (IX+2),A
         LD   A,(NUMPAD)
         LD   (IX+3),A
         LD   A,(PADCHAR)
         LD   (IX+4),A
         LD   A,(EOL)
         LD   (IX+5),A
         LD   A,(QCTL)
         LD   (IX+6),A
         LD   (IX+7),"Y"
         LD   A,(PARITET)
         AND  A
         JRZ  SE1       Paritet NONE
         LD   A,(QBIN)
         LD   (IX+7),A  Vi beg{r QBIN
SE1      LD   A,(CHECK)
         LD   (IX+8),A
         LD   A,(REPT)
         LD   (IX+9),A
         CALL RDEFAULT
         CALL SPARM
         LD   C,(IX+8)
         PUSH BC
         LD   (IX+8),1  CH-typ 1
         LD   (IX+24),9
         LD   (IX+25),"S"
         CALL PPACK     S{nd parametrar
         POP  BC
         LD   (IX+8),C
         JPC  TIMEOUT   Time out
         CALL RPARM
         LD   A,(PARITET)
         AND  A
         JRZ  SE2       Paritet NONE
         LD   A,(IX+17)
         CP   (IX+7)
         JRZ  SE3       B}da vill QBIN
         CP   "Y"
         JRZ  SE3
         LD   (IX+7),0  Mottagaren
         JR   SE3       klarar ej QBIN

SE2      LD   (IX+7),0
         LD   A,(IX+17)
         AND  A         S{ndare klarar
         JRZ  SE3       ej QBIN
         CP   "Y"
         JRZ  SE3       Ingen vill QBIN
         LD   (IX+7),A  S{ndare vill
SE3      LD   A,(IX+8)
         CP   (IX+18)
         JRZ  SE4
         LD   (IX+8),1
         LD   (IX+18),1
SE4      LD   A,(IX+9)
         CP   (IX+19)
         JRZ  SE5
         LD   (IX+9),0
         LD   (IX+19),0
SE5      LD   HL,KTXT4
         LD   BC,KTXT5-KTXT4
         CALL WRITE     Skriv filrubrik
SE6      CALL CRLF      Ny rad
         LD   HL,0
         LD   (PACKNR),HL
         LD   (ANTBYTES),HL
         LD   (ANTBUF),HL
         LD   (NAKNR),HL
         LD   A,(WILDFLG)
         AND  A
         JRZ  SE9       Ej wildcard
         BIT  7,(IX+0)
         JRNZ SE8       Drive initierad
         SET  7,(IX+0)
         XOR  A
         LD   (255:212),A Filstorlek
SE7      LD   BC,(WILDANT)
         DEC  B
         JPM  SE20      Slut p} drivear
         LD   A,C       Drivenummer
         INC  C
         LD   (WILDANT),BC
         CALL LIBINIT
         JRC  SE7
         CALL FIRSTFIL
         JRC  SE7
         JRZ  SE7       Drive tom
         JR   SE9

SE8      CALL NEXTFIL
         JRC  SE7
         JRZ  SE7       N{sta drive
SE9      LD   HL,255:132 Fil utan enhet
         LD   DE,BUFF4
         LD   (IX+24),-1 L{ngd data
         LD   BC,(FILPEK)
         LD   A,(BC)
         CP   13
         JRZ  SE10      Samma fil remote
         LD   L,C
         LD   H,B
SE10     RST  32
         INC  HL
         LD   (DE),A    Kopiera filnamn
         INC  DE
         INC  (IX+24)   R{kna antal tkn
         CP   13
         JRNZ SE10
         LD   HL,255:132 Fil utan enhet
         LD   BC,12     L{ngd filnamn
         CALL WRITE     Skriv filnamn
         CALL SKRIVFIL
         LD   A,(WILDFLG)
         AND  A
         JRZ  SE11      Ej wildcard
         LD   A,32+1
         LD   (253:244),A
         LD   HL,KTXT9
         LD   BC,1
         CALL WRITE     "("
         LD   A,(DEBUG)
         DEC  A
         LD   HL,(255:146)
         CALLNZ SKRIVTAL Filstorlek
         LD   HL,KTXT10
         LD   BC,1
         CALL WRITE     ")"
SE11     LD   HL,255:128 Filnamn
         RST  32
         PUSH IX
         CALL OPEN
         POP  IX
         JRNC SE12      Det gick bra
         CALL SKRIVERR
         LD   A,(WILDFLG)
         AND  A         Wildcard?
         JPNZ SE6       Ja, n{sta fil
         JP   SE20      S{nd BREAK

SE12     LD   (IX+37),0 Ej CTRL-XZ {nnu
         SET  5,(IX+0)  Till}t CTRL-XZ
         LD   (IX+27),0 Inget data l{st
         LD   (IX+29),0 Ok{nd filtyp
         LD   (IX+25),"F"
         CALL PPACK     S{nd filhuvud
         JPC  TIMEOUT   Time out
         LD   HL,1
         LD   (ANTBUF),HL
         CALL SKRIVFIL
SE13     LD   A,(IX+37)
         AND  A
         JPNZ SE18      Hoppa om CTRL-XZ
         CALL PACK      Packa data
         JRC  SE15      EOF eller ERROR
         LD   (IX+25),"D"
         CALL PPACK     S{nd data
         JPC  TIMEOUT   Time out
         CALL SKRIVFIL
         LD   A,(IX+24)
         AND  A
         JRZ  SE13      Inget data i ACK
         DEC  A
         JRNZ SE13      Mer {n ett tkn
         LD   A,(BUFF3)
         CP   "X"
         JRZ  SE14      X i ACK
         CP   "Z"
         JRNZ SE13      Ej Z i ACK
SE14     RES  5,(IX+0)  F|rbjud CTRL-XZ
         LD   (IX+37),A
         JP   SE18

SE15     AND  A
         JRZ  SE16      EOF
         CALL SKRIVERR  Annat fel
         JR   SE18

SE16     LD   A,(IX+24)
         AND  A
         JRZ  SE17      Inget mer data
         LD   (IX+25),"D"
         CALL PPACK     S{nd sista data
         JPC  TIMEOUT   Time out
         CALL SKRIVFIL
SE17     LD   A,32
         LD   (253:244),A
         LD   HL,KTXT5
         LD   BC,KTXT6-KTXT5
         CALL WRITE     Skriv sluttext
SE18     PUSH IX
         LD   IX,FIL
         LD   DE,8:127
         CALL FILCONTR  Close
         POP  IX
         CALLC SKRIVERR
         RES  5,(IX+0)  F|rbjud CTRL-XZ
         LD   (IX+24),0
         LD   (IX+25),"Z"
         LD   A,(IX+37)
         AND  A
         JRZ  SE19      Ej CTRL-XZ
         LD   A,32
         LD   (253:244),A
         LD   HL,KTXT7
         LD   BC,KTXT8-KTXT7
         CALL WRITE     Skriv avbryttext
         LD   A,"D"
         LD   (BUFF4),A
         INC  (IX+24)
SE19     CALL PPACK     S{nd EOF
         JPC  TIMEOUT
         LD   A,(IX+37)
         CP   "Z"
         JRZ  SE20      Skippa batch
         LD   A,(WILDFLG)
         AND  A         Wildcard?
         JPNZ SE6       Ja, n{sta fil
SE20     LD   (IX+24),0
         LD   (IX+25),"B"
         CALL PPACK     S{nd BRAKE
         JPC  TIMEOUT
         RET            Klart!

;H{mta ett tecken fr}n fil
;Carry s{tts om EOF eller ERROR
GETFIL   LD   A,(IX+27)
         AND  A
         JPNZ GF9       Data i buffert
         LD   A,(IX+29) Typ av fil
         CP   1
         JRZ  GF1       Textfil
         CP   2
         JPZ  GF7       Bin{rfil
         LD   A,(FILE)
         AND  A
         JRZ  GF1       Textfil
         CP   1
         JRZ  GF7       Bin{rfil
         PUSH IX        Annars unders|k
         LD   IX,FIL    filen...
         LD   L,(IX+10)
         PUSH HL
         LD   HL,BUFF7
         LD   BC,255
         LD   DE,8:147
         CALL FILCONTR  L{s rad
         POP  HL
         JRC  GF5       Kanske bin{rfil
         JR   GF2       Annars textfil!

GF1      PUSH IX
         LD   IX,FIL
         LD   L,(IX+10)
         PUSH HL
         LD   HL,BUFF7
         LD   BC,255
         LD   DE,8:147
         CALL FILCONTR  L{s rad
         POP  HL
         JRC  GF6       End of file
GF2      LD   A,L
         CP   (IX+10)
         JRC  GF3
         LD   HL,(ANTBUF)
         INC  HL
         LD   (ANTBUF),HL
GF3      POP  IX
         EX   DE,HL
         LD   A,(IX+20)
         AND  A
         JRZ  GF4       Hoppa om DUMP
         LD   (HL),10   Avsluta med LF
         INC  HL        om Kermit
GF4      LD   DE,BUFF7
         SBC  HL,DE
         EX   DE,HL
         LD   (IX+27),E L{ngd p} rad
         LD   (IX+29),1 Textfil
         LD   (IX+32),L
         LD   (IX+33),H
         JR   GF9

GF5      CP   186
         JRZ  GF8       Ogiltigt tecken
         AND  A
         JRZ  GF8       EOF dvs ABS-fil
GF6      POP  IX
         SCF
         RET            EOF eller ERROR

GF7      PUSH IX
         LD   IX,FIL
         LD   DE,8:153
         CALL FILCONTR  L{s buffert
         LD   HL,(ANTBUF)
         INC  HL
         LD   (ANTBUF),HL
         JRNC GF8       Inget fel
         POP  IX
         CP   38
         SCF
         RETNZ
         LD   A,0
         RET            Slut p} fil

GF8      LD   L,(IX+8)  Adress till
         LD   H,(IX+9)  buffert
         POP  IX
         LD   (IX+27),253 L{ngd p} rad
         LD   (IX+29),2 Bin{rfil
         LD   (IX+32),L
         LD   (IX+33),H
GF9      LD   L,(IX+32)
         LD   H,(IX+33)
         LD   A,(HL)
         INC  HL
         LD   (IX+32),L
         LD   (IX+33),H
         DEC  (IX+27)
         LD   HL,(ANTBYTES)
         INC  HL
         LD   (ANTBYTES),HL
         AND  A
         RET

;S{nd packet, om negativt svar sker
;oms{ndning. Om f|r m}nga f|rs|k eller
;timeout sker retur med carry.
PPACK    LD   A,(INBUFF)
         LD   (INPOS),A T|m inputbuffer
         LD   A,(RETRY)
         INC  A
         LD   (IX+20),A Max ant f|rs|k
         LD   A,(IX+24)
         LD   (IX+30),A L{ngd data
         LD   A,(IX+25)
         LD   (IX+31),A Typ att s{nda
PPK1     BIT  3,(IX+0)
         RETNZ          ESCAPE
         DEC  (IX+20)
         SCF
         RETZ           F|r m}nga f|rs|k
         LD   A,(IX+12)
         LD   (IX+21),A S{tt tid kvar
         LD   A,(IX+23)
         LD   (IX+22),A Packetnr
         LD   A,(IX+30)
         LD   (IX+24),A L{ngd data
         LD   A,(IX+31)
         LD   (IX+25),A Typ att s{nda
         CALL SPACK     S{nd packet
         JRC  PPK1      Fel, f|rs|k igen
         CALL RPACK     Ta emot svar
         JRC  PPK5      Fel, r{kna fel
         LD   A,(IX+25)
         CP   "Y"
         JRZ  PPK2
         CP   "N"
         JRZ  PPK4
         CP   "E"
         JPZ  RERROR
         JP   FELPACK

PPK2     LD   A,(IX+22)
         CP   (IX+23)
         JRNZ PPK5      Fel packetnr
PPK3     LD   A,(IX+23)
         INC  A
         AND  63        Clear carry!
         LD   (IX+23),A
         LD   HL,(PACKNR)
         INC  HL
         LD   (PACKNR),HL
         RET

PPK4     LD   A,(IX+22)
         DEC  A         NAK n+1 tolkas
         CP   (IX+23)   som ACK n!
         JRZ  PPK3
         INC  A
         CP   (IX+23)
         JPNZ FELPACK   Fel packetnr
PPK5     LD   A,(IX+31) Typ att s{nda
         CP   "F"
         JRZ  PPK6
         CP   "D"
         JRZ  PPK6
         CP   "Z"
         JPNZ PPK1
PPK6     LD   HL,(NAKNR)
         INC  HL
         LD   (NAKNR),HL
         CALL SKRIVFIL
         JP   PPK1      Oms{ndning

SKRIVFIL LD   A,(DEBUG)
         DEC  A
         RETZ
         LD   A,13
         LD   (253:244),A
         LD   HL,(NAKNR)
         LD   A,4
         LD   DE,SPACE
         CALL SKRTAL
         LD   HL,(PACKNR)
         LD   A,4
         LD   DE,SPACE
         CALL SKRTAL
         LD   HL,(ANTBYTES)
         LD   A,6
         LD   DE,SPACE
         CALL SKRTAL
         LD   HL,(ANTBUF)
         LD   A,4
         LD   DE,SPACE
         CALL SKRTAL
         RET

SKRIVERR AND  127
         LD   L,A
         LD   H,0
         LD   A,(DEBUG)
         DEC  A
         RETZ
         PUSH HL
         CALL SKRIVFIL
         LD   A,32
         LD   (253:244),A
         LD   HL,KTXT8
         LD   BC,KTXT9-KTXT8
         CALL 0:11      Skriv ERR
         POP  HL
         CALL SKRIVTAL  Skriv felkod
         RET

WRITE    LD   A,(DEBUG)
         DEC  A
         CALLNZ 0:11
         RET

CRLF     LD   A,(DEBUG)
         DEC  A
         CALLNZ 7:66
         RET

;filename      bad pkt bytes blk status
;L]NGRAD .BAC    0  12  1234  12 (15)
;L]NGRAD .BAC    0  13  1235  12 ERR 48
;L]NGRAD .TXT    0   5   234   4 OK
<<< kerm7.asm >>>
; KERM7.ASM
; Anders Franz`n <5258>
; Stockholm 1987-09-24
; Uppdaterad 1990-01-07 J. Westman <5074>
; Skicka SP i respons paketet om ingen REPT
; Uppdaterad 1990-01-08 J. Westman <5074>
; Ingen REPT om ej valt, i s{ndning

;Spara mottagna parametrar
RPARM    CALL RDEFAULT
         LD   A,(IX+24) L{ngd packet
         AND  A
         RETZ           L{ngd = 0
         LD   HL,BUFF3  Mottaget data
         LD   A,(HL)
         INC  HL
         CP   33
         JRC  RPM1
         SUB  32
         LD   (IX+11),A MAXL
RPM1     LD   A,(IX+24)
         CP   2
         RETC           L{ngd < 2
         LD   A,(HL)
         INC  HL
         CP   33
         JRC  RPM2
         SUB  32
         LD   (IX+12),A TIME
RPM2     LD   A,(IX+24)
         CP   3
         RETC           L{ngd < 3
         LD   A,(HL)
         INC  HL
         CP   33
         JRC  RPM3
         SUB  32
         LD   (IX+13),A NPAD
RPM3     LD   A,(IX+24)
         CP   4
         RETC           L{ngd < 4
         LD   A,(HL)
         INC  HL
         CP   33
         JRC  RPM4
         XOR  64
         LD   (IX+14),A PADC
RPM4     LD   A,(IX+24)
         CP   5
         RETC           L{ngd < 5
         LD   A,(HL)
         INC  HL
         CP   33
         JRC  RPM5
         SUB  32
         LD   (IX+15),A EOL
RPM5     LD   A,(IX+24)
         CP   6
         RETC           L{ngd < 6
         LD   A,(HL)
         INC  HL
         CP   33
         JRC  RPM6
         LD   (IX+16),A QCTL
RPM6     LD   A,(IX+24)
         CP   7
         RETC           L{ngd < 7
         LD   A,(HL)
         INC  HL
         CP   33
         JRC  RPM8
         CP   "Y"
         JRZ  RPM7
         CP   127
         JRNC RPM8
         CP   96
         JRNC RPM7
         CP   63
         JRNC RPM8
RPM7     LD   (IX+17),A QBIN
RPM8     LD   A,(IX+24)
         CP   8
         RETC           L{ngd < 8
         LD   A,(HL)
         INC  HL
         SUB  48
         CP   1
         JRC  RPM9
         CP   3
         JRNC RPM9
         LD   (IX+18),A CHKT
RPM9     LD   A,(IX+24)
         CP   9
         RETC           L{ngd < 9
         LD   A,(HL)
         CP   33
         RETC
         CP   127
         RETNC
         CP   96
         JRNC RPM10
         CP   63
         RETNC
RPM10    LD   (IX+19),A REPT
         RET

;Defaultparametrar "andra sidan"
RDEFAULT LD   (IX+11),80 Default MAXL
         LD   (IX+12),5          TIME
         LD   (IX+13),0          NPAD
         LD   (IX+14),0          PADC
         LD   (IX+15),13         EOL
         LD   (IX+16),"#"        QCTL
         LD   (IX+17),0          QBIN
         LD   (IX+18),1          CHKT
         LD   (IX+19),0          REPT
         RET

;S{tt egna parametrar
SPARM    LD   HL,BUFF4
         LD   A,(IX+1)  Maxl{ngd packet
         ADD  32
         LD   (HL),A
         INC  HL
         LD   A,(IX+2)  Timeout
         ADD  32
         LD   (HL),A
         INC  HL
         LD   A,(IX+3)  Antal PAD-tkn
         ADD  32
         LD   (HL),A
         INC  HL
         LD   A,(IX+4)  PAD-tkn
         XOR  64
         LD   (HL),A
         INC  HL
         LD   A,(IX+5)  EOL-tkn
         ADD  32
         LD   (HL),A
         INC  HL
         LD   A,(IX+6)  QCTL-tkn
         LD   (HL),A
         INC  HL
         LD   A,(IX+7)  QBIN-tkn
         LD   (HL),A
         INC  HL
         LD   A,(IX+8)  Checksummetyp
         ADD  48
         LD   (HL),A
         INC  HL
         LD   A,(IX+9)  REPEAT-tkn
         OR   A
         JR   NZ,SPA1
         LD   A,32
SPA1     LD   (HL),A
         RET

;Ta emot en packet. Om checksumman {r
;fel s{nds negativt svar. Carry vid
;retur betyder att nytt f|rs|k ska
;g|ras.
GPACK    CALL RPACK     Ta emot packet
         RETNC          Inget fel
         BIT  3,(IX+0)
         RETNZ          ESCAPE
         LD   A,(IX+20)
         DEC  A
         SCF
         RETZ           Sista f|rs|ket
         LD   A,(IX+23)
         LD   (IX+22),A Packetnr
         LD   (IX+24),0 L{ngd data
         LD   (IX+25),"N"
         CALL SPACK     Negativt svar
         SCF
         RET

;Ta emot en packet
RPACK    CALL RCHAR
         RETC           Time out!
         LD   BC,(MARKER)
         CP   C
         JRNZ RPACK     V{nta p} SOH...
         LD   HL,0      Checksumma
         CALL RCHAR
         RETC           Time out!
         SUB  34
         SUB  (IX+8)
         LD   (IX+24),A L{ngd p} data
         CALL RCHAR
         RETC           Time out!
         SUB  32
         LD   (IX+22),A Packetnr
         CALL RCHAR
         RETC           Time out
         LD   (IX+25),A Typ av packet
         CP   "S"
         JRNZ RPK1
         LD   A,(IX+8)
         CP   1
         JRZ  RPK1
         INC  (IX+24)
RPK1     LD   A,(DEBUG)
         DEC  A
         LD   A,"R"
         CALLZ DEBRUB
         LD   A,(IX+24) L{ngd data
         AND  A
         JRZ  RPK3      Inget data
         LD   B,A
         LD   DE,BUFF3
RPK2     PUSH DE
         PUSH BC
         CALL RCHARD    H{mta datatkn
         POP  BC
         POP  DE
         RETC           Time out!
         LD   (DE),A    Spara tecken
         INC  DE
         DJNZ RPK2
RPK3     PUSH HL
         CALL RCHAR     H{mta checksumma
         POP  HL
         RETC           Time out!
         LD   E,A
         LD   A,(IX+25)
         CP   "S"
         JRZ  RPK4      Packettyp S
         LD   A,(IX+8)
         CP   1
         JRZ  RPK4      CH-typ 1
         PUSH HL        Annars CH-typ 2
         PUSH DE
         CALL RCHAR
         POP  DE
         POP  HL
         RETC           Time out!
         LD   D,A
         LD   A,L
         AND  63
         ADD  32
         CP   D
         SCF
         RETNZ          Fel checksumma
         LD   A,H
         RLC  L
         RLA
         RLC  L
         RLA            A = HL/64
         AND  63
         ADD  32
         CP   E
         JRZ  RPK5
         SCF
         RET            Fel checksumma

RPK4     LD   A,L
         AND  192
         RLCA
         RLCA           A = A/64
         AND  3         A = A/64
         ADD  L
         AND  63
         ADD  32
         CP   E
         SCF
         RETNZ          Fel checksumma
RPK5     CALL RCHAR     EOL
         RET

RCHARD   CALL RCHAR
         RETC
         LD   A,(DEBUG)
         DEC  A
         LD   A,E
         RETNZ
         LD   (SLASK),A
         CALL DEBCHAR
         LD   A,(SLASK)
         AND  A
         RET

;V{nta p} tecken fr}n V24
RCHAR    LD   B,50
         LD   A,(253:240)
         LD   C,A
RCH1     LD   A,(253:240)
         CP   C
         JRZ  RCH2      Klocka ej r|rd
         LD   C,A
         DJNZ RCH2      Klocka p} 50Hz
         LD   B,50
         XOR  A
         DEC  (IX+21)   Minska tid kvar
         SCF
         RETZ           Maxtid
RCH2     INP  58
         AND  2
         SCF
         RETNZ          B{rv}g saknas!
         CALL EVBRYT    Kolla CTRL-X/Z
         BIT  3,(IX+0)
         SCF
         RETNZ          ESCAPE nedtryckt
         PUSH HL
         CALL MOTTAG    Mottaget tkn?
         POP  HL
         JRNC RCH1      Nej, v{nta...
         LD   E,A
         LD   D,0
         LD   A,(PARITET)
         AND  A
         JRZ  RCH3      Paritet NONE
         RES  7,E       Sl{ck paritet
RCH3     ADD  HL,DE     \ka checksumma
         LD   A,(DEBUG)
         CP   2
         LD   A,E
         CALLZ DITTO
         AND  A         Clear carry
         RET

;S{nd iv{g en packet
SPACK    LD   A,(PAUSE)
         AND  A
         JRZ  SPK4      Ingen paus
         LD   HL,253:240
         LD   C,A       Antal tiondelar
SPK1     LD   B,5
SPK2     LD   A,(HL)
SPK3     CP   (HL)
         JRZ  SPK3    V{nta 1/50 sek
         DJNZ SPK2    V{nta 1/10 sek
         DEC  C
         JRNZ SPK1    Fler tiondelar
SPK4     LD   A,(DEBUG)
         DEC  A
         LD   A,"S"
         CALLZ DEBRUB
         LD   A,(IX+13) Antal PAD-tkn
         AND  A
         JRZ  SPK6      Inga PAD-tkn
         LD   B,A
SPK5     LD   A,(IX+14) PAD-tkn
         CALL SCHAR
         RETC           B{rv}g saknas
         DJNZ SPK5
SPK6     LD   A,(MARKER)
         CALL SCHAR     SOH
         RETC
         LD   A,(IX+24)
         ADD  (IX+8)
         ADD  34
         LD   L,A
         LD   H,0
         CALL SCHAR     L{ngd data
         RETC
         LD   A,(IX+22) Nummer p} packet
         ADD  32
         LD   E,A
         LD   D,0
         ADD  HL,DE
         CALL SCHAR
         RETC
         LD   A,(IX+25) Typ av packet
         LD   E,A
         LD   D,0
         ADD  HL,DE
         CALL SCHAR
         RETC
         LD   A,(IX+24) L{ngd data
         AND  A
         JRZ  SPK8      Inget data
         LD   B,A
         LD   DE,BUFF4  Pekar p} data
SPK7     LD   A,(DE)
         INC  DE
         PUSH DE
         LD   E,A
         LD   D,0
         ADD  HL,DE     R{kna checksumma
         POP  DE
         CALL SCHARD    S{nd datatkn
         RETC
         DJNZ SPK7
SPK8     LD   A,(IX+25)
         CP   "S"
         JRZ  SPK9      Packettyp S
         LD   A,(IX+8)
         CP   1
         JRZ  SPK9      CH-typ 1
         LD   A,H
         LD   H,L
         RLC  L
         RLA
         RLC  L
         RLA            A = HL/64
         AND  63
         ADD  32
         CALL SCHAR
         RETC
         LD   A,H
         AND  63
         ADD  32
         CALL SCHAR
         JRNC SPK10
         RET

SPK9     LD   A,L
         AND  192
         RLCA
         RLCA
         AND  3         A = A/64
         ADD  L
         AND  63
         ADD  32
         CALL SCHAR
         RETC
SPK10    LD   A,(IX+15) EOL-tkn
         CALL SCHAR
         RET

DEBRUB   LD   (DEB2),A
         PUSH HL
         LD   HL,DEB1
         LD   BC,DEB3-DEB1
         CALL 0:11      Debug-rubrik
         LD   A,12
         LD   (253:244),A
         LD   A,(IX+25) Typ av packet
         LD   (SLASK),A
         LD   HL,SLASK
         LD   BC,1
         CALL 0:11
         LD   A,19
         LD   (253:244),A
         LD   L,(IX+22) Nummer p} packet
         LD   H,0
         CALL SKRIVTAL
         LD   A,30
         LD   (253:244),A
         LD   L,(IX+24) L{ngd data
         LD   H,0
         CALL SKRIVTAL
         CALL 7:66
         POP  HL
         RET

DEB1     DB 13,10
DEB2     DM "Spack  type=   "
         DM "seq=    length="
DEB3

DEBCHAR  PUSH HL
         PUSH DE
         PUSH BC
         LD   HL,SLASK
         LD   BC,1
         CALL 0:11
         POP  BC
         POP  DE
         POP  HL
         RET

SCHARD   LD   (SLASK),A
         LD   A,(DEBUG)
         DEC  A
         CALLZ DEBCHAR
         LD   A,(SLASK)
         CALL SCHAR
         RET

SCHAR    LD   C,A
         LD   A,(DEBUG)
         CP   2
         LD   A,C
         CALLZ DITTO
         CALL S[ND
         RETC
         CALL EVBRYT
         AND  A
         RET

DITTO    PUSH HL
         LD   HL,(DITTO1)
         LD   (HL),A
         INC  HL
         LD   (DITTO1),HL
         POP  HL
         RET

DITTO1   DW 135:0

EVBRYT   PUSH HL
         PUSH BC
         CALL TAN       Polla tangenter
         CALL CHECKTAN  H{mta ev tangent
         POP  BC
         POP  HL
         RETNC          Ingen tangent
         BIT  5,(IX+0)
         RETZ           Ignorera!
         CP   24
         JRZ  EVB1      CTRL-X
         CP   26
         RETNZ          Ej CTRL-Z
EVB1     ADD  64
         LD   (IX+37),A
         LD   (EVB3),A
         LD   A,32
         LD   (253:244),A
         PUSH HL
         PUSH DE
         PUSH BC
         LD   HL,EVB2
         LD   BC,EVB4-EVB2
         CALL WRITE
         POP  BC
         POP  DE
         POP  HL
         RET

EVB2     DM "CTRL-"
EVB3     DM "x"
EVB4

;Packa upp data
UNPACK   LD   HL,BUFF3  Pekar p} data
         LD   A,(IX+24)
         INC  A
         LD   (IX+28),A
         CALL UPK1
         RETC
         CALL TOFIL
         RET

UPK1     LD   DE,BUFF5
         LD   (IX+27),0
UPK2     AND  A         Clear carry
         DEC  (IX+28)
         RETZ           Inget mer data
         LD   A,(HL)
         INC  HL
         LD   BC,1:0
         CP   (IX+19)
         JRNZ UPK3      Ej REPT
         AND  A
         JRZ  UPK3
         DEC  (IX+28)
         RETZ
         DEC  (IX+28)
         RETZ
         LD   A,(HL)
         SUB  32
         LD   B,A
         INC  HL
         LD   A,(HL)
         INC  HL
UPK3     CP   (IX+17)
         JRNZ UPK4      Ej QBIN
         AND  A
         JRZ  UPK4
         DEC  (IX+28)
         RETZ
         LD   C,128
         LD   A,(HL)
         INC  HL
UPK4     CP   (IX+16)
         JRNZ UPK6      Ej QCTL
         AND  A
         JRZ  UPK6
         DEC  (IX+28)
         RETZ
         LD   A,(HL)
         INC  HL
         BIT  7,A
         JRZ  UPK5
         LD   C,128
UPK5     AND  127
         CP   (IX+16)
         JRZ  UPK6      QCTL
         CP   (IX+17)
         JRZ  UPK6      QBIN
         CP   (IX+19)
         JRZ  UPK6      REPT
         XOR  64
UPK6     OR   C
UPK7     LD   (DE),A
         INC  DE
         INC  (IX+27)
         DJNZ UPK7
         JPP  UPK2
         CALL TOFIL
         JRNC UPK1
         RET

TOFIL    LD   A,(IX+27)
         AND  A
         RETZ
         PUSH HL
         LD   HL,BUFF5
         LD   C,A
         LD   B,0
         PUSH BC
         CALL PUTFIL
         POP  BC
         LD   HL,(ANTBYTES)
         ADD  HL,BC
         LD   (ANTBYTES),HL
         POP  HL
         RET

;Packa data att s{nda
PACK     LD   HL,BUFF4
         LD   (IX+24),0 L{ngd data
         LD   C,(IX+9)
PK1      LD   A,(IX+11)
         SUB  8
         SUB  (IX+24)
         CCF
         RETNC          Packet full
         PUSH HL
         PUSH BC
         CALL GETFIL    H{mta ett tecken
         POP  BC
         POP  HL
         RETC           EOF eller ERROR
         LD   E,A       Spara tecken
         LD   A,(IX+9)  Kolla om ej REPT
         AND  A
         JR   Z,PK11
         CP   E
         JRZ  PK4       REPT-tkn
         LD   A,E       Tillbaks med tecknet i A
         CP   C
         JRZ  PK2       Samma som f|rut!

PK11     LD   C,A       Kom ih}g tecknet
         LD   B,1       Repeatr{knare
         LD   (IX+34),L
         LD   (IX+35),H Spara pekare
         LD   A,(IX+24)
         LD   (IX+36),A Spara l{ngd
         JR   PK4

PK2      INC  B         \ka repeatantal
         LD   A,B
         CP   4
         JRC  PK4       Mindre {n 4 lika
         CP   94
         JRC  PK3       Max 94 repeat!
         LD   C,(IX+9)
PK3      LD   L,(IX+34)
         LD   H,(IX+35) ]terst{ll pekare
         LD   A,(IX+36)
         LD   (IX+24),A ]terst{ll l{ngd
         LD   A,(IX+9)
         LD   (HL),A    REPT-tecken
         INC  HL
         INC  (IX+24)
         LD   A,B       Antal repeat
         ADD  32
         LD   (HL),A
         INC  HL
         INC  (IX+24)
PK4      BIT  7,E
         JRZ  PK5       Ej }ttabitsdata
         LD   A,(IX+7)
         AND  A
         JRZ  PK5       Ej QBIN
         LD   (HL),A
         INC  HL
         INC  (IX+24)
         RES  7,E
PK5      LD   A,E
         CP   32
         JRC  PK6       Tecken < 32
         CP   127
         JRZ  PK6
         AND  127
         CP   (IX+6)
         JRZ  PK6       QCTL
         CP   (IX+9)
         JRZ  PK6       REPT
         CP   (IX+7)
         JRNZ PK8       Ej QBIN
         AND  A
         JRZ  PK8       QBIN anv{nds ej
PK6      LD   A,(IX+6)
         LD   (HL),A
         INC  HL
         INC  (IX+24)
         LD   A,E
         CP   32
         JRC  PK7
         CP   127
         JRNZ PK8
PK7      XOR  64
         LD   E,A
PK8      LD   (HL),E
         INC  HL
         INC  (IX+24)
         JP   PK1
<<< kermasm.inf >>>
Information om k{llkoden till KERM
Anders Franz`n Stockholm 1988-01-01

K{llkoden till KERM best}r av totalt
}tta filer varav en huvudfil. Dessa
{r assemblerade med ASS.BAC (det kr{vs
32K f|r assembleringen). Dessa filer
finns:
 KERM.ASM   Huvudfil, g|r include p} |vriga
 KERM1.ASM-KERM7.ASM
<<< kermdump.bas >>>
100 REM +++++++++++++++++++++++++++++++
101 REM ! Program ....   KERMDUMP
102 REM ! Utg}va  1.0    87-11-08
103 REM ! av Anders Franz`n <5258>
104 REM +++++++++++++++++++++++++++++++
105 REM
106 REM F%=0% : PREPARE 'trace.txt' ASFILE F%
107 A%=135%*256% : B%=A%+1%
108 I%=PEEK(A%) : A%=A%+1%
109 IF I%<>1% GOTO 119
110 FOR K%=B%-1% TO A%-2%
111 L%=PEEK(K%) AND 127%
112 IF L%>32% AND L%<128% ; #F%,'   'CHR$(L%); ELSE ; #F%,'    ';
113 N%=N%+1% : IF N%=15% LET N%=0% : ; #F%
114 NEXT K% : N%=0%
115 ; #F% : GET T$ : ; #F%
116 IF T$='S' CLOSE F% : END
117 ; #F%,'typ='CHR$(PEEK(A%+2%))'  seq='RIGHT$(NUM$(PEEK(A%+1%)-32%),2%)'  len='RIGHT$(NUM$(PEEK(A%)-32%),2%)
118 B%=A%
119 ; #F%,SPACE$(4%-LEN(NUM$(I% AND 127%)))I% AND 127%;
120 N%=N%+1% : IF N%=15% LET N%=0% : ; #F%
121 GOTO 108
<<< kermdump.inf >>>
KERMDUMP.INF
Anders Franz`n <5258> Sthlm 1987-11-08

KERMDUMP {r ett program som dumpar mottaget
och s{nt data med KERM. S{tt parametern
DEBUG DUMP i KERM och |verf|r fil med Kermit.
Tryck RESET p} datorn och k|r sedan KERMDUMP.
Man kan dumpa datat till fil om s} |nskas
genom att {ndra filnummer i b|rjan av
programmet till annat v{rde {n noll.

Programmet ins{nt f|r att kunna h{rleda
fel.
<<< kermquit.bas >>>
100 REM +++++++++++++++++++++++++++++++
110 REM ! Program ....   KERMQUIT
120 REM ! Utg}va  1.0    87-09-20
130 REM ! av Anders Franz`n <5258>
140 REM +++++++++++++++++++++++++++++++
150 REM 
160 REM Medf|r }terhopp till KERM.
170 REM 
180 ; 'Tryck CTRL-C f|r BASIC,'
190 ; 'annars }ter till KERM.'
200 GET A$
210 Z%=CALL(PEEK(65063%)+256%*PEEK(65064%)+16%)
