********************************
*             PRIME            *
*     Bulletin Board System    *
*                              *
*       (C)opyright 1989       *
*       By Daniel Haynes       *
********************************

********************************
*                              *
*    PRIME MODEM.2.A           *
*    NAME:NOVATION 212/103     *
*         HAYES MICROMODEM     *
*                              *
********************************


* WRITE REGISTERS

BYT212 = $C080
DACBYT = $C080
SQUBYT = $C081
SHBYT = $C082
BSRBYT = $C083
RECBYT = $C089
CON = $C08A
SPDBYT = $C08B
COM = $C08C
XMTBYT = $C08D
OUTDAT = $C08E
DEVBYT = $C08F

* READ REGISTERS

SWBYT = $C080
TONBYT = $C081
INDAT = $C08B
ACBYT = $C08D
MDMSTAT = $C08F

CYCLE LDA #$00
 RTS

TRYS DFB 0

MOUT AND #$7F
 STA MCHR
MOUT1 LDA #$03
 STA TRYS
 LDY SLOTN
 BEQ :RTN
 LDA CABLE
 BEQ :LOOP
 JMP M2MOUT1
:LOOP JSR MINP1 ;TEST FOR CARRIER AND INPUTS
 LDY SLOTN
 LDA MDMSTAT,Y
 AND #%00010000
 BEQ :LOOP
 LDA MCHR ;SEND THE DATA
 STA OUTDAT,Y
 JMP TSTKBD
:RTN RTS

OLDSTAT DFB 0

MINP LDA #$03
 STA TRYS
 LDY SLOTN
 BEQ NOINP
 LDA CABLE
 BEQ MINP1
 JMP M2INP
MINP1 JSR FNDCAR ;CHECK FOR CARRIER
 BEQ MINP2
DISCNCT JSR MSLOT ;HANGUP THE PHONE
 LDA #$04
 STA $0319
 LDX #253
 JMP ERROR
MINP2 LDA MDMSTAT,Y ;IS DATA VALID?
 STA OLDSTAT
 AND #%11100000
 BEQ :MINP3
 LDA BAUDX
 STA XMTBYT,Y
 LDA INDAT,Y ;CLEAR BAD BYTE IN RECIEVE REGISTER
 JMP NOINP
:MINP3 LDA OLDSTAT ;IS THERE A BYTE WAITING?
 AND #%00001000
 BEQ NOINP
 LDA BAUDX
 STA XMTBYT,Y
 LDA INDAT,Y ;GET MODEM INPUT
 STA TBUFF1
 AND #$7F
 JSR PUSH
 LDY SLOTN
 SEC
 RTS
NOINP LDY SLOTN ;ALL DONE
 CLC
 RTS

EXIT LDA IENABLE
 BEQ EXIT1
 CLI
EXIT1 CLC
 RTS

ANSWER LDA #$FF
 STA OH
 STA MODEMON
 LDA #$00
 STA NULLS
 STA BAUD
 LDY SLOTN
 BEQ RTN4
 LDA CABLE
 BEQ :ANS
 JMP M2ANS
:ANS LDA #$02
 STA SHBYT,Y ;PICK UP PHONE
 LDA #$06
 STA BSRBYT,Y
 LDA #$03
 STA CON,Y
 LDA #$05
 STA COM,Y
 LDA DO1200
 BEQ :DO103
 JSR SET212
 JMP :END
:DO103 JSR SET103
:END LDA #30
 JSR DEL100
RTN4 RTS

SET103 LDA #$81
 STA SQUBYT,Y
 LDA #%00000000
 STA DEVBYT,Y
 STA BAUD
 LDA #$64
 STA RECBYT,Y
 LDA #$22
 STA SPDBYT,Y
 LDA #$10
 STA XMTBYT,Y
 STA BAUDX
 RTS

BAUDX DFB 0

SET212 LDA #%00001010
 STA DEVBYT,Y
 LDA #$81
 STA SQUBYT,Y
 LDA #10
 JSR $FCA8
 LDA #$01
 STA SQUBYT,Y
 LDA #$66
 STA RECBYT,Y
 LDA #$00
 STA SPDBYT,Y
 LDA #$1F
 STA XMTBYT,Y
 STA BAUDX
 LDA #$01
 STA BAUD
 RTS

DEL100 TAY
:DEL LDA #195
 JSR $FCA8
 DEY
 BNE :DEL
 LDY SLOTN
 RTS

CRDET
 LDY SLOTN
 BEQ NOSYS
 LDA OH
 BEQ NOSYS
 LDA #$05
 STA TRYS
FNDCAR JSR GETCAR
 BEQ OKCAR
 JSR FLIPCR
 DEC TRYS
 BNE FNDCAR
NOSYS LDA #$01
OKCAR RTS

GETCAR LDY SLOTN
 LDA BAUD
 BEQ :IS103
:IS212 LDA ACBYT,Y
 AND #$04
 BNE GOT103
 JSR GET212
 BCS NOCARR1
 BCC GOT103

:IS103 LDA SWBYT,Y
 AND #$20
 BNE GOT103
 JSR GET103
 BCS NOCARR1
GOT103 LDA #$00
 RTS
NOCARR1 LDA #$01
 RTS

GET212 LDX #30
:LOOP JSR CAR212
 BNE FND212
 DEX
 BNE :LOOP
LST212 SEC
 RTS
FND212 LDX #$05
:LOOP1 JSR CAR212
 BEQ LST212
 DEX
 BNE :LOOP1
 CLC
 RTS

CAR212 LDA #$01
 JSR DEL100
 LDA ACBYT,Y
 AND #$04
 RTS

GET103 LDX #30
:LOOP JSR CAR103
 BNE FND103
 DEX
 BNE :LOOP
LST103 SEC
 RTS
FND103 LDX #$05
:LOOP1 JSR CAR103
 BEQ LST103
 DEX
 BNE :LOOP1
 CLC
 RTS

CAR103 LDA #$01
 JSR DEL100
 LDA SWBYT,Y
 AND #$20
 RTS

FLIPCR LDA DO1200
 BNE :FLIP
 JMP SET103
:FLIP LDY SLOTN
 LDA BAUD
 BEQ MAK212
 JMP SET103
MAK212 JMP SET212

RING LDY SLOTN
 BEQ RING2
 LDA CABLE
 BEQ RING1
 JMP M2RING
RING1 LDA ACBYT,Y
 AND #$01
 BEQ RING2
 LDA #$01 ;PHONE IS RINGING
 RTS
RING2 LDA #$00 ;PHONE IS NOT RINGING
RTN1 RTS

HANGUP LDA #$00
 STA OUTMASK
 STA $032D
 STA CHTFLG
 LDA CANDO
 BEQ :END1
 JSR CROUT
 JSR SETOFFT
 LDY #$00
:LOOP LDA (PTR),Y
 BEQ :END

********************************
*  NOP TO PREVENT DECODING THE *
*  COPYRIGHT.                  *
********************************
 NOP
* ROR

 JSR POUT
 INY
 BNE :LOOP
:END JSR CROUT
 LDA #$04
 STA $0319
:END1 LDA #$00
 STA CANDO

MSLOT JSR MSLOTC
 BEQ RTN1
 LDA CABLE
 BEQ :MSLOT
 JMP M2MSLOT
:MSLOT LDA #$04
 STA COM,Y
 LDA #$00
 STA DACBYT,Y
 STA SHBYT,Y
 LDA #$01
 STA SQUBYT,Y
 LDA #$07
 STA BSRBYT,Y
 LDA #$1F
 STA XMTBYT,Y
 LDA #%00000100
 STA BYT212,Y
 LDA #$05
 JSR DEL100
 LDA #%00000101
 STA BYT212,Y
 RTS

MSLOTC SEI
 LDA SLOT
 AND #$07
 ASL
 ASL
 ASL
 ASL
 STA SLOTN
 LDA #$00
 STA OH
 LDY SLOTN
 RTS


 LST OFF
********************************
*                              *
*     HAYES MICRO MODEM II     *
*                              *
********************************

RI EQU $C085 ;M2RING INDICATOR
CR2 EQU $C085 ;COMMAND REG.
M2STAT EQU $C086 ;ACIA M2STAT REGISTER
CR1 EQU $C086 ;CONTROL REG, SETS DATA TYPE
DATA EQU $C087 ;READ/WRITE DATA REGISTER

TRE = $02 ;TRANSMITTER REGISTER EMPTY
RRF = $01 ;RECIEVE REGISTER FULL
CD = $04 ;CARRIER DETECT
BADBYT = $70

CR1REG DFB 0
CR2REG DFB 0


M2MOUT1
M2MOUTB JSR M2INP1 ;TEST FOR CARRIER AND INPUTS
CHKSND LDA M2STAT,Y ;IS IT READY TO SEND?
 AND #TRE
 BEQ M2MOUTB
 LDA MCHR ;SEND THE DATA
 STA DATA,Y
 JMP TSTKBD

M2INP
M2INP1 LDA M2STAT,Y ;CHECK FOR CARRIER
 AND #CD
 STA CARRIER
 BEQ M2INP2
 LDA DATA,Y ;LOST CARRIER
 LDA #$30
 JSR DEL100
 DEC TRYS
 BNE M2INP1
 JMP DISCNCT
M2INP2 LDA M2STAT,Y ;IS DATA VALID?
 AND #BADBYT
 BEQ M2INP3
 LDA DATA,Y ;CLEAR BAD BYTE IN RECIEVE REGISTER
 JMP M2INP1
M2INP3 LDA M2STAT,Y ;IS THERE A BYTE WAITING?
 AND #RRF
 BEQ :NOINP
 LDA DATA,Y ;GET MODEM INPUT
 STA TBUFF1
 AND #$7F
 JSR PUSH
 LDY SLOTN
 SEC
 RTS
:NOINP LDY SLOTN ;ALL DONE
 CLC
 RTS

M2ANS LDA #%10001011
 STA CR2REG
 JSR MDMRESET
 LDA #$50
 JMP DEL100

M2CRDET JSR MDMRESET
 LDA #$05
 STA TRYS
 LDY SLOTN
 BEQ NOCARR
 LDA OH
 BNE M2GCAR
NOCARR LDA #$01
 RTS
M2GCAR LDY SLOTN
GTCR1 LDA DATA,Y
 LDA M2STAT,Y
 AND #CD
 BEQ STABLE
 LDA #50
 JSR DEL100
 DEC TRYS
 BEQ NOCARR
 BNE M2GCAR
STABLE LDA #$05
 STA TRYS
STABLE1 LDA DATA,Y
 LDA M2STAT,Y
 AND #CD
 BNE NOCARR
 LDA #$01
 JSR DEL100
 DEC TRYS
 BNE STABLE1
 LDA #$00
 RTS

M2RING JSR M2MSLOT
M2RING1 LDA RI,Y
 AND #$80
 BNE M2RING2
 LDA #$01 ;PHONE IS M2RINGING
 RTS
M2RING2 LDA #$00 ;PHONE IS NOT M2RINGING
 RTS

DELAY LDX #$C8
DELAY1 LDA #$3C
 JSR $FCA8
 DEX
 BNE DELAY1
 LDY SLOTN
 RTS

M2MSLOT JSR MSLOTC
 BEQ RTN2
 LDA #$FF
 LDA #%00010101 ;TYPE 5 DATA
 STA CR1REG
 LDA #%00001001 ;300 BAUD, MODE=M2ASWR,
 STA CR2REG
 LDA #$03
 STA CR1,Y

MDMRESET LDY SLOTN
 BEQ RTN2
 LDA M2STAT,Y
 AND #$08
 BEQ INITMD1
 LDA #$03 ;RESET MODEM IF SYSTEM RESET HAS OCCURED
 STA CR1,Y
INITMD1 LDA CR1REG
 STA CR1,Y
 LDA CR2REG
 STA CR2,Y
RTN2 RTS
