;****************************************************************** ; ; 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 0 ;[1.2] DFB 0 MSGS EQU * ADRMSG nasc 0 nasc 0 DFB $8D,0 CMDMSG DFB $3C nasc <- BAD COM CMD> 0 DFB $8D,0 DIALMSG nasc 0 DFB 0 WAITMSG DFB $8D ;[1.2] nasc 0 DFB $8D,0 CONNMSG nasc 0 DFB $87,$8D,0 HANGMSG DFB $8D nasc 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