Newer
Older
uBix-Retro / dump / oa-2.0.9 / arch / csa65 / devices / oa1ds.a65
/****************************************************************************
   
    OS/A65 Version 2.0.0
    Multitasking Operating System for 6502 Computers

    Copyright (C) 1989-1998 Andre Fachat 

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

****************************************************************************/

/***************************************************************************
 * 
 * Double ACIA serial line device driver 
 * for CS/A65 architecture.
 * It uses other peripheral lines then the ones of the 6551 for rts/cts
 */

#define   ACIA      $efe8
#define   ACIA2     $e818
#define   PIA2      $e810
#define   Anzdev    2
  
          .(
          .word devend1
          jmp prg1
          .asc "ser",sernr, 0

-sernr += 1

devend1   .word devend2
          jmp prg2
          .asc "ser",sernr, 0

-sernr += 1

	.data
dev       .byt 0
div       .byt 0
status    .dsb Anzdev
instr     .dsb Anzdev
outstr    .dsb Anzdev
brkkey    .dsb Anzdev
	.text

prg1      ldx #0
          .byt $2c
prg2      ldx #1
          stx dev
          cmp #DC_RES
          beq devini
          pha
          lda status,x
          and #2
          beq prgok
          pla
          lda #E_NOTIMP
          sec
          rts
prgok     pla
          cmp #DC_IRQ
          beq devirq
          jmp others

devini    lda #0
          sta status,x
          sta instr,x
          sta outstr,x

	  lda #3
	  sta brkkey,x

          cpx #1
          beq iniser2
          
          STA ACIA+1
          LDA #%00011000; 1200 BAUD
          STA ACIA+3
          cmp ACIA+3
          bne devx
          LDA #%00000101
          STA ACIA+2
          cmp ACIA+2
          bne devx
          LDA ACIA+1
rts1hi    lda SYSPORT         /* RTS hi     */
          ora #SYS_RTS
          sta SYSPORT 
          clc
          rts

iniser2   STA ACIA2+1
          LDA #%00011000; 1200 BAUD
          STA ACIA2+3
          cmp ACIA2+3
          bne devx
          LDA #%00000101
          STA ACIA2+2
          cmp ACIA2+2
          bne devx
          LDA ACIA2+1
rts2hi    lda PIA2+PIA_CRA    /*   CA2 output hi =RTS Hi   */
          ora #%00111000
          ;and #%11110111
          sta PIA2+PIA_CRA
          clc
          rts

devx      lda status,x
          ora #2
          sta status,x
          lda #E_NOTIMP
          sec
          rts
          
devirq 
          cpx #1
          bne irqser1
          jmp irqser2
irqser1
          .(
          lda ACIA+1
          bpl irqend
          sta div
          bit status
          bpl tx
          and #%00001000
          beq nobyt
          ldx outstr
          lda ACIA

	  cmp brkkey
	  bne nobrk
	  lda #SC_SSTAT
	  ldy #SCE_BRK
	  jsr STRCMD
	  lda brkkey
nobrk
          jsr PUTC
          bcs test

nobyt     ldx outstr
          lda #SC_STAT
          jsr STRCMD
test      bcc tx
          cmp #E_NUL
          bne tstwater
          jsr rxoff
          jmp tx

irqend    lda #E_NOIRQ
	  rts

tstwater  cmp #E_SEMPTY
          beq wl
          tax
          lda status
          and #1
          bne wh
          txa
          cmp #E_SFULL
          beq wh
          cmp #E_SHWM
          bne twl
wh        jsr rts1hi
          bcc tx         ; unbedingt
twl       cmp #E_SLWM
          bne tx
wl        lda SYSPORT
          and #255-SYS_RTS    ; IO freigeben
          sta SYSPORT

tx        bit status
          bvc irqhs
          lda div
          and #%01010000
          eor #%00010000
          bne irqhs
          ldx instr
          jsr GETC
          bcs test2
          sta ACIA
          bcc irqhs
test2     cmp #E_EOF
          bne irqhs
          jsr txoff

irqhs     lda ACIA+1
	  lda #E_OK
	  rts
          .)

irqser2   .(
          lda ACIA2+1
          bpl irqend
          sta div
          bit status+1
          bpl tx
          and #%00001000
          beq nobyt
          ldx outstr+1
          lda ACIA2

	  cmp brkkey+1
	  bne nobrk
	  lda #SC_SSTAT
	  ldy #SCE_BRK
	  jsr STRCMD
	  lda brkkey+1
nobrk
          jsr PUTC
          bcs test

nobyt     ldx outstr+1
          lda #SC_STAT
          jsr STRCMD
test      bcc tx
          cmp #E_NUL
          bne tstwater
          jsr rxoff
          jmp tx
tstwater  cmp #E_SEMPTY
          beq wl
          cmp #E_SFULL
          beq wh
          cmp #E_SHWM
          bne twl
wh        jsr rts2hi
          bcc tx         ; unbedingt
twl       cmp #E_SLWM
          bne tx
wl        lda PIA2+PIA_CRA
          and #%11110111
          sta PIA2+PIA_CRA

tx        bit status+1
          bvc irqhs
          lda div
          and #%01010000
          eor #%00010000
          bne irqhs
          ldx instr+1
          jsr GETC
          bcs test2
          sta ACIA2
          bcc irqhs
test2     cmp #E_EOF
          bne irqhs
          jsr txoff

irqhs     lda ACIA2+1
	  lda #E_OK
	  rts
irqend    lda #E_NOIRQ
	  rts
          .)

others    cmp #DC_GS
          bne o1
          lda status,x
          and #DC_SW_TX
          bne devonx
          tya
          sta instr,x
          jmp ok
devonx    jmp devon
o1        cmp #DC_PS
          bne o2
          lda status,x
          and #DC_SW_RX
          bne devonx
          tya
          sta outstr,x
okx       jmp ok
o2        cmp #DC_RX_ON
          bne o3
          lda #DC_SW_RX
          bne o2a
o3        cmp #DC_TX_ON
          bne o4
	  ; lda #3
	  ; sta brkkey,x
          lda #DC_SW_TX
o2a       ora status,x
          sta status,x
          bne okx
o4        cmp #DC_RX_OFF
          bne o5
rxoff     ldx dev
          lda status,x
          and #DC_SW_RX
          beq devoffx
          lda outstr,x
          tax
          lda #SC_EOF
          jsr STRCMD
          ldx dev
          lda status,x
          and #255-DC_SW_RX
          sta status,x
          txa
          beq rx1off
          jsr rts2hi
          bcc okx
rx1off    jsr rts1hi
          bcc okx
devoffx   jmp  devoff
o5        cmp #DC_TX_OFF
          bne o6
txoff     ldx dev
          lda status,x
          and #DC_SW_TX
          beq devoffx
          lda instr,x
          tax
          lda #SC_NUL
          jsr STRCMD
          ldx dev
          lda status,x
          and #255-DC_SW_TX
          sta status,x
          jmp ok
o6        cmp #DC_HS
          bne o6a
          lda status,x
          and #255-1
          sta status,x
          tya
          and #1
          ora status,x
          sta status,x
          jmp ok
o6a       cmp #DC_SPD
          bne o7
          tya
          and #%00001111
          sta div
          ldx dev
          bne o6b
          lda ACIA+3
          and #%11110000
          ora div
          sta ACIA+3
          jmp ok
o6b       lda ACIA2+3
          and #%11110000
          ora div
          sta ACIA2+3
          jmp ok

o7        cmp #DC_ST
          beq ok 
          cmp #DC_EXIT
          bne o9		; onotimp
          jsr rxoff
          jsr txoff
          ldx dev 
          lda status,x
          ora #2
          sta status,x
          txa
          bne o8a
          sta ACIA+1
          beq ok
o8a       sta ACIA2+1
          beq ok
o9
	  cmp #DC_BRKKEY
	  bne onotimp
	  lda brkkey,x
	  pha
	  tya
	  sta brkkey,x
	  pla
	  tay
	  ; jmp ok

ok        lda #E_OK
          .byt $2c
devon     lda #E_DON
          .byt $2c
devoff    lda #E_DOFF
          .byt $2c
onotimp   lda #E_NOTIMP
          cmp #1
          rts

devend2   .)