[Coco] NitrOS9 with Deluxe RS232 Pak

Gene Heskett gheskett at wdtv.com
Thu Jun 18 05:17:23 EDT 2015


On Thursday 18 June 2015 01:38:29 Barry Nelson wrote:
> This page seems to have a good collection of null modem wiring
> diagrams.
>
> http://www.pccompci.com/rs232-cable-technology.html
>
> Here is what I believe is my last version of the ACAIPAK driver that I
> used to use with my BBS. This is assembly source code, and needs to be
> compiled with: asm aciapak o=aciapak #40k
>
> This is optional, but if I recall, it has some enhancements and
> stability improvements. It should certainly wait indefinitely for a
> connection. It appears to be hardcoded to have the RS232 pak in slot 1
> of the multipak. I think this is the case for the regular driver as
> well.
>
>  nam ACIAPAK
>  ifp1
>  use /dd/defs/defsfile
>  endc
>  ttl New ACIAPAK with set screen size.
> verson equ $01
>  mod endmod,namemd,drivr+objct,reent+verson,xferad,endmem
> IRQReq  set %10000111
> ErrorFl set %00000111
> INSIZ  set 255 <- Must be between 32 and 255
> OUTSIZ set 255 <- Must be between 32 and 255
>  org V.SCF
> INXTI rmb $0001
> INXTO rmb $0001
> INCNT rmb $0001
> ONXTI rmb $0001
> ONXTO rmb $0001
> HALTED rmb $0001
> INHALT rmb $0001
> LASTDCD rmb $0001
> SIGPRC rmb $0002
> STATUS rmb $0001
> Parity rmb $0001
> Baud rmb $0001
> COLS rmb $0001
> ROWS rmb $0003
> INBUF rmb INSIZ
> OUTBUF rmb OUTSIZ+1
> virqmem rmb 5
> endmem equ .
>  nam ACIAPAK
> lFF92 equ $00AF
> PDESCADD equ $0050
> cFF92 equ $0092
> xFF22 equ $FF22
> xFF23 equ $FF23
> MultPak equ $FF7F
> xFF92 equ $FF92
> IT.COL equ $2C
> IT.PAR equ $26
>  fcb $03
> namemd fcs "ACIAPAK"
>  fcb $0C
> xferad
>  lbra INIT
>  lbra READ
>  lbra WRITE
>  lbra GETSTA
>  lbra SETSTA
>  lbra TERM
> irqpakt
>  fcb 0
>  fcb IRQReq
>  fcb 10
> virqpkt
>  fcb 0,3
>  fcb 0,3
>  fcb $80
> *****************************
> * Initialize the RS232 pak. *
> *****************************
> INIT ldx V.PORT,u
>  stb $01,x
>  ldd IT.COL,y
>  std COLS,u
>  ldd IT.PAR,y
>  lbsr SetComSt
>  ldd V.PORT,u
>  addd #$0001
>  leax irqpakt,pcr
>  leay IRQRout,pcr
>  os9 f$irq
>  bcs InitEnd
> ****************
> * Install VIRQ *
> ****************
>  leay virqpkt,pcr
>  leax virqmem,u
>  ldb #5
> vcopy
>  lda ,y+
>  sta ,x+
>  decb
>  bne vcopy
>  ldx #1
>  leay virqmem,u
>  ldd #3
>  os9 f$virq
>  bcs InitEnd
>  pshs cc
>  orcc #$50
>  lda >xFF23
>  anda #$FC
>  sta >xFF23
>  lda >xFF22
>  lda <cFF92
>  ora #$01
>  sta <cFF92
>  sta >xFF92
>  puls cc
>  lda #$03
>  sta >MultPak
>  clrb
> InitEnd rts
> z006E orcc #$50
>  lda ,x
>  lda ,x
>  lda $01,x
>  ldb $01,x
>  ldb $01,x
>  bmi z00E0
>  lda #$02
>  sta HALTED,u
>  clra
>  andb #$60
>  std INHALT,u
>  clrb
>  std INXTI,u
>  std ONXTI,u
>  sta INCNT,u
>  std SIGPRC,u
>  andcc #$AF
>  rts
> RecMT bsr Sleep
> ********************
> * Read a character *
> ********************
> READ
>  orcc #$50
>  lda INHALT,u
>  ble z00B1
>  ldb INCNT,u
>  cmpb #$0A
>  bhi z00B1
>  ldb V.XON,u
>  orb #$80
>  stb INHALT,u
>  ldb #$05
>  lbsr IPort1
> z00B1 tst SIGPRC,u
>  bne z00E0
>  ldb INXTO,u
>  leax INBUF,u
>  cmpb INXTI,u
>  beq RecMT
>  abx
>  lda ,x
>  dec INCNT,u
>  incb
>  cmpb #INSIZ-1
>  bls z00CF
>  clrb
> z00CF stb INXTO,u
>  ldb V.ERR,u
>  beq ExitWrOk
>  stb PD.ERR,y
>  clr V.ERR,u
>  comb
>  ldb #$F4
>  bra ExitWr
> z00E0 comb
>  ldb #$F6
>  rts
> Sleep pshs x,b,a
>  lda V.BUSY,u
>  sta V.WAKE,u
>  andcc #$AF
>  ldx #0
>  os9 f$sleep
>  ldx <PDESCADD
>  ldb $19,x
>  beq z00FD
>  cmpb #$03
>  bls z0113
> z00FD clra
>  lda $0C,x
>  bita #$02
>  bne z0113
>  ldb #$DC
>  lda V.ERR,u
>  bita #$20
>  bne z010E
>  puls pc,x,b,a
> z010E inc $3F,y
>  clr V.ERR,u
> z0113 leas $06,s
>  coma
>  rts
> TXFull bsr Sleep
> *********************
> * Write a character *
> *********************
> WRITE
>  orcc #$50
>  leax OUTBUF,u
>  ldb ONXTI,u
>  abx
>  sta ,x
>  incb
>  cmpb #OUTSIZ-1
>  bls z0128
>  clrb
> z0128
>  cmpb ONXTO,u
>  beq TXFull
>  stb ONXTI,u
>  lda HALTED,u
>  beq ExitWrOk
>  anda #$FD
>  sta HALTED,u
>  bne ExitWrOk
>  ldb #$05
>  lbsr IPort1
> ExitWrOk clrb
> ExitWr andcc #$AF
>  rts
> ***********************
> * Get status routines *
> ***********************
> GETSTA ldx PD.RGS,y
>  cmpa #SS.Ready
>  bne NotSSRDY
>  ldb INCNT,u
>  beq z00E0
>  stb R$B,x
> ExitSta clrb
>  rts
> NotSSRDY cmpa #SS.Eof
>  beq ExitSta
>  cmpa #SS.ScSiz
>  beq GetScSiz
>  cmpa #SS.ComSt
>  bne NotFound
>  ldd Parity,u
>  std R$Y,x
>  bra ExitSta
> GetScSiz clra
>  ldb COLS,u
>  std R$X,x
>  ldb ROWS,u
>  std R$Y,x
>  bra ExitSta
> NotFound comb
>  ldb #$D0
>  rts
> ***********************
> * Set status routines *
> ***********************
> SETSTA ldx PD.RGS,y
>  cmpa #SS.SSig
>  bne NotSSig
>  lda PD.CPR,y
>  ldb R$X+1,x
>  orcc #$50
>  tst INCNT,u
>  bne SendSig
>  std SIGPRC,u
>  bra ExitWrOk
> SendSig andcc #$AF
>  os9 f$send
>  clrb
>  rts
> NotSSig cmpa #SS.Open
>  beq SetOpen
>  cmpa #SS.Close
>  beq SetClose
>  cmpa #SS.ScSiz
>  beq SetScSiz
>  cmpa #SS.Relea
>  bne NotRelea
>  lda PD.CPR,y
>  cmpa SIGPRC,u
>  bne ExitSta
>  clr SIGPRC,u
>  rts
> SetScSiz clra
>  ldd R$X,x
>  stb COLS,u
>  ldd R$Y,x
>  stb ROWS,u
>  clrb
>  rts
> NotRelea cmpa #SS.ComSt
>  bne NotFound
>  ldd R$Y,x
> SetComSt std Parity,u
>  andb #$E0
>  pshs b
>  ldb Baud,u
>  andb #$07
>  leax <z01D7,pcr
>  ldb b,x
>  orb ,s+
>  anda #$E0
>  sta V.TYPE,u
>  ldx V.PORT,u
>  lda $02,x
>  anda #$1F
>  ora V.TYPE,u
>  std $02,x
>  bra z020C
> z01D7 fcb $13
>  fcb $16
>  fcb $17
>  fcb $18
>  fcb $1A
>  fcb $1C
>  fcb $1E
>  fcb $1F
> SetOpen ldb #$09
>  lda $07,x
>  cmpa #$01
>  bne z020C
>  orcc #$50
>  lbsr IPort1
>  lbra z006E
> SetClose lda $07,x
>  bne z020C
>  ldb #$0B
>  lda Parity,u
>  bita #$10
>  beq z01FD
> z01FC clrb
> z01FD pshs b
> z01FF bsr z0211
>  bcs z01FF
>  puls b
>  orcc #$50
>  lbsr IPort1
>  andcc #$AF
> z020C clrb
>  rts
> z020E lbsr Sleep
> z0211 ldb ONXTI,u
>  orcc #$50
>  cmpb ONXTO,u
>  bne z020E
>  rts
> ************************
> * Terminate the device *
> ************************
> TERM ldx <PDESCADD
>  lda ,x
>  sta V.BUSY,u
>  sta V.LPRC,u
>  bsr z01FC
>  lda <cFF92
>  anda #$FE
>  sta <cFF92
>  sta >xFF92
>  ldx #0
>  os9 f$irq
> *******************
> * De-install VIRQ *
> *******************
>  ldx #0
>  leay virqmem,u
>  ldd #3
>  os9 f$virq
>  clrb
>  rts
> ***********************
> * IRQ handler routine *
> ***********************
> another ldb >xFF92
>  orb <lFF92
>  bra reentry
> IRQRout
>  ldb <lFF92
> reentry
>  andb #$FE
>  stb <lFF92
>  ldx V.PORT,u
>  sta STATUS,u
>  tfr a,b
>  andb #$60
>  cmpb LASTDCD,u
>  beq dcdok
>  tfr b,a
>  eorb LASTDCD,u
>  sta LASTDCD,u
>  lda STATUS,u
>  bitb #$20
>  beq z027F
>  bita #$20
>  beq z027F
>  lda Parity,u
>  bita #$10
>  beq ExitIRQ
>  ldx V.PDLHd,u
>  beq nocd2
> nocd inc $3F,x
>  ldx $3D,x
>  bne nocd
> nocd2 lda #$20
>  bsr setverr
>  bra wake
> z027F bitb #$40
>  beq ExitIRQ
>  bita #$40
>  lbne z03A2
>  lbra z0391
> dcdok bita #$08
>  bne INPUT
>  bita #ErrorFl      Error flags?
>  bne ERROR          Handle it
>  bita #$10
>  beq ExitIRQ
>  lda INHALT,u
>  bpl NotHalt
>  anda #$7F
>  sta ,x
>  eora V.XON,u
>  anda #$7F
>  sta INHALT,u
>  lda HALTED,u
>  bne z02CF
>  bra ExitIRQ
> NotHalt leay OUTBUF,u
>  ldb ONXTO,u
>  cmpb ONXTI,u
>  beq TXMT
>  clra
>  lda d,y
>  incb
>  cmpb #OUTSIZ-1
>  bls z02BD
>  clrb
> z02BD stb ONXTO,u
>  sta ,x
>  cmpb ONXTI,u
>  bne wake
> TXMT lda HALTED,u
>  ora #$02
>  sta HALTED,u
> z02CF ldb #$09
>  lbsr IPort2
> wake ldb #$01
>  lda V.WAKE,u
> wake2 beq ExitIRQ
>  clr V.WAKE,u
> wake3 os9 f$send
> ExitIRQ ldx V.PORT,u
>  lda $01,x
>  lbmi another
>  clrb
>  rts
> setverr ora V.ERR,u
>  sta V.ERR,u
>  rts
> INPUT
>  bita #$07
>  beq InputOk
> ERROR
>  tfr a,b
>  tst ,x
>  anda #ErrorFl
>  bsr setverr
>  lda $02,x
>  sta $01,x
>  sta $02,x
>  bra ExitIRQ
> InputOk lda ,x
>  beq StorINP
>  cmpa V.INTR,u
>  lbeq z0380
>  cmpa V.QUIT,u
>  lbeq z0384
>  cmpa V.PCHR,u
>  beq z0378
>  cmpa V.XON,u
>  lbeq z0391
>  cmpa V.XOFF,u
>  lbeq z03A2
> StorINP leax INBUF,u
>  ldb INXTI,u
>  abx
>  sta ,x
>  incb
>  cmpb #INSIZ-1
>  bls notend1
>  clrb
> notend1
>  stb INXTI,u
>  cmpb INXTO,u
>  bne NotFull
>  lda INXTO,u
>  inca
>  cmpa #INSIZ-1
>  bls notend2
>  clra
> notend2
>  sta INXTO,u
>  lda #INSIZ-1
>  sta INCNT,u
>  lda #$04
>  bsr setverr
>  bra NoInc
> NotFull
>  inc INCNT,u
> NoInc
>  tst SIGPRC,u
>  beq z034A
>  ldd SIGPRC,u
>  clr SIGPRC,u
>  lbra wake3
> z034A lda V.XOFF,u
>  lbeq wake
>  ldb INCNT,u
>  cmpb #INSIZ-32
>  lbcs wake
>  ldb INHALT,u
>  lbne wake
>  anda #$7F
>  sta V.XOFF,u
>  ora #$80
>  sta INHALT,u
>  ldb #$05
>  bsr IPort1
>  lbra wake
> IPort1 ldx V.PORT,u
> IPort2 orb V.TYPE,u
>  stb $02,x
>  clrb
>  rts
> z0378 ldx V.DEV2,u
>  beq StorINP
>  sta $08,x
>  bra StorINP
> z0380 ldb #$03
>  bra z0386
> z0384 ldb #$02
> z0386 pshs a
>  lda V.LPRC,u
>  lbsr wake2
>  puls a
>  lbra StorINP
> z0391 lda HALTED,u
>  anda #$FE
>  sta HALTED,u
>  bne z039F
>  ldb #$05
>  bsr IPort2
> z039F lbra ExitIRQ
> z03A2 lda HALTED,u
>  bne z03AB
>  ldb #$09
>  bsr IPort2
> z03AB ora #$01
>  sta HALTED,u
>  bra z039F
>  emod
> endmod equ *
>  end

This worked flawlessly for 15 years, using /t1, from the forgotten chip 
article in RBow all those years ago. It functioned in this case as a 
personality storage/retrieval system for a Grass Valley Group 300-3A/B  
production video switcher.  Written in B09, running on a coco2 at WDTV.
Grass had a somewhat similar device called an EDisk that ran 4x slower 
and was downright klunky to use, but they wanted $20,000 for their 
version.  I sold the tv station a coco2 out of my collection with that 
added acia on some perfboard under the keyboard, with 2 disk drives for 
$245.  But it gave our Tech Directors running a newscast, the ability 
for each of them to save and recall his own "bag of tricks" to use to 
pretty up a newscast.  Grass's version had to be setup by the time the 
cast opened because it was so slow, mine was fast enough the T.D. could 
discover that button didn't do what he expected, he could run to the 
keyboard and call up his stuff, and it was done by the end of the 
opening commercial break.  They loved it.

Bruce Istead I think it was, made up a patch that because the 6551 was 
drain bamaged, (and because of that, I have never really understood why 
it was so widely used) swapped two of the status lines which made the 7 
wire hardware flow control protocol work correctly, and it was in the 
next generation driver, SACIA.dr, but I am not convinced that patch 
survived the nitros9 conversion to sc6551.dr.  My rs232 pack has that 
hardware hack in it, and I have never been able to make flow controls 
work properly with it since it became sc6551.dr.  Someone with time on 
their hands needs to check that out and make it work again.  Its 
controlled by a bit in the descriptor, plays with the DCR/DCD functions 
being reversed, IIRC.  I hope that patch is on RTSI, if not I may have a 
copy.  I used it extensively when nitros9 was at about V1.16-V1.22.

> On Jun 17, 2015, at 11:18 PM, coco-request at maltedmedia.com wrote:
> > Date: Wed, 17 Jun 2015 23:15:55 -0400
> > From: Michael Brant <brant.michael.l at gmail.com>
> > To: CoCoList for Color Computer Enthusiasts <coco at maltedmedia.com>
> > Subject: Re: [Coco] NitrOS9 with Deluxe RS232 Pak
> > Message-ID:
> > 	<CAGJGKwjr5JQDvhLnvJq3CA_2i-Xd=b-=MiKevX_T10xsKxNJEg at mail.gmail.com
> >> Content-Type: text/plain; charset=UTF-8
> >
> > Will all this talk of rs232 and null modem cables.  How would one
> > make one?  Or does anyone know where they can aquired ?

Cheers, Gene Heskett
-- 
"There are four boxes to be used in defense of liberty:
 soap, ballot, jury, and ammo. Please use in that order."
-Ed Howdershelt (Author)
Genes Web page <http://geneslinuxbox.net:6309/gene>


More information about the Coco mailing list