;***************************************************************************
;*                                                                         *
;*  I2CT-1.ASM - Cromemco TUART overlay for IMP - 12/27/86                 *
;*                                                                         *
;*                          USES TMS 5501 I/O                              *
;*                                                                         *
;*  You will want to look this file over carefully. There are a number of  *
;*  options that you can use to configure the program to suit your taste.  *
;*  This file adapts systems with the Cromemco TUART to IMP.               *
;*                                                                         *
;*  Edit this file for your preferences then follow the "TO USE:" example  *
;*  shown below.                                                           *
;*                                                                         *
;*  Many terminals will clear the screen with a CTL-Z.  If yours does, put *
;*  a 1AH at CLEAR: (010AH).  Many terminals use two characters, the first *
;*  normally an ESC.  For example, ESC *.  In this case put '*' at CLEAR:  *
;*  (The ESC will automatically be typed with no CTL-character present.)   *
;*  If you don't know what your terminal uses, put a 0 at CLEAR: and IMP   *
;*  will scroll up 24 blank lines to clear the CRT for things like MENU,   *
;*  looking at the function key table, typing CTL-Z in command mode, etc.  *
;*                                                                         *
;*  Use the "SET" command to change the baudrate when desired.  The value  *
;*  at MSPEED controls the baudrate when the program is first called up.   *
;*                                                                         *
;*      TO USE: First edit this file filling in answers for your own       *
;*              equipment.  Then assemble with ASM.COM or equivalent       *
;*              assembler.  Then use MLOAD to merge into the main file:    *
;*                                                                         *
;*              MLOAD IMP.COM=IMP.COM,I2CT-x.HEX                           *
;*                                                                         *
;*  =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =  *
;*                                                                         *
;*  12/27/87 - Adapted from I2NH-2              - Mark D. Pickerill        *
;*  10/27/85 - Minor changes                    - Irv Hoff                 *
;*  09/03/85 - Written to work with IMP         - Irv Hoff                 *
;*                                                                         *
;*  =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =  *
;*                                                                         *
;***************************************************************************
                               ;
YES:    EQU     0FFH            ; Value for yes
NO:     EQU     0               ; Value for no
                               ;
                               ; Values shown are for a TMS 5501
                               ;
PORT:   EQU     30H             ; Your base port (data or status)
MDDATP: EQU     PORT+1          ; Modem data port
BDR:    EQU     PORT            ; Baud rate port
MDCTL1: EQU     PORT            ; Status port
MSKP:   EQU     PORT+3          ; Interrupt mask port
MDRCV:  EQU     40H             ; Modem receive ready (dav)
MDSND:  EQU     80H             ; Modem send ready bit  (TBE)
MDTXE:  EQU     80H             ; Modem send buffer empty, holding buffer empty
MDRSET: EQU     09H             ; Resets uart for additional commands
MASK:   EQU     0               ; No interrupts from device
                               ;
;-----------------------------------------------------------------------
                               ;
ESC:    EQU     '['-40H         ; ^[ = escape
BELL:   EQU     'G'-40H         ; ^g = bell character
LF:     EQU     'J'-40H         ; ^j = linefeed
NEXTRY: EQU     'K'-40H         ; ^k = try next phone number, abort this try
CR:     EQU     'M'-40H         ; ^m = carriage return
CLEARSC:EQU     'Z'-40H         ; ^z = clears screen, command mode only
EOFCHAR:EQU     'Z'-40H         ; ^z = end of file
                               ;
;-----------------------------------------------------------------------
                               ;
       ORG     0100H           ; Start of tpa
       DS      3               ; Skip the data area below
                               ;
;***************************************************************************
;*                                                                         *
;*  These routines and equates are at the beginning of the program so      *
;*  they can be patched by a monitor or overlay file without re-assembling *
;*  the program.                                                           *
;*                                                                         *
;***************************************************************************
                               ;
MSPEED: DB      5               ; 0=110 1=300 2=450 3=600 4=710 5=1200          103h
                               ; 6=2400 7=4800 8=9600 9=19200 default
HS2400: DB      NO              ; Yes=2400 bps highest speed                    104h
HS1200: DB      YES             ; Yes=1200 bps highest speed                    105h
RACAL:  DB      NO              ; Yes=racal-vadic 1200v or 2400v or 2400pa      106h
PROMODM:DB      NO              ; Yes=prometheus promodem 1200 bps              107h
RESVD1: DB      NO              ; Reserved for special modems                   108h
RESVD2: DB      NO              ; Reserved for special modems                   109h
                               ;
CLEAR:  DB      'E'             ; Clear screen character (esc not needed)       10ah
CLOCK:  DB      20              ; Clock speed in mhz x10, 25.5 mhz max.         10bh
                               ; 20=2 mhh, 37=3.68 mhz, 40=4 mhz, etc.
BYTDLY: DB      1               ; 0=0 delay  1=10ms  5=50 ms - 9=90 ms          10ch
                               ; Default time to send character in ter-
                               ; Minal mode file transfer for slow bbs
CRDLY:  DB      1               ; 0=0 delay 1=100 ms 5=500 ms - 9=900 ms        10dh
                               ; Default time for extra wait after crlf
                               ; In terminal mode file transfer
NOFCOL: DB      5               ; Number of directory columns shown             10eh
TCHPUL: DB      'T'             ; T=tone, p=pulse (hayes 2400 modems)           10fh
                               ;
ADDLFD: DB      NO              ; Yes=add lf after cr to send file in terminal  110h
                               ; Mode (normally added by remote echo)
CONVRUB:DB      YES             ; Yes=convert rub to backspace                  111h
CRCDFLT:DB      YES             ; Yes=default to crc checking                   112h
IGNRCTL:DB      NO              ; Yes=ctl-chars above ^m not displayed          113h
                               ;
EXTCHR: DB      '['-40H         ; Esc = preceeds local control character        114h
EXITCHR:DB      'E'             ; Exit character                                115h
FILESND:DB      'F'             ; Send file when in terminal mode               116h
NOCONCT:DB      'N'             ; Disconnect from phone line                    117h
LOGCHR: DB      'L'             ; Send logon                                    118h
LSTCHR: DB      'P'             ; Toggle printer                                119h
UNSAVCH:DB      'R'             ; Close input text buffer                       11ah
SAVECHR:DB      'Y'             ; Open input text buffer                        11bh
CLEARS: DB      'Z'             ; Clears screen, terminal mode                  11ch
SPARE1: DB      0               ; For future development                        11dh
NODTR:  DB      YES             ; Yes if no dtr and need +++ to disconnect      11eh
                               ;
;***************************************************************************
;*                                                                         *
;*              Handles in/out ports for data and status                   *
;*                                                                         *
;***************************************************************************
                               ;
I$MDCTL1:                       ;
       IN      MDCTL1          ; 11fh
       RET                     ; In modem control port                 121h
       DB      0,0,0,0,0,0,0   ; Spares if needed                      122h
                               ;
I$MDTXE:IN      MDCTL1          ; (needed for sio or dart register 1    129h
       RET                     ; 12bh
       DB      0,0,0,0,0,0,0   ; 12ch
                               ;
I$MDDATP:                       ;
       IN      MDDATP          ; 133h
       RET                     ; 135h
       DB      0,0,0,0,0,0,0   ; Spares if needed                      136h
                               ;
O$MDDATP:                       ;
       OUT     MDDATP          ; 13dh
       RET                     ; Out modem data port                   13fh
       DB      0,0,0,0,0,0,0   ; Spares if needed                      140h
                               ;
A$MDRCV:ANI     MDRCV           ; 147h
       RET                     ; 149h
                               ;
C$MDRCV:CPI     MDRCV           ; 14ah
       RET                     ; 14ch
                               ;
A$MDSND:ANI     MDSND           ; 14dh
       RET                     ; 14fh
                               ;
C$MDSND:CPI     MDSND           ; 150h
       RET                     ; 152h
                               ;
A$MDTXE:ANI     MDTXE           ; 153h
       RET                     ; 155h
                               ;
C$MDTXE:CPI     MDTXE           ; 156h
       RET                     ; 158h
                               ;
;***************************************************************************
;*                                                                         *
;*  Special exit vector, used by some computers to reset interrupt vectors *
;*                                                                         *
;***************************************************************************
                               ;
J$EXITVEC:                      ;
       RET                     ; 159h
       DB      0,0             ; 15ah
                               ;
                               ; Jump vectors needed by each overlay
                               ;
J$GOODBYE:                      ;
       JMP     GOODBYE         ; Disconnects modem by dropping dtr     15ch
J$INITMOD:                      ;
       JMP     INITMOD         ; Initializes modem, autosets baudrate  15fh
J$STUPR:JMP     STUPR           ; Set routine to change baudrate        162h
J$SYSVR:JMP     SYSVR           ; Signon message                        165h
                               ;
;***************************************************************************
;*                                                                         *
;*  "AT" command strings, can be replaced in individual overlay if needed  *
;*                                                                         *
;***************************************************************************
                               ;
J$STRNGA: DS    3               ; 1200 bps "AT" string                  168h
J$STRNG1: DS    3               ; 2400 bps "AT" string                  16bh
                               ;
;***************************************************************************
;*                                                                         *
;*  Next fourteen lines should not be changed by user overlay as these go  *
;*  to specific locations in the main program, not in the overlay.         *
;*                                                                         *
;***************************************************************************
                               ;
J$CMDSPL:                       ;
       DS      3               ; Allows entry of baudrate on cmd line  16eh
J$CRLF: DS      3               ; Turns up one new line on display      171h
J$DIAL: DS      3               ; Start of dialing routine              174h
J$DSCONT:                       ;
       DS      3               ; Terminates modem use                  177h
J$GOLST:DS      3               ; Printer routine, needed by apple //e  17ah
J$ILPRT:DS      3               ; Prints an inline string, 0 to end     17dh
J$INBUF:DS      3               ; Stores a keybd string for comparison  180h
J$INLNCP:                       ;
       DS      3               ; Inline "compare strings" routine      183h
J$INMDM:DS      3               ; Max .1 sec wait for modem character   186h
J$RCVRSP:                       ;
       DS      3               ; For 3801 i/o use (tv-803)             189h
J$SNDCHR:                       ;
       DS      3               ; Sends a character to the modem        18ch
J$SNDSTR:                       ;
       DS      3               ; Sends a string to the modem, $ to end 18fh
J$TIMER:DS      3               ; 1 second timer (amount in 'b' reg.)   192h
J$NEW1: DB      0,0,0           ; For future needs                      195h
J$NEW2: DB      0,0,0           ; For future needs                      198h
                               ;
                               ; For 2400 bps auto-stepdown units
                               ;
MANUAL: DB      0               ; For manual selection flag             19bh
                               ;
J$300:  JMP     OK300           ; Sets baudrate to 300 baud             19ch
J$1200: JMP     OK1200          ; Sets baudrate to 1200 bps             19fh
J$2400: JMP     OK2400          ; Sets baudrate to 2400 bps             1a2h
                               ;
LOGPTR: DW      LOGON           ; Pointer to display logon message      1a5h
SYSVR:  CALL    J$ILPRT         ; Display the following line            1a7h
       DB      'Version for Cromemco TUART modem port 30H' ; 1aah
       DB      CR,LF,0         ;
       RET                     ; Go home
                               ;
;***************************************************************************
;*                                                                         *
;*  NOTE:  You can change the SYSVER message to be longer or shorter.      *
;*  The end of your last routine should terminate by 0400H (601 bytes      *
;*  available after start of SYSVER).                                      *
;*                                                                         *
;*-------------------------------------------------------------------------*
;*                                                                         *
;*  You can put in a message at this location which can be called up with  *
;*  (special character-L).  You can put in several lines.  End with a 0.   *
;*                                                                         *
;***************************************************************************
                               ;
LOGON:  DB      'S-100 Forever...' ; Logon message
       DB      CR,LF,0         ;
                               ;
;***************************************************************************
;*                                                                         *
;*      This routine normally sets DTR low for 300 ms to disconnect the    *
;*      phone.  As the TUART does not support DTR, this routine is deleted *
;*      from this overlay and NODTR is set true.  If your TUART has been   *
;*      modified to control DTR (using the spare 1488/1489 sections),      *
;*      patch the below routine accordingly.                               *
;*                                                                         *
;***************************************************************************
                               ;
GOODBYE:                        ;
       MVI     B,'S'-40H       ; X-off to stop host if needed
       CALL    J$SNDCHR        ;
       MVI     B,1             ; Wait a moment to let it react
       CALL    J$TIMER         ;
                               ;
                               ; Command to set dtr low goes here
                               ;
       MVI     B,3             ; Delay 300 ms to hang up phone
       CALL    J$TIMER         ;
                               ;
                               ; Command to set dtr high goes here
                               ;
       RET                     ; Go home
                               ;
                               ; Sets tms 5501 to 8 bits, no parity, 1 stop
                               ;
INITMOD:                        ;
       LDA     MSPEED          ; Get the selected value
       CPI     1               ; 300 bps
       JZ      OK300           ;
       CPI     5               ; 1200 bps
       JZ      OK1200          ;
       CPI     6               ; 2400 bps
       JZ      OK2400          ;
                               ;
       JMP     STUPR1          ; Else ask what is wanted
                               ;
STUPR:  CALL    J$CMDSPL        ; Gives us cmdbuf+6
       JNC     STUPR2          ;
                               ;
STUPR1: LDA     HS2400          ; 2400 baud?
       ORA     A               ; Force flags
       JZ      STUPR1A         ; No
       CALL    J$ILPRT         ;
       DB      'Input Baud Rate (300, 1200, 2400): ',0
       JMP     AROUND          ; Around next
STUPR1A:CALL    J$ILPRT         ;
       DB      'Input Baud Rate (300, 1200): ',0
AROUND: LXI     D,BAUDBUF       ; Point to new input buffer
       CALL    J$INBUF         ;
       CALL    J$CRLF          ;
       LXI     D,BAUDBUF+2     ;
                               ;
STUPR2: CALL    J$INLNCP        ; Compare baudbuf+2 with chars. below
       DB      '300',0         ; 300 baud
       JNC     OK300           ; Go if got match
       CALL    J$INLNCP        ;
       DB      '1200',0        ; 1200 baud
       JNC     OK1200          ;
       CALL    J$INLNCP        ;
       DB      '2400',0        ; 2400 baud
       JNC     OK2400          ;
       CALL    J$ILPRT         ; All matches failed, tell operator
       DB      '++ Incorrect entry ++',CR,LF,BELL,CR,LF,0 ; Screwup
       JMP     STUPR1          ; Try again
                               ;
OK300:  MVI     A,1             ; Mspeed 300 baud value
       MVI     B,BD300         ; Get 300 baud parameters in b
       JMP     LOADBD          ; Go load them
                               ;
OK1200: MVI     A,5             ; Mspeed 1200 baud value
       MVI     B,BD1200        ; Get 1200 baud parms in b
       JMP     LOADBD          ; Go do it
                               ;
                               ;
OK2400: LDA     HS2400          ; 2400 baud supported?
       ORA     A               ; Force flags
       JZ      OK1200          ; No
       MVI     A,6             ; Mspeed 2400 baud value
       MVI     B,BD2400        ; Get 2400 baud parms in b
       JMP     LOADBD          ; Go do it
                               ;
LOADBD: STA     MSPEED          ; Change time-to-send to match baudrate
                               ;
;***************************************************************************
;*                                                                         *
;*      INIT:  This routine initializes 1 chanel of the Cromemco TUART.    *
;*      Accepts: Baud rate in B   Returns: Nothing.  Clobbers: Nothing.    *
;*      Calls:  Nothing.                                                   *
;*                                                                         *
;***************************************************************************
                               ;
INIT:   PUSH    PSW             ; Save acc
       MVI     A,MDRSET        ; Get command
       OUT     PORT+2          ; Device reset
                               ;
       MVI     A,MASK          ; Get interrupt mask
       OUT     MSKP            ; Mask set
                               ;
       MOV     A,B             ; Get baud rate
       OUT     BDR             ; Rate set
       POP     PSW             ; Restore acc
       RET                     ; Go home
                               ;
                               ; Table of baudrate parameters
                               ;
BD300:  EQU     84H             ; 300 baud
BD1200: EQU     88H             ; 1200 baud
BD2400: EQU     90H             ; 2400 baud
                               ;
BAUDBUF:DB      10,0,0,0,0,0    ;
       DB      0,0,0,0,0,0     ;
                               ;
                               ; Note: must terminate by 0400h
                               ;
       END                     ; End