; Program: T3M-AM2.Z80
; Use: Term3 Modem Overlay
; Written by: David McCord
; Last revised: 05/23/86
;
; Term3 Modem Interface for AMPRO "little board" computers (Z80 DART)
; Uses serial channel 'B' for operation
;
; Completely rewritten for TERM III Phase 2; previous versions did not work.
; Supports baud rates of 300, 1200, 2400, and 9600
;
; Recent changes:
; v2 05/23/86 D. McCord
; redid the mi$init routine.  v1 did not do anything to the DART, which
; wasn't a problem unless you used another comm program (like IMP or
; BYE), which might have left the DART in an undesireable state.
;
; This program, both source code and executable binary code, is
; copyright 1986 Echelon, Inc.  Duplication for non-commercial personal
; use is permitted; all other duplication is prohibited unless authorized
; in writing by the copyright holder.
;
; To use:
;       ZAS T3M-AM1 H                   <- make .HEX file output
;       MLOAD MODEM.BIN=T3M-AM1         <- create binary file
;       T3INS INSTALL                   <- install into TERM3 modules
;
; Cabling:
;       The AMPRO computer serial ports do not utilize the 'standard'
;       control signals DTR and DCD available on the DART; instead, the
;       RTS and CTS signals (respectively) are used.  This means that the
;       following special cable must be used:
;
;               TERM3 Modem Application Cable
;       (assumes factory default wiring of serial port B)
;
;               AMPRO                   Modem
;                 2  -------------------  3
;                 3  -------------------  2
;                 5  ------------------- 20
;                 7  -------------------  7
;                20  -------------------  8
;
;       A T3MASTER/T3SERVER special cable is not required.
;
; Equates - first, port assignments
;
dport   equ     88h             ; data port for DART channel B
sport   equ     dport+4         ; status port for DART channel B
bport   equ     50h             ; CTC baud rate generator port
;
bauds   equ     00010111b       ; 300, 1200, 2400, 9600 supported
;
       org     600h            ; all modem interfaces start at 600h
mi$init:
       jp      smi$init        ; set baud rate
mi$istat:
       jp      smi$istat       ; check input status
mi$ostat:
       jp      smi$ostat       ; check output status
mi$in:
       jp      smi$in          ; get input character
mi$out:
       jp      smi$out         ; send output character
mi$break:
       jp      smi$break       ; send BREAK
mi$cst:
       jp      smi$cst         ; check carrier status
mi$sptab:
       db      bauds
;
; see the TERM III manual, pg 7-8 thru 7-10, for discussion of input and
; output parameters for these subroutines.
;
smi$init:
       push    af
       push    hl
       cp      1
       jr      z,set300
       cp      2
       jr      z,set1200
       cp      3
       jr      z,set2400
       cp      5
       jr      z,set9600
noset:
       pop     hl
       pop     af
       xor     a
       ret
;
set300:
       ld      hl,47d0h                ; CTC commands for 300 bps
       jr      setspec
set1200:
       ld      hl,4768h                ; CTC commands for 1200 bps
       jr      set
set2400:
       ld      hl,4734h                ; CTC commands for 2400 bps
       jr      set
set9600:
       ld      hl,470dh                ; CTC commands for 9600 bps
setspec:
       ld      a,18h           ; reset DART and set clock divider for x32
       out     (sport),a
       ld      a,4
       out     (sport),a
       ld      a,86h
       jr      set1
set:
       ld      a,18h           ; reset DART and set clock divider to x16
       out     (sport),a
       ld      a,4
       out     (sport),a
       ld      a,46h
set1:   out     (sport),a
       ld      a,5
       out     (sport),a
       ld      a,6ah
       out     (sport),a
       ld      a,3
       out     (sport),a
       ld      a,0c1h
       out     (sport),a
       ld      a,h                     ; send command bytes to CTC
       out     (bport),a
       ld      a,l
       out     (bport),a
       pop     hl
       pop     af
       or      a
       ret
;
smi$istat:
       in      a,(sport)
       and     1
       ret     z
       or      0ffh
       ret
;
smi$ostat:
       in      a,(sport)
       and     4
       ret     z
       or      0ffh
       ret
;
smi$in:
       call    smi$istat
       jr      z,smi$in
       in      a,(dport)
       ret
;
smi$out:
       push    af
smi$outloop:
       call    smi$ostat
       jr      z,smi$outloop
       pop     af
       out     (dport),a
       ret
;
smi$break:
       xor     a               ; BREAK not supported (although the DART
       ret                     ; can do it)
;
smi$cst:
       or      255
       ret

;       ld      a,10h
;       out     (sport),a       ; reset status
;       in      a,(sport)
;       and     20h
;       ret     z
;       or      0ffh
;       ret
;
; end of this modem interface
;
       db      'Copyright 1986 Echelon, Inc.'