mirror of
https://github.com/A2osX/A2osX.git
synced 2024-11-22 16:31:07 +00:00
704a72cee7
Finally FIX the KM.APPLTALK module crashing at startup, Fix in SYS Driver messing with MOUSE IRQ, fix VSDRIVE timout
329 lines
6.4 KiB
Plaintext
329 lines
6.4 KiB
Plaintext
PR#3
|
||
PREFIX /A2OSX.BUILD
|
||
LOMEM $A00
|
||
INC 1
|
||
AUTO 6
|
||
.LIST OFF
|
||
.OP 65C02
|
||
.OR $2000
|
||
.TF /A2OSX.BUILD/DRV/SSC.I.DRV
|
||
*--------------------------------------
|
||
.INB /A2OSX.BUILD/INC/MACROS.I
|
||
.INB /A2OSX.BUILD/INC/A2OSX.I
|
||
.INB /A2OSX.BUILD/INC/MLI.ERR.I
|
||
.INB /A2OSX.BUILD/INC/COM.6551.I
|
||
*--------------------------------------
|
||
BUF.SIZE .EQ $40
|
||
BUF.MASK .EQ $3F
|
||
*--------------------------------------
|
||
ZPTmpPtr1 .EQ ZPDRV
|
||
*--------------------------------------
|
||
* 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 >STYA ARGS
|
||
|
||
>LDYA L.MSG.DETECT
|
||
>SYSCALL PrintF.YA
|
||
|
||
stz ZPTmpPtr1
|
||
lda #$C1
|
||
sta ZPTmpPtr1+1
|
||
|
||
.1 and #$0f
|
||
tay
|
||
lda A2osX.S,y
|
||
bne .3
|
||
|
||
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 PrintF.YA
|
||
|
||
lda #MLI.E.NODEV Not Found in any slot, exiting
|
||
sec
|
||
rts
|
||
|
||
.4 lda ZPTmpPtr1+1
|
||
and #$0F
|
||
pha
|
||
tay
|
||
lda #A2osX.S.COM
|
||
sta A2osX.S,y
|
||
pla
|
||
ora #$30
|
||
sta DEV.HEADER.NAME+3
|
||
asl
|
||
asl
|
||
asl
|
||
asl
|
||
sta DEVSLOTn0
|
||
|
||
>PUSHW L.DEV.HEADER.NAME
|
||
>LDYA L.MSG.DETECT.OK
|
||
>SYSCALL PrintF.YA
|
||
clc
|
||
rts
|
||
*--------------------------------------
|
||
CS.END
|
||
DEVSIG.Offset .HS 05070B0C
|
||
DEVSIG.Value .HS 38180131
|
||
DEVSIG.Length .EQ DEVSIG.Value-DEVSIG.Offset
|
||
MSG.DETECT >CSTR "Apple SSC (Super Serial Card,//c Serial Port) Driver (IRQ Enabled).\r\n"
|
||
MSG.DETECT.OK >CSTR "SSC Installed As Device : %s\r\n"
|
||
MSG.DETECT.KO >CSTR "No SSC Found.\r\n"
|
||
ARGS .BS 2
|
||
*--------------------------------------
|
||
* Device Header (16 Bytes)
|
||
*--------------------------------------
|
||
DEV.HEADER cld
|
||
jmp (DRV.CS.START,x)
|
||
.DA #S.DEV.S.WRITE+S.DEV.S.READ+S.DEV.S.IRQ
|
||
.BS 6
|
||
DEV.HEADER.NAME >CSTR "COM1" NAME
|
||
*--------------------------------------
|
||
* Driver Code
|
||
*--------------------------------------
|
||
DRV.CS.START .DA STATUS
|
||
.DA A2osX.BADCALL
|
||
.DA A2osX.BADCALL
|
||
.DA A2osX.BADCALL
|
||
.DA CONTROL
|
||
.DA A2osX.BADCALL
|
||
.DA OPEN
|
||
.DA CLOSE
|
||
.DA READ
|
||
.DA WRITE
|
||
.DA IRQ
|
||
L.STAT .DA STAT
|
||
.DA 0 end or relocation
|
||
*--------------------------------------
|
||
STATUS >LDYA L.STAT
|
||
clc
|
||
rts
|
||
*--------------------------------------
|
||
CONTROL clc
|
||
rts
|
||
*--------------------------------------
|
||
OPEN php
|
||
sei
|
||
ldx DEVSLOTn0
|
||
|
||
stz SSC.RESET,x
|
||
|
||
stz INBUF.HEAD
|
||
stz INBUF.TAIL
|
||
stz OUTBUF.HEAD
|
||
stz OUTBUF.TAIL
|
||
|
||
lda #SSC.CTL.CLKEXT+SSC.CTL.B9600+SSC.CTL.8D+SSC.CTL.1S+SSC.CMD.NOP
|
||
sta SSC.CTL,x
|
||
|
||
lda #SSC.CMD.TEIRQ+SSC.CMD.TE+SSC.CMD.DTR
|
||
sta SSC.CMD,x
|
||
|
||
lda SSC.DATA,x discard any garbage byte
|
||
lda SSC.STATUS,x clear any IRQ pending
|
||
|
||
plp
|
||
clc
|
||
rts
|
||
*--------------------------------------
|
||
CLOSE php
|
||
sei
|
||
ldx DEVSLOTn0
|
||
stz SSC.RESET,x
|
||
plp
|
||
clc
|
||
rts
|
||
*--------------------------------------
|
||
READ php
|
||
sei
|
||
ldx INBUF.TAIL
|
||
cpx INBUF.HEAD
|
||
beq .9
|
||
|
||
lda INBUF,x
|
||
inx
|
||
cpx #BUF.SIZE
|
||
bne .1
|
||
|
||
ldx #0
|
||
|
||
.1 stx INBUF.TAIL
|
||
|
||
plp
|
||
clc
|
||
rts
|
||
|
||
.9 plp
|
||
lda #0
|
||
sec
|
||
rts
|
||
*--------------------------------------
|
||
WRITE php
|
||
sei
|
||
tay save char in Y
|
||
|
||
ldx DEVSLOTn0
|
||
|
||
* lda SSC.STATUS,x
|
||
* bit #SSC.STATUS.DCD+SSC.STATUS.DSR true when 0
|
||
* bne .9
|
||
|
||
lda OUTBUF.HEAD
|
||
cmp OUTBUF.TAIL Buffer Empty?
|
||
bne .11 not empty, queue char
|
||
|
||
lda SSC.STATUS,x
|
||
|
||
and #SSC.STATUS.TDRE Register Empty ?
|
||
beq .10 not empty, queue char
|
||
|
||
tya yes, write directly to ACIA
|
||
sta SSC.DATA,x
|
||
|
||
plp
|
||
clc
|
||
rts
|
||
|
||
.10 lda OUTBUF.HEAD
|
||
|
||
.11 tax
|
||
inc
|
||
and #BUF.MASK
|
||
cmp OUTBUF.TAIL
|
||
beq .9 Buffer Full!!
|
||
|
||
sta OUTBUF.TAIL
|
||
|
||
tya
|
||
sta OUTBUF,x
|
||
|
||
* ldx DEVSLOTn0
|
||
* lda #SSC.CMD.TEIRQ+SSC.CMD.DTR
|
||
* sta SSC.CMD,x
|
||
plp
|
||
clc
|
||
rts
|
||
|
||
.9 plp
|
||
sec
|
||
rts
|
||
*--------------------------------------
|
||
* IRQ Handler
|
||
* on exit, CC if handled
|
||
*--------------------------------------
|
||
IRQ stz .8+1
|
||
|
||
.1 ldx DEVSLOTn0
|
||
lda SSC.STATUS,x
|
||
|
||
* bpl .9 IRQ from this device ? no, exit !!!!Applewin bug #308!!!!
|
||
|
||
bit #SSC.STATUS.RDRF incoming char?
|
||
beq .4
|
||
|
||
*------------ IRQ In
|
||
|
||
ldy SSC.DATA,x read data to clear IRQ
|
||
|
||
ldx INBUF.HEAD
|
||
txa
|
||
inc
|
||
and #BUF.MASK
|
||
cmp INBUF.TAIL
|
||
beq .8 buffer full, discard and exit
|
||
|
||
sta INBUF.HEAD
|
||
tya
|
||
sta INBUF,x
|
||
|
||
dec .8+1
|
||
|
||
bra .1
|
||
|
||
*------------ IRQ Out
|
||
|
||
.3 ldx DEVSLOTn0
|
||
lda SSC.STATUS,x
|
||
|
||
.4 bit #SSC.STATUS.TDRE
|
||
beq .8 no transmition possible....
|
||
|
||
ldy OUTBUF.TAIL something to transmit ?
|
||
cpy OUTBUF.HEAD
|
||
beq .8
|
||
|
||
lda OUTBUF,y
|
||
sta SSC.DATA,x
|
||
|
||
iny
|
||
cpy #BUF.SIZE
|
||
bne .5
|
||
ldy #0
|
||
|
||
.5 sty OUTBUF.TAIL
|
||
|
||
dec .8+1
|
||
|
||
bra .3
|
||
|
||
.8 lda #$ff did we finally handle and IRQ condtion ?
|
||
beq .9
|
||
clc
|
||
rts
|
||
|
||
.9 sec
|
||
rts
|
||
*--------------------------------------
|
||
DRV.CS.END
|
||
DEVSLOTn0 .BS 1
|
||
INBUF.TAIL .BS 1
|
||
INBUF.HEAD .BS 1
|
||
OUTBUF.TAIL .BS 1
|
||
OUTBUF.HEAD .BS 1
|
||
INBUF .BS BUF.SIZE
|
||
OUTBUF .BS BUF.SIZE
|
||
*--------------------------------------
|
||
STAT .DA #S.DSTAT.S.WRITE+S.DSTAT.S.READ+S.DEV.S.IRQ
|
||
.DA #0,#0,#0
|
||
>PSTR "Serial Card/Port"
|
||
.DA #S.DSTAT.T.CHAR
|
||
.DA #0
|
||
.DA $0900
|
||
*--------------------------------------
|
||
MAN
|
||
SAVE /A2OSX.SRC/DRV/SSC.I.DRV.S
|
||
ASM
|