home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
kermit.columbia.edu
/
kermit.columbia.edu.tar
/
kermit.columbia.edu
/
appleii
/
appcat.m65
< prev
next >
Wrap
Text File
|
2018-01-01
|
12KB
|
794 lines
;******************************************************************
;
; KERMIT385-APPLE-CAT DRIVER - APP385.CA
;
; 9/05/90 V1.2
;
; LST OFF,NOASYM
;
; DICK WOTIZ
;
; DICK@PORTAL.COM,
; {UUNET|SUN}!PORTAL!DICK
;
;
; THIS DRIVER IS FOR THE NOVATION APPLE-CAT II INTERNAL MODEM.
;
;
; FEATURES:
;
; USES THE MODEM'S FIRMWARE ROM FOR DIALING.
; TYPE ';' FOR 2-SECOND PAUSE, OR ANY CONTROL CHARACTER TO ABORT.
; ROM NOT NEEDED IF EXTERNAL PHONE IS USED FOR DIALING.
;
; SUPPORTS 110-600 BAUD, AND 45.5 BAUD (USE KERMIT'S 135 BAUD SETTING)
; SUPPORTS 1200 BAUD WITH APPLE-CAT 212 CARD, IN SLOT-SAVER CONFIGURATION.
;
; ALLOWS USE OF EXTERNAL SERIAL PORT BY TYPING 'X' AS DIALING STRING.
;
;******************************************************************
;
;
;
;
; $Header: appcat.m65,v 1.2 89/11/06 11:40:36 medin Locked $
; $log$
;--->>>>> dont forget to update the version <<<<<---
ORG $1005
DW HDRMSG ;DRIVER NAME POINTER
;
ORG $100C
DW BUFEND ;BUFFER END POINTER
ORG $1020
;
JMP INIT ;MODEM CONTROL VECTORS
JMP COMCMD
JMP CHKRECV
JMP RCVBYTE
JMP XMTBYTE
JMP HANGUP
;
ORG $7f00 ;[1.2]
;
MSB ON
;
ACC EQU $45 ;APPLE STUFF
IN EQU $200
IRQLOC EQU $3FE
;
BAUD EQU $1003 ;KERMIT STUFF
SLOTN0 EQU $1007
INITFLG EQU $1008
DRVRADR EQU $1009
FLAGS EQU $100B
BRKLEN EQU $100E
REFRFLG EQU $1011 ;[1.2]
DELAY EQU $1040
PRMSG EQU $1043
GETKEY EQU $1046
PRCR EQU $1049
DOPARITY EQU $104F
CLREOL EQU $1084
;
KEYBD EQU $C000 ;APPLE I/O STUFF
SETSTDZP EQU $C008
SETALTZP EQU $C009
KRESET EQU $C010
RDLCBNK2 EQU $C011
RDLCRAM EQU $C012
RDALTZP EQU $C016
WRRAM2 EQU $C081
;
MVIDLO EQU $478 ;MODEM ROM DIALING STUFF
MVIDHI EQU $4F8
MN0SAVE EQU $6F8
MASAVE EQU $778
MCNSAVE EQU $7F8
;
SWBYT EQU $C080 ;MODEM I/O STUFF
DACBYT EQU $C080
SQUBYT EQU $C081
SHBYT EQU $C082
BSRBYT EQU $C083
RECBYT EQU $C089
CON EQU $C08A
INDAT EQU $C08B
SPDBYT EQU $C08B
COM EQU $C08C
ACBYT EQU $C08D
XMTBYT EQU $C08D
OUTDAT EQU $C08E
STATUS EQU $C08F
DEVBYT EQU $C08F
;
DFBC0 EQU $FBC0 ;APPLE ROM STUFF
WAIT EQU $FCA8
PRBYTE EQU $FDDA
COUT EQU $FDED
ROMIRQ EQU $FFFE
;
;
PGMBEG EQU *
;
DFB $90,$09,$05,$D2,$C1,$D7 ;ID STRING
;
RBUFIXW DFB 0 ;RECV BUF WRITE INDEX
RBUFIXR DFB 0 ;RECV BUF READ INDEX
XBUFIXW DFB 0 ;XMIT BUF WRITE INDEX
XBUFIXR DFB 0 ;XMIT BUF READ INDEX
IRQSAVE DW 0 ;OLD IRQ VECTOR
STOPACK DFB 0 ;^S FLAGS
STOPREQ DFB 0 ; "
DLYCNT DFB 0 ;DELAY COUNTER
XMTSAV DFB 0
SLOTN DFB 0 ;SLOT NUMBER
XSAVE DFB 0
CARRDLY DFB 0 ;CARRIER DROP DELAY COUNT
CARRFLG DFB 0 ;CARRIER DET FLAG
MDMFLAG DFB 0 ;MODEM INITTED FLAG
EXTFLAG DFB 0 ;EXTERNAL PORT FLAG
;
INTBITS DFB $02 ;MODEM REGISTER BITS
RDRFBIT DFB $08
;
HDRMSG nasc <CAT V1.2> 0 ;[1.2]
DFB 0
MSGS EQU *
ADRMSG nasc <COM RTN ASM > 0
nasc <TOO LOW> 0
DFB $8D,0
CMDMSG DFB $3C
nasc <- BAD COM CMD> 0
DFB $8D,0
DIALMSG nasc <DIAL/X:> 0
DFB 0
WAITMSG DFB $8D ;[1.2]
nasc <WAITING> 0
DFB $8D,0
CONNMSG nasc <CONNECT> 0
DFB $87,$8D,0
HANGMSG DFB $8D
nasc <HUNG UP> 0
DFB $8D,0
;
;
FALSINT PLA
TAX
JMPLOC JMP (IRQSAVE)
;
;
IRQVEC1 TXA ;NORMAL VECTOR
PHA
IRQVEC2 LDA STATUS ;ENH IIE VECTOR
ADDR1 EQU *-2
BIT INTBITS ;MODEM IRQ?
BEQ FALSINT ;NO, BR
BIT RDRFBIT ;RDRF?
BEQ FALSINT ;NO, BR
AND #$40 ;FRAMING ERR?
BEQ RECVOK ;NO, BR
LDA #'+$80
BNE RECV2
RECVOK LDA INDAT
ADDR2 EQU *-2
RECV2 LDX RBUFIXR
STA RECVBUF,X ;SAVE BYTE
RBUFIXH EQU *-1
PHA
LDA XMTSAV
STA XMTBYT ;RESET RDRF, IRQ
ADDR3 EQU *-2
PLA
BIT FLAGS ;CHECK FOR FLOW?
BPL L7BCC ;NO, BR
AND #$7F
CMP #$11 ;^Q?
BNE L7BBA ;NO, BR
LDA #$BF
AND FLAGS ;CLEAR ^S FLAG
BCS L7BBF ;BR ALWAYS
;
L7BBA CMP #$13 ;^S?
BNE L7BCC ;NO, BR
LDA #$40
ORA FLAGS
L7BBF STA FLAGS ;SET ^S FLAG
BCS INTRET ;BR ALWAYS
;
L7BCC INC RBUFIXR ;INCR RECV BUFPTR
BNE INTRET
LDX RBUFIXH
INX
CPX #XMITBUF^
BNE L7BDB
LDX #RECVBUF^
L7BDB STX RBUFIXH
INTRET PLA
TAX
LDA ACC
RTILOC RTI
;
;
;
INIT SEI
LDA IRQSAVE+1 ;ALREADY INITTED?
BNE INITTED ;YES, BR
LDA IRQLOC
STA IRQSAVE ;SAVE IRQ ADDR
LDA IRQLOC+1
STA IRQSAVE+1
LDA #PGMBEG^
CMP DRVRADR+1 ;START ADDR OK?
BCC INIT3
BNE INITOK ;YES, BR
INIT2 LDA DRVRADR
BEQ INITOK
INIT3 LDX #ADRMSG\
JSR PRMSGY
LDA #0
INITTED CLI
RTS
;
INITOK EQU *
;
LDA DFBC0 ;SAVE ACCUM. DURING IRQ?
BEQ NOSAVE ;NO, BR (NOT IIE)
CMP #$E0
BNE NOTENH2
NOSAVE LDA RTILOC
STA INTRET
LDA #IRQVEC2\
STA IRQLOC
LDA #IRQVEC2^
STA IRQLOC+1
LDX #0
NOSAVLP LDA JMPLOC,X
STA FALSINT,X
INX
CPX #$03
BNE NOSAVLP
LDX #$00
BIT RDLCBNK2
BMI NOSAV2
LDX #$08
NOSAV2 BIT RDLCRAM
BPL NOSAV3
INX
INX
NOSAV3 BIT WRRAM2 ;READ ROM, WRITE RAM
BIT WRRAM2
DFB $DA ;PHX
LDA RDALTZP
ASL A
LDY #$01
NOSAVL2 LDA ROMIRQ,Y ;COPY IRQ VECTOR
STA SETALTZP ;INTO BOTH BANKS
STA ROMIRQ,Y
STA SETSTDZP
STA ROMIRQ,Y
DEY
BPL NOSAVL2
BCC NOSAV4
STA SETALTZP
NOSAV4 DFB $FA ;PLX
DFB $3C
DW WRRAM2 ;BIT WRRAM2,X
DFB $3C
DW WRRAM2 ;BIT WRRAM2,X
JMP INITPTR
;
NOTENH2 LDA #IRQVEC1\
STA IRQLOC
LDA #IRQVEC1^
STA IRQLOC+1
INITPTR LDA #$00
STA RBUFIXW ;INIT POINTERS
STA RBUFIXR
STA XBUFIXW
STA XBUFIXR
LDA #RECVBUF^
STA RBUFIXH
STA RCVADRH
LDX SLOTN0
TXA
LSR A
LSR A
LSR A
LSR A
STA SLOTN
;
CLC
TXA
ADC #SWBYT\
STA ADDR8 ;SELF-MODIFYING CODE... YECCHH!!!
;[1.2] TXA
;[1.2] ADC #INDAT\
ADC #INDAT-SWBYT [1.2]
STA ADDR2
;[1.2] TXA
;[1.2] ADC #COM\
ADC #COM-INDAT [1.2]
STA ADDR12
STA ADDR13
;[1.2] TXA
;[1.2] ADC #XMTBYT\
ADC #XMTBYT-COM [1.2]
STA ADDR3
STA ADDR11
;[1.2] TXA
;[1.2] ADC #ACBYT\
STA ADDR9
STA ADDR10
;[1.2] TXA
;[1.2] ADC #OUTDAT\
ADC #OUTDAT-XMTBYT [1.2]
STA ADDR5
STA ADDR7
;[1.2] TXA
;[1.2] ADC #STATUS\
ADC #STATUS-OUTDAT [1.2]
STA ADDR1
STA ADDR4
STA ADDR6
;
LDA #0 ;INIT MODEM
STA SHBYT,X ;HANG UP PHONE
STA DACBYT,X
STA EXTFLAG
STA REFRFLG ;DON'T REDRAW SCREEN [1.2]
LDA #$06
STA BSRBYT,X
JSR SETREC
LDA #$0C
STA COM,X
;
DIAL LDX #DIALMSG\
JSR PRMSGY
;
LDA #$A0
LDX #0
DGETNXT STX XSAVE
JSR COUT
DGETNX2 JSR GETKEY ;GET PHONE NUMBER
ORA #$80
LDX XSAVE
STA IN,X ;SAVE IT IN BUFFER
INX
CMP #$88
BNE NOBS
DEX
BEQ DGETNX2
DEX
JMP DGETNXT
NOBS CMP #$8D
BEQ DGETOK
CMP #$A0
BCS NOESC
JSR HANGUP
LDA #0
RTS
NOESC CPX #80
BNE DGETNXT
DEX
LDA #$87
BNE DGETNXT
;
;[1.1]DGETOK JSR CLREOL
DGETOK ;[1.1]
JSR PRCR
LDA IN ;GET FIRST CHAR
;[1.1] CMP #$58 ;'X'=EXTERNAL PORT?
;[1.2] CMP #'x+$80 ;[1.1] 'X'=EXTERNAL PORT?
;[1.2] BEQ DEXT ;YES, BR
;[1.1] CMP #$78
AND #$DF ;[1.2]
CMP #'X+$80 ;[1.1] try both cases
BNE DNOEXT
;DEXT LDA #$FF ;[1.2]
STA EXTFLAG
;[1.2] BNE DIALEN2
BEQ DIALEN2 ;[1.2]
DNOEXT LDX SLOTN
LDA #RTS1-1\
STA MVIDLO,X ;SET VIDOUT ADDR
LDA #RTS1-1^
STA MVIDHI,X
;
TXA
ORA #$C0 ;SLOTCN
STA ADDRD
;
LDX SLOTN0
LDA #$18
STA XMTBYT,X ;TURN OFF XMIT
LDA #$02
STA SHBYT,X ;PICK UP PHONE
LDA #$A3
STA SQUBYT,X ;TURN ON SPKR
;
JSR WAIT3
;
LDA #'T+$80 ;SELECT TONE DIALING
JSR DIALCH
LDA #';+$80 ;DELAY 2 SECONDS
JSR DIALCH
;
LDX #0
DIALLP LDA IN,X
CMP #$8D
BEQ DIALEND
STX XSAVE
JSR DIALCH ;DIAL THE DIGIT
LDX XSAVE
INX
CPX #80
BNE DIALLP
;
DIALEND JSR WAIT3 ;WAIT A BIT
;[1.2] LDX #WAITMSG\
;[1.2] JSR PRMSGY ;DISPLAY 'WAITING' MESSAGE
;
DIALEN2 LDA #$05
STA COM
ADDR13 EQU *-2
;
LDA #1
STA CARRFLG ;SET DIALED FLAG
;
RTS1 RTS
;
;
WAIT3 LDA #0
JSR WAIT
JSR WAIT
JMP WAIT
;
;
DIALCH ORA #$80
CMP #'*+$80 ;CONVERT '*' CHAR
BNE DIALCH1
LDA #':+$80
DIALCH1 CMP #';+$80 ;CONVERT PAUSE CHAR
BNE DIALCH2
LDA #'*+$80
DIALCH2 STA MASAVE
LDX ADDRD ;SLOTCN
STX MCNSAVE
LDY SLOTN0
STY MN0SAVE
BIT $CFFF
LDA $FF00 ;ENABLE CARD ROM
ADDRD EQU *-1
CMP #$38 ;ROM INSTALLED?
BNE NOROM ;NO, BR
LDA MASAVE ;GET BACK CHAR
JSR $CC0A ;CALL DIALING SUBR
NOROM BIT $CFFF ;DISABLE CARD ROM
RTS
;
;
CHKCARR LDA CARRFLG ;LOOK FOR CARRIER?
BMI CARRRTS ;NO, BR
LDA EXTFLAG
BNE CEXT
LDA BAUD
CMP #8 ;300 BAUD?
BCS C1200 ;NO, BR
LDA SWBYT
ADDR8 EQU *-2
AND #$20
BCC CARRBR ;BR ALWAYS
;
C1200 LDA ACBYT ;CHECK 1200 BAUD
ADDR9 EQU *-2
AND #$04
BCS CARRBR ;BR ALWAYS
;
CEXT LDA ACBYT ;CHECK EXTERNAL PORT
ADDR10 EQU *-2
AND #$08
CARRBR BEQ NOCARR
;
HAVCARR LDA CARRFLG ;HAD CARRIER BEFORE?
BEQ CARRRTS ;YES, BR
LDA #0
STA CARRFLG ;SET FLAGS
STA CARRDLY
LDA XMTSAV
STA XMTBYT ;ENABLE MODEM XMITTER
ADDR11 EQU *-2
LDA #$06
STA COM ;ENABLE RECV IRQ
ADDR12 EQU *-2
;
STX XSAVE
JSR SETBAUD
;
LDX #CONNMSG\
JSR PRMSGY ;PRINT MESSAGE
;
LDX XSAVE
;
LDA #0
CARRRTS RTS
;
NOCARR LDA CARRFLG ;HAD CARRIER BEFORE?
;[1.2] BNE CARRRTS ;NO, BR
BEQ NOCARR1 ;YES, BR [1.2]
CMP #1 ;WAIT MESSAGE ALREADY DISPLAYED? [1.2]
BNE CARRRTS ;YES, BR [1.2]
STX XSAVE [1.2]
LDX #WAITMSG\ [1.2]
JSR PRMSGY ;DISPLAY 'WAITING' MESSAGE [1.2]
LDX XSAVE [1.2]
INC CARRFLG [1.2]
RTS [1.2]
;
NOCARR1 LDA #25
JSR WAIT
DEC CARRDLY ;WAITED LONG ENOUGH?
BNE CARRRTS ;NO, BR
JMP HANGUP ;YES, HANG UP
;
;
CHKRECV JSR CHKCARR ;HAVE CARRIER?
BEQ CHKRCV1 ;YES, BR
LDA #0
BEQ CHKRRTS
CHKRCV1 JSR CHKXMIT ;CHECK XMIT BUFFER
SEI
LDA RBUFIXW
CMP RBUFIXR ;RECV BUFFER EMPTY?
BNE CHKRCV2 ;NO, BR
LDA RBUFIXH
CMP RCVADRH
CHKRCV2 CLI
CHKRRTS RTS
;
;
RCVBYTE JSR CHKXMIT
SEI
LDX RBUFIXW
LDA RECVBUF,X ;GET A BYTE
RCVADRH EQU *-1
INC RBUFIXW ;UPDATE POINTER
BNE RCVBYT3
LDY RCVADRH
INY
CPY #XMITBUF^
BNE RCVBYT2
LDY #RECVBUF^
RCVBYT2 STY RCVADRH
RCVBYT3 CLI
RTS
;
;
XMTBYTE SEI
LDX XBUFIXW
STA XMITBUF,X ;SAVE BYTE IN XMIT BUFFER
INC XBUFIXW
CLI
;
CHKXMIT SEI
LDA STATUS
ADDR4 EQU *-2
AND #$10 ;TDRE ON?
BEQ CXRET ;NO, BR
BIT FLAGS ;WAITING ON ^S?
BPL NOCTRLS ;IGNORE ^S, BR
BVS CXRET ;^S RECV'D, BR
LDA STOPREQ ;READY TO STOP?
BEQ CHKXMT2 ;NO, BR
LDA STOPACK ;STOPPED?
BNE NOCTRLS ;YES, BR
LDA #$13 ;SEND ^S
STA STOPACK
BNE SENDSQ
CHKXMT2 LDA STOPACK ;STOPPED?
BEQ NOCTRLS ;NO, BR
LDA #$00
STA STOPREQ
STA STOPACK
LDA #$11 ;SEND ^Q
SENDSQ JSR DOPARITY
JMP SENDIT
;
NOCTRLS LDA XBUFIXW ;BUFFER EMPTY?
CMP XBUFIXR
BEQ CXRET ;YES, BR
LDX XBUFIXR
LDA XMITBUF,X
INC XBUFIXR
SENDIT STA OUTDAT ;XMIT NEXT BYTE
ADDR5 EQU *-2
;
CXRET CLI
RTS
;
;
HANGUP SEI
LDA IRQSAVE+1 ;INITTED?
BEQ HANGUP2 ;NO, BR
LDA IRQSAVE
STA IRQLOC ;RESTORE IRQ ADDR
LDA IRQSAVE+1
STA IRQLOC+1
LDA #0
STA IRQSAVE+1
LDX SLOTN0
STA SHBYT,X ;HANG UP MODEM
LDA #$0C
STA COM,X
LDA #$18
STA XMTBYT,X ;TURN OFF XMITTER
STA XMTSAV
LDA #$A1
STA SQUBYT,X
LDX #HANGMSG\
JSR PRMSGY ;PRINT MESSAGE
HANGUP2 LDA #2 ;[1.2]
STA CARRFLG
RTS
;
;
SENDBYT TAX
LDA STATUS
ADDR6 EQU *-2
AND #$10 ;READY TO XMIT?
BEQ NOTDRE ;NO, BR
TXA
AND #$7F
JSR DOPARITY
STA OUTDAT ;XMIT IT
ADDR7 EQU *-2
LDA #$01
NOTDRE RTS
;
;
COMCMD BEQ HANGUP
CMP #$0C
BEQ SENDBRK
CMP #$0B
BEQ CHGBAUD
CMP #$91
BEQ START
CMP #$93
BEQ STOP
JSR PRBYTE
LDX #CMDMSG\
;
PRMSGY LDY #MSGS^
JSR PRMSG
LDA #0
RTS
;
;
START SEI
JSR SENDBYT ;SEND ^Q
BEQ START2 ;NOT SENT, BR
LDA #0
STA STOPREQ ;CLEAR FLAGS
STA STOPACK
LDA #1
CLI
RTS
;
START2 LDA #0
STA STOPREQ
CLI
STARTLP JSR CHKXMIT
LDA STOPACK
BNE STARTLP
;[1.2] LDA #1
;[1.2] RTS
BEQ CHGBRET ;[1.2]
;
STOP SEI
JSR SENDBYT ;SEND ^S
BEQ STOP2 ;NOT SENT, BR
LDA #1
STA STOPACK ;SET FLAGS
STA STOPREQ
CLI
RTS
;
STOP2 LDA #1
STA STOPREQ
CLI
STOPLP JSR CHKXMIT
LDA STOPACK
BEQ STOPLP
RTS
;
CHGBAUD LDA IRQSAVE+1 ;MODEM INITTED?
BEQ CHGBRET ;NO, BR
SEI
JSR SETBAUD
CLI
CHGBRET LDA #1
CHGBRTS RTS
;
SENDBRK SEI
LDY SLOTN0
LDA #$02
STA COM,Y ;SET BREAK
LDA #$E9
STA DLYCNT
L7DE9 LDA BRKLEN
JSR DELAY ;WAIT A WHILE
DEC DLYCNT
BNE L7DE9
LDA #$06
STA COM,Y ;CLEAR BREAK
CLI
;[1.2] LDA #$01
;[1.2] RTS
BNE CHGBRET ;[1.2]
;
SETBAUD LDA #8
CMP BAUD ;BAUD <= 8?
BCS BAUDOK ;YES, BR
STA BAUD
;
BAUDOK LDX SLOTN0
LDA #$A1
STA SQUBYT,X
;
LDA EXTFLAG
BNE BEXT
;
LDA BAUD
CMP #8
BCS B1200
;
LDA #0 ;0-600 BAUD
STA DEVBYT,X
LDA #$11
BNE B312
;
BEXT LDA #$05 ;EXT
BNE B12A
;
B1200 LDA #$21 ;1200 BAUD
STA SQUBYT,X
LDA #$0A
B12A STA DEVBYT,X
LDA #$18
B312 STA XMTBYT,X
STA XMTSAV
LDA BAUD
ASL A
ASL A
ASL A
ASL A
ADC BAUD
EOR #$FF
ADC #$89
STA SPDBYT,X
;
LDA #$03
STA CON,X
;
SETREC LDA #$65
LDX BAUD
CPX #4
BNE SETREC2
LDA #$2D ;45.5 BAUD (TDD)
SETREC2 LDX SLOTN0
STA RECBYT,X
;
RTS
;
NOP ;AN EXTRA BYTE! [1.2]
;
; LST ON
;
PGMEND EQU *
RECVBUF DS $700
XMITBUF DS $100
;
BUFEND EQU *
;
; LST OFF