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

********************************
*                              *
*      PRIME MODEM DRIVER      *
*                              *
********************************


*        SSC REGISTERS         *

* WRITE REGISTERS

CON = $C08B
COM = $C08A
INDAT = $C088
SW2 = $C082

********************************

* STATUS REGISTER

SSCSTAT = $C089 ;SUPER SERIAL

* OUTPUT REGISTER

SSCOUT = $C088

********************************

* TRANSMIT BUFFER EMPTY

SSCTR DFB %00010000

********************************
*                              *
*     PROGRAM STARTS HERE      *
*                              *
********************************

MOUT AND #$7F
 STA MCHR
MOUT1 LDY SLOT
 BEQ :END
:LOOP JSR MINP
 LDA SSCSTAT,Y ;TEST XMIT STATUS
 AND #%00010000
 BEQ :LOOP
 LDA NRMSPD
 BEQ :SEND
 JSR WAIT
:SEND LDY SLOTN
 LDA MCHR ;SEND THE MM2OUT
 STA SSCOUT,Y
:END JMP TSTKBD

CURBYTE DFB 0
NEWBYTE DFB 0

MINP JSR FNDCAR
 LDA CURBYTE
 CMP NEWBYTE
 BEQ :NONE
 INC CURBYTE
 LDA CURBYTE
 AND #$0F
 TAY
 LDA IBUFF,Y
 STA TBUFF1
 AND #$7F
 JSR PUSH
 LDY SLOTN
 SEC
 RTS
:NONE JSR RDBYTE
 LDY SLOTN ;ALL DONE
 CLC
:END RTS

RDBYTE CLD
 SEI
 LDY SLOTN
 BEQ EXIT
 LDA SSCSTAT,Y
 AND #$07
 BEQ :L1
:RESET LDA INDAT,Y ;clear bad data byte
 JMP EXIT
:L1 LDA SSCSTAT,Y
 AND #$08
 BEQ EXIT
 LDA INDAT,Y ;get modem input
 PHA
 INC NEWBYTE
 LDA NEWBYTE
 AND #$0F
 TAY
 PLA
 STA IBUFF,Y
EXIT LDA IENABLE
 BEQ EXIT1
 CLI
EXIT1 CLC
 RTS

DEL100 TAY
DEL LDA #195
 JSR WAIT
 DEY
 BNE DEL
 LDY SLOTN
 RTS

ATA ASC 'ATA',0D,00

MDMCARR DFB 0

CRDET LDA MDMCARR
 RTS

RTN4 LDA #$00
 STA TBUFF
 STA OH
 LDA #$01
 STA MDMCARR
 RTS

ANSWER LDY SLOTN
 BEQ RTN4
 LDA DOATA
 BEQ HILOW

 LDY #>ATA
 LDA #ATA
 JSR OUTLN

* HI/LOW AUTO BAUD DETECT CABLE 2

HILOW LDA DOHILOW
 BEQ MANUAL
 LDA #$FF ;ANSWER THE PHONE
 STA OH
 STA MODEMON
 LDA CNTDEL
 BEQ :SET
 JSR DEL100
:SET LDA SSCSTAT,Y
 AND #%01000000 ;DSR BIT
 BEQ :SET212
 JMP SET300 ;SET FOR 300 BAUD
:SET212 JMP SET1200 ;SET FOR 1200 BAUD

* MANUAL SYNCING DETECTOR
MANUAL LDA DOMANUAL
 BEQ READBAUD
 JSR CLEAR
 JSR CLRCNT
 STA CNTDEL
:SET103 JSR SET300
 JSR GETIN
 BNE :SET212
 RTS  ;SET FOR 300 BAUD
:SET212 LDA DO1200
 BEQ :SET2400
 JSR SET1200
 JSR GETIN
 BNE :SET2400
 RTS
:SET2400 LDA DO2400
 BEQ :SET103
 JSR SET2400
 JSR GETIN
 BNE :SET103
 RTS

* CABLE 3 BAUD DETECT MODE

READBAUD JSR CLEAR
:LOOP JSR MINP
 BCC :LOOP
 JSR GETLN2
 LDA INPUT
 CMP "G"
 BEQ :LOOP
 CMP #"T"
 BEQ SET300
 CMP #"R"
 BEQ NOCARR
 CMP #"0"
 BNE NOCARR
 LDA INPUT-2
 CMP #"4"
 BEQ SET2400
 BNE SET1200
NOCARR JMP RTN4
FOUND RTS

SET300 LDY #$00
 BEQ SETBAUD
SET1200 LDY #$01
 BNE SETBAUD
SET2400 LDY #$02
SETBAUD LDA BAUDTBL,Y
 STY BAUD
 LDY SLOTN
 STA CON,Y
 LDA #$00
 STA MDMCARR
 LDA #$FF ;ANSWER THE PHONE
 STA OH
 STA MODEMON
 LDA CNTDEL
 BEQ :END
 JSR DEL100
:END RTS

BAUDTBL DFB $16,$18,$1A

LPOS DFB 0
STAT DFB 0
MDMTEXT DFB 13
 ASC '<PRESS RETURN> ',00

GETIN LDA #$00
 STA TBUFF1
 LDA DORTN
 BEQ :NORTN
 LDY #>MDMTEXT
 LDA #MDMTEXT
 JSR OUTLN
:NORTN LDA TBUFF1
 BNE :TEST
:NEXT JSR MINP
 BCC :NEXT
:TEST LDA TBUFF1
 AND #$7F
 CMP #13
 BEQ :FND
 CMP #10
:FND RTS

LOSTC ASC "NO CARRIER"
 DFB 13,10,0

LOSTC1 ASC "RING"
 DFB 13,10,0

FNDCAR LDY SLOTN
 BEQ :END
 LDA OH
 BEQ :END
 LDA DOTCAR
 BNE TXTCAR
 LDX #$FF
:LOOP LDA SSCSTAT,Y
 AND CRMASK
 BEQ :END
 DEX
 BEQ DISCNCT
 BNE :LOOP
:END RTS

TXTCAR LDY #$00
 LDX #28
:LOOP LDA LOSTC,Y
 BEQ DISCNCT
 CMP SCRN,X
 BNE :FNDCAR1
 INX
 INY
 BNE :LOOP
:FNDCAR1 LDY #$00
 LDX #34
:LOOP1 LDA LOSTC1,Y
 BEQ DISCNCT
 CMP SCRN,X
 BNE :FOUND
 INX
 INY
 BNE :LOOP1
 JMP DISCNCT
:FOUND RTS

DISCNCT JSR MSLOT ;HANGUP THE PHONE
 LDA #$04
 STA $0319
 LDX #253
 JMP ERROR

RING LDY SLOTN
 BEQ :NONE
 LDA DOTRING
 BEQ :ION
:LOOP JSR MINP
 BCC :NONE
 JSR GETLN2
 JMP :END
:ION LDY SLOTN
 LDA SSCSTAT,Y
 AND CRMASK
 BNE :NONE
:END LDA #$01 ;PHONE IS RINGING
 RTS
:NONE LDA #$00 ;PHONE IS NOT RINGING
 RTS

MDMYREG DFB 0

GETLN2 JSR GETLIN
 JSR CLEAR
 JSR GETLIN
 JMP CLEAR

OUTLN STA ZPTR
 STY ZPTR+1
 JSR CLEAR
 LDY #$00
 STY MDMYREG
:LOOP LDA MDMSPD
 BEQ :NODEL
 JSR WAIT
:NODEL LDY MDMYREG
 LDA (ZPTR),Y
 BEQ :END
 CMP #'@'
 BEQ :MORE
 PHA
 JSR MOUT
 LDA OH
 BNE :OUT
 PLA
 JMP :REST
:OUT PLA
 ORA #$80
 JSR COUT
:REST INC MDMYREG
 BNE :LOOP
:END RTS
:MORE LDA #$0D
 JSR MOUT
 JSR GETMCR
 JMP :REST

INTERUPT DFB 2
 DFB 0
 DA RDBYTE

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 COPYRIGHT    *
*  FROM BEING ENCODED.         *
********************************
 NOP
* ROR

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

MSLOT SEI
 LDA SLOT
 AND #$07
 ASL
 ASL
 ASL
 ASL
 STA SLOTN
 LDY SLOTN
 BEQ :RTN0
 LDA #$00
 STA SSCSTAT,Y
 STA OH
 STA COM,Y
 STA CON,Y

 LDA INTERUPT+1
 BEQ :RTN0

 LDA #$01
 STA INTERUPT
 JSR MLI
 DFB $41 ;DEALLOCATE INTERUPT
 DA INTERUPT
 LDA #$00
 STA INTERUPT+1
:RTN0 LDA #$05
 JSR DEL100
 SEI
 JMP CLEAR

* 8 = 1000
* 9 = 1001
* A = 1010
* B = 1011

CYCLE LDY SLOTN
 BEQ :RTN1
 LDA #$16
 STA CON,Y
 LDA #$0B ;TURN OFF SSC INTERUPTS
 STA COM,Y

 LDA IENABLE ;ARE INTERUPTS ALLOWED?
 BEQ :RTN0 ;NO
 LDA INTERUPT+1
 BNE :RTN2
 LDA #2 ;ALLOCATE PRODOS INTERUPT
 STA INTERUPT
 JSR MLI
 DFB $40 ;ALLOCATE INTERUPT
 DA INTERUPT

:RTN2 LDY SLOTN ;SET SSC FOR INTERRPTS
 LDA #$09
 STA COM,Y
 CLI

:RTN0 LDA DOSETUP
 BEQ :RTN1
 LDA DO2400
 BEQ :CONT
 LDY #$02
 LDA BAUDTBL,Y
 STY BAUD
 LDY SLOTN
 STA CON,Y
:CONT LDY #>SETUP
 LDA #SETUP
 JSR OUTLN

 LDA DOOK
 BEQ :RTN1
 JMP GETLN2

:RTN1 JMP CLEAR

CLRCNT LDA #$00
 LDX #$03
:LOOP STA COUNT,X
 DEX
 BPL :LOOP
 RTS

GETMCR LDA DOOK
 BNE GETLIN
 RTS
GETLIN JSR CLRCNT
 LDA #$02
 STA COUNT
:LOOP JSR MINP
 LDA TBUFF1
 CMP #10
 BEQ :END
 INC COUNT+2
 BNE :LOOP
 INC COUNT+1
 BNE :LOOP
 DEC COUNT
 BNE :LOOP
:END RTS

COUNT DA 0,0

CLEAR LDA #$00
 STA NEWBYTE
 STA CURBYTE
 STA TBUFF1
 RTS

IBUFF DS 16
