;
; QT-SB18.Z80 - Micromint SB180 overlay for QTERM 4.0a
;               by Steven Gold
;
; This overlay file was modeled after the Micromint SB180 overlay
; for use with Term3. (See T3M-HI3.Z80 or T3M-HI2.Z80)
;
; I have also used structures from other modem overlays.
;
;
; The patch points indicated by the QTERM documentation have been
; worked into the overlay, some routines have been moved around to fit
; the QTERM architecture, and others have been deleted since they do
; not apply to the QTERM program.
;
; TO USE: First edit this file with your favorite ASCII editor, changing
;               routines to conform to your hardware and changing
;               equates to conform to your implementation selections.
;               Then assemble with the SLR Systems SLR180 assembler and
;               apply the overlay using MLOAD to the original .COM file
;               to produce the patched .COM file.
;
; Note: While I admire David Goodenough's intentions with this software,
;       expecting most users to make their own patches with DDT, SID, or
;       whatever isn't exactly realistic. Hopefully, this overlay can be
;       used as the basis for more and better overlays to QTERM. Feel free
;       to fix and enhance as you wish!
;
;
; History:
;
;       03/22/89 - QT6-SB18 - David Goodenough supplied me with an other
;       Steven Gold  overlay that was done for the SB-180 by Willy Gonnason of
;                    the U. of Calgary Electrical Engineering Dept. I've used
;                    his code for the BAUDSET and MODSET routines.
;
;       03/20/89 - QT5-SB18 - I couldn't get the Baud Rates to change properly,
;       Steven Gold  they still need alittle work. When you enter a baud
;                    rate with code I have it messes-up the baudrate port.
;                    Still no support for 7E1 etc. Also I
;                    found out I was overwriting other code in certain places,
;                    the program was working so I hadn't thought to check
;                    before.
;
;       03/18/89 - QT4-SB18 - release version
;
; Note2: The changing of baud rates still does not seem to work properly
;        and I still have not tried to set the port definitions for 7E1 etc.
;
; Note3: I use a terminal that emulates the Televideo 910 so I left the terminal
;        portion alone.
;
; *************************************************************************
;
BELL:   EQU     07h     ;bell
CR:     EQU     0Dh     ;carriage return
ESC:    EQU     1Bh     ;escape
LF:     EQU     0Ah     ;line feed
BDOS:   EQU     05H
;
YES:    EQU     0FFh
NO:     EQU     0
;
;
; Select one of the following for your computer board
;
CLK6    EQU     NO              ; Yes if using 6 MHz clock
CLK9    EQU     YES             ; Yes if using 9 MHz clock
Clk12   EQU     NO              ; Yes if using 12 MHz clock
;
;
;
; Values shown are for a HD64180
;
;
PRINTC: EQU     0109h           ;QTERM print char routine address
;
cntla   EQU     0               ; ASCI Control Register A Channel 0
cntlb   EQU     2               ; ASCI Control Register B Channel 0
stat    EQU     4               ; ASCI Status Register Channel 0
tdr     EQU     6               ; ASCI Transmit Data Register Channel 0
rdr     EQU     8               ; ASCI Receive Data Register Channel 0
CTS     EQU     00100000B       ; Clear-to-send input (pin 5)
DCD     EQU     00000100B       ; Data Carrier detect bit (pin 8)
RDRF    EQU     10000000B       ; RECEIVE DATA REGISTER FULL
TDRE    EQU     00000010B       ; TRANSMIT DATA REGISTER EMPTY
;
;
;
;       Code begins here...
;
; Modem input status routine:
;
       ORG     0110h
; Input status.  Returns Z and A=0 if nothing waiting.
;
ISTAT:  CALL    IISTAT
       AND     RDRF
       RET     Z
       LD      A,0FFH
       RET
;
;
; Read Modem character routine:
;
       ORG     0120h
;
; Recieve a character
;
INP:    CALL    ISTAT
       JR      Z,INP
       IN0     A,(rdr)
       RET
;
; Modem output status routine:
;
       ORG     0130h
; Output status.  Returns Z and A=0 if not ready to send.
;
OSTAT:  CALL    IISTAT          ; GET STATUS REG
       AND     TDRE
OST1:   LD      A,0FFH
       OR      A
       RET
;
; Write Modem character routine:
;
       ORG     0140h
;
OUTP:   PUSH    AF
       CALL    CKCTS           ; check CTS
OUTP1:  CALL    OSTAT
       JR      Z,OUTP1
OUTP2:  POP     AF              ; return point from "CTS false" delay
       OUT0    (tdr),A
       RET
;

;
; Start break routine:
;
       ORG     0150h
STRBRK:
       RET
;
; End Break routine:
;
       ORG     0160h
ENDBRK:
       RET
;
; Drop DTR routine:
;
       ORG     0170h
;Turn DTR (and RTS) OFF. (set)
dtroff:
       in0     a,(cntla)
       or      10h             ; RTS off
       out0    (cntla),a
       ret

;
; Restore DTR routine:
;
       ORG     0180h
;Turn DTR (and RTS) ON. (reset)
dtron:
       in0     a,(cntla)
       and     0efh            ; RTS on
       out0    (cntla),a
       ret
;
; Set Baud Rate routine:
;
;
       ORG     190H            ; set serial port baud rate
BAUDSET:
       PUSH    AF
       LD      A,(BAUDSTOR)
       AND     11111000B
       POP     BC
       OR      A,B
       OUT0    (cntlb),A       ; set it...
       LD      (BAUDSTOR),A
       RET



;
; Baud rate table:
;
       ORG     01A0h
; Baud Rate Tables
;
        if     clk6
;
; HD64180 commands to set baud rates @ 6.144 MHz clock
;
BAUDTB:
       DB      00,NO           ;38,400 bps disabled
       DB      01h,NO          ;19,200 bps disabled
       DB      02h,No          ; 9,600 bps enabled
       DB      03h,No          ; 4,800 bps enabled
       DB      04h,YES         ; 2,400 bps enabled
       DB      05h,YES         ; 1,200 bps enabled
       DB      06h,NO          ;   600 bps enabled
       DB      0dh,Yes         ;   300 bps enabled
        endif
        if     clk9
;
; HD64180 commands to set baud rates @ 9.216 MHz clock
;
BAUDTB:
       DB      00,NO           ;38,400 bps disabled
       DB      20h,NO          ;19,200 bps disabled
       DB      21h,NO          ; 9,600 bps enabled
       DB      22h,NO          ; 4,800 bps enabled
       DB      23h,YES         ; 2,400 bps enabled
       DB      24h,YES         ; 1,200 bps enabled
       DB      25h,NO          ;   600 bps enabled
       DB      26h,YES         ;   300 bps enabled
        endif
        if     clk12
;
; HD64180 commands to set baud rates @ 12.288 MHz clock
;
BAUDTB:
       DB      00,NO           ;38,400 bps disabled
       DB      02H,NO          ;19,200 bps disabled
       DB      03h,NO          ; 9,600 bps enabled
       DB      04h,NO          ; 4,800 bps enabled
       DB      05h,YES         ; 2,400 bps enabled
       DB      06h,YES         ; 1,200 bps enabled
       DB      0Dh,NO          ;   600 bps enabled
       DB      0Eh,YES         ;   300 bps enabled
        endif
;
; Communications mode setting routine:
;
;
       ORG     1B0H
SETMOD:                          ; set communication mode
       JP      SETBAUDS          ; not enough room here...
;
;
       ORG     1C0H              ; communication mode table
MODTBL:
       DB      60H             ; 7 N 1
       DB      64H             ; 8 N 1
       DB      61H             ; 7 N 2
       DB      65H             ; 8 N 2
       DB      62H             ; 7 E 1
       DB      66H             ; 8 E 1
       DB      63H             ; 7 E 2
       DB      67H             ; 8 E 2
       DB      72H             ; 7 O 1
       DB      76H             ; 8 O 1
       DB      73H             ; 7 O 2
       DB      77H             ; 8 O 2


; Protocal Transfer Size
;
       ORG     01CDH
       RET
;
; Processor speed
;
       ORG     01CEh
;
        IF     CLK6
CPUSPD: DB      06H             ; Clock speed in MHz
        ENDIF                  ; CLK6
        IF     CLK9
CPUSPD: DB      09H             ; Clock speed in MHz
        ENDIF                  ; CLK9
        IF     CLK12
CPUSPD: DB      12H             ; Clock speed in MHz
        ENDIF                  ; CLK12

;
ESCHAR:
       DB      ESC             ; escape/meta char to enable QTERM functions
;
; Signon message (max of 15 bytes plus NULL terminator byte):
;
       ORG     01D0h
SIGNON:
       DB      'Micromint SB180',0
;
; string to clear screen
;
       ORG     01F0h
CLSCRN:
       DB      'Z'-'@',0       ; Control-Z on my Wyse-60 terminal

;
; GOTOXY routine (to control cursor placement):
;
       ORG     0200h
GOTOXY:
;       RET
;
;
; Terminal capability bit map:
;       these bits are set (1) if the terminal capability is present and
;       reset (0) if it is not.
;
       ORG     022Fh
TCBMAP:
       DB      11111111b
;               ||||||||
;               |||||||------- bright (end highlight)
;               ||||||-------- dim (start highlight)
;               |||||--------- delete line
;               ||||---------- insert line
;               |||----------- delete character
;               ||------------ insert character
;               |------------- clear to end of line
;               -------------- clear to end of screen
;
;

;
; Term Cap strings:
;
       ORG     0230h
STHILT: DB      ESC,'(',00h             ; 8 bytes to define start hilite...
;
       ORG     0238h
ENHILT: DB      ESC,')',00h             ; 8 bytes to define end hilite...
;
       ORG     0240h
DELINE: DB      ESC,'R',00h             ; delete line
;
       ORG     0248h
INSLIN: DB      ESC,'E',00h             ; insert line
;
       ORG     0250h
DELCHR: DB      ESC,'W',00h             ; delete char
;
       ORG     0258h
INSCHR: DB      ESC,'Q',00h             ; insert char
;
       ORG     0260h
CLREOL: DB      ESC,'T',00h             ; clear to EOL
;
       ORG     0268h
CLREOS: DB      ESC,'Y',00h             ; clear to end of screen
;
;
; Entry subroutine
;
       ORG     0270H
ENTER:
       RET
;
; Exit subroutine
;
       ORG     0273H
EXIT:
       RET
;
;
; End of QTERM defined patches.
;
; begin custom patch area:
;
       ORG     0276h
;
; Read stat twice, as per Hitachi manual
;
IISTAT: IN0     A,(stat)
       IN0     A,(stat)
       OR      A
       RET
;
; Check state of CTS* and return A=0 and Z if CTS is true.
;
CKCTS:  IN0     A,(cntlb)
       AND     CTS
       RET     Z
       LD      A,0FFh
       RET
;
SETBAUDS:
       PUSH    AF
       LD      A,(BAUDSTOR)
       POP     BC
       PUSH    BC
       BIT     4,B
       SET     4,A
       JR      NZ,NORST
       RES     4,A
NORST:
       OUT0    (cntlb),A       ;set even/odd
       LD      (BAUDSTOR),A
       POP     AF
       RES     4,A             ;bring up DTR
       OUT0    (cntla),A       ;set parity/noparity
       RET

BAUDSTOR:
       DB      0               ; storage for current baud rate.
       RET

;
; Custom patch area must end *PRIOR* to 0300h!!!!!
;
       END