A2osX/DRV/SSC.I.DRV.S.txt

378 lines
8.2 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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