IF NOT lasm
.printx * CPXSYO.ASM *
ENDIF	;NOT lasm
;       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 dependent part for Sanyo MBC 1100
;	systems, and has been extracted from the CPMSYO.ASM code (kermit
;	version 3.5)
;
; revision history:
;
; edit 1, 27 October, 1987, by OBSchou.  Extracted Sanyo code from CPMSYO.ASM
;	and massaged fort CP/M kermit V4.09
;
; Keep module name, edit number, and last revision date in memory.
family: db      'CPXSYO.ASM (1)  27-Oct-87 $'
;

; Assembly time message to let me know I'm building the right version.
; LASM generates an 'S' error along with the message, which is messy, but
; better than trying to put everything inside a IF m80 OR mac80 conditional,
; because LASM doesn't like nested IF's, either.

IF sanyo
.printx * Assembling Kermit-80 for Sanyo MBC 1100 *
ENDIF

iobyte  EQU     03H     ;Location of I/O byte

if sanyo
baudrt	EQU	0DAH	;BAUD RATE MEMORY LOCATION
MNPORT	EQU	0DCH	;COMMUNICATIONS PORT
MNPRTS	EQU	0DDH	;COMMUNICATIONS PORT STATUS
OUTPUT	EQU	01H	;OUTPUT READY BIT
INPUT	EQU	02H	;INPUT READY BIT
ENDIF;SANYO

defesc	EQU 	'\'-100O        ;The default escape character.

; Select initial setting for VT-52 emulation flag.
vtval   EQU	1


sysxin:	;system initialisation not covered by sysinit
        ret                     ; return from system-dependent routine

;

;
;       system-dependent termination processing
;       If we've changed anything, this is our last chance to put it back.
sysexit:
        ret

;
;       system-dependent processing for start of CONNECT command
;
syscon:
        ret

;

;
;       syscls - system-dependent close routine
;       called when exiting transparent session.
;
syscls:
        ret
;

;
;       sysinh - help for system-dependent special functions.
;       called in response to <escape>?, after listing all the
;       system-independent escape sequences.
;
sysinh:	
	lxi	d,inhlps	; we got options...
	call	prtstr		; print them.
        ret
inhlps:
        db      '$'                     ;[hh] table terminator

;
;       sysint - system dependent special functions
;       called when transparent escape character has been typed;
;       the second character of the sequence is in A (and in B).
;       returns:
;       non-skip: sequence has been processed
;       skip:   sequence was not recognized
sysint:
	ani     137O            ; convert lower case to upper, for testing...
        ret

;	sysflt - system-dependent filter.
;	called with the character in E.
;       preserves bc, de, hl.
;       note: <xon>,<xoff>,<del>, and <nul> are always discarded.
sysflt:
        mov     a,e             ; get character for testing
        ret

;       mdmflt - modem filter [30]
;       called with character to be sent to printer in E
;       with parity set as appropriate.
;       return with accumulator = 0 do do nothing,
;                               <> 0 to send char in E.
mdmflt:
        mov     a,e             ;[30] get character to test
        ret


;       prtflt - printer filter [30]
;       called with character to be sent to printer in E
;       returns with a = 0 to do nothing
;                    a <> 0 to print it.
;
;       this routine for those printer that automatically insert
;       a lf on cr, or cr for lf.  Should this be shifted to 
;       the system indep. stuff, in say 4.06?
prtflt:
        mov     a,e             ; [30] get character to test
        ret


;

;
; system-dependent processing for BYE command.
;  for apmmdm, heath, and lobo, hang up the phone.
sysbye:
        ret
;

;       This is the system-dependent command to change the baud rate.
;       DE contains the two-byte value from the baud rate table; this
;       value is also stored in 'speed'.
sysspd:
        ret

;

;       Speed tables
; (Note that speed tables MUST be in alphabetical order for later
; lookup procedures, and must begin with a value showing the total
; number of entries.  The speed help tables are just for us poor
; humans.

;       db      string length,string,divisor (2 identical bytes or 1 word)
; [Toad Hall]

IF sanyo	
spdtbl	EQU	0	; No speed table for the Sanyo
sphtbl	EQU	0	; ditto help for speed.

; The following conditionals were once a huge if not statement.  There
; wasn't enough room to add the lobo to the list, so it had to be broken
; into 2, which you can't do with an if not.  I redid it as two ifs and
; applied them to those that wouldn't set baud. [Hal Hostetler]
;

;       This is the system-dependent SET PORT command.
;       HL contains the argument from the command table.
sysprt:
        ret
;

;
;	Port table not applicable tot he Sanyo...
prttbl   EQU     0
prhtbl   EQU     0               ;

;

;
;       selmdm - select modem port
;       selcon - select console port
;       selmdm is called before using inpmdm or outmdm;
;       selcon is called before using inpcon or outcon.
;       For iobyt systems, diddle the I/O byte to select console or comm port;
;       For Decision I, switches Multi I/O board to console or modem serial
;       port.  [Toad Hall]
;       For the rest, does nothing.
;       preserves bc, de, hl.
selmdm:
        ret

selcon:
        ret
;

;       Get character from console, or return zero.
;       result is returned in A.  destroys bc, de, hl.
;
inpcon:
        mvi     c,dconio        ;Direct console I/O BDOS call.
        mvi     e,0FFH          ;Input.
        call    BDOS
        ret
;

;
;       Output character in E to the console.
;       destroys bc, de, hl
;
outcon:
        mvi     c,dconio        ;Console output bdos call.
        call    bdos            ;Output the char to the console.
        ret
;

;
;       outmdm - output a char from E to the modem.
;               the parity bit has been set as necessary.
;       returns nonskip; bc, de, hl preserved.
outmdm:
IF inout
        in      mnprts          ;Get the output done flag.
        ani     output          ;Is it set?
        jz      outmdm          ;If not, loop until it is.
        mov     a,e
        out     mnport          ;Output it.
        ret
ENDIF;inout

;

;
;       get character from modem; return zero if none available.
;       for IOBYT systems, the modem port has already been selected.
;       destroys bc, de, hl.
inpmdm:
IF inout
;Note: modem port should already be selected for mdI.  [Toad Hall]
        in      mnprts          ;Get the port status into A.
        ani     input           ;See if the input ready bit is on.
        rz                      ;If not then return.
        in      mnport          ;If so, get the char.
ENDIF;inout
	ret                     ; return with character in A


;
;       flsmdm - flush comm line.
;       Modem is selected.
;       Currently, just gets characters until none are available.

flsmdm: call    inpmdm          ; Try to get a character
        ora     a               ; Got one?
        jnz     flsmdm          ; If so, try for another
        ret                     ; Receiver is drained.  Return.


;

;
;       lptstat - get the printer status. Return a=0 if ok, or 0ffh if not.
lptstat:
        xra     a               ; assume it is ok.. this may not be necessary
        ret
;

;
;       outlpt - output character in E to printer
;       console is selected.
;       preserves de.
outlpt:
        push    d               ; save DE in either case
        call    prtflt          ; go through printer filter [30]
        ana     a               ; if A = 0 do nothing,
        jz      outlp1          ; [30] if a=0 do nothing
        mvi     c,lstout
        call    bdos            ;Char to printer
outlp1: pop     d               ; restore saved register pair
        ret
;

;
;       Screen manipulation routines
;       csrpos - move to row B, column C
;
;       csrpos for terminals that use a leadin sequence followed
;        by (row + 31.) and (column + 31.)
;
csrpos: push    b               ; save coordinates
        lxi     d,curldn        ; get cursor leadin sequence
        call    prtstr          ; print it
        pop     h               ; restore coordinates
        mov     a,h             ; get row
        adi     (' '-1)         ; space is row one
        mov     e,a
        push    h
        call    outcon          ; output row
        pop     h
        mov     a,l             ; get column
        adi     (' '-1)         ; space is column one
        mov     e,a
        jmp     outcon          ; output it and return
ENDIF;NOT (robin OR dmII OR osi OR vector OR termin)

	ret		; Can the Sany do cursor opsitioning??

;
;
; delchr - make delete look like a backspace.  Unless delete is a printing
;       character, we just need to print a backspace. (we'll output clrspc
;       afterwards)
;       For Kaypro and Vector General, delete puts a blotch on the screen.
;       For Apple and Osborne 1, delete moves but doesn't print.
delchr:
	mvi	e,bs
	call	outcon

; erase the character at the current cursor position
clrspc: mvi     e,' '
        call    outcon
        mvi     e,bs            ;get a backspace
        jmp     outcon

; erase the current line
clrlin: lxi     d,eralin
        jmp     prtstr

; erase the whole screen, and go home. preserves b (but not c)
clrtop: lxi     d,erascr
        jmp     prtstr



IF SANYO
outlin:	DB	ESC,'E',ESC,'H',CR,LF,TAB	;WHATEVER
sysver:	DB	'KERMIT-80 V3.9 [SANYO MBC-1100]',CR,LF,'$' ;VERSION HEADING
DELSTR:	DB	ESC,'K','$'			;WHATS A STRING?
eralin:	DB	ESC,'P','$'			;CLEAR SPACE
;CLRLIN:	DB	ESC,'K','$'			;CLEAR LINE
erascr:	DB	ESC,'E',ESC,'H','$'		;CLEAR SCREEN AND CURSOR HOME
curldn:	db	esc,'=','$',0			;cursor lead in
;SCRNP:		DB	ESC,'=',24H,25H,'$'		;SPOT FOR SCREEN PACKETS
;SCRNRT:	DB	ESC,'=',25H,25H,'$'		;SPOT FOR # OF RETRIES
;SCRFLN:	DB	ESC,'=',26H,25H,'$'		;SPOT FOR FILE NAME
;SCRST:		DB	ESC,'=',28H,25H,'$'		;SPOT FOR STATUS
;SCREND:	DB	ESC,'=',2AH,25H,'$'		;SPOT FOR PROMPT
;SCRERR:	DB	ESC,'=',2DH,25H,'$'		;SPOT FOR ERRORS
ttab:						;NO TRANSLATION TABLE
ta:	DB	ESC,'A',0,0			;CURSOR UP
tb:	DB	ESC,'B',0,0			;CURSOR DOWN
tc:	DB	ESC,'D',0,0			;CURSOR RIGHT
td:	DB	ESC,'C',0,0			;CURSOR LEFT
te:	DB	ESC,'E',0,0			;CLEAR SCREEN
tf:	DB	0,0,0,0				;WHAT???
tg:	DB	0,0,0,0				;WHAT???
th:	DB	ESC,'H',0,0			;CURSOR HOME
ti:	DB	ESC,'A',ESC,'C',0,0		;REVERSE LINEFEED??
tj:	DB	ESC,'J',0,0			;CLEAR TO END OF SCREEN
tk:	DB	ESC,'K',0,0			;CLEAR TO END OF LINE
ENDIF;SANYO

ovlend	equ	$	; End of overlay

	END