aboutsummaryrefslogtreecommitdiff
path: root/src/cpsmit.asm
blob: f41ee702f9e973d81555e8a900c481f6d8106ed9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
; CPSMIT.ASM
;       KERMIT - (Celtic for "FREE")
;
;       This is the CP/M-80 implementation of the Columbia University
;       KERMIT file transfer protocol.
;
;       Version 4.0
;
;       Copyright June 1981,1982,1983,1984,1985
;       Columbia University
;
; Originally written by Bill Catchings of the Columbia University Center for
; Computing Activities, 612 W. 115th St., New York, NY 10025.
;
; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
; others. 
;
;       This file contains the system-independent initialization, the main
;       loop, and the commands that don't have any place better to go.
;	All the SET xxx and status routines now in CPSCOM.ASM as CPSMIT.ASM
;	was getting too big.
;
; revision history:
;
;edit 30, 29-Mar-1991 by MF. When looking up a TAKE-file in a TAKE command
;	and the file is not found, complain if it's not the first TAKE of
;	the current program execution (the automatic TAKE of KERMIT.INI)
;edit 29, 25-Mar-1991 by MF. Add STAY command as a synonym for SET NO-EXIT
;	command per Martin J. Carter of Nottingham University in the U.K.
;edit 28, 21-Mar-1991 by MF. Modify code after "inp2a" in INPUT command
;	so a ^C will halt TAKE-file processing
;edit 27, 27-Feb-1991 by MF. Add QUIT as a synonym for EXIT per code of
;	Dr. Martin J. Carter of Nottingham University, U.K. Recognizing QUIT
;	helps those who forget they're not in MS-Kermit, C-Kermit,
;	Kermit-32 etc. Also add commands so that CONNECT, RECEIVE and SEND may
;	be abbreviated to C,  R and S, respectively.
;edit 26, 5-Nov-1990 by MF.  Cosmetic changes to main HELP messages for
;	COPY and RENAME commands.
;edit 25, 1-Nov-1990 by MF.  Made the following command-name changes in the
;	interest of uniformity of nomenclature (per suggestions of FDC):
;	FCOPY to COPY, FRENAME to RENAME and STRING to OUTPUT.
;	This means we'll have to type "CO" for CONNECT and "REC" for 
;	RECEIVE but with REMOTE now with us we have to do the latter anyway.
;edit 24, 18-Sep-1990 by MF.  Implemented FRENAME command to rename a
;	CP/M file.
;edit 23, 9-Sep-1990 by MF.  Implemented commands to be sent to a
;	remote Kermit Server (Remote commands).
;	Implemented setting of packet sizes for RECEIVE and SEND.
;	Put DIRECTORY/STRING help texts in proper alphabetical position.
; edit 22, July 6th, 1987 by OBSchou.  Added a dummy Commandline to be
;	loaded for debugging purposes as DDT destroys any command line at 80H
;	Also fixed a bug or two...
;
; edit 21, April 8th, 1987.
;	Various bits, including more SET SENDRECEIVE options, and make 
;	PADDING and PADCHAR valid options.  Have I wasted my time, or 
;	there still systems that use padding??  Fixed a bug in the INPUT
;	command so we know how many characters there are to check for. Also
;	hived off the SET commands to make a new file, CPSCOM.ASM thereby
;	reducing the size of CPSMIT.ASM.  Also rename COPY command to FCOPY
;	hence retaining a single C to imply connect.
;
; edit 20, March 30, 1987 by OBSchou.  
;	added code for no exit to CPM if a command tail is done (optional)
;	by the SET NO-EXIT command.  Added bits for SET AUTORECEIVE to enable 
;	or inhibit automatic receive of several files (if something is coming 
;	along from the remote side, do a receive. Toss first packet away.)  
;	This is first step to SERVER???
;	Also added back the INPUT command.
;
; edit 19, March 16, 1987.  Moved the code to check for and execute 
;	command tails (See Richard Russells submission below).  
;	Added flags to exit to CP/M after executing a command tail.  
;	The KERMIT.INI file is taken before the command tail is issued.
;
; edit 18, March 11, 1987 by OBSchou.
;	Added in code for TYPE <file> and PRINT <file>.  Hope to add COPY 
;	later on.  Also added in code submitted by Richard Russel, to accept
;	a command tail on entry to kermit (eg KERMIT CONNECT).  This facility
;	if used, will replace the automatic TAKE function on loading Kermit.
;	Unfortunately, you will not be dropped back to CP/M after the command
;	In the future, it may be possible to either accept several commands
;	on the command tail, and possibly accept the automatic TAKE facility
;	as well.  Low on my list of things to do.
;
; edit 17, January 28, 1987 by OBSchou for DJ Roberts of Leicester
;	Also added a couple of fixes [obs]
;
; 	DJR  January 1987  David J. Roberts.
;          USER made a SET option
;          STATUS output placed in alphabetical order
;          Report DEBUG mode and default disk 
;          Name of LOG file on SHOW/STATUS display
;
;
; edit 16 December 1st, OBSchou.  Fixed bug in that if the overlay is not in
;	place or correct then prtstr is not called to print the error message
;	(As prtstr has been moved out of the system independent code)
;
; edit 15 November 10, 1986 by OBSchou.  Re-inserted Pause and Break 
;       commands for release.
;
; edit 14 August 29, 1986.  Removed PAUSE,BREAK,INPUT and SET CASE as 
;       these have not been fully coded or debugged.  (For next 
;       version of Kermit-80...). Also tidied up a bit.
;
; 13 by OBSchou for Godfrey Nix.  He writes:
;       edit August 11,1986      Godfrey Nix, Nottingham University [gnn]
;       To insert code for setting the packet start character on
;       both send and receive packets (default is still 01H)
;       and make GET and RECEIVE to be separate;
;       use with edits to CP4PKT, CP4UTL
;
; edit 12: 19 June, 1986 by OBSchou.  Added PAUSE and BREAK facility.
;       Breaks simulate a call to sysint which tests for a B being passed.
;       Note this is only useful if the system dependent code supports breaks,
;       and an appropriate message is returned if breaks are not possible.
;       Also added is the command entry for INPUT, which waits for a string
;       from the host for a given time.  The time is a very variable counter
;       incremented every BDOS call.  Trial and error will give a reasonable
;       value.  STRING acceps a string from the use and then sends it on 
;       to the host.  These new commands allow a user to (almost) set up auto
;       log on files, where BREAKS/INPUT/STRING/STRING partially emulate a user
;       (AI LURES OK and all that).  Still could do with a test, eg if not a
;       correctly returned string go back n steps.  This would make a fairly 
;       simple TAKE command a lot more complicated.
;
;edit 11: 30 May, 1986 OBSchou.  Added in a couple of more routines and such
;
;edit 10: 27 May, 1986 OBSchou.  Added in support for USER function
;       removed XMIT test and routine, but also added SET FLOW-CONTROL
;       (set for XON/XOFF flow control in both directions) and a 
;       SET CASE-SENSITIVE ON/OFF (if on => a # A, if ON => a=A)
;
;edit 9: 13 May, 1986 OBSchou, Loughborough University, UK
;       Added in code for SET XMIT character to allow setting of the
;       character to wait for from the host during TRANSMIT.  It is
;       a line feed by default.  Also added a TAKE command, to take: commands
;       from a named disk file.  If a file is TAKEn, then all BDOS calls 
;       are trapped and tested for console input.  If so, we substitute a 
;       character (or buffer) from the TAKE file specified.
;       This may also be used in the future for a CPKERMIT.INI 
;       to be evaluated during Kermit initialsation.
;
; edit 8: February 6, 1895
;       Add a PORT status/show routine for those machines that have more
;       than one they can talk to. It also required a port storage variable
;       a la SPEED and the necessary code to handle it in the SET routine.
;       [Hal Hostetler]
;
; edit 7: 13-Jan-85 by Vanya J.Cooper Pima Commun. College Tel: 602-884-6809
;
;pcc003-pcc005  2-Jan-85        vjc     modules:cp4mit,cp4tt,cp4utl
;       These edits must all be installed together and change the way
;       logging is handled.  The log file spec is moved to a separate
;       fcb, and not opened until an actual CONNECT command is given.
;       This takes care of a NASTY bug that if you used any other file
;       command between the LOG and CONNECT, the log file would get
;       written over the last file used.  This also allows logging to
;       be "permanently" enabled until an CLOSE (new command) for all
;       CONNECT sessions, like most other kermits do.  If a log file
;       already exists, it will be appended to.  Also add two new
;       CONNECT mode commands <esc>Q to suspend logging and <esc>R to
;       resume.  <esc>R means something else during TRANSMIT, but
;       logging is never on then, so there shouldn't be any conflict.
;       I also changed the write code, so that it can handle one more
;       character after the XOFF is send to stop the host.  This allows
;       a little "slop" for systems that don't stop immediately (such
;       as TOPS10), but it didn't help much.
;
;pcc012 4-Jan-85        vjc     modules:cp4mit,cp4tt,cp4utl
;       Use the big buffer for the log file.  Move the log file back
;       into the common fcb and only save the drive, name, and
;       extension between connects.  Add new routines to cp4utl to
;       create or append to an existing file, and to conditionally
;       advance buffers only if in memory.  Remove edit pcc003 that
;       allows one more character after the xoff, since it didn't
;       really work very well and does not fit in well with the way
;       the buffer advancing routines are set up.  If someone still
;       thinks this would be useful, it could be put back in with a
;       little more work.
;       
;       While testing this edit, I also noticed another bug that
;       the command parsing routines do not limit or check the
;       length of command lines or file specs, trashing what ever
;       comes after them.  Currently because of where the fcb and
;       command buffer are located, this does not usually cause a
;       problem, but could if an extremely long line was typed in,
;       or in the future multiple fcbs defined elsewhere in memory
;       were used.  Maybe this should be put on the bug list
;       somewhere.
;
;pcc013 8-Jan-85        vjc     modules:cp4mit,cp4utl,cp4typ
;       Replace CLOSE command to cancel session logging to SET
;       LOGGING ON/OFF.  This seems to fit in with the command
;       structure better.  Default the log file to KERMIT.LOG
;       incase no previous LOG command.  Logging is also enabled
;       by LOG command, as before.
;
; edit 6: September 8, 1984
;       Add VERSION command, to display the internal version strings.
;       Move command tables here from CP4UTL, and translate string
;       lengths in them to decimal (how many fingers do YOU got?).
;       Replace some jump tables with dispatch addresses in tables.
;       Make help text for SET command consistent with top level help text.
;
; edit 5: August 21, 1984
;       Add word at 0100H to allow us to exit cleanly from DDT (shifting
;       entry section by two bytes).
;
; edit 4: August 3, 1984 (CJC)
;       Remove "mover" from entry section, as it now lives in CP4SYS.
;
; edit 3: July 27, 1984 (CJC)
;       Merge LASM support from Toad Hall: most of CP4MIT is now in CP4UTL.
;       When assembling with LASM, CP4MIT is linked by CP4DEF; it links to
;       CP4PKT.  Add SET TACTRAP command.  Separate out display routines so
;       we can eventually do "SHOW <parameter>".  Save both bytes of baud
;       rate in speed, and check both bytes when displaying baud rate.  Move
;       header info to CP4KER.ASM.  Add onoff and chkkey routines to simplify
;       SET command (Toad Hall)
;
; edit 2: June 8, 1984
;       formatting and documentation; delete unreferenced variables and some
;       unnecessary labels; move setpar here from cp4pkt; add module version
;       string; make this version 4.01.
;
; edit 1: May, 1984
;       extracted from CPMBASE.M80 version 3.9; modifications are described
;       in the accompanying .UPD file.

;
	ASEG
	ORG	100H

; The CCP invokes programs with a CALL 100H, with the stack pointer set to
; 100H.  When we exit to CP/M, we do so with a RET, avoiding a warm boot.
; Unfortunately, DDT starts programs with a jump, not a call, so when we
; attempt to return to CP/M, we blow the stack and use the word at 100H as
; the new PC.  Put a 0 there so we reboot instead of dying horribly.
; (Fortunately, this happens to be two NOP's).
	dw	0
	jmp	start	; Bypass entry section

;
;       Entry section for system-independent part.  This contains
;       jumps to routines needed by the system support module.
;
entries:
	jmp	kermit		; reentry address
	jmp	nout		; output HL in decimal
entsiz	equ	$-entries	; length of entry section
;
;       End of entry section.  As a consistency check, the expected
;       length of this section is stored by the system-dependent
;       module in the linkage section at the end of Kermit, and
;       tested at initialization.

mitver:	db	'CPSMIT.ASM (30) 29-Mar-1991$'	; name, edit number, date
;
;
;       Initialization
;
start:	lxi	h,0		; Clear out hl pair
	dad	sp		; and fetch the system stack pointer
	shld	oldsp		; and save for later restoral
	lxi	sp,stack	; move in our own stack.
	lxi	d,version	; print Kermit version
	call	prtstx		;  before we do too much (Use fudged prtstr)
	mvi	c,rddrv		;Get our logged in drive
	call	BDOS
	inr	a		;relative 1
	sta	CURDSK		;and save it for later

	lda	vtflg		; [OBS] Hangover from VT52 ems not possible...
	cpi	0ffh		; ... if 0ff stored, assume terminal = off
	mvi	a,vtdefo
	jnz	start0
	sta	vtflg		; if 0ffh make it VT52 off
start0:


IF debug
;vvvvvvvvvvvvvvvv remove this for run time
; OBS edit 22 - add in a dummy command line to 80H
	lxi	h,dcomln	;[22] load up dummy command line
	lxi	d,81h		;[22] where to put it
	lxi	b,endcoml-dcomln
	mov	a,c		; get length to a
	sta	80h		; ... and save as command line length
	call	mover		; ... and save rest of line
	jmp	starta
dcomln:	db	'set baud 4800',semico
	db	'set dir on',semico
	db	'dir'
	db	0,0	; just to make up space
endcoml:
;^^^^^^^^^^^^^^^^ remove this for run time
ENDIF	;debug


starta:
;
;       Make sure the overlay is in place...
;
	lhld	lnkflg
	mov	a,h
	ora	l		; if lnkflg is still zero,
	jz	start1		;  the configuration overlay is missing.
	lxi	d,-lnksiz	; if it's not equal to lnksiz,
	dad	d		;  we've probably got the wrong
	mov	a,h		;  version of the configuration overlay.
	ora	l
	jnz	start2
	lhld	lnkent		; make sure the overlay knows how long
	lxi	d,-entsiz	; our entry section is, so they don't miss.
	dad	d
	mov	a,h
	ora	l
	jnz	start2
				; might be ok.
	lxi	h,bdos		; set xbdos address to bdos trap in our code.
	shld	xbdos+1		; (they may never use it...)
	call	sysinit		; do system-dependent initialization
	lda	bufsec		; get the max no of buffers allowed by system
	sta	maxbsc		; save for SET BUFFER use to compare
	lxi	d,inms26	; offer some advice on getting help
	call	prtstr
	lxi	h,buff		;[19] we copy any potential command tail across
	lxi	d,cbuff
	lxi	b,80h		;[19] copy all 128 bytes.  May use none.
	call	mover
	lda	80h		; see if there is a command tail...

	ana	a



; Remove for runtime use
;	xra	a		; make out there is no command tail
; Runtime => no XRA above

	jz	startz
	dcr	a
	jz	startz		; one character tail...
	lda	takflg		; if more characters, say we are have tail
	ori	10h		; set bit 4
	sta	takflg
	sta	nexitf		; exit back to CP/M after command line
startz:
	mvi	a,0ffh		; when here, system basically initiallised,...
	sta	initflg		; apart from KERMIT.INI, so say initialised.

	call	take1		;[9] take a KERMIT.INI file
	xra	a		;[MF] Say we've done it
	sta	initak		;[MF] ...
	jmp	kermit		; Start main loop.

start1:	lxi	d,erms20	; "Kermit has not been configured"
	call	prtstx		; print error message (Use bodge for prtstr)
	jmp	exit2		;  and exit.

start2:	lxi	d,erms21	; "Consistency check on configuration failed"
	call	prtstx		; print error message
	jmp	exit2		;  and exit.
;
;This is the main KERMIT loop.  It prompts for and gets the users commands.

kermit:	lxi	sp,stack	; get new stack pointer, old one might be bad.
	call	selcon		; make sure console is selected.
	xra	a
	sta	mfflg1		;reset MFNAME
	sta	mfflg2		;ditto
	sta	mfflg3
	sta	getrxflg	; clear the get/receive flag
				;0=> receive, non 0 => get
	sta	cmbflg		;[MF]Initial keyword must not be blank
	sta	cmqflg		;[MF]Allow character-echoing during commands
	sta	remtxt		;[MF] Clear remote-text-to-screen flag
	lda	curdsk		; update the prompt
	adi	'A'-1
	sta	kerm1+2
	call	getun		;[11] get the user number into temp1/2
	lda	temp1+1		;[11] get ms value of user number
	cpi	'0'		;[11] less than 10 => do a space
	jnz	kerm4		;[11] else do MS digit of user number
	mvi	a,' '		;[11]
kerm4:	sta	kerm1		;[11]
	lda	temp1		;[11] get ls digit of user number
	sta	kerm1+1		;[11] save that
	lda	takflg		; are we in TAKE or command line??
	ani	11h		; strip out both bits
	jnz	kerm5		; still in either or both...
	lda	nexitf		; if neither, and no-exit-flag set, we quit.
	ana	a
	jnz	exit		;... back to CP/M, else as you were...
kerm5:
	lxi	d,kerm
	call	prompt		;Prompt the user.

kerm7:	lxi	d,comtab
	lxi	h,tophlp
	call	keycmd		; Get a keyword
	xchg			; Get result (dispatch address) into HL
	pchl			; Dispatch.

;       here from: log, setcom, read, cfmcmd
kermt3:	lxi	d,ermes3	;"Not confirmed"
	call	prtstr
	jmp	kermit		;Do it again.

;       Structure of command table:
;
;       1) Number of entries.
;       2) Each entry is arranged as follows:
;               a) length of command in bytes.
;               b) 'name of command and $-sign'
;               c) address of routine to process command
;
;       ---> Note this command table is in alphabetic order.
;

comtab:	db	32	; added remote
			;[obs] added in COPY command, now called FCOPY
			;[obs] removed remote simply to issue V4.09
				;[MF]Make FCOPY/FRENAME COPY/RENAME for
				;[MF]Version 4.10
				;[MF]Add QUIT as a synonym for EXIT and
				;[MF]C, R and S as abbreviations for
				;[MF]CONNECT, RECEIVE and SEND, respectively
				;[MF]Add STAY as a synonym for SET NO-EXIT
	db	5, 'BREAK$'
		dw break
	db	3, 'BYE$'
		dw bye
	db	1,'C$'
	dw	telnet		;[MF]Abbreviation for CONNECT
	db	7, 'CONNECT$'
		dw telnet
	db	4,'COPY$'
		dw copy
	db	9, 'DIRECTORY$'
		dw dir
	db	5, 'ERASE$'
		dw era
	db	4, 'EXIT$'
		dw exit
	db	6, 'FINISH$'
		dw finish
	db	3, 'GET$'
		dw read		; [gnn] entry for GET
	db	4, 'HELP$'
		dw help
	db      5, 'INPUT$'
		dw input
	db	3, 'LOG$'
		dw log
	db	6, 'LOGOUT$'
		dw logout
	db	6, 'OUTPUT$'
		dw string
	db	5, 'PAUSE$'
		dw pause
	db	5, 'PRINT$'
		dw printf	;[obs] print a file
	db	4,'QUIT$'
	dw	exit		;[MF]Synonym for EXIT
	db	1,'R$'
	dw	read0		;[MF]Abbreviation for RECEIVE
	db	7, 'RECEIVE$'
		dw read0	; [gnn] not same as GET now
	db	6, 'REMOTE$'
		dw remote
	db	6,'RENAME$'
	dw	rename		;[MF]
	db	1,'S$'
	dw	send		;[MF]Abbreviation for SEND
	db	4, 'SEND$'
		dw send
	db	3, 'SET$'
		dw setcom
	db	4, 'SHOW$'
		dw show
	db	6, 'STATUS$'
		dw status
	db	4,'STAY$'
	dw	noexit		;STAY (SET NO-EXIT)
	db	4, 'TAKE$'			;[9]
		dw take
	db	8, 'TRANSMIT$'
		dw xmit
	db	4, 'TYPE$'
		dw type		;[obs] type a file command
	db	7, 'VERSION$'
		dw shover
;	db	4, 'USER$'			; removed [DRJ]
;		dw user				;[10] removed [DRJ]
; top-level help message. Caps indicate keywords.
; this text is also printed by the HELP command.

tophlp:	
	db	cr,lf,'BREAK to send a break to the host'
	db	cr,lf,'BYE to host (LOGOUT) and exit to CP/M'
	db	cr,lf,'CONNECT to host on selected port'
	db	cr,lf,'COPY to copy a CP/M file'
	db	cr,lf,'DIRECTORY of current used Micro-disk'
	db	cr,lf,'ERASE a CP/M file'
	db	cr,lf,'EXIT to CP/M'
	db	cr,lf,'FINISH running Kermit on the host'
	db	cr,lf,'GET a file from the host'
	db	cr,lf,'HELP by giving this message'
	db	cr,lf,'INPUT to make the micro wait for a string from the host'
	db	cr,lf,'LOG the terminal sessions to a file'
	db	cr,lf,'LOGOUT the host'
	db	cr,lf,'OUTPUT to send a specified string to the host'
	db	cr,lf,'PAUSE to wait for a little time'
	db	cr,lf,'PRINT a file to the printer'
	db	cr,lf,'QUIT to CP/M'
	db	cr,lf,'RECEIVE file from host'
	db	cr,lf,'REMOTE to send commands to a remote server'
	db	cr,lf,'RENAME to rename a CP/M file'
	db	cr,lf,'SEND file to host'
	db	cr,lf,'SET a parameter'
	db	cr,lf,'SHOW the parameters'
	db	cr,lf,'STATUS of Kermit'
	db	cr,lf,'STAY at Kermit command-level after a command tail'
	db	cr,lf,'TAKE commands from a file'		;[9]
	db	cr,lf,'TRANSMIT file to host (in connect state)'
	db	cr,lf,'TYPE a file to the console'
	db	cr,lf,'VERSION of Kermit running'		;[pcc005]
;	db	cr,lf,'USER to set a different user number' ;removed [DJR]
	db	'$'		;[obs] added it here to allow for expansion

;
;       This is the BREAK command.  It sends a 'B' to the system dependent
;       interrupt routines (test for escape-cokebottle xxx) and do a break
;       if the overlay can.  Else, we tell user not to be so silly.
break:	call	cfmcmd		; get return
	mvi	a,'B'		; were gonna do a break if the overlay can
	call	sysint		; try doing it..
	jmp	kermit		; if we can do it, else
	lxi	d,inms12	;... say not implemented
	jmp	kermit

;
;
;       This is the BYE command.  It tells the remote KERSRV to logout,
;       then exits.

bye:	call	cfmcmd
	call	logo		;Tell the main frame to logout.
	jmp	kermit		;If it fails, don't exit.
	call	sysbye		; success. do system-dependent cleanup
	jmp	exit1		;Exit Kermit.

;       This is the EXIT command.  It leaves KERMIT and returns to CP/M.
;       alternate entries: exit1, from BYE command;
;       exit2, from initialization (if it fails)

exit:	call	cfmcmd		; confirm...
exit1:	call	sysexit		; do system-dependent termination
exit2:	
	jmp	0		; return to CP/M via JUMP instead of RET.
	
;	lhld	oldsp		;Get back the system stack
;	sphl			;and restore it.
;	ret			;Then return to system.

;       Input command.  Syntax:
;               INPUT [Wait period] [string]
;       where
;               Wait period is a time period to wat for
;               string is a string to expect back from the host.  Control
;                       characters are entered as \ and an octal number.
;
;       I can see uses for this command from other routines...
;
input:	mvi	a,cmnum		; first get the number
	call	comnd		; get it
	jmp	kermit		; if we dont understand it...
	lhld	number
	shld	waitp		; and save as the wait period
	lxi	d,stbuff	; where to put the string
	mvi	a,cmtxt		; get text
	call	comnd
	jmp	kermit		; not quite correct...
	sta	strcnt		; string count returned in a
	call	cfmcmd		; get a confirm

	lhld	waitp		; multiply the number by
	dad	h
	dad	h		; ... 4
	dad	h		; ... 8
	inx	h		; but make sure it is at least 1
	shld	waitp		; and save it away again
	shld	waitp1		; save in case we need to reset counter

; Right, now wait for characters comming from the line, within the
;	time allowed (very fuzzy).  Compare with STRING buffer
;
inp1:	xra	a
	sta	repcnt		; clear the host prompt chars.counter
inp2:	lhld	waitp		; have we waited long enough
	dcx	h
	shld	waitp		; count less one
	mov	a,h		; test to see if both zero
	ora	l
	jnz	inp20		; nope
	mvi	a,3		; error is three ie total failure
	sta	errorc
	jmp	inp5		; take error exit

inp20:	call	rd1chl		; read a character from the line
	ani	7fh		; set flags
	jnz	inp4		; Not zero => we have a character from host
	call	ckchr		; see if *WE* have a character from console
	push	psw		; restore to modem
	call	selmdm		; reselect the modem port
	pop	psw
	ani	7fh		; strip parity (should not be there)
	jnz	inp2a		; if a null, try again
	lda	strcnt		; if the string length is zero, dont wait.
	ana	a
	jnz	inp2		; so loop back again
	jmp	kermit		; else drop out

inp2a:	cpi	cntlc		; do we want to abort?
;[MF]Change following line
;	jz	kermit		; in which case exit back to command loop
	jnz	inp2b		;[MF] No
	lda	takflg		;[MF] Yes, are we TAKEing
	ani	1		;[MF] commands from a file?
	cnz	closet		;[MF] Yes, close and reset to get
				;[MF] commands from the command-line
	jmp	kermit		;[MF] and exit back to command loop
inp2b:	cpi	cntlz		; if control z exit back to command loop
	jz	kermit		; else try for other characters [MF]
	jmp	inp2

inp4:	mov	e,a		; save it for a while
	lda	repcnt		; see if this character matches with one in buffer
	lxi	h,stbuff	; point to string buffer
	add	l		; make hl = hl + a
	mov	l,a
	mvi	a,0		; ie make hl = hl + character count
	adc	h
	mov	h,a		; not using xra, as that clears the Carry flag
	mov	a,e		; get the character back again
	cmp	m		; is it = to what we expect?
	jnz	inp1		; no, clear counter and try again
	lda	repcnt		; yes, then update the pointer, and ...
	inr	a		; ... see if we have received all ...
	sta	repcnt		; ... we should have received
	lhld	waitp1		; get original counter
	shld	waitp		; and reset the loop (timer) counter
	mov	e,a		; save length into E again
	lda	strcnt		; get the length to compare
	sub	e		; if (e) > string length, we have it
	jnz	inp2		; else wait for a little longer

	xra	a		; no errors
	sta	errorc
	jmp	kermit		; so say nothing
;else if error...

inp5:	lxi	d,erms30	; say message not receive in time...
	call	prtstr
	jmp	kermit		; have string, so exit

;
;

;       This is the HELP command.  It gives a list of the commands.

help:	call	cfmcmd
	lxi	d,tophlp	;The address of the help message.
	call	p20ln		;Print at most 20 lines then pause
;	call	prtstr
	jmp	kermit
;
;       This is the LOG command.  It logs a session to a file.

log:	mvi	a,cmofi		;[pcc005] Parse an output file spec.
	lxi	d,fcb		;[pcc012] where to put it
	call	comnd
	jmp	kermt3
	call	cfmcmd
	lxi	h,fcb		;[pcc012] copy file name and ext
	lxi	d,lognam	;[pcc012] to a safe place
	lxi	b,12		;[pcc012] 12 bytes
	call	mover		;[pcc012] zap ...
	mvi	a,1		;[pcc005] set flag for logging
	sta	logflg		;[pcc005]
	jmp	kermit		;[pcc005]

;
;       PAUSE [Wait period]. Just wait for a couple of tics...
pause:	mvi	a,cmnum		; get the number of the wait period
	call	comnd		; get it
	jmp	kermit		; we canna do it, so get next command
	lhld	number
	xchg			; move to d
	lhld	clkbit+1	; get clock bits 8 to 23
	mov	a,h		; strip ms bit so we have space for a possible carry
	ani	7fh
	mov	h,a
	dad	d		; add the number (ie get the number to wait to
	shld	number		; save it somewhere
;
;       Now, wait for time to be equal to newer NUMBER with Carry
ploop:	
	call	clock		; increment clock
	lda	takflg		; test if keyboard interrupt.. not for takes
	ana	a
	jnz	ploop1		; do nothing for take command files
	mvi	c,dconio	; get status from console
	mvi	e,0ffh		; just get the character
	call	bdos
	ana	a		; if non zero return, then quit
	jnz	kermit		; we got something, so quit
ploop1:	lhld	number
	xchg
	lhld	clkbit+1	; get bits 8 to 23
	mov	a,h
	ani	7fh		; make it 15 bits for a carry...
	mov	h,a
	mov	a,e		; now, do (DE with carry) - HL
	sub	l
	mov	e,a
	mov	a,d
	sbb	h
	ora	e		; a = OR of result
	jnz	ploop
	jmp	kermit		; otherwise we are done.

; PRINT - Print a file to the console and printer.  
;	This command is active only from the command level, and not 
;	from the connect state.  Unfortunately, the print command is 
;	not going to be a background utility.
printf:	mvi	a,0ffh		; set the print flag on
typent:	sta 	prnfl		; Type file entry.  Common for PRINT and TYPE
	call	type		; and do the rest of the print via type
	xra	a
	sta	prnfl		; next clear the print flag
	jmp	kermit

; TYPE - Type a file to the console.
;	This command is really the same as the print command, but the output
;	is not copied to the printer.
typef:	xra	a		; we want to clear the printer on flag
	jmp	typent		; go to the type entry in printfile above


;
;       This is the TAKE command.  It take input from a file.
;       TAKE1 is the entry for automatically TAKE-ing KERMIT.INI (or whatever
;       the file name at taknam is) from the default drive
;	[18] code added to accept command tails.  See note [18] above
;
take:	mvi	a,cmifi		;[9] Get filename from user
	lxi	d,takfcb	;[9] Take file fcb space
	call	comnd		;[9] get the file spec
	jmp	kermit		;[9] User failed to specify a good file spec
	call	take2		;[MF] Now TAKE the file
	jmp	kermit		;[MF] Go back to main Kermit command loop
;
take1:	lxi	b,12		;[9] copy default drive and file name to take fcb
	lxi	d,takfcb
	lxi	h,taknam
	call	mover		;[9] and do it (all other extents etc are zero)
;[MF][30]No longer need the following line
;	jmp	take2		; got the file name, now take it.
;
				;[9] get the file name, now lets open it 
;
take2:
	lda	takflg		; check to see we have not tak-take
	ani	1		; if set, we are in a take already
;[MF]We can do the following test/call more efficiently
;	jz	take21
;	call	closet		; so close current take file
	cnz	closet		;[MF] So close current take file
take21:
	mvi	c,setdma
	lxi	d,takdma	;[9] tell bdos where to send data
	call	BDOS
	xra	a		;[9] clear all these extents etc
	sta	takfcb+14
	sta	takfcb+32
	lxi	d,takfcb	;[9] open the file
	mvi	c,openf		;[9] open the file
	call	BDOS
	inr	a		;[9] if FF returned, problems
;[MF]Complain if failure and not seeking KERMIT.INI
;	jz	kermit		;[9] for now, say nowt if no ini file. Else..
       jz      ntake           ;[9] We'll say file not found
				;[MF] unless the initial TAKE (KERMIT.INI)
;	jmp	take3		; a test
;	mvi	c,readf		;[9] read first bytes from file
;	lxi	d,takfcb	;[9]
;	call	BDOS

take3:	lxi	h,0
	shld	takptr		;[9] point to first byte of take file
	lda	takflg		; get current flag
	ori	1		;[9] and set flag to tell Kermit we're taking
	sta	takflg
;[MF][30]Redo next lines so can flag initial TAKE of KERMIT.INI
;	call	rnsect		;[9] read a sector
;	jmp	kermit		;(Should use a ret, but this will do)
	jmp	rnsect		;[9] read a sector and return

ntake:	lda	initak		;[MF]Is this the initial TAKE (KERMIT.INI)?
	ora	a		;[MF]...
	rnz			;[MF]Yes, don't complain
	lxi	d,erms15	;[9] Say file not found
	call	prtstr
;[MF][30]Make next line a "jmp" since we've called TAKE2
;	call	rstdma		;[9] reset the DMA addres for other files
;	jmp	kermit
	jmp	rstdma		;[9] reset the DMA addres for other files
				;[MF] and return


; Little code to allow some expansion of code without changing
;  every futher address, only up to the end of this file.
;   TO BE REMOVED FRO RELEASE!

;	org ($+100h) AND 0FF00H

IF lasm
	LINK CPSCOM
ENDIF ;lasm