; MXO-AC01 - MEX overlay for the Apple-Cat ][ - jms 84/06/14
;
; This overlay is for use with MEX. It was adapted from the M7AC+3.ASM
;       overlay for modem7xx.
;
; This version DOES NOT support dialing. It works with either the
;       MicroSoft Softcard implementation (V2.2) or the ALS CP/M Card
;       (V3.01). See the Customization section equates for details.
;
;
; Please report any bugs, etc. to:
;                       James M. Scardelis
;                       Director
;                       CP/M Plus Users' Group
;                       P.O. Box 295
;                       Little Falls, NJ 07424-0295
;
; Please upload a copy of any updates to:
;
;               CNY-Tech RBBS   (315)437-4890
;               CP/M Net East   (201)249-0691
;
;     Both of those systems are 300/1200 baud...
;
; I plan to implement dialing capabilities in the next version of this
;       file, but only for the ALS CP/M CARD!
;
;======================================================================
;
;       Misc. Equates
;
;----------------------------------------------------------------------
               ORG     100H
;
BELL:           EQU     07H             ;Bell
CR:             EQU     0DH             ;Carriage return
ESC:            EQU     1BH             ;Escape
LF:             EQU     0AH             ;Line feed
;
YES             EQU     0FFH
NO              EQU     0H
;
;-----------------------------------------------------------------------
;       A misc. macro to generate i/o subs for the ALSCARD
;-----------------------------------------------------------------------
PUT             MACRO   DUMMY
               PUSH    H
               LXI     H,DUMMY
               JMP     APWRT
               ENDM

;
;=======================================================================
;
;       Customization Area
;
;-----------------------------------------------------------------------
;
ALSCARD:        EQU     YES             ;Yes if ALS CP/M Card
CPM2CARD:       EQU     NO              ;Yes if SoftCard or clone
;
MODCTL1:        EQU     0               ;Dummy modem control port
MODCTL2:        EQU     0               ;Dummy modem control port
;
CATSLOT:        EQU     2               ;Slot of Apple-Cat
;
;======================================================================
;
               IF      ALSCARD
;
MAPOFF:         EQU     0               ;ALS memory map offset is 0

               ENDIF
;
               IF      CPM2CARD

MAPOFF:         EQU     2000H           ;MicroSoft offset is 2000h

               ENDIF

SLOT            EQU     CATSLOT*16
COM             EQU     0C08CH+SLOT+MAPOFF
XMTBYT          EQU     0C08DH+SLOT+MAPOFF
CON             EQU     0C08AH+SLOT+MAPOFF
BSRBYT          EQU     0C083H+SLOT+MAPOFF
SHBYT           EQU     0C082H+SLOT+MAPOFF
SQUBYT          EQU     0C081H+SLOT+MAPOFF
RECBYT          EQU     0C089H+SLOT+MAPOFF
INDAT           EQU     0C08BH+SLOT+MAPOFF
OUTDAT          EQU     0C08EH+SLOT+MAPOFF
SPDBYT          EQU     0C08BH+SLOT+MAPOFF
STATUS          EQU     0C08FH+SLOT+MAPOFF
DEVBYT          EQU     0C08FH+SLOT+MAPOFF
DACBYT          EQU     0C080H+SLOT+MAPOFF

               IF      CPM2CARD

XMTRAM          EQU     0F01BH          ;to clear status

               ENDIF

               IF      ALSCARD

XMTRAM          EQU     001BH           ;to clear status

               ENDIF

MODDCD3         EQU     0
MODDCD12        EQU     0               ;for 212 board
MODRCVB:        EQU     2               ;bit to test for receive
MODRCVR:        EQU     2               ;value when ready
MODSNDB:        EQU     1               ;bit to test for send
MODSNDR:        EQU     1               ;value when ready
;
CONOUT          EQU     2               ;simulated bdos fcn 2
PRINT           EQU     9               ;simulated bdos fcn 9
MEX             EQU     0D00H           ;mex's command processor
;
;
; ALS CP/M Card clock is 6mHz; MicroSoft is 2mHz...adjust clock: to
;  match your system.


               DS      3               ;Mex has a JMP START here.

PMODEM:         DB      NO
SMODEM:         DB      NO
TPULSE:         DB      'T'
CLOCK:          DB      60              ;clock speed x .1, up to 25.5mHz
MSPEED:         DB      1               ;0=110 1=300 2=450 3=600 4=710
                                       ;5=1200 6=2400 7=4800 8=9600
                                       ;9=19200

BYTDLY:         DB      5
CRDLY:          DB      5
COLUMS:         DB      5
SETFL:          DB      YES             ;must be yes for this overlay
SCRTST:         DB      YES
               DB      0
BAKFLG:         DB      YES             ;yes to make .bak file
CRCDFL:         DB      YES             ;default to CRC
TOGCRC:         DB      YES
CVTBS:          DB      NO
TOGLBK:         DB      YES
ADDLF:          DB      NO
TOGLF:          DB      YES
TRNLOG:         DB      NO
SAVCCP:         DB      NO
LOCNXT:         DB      YES
TOGLOC:         DB      YES
LSTTST:         DB      YES
XOFTST:         DB      NO
XONWT:          DB      NO
TOGXOF:         DB      YES
IGNCTL:         DB      YES
EXTRA1:         DB      0
EXTRA2:         DB      0
BRKCHR:         DB      '@'-40H
NOCONN:         DB      'N'-40H
LOGCHR:         DB      'L'-40H
LSTCHR:         DB      'P'-40H
UNSVCH:         DB      'R'-40H
TRNCHR:         DB      'T'-40H
SAVCHR:         DB      'Y'-40H
EXTCHR:         DB      '^'-40H
               DS      2

; Low-level modem i/o routines - will be jump table in mex2.0

INCTL1:         JMP     LDASTAT
               DS      7
OTDATA:         JMP     STAOUTD
               DS      7
INPORT:         JMP     LDADATP
               DS      7

; Bit-test routines

MASKR:          ANI     00001000B ! RET
TESTR:          CPI     00001000B ! RET
MASKS:          ANI     00010000B ! RET
TESTS:          CPI     00010000B ! RET

               DS      12
LOGON:          DS      2
DIALV:          DS      3               ;dial routine not yet implemented.
DISCV:          JMP     DISCON
GOODBV:         DS      3
INMODV:         JMP     INITMOD
NEWBDV:         DS      3
NOPARV:         DS      3
PARITV:         DS      3
SETUPV:         JMP     SETUPR
SPMENU:         DS      3
VERSNV:         JMP     SYSVER
BREAKV          JMP     SENDBRK

ILPRTV:         DS      3
INBUFV:         DS      3
ILCMPV:         DS      3
INMDMV:         DS      3
NXSCRV:         DS      3
TIMERV:         DS      3

CLREOS:         LXI     D,EOSMSG
               MVI     C,PRINT
               CALL    MEX
               RET
CLS:            LXI     D,CLSMSG
               MVI     C,PRINT
               CALL    MEX
               RET

;--------------------End of Fixed Format Area-------------------------

SYSVER:         LXI     D,VERSMSG
               MVI     C,PRINT
               CALL    MEX

               IF      ALSCARD
               LXI     D,VERS2MSG
               MVI     C,PRINT
               CALL    MEX
               ENDIF

               RET


SENDBRK:        RET

DISCON:         MVI     A,0
               CALL    STASHBT
               MVI     A,1FH
               CALL    STAXMTB
               CALL    STAXMTR
               MVI     A,0A1H
               JMP     STASQBT

; If you are using a MicroSoft Card, see M7AC+x.ASM for info as to
; what this is all about..

INITMOD:

               IF      CPM2CARD


               LDA     LSTTST
               CPI     0
               JZ      FIRSTIN
               LHLD    0001
               MOV     A,L
               ADI     02AH
               MOV     L,A
               MVI     A,03EH
               MOV     M,A
               INR     L
               MVI     A,0FFH
               MOV     M,A
               INR     L
               MVI     A,0C9H
               MOV     M,A

               ENDIF

               IF      ALSCARD

               LHLD    1
               LXI     D,60H
               DAD     D
               SHLD    APREAD+1
               INX     H
               INX     H
               INX     H
               SHLD    APWRITE+1
               JMP     FIRSTIN

APREAD:         JMP     $-$
APWRITE:        JMP     $-$

               ENDIF
;
;
;
FIRSTIN:        LDA     80H
               CPI     0
               JZ      NOINMSG
               LDA     5DH
               ANI     0FH
               CPI     3
               JNZ     CK2
               CALL    INIT3
               JMP     ORIG103

CK2:            CPI     2H
               JNZ     NOINMSG
               CALL    INIT2
               JMP     ORIG212

NOINMSG:        RET

INIT3:          CALL    PICKUP
               MVI     A,0A1H
               CALL    STARECB
               MVI     A,00000011B
               CALL    STACON
               MVI     A,22H
               CALL    STASPDB
               MVI     A,1
               STA     MSPEED
               RET

ORIG103:
               MVI     A,11H
               CALL    STAXMTB
               CALL    STAXMTR
               MVI     A,65H
               JMP     STARECB

ANS103:
               MVI     A,10H
               CALL    STAXMTB
               CALL    STAXMTR
               MVI     A,64H
               JMP     STARECB

INIT2:          CALL    PICKUP
               MVI     A,0
               CALL    STASPDB
               MVI     A,18H
               CALL    STAXMTB
               CALL    STAXMTR
               MVI     A,0AH
               CALL    STADEVB
               MVI     A,13H
               CALL    STACON
               MVI     A,05H
               CALL    STACOM
               STA     MSPEED
               RET


ORIG212:        MVI     A,0A1H
               CALL    STASQBT
               CALL    DELAY5
               MVI     A,21H
               JMP     STASQBT

ANS212:         MVI     A,81H
               CALL    STASQBT
               CALL    DELAY5
               MVI     A,01
               JMP     STASQBT

SETORIG:        LDA     MSPEED
               CPI     1
               JZ      ORIG103
               JMP     ORIG212

SETANS:         LDA     MSPEED
               CPI     1
               JZ      ANS103
               JMP     ANS212

PICKUP:
               MVI     A,0A1H
               CALL    STASQBT
               MVI     A,'T'
               STA     5DH
               MVI     A,2
               CALL    STASHBT
               MVI     A,0FH
               CALL    STABSRB
               MVI     A,13H
               CALL    STACON
               MVI     A,05H
               CALL    STACOM
               MVI     A,0
               JMP     STADEVB

SETUPR1:        LXI     D,MENUMSG
               MVI     C,PRINT
               CALL    MEX
               MVI     C,1
               CALL    MEX
               PUSH    PSW
               MVI     E,CR
               MVI     C,CONOUT
               CALL    MEX
               MVI     E,LF
               MVI     C,CONOUT
               CALL    MEX
               POP     PSW
               ANI     01011111B
               CPI     'O'
               JZ      SETORIG
               CPI     'A'
               JZ      SETANS
               CPI     'D'
               JZ      DISCON
               LXI     D,ERRMSG
               MVI     C,PRINT
               CALL    MEX
               JMP     SETUPR1

SETUPR:         LXI     D,BAUDMSG
               MVI     C,PRINT
               CALL    MEX
               MVI     C,1
               CALL    MEX
               PUSH    PSW
               MVI     E,CR
               MVI     C,CONOUT
               CALL    MEX
               MVI     E,LF
               MVI     C,CONOUT
               CALL    MEX
               POP     PSW
               SUI     30H
               CPI     3
               JNZ     CK2A
               CALL    INIT3
               JMP     SETUPR1

CK2A:           CPI     2
               JNZ     NOT2
               CALL    INIT2
               JMP     SETUPR1
NOT2:           LXI     D,ERRMSG
               MVI     C,PRINT
               CALL    MEX
               JMP     SETUPR


DELAY5:         PUSH    PSW
               PUSH    B
               LXI     B,1000

DELAY5A:        DCX     B
               MOV     A,B
               ORA     C
               JNZ     DELAY5A
               POP     B
               POP     PSW
               RET

;
;   APPLE IO SUBROUTINES
;
               IF      CPM2CARD

STAXMTR:        STA     XMTRAM  ! RET
STACOM:         STA     COM     ! RET
STAXMTB:        STA     XMTBYT  ! RET
STACON:         STA     CON     ! RET
STABSRB:        STA     BSRBYT  ! RET
STASHBT:        STA     SHBYT   ! RET
STASQBT:        STA     SQUBYT  ! RET
STARECB:        STA     RECBYT  ! RET
LDAIND:         LDA     INDAT   ! RET
STAOUTD:        STA     OUTDAT  ! RET
STATSPDB:       STA     SPDBYT  ! RET
LDASTAT:        LDA     STATUS  ! RET
STADEVB:        STA     DEVBYT  ! RET
LDADATP:        LDA     XMTRAM
               STA     XMTBYT
               LDA     INDAT
               RET

               ENDIF

               IF      ALSCARD



STAXMTR:        PUT     XMTRAM
STACOM:         PUT     COM
STAXMTB:        PUT     XMTBYT
STACON:         PUT     CON
STABSRB:        PUT     BSRBYT
STASHBT:        PUT     SHBYT
STASQBT:        PUT     SQUBYT
STARECB:        PUT     RECBYT
STAOUTD:        PUT     OUTDAT
STASPDB:        PUT     SPDBYT
STADEVB:        PUT     DEVBYT

APWRT:          PUSH    D
               PUSH    B
               CALL    APWRITE
               POP     B
               POP     D
               POP     H
               RET

LDADATP:        PUSH    H
               PUSH    D
               PUSH    B
               LXI     H,XMTRAM
               CALL    APREAD
               LXI     H,XMTBYT
               CALL    APWRITE
               LXI     H,INDAT
               JMP     APRD2

LDASTAT:        PUSH    H
               LXI     H,STATUS
               PUSH    D
               PUSH    B
APRD2:          CALL    APREAD
               POP     B
               POP     D
               POP     H
               RET

               ENDIF

;------------------------------------------------------------------
;  Table of messages that are printed out in the overlay....
;------------------------------------------------------------------

EOSMSG:         DB      'K'-40H,'$'
CLSMSG:         DB      'L'-40H,'$'
VERSMSG:        DB      'Version for Apple Cat ][ modem',CR,LF,'$'
VERS2MSG:       DB      'and ALS CP/M Card',CR,LF,'$'
MENUMSG:        DB      '(O)riginate, (A)nswer, or (D)isconnect $'
ERRMSG:         DB      'Error - must be one of above.',CR,LF,'$'
BAUDMSG:        DB      '(3)00 or 1(2)00 bps: $'

               END