]> cloudbase.mooo.com Git - kermit-80.git/blame - cpxsyo.asm
Import of "Kermit 80 for CP/M-80 and CP/M-85" from http://www.columbia.edu/kermit...
[kermit-80.git] / cpxsyo.asm
CommitLineData
c25f6a44
L
1IF NOT lasm
2.printx * CPXSYO.ASM *
3ENDIF ;NOT lasm
4; KERMIT - (Celtic for "FREE")
5;
6; This is the CP/M-80 implementation of the Columbia University
7; KERMIT file transfer protocol.
8;
9; Version 4.0
10;
11; Copyright June 1981,1982,1983,1984,1985
12; Columbia University
13;
14; Originally written by Bill Catchings of the Columbia University Center for
15; Computing Activities, 612 W. 115th St., New York, NY 10025.
16;
17; Contributions by Frank da Cruz, Daphne Tzoar, Bernie Eiben,
18; Bruce Tanner, Nick Bush, Greg Small, Kimmo Laaksonen, Jeff Damens, and many
19; others.
20;
21; This file contains the system dependent part for Sanyo MBC 1100
22; systems, and has been extracted from the CPMSYO.ASM code (kermit
23; version 3.5)
24;
25; revision history:
26;
27; edit 1, 27 October, 1987, by OBSchou. Extracted Sanyo code from CPMSYO.ASM
28; and massaged fort CP/M kermit V4.09
29;
30; Keep module name, edit number, and last revision date in memory.
31family: db 'CPXSYO.ASM (1) 27-Oct-87 $'
32;\f
33
34; Assembly time message to let me know I'm building the right version.
35; LASM generates an 'S' error along with the message, which is messy, but
36; better than trying to put everything inside a IF m80 OR mac80 conditional,
37; because LASM doesn't like nested IF's, either.
38
39IF sanyo
40.printx * Assembling Kermit-80 for Sanyo MBC 1100 *
41ENDIF
42
43iobyte EQU 03H ;Location of I/O byte
44
45if sanyo
46baudrt EQU 0DAH ;BAUD RATE MEMORY LOCATION
47MNPORT EQU 0DCH ;COMMUNICATIONS PORT
48MNPRTS EQU 0DDH ;COMMUNICATIONS PORT STATUS
49OUTPUT EQU 01H ;OUTPUT READY BIT
50INPUT EQU 02H ;INPUT READY BIT
51ENDIF;SANYO
52
53defesc EQU '\'-100O ;The default escape character.
54
55; Select initial setting for VT-52 emulation flag.
56vtval EQU 1
57
58
59sysxin: ;system initialisation not covered by sysinit
60 ret ; return from system-dependent routine
61
62;\f
63
64;
65; system-dependent termination processing
66; If we've changed anything, this is our last chance to put it back.
67sysexit:
68 ret
69
70;
71; system-dependent processing for start of CONNECT command
72;
73syscon:
74 ret
75
76;\f
77
78;
79; syscls - system-dependent close routine
80; called when exiting transparent session.
81;
82syscls:
83 ret
84;\f
85
86;
87; sysinh - help for system-dependent special functions.
88; called in response to <escape>?, after listing all the
89; system-independent escape sequences.
90;
91sysinh:
92 lxi d,inhlps ; we got options...
93 call prtstr ; print them.
94 ret
95inhlps:
96 db '$' ;[hh] table terminator
97
98;
99; sysint - system dependent special functions
100; called when transparent escape character has been typed;
101; the second character of the sequence is in A (and in B).
102; returns:
103; non-skip: sequence has been processed
104; skip: sequence was not recognized
105sysint:
106 ani 137O ; convert lower case to upper, for testing...
107 ret
108
109; sysflt - system-dependent filter.
110; called with the character in E.
111; preserves bc, de, hl.
112; note: <xon>,<xoff>,<del>, and <nul> are always discarded.
113sysflt:
114 mov a,e ; get character for testing
115 ret
116
117; mdmflt - modem filter [30]
118; called with character to be sent to printer in E
119; with parity set as appropriate.
120; return with accumulator = 0 do do nothing,
121; <> 0 to send char in E.
122mdmflt:
123 mov a,e ;[30] get character to test
124 ret
125
126
127; prtflt - printer filter [30]
128; called with character to be sent to printer in E
129; returns with a = 0 to do nothing
130; a <> 0 to print it.
131;
132; this routine for those printer that automatically insert
133; a lf on cr, or cr for lf. Should this be shifted to
134; the system indep. stuff, in say 4.06?
135prtflt:
136 mov a,e ; [30] get character to test
137 ret
138
139
140;\f
141
142;
143; system-dependent processing for BYE command.
144; for apmmdm, heath, and lobo, hang up the phone.
145sysbye:
146 ret
147;\f
148
149; This is the system-dependent command to change the baud rate.
150; DE contains the two-byte value from the baud rate table; this
151; value is also stored in 'speed'.
152sysspd:
153 ret
154
155;\f
156
157; Speed tables
158; (Note that speed tables MUST be in alphabetical order for later
159; lookup procedures, and must begin with a value showing the total
160; number of entries. The speed help tables are just for us poor
161; humans.
162
163; db string length,string,divisor (2 identical bytes or 1 word)
164; [Toad Hall]
165
166IF sanyo
167spdtbl EQU 0 ; No speed table for the Sanyo
168sphtbl EQU 0 ; ditto help for speed.
169
170; The following conditionals were once a huge if not statement. There
171; wasn't enough room to add the lobo to the list, so it had to be broken
172; into 2, which you can't do with an if not. I redid it as two ifs and
173; applied them to those that wouldn't set baud. [Hal Hostetler]
174;\f
175
176; This is the system-dependent SET PORT command.
177; HL contains the argument from the command table.
178sysprt:
179 ret
180;\f
181
182;
183; Port table not applicable tot he Sanyo...
184prttbl EQU 0
185prhtbl EQU 0 ;
186
187;\f
188
189;
190; selmdm - select modem port
191; selcon - select console port
192; selmdm is called before using inpmdm or outmdm;
193; selcon is called before using inpcon or outcon.
194; For iobyt systems, diddle the I/O byte to select console or comm port;
195; For Decision I, switches Multi I/O board to console or modem serial
196; port. [Toad Hall]
197; For the rest, does nothing.
198; preserves bc, de, hl.
199selmdm:
200 ret
201
202selcon:
203 ret
204;\f
205
206; Get character from console, or return zero.
207; result is returned in A. destroys bc, de, hl.
208;
209inpcon:
210 mvi c,dconio ;Direct console I/O BDOS call.
211 mvi e,0FFH ;Input.
212 call BDOS
213 ret
214;\f
215
216;
217; Output character in E to the console.
218; destroys bc, de, hl
219;
220outcon:
221 mvi c,dconio ;Console output bdos call.
222 call bdos ;Output the char to the console.
223 ret
224;\f
225
226;
227; outmdm - output a char from E to the modem.
228; the parity bit has been set as necessary.
229; returns nonskip; bc, de, hl preserved.
230outmdm:
231IF inout
232 in mnprts ;Get the output done flag.
233 ani output ;Is it set?
234 jz outmdm ;If not, loop until it is.
235 mov a,e
236 out mnport ;Output it.
237 ret
238ENDIF;inout
239
240;\f
241
242;
243; get character from modem; return zero if none available.
244; for IOBYT systems, the modem port has already been selected.
245; destroys bc, de, hl.
246inpmdm:
247IF inout
248;Note: modem port should already be selected for mdI. [Toad Hall]
249 in mnprts ;Get the port status into A.
250 ani input ;See if the input ready bit is on.
251 rz ;If not then return.
252 in mnport ;If so, get the char.
253ENDIF;inout
254 ret ; return with character in A
255
256
257;
258; flsmdm - flush comm line.
259; Modem is selected.
260; Currently, just gets characters until none are available.
261
262flsmdm: call inpmdm ; Try to get a character
263 ora a ; Got one?
264 jnz flsmdm ; If so, try for another
265 ret ; Receiver is drained. Return.
266
267
268;\f
269
270;
271; lptstat - get the printer status. Return a=0 if ok, or 0ffh if not.
272lptstat:
273 xra a ; assume it is ok.. this may not be necessary
274 ret
275;\f
276
277;
278; outlpt - output character in E to printer
279; console is selected.
280; preserves de.
281outlpt:
282 push d ; save DE in either case
283 call prtflt ; go through printer filter [30]
284 ana a ; if A = 0 do nothing,
285 jz outlp1 ; [30] if a=0 do nothing
286 mvi c,lstout
287 call bdos ;Char to printer
288outlp1: pop d ; restore saved register pair
289 ret
290;\f
291
292;
293; Screen manipulation routines
294; csrpos - move to row B, column C
295;
296; csrpos for terminals that use a leadin sequence followed
297; by (row + 31.) and (column + 31.)
298;
299csrpos: push b ; save coordinates
300 lxi d,curldn ; get cursor leadin sequence
301 call prtstr ; print it
302 pop h ; restore coordinates
303 mov a,h ; get row
304 adi (' '-1) ; space is row one
305 mov e,a
306 push h
307 call outcon ; output row
308 pop h
309 mov a,l ; get column
310 adi (' '-1) ; space is column one
311 mov e,a
312 jmp outcon ; output it and return
313ENDIF;NOT (robin OR dmII OR osi OR vector OR termin)
314
315 ret ; Can the Sany do cursor opsitioning??
316
317;
318;
319; delchr - make delete look like a backspace. Unless delete is a printing
320; character, we just need to print a backspace. (we'll output clrspc
321; afterwards)
322; For Kaypro and Vector General, delete puts a blotch on the screen.
323; For Apple and Osborne 1, delete moves but doesn't print.
324delchr:
325 mvi e,bs
326 call outcon
327
328; erase the character at the current cursor position
329clrspc: mvi e,' '
330 call outcon
331 mvi e,bs ;get a backspace
332 jmp outcon
333
334; erase the current line
335clrlin: lxi d,eralin
336 jmp prtstr
337
338; erase the whole screen, and go home. preserves b (but not c)
339clrtop: lxi d,erascr
340 jmp prtstr
341
342
343
344IF SANYO
345outlin: DB ESC,'E',ESC,'H',CR,LF,TAB ;WHATEVER
346sysver: DB 'KERMIT-80 V3.9 [SANYO MBC-1100]',CR,LF,'$' ;VERSION HEADING
347DELSTR: DB ESC,'K','$' ;WHATS A STRING?
348eralin: DB ESC,'P','$' ;CLEAR SPACE
349;CLRLIN: DB ESC,'K','$' ;CLEAR LINE
350erascr: DB ESC,'E',ESC,'H','$' ;CLEAR SCREEN AND CURSOR HOME
351curldn: db esc,'=','$',0 ;cursor lead in
352;SCRNP: DB ESC,'=',24H,25H,'$' ;SPOT FOR SCREEN PACKETS
353;SCRNRT: DB ESC,'=',25H,25H,'$' ;SPOT FOR # OF RETRIES
354;SCRFLN: DB ESC,'=',26H,25H,'$' ;SPOT FOR FILE NAME
355;SCRST: DB ESC,'=',28H,25H,'$' ;SPOT FOR STATUS
356;SCREND: DB ESC,'=',2AH,25H,'$' ;SPOT FOR PROMPT
357;SCRERR: DB ESC,'=',2DH,25H,'$' ;SPOT FOR ERRORS
358ttab: ;NO TRANSLATION TABLE
359ta: DB ESC,'A',0,0 ;CURSOR UP
360tb: DB ESC,'B',0,0 ;CURSOR DOWN
361tc: DB ESC,'D',0,0 ;CURSOR RIGHT
362td: DB ESC,'C',0,0 ;CURSOR LEFT
363te: DB ESC,'E',0,0 ;CLEAR SCREEN
364tf: DB 0,0,0,0 ;WHAT???
365tg: DB 0,0,0,0 ;WHAT???
366th: DB ESC,'H',0,0 ;CURSOR HOME
367ti: DB ESC,'A',ESC,'C',0,0 ;REVERSE LINEFEED??
368tj: DB ESC,'J',0,0 ;CLEAR TO END OF SCREEN
369tk: DB ESC,'K',0,0 ;CLEAR TO END OF LINE
370ENDIF;SANYO
371
372ovlend equ $ ; End of overlay
373
374 END
375\1a
376\1a
377\1a
378\1a
379\1a
380\1a
381\1a
382\1a
383\1a
384\1a
385\1a
386\1a
387\1a
388\1a
389