PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BOOT/DRV/SSC.I.DRV *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I *-------------------------------------- BUF.SIZE .EQ $20 BUF.MASK .EQ $1F *-------------------------------------- ZPTmpPtr1 .EQ ZPDRV *-------------------------------------- * see this : * http://mirrors.apple2.org.za/apple.cabi.net/Applications/Telcom/SSC.DRIVER/SSC.DRIVER.TXT * About False read issue in SSC *-------------------------------------- * SSC/ACIA I/O *-------------------------------------- SSC.REG.DIPSW1 .EQ $C081 R SSC.REG.DIPSW2 .EQ $C082 R SSC.REG.DATA .EQ $C088 R,W SSC.REG.RESET .EQ $C089 W SSC.REG.STATUS .EQ $C089 R SSC.REG.STATUS.IRQ .EQ %10000000 SSC.REG.STATUS.DSR .EQ %01000000 SSC.REG.STATUS.DCD .EQ %00100000 SSC.REG.STATUS.TDRE .EQ %00010000 SSC.REG.STATUS.RDRF .EQ %00001000 SSC.REG.STATUS.OE .EQ %00000100 SSC.REG.STATUS.FE .EQ %00000010 SSC.REG.STATUS.PE .EQ %00000001 SSC.REG.CMD .EQ $C08A W SSC.REG.CMD.NOP .EQ %00000000 SSC.REG.CMD.ODDP .EQ %00100000 SSC.REG.CMD.EVENP .EQ %01100000 SSC.REG.CMD.MARKP .EQ %10100000 SSC.REG.CMD.SPACEP .EQ %11100000 SSC.REG.CMD.ECHO .EQ %00010000 SSC.REG.CMD.TBRK .EQ %00001100 SSC.REG.CMD.TE .EQ %00001000 SSC.REG.CMD.TEIRQ .EQ %00000100 SSC.REG.CMD.RIRQDIS .EQ %00000010 SSC.REG.CMD.DTR .EQ %00000001 SSC.REG.CTL .EQ $C08B W SSC.REG.CTL.1S .EQ %00000000 SSC.REG.CTL.2S .EQ %10000000 SSC.REG.CTL.8D .EQ %00000000 SSC.REG.CTL.7D .EQ %00100000 SSC.REG.CTL.6D .EQ %01000000 SSC.REG.CTL.5D .EQ %01100000 SSC.REG.CTL.CLKEXT .EQ %00000000 SSC.REG.CTL.CLKINT .EQ %00010000 SSC.REG.CTL.B16EXT .EQ %00000000 SSC.REG.CTL.B50 .EQ %00000001 SSC.REG.CTL.B75 .EQ %00000010 SSC.REG.CTL.B110 .EQ %00000011 SSC.REG.CTL.B135 .EQ %00000100 SSC.REG.CTL.B150 .EQ %00000101 SSC.REG.CTL.B300 .EQ %00000110 SSC.REG.CTL.B600 .EQ %00000111 SSC.REG.CTL.B1200 .EQ %00001000 SSC.REG.CTL.B1800 .EQ %00001001 SSC.REG.CTL.B2400 .EQ %00001010 SSC.REG.CTL.B3600 .EQ %00001011 SSC.REG.CTL.B4800 .EQ %00001100 SSC.REG.CTL.B7200 .EQ %00001101 SSC.REG.CTL.B9600 .EQ %00001110 SSC.REG.CTL.B19200 .EQ %00001111 *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld jmp Dev.Detect cld,jmp abs=DRV .DA #$61 6502,Level 1 (65c02) .DA #1 DRV Layout Version 1 .DA 0 .DA CS.END-CS.START Code Length .DA DEV.HEADER-CS.START Device Header Offset .DA DRV.CS.START-CS.START Driver Code Offset .DA DRV.CS.END-DRV.CS.START Drv Code Length *-------------------------------------- * Relocation Table *-------------------------------------- L.MSG.DETECT .DA MSG.DETECT L.MSG.DETECT.OK .DA MSG.DETECT.OK L.MSG.DETECT.KO .DA MSG.DETECT.KO L.DEV.HEADER.NAME .DA DEV.HEADER.NAME .DA 0 End Of Reloc Table *-------------------------------------- Dev.Detect sta hArgs >LDYA L.MSG.DETECT >SYSCALL SYS.PSTROutYA stz ZPTmpPtr1 lda #$C1 sta ZPTmpPtr1+1 .1 ldx #DEVSIG.Length-1 .2 ldy DEVSIG.Offset,x lda (ZPTmpPtr1),y cmp DEVSIG.Value,x bne .3 dex bpl .2 bra .4 .3 inc ZPTmpPtr1+1 no match, try next slot.... lda ZPTmpPtr1+1 cmp #$C8 bne .1 >LDYA L.MSG.DETECT.KO >SYSCALL SYS.PSTROutYA lda #DEVMGR.ERRNOHW Not Found in any slot, exiting sec rts .4 lda ZPTmpPtr1+1 * sta DEVSLOTCn and #$0F sta DEVSLOT0n ora #$30 sta DEV.HEADER.NAME+4 asl asl asl asl sta DEVSLOTn0 clc adc #SSC.REG.DATA+1 sta DEV.DATA.BFFF >LDYA L.MSG.DETECT.OK >SYSCALL SYS.PSTROutYA >LDYA L.DEV.HEADER.NAME >SYSCALL SYS.PSTROutYA lda #13 >SYSCALL SYS.COutA clc rts *-------------------------------------- CS.END DEVSIG.Offset .HS 05070B0C DEVSIG.Value .HS 38180131 DEVSIG.Length .EQ DEVSIG.Value-DEVSIG.Offset MSG.DETECT >PSTRING "Apple SSC (Super Serial Card,//c Serial Port) Driver (IRQ Enabled).\n" MSG.DETECT.OK >PSTRING "SSC Installed As Device : " MSG.DETECT.KO >PSTRING "No SSC Found.\n" hArgs .BS 1 *-------------------------------------- * Device Header (16 Bytes) *-------------------------------------- DEV.HEADER cld jmp (DRV.CS.START,x) .DA #S.DEV.F.IRQ+S.DEV.F.EVENT+S.DEV.F.COUT+S.DEV.F.CHAR DEV.HEADER.NAME >PSTRING "COM1" NAME .HS 00.00 .HS 00.00.00.00 *-------------------------------------- * Driver Code *-------------------------------------- DRV.CS.START .DA OPEN .DA GETEVENT .DA COUT .DA CLOSE .DA GETINFO .DA IRQ L.DEVINFO .DA DEVINFO .DA 0 end or relocation *-------------------------------------- OPEN php sei ldx DEVSLOTn0 stz SSC.REG.RESET,x stz INBUF.PTR stz INBUF.CNT stz OUTBUF.PTR stz OUTBUF.CNT lda #SSC.REG.CTL.CLKINT+SSC.REG.CTL.B9600 sta SSC.REG.CTL,x lda #SSC.REG.CMD.TE+SSC.REG.CMD.DTR sta SSC.REG.CMD,x lda SSC.REG.DATA,x discard any garbage byte lda SSC.REG.STATUS,x clear any IRQ pending bmi * plp clc rts *-------------------------------------- GETEVENT php sei lda INBUF.CNT beq .9 ldx INBUF.PTR lda INBUF,x ldy #S.EVT.DATA sta (pEvent),y iny lda #0 sta (pEvent),y lda #S.EVT.F.KEY sta (pEvent) txa inc and #BUF.MASK sta INBUF.PTR dec INBUF.CNT plp clc rts .9 plp lda #0 sec rts *-------------------------------------- COUT php sei tay save char in Y ldx DEVSLOTn0 lda SSC.REG.STATUS,x bit #SSC.REG.STATUS.DCD+SSC.REG.STATUS.DSR true when 0 bne .9 ldx OUTBUF.CNT Buffer Empty? bne .10 not empty, queue char and #SSC.REG.STATUS.TDRE Register Empty ? beq .10 not empty, queue char tya yes, write directly to ACIA ldx DEV.DATA.BFFF sta $BFFF,x plp clc rts .10 cpx #BUF.SIZE beq .9 Buffer Full!! lda OUTBUF.PTR clc adc OUTBUF.CNT and #BUF.MASK tax tya sta OUTBUF,x inc OUTBUF.CNT ldx DEVSLOTn0 lda #SSC.REG.CMD.TEIRQ+SSC.REG.CMD.DTR sta SSC.REG.CMD,x plp clc rts .9 plp sec rts *-------------------------------------- CLOSE php sei ldx DEVSLOTn0 stz SSC.REG.RESET,x plp clc rts *-------------------------------------- GETINFO >LDYA L.DEVINFO clc rts *-------------------------------------- * IRQ Handler * on exit, CC if handled *-------------------------------------- IRQ ldx DEVSLOTn0 lda SSC.REG.STATUS,x IRQ from this device ? bpl .9 no, exit bit #SSC.REG.STATUS.RDRF incoming char? beq .1 *------------ IRQ In ldy SSC.REG.DATA,x read data to clear IRQ lda INBUF.CNT cmp #BUF.SIZE beq .8 buffer full, discard clc adc INBUF.PTR and #BUF.MASK tax tya get back data sta INBUF,x inc INBUF.CNT clc rts *------------ IRQ Out .1 bit #SSC.REG.STATUS.TDRE beq .2 no transmit, no recieve, CTS changed! lda OUTBUF.CNT something to transmit ? beq .11 no, disable IRQ and exit ldx OUTBUF.PTR lda OUTBUF,x ldy DEV.DATA.BFFF sta $BFFF,y dec OUTBUF.CNT txa get back OUTBUF.PTR inc and #BUF.MASK sta OUTBUF.PTR clc rts .11 lda #SSC.REG.CMD.TE+SSC.REG.CMD.DTR sta SSC.REG.CMD,x clc rts *------------ IRQ CTS High .2 .8 clc rts .9 sec rts *-------------------------------------- DRV.CS.END DEVSLOT0n .BS 1 *DEVSLOTCn .BS 1 DEV.DATA.BFFF .BS 1 DEVSLOTn0 .BS 1 INBUF.PTR .BS 1 INBUF.CNT .BS 1 OUTBUF.PTR .BS 1 OUTBUF.CNT .BS 1 INBUF .BS BUF.SIZE OUTBUF .BS BUF.SIZE DEVINFO .DA #S.DEVINFO.TYPE.CHAR .DA #0 *-------------------------------------- MAN SAVE DRV/SSC.DRV.I.S ASM