changeset 1372:c97cb6d7250f

sacia.asm backported, changelogs updated
author boisy
date Fri, 26 Sep 2003 15:46:47 +0000
parents 1ed7c47503e8
children 17ab166f4361
files level1/ChangeLog level2/coco3/ChangeLog level2/coco3_6309/ChangeLog level2/modules/makefile level2/modules/sacia.asm level2/modules/xacia.asm
diffstat 6 files changed, 945 insertions(+), 1343 deletions(-) [+]
line wrap: on
line diff
--- a/level1/ChangeLog	Fri Sep 26 14:59:09 2003 +0000
+++ b/level1/ChangeLog	Fri Sep 26 15:46:47 2003 +0000
@@ -1,4 +1,5 @@
-OS-9 Level One V03.01.05:
+NitrOS-9/6809 Level 1 V03.02.00:
+- os9 and os9p2 have been renamed to kernel and kernelp2.
 - A new utility, padrom, has been added to the standard commands.
 - Merge now supports -z to get a list of files from standard input.
 - The serial printer driver and Speech-Sound Pak driver have been back-ported
--- a/level2/coco3/ChangeLog	Fri Sep 26 14:59:09 2003 +0000
+++ b/level2/coco3/ChangeLog	Fri Sep 26 15:46:47 2003 +0000
@@ -1,4 +1,6 @@
-OS-9 Level Two V03.01.05:
+NitrOS-9/6809 Level 2 V03.02.00:
+- os9p1 and os9p2 have been renamed to kernel and kernelp2.
+- sacia has been backported from NitrOS-9/6309.
 - VDGInt now works properly with 1MB and 2MB CoCo 3s.
 - A new utility, padrom, has been added to the standard commands.
 - Merge now supports -z to get a list of files from standard input.
--- a/level2/coco3_6309/ChangeLog	Fri Sep 26 14:59:09 2003 +0000
+++ b/level2/coco3_6309/ChangeLog	Fri Sep 26 15:46:47 2003 +0000
@@ -1,4 +1,6 @@
-OS-9 Level Two V03.01.05:
+NitrOS-9/6809 Level 2 V03.02.00:
+- os9p1 and os9p2 have been renamed to kernel and kernelp2.
+- sacia has been backported from NitrOS-9/6309.
 - VDGInt now works properly with 1MB and 2MB CoCo 3s.
 - A new utility, padrom, has been added to the standard commands.
 - Merge now supports -z to get a list of files from standard input.
--- a/level2/modules/makefile	Fri Sep 26 14:59:09 2003 +0000
+++ b/level2/modules/makefile	Fri Sep 26 15:46:47 2003 +0000
@@ -164,10 +164,10 @@
 ddr0_192k.dd: r0.asm
 	$(AS) $< $(ASOUT)$@ $(AFLAGS) -aRAMSize=192 -aDD=1
 
-sacia.dr: xacia.asm
+sacia.dr: sacia.asm
 	$(AS) -aA6551=1 -aA6552=0 -aMPI.Slot=03 $(AFLAGS) $< $(ASOUT)$@
 	
-dacia.dr: xacia.asm
+dacia.dr: sacia.asm
 	$(AS) -aA6551=0 -aA6552=1 -aMPI.Slot=03 $(AFLAGS) $< $(ASOUT)$@
 
 # VDGInt Modules
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level2/modules/sacia.asm	Fri Sep 26 15:46:47 2003 +0000
@@ -0,0 +1,935 @@
+********************************************************************
+* SACIA - 6551 Driver
+*
+* $Id$
+*
+* Ed.    Comments                                       Who YY/MM/DD
+* ------------------------------------------------------------------
+*        NitrOS-9 2.00 distribution                         ??/??/??
+
+           nam   SACIA
+           ttl   6551 Driver
+
+           ifp1
+           use   defsfile
+           use   scfdefs
+           endc
+
+* conditional assembly switches
+TC9        set   false          "true" for TC-9 version, "false" for Coco 3
+MPIFlag    set   true           "true" MPI slot selection, "false" no slot
+
+* miscellaneous definitions
+DCDStBit   equ   %00100000      DCD status bit for SS.CDSta call
+DSRStBit   equ   %01000000      DSR status bit for SS.CDSta call
+Edtn       equ   10
+SlpBreak   set   TkPerSec/2+1   line Break duration
+SlpHngUp   set   TkPerSec/2+1   hang up (drop DTR) duration
+Vrsn       equ   1
+
+       ifeq  TC9-true
+IRQBit     equ   %00000100      GIME IRQ bit to use for IRQ ($FF92)
+       else
+IRQBit     equ   %00000001      GIME IRQ bit to use for IRQ ($FF92)
+       endc
+
+           nam   SACIA
+           ttl   6551           Single ACIA driver
+
+* 6551 register definitions
+           org   0
+DataReg    rmb   1              receive/transmit Data (read Rx / write Tx)
+StatReg    rmb   1              status (read only)
+PRstReg    equ   StatReg        programmed reset (write only)
+CmdReg     rmb   1              command (read/write)
+CtlReg     rmb   1              control (read/write)
+
+* Status bit definitions
+Stat.IRQ   equ   %10000000      IRQ occurred
+Stat.DSR   equ   %01000000      DSR level (clear = active)
+Stat.DCD   equ   %00100000      DCD level (clear = active)
+Stat.TxE   equ   %00010000      Tx data register Empty
+Stat.RxF   equ   %00001000      Rx data register Full
+Stat.Ovr   equ   %00000100      Rx data Overrun error
+Stat.Frm   equ   %00000010      Rx data Framing error
+Stat.Par   equ   %00000001      Rx data Parity error
+
+Stat.Err   equ   Stat.Ovr!Stat.Frm!Stat.Par Status error bits
+Stat.Flp   equ   $00            all Status bits active when set
+Stat.Msk   equ   Stat.IRQ!Stat.RxF active IRQs
+
+* Control bit definitions
+Ctl.Stop   equ   %10000000      stop bits (set=two, clear=one)
+Ctl.DBit   equ   %01100000      see data bit table below
+Ctl.RxCS   equ   %00010000      Rx clock source (set=baud rate, clear=external)
+Ctl.Baud   equ   %00001111      see baud rate table below
+
+* data bit table
+DB.8       equ   %00000000      eight data bits per character
+DB.7       equ   %00100000      seven data bits per character
+DB.6       equ   %01000000      six data bits per character
+DB.5       equ   %01100000      five data bits per character
+
+* baud rate table
+           org   $00
+BR.ExClk   rmb   1              16x external clock (not supported)
+           org   $11
+BR.00050   rmb   1              50 baud (not supported)
+BR.00075   rmb   1              75 baud (not supported)
+BR.00110   rmb   1              109.92 baud
+BR.00135   rmb   1              134.58 baud (not supported)
+BR.00150   rmb   1              150 baud (not supported)
+BR.00300   rmb   1              300 baud
+BR.00600   rmb   1              600 baud
+BR.01200   rmb   1              1200 baud
+BR.01800   rmb   1              1800 baud (not supported)
+BR.02400   rmb   1              2400 baud
+BR.03600   rmb   1              3600 baud (not supported)
+BR.04800   rmb   1              4800 baud
+BR.07200   rmb   1              7200 baud (not supported)
+BR.09600   rmb   1              9600 baud
+BR.19200   rmb   1              19200 baud
+
+* Command bit definitions
+Cmd.Par    equ   %11100000      see parity table below
+Cmd.Echo   equ   %00010000      local echo (set=activated)
+Cmd.TIRB   equ   %00001100      see Tx IRQ/RTS/Break table below
+Cmd.RxI    equ   %00000010      Rx IRQ (set=disabled)
+Cmd.DTR    equ   %00000001      DTR output (set=enabled)
+
+* parity table
+Par.None   equ   %00000000
+Par.Odd    equ   %00100000
+Par.Even   equ   %01100000
+Par.Mark   equ   %10100000
+Par.Spac   equ   %11100000
+
+* Tx IRQ/RTS/Break table
+TIRB.Off   equ   %00000000      RTS & Tx IRQs disabled
+TIRB.On    equ   %00000100      RTS & Tx IRQs enabled
+TIRB.RTS   equ   %00001000      RTS enabled, Tx IRQs disabled
+TIRB.Brk   equ   %00001100      RTS enabled, Tx IRQs disabled, Tx line Break
+
+* V.ERR bit definitions
+DCDLstEr   equ   %00100000      DCD lost error
+OvrFloEr   equ   %00000100      Rx data overrun or Rx buffer overflow error
+FrmingEr   equ   %00000010      Rx data framing error
+ParityEr   equ   %00000001      Rx data parity error
+
+* FloCtlRx bit definitions
+FCRxSend   equ   %10000000      send flow control character
+FCRxSent   equ   %00010000      Rx disabled due to XOFF sent
+FCRxDTR    equ   %00000010      Rx disabled due to DTR
+FCRxRTS    equ   %00000001      Rx disabled due to RTS
+
+* FloCtlTx bit definitions
+FCTxXOff   equ   %10000000      due to XOFF received
+FCTxBrk    equ   %00000010      due to currently transmitting Break
+
+* Wrk.Type bit definitions
+Parity     equ   %11100000      parity bits
+MdmKill    equ   %00010000      modem kill option
+RxSwFlow   equ   %00001000      Rx data software (XON/XOFF) flow control
+TxSwFlow   equ   %00000100      Tx data software (XON/XOFF) flow control
+RTSFlow    equ   %00000010      CTS/RTS hardware flow control
+DSRFlow    equ   %00000001      DSR/DTR hardware flow control
+
+* Wrk.Baud bit definitions
+StopBits   equ   %10000000      number of stop bits code
+WordLen    equ   %01100000      word length code
+BaudRate   equ   %00001111      baud rate code
+
+* Wrk.XTyp bit definitions
+SwpDCDSR   equ   %10000000      swap DCD+DSR bits (valid for 6551 only)
+ForceDTR   equ   %01000000      don't drop DTR in term routine
+RxBufPag   equ   %00001111      input buffer page count
+
+* static data area definitions
+           org   V.SCF          allow for SCF manager data area
+Cpy.Stat   rmb   1              Status register copy
+CpyDCDSR   rmb   1              DSR+DCD status copy
+Mask.DCD   rmb   1              DCD status bit mask (MUST immediately precede Mask.DSR)
+Mask.DSR   rmb   1              DSR status bit mask (MUST immediately follow Mask.DCD)
+CDSigPID   rmb   1              process ID for CD signal
+CDSigSig   rmb   1              CD signal code
+FloCtlRx   rmb   1              Rx flow control flags
+FloCtlTx   rmb   1              Tx flow control flags
+RxBufEnd   rmb   2              end of Rx buffer
+RxBufGet   rmb   2              Rx buffer output pointer
+RxBufMax   rmb   2              Send XOFF (if enabled) at this point
+RxBufMin   rmb   2              Send XON (if XOFF sent) at this point
+RxBufPtr   rmb   2              pointer to Rx buffer
+RxBufPut   rmb   2              Rx buffer input pointer
+RxBufSiz   rmb   2              Rx buffer size
+RxDatLen   rmb   2              current length of data in Rx buffer
+SigSent    rmb   1              keyboard abort/interrupt signal already sent
+SSigPID    rmb   1              SS.SSig process ID
+SSigSig    rmb   1              SS.SSig signal code
+WritFlag   rmb   1              initial write attempt flag
+Wrk.Type   rmb   1              type work byte (MUST immediately precede Wrk.Baud)
+Wrk.Baud   rmb   1              baud work byte (MUST immediately follow Wrk.Type)
+Wrk.XTyp   rmb   1              extended type work byte
+RxBufDSz   equ   256-.          default Rx buffer gets remainder of page...
+RxBuff     rmb   RxBufDSz       default Rx buffer
+MemSize    equ   .
+
+           mod   ModSize,ModName,Drivr+Objct,ReEnt+Vrsn,ModEntry,MemSize
+
+           fcb   UPDAT.         access mode(s)
+
+ModName    fcs   "SACIA"
+           fcb   Edtn
+
+       ifeq  MPIFlag-true
+SlotSlct   fcb   MPI.Slot       selected MPI slot
+       else
+SlotSlct   fcb   $FF            disable MPI slot selection
+       endc
+
+IRQPckt    equ   *
+Pkt.Flip   fcb   Stat.Flp       flip byte
+Pkt.Mask   fcb   Stat.Msk       mask byte
+           fcb   $0A            priority
+
+BaudTabl   equ   *
+           fcb   BR.00110,BR.00300,BR.00600
+           fcb   BR.01200,BR.02400,BR.04800
+           fcb   BR.09600,BR.19200
+
+* NOTE:  SCFMan has already cleared all device memory except for V.PAGE and
+*        V.PORT.  Zero-default variables are:  CDSigPID, CDSigSig, Wrk.XTyp.
+Init       clrb                 default to no error...
+           pshs  cc,b,dp        save IRQ/Carry status, dummy B, system DP
+           IFNE  H6309
+           tfr   u,w
+           tfr   e,dp
+           tfr   y,w            save descriptor pointer
+           ELSE
+           clrb
+           tfr   b,dp
+           ENDC
+           ldd   <V.PORT        base hardware address
+           IFNE  H6309
+           incd                 point to 6551 status address
+           ELSE
+           addd  #$0001
+           pshs  y
+           ENDC
+           leax  IRQPckt,pc
+           leay  IRQSvc,pc
+           os9   F$IRQ
+           IFNE  H6309
+           tfr   w,y            recover descriptor pointer
+           ELSE
+           puls  y
+           ENDC
+           lbcs  ErrExit        go report error...
+           ldb   M$Opt,y        get option size
+           cmpb  #IT.XTYP-IT.DTP room for extended type byte?
+           bls   DfltInfo       no, go use defaults...
+           ldd   #Stat.DCD*256+Stat.DSR default (unswapped) DCD+DSR masks
+           tst   IT.XTYP,y      check extended type byte for swapped DCD & DSR bits
+           bpl   NoSwap         no, go skip swapping them...
+           exg   a,b            swap to DSR+DCD masks
+NoSwap     std   <Mask.DCD      save DCD+DSR (or DSR+DCD) masks
+           lda   IT.XTYP,y      get extended type byte
+           sta   <Wrk.XTyp      save it
+           anda  #RxBufPag      clear all but Rx buffer page count bits
+           beq   DfltInfo       none, go use defaults...
+           clrb                 make data size an even number of pages
+           IFNE  H6309
+           tfr   u,w            save data pointer
+           ELSE
+           pshs  u
+           ENDC
+           os9   F$SRqMem       get extended buffer
+           tfr   u,x            copy address
+           IFNE  H6309
+           tfr   w,u            recover data pointer
+           ELSE
+           puls  u
+           ENDC
+           lbcs  TermExit       error, go remove IRQ entry and exit...
+           bra   SetRxBuf
+DfltInfo   ldd   #RxBufDSz      default Rx buffer size
+           leax  RxBuff,u       default Rx buffer address
+SetRxBuf   std   <RxBufSiz      save Rx buffer size
+           stx   <RxBufPtr      save Rx buffer address
+           stx   <RxBufGet      set initial Rx buffer input address
+           stx   <RxBufPut      set initial Rx buffer output address
+           IFNE  H6309
+           addr  d,x            point to end of Rx buffer
+           ELSE
+           leax  d,x
+           ENDC
+           stx   <RxBufEnd      save Rx buffer end address
+           subd  #80            characters available in Rx buffer
+           std   <RxBufMax      set auto-XOFF threshold
+           ldd   #10            characters remaining in Rx buffer
+           std   <RxBufMin      set auto-XON threshold after auto-XOFF
+           ldb   #TIRB.RTS      default command register
+           IFNE  H6309
+           tim   #ForceDTR,<Wrk.XTyp
+           ELSE
+           ENDC
+           beq   NoDTR          no, don't enable DTR yet
+           orb   #Cmd.DTR       set (enable) DTR bit
+NoDTR      ldx   <V.PORT        get port address
+           stb   CmdReg,x       set new command register
+           ldd   IT.PAR,y       [A] = IT.PAR, [B] = IT.BAU from descriptor
+           lbsr  SetPort        go save it and set up control/format registers
+           orcc  #IntMasks      disable IRQs while setting up hardware
+           IFEQ  TC9-true
+           ELSE
+           IFNE  H6309
+           aim   #$FC,>PIA1Base+3
+           ELSE
+           ENDC
+           lda   >PIA1Base+2    clear possible pending PIA CART* FIRQ
+           ENDC
+           lda   #IRQBit        get GIME IRQ bit to use
+           ora   >D.IRQER       mask in current GIME IRQ enables
+           sta   >D.IRQER       save GIME CART* IRQ enable shadow register
+           sta   >IrqEnR        enable GIME CART* IRQs
+           lda   StatReg,x      ensure old IRQ flags are clear
+           lda   DataReg,x      ensure old error and Rx data IRQ flags are clear
+           lda   StatReg,x      ... again
+           lda   DataReg,x      ... and again
+           lda   StatReg,x      get new Status register contents
+           sta   <Cpy.Stat      save Status copy
+           tfr   a,b            copy it...
+           eora  Pkt.Flip,pc    flip bits per D.Poll
+           anda  Pkt.Mask,pc    any IRQ(s) still pending?
+           lbne  NRdyErr        yes, go report error... (device not plugged in?)
+           andb  #Stat.DSR!Stat.DCD clear all but DSR+DCD status
+           stb   <CpyDCDSR      save new DCD+DSR status copy
+           IFEQ  MPIFlag-true
+           lda   SlotSlct,pc    get MPI slot select value
+           bmi   NoSelect       no MPI slot select, go on...
+           sta   >MPI.Slct      set MPI slot select register
+           ENDC
+NoSelect   puls  cc,b,dp,pc     recover IRQ/Carry status, dummy B, system DP, return
+
+Term       clrb                 default to no error...
+           pshs  cc,dp          save IRQ/Carry status, dummy B, system DP
+           IFNE  H6309
+           tfr   u,w            setup our DP
+           tfr   e,dp
+           ELSE
+           ENDC
+           ldx   <V.PORT
+           lda   CmdReg,x       get current Command register contents
+           anda  #^(Cmd.TIRB!Cmd.DTR) disable Tx IRQs, RTS, and DTR
+           ora   #Cmd.RxI       disable Rx IRQs
+           ldb   <Wrk.XTyp      get extended type byte
+           andb  #ForceDTR      forced DTR?
+           beq   KeepDTR        no, go leave DTR disabled...
+           ora   #Cmd.DTR       set (enable) DTR bit
+KeepDTR    sta   CmdReg,x       set DTR and RTS enable/disable
+           ldd   <RxBufSiz      get Rx buffer size
+           tsta                 less than 256 bytes?
+           beq   TermExit       yes, no system memory to return...
+           pshs  u              save data pointer
+           ldu   <RxBufPtr      get address of system memory
+           os9   F$SRtMem
+           puls  u              recover data pointer
+TermExit   ldd   <V.PORT        base hardware address is status register
+           IFNE  H6309
+           incd                 point to 6551 status register
+           ELSE
+           addd  #$0001
+           ENDC
+           ldx   #$0000         remove IRQ table entry
+           leay  IRQSvc,pc
+           puls  cc             recover IRQ/Carry status
+           os9   F$IRQ
+           puls  dp,pc          restore dummy A, system DP, return
+
+ReadSlp    ldd   >D.Proc        process descriptor address
+           sta   <V.WAKE        save MSB for IRQ service routine
+           tfr   d,x            copy process descriptor address
+           IFNE  H6309
+           oim   #Suspend,P$State,x
+           ELSE
+           ldb   P$State,x
+           orb   #Suspend
+           stb   P$State,x
+           ENDC
+           lbsr  Sleep1         go suspend process...
+           ldx   >D.Proc        process descriptor address
+           ldb   P$Signal,x     pending signal for this process?
+           beq   ChkState       no, go check process state...
+           cmpb  #S$Intrpt      do we honor signal?
+           lbls  ErrExit        yes, go do it...
+ChkState   equ   *
+           IFNE  H6309
+           tim   #Condem,P$State,x
+           ELSE
+           ENDC
+           bne   PrAbtErr       yes, go do it...
+           ldb   <V.WAKE        true interrupt?
+           beq   ReadChk        yes, go read the char.
+           bra   ReadSlp        no, go suspend the process
+
+Read       clrb                 default to no errors...
+           pshs  cc,dp          save IRQ/Carry status, system DP
+           IFNE  H6309
+           tfr   u,w            setup our DP
+           tfr   e,dp
+           ELSE
+           ENDC
+ReadLoop   orcc  #IntMasks      disable IRQs while checking Rx flow control
+ReadChk    lda   <FloCtlRx      get Rx flow control flags
+           beq   ReadChar       none, go get Rx character...
+           ldx   <RxDatLen      get Rx data count again
+           cmpx  <RxBufMin      at or below XON level?
+           bhi   ReadChar       no, go get Rx character...
+           ldx   <V.PORT
+           bita  #FCRxSent      Rx disabled due to XOFF sent?
+           beq   ChkHWHS        no, go check hardware handshake(s)...
+           ldb   <FloCtlTx      get Tx flow control flags
+           bitb  #FCTxBrk       currently transmitting line Break?
+           beq   NotTxBrk       yes, go skip XON this time...
+ReadLp2    andcc #^IntMasks     turn interupts back on
+           bra   ReadLoop
+NotTxBrk   equ   *
+           IFNE  H6309
+           tim   #Stat.TxE,StatReg,x
+           ELSE
+           ENDC
+           beq   ReadLp2        no, go skip XON this time...
+           ldb   <V.XON
+           stb   DataReg,x      write XON character
+ChkHWHS    bita  #FCRxDTR!FCRxRTS Rx disabled due to DTR or RTS?
+           beq   RxFloClr       no, go clear Rx flow control flag(s)...
+           ldb   CmdReg,x       get current Command register contents
+           andb  #^Cmd.TIRB     clear Tx IRQ/RTS/Break control bits
+           orb   #TIRB.RTS!Cmd.DTR enable RTS and DTR, disable Tx IRQs
+           stb   CmdReg,x       set Command register
+RxFloClr   clr   <FloCtlRx      clear Rx flow control flags
+ReadChar   ldb   <V.ERR         get accumulated errors, if any
+           stb   PD.ERR,y       set/clear error(s) in path descriptor
+           bne   ReprtErr       error(s), go report it/them...
+           ldd   <RxDatLen      get Rx buffer count
+           beq   ReadSlp        none, go sleep while waiting for new Rx data...
+           IFNE  H6309
+           decd                 less character we're about to grab
+           ELSE
+           subd  #$0001
+           ENDC
+           std   <RxDatLen      save new Rx data count
+           orcc  #IntMasks  see if this fixes the problem
+           ldx   <RxBufGet      current Rx buffer pickup position
+           lda   ,x+            get Rx character, set up next pickup position
+           cmpx  <RxBufEnd      end of Rx buffer?
+           blo   SetPckUp       no, go keep pickup pointer
+           ldx   <RxBufPtr      get Rx buffer start address
+SetPckUp   stx   <RxBufGet      set new Rx data pickup pointer
+           puls  cc,dp,pc       recover IRQ/Carry status, dummy B, system DP, return
+
+ModEntry   lbra  Init
+           bra   Read
+           nop
+           bra   Writ
+           nop
+           bra   GStt
+           nop
+           lbra  SStt
+           lbra  Term
+
+PrAbtErr   ldb   #E$PrcAbt
+           bra   ErrExit
+
+ReprtErr   clr   <V.ERR         clear error status
+           bitb  #DCDLstEr      DCD lost error?
+           bne   HngUpErr       yes, go report it...
+           ldb   #E$Read
+ErrExit    equ  *
+           IFNE  H6309
+           oim   #Carry,,s      set carry
+           ELSE
+           lda   ,s
+           ora   #Carry
+           sta   ,s
+           ENDC
+           puls  cc,dp,pc       restore dummy A (or Tx character), system DP, return
+
+HngUpErr   ldb   #E$HangUp
+           lda   #PST.DCD       DCD lost flag
+           sta   PD.PST,y       set path status flag
+           bra   ErrExit
+
+NRdyErr    ldb   #E$NotRdy
+           bra   ErrExit
+
+UnSvcErr   ldb   #E$UnkSvc
+           bra   ErrExit
+
+Writ       clrb                 default to no error...
+           pshs  cc,dp          save IRQ/Carry status, Tx character, system DP
+           IFNE  H6309
+           tfr   u,w            setup our DP
+           tfr   e,dp
+           tfr   a,e
+           ELSE
+           ENDC
+           orcc  #IntMasks      disable IRQs during error and Tx disable checks
+           bra   WritChr
+WritLoop   lda   <WritFlag
+           beq   WritFast
+           lbsr  Sleep1
+WritFast   inc   <WritFlag
+WritChr    ldx   <V.PORT
+           ldb   <V.ERR         get accumulated errors, if any
+           andb  #DCDLstEr      DCD lost error? (ignore other errors, if any)
+           stb   PD.ERR,y       set/clear error(s) in path descriptor
+           bne   ReprtErr       DCD lost error, go report it...
+ChkTxFlo   ldb   <FloCtlTx      get Tx flow control flags
+           bitb  #FCTxBrk       currently transmitting line Break?
+           bne   WritLoop       yes, go sleep a while...
+           lda   <Wrk.Type      get software/hardware handshake enables
+           bita  #DSRFlow       DSR/DTR handshake enabled?
+* Changed below - BGP
+*           beq   ChkTxFlo       no, go check Tx flow control
+           beq   ChkRxFlo       no, go check Rx flow control
+           ldb   <Cpy.Stat      get copy of status register
+           bitb  <Mask.DSR      Tx disabled due to DSR?
+           bne   WritLoop       yes, go sleep a while...
+           bita  #TxSwFlow      Tx software flow control enabled?
+           beq   ChkRxFlo       no, go check pending Rx flow control
+           bitb  #FCTxXOff      Tx disabled due to received XOFF?
+           bne   WritLoop       yes, go sleep a while...
+ChkRxFlo   bita  #RxSwFlow      Rx software flow control enabled?
+           beq   ChkTxE         no, go check Tx register empty
+           ldb   <FloCtlRx      get Rx flow control flags
+           bitb  #FCRxSend      XON/XOFF Rx flow control pending?
+           bne   WritLoop       yes, go sleep a while...
+ChkTxE     equ   *
+           IFNE  H6309
+           tim   #Stat.TxE,StatReg,x
+           ELSE
+           ENDC
+           beq   WritLoop       no, go sleep a while...
+           IFNE  H6309
+           ste   DataReg,x      write Tx character
+           ELSE
+           ENDC
+           clr   <WritFlag      clear "initial write attempt" flag
+           puls  cc,dp,pc       recover IRQ/Carry status, Tx character, system DP, return
+
+GStt       clrb                 default to no error...
+           pshs  cc,dp          save IRQ/Carry status, dummy B, system DP
+           IFNE  H6309
+           tfr   u,w            setup our DP
+           tfr   e,dp
+           ELSE
+           ENDC
+           ldx   PD.RGS,y       caller's register stack pointer
+           cmpa  #SS.EOF
+           beq   GSExitOK       yes, SCF devices never return EOF
+           cmpa  #SS.Ready
+           bne   GetScSiz
+           ldd   <RxDatLen      get Rx data length
+           beq   NRdyErr        none, go report error
+           tsta                 more than 255 bytes?
+           beq   SaveLen        no, keep Rx data available
+           ldb   #255           yes, just use 255
+SaveLen    stb   R$B,x          set Rx data available in caller's [B]
+GSExitOK   puls  cc,dp,pc       restore Carry status, dummy B, system DP, return
+
+GetScSiz   cmpa  #SS.ScSiz
+           bne   GetComSt
+           ldu   PD.DEV,y
+           ldu   V$DESC,u
+           clra
+           ldb   IT.COL,u
+           std   R$X,x
+           ldb   IT.ROW,u
+           std   R$Y,x
+           puls  cc,dp,pc       restore Carry status, dummy B, system DP, return
+
+GetComSt   cmpa  #SS.ComSt
+           lbne  UnSvcErr       no, go report error
+           ldd   <Wrk.Type
+           std   R$Y,x
+           clra                 default to DCD and DSR enabled
+           ldb   <CpyDCDSR
+           bitb  #Mask.DCD
+           beq   CheckDSR       no, go check DSR status
+           ora   #DCDStBit
+CheckDSR   bitb  <Mask.DSR      DSR bit set (disabled)?
+           beq   SaveCDSt       no, go set DCD/DSR status
+           ora   #DSRStBit
+SaveCDSt   sta   R$B,x          set 6551 ACIA style DCD/DSR status in caller's [B]
+           puls  cc,dp,pc       restore Carry status, dummy B, system DP, return
+
+BreakSlp   ldx   #SlpBreak      SS.Break duration
+           bra   TimedSlp
+
+HngUpSlp   ldx   #SlpHngUp      SS.HngUp duration
+           bra   TimedSlp
+
+Sleep1     ldx   #1             give up balance of tick
+TimedSlp   pshs  cc             save IRQ enable status
+           andcc #^Intmasks     enable IRQs
+           os9   F$Sleep
+           puls  cc,pc          restore IRQ enable status, return
+
+SStt       clrb                 default to no error...
+           pshs  cc,dp          save IRQ/Carry status, dummy B, system DP
+           IFNE  H6309
+           tfr   u,w            setup our DP
+           tfr   e,dp
+           ELSE
+           ENDC
+           ldx   PD.RGS,y
+           cmpa  #SS.HngUp
+           bne   SetBreak
+           lda   #^Cmd.DTR      cleared (disabled) DTR bit
+           ldx   <V.PORT
+           orcc  #IntMasks      disable IRQs while setting Command register
+           anda  CmdReg,x       mask in current Command register contents
+           sta   CmdReg,x       set new Command register
+           bsr   HngUpSlp       go sleep for a while...
+BreakClr   lda   #^(Cmd.TIRB!Cmd.DTR) clear (disable) DTR and RTS control bits
+FRegClr    ldx   <V.PORT
+           anda  CmdReg,x       mask in current Command register
+           ldb   <FloCtlRx      get Rx flow control flags
+           bitb  #FCRxDTR       Rx disabled due to DTR?
+           bne   LeaveDTR       yes, go leave DTR disabled
+           ora   #Cmd.DTR       set (enable) DTR bit
+LeaveDTR   bitb  #FCRxRTS       Rx disabled due to RTS?
+           bne   LeaveRTS       yes, go leave RTS disabled
+           ora   #TIRB.RTS      enable RTS output
+LeaveRTS   ldb   <FloCtlTx      get Tx flow control flags
+           bitb  #FCTxBrk       currently transmitting line Break?
+           beq   NoTxBrk        no, go leave RTS alone...
+           ora   #TIRB.Brk      set Tx Break bits
+NoTxBrk    sta   CmdReg,x       set new Command register
+           puls  cc,dp,pc       restore IRQ/Carry status, dummy B, system DP, return
+
+SetBreak   cmpa  #SS.Break      Tx line break?
+           bne   SetSSig
+           ldy   <V.PORT
+           ldd   #FCTxBrk*256+TIRB.Brk [A]=flow control flag, [B]=Tx break enable
+           orcc  #Intmasks      disable IRQs while messing with flow control flags
+           ora   <FloCtlTx      set Tx break flag bit
+           sta   <FloCtlTx      save Tx flow control flags
+           orb   CmdReg,y       set Tx line break bits
+           stb   CmdReg,y       start Tx line break
+           bsr   BreakSlp       go sleep for a while...
+           anda  #^FCTxBrk      clear Tx break flag bit
+           sta   <FloCtlTx      save Tx flow control flags
+           clr   CmdReg,y       clear Tx line break
+           bra   BreakClr       go restore RTS output to previous...
+
+SetSSig    cmpa  #SS.SSig
+           bne   SetRelea
+           lda   PD.CPR,y       current process ID
+           ldb   R$X+1,x        LSB of [X] is signal code
+           orcc  #IntMasks      disable IRQs while checking Rx data length
+           ldx   <RxDatLen
+           bne   RSendSig
+           std   <SSigPID
+           puls  cc,dp,pc       restore IRQ/Carry status, dummy B, system DP, return
+RSendSig   puls  cc             restore IRQ/Carry status
+           os9   F$Send
+           puls  dp,pc          restore system DP, return
+
+SetRelea   cmpa  #SS.Relea
+           bne   SetCDSig
+           leax  SSigPID,u      point to Rx data signal process ID
+           bsr   ReleaSig       go release signal...
+           puls  cc,dp,pc       restore Carry status, dummy B, system DP, return
+
+SetCDSig   cmpa  #SS.CDSig      set DCD signal?
+           bne   SetCDRel
+           lda   PD.CPR,y       current process ID
+           ldb   R$X+1,x        LSB of [X] is signal code
+           std   <CDSigPID
+           puls  cc,dp,pc       restore Carry status, dummy B, system DP, return
+
+SetCDRel   cmpa  #SS.CDRel      release DCD signal?
+           bne   SetComSt
+CDRelSig   leax  CDSigPID,u     point to DCD signal process ID
+           bsr   ReleaSig       go release signal...
+           puls  cc,dp,pc       restore Carry status, dummy B, system DP, return
+
+SetComSt   cmpa  #SS.ComSt
+           bne   SetOpen
+           ldd   R$Y,x          caller's [Y] contains ACIAPAK format type/baud info
+           bsr   SetPort        go save it and set up control/format registers
+ReturnOK   puls  cc,dp,pc       restore Carry status, dummy B, system DP, return
+
+SetOpen    cmpa  #SS.Open
+           bne   SetClose
+           lda   R$Y+1,x        get LSB of caller's [Y]
+           deca                 real SS.Open from SCF? (SCF sets LSB of [Y] = 1)
+           bne   ReturnOK       no, go do nothing but return OK...
+           lda   #TIRB.RTS      enabled DTR and RTS outputs
+           orcc  #IntMasks      disable IRQs while setting Format register
+           lbra  FRegClr        go enable DTR and RTS (if not disabled due to Rx flow control)
+
+SetClose   cmpa  #SS.Close
+           lbne  UnSvcErr       no, go report error...
+           lda   R$Y+1,x        real SS.Close from SCF? (SCF sets LSB of [Y] = 0)
+           bne   ReturnOK       no, go do nothing but return OK...
+           leax  SSigPID,u      point to Rx data signal process ID
+           bsr   ReleaSig       go release signal...
+           bra   CDRelSig       go release DCD signal, return from there...
+
+ReleaSig   pshs  cc             save IRQ enable status
+           orcc  #IntMasks      disable IRQs while releasing signal
+           lda   PD.CPR,y       get current process ID
+           suba  ,x             same as signal process ID?
+           bne   NoReleas       no, go return...
+           sta   ,x             clear this signal's process ID
+NoReleas   puls  cc,pc          restore IRQ enable status, return
+
+SetPort    pshs  cc             save IRQ enable and Carry status
+           orcc  #IntMasks      disable IRQs while setting up ACIA registers
+           std   <Wrk.Type      save type/baud in data area
+           leax  BaudTabl,pc
+           andb  #BaudRate      clear all but baud rate bits
+           ldb   b,x            get baud rate setting
+           IFNE  H6309
+           tfr   b,e            save it temporarily
+           ELSE
+           ENDC
+           ldb   <Wrk.Baud      get baud info again
+           andb  #^(Ctl.RxCS!Ctl.Baud) clear clock source + baud rate code bits
+           IFNE  H6309
+           orr   e,b            mask in clock source + baud rate and clean up stack
+           ELSE
+           ENDC
+           ldx   <V.PORT        get port address
+           anda  #Cmd.Par       clear all except parity bits
+           IFNE  H6309
+           tfr   a,e            save new command register contents temporarily
+           ELSE
+           ENDC
+           lda   CmdReg,x       get current command register contents
+           anda  #^Cmd.Par      clear parity control bits
+           IFNE  H6309
+           orr   e,a            mask in new parity
+           ELSE
+           ENDC
+           std   CmdReg,x       set command+control registers
+           puls  cc,pc          recover IRQ enable and Carry status, return...
+
+IRQSvc     pshs  dp             save system DP
+           IFNE  H6309
+           tfr   u,w            setup our DP
+           tfr   e,dp
+           ELSE
+           ENDC
+           ldx   <V.PORT
+           ldb   StatReg,x      get current Status register contents
+           stb   <Cpy.Stat      save Status register copy
+           bitb  #Stat.Err      error(s)?
+           beq   ChkRDRF        no, go check Rx data
+           tst   DataReg,x      read Rx data register to clear ACIA error flags
+           bitb  #Stat.Frm      framing error (assume Rx line Break)?
+           beq   ChkParty       no, go check if parity error...
+           lda   <V.QUIT        default to keyboard quit ("Break") code
+           bra   RxBreak        go pretend we've received V.QUIT character...
+
+ChkParty   bitb  #Stat.Par      parity error?
+           beq   ChkOvRun       no, go check overrun error...
+           lda   #ParityEr      mark parity error
+ChkOvRun   bita  #Stat.Ovr      overrun error?
+           beq   SaveErrs       no, go save errors...
+           ora   #OvrFloEr      mark overrun error
+SaveErrs   ora   <V.ERR
+           sta   <V.ERR
+           lbra  ChkTrDCD       go check if DCD transition...
+
+ChkRDRF    bitb  #Stat.RxF      Rx data?
+           lbeq  ChkTrDCD       no, go check DCD transition
+           lda   DataReg,x      get Rx data
+RxBreak    beq   SavRxDat       its a null, go save it...
+           IFNE  H6309
+           stf   <SigSent       clear signal sent flag
+           ELSE
+           ENDC
+           cmpa  <V.INTR        interrupt?
+           bne   Chk.Quit       no, go on...
+           ldb   #S$Intrpt
+           bra   SendSig
+
+Chk.Quit   cmpa  <V.QUIT        abort?
+           bne   Chk.PChr       no, go on...
+           ldb   #S$Abort
+SendSig    pshs  a              save Rx data
+           lda   <V.LPRC        get last process' ID
+           os9   F$Send
+           puls  a              recover Rx data
+           stb   <SigSent       set signal sent flag
+           bra   SavRxDat       go save Rx data...
+
+Chk.PChr   cmpa  <V.PCHR        pause?
+           bne   Chk.Flow       no, go on...
+           ldx   <V.DEV2        attached device defined?
+           beq   SavRxDat       no, go save Rx data...
+           sta   V.PAUS,x       yes, pause attached device
+           bra   SavRxDat       go save Rx data...
+
+Chk.Flow   equ   *
+           IFNE  H6309
+           tim   #TxSwFlow,<Wrk.Type Tx data software flow control enabled?
+           ELSE
+           ENDC
+           beq   SavRxDat       no, go save Rx data...
+           cmpa  <V.XON         XON?
+           bne   Chk.XOff       no, go on...
+           IFNE  H6309
+           aim   #^FCTxXOff,<FloCtlTx clear XOFF received bit
+           ELSE
+           ENDC
+           bra   SetTxFlo       go save new Tx flow control flags...
+
+Chk.XOff   cmpa  <V.XOFF        XOFF?
+           bne   SavRxDat       no, go save Rx data...
+           ldb   #FCTxXOff      set XOFF received bit
+           orb   <FloCtlTx      set software Tx flow control flag
+SetTxFlo   stb   <FloCtlTx      save new Tx flow control flags
+           lbra  ChkTrDCD       go check DCD transition...
+SavRxDat   equ   *
+           IFNE  H6309
+           aim   #^FCRxSend,<FloCtlRx clear possible pending XOFF flag
+           ELSE
+           ENDC
+           ldx   <RxBufPut      get Rx buffer input pointer
+           IFNE  H6309
+           ldw   <RxDatLen      Rx get Rx buffer data length
+           cmpw  <RxBufSiz      Rx buffer already full?
+           ELSE
+           ENDC
+           blo   NotOvFlo       no, go skip overflow error...
+           IFNE  H6309
+           oim   #OvrFloEr,<V.ERR mark RX buffer overflow error
+           ELSE
+           ENDC
+           bra   DisRxFlo       go ensure Rx is disabled (if possible)
+
+NotOvFlo   sta   ,x+            save Rx data
+           cmpx  <RxBufEnd      end of Rx buffer?
+           blo   SetLayDn       no, go keep laydown pointer
+           ldx   <RxBufPtr      get Rx buffer start address
+SetLayDn   stx   <RxBufPut      set new Rx data laydown pointer
+           IFNE  H6309
+           incw                 one more byte in Rx buffer
+           stw   <RxDatLen      save new Rx data length
+           cmpw  <RxBufMax      at or past maximum fill point?
+           ELSE
+           ENDC
+           blo   SgnlRxD        no, go check Rx data signal...
+DisRxFlo   ldx   <V.PORT
+           ldb   CmdReg,x       get current Command register contents
+           IFNE  H6309
+           tim   #ForceDTR,<Wrk.XTyp forced DTR?
+           ELSE
+           ENDC
+           bne   DisRxRTS       yes, go check RTS disable...
+           IFNE  H6309
+           tim   #DSRFlow,<Wrk.Type DSR/DTR Flow control?
+           ELSE
+           ENDC
+           beq   DisRxRTS       no, go check RTS disable
+           IFNE  H6309
+           oim   #FCRxDTR,<Wrk.Type mark RX disabled due to DTR
+           ELSE
+           ENDC
+           andb  #^Cmd.DTR      clear (disable) DTR bit
+DisRxRTS   equ   *
+           IFNE  H6309
+           tim   #RTSFlow,<Wrk.Type
+           ELSE
+           ENDC
+           beq   NewRxFlo       no, go set new Rx flow control...
+           IFNE  H6309
+           tim   #DSRFlow,<Wrk.Type line break?
+           ELSE
+           ENDC
+           bne   NewRxFlo       yes, go set new Rx flow control...
+           IFNE  H6309
+           oim   #FCRxRTS,<FloCtlRx
+           ELSE
+           ENDC
+           andb  #^Cmd.TIRB     clear Tx IRQ/RTS/Break control bits (disable RTS)
+NewRxFlo   stb   CmdReg,x       set/clear DTR and RTS in Command register
+           IFNE  H6309
+           tim   #RxSwFlow,<Wrk.Type Rx software flow control?
+           ELSE
+           ldb   <Wrk.Type
+           bitb  #RxSwFlow
+           ENDC
+           beq   SgnlRxD        no, go check Rx data signal...
+           lda   <V.XOFF        XOFF character defined?
+           beq   SgnlRxD        no, go check Rx data signal...
+           ldb   <FloCtlRx      get Rx flow control flags
+           bitb  #FCRxSent      XOFF already sent?
+           bne   SgnlRxD        yes, go check Rx data signal...
+           orb   #FCRxSend      set send XOFF flag
+           stb   <FloCtlRx      set new Rx flow control flags
+           IFNE  H6309
+           tim   #Stat.TxE,StatReg,x
+           ELSE
+           ldb   StatReg,x
+           bitb  #Stat.TxE
+           ENDC
+           beq   SgnlRxD        no, go skip XOFF this time...
+           sta   DataReg,x      write XOFF character
+           ldb   #FCRxSent      set XOFF sent flag
+           orb   <FloCtlRx      mask in current Rx flow control flags
+           andb  #^FCRxSend     clear send XOFF flag
+           stb   <FloCtlRx      save new flow control flags
+SgnlRxD    ldb   <SigSent       already sent abort/interrupt signal?
+           bne   ChkTrDCD       yes, go check DCD transition...
+           lda   <SSigPID       Rx data signal process ID?
+           beq   ChkTrDCD       none, go check DCD transition...
+           stb   <SSigPID       clear Rx data signal
+           ldb   <SSigSig       Rx data signal code
+           os9   F$Send
+ChkTrDCD   ldx   <V.PORT
+           lda   <Cpy.Stat      get Status register copy
+           tfr   a,b            copy it...
+           eora  <CpyDCDSR      mark changes from old DSR+DCD status copy
+           andb  #Stat.DSR!Stat.DCD clear all but DSR+DCD status
+           stb   <CpyDCDSR      save new DSR+DCD status copy
+           bita  <Mask.DCD      DCD transition?
+           beq   CkSuspnd       no, go check for suspended process...
+           bitb  <Mask.DCD      DCD disabled now?
+           beq   SgnlDCD        no, go check DCD signal...
+           lda   <Wrk.Type
+           bita  #MdmKill       modem kill enabled?
+           beq   SgnlDCD        no, go on...
+           ldx   <V.PDLHd       path descriptor list header
+           beq   StCDLost       no list, go set DCD lost error...
+           lda   #PST.DCD       DCD lost flag
+PDListLp   sta   PD.PST,x       set path status flag
+           ldx   PD.PLP,x       get next path descriptor in list
+           bne   PDListLp       not end of list, go do another...
+StCDLost   lda   #DCDLstEr      DCD lost error flag
+           ora   <V.ERR
+           sta   <V.ERR
+SgnlDCD    lda   <CDSigPID      get process ID, send a DCD signal?
+           beq   CkSuspnd       no, go check for suspended process...
+           ldb   <CDSigSig      get DCD signal code
+           clr   <CDSigPID      clear DCD signal
+           os9   F$Send
+
+CkSuspnd   clrb                 clear Carry (for exit) and LSB of process descriptor address
+           lda   <V.WAKE        anybody waiting? ([D]=process descriptor address)
+           beq   IRQExit        no, go return...
+           stb   <V.WAKE        mark I/O done
+           tfr   d,x            copy process descriptor pointer
+           lda   P$State,x      get state flags
+           anda  #^Suspend      clear suspend state
+           sta   P$State,x      save state flags
+IRQExit    puls  dp,pc          recover system DP, return...
+
+           emod
+ModSize    equ   *
+           end
+
--- a/level2/modules/xacia.asm	Fri Sep 26 14:59:09 2003 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1338 +0,0 @@
-********************************************************************
-* XACIA - Enhanced 6551 driver
-*
-* $Id$
-*
-* Edt/Rev  YYYY/MM/DD  Modified by
-* Comment
-* ------------------------------------------------------------------
-*  10      ????/??/??  Bruce Isted
-* Distribution version.
-
-         nam   XACIA
-         ttl   Enhanced 6551 driver
-
-         ifp1  
-         use   defsfile
-         endc  
-
-* miscellaneous definitions
-DCDStBit equ   %00100000  DCD status bit for SS.CDSta call
-DSRStBit equ   %01000000  DSR status bit for SS.CDSta call
-Edtn     equ   10
-rev      equ   0
-
-* conditional assembly flags
-*A6551    set   true       6551 SACIA version
-*A6552    set   false      65C52 DACIA version
-SlpBreak set   TkPerSec/2+1 line Break duration
-SlpHngUp set   TkPerSec/4+1 hang up (drop DTR) duration
-
-         ifeq  A6552-true
-         nam   DACIA
-         ttl   65C52 Dual ACIA driver
-         else  
-
-         ifeq  A6551-true
-         nam   SACIA
-         ttl   6551 Single ACIA driver
-         endc  
-         endc  
-
-         ifeq  A6552-true
-* 65C52 register definitions
-         org   0
-ISReg    rmb   1          IRQ Status (read only)
-IEReg    equ   ISReg      IRQ Enable (write only)
-CSReg    rmb   1          Control Status (read only)
-CFReg    equ   CSReg      Control/Format (write only)
-CDReg    rmb   1          Compare Data (write only, unused in this driver)
-TBReg    equ   CDReg      Transmit Break (write only)
-DataReg  rmb   1          receive/transmit Data (read Rx / write Tx)
-
-* IRQ Status/Enable bit definitions
-ISE.IRQ  equ   %10000000  IRQ occurred/enable
-ISE.TxE  equ   %01000000  Tx data register Empty
-ISE.CTS  equ   %00100000  CTS transition
-ISE.DCD  equ   %00010000  DCD transition
-ISE.DSR  equ   %00001000  DSR transition
-ISE.FOB  equ   %00000100  Rx data Framing or Overrun error, or Break
-ISE.Par  equ   %00000010  Rx data Parity error
-ISE.RxF  equ   %00000001  Rx data register Full
-
-ISE.Errs equ   ISE.FOB!ISE.Par IRQ Status error bits
-ISE.Flip equ   $00        all ISR bits active when set
-ISE.Mask equ   ISE.CTS!ISE.DCD!ISE.DSR!ISE.FOB!ISE.Par!ISE.RxF active IRQs
-
-* Control Status bit definitions
-CS.Frame equ   %10000000  framing error (set=error)
-CS.TxE   equ   %01000000  Tx data empty (set=empty)
-CS.CTS   equ   %00100000  CTS input (set=disabled)
-CS.DCD   equ   %00010000  DCD input (set=disabled)
-CS.DSR   equ   %00001000  DSR input (set=disabled)
-CS.Break equ   %00000100  Rx line break (set=received break)
-CS.DTR   equ   %00000010  DTR output (set=disabled)
-CS.RTS   equ   %00000001  RTS output (set=disabled)
-
-* Control bit definitions
-C.TBRCDR equ   %01000000  Tx Break/Compare Data register access (set=Tx Break)
-C.StpBit equ   %00100000  stop bits (set=two, clear=one)
-C.Echo   equ   %00010000  local echo (set=activated)
-C.Baud   equ   %00001111  see baud rate table below
-
-* baud rate table
-         org   0
-BR.00050 rmb   1          50 baud (not supported)
-BR.00110 rmb   1          109.92 baud
-BR.00135 rmb   1          134.58 baud (not supported)
-BR.00150 rmb   1          150 baud (not supported)
-BR.00300 rmb   1          300 baud
-BR.00600 rmb   1          600 baud
-BR.01200 rmb   1          1200 baud
-BR.01800 rmb   1          1800 baud (not supported)
-BR.02400 rmb   1          2400 baud
-BR.03600 rmb   1          3600 baud (not supported)
-BR.04800 rmb   1          4800 baud
-BR.07200 rmb   1          7200 baud (not supported)
-BR.09600 rmb   1          9600 baud
-BR.19200 rmb   1          19200 baud
-BR.38400 rmb   1          38400 baud
-BR.ExClk rmb   1          external Rx and Tx clocks (not supported)
-
-* Format bit definitions
-F.Slct   equ   %10000000  register select (set=Format, clear=Control)
-F.DatBit equ   %01100000  see data bit table below
-F.Par    equ   %00011100  see parity table below
-F.DTR    equ   %00000010  DTR output (set=disabled)
-F.RTS    equ   %00000001  RTS output (set=disabled)
-
-* data bit table
-DB.5     equ   %00000000  five data bits per character
-DB.6     equ   %00100000  six data bits per character
-DB.7     equ   %01000000  seven data bits per character
-DB.8     equ   %01100000  eight data bits per character
-
-* parity table
-Par.None equ   %00000000
-Par.Odd  equ   %00000100
-Par.Even equ   %00001100
-Par.Mark equ   %00010100
-Par.Spac equ   %00011100
-
-* Transmit Break bit definitions
-TB.Brk   equ   %00000010  Tx break control (set=transmit continuous line Break)
-TB.Par   equ   %00000001  parity check (set=parity bit to ISE.Par, clear=normal)
-         else  
-
-         ifeq  A6551-true
-* 6551 register definitions
-         org   0
-DataReg  rmb   1          receive/transmit Data (read Rx / write Tx)
-StatReg  rmb   1          status (read only)
-PRstReg  equ   StatReg    programmed reset (write only)
-CmdReg   rmb   1          command (read/write)
-CtlReg   rmb   1          control (read/write)
-
-* Status bit definitions
-Stat.IRQ equ   %10000000  IRQ occurred
-Stat.DSR equ   %01000000  DSR level (clear = active)
-Stat.DCD equ   %00100000  DCD level (clear = active)
-Stat.TxE equ   %00010000  Tx data register Empty
-Stat.RxF equ   %00001000  Rx data register Full
-Stat.Ovr equ   %00000100  Rx data Overrun error
-Stat.Frm equ   %00000010  Rx data Framing error
-Stat.Par equ   %00000001  Rx data Parity error
-
-Stat.Err equ   Stat.Ovr!Stat.Frm!Stat.Par Status error bits
-Stat.Flp equ   $00        all Status bits active when set
-Stat.Msk equ   Stat.IRQ!Stat.RxF active IRQs
-
-* Control bit definitions
-Ctl.Stop equ   %10000000  stop bits (set=two, clear=one)
-Ctl.DBit equ   %01100000  see data bit table below
-Ctl.RxCS equ   %00010000  Rx clock source (set=baud rate, clear=external)
-Ctl.Baud equ   %00001111  see baud rate table below
-
-* data bit table
-DB.8     equ   %00000000  eight data bits per character
-DB.7     equ   %00100000  seven data bits per character
-DB.6     equ   %01000000  six data bits per character
-DB.5     equ   %01100000  five data bits per character
-
-* baud rate table
-         org   $00
-BR.ExClk rmb   1          16x external clock (not supported)
-         org   $11
-BR.00050 rmb   1          50 baud (not supported)
-BR.00075 rmb   1          75 baud (not supported)
-BR.00110 rmb   1          109.92 baud
-BR.00135 rmb   1          134.58 baud (not supported)
-BR.00150 rmb   1          150 baud (not supported)
-BR.00300 rmb   1          300 baud
-BR.00600 rmb   1          600 baud
-BR.01200 rmb   1          1200 baud
-BR.01800 rmb   1          1800 baud (not supported)
-BR.02400 rmb   1          2400 baud
-BR.03600 rmb   1          3600 baud (not supported)
-BR.04800 rmb   1          4800 baud
-BR.07200 rmb   1          7200 baud (not supported)
-BR.09600 rmb   1          9600 baud
-BR.19200 rmb   1          19200 baud
-
-* Command bit definitions
-Cmd.Par  equ   %11100000  see parity table below
-Cmd.Echo equ   %00010000  local echo (set=activated)
-Cmd.TIRB equ   %00001100  see Tx IRQ/RTS/Break table below
-Cmd.RxI  equ   %00000010  Rx IRQ (set=disabled)
-Cmd.DTR  equ   %00000001  DTR output (set=enabled)
-
-* parity table
-Par.None equ   %00000000
-Par.Odd  equ   %00100000
-Par.Even equ   %01100000
-Par.Mark equ   %10100000
-Par.Spac equ   %11100000
-
-* Tx IRQ/RTS/Break table
-TIRB.Off equ   %00000000  RTS & Tx IRQs disabled
-TIRB.On  equ   %00000100  RTS & Tx IRQs enabled
-TIRB.RTS equ   %00001000  RTS enabled, Tx IRQs disabled
-TIRB.Brk equ   %00001100  RTS enabled, Tx IRQs disabled, Tx line Break
-         endc  
-         endc  
-
-* V.ERR bit definitions
-DCDLstEr equ   %00100000  DCD lost error
-OvrFloEr equ   %00000100  Rx data overrun or Rx buffer overflow error
-FrmingEr equ   %00000010  Rx data framing error
-ParityEr equ   %00000001  Rx data parity error
-
-* FloCtlRx bit definitions
-FCRxSend equ   %10000000  send flow control character
-FCRxSent equ   %00010000  Rx disabled due to XOFF sent
-FCRxDTR  equ   %00000010  Rx disabled due to DTR
-FCRxRTS  equ   %00000001  Rx disabled due to RTS
-
-* FloCtlTx bit definitions
-FCTxXOff equ   %10000000  due to XOFF received
-FCTxBrk  equ   %00000010  due to currently transmitting Break
-
-* Wrk.Type bit definitions
-Parity   equ   %11100000  parity bits
-MdmKill  equ   %00010000  modem kill option
-RxSwFlow equ   %00001000  Rx data software (XON/XOFF) flow control
-TxSwFlow equ   %00000100  Tx data software (XON/XOFF) flow control
-RTSFlow  equ   %00000010  CTS/RTS hardware flow control
-DSRFlow  equ   %00000001  DSR/DTR hardware flow control
-
-* Wrk.Baud bit definitions
-StopBits equ   %10000000  number of stop bits code
-WordLen  equ   %01100000  word length code
-BaudRate equ   %00001111  baud rate code
-
-* Wrk.XTyp bit definitions
-SwpDCDSR equ   %10000000  swap DCD+DSR bits (valid for 6551 only)
-ForceDTR equ   %01000000  don't drop DTR in term routine
-RxBufPag equ   %00001111  input buffer page count
-
-* static data area definitions
-         org   V.SCF      allow for SCF manager data area
-
-         ifeq  A6552-true
-Cpy.CR   rmb   1          Control register copy (MUST immediately precede Cpy.FR)
-Cpy.FR   rmb   1          Format register copy (MUST immediately follow Cpy.CR)
-Cpy.ISR  rmb   1          IRQ Status register copy (MUST immediately precede Cpy.CSR)
-Cpy.CSR  rmb   1          Control Status register copy (MUST immediately follow Cpy.ISR)
-         else  
-
-         ifeq  A6551-true
-Cpy.Stat rmb   1          Status register copy
-CpyDCDSR rmb   1          DSR+DCD status copy
-Mask.DCD rmb   1          DCD status bit mask (MUST immediately precede Mask.DSR)
-Mask.DSR rmb   1          DSR status bit mask (MUST immediately follow Mask.DCD)
-         endc  
-         endc  
-
-CDSigPID rmb   1          process ID for CD signal
-CDSigSig rmb   1          CD signal code
-FloCtlRx rmb   1          Rx flow control flags
-FloCtlTx rmb   1          Tx flow control flags
-RxBufEnd rmb   2          end of Rx buffer
-RxBufGet rmb   2          Rx buffer output pointer
-RxBufMax rmb   2          Send XOFF (if enabled) at this point
-RxBufMin rmb   2          Send XON (if XOFF sent) at this point
-RxBufPtr rmb   2          pointer to Rx buffer
-RxBufPut rmb   2          Rx buffer input pointer
-RxBufSiz rmb   2          Rx buffer size
-RxDatLen rmb   2          current length of data in Rx buffer
-SigSent  rmb   1          keyboard abort/interrupt signal already sent
-SSigPID  rmb   1          SS.SSig process ID
-SSigSig  rmb   1          SS.SSig signal code
-WritFlag rmb   1          initial write attempt flag
-Wrk.Type rmb   1          type work byte (MUST immediately precede Wrk.Baud)
-Wrk.Baud rmb   1          baud work byte (MUST immediately follow Wrk.Type)
-Wrk.XTyp rmb   1          extended type work byte
-RxBufDSz equ   256-.      default Rx buffer gets remainder of page...
-RxBuff   rmb   RxBufDSz   default Rx buffer
-MemSize  equ   .
-
-         mod   ModSize,ModName,Drivr+Objct,ReEnt+rev,ModEntry,MemSize
-
-         fcb   UPDAT.     access mode(s)
-
-         ifeq  A6552-true
-ModName  fcs   "DACIA"
-         else  
-
-         ifeq  A6551-true
-ModName  fcs   "SACIA"
-         endc  
-         endc  
-
-         fcb   Edtn
-
-SlotSlct fcb   MPI.Slot   selected MPI slot
-
-ModEntry equ   *
-         lbra  Init
-         lbra  Read
-         lbra  Writ
-         lbra  GStt
-         lbra  SStt
-         lbra  Term
-
-IRQPckt  equ   *
-
-         ifeq  A6552-true
-Pkt.Flip fcb   ISE.Flip   D.Poll flip byte
-Pkt.Mask fcb   ISE.Mask   D.Poll mask byte
-         else  
-
-         ifeq  A6551-true
-Pkt.Flip fcb   Stat.Flp   flip byte
-Pkt.Mask fcb   Stat.Msk   mask byte
-         endc  
-         endc  
-
-         fcb   $0A        priority
-
-BaudTabl equ   *
-
-         ifeq  A6552-true
-         fcb   BR.00110,BR.00300,BR.00600
-         fcb   BR.01200,BR.02400,BR.04800
-         fcb   BR.09600,BR.19200,BR.38400
-         else  
-
-         ifeq  A6551-true
-         fcb   BR.00110,BR.00300,BR.00600
-         fcb   BR.01200,BR.02400,BR.04800
-         fcb   BR.09600,BR.19200
-         endc  
-         endc  
-
-
-* NOTE:  SCFMan has already cleared all device memory except for V.PAGE and
-*        V.PORT.  Zero-default variables are:  CDSigPID, CDSigSig, Wrk.XTyp.
-Init     equ   *
-         clrb             default to no error...
-         pshs  cc,b,dp    save IRQ/Carry status, dummy B, system DP
-         lbsr  SetDP      go set our DP
-         pshs  y          save descriptor pointer
-         ldd   <V.PORT    base hardware address
-
-         ifeq  A6552-true
-         else  
-
-         ifeq  A6551-true
-         addd  #1         point to 6551 status address
-         endc  
-         endc  
-
-         leax  IRQPckt,pcr
-         leay  IRQSvc,pcr
-         os9   F$IRQ
-         puls  y          recover descriptor pointer
-         lbcs  ErrExit    go report error...
-         ldb   M$Opt,y    get option size
-         cmpb  #IT.XTYP-IT.DTP room for extended type byte?
-         bls   DfltInfo   no, go use defaults...
-
-         ifeq  A6552-true
-         else  
-
-         ifeq  A6551-true
-         ldd   #Stat.DCD*256+Stat.DSR default (unswapped) DCD+DSR masks
-         tst   IT.XTYP,y  check extended type byte for swapped DCD & DSR bits
-         bpl   NoSwap     no, go skip swapping them...
-         exg   a,b        swap to DSR+DCD masks
-NoSwap   std   <Mask.DCD  save DCD+DSR (or DSR+DCD) masks
-         endc  
-         endc  
-
-         lda   IT.XTYP,y  get extended type byte
-         sta   <Wrk.XTyp  save it
-         anda  #RxBufPag  clear all but Rx buffer page count bits
-         beq   DfltInfo   none, go use defaults...
-         clrb             make data size an even number of pages
-         pshs  u          save data pointer
-         os9   F$SRqMem   get extended buffer
-         tfr   u,x        copy address
-         puls  u          recover data pointer
-         lbcs  TermExit   error, go remove IRQ entry and exit...
-         bra   SetRxBuf
-
-DfltInfo ldd   #RxBufDSz  default Rx buffer size
-         leax  RxBuff,u   default Rx buffer address
-SetRxBuf std   <RxBufSiz  save Rx buffer size
-         stx   <RxBufPtr  save Rx buffer address
-         stx   <RxBufGet  set initial Rx buffer input address
-         stx   <RxBufPut  set initial Rx buffer output address
-         leax  d,x        point to end of Rx buffer
-         stx   <RxBufEnd  save Rx buffer end address
-         subd  #80        characters available in Rx buffer
-         std   <RxBufMax  set auto-XOFF threshold
-         ldd   #10        characters remaining in Rx buffer
-         std   <RxBufMin  set auto-XON threshold after auto-XOFF
-
-         ifeq  A6552-true
-         ldd   #C.TBRCDR*256+(F.Slct!F.DTR!F.RTS) [A]=control, [B]=format register
-         sta   <Cpy.CR    save control register copy
-         lda   <Wrk.XTyp
-         anda  #ForceDTR  forced DTR?
-         beq   NoDTR      no, don't enable DTR yet
-         andb  #^F.DTR    clear (enable) DTR bit
-NoDTR    stb   <Cpy.FR    save format register copy
-         else  
-
-         ifeq  A6551-true
-         ldb   #TIRB.RTS  default command register
-         lda   <Wrk.XTyp
-         anda  #ForceDTR  forced DTR?
-         beq   NoDTR      no, don't enable DTR yet
-         orb   #Cmd.DTR   set (enable) DTR bit
-NoDTR    ldx   <V.PORT    get port address
-         stb   CmdReg,x   set new command register
-         endc  
-         endc  
-
-         ldd   IT.PAR,y   [A] = IT.PAR, [B] = IT.BAU from descriptor
-         lbsr  SetPort    go save it and set up control/format registers
-         orcc  #IntMasks  disable IRQs while setting up hardware
-         lda   >PIA1Base+3 get PIA CART* input control register
-         anda  #$FC       clear PIA CART* control bits
-         sta   >PIA1Base+3 disable PIA CART* FIRQs
-         lda   >PIA1Base+2 clear possible pending PIA CART* FIRQ
-         lda   #$01       GIME CART* IRQ bit
-         ora   >D.IRQER   mask in current GIME IRQ enables
-         sta   >D.IRQER   save GIME CART* IRQ enable shadow register
-         sta   >IrqEnR    enable GIME CART* IRQs
-
-         ifeq  A6552-true
-         lda   #ISE.IRQ!ISE.Mask DACIA IRQ enables
-         sta   IEReg,x    enable DACIA IRQs for this port ([X]=V.PORT from SetPort)
-         ldb   ISReg,x    ensure old CTS, DCD, and DSR transition IRQ flags are clear
-         ldb   DataReg,x  ensure old error and Rx data IRQ flags are clear
-         ldb   ISReg,x    ... again
-         ldb   DataReg,x  ... and again
-         ldd   ISReg,x    get new IRQ and Control status registers
-         eora  Pkt.Flip,pcr flip bits per D.Poll
-         anda  Pkt.Mask,pcr any IRQ(s) still pending?
-         lbne  NRdyErr    yes, go report error... (device not plugged in?)
-         std   <Cpy.ISR   save new IRQ and Control status register copies
-         else  
-
-         ifeq  A6551-true
-         lda   StatReg,x  ensure old IRQ flags are clear
-         lda   DataReg,x  ensure old error and Rx data IRQ flags are clear
-         lda   StatReg,x  ... again
-         lda   DataReg,x  ... and again
-         lda   StatReg,x  get new Status register contents
-         sta   <Cpy.Stat  save Status copy
-         tfr   a,b        copy it...
-         eora  Pkt.Flip,pcr flip bits per D.Poll
-         anda  Pkt.Mask,pcr any IRQ(s) still pending?
-         lbne  NRdyErr    yes, go report error... (device not plugged in?)
-         andb  #Stat.DSR!Stat.DCD clear all but DSR+DCD status
-         stb   <CpyDCDSR  save new DCD+DSR status copy
-         endc  
-         endc  
-
-         lda   SlotSlct,pcr get MPI slot select value
-         bmi   NoSelect   no MPI slot select, go on...
-         sta   >MPI.Slct  set MPI slot select register
-NoSelect puls  cc,b,dp,pc recover IRQ/Carry status, dummy B, system DP, return
-
-
-Term     equ   *
-         clrb             default to no error...
-         pshs  cc,b,dp    save IRQ/Carry status, dummy B, system DP
-         lbsr  SetDP      go set our DP
-
-         ifeq  A6552-true
-         lda   #^ISE.IRQ  disable all DACIA IRQs
-         ldx   <V.PORT
-         sta   IEReg,x    disable DACIA IRQs for this port
-         lda   <Cpy.FR    get format register copy
-         ora   #F.DTR!F.RTS set (disable) DTR and RTS bits
-         ldb   <Wrk.XTyp  get extended type byte
-         andb  #ForceDTR  forced DTR?
-         beq   KeepDTR    no, go leave DTR disabled...
-         anda  #^F.DTR    clear (enable) DTR bit
-KeepDTR  sta   CFReg,x    set DTR and RTS enable/disable
-         else  
-
-         ifeq  A6551-true
-         ldx   <V.PORT
-         lda   CmdReg,x   get current Command register contents
-         anda  #^(Cmd.TIRB!Cmd.DTR) disable Tx IRQs, RTS, and DTR
-         ora   #Cmd.RxI   disable Rx IRQs
-         ldb   <Wrk.XTyp  get extended type byte
-         andb  #ForceDTR  forced DTR?
-         beq   KeepDTR    no, go leave DTR disabled...
-         ora   #Cmd.DTR   set (enable) DTR bit
-KeepDTR  sta   CmdReg,x   set DTR and RTS enable/disable
-         endc  
-         endc  
-
-         ldd   <RxBufSiz  get Rx buffer size
-         tsta             less than 256 bytes?
-         beq   TermExit   yes, no system memory to return...
-         pshs  u          save data pointer
-         ldu   <RxBufPtr  get address of system memory
-         os9   F$SRtMem
-         puls  u          recover data pointer
-TermExit ldd   <V.PORT    base hardware address is status register
-
-         ifeq  A6552-true
-         else  
-
-         ifeq  A6551-true
-         addd  #1         point to 6551 status register
-         endc  
-         endc  
-
-         ldx   #$0000     remove IRQ table entry
-         leay  IRQSvc,pcr
-         puls  cc         recover IRQ/Carry status
-         os9   F$IRQ
-         puls  a,dp,pc    restore dummy A, system DP, return
-
-
-ReadSlp  ldd   >D.Proc    process descriptor address
-         sta   <V.WAKE    save MSB for IRQ service routine
-         tfr   d,x        copy process descriptor address
-         ldb   P$State,x  get process state flag
-         orb   #Suspend   set suspend flag
-         stb   P$State,x  put process in suspend state
-         lbsr  Sleep1     go suspend process...
-         ldx   >D.Proc    process descriptor address
-         ldb   P$Signal,x pending signal for this process?
-         beq   ChkState   no, go check process state...
-         cmpb  #S$Intrpt  do we honor signal?
-         bls   ErrExit    yes, go do it...
-ChkState ldb   P$State,x  get process state
-         bitb  #Condem    we be dead?
-         bne   PrAbtErr   yes, go do it...
-         ldb   <V.WAKE    true interrupt?
-         bne   ReadSlp    no, go suspend again...
-ReadLoop puls  cc,b,dp    recover IRQ/Carry status, dummy B, system DP
-
-Read     equ   *
-         clrb             default to no errors...
-         pshs  cc,b,dp    save IRQ/Carry status, dummy B, system DP
-         lbsr  SetDP      go set our DP
-         orcc  #IntMasks  disable IRQs while checking Rx flow control
-         lda   <FloCtlRx  get Rx flow control flags
-         beq   ReadChar   none, go get Rx character...
-         ldx   <RxDatLen  get Rx data count again
-         cmpx  <RxBufMin  at or below XON level?
-         bhi   ReadChar   no, go get Rx character...
-         ldx   <V.PORT
-         bita  #FCRxSent  Rx disabled due to XOFF sent?
-         beq   ChkHWHS    no, go check hardware handshake(s)...
-         ldb   <FloCtlTx  get Tx flow control flags
-         bitb  #FCTxBrk   currently transmitting line Break?
-         bne   ReadLoop   yes, go skip XON this time...
-
-         ifeq  A6552-true
-         ldb   CSReg,x    get new Control Status register
-         bitb  #CS.TxE    Tx data register empty?
-         beq   ReadLoop   no, go skip XON this time...
-         ldb   <V.XON
-         stb   DataReg,x  write XON character
-ChkHWHS  bita  #FCRxDTR!FCRxRTS Rx disabled due to DTR or RTS?
-         beq   RxFloClr   no, go clear Rx flow control flag(s)...
-         ldb   <Cpy.FR    get Format register copy
-         andb  #^(F.DTR!F.RTS) clear (enable) DTR and RTS bits
-         stb   <Cpy.FR    save Format register copy
-         stb   CFReg,x    set Format register
-         else  
-
-         ifeq  A6551-true
-         ldb   StatReg,x  get new Status register
-         bitb  #Stat.TxE  Tx data register empty?
-         beq   ReadLoop   no, go skip XON this time...
-         ldb   <V.XON
-         stb   DataReg,x  write XON character
-ChkHWHS  bita  #FCRxDTR!FCRxRTS Rx disabled due to DTR or RTS?
-         beq   RxFloClr   no, go clear Rx flow control flag(s)...
-         ldb   CmdReg,x   get current Command register contents
-         andb  #^Cmd.TIRB clear Tx IRQ/RTS/Break control bits
-         orb   #TIRB.RTS!Cmd.DTR enable RTS and DTR, disable Tx IRQs
-         stb   CmdReg,x   set Command register
-         endc  
-         endc  
-
-RxFloClr clr   <FloCtlRx  clear Rx flow control flags
-ReadChar ldb   <V.ERR     get accumulated errors, if any
-         stb   PD.ERR,y   set/clear error(s) in path descriptor
-         bne   ReprtErr   error(s), go report it/them...
-         ldx   <RxDatLen  get Rx buffer count
-         beq   ReadSlp    none, go sleep while waiting for new Rx data...
-         leax  -1,x       less character we're about to grab
-         stx   <RxDatLen  save new Rx data count
-         ldx   <RxBufGet  current Rx buffer pickup position
-         lda   ,x+        get Rx character, set up next pickup position
-         cmpx  <RxBufEnd  end of Rx buffer?
-         blo   SetPckUp   no, go keep pickup pointer
-         ldx   <RxBufPtr  get Rx buffer start address
-SetPckUp stx   <RxBufGet  set new Rx data pickup pointer
-         puls  cc,b,dp,pc recover IRQ/Carry status, dummy B, system DP, return
-
-
-PrAbtErr ldb   #E$PrcAbt
-         bra   ErrExit
-
-ReprtErr clr   <V.ERR     clear error status
-         bitb  #DCDLstEr  DCD lost error?
-         bne   HngUpErr   yes, go report it...
-         ldb   #E$Read
-ErrExit  puls  cc         restore IRQ enable and Carry status
-         coma             error, set Carry
-         puls  a,dp,pc    restore dummy A (or Tx character), system DP, return
-
-HngUpErr ldb   #E$HangUp
-         lda   #PST.DCD   DCD lost flag
-         sta   PD.PST,y   set path status flag
-         bra   ErrExit
-
-NRdyErr  ldb   #E$NotRdy
-         bra   ErrExit
-
-UnSvcErr ldb   #E$UnkSvc
-         bra   ErrExit
-
-
-WritLoop lda   <WritFlag  first pass through for this Tx character?
-         beq   WritFast   yes, don't sleep yet...
-         lbsr  Sleep1     go sleep for balance of tick...
-WritFast inc   <WritFlag  set "initial write attempt" flag
-         puls  cc,a,dp    recover IRQ/Carry status, Tx character, system DP
-
-Writ     equ   *
-         clrb             default to no error...
-         pshs  cc,a,dp    save IRQ/Carry status, Tx character, system DP
-         lbsr  SetDP      go set our DP
-         ldx   <V.PORT
-         orcc  #IntMasks  disable IRQs during error and Tx disable checks
-         ldb   <V.ERR     get accumulated errors, if any
-         andb  #DCDLstEr  DCD lost error? (ignore other errors, if any)
-         stb   PD.ERR,y   set/clear error(s) in path descriptor
-         bne   ReprtErr   DCD lost error, go report it...
-
-         ifeq  A6552-true
-         ldb   <Cpy.CSR   get copy of control status register
-         bitb  #CS.CTS    Tx disabled due to CTS?
-         bne   WritLoop   yes, go sleep a while...
-         lda   <Wrk.Type  get software/hardware handshake enables
-         bita  #DSRFlow   DSR/DTR handshake enabled?
-         beq   ChkTxFlo   no, go check Tx flow control
-         bitb  #CS.DSR    Tx disabled due to DSR?
-         bne   WritLoop   yes, go sleep a while...
-         else  
-
-         ifeq  A6551-true
-         lda   <Wrk.Type  get software/hardware handshake enables
-         bita  #DSRFlow   DSR/DTR handshake enabled?
-         beq   ChkTxFlo   no, go check Tx flow control
-         ldb   <Cpy.Stat  get copy of status register
-         bitb  <Mask.DSR  Tx disabled due to DSR?
-         bne   WritLoop   yes, go sleep a while...
-         endc  
-         endc  
-
-ChkTxFlo ldb   <FloCtlTx  get Tx flow control flags
-         bitb  #FCTxBrk   currently transmitting line Break?
-         bne   WritLoop   yes, go sleep a while...
-         bita  #TxSwFlow  Tx software flow control enabled?
-         beq   ChkRxFlo   no, go check pending Rx flow control
-         bitb  #FCTxXOff  Tx disabled due to received XOFF?
-         bne   WritLoop   yes, go sleep a while...
-ChkRxFlo bita  #RxSwFlow  Rx software flow control enabled?
-         beq   ChkTxE     no, go check Tx register empty
-         ldb   <FloCtlRx  get Rx flow control flags
-         bitb  #FCRxSend  XON/XOFF Rx flow control pending?
-         bne   WritLoop   yes, go sleep a while...
-ChkTxE   lda   1,s        get Tx character
-
-         ifeq  A6552-true
-         ldb   CSReg,x    get new control status register
-         bitb  #CS.TxE    Tx register empty?
-         beq   WritLoop   no, go sleep a while...
-         sta   DataReg,x  write Tx character
-         else  
-
-         ifeq  A6551-true
-         ldb   StatReg,x  get new status register
-         bitb  #Stat.TxE  Tx register empty?
-         beq   WritLoop   no, go sleep a while...
-         sta   DataReg,x  write Tx character
-         endc  
-         endc  
-
-         clr   <WritFlag  clear "initial write attempt" flag
-         puls  cc,a,dp,pc recover IRQ/Carry status, Tx character, system DP, return
-
-
-GStt     equ   *
-         clrb             default to no error...
-         pshs  cc,b,dp    save IRQ/Carry status, dummy B, system DP
-         lbsr  SetDP      go set our DP
-         ldx   PD.RGS,y   caller's register stack pointer
-         cmpa  #SS.EOF
-         beq   GSExitOK   yes, SCF devices never return EOF
-         cmpa  #SS.Ready
-         bne   GetScSiz
-         ldd   <RxDatLen  get Rx data length
-         beq   NRdyErr    none, go report error
-         tsta             more than 255 bytes?
-         beq   SaveLen    no, keep Rx data available
-         ldb   #255       yes, just use 255
-SaveLen  stb   R$B,x      set Rx data available in caller's [B]
-GSExitOK puls  cc,b,dp,pc restore Carry status, dummy B, system DP, return
-
-GetScSiz cmpa  #SS.ScSiz
-         bne   GetComSt
-         ldu   PD.DEV,y
-         ldu   V$DESC,u
-         clra  
-         ldb   IT.COL,u
-         std   R$X,x
-         ldb   IT.ROW,u
-         std   R$Y,x
-         puls  cc,b,dp,pc restore Carry status, dummy B, system DP, return
-
-GetComSt cmpa  #SS.ComSt
-         lbne  UnSvcErr   no, go report error
-         ldd   <Wrk.Type
-         std   R$Y,x
-         clra             default to DCD and DSR enabled
-
-         ifeq  A6552-true
-         ldb   <Cpy.CSR   get current status
-         bitb  #CS.DCD    DCD bit set (disabled)?
-         else  
-
-         ifeq  A6551-true
-         ldb   <CpyDCDSR  get current DSR+DCD status
-         bitb  <Mask.DCD  DCD bit set (disabled)?
-         endc  
-         endc  
-
-         beq   CheckDSR   no, go check DSR status
-         ora   #DCDStBit
-
-         ifeq  A6552-true
-CheckDSR bitb  #CS.DSR    DSR bit set (disabled)?
-         else  
-
-         ifeq  A6551-true
-CheckDSR bitb  <Mask.DSR  DSR bit set (disabled)?
-         endc  
-         endc  
-
-         beq   SaveCDSt   no, go set DCD/DSR status
-         ora   #DSRStBit
-SaveCDSt sta   R$B,x      set 6551 ACIA style DCD/DSR status in caller's [B]
-         puls  cc,b,dp,pc restore Carry status, dummy B, system DP, return
-
-
-BreakSlp ldx   #SlpBreak  SS.Break duration
-         bra   TimedSlp
-HngUpSlp ldx   #SlpHngUp  SS.HngUp duration
-         bra   TimedSlp
-Sleep1   ldx   #1         give up balance of tick
-TimedSlp pshs  cc         save IRQ enable status
-         andcc  #IntMasks  enable IRQs
-         os9   F$Sleep
-         puls  cc,pc      restore IRQ enable status, return
-
-
-SStt     equ   *
-         clrb             default to no error...
-         pshs  cc,b,dp    save IRQ/Carry status, dummy B, system DP
-         lbsr  SetDP      go set our DP
-         ldx   PD.RGS,y
-         cmpa  #SS.HngUp
-         bne   SetBreak
-
-         ifeq  A6552-true
-         lda   #F.DTR     set (disable) DTR bit
-         ldx   <V.PORT
-         orcc  #IntMasks  disable IRQs while setting Format register
-         ora   <Cpy.FR    mask in Format register copy
-         sta   <Cpy.FR    save Format register copy
-         sta   CFReg,x    set new Format register
-         bsr   HngUpSlp   go sleep for a while...
-         lda   #^(F.DTR!F.RTS) clear (enable) DTR and RTS bits
-FRegClr  ldx   <V.PORT
-         anda  <Cpy.FR    mask in Format register copy
-         ldb   <FloCtlRx  get Rx flow control flags
-         bitb  #FCRxDTR   Rx disabled due to DTR?
-         beq   LeaveDTR   no, go leave DTR enabled
-         ora   #F.DTR     set (disable) DTR bit
-LeaveDTR bitb  #FCRxRTS   Rx disabled due to RTS?
-         beq   LeaveRTS   no, go leave RTS enabled
-         ora   #F.RTS     set (disable) RTS bit
-LeaveRTS sta   <Cpy.FR    save Format register copy
-         sta   CFReg,x    set new Format register
-         else  
-
-         ifeq  A6551-true
-         lda   #^Cmd.DTR  cleared (disabled) DTR bit
-         ldx   <V.PORT
-         orcc  #IntMasks  disable IRQs while setting Command register
-         anda  CmdReg,x   mask in current Command register contents
-         sta   CmdReg,x   set new Command register
-         bsr   HngUpSlp   go sleep for a while...
-BreakClr lda   #^(Cmd.TIRB!Cmd.DTR) clear (disable) DTR and RTS control bits
-FRegClr  ldx   <V.PORT
-         anda  CmdReg,x   mask in current Command register
-         ldb   <FloCtlRx  get Rx flow control flags
-         bitb  #FCRxDTR   Rx disabled due to DTR?
-         bne   LeaveDTR   yes, go leave DTR disabled
-         ora   #Cmd.DTR   set (enable) DTR bit
-LeaveDTR bitb  #FCRxRTS   Rx disabled due to RTS?
-         bne   LeaveRTS   yes, go leave RTS disabled
-         ora   #TIRB.RTS  enable RTS output
-LeaveRTS ldb   <FloCtlTx  get Tx flow control flags
-         bitb  #FCTxBrk   currently transmitting line Break?
-         beq   NotTxBrk   no, go leave RTS alone...
-         ora   #TIRB.Brk  set Tx Break bits
-NotTxBrk sta   CmdReg,x   set new Command register
-         endc  
-         endc  
-
-         puls  cc,b,dp,pc restore IRQ/Carry status, dummy B, system DP, return
-
-SetBreak cmpa  #SS.Break  Tx line break?
-         bne   SetSSig
-
-         ifeq  A6552-true
-         ldy   <V.PORT
-         ldd   #FCTxBrk*256+TB.Brk [A]=flow control flag, [B]=Tx break enable
-         orcc  #IntMasks  disable IRQs while messing with flow control flags
-         ora   <FloCtlTx  set Tx break flag bit
-         sta   <FloCtlTx  save Tx flow control flags
-         stb   TBReg,y    start Tx line break
-         bsr   BreakSlp   go sleep for a while...
-         anda  #^FCTxBrk  clear Tx break flag bit
-         sta   <FloCtlTx  save Tx flow control flags
-         clr   TBReg,y    end Tx line break
-         puls  cc,b,dp,pc restore IRQ/Carry status, dummy B, system DP, return
-         else  
-
-         ifeq  A6551-true
-         ldy   <V.PORT
-         ldd   #FCTxBrk*256+TIRB.Brk [A]=flow control flag, [B]=Tx break enable
-         orcc  #IntMasks  disable IRQs while messing with flow control flags
-         ora   <FloCtlTx  set Tx break flag bit
-         sta   <FloCtlTx  save Tx flow control flags
-         orb   CmdReg,y   set Tx line break bits
-         stb   CmdReg,y   start Tx line break
-         bsr   BreakSlp   go sleep for a while...
-         anda  #^FCTxBrk  clear Tx break flag bit
-         sta   <FloCtlTx  save Tx flow control flags
-         bra   BreakClr   go restore RTS output to previous...
-         endc  
-         endc  
-
-SetSSig  cmpa  #SS.SSig
-         bne   SetRelea
-         lda   PD.CPR,y   current process ID
-         ldb   R$X+1,x    LSB of [X] is signal code
-         orcc  #IntMasks  disable IRQs while checking Rx data length
-         ldx   <RxDatLen
-         bne   RSendSig
-         std   <SSigPID
-         puls  cc,b,dp,pc restore IRQ/Carry status, dummy B, system DP, return
-RSendSig puls  cc         restore IRQ/Carry status
-         os9   F$Send
-         puls  a,dp,pc    restore dummy A, system DP, return
-
-SetRelea cmpa  #SS.Relea
-         bne   SetCDSig
-         leax  SSigPID,u  point to Rx data signal process ID
-         bsr   ReleaSig   go release signal...
-         puls  cc,b,dp,pc restore Carry status, dummy B, system DP, return
-
-SetCDSig cmpa  #SS.CDSig  set DCD signal?
-         bne   SetCDRel
-         lda   PD.CPR,y   current process ID
-         ldb   R$X+1,x    LSB of [X] is signal code
-         std   <CDSigPID
-         puls  cc,b,dp,pc restore Carry status, dummy B, system DP, return
-
-SetCDRel cmpa  #SS.CDRel  release DCD signal?
-         bne   SetComSt
-CDRelSig leax  CDSigPID,u point to DCD signal process ID
-         bsr   ReleaSig   go release signal...
-         puls  cc,b,dp,pc restore Carry status, dummy B, system DP, return
-
-SetComSt cmpa  #SS.ComSt
-         bne   SetOpen
-         ldd   R$Y,x      caller's [Y] contains ACIAPAK format type/baud info
-         bsr   SetPort    go save it and set up control/format registers
-ReturnOK puls  cc,b,dp,pc restore Carry status, dummy B, system DP, return
-
-SetOpen  cmpa  #SS.Open
-         bne   SetClose
-         lda   R$Y+1,x    get LSB of caller's [Y]
-         deca             real SS.Open from SCF? (SCF sets LSB of [Y] = 1)
-         bne   ReturnOK   no, go do nothing but return OK...
-
-         ifeq  A6552-true
-         lda   #^(F.DTR!F.RTS) clear (enable) DTR and RTS bits
-         else  
-
-         ifeq  A6551-true
-         lda   #TIRB.RTS  enabled DTR and RTS outputs
-         endc  
-         endc  
-
-         orcc  #IntMasks  disable IRQs while setting Format register
-         lbra  FRegClr    go enable DTR and RTS (if not disabled due to Rx flow control)
-
-SetClose cmpa  #SS.Close
-         lbne  UnSvcErr   no, go report error...
-         lda   R$Y+1,x    real SS.Close from SCF? (SCF sets LSB of [Y] = 0)
-         bne   ReturnOK   no, go do nothing but return OK...
-         leax  SSigPID,u  point to Rx data signal process ID
-         bsr   ReleaSig   go release signal...
-         bra   CDRelSig   go release DCD signal, return from there...
-
-ReleaSig pshs  cc         save IRQ enable status
-         orcc  #IntMasks  disable IRQs while releasing signal
-         lda   PD.CPR,y   get current process ID
-         suba  ,x         same as signal process ID?
-         bne   NoReleas   no, go return...
-         sta   ,x         clear this signal's process ID
-NoReleas puls  cc,pc      restore IRQ enable status, return
-
-         ifeq  A6552-true
-SetPort  pshs  cc         save IRQ enable and Carry status
-         orcc  #IntMasks  disable IRQs while setting up DACIA registers
-         std   <Wrk.Type  save type/baud in data area
-         lsra             *shift parity bits into
-         lsra             *position for 65C52's
-         lsra             *format register
-         anda  #F.Par     clear all except parity bits
-         pshs  a          save parity temporarily
-         comb             translate word length bits to 65C52's word length code
-         andb  #F.DatBit  clear all except word length bits
-         orb   ,s+        mask in parity and clean up stack
-         lda   <Wrk.Baud  get baud information
-         anda  #BaudRate  clear all but baud rate bits
-         leax  BaudTabl,pcr
-         lda   a,x        get baud rate setting
-         pshs  a          save it temporarily
-         lda   <Wrk.Baud  get stop bit(s) information
-         lsra             *shift stop bit into position
-         lsra             *for 65C52's control register
-         anda  #C.StpBit  clear all except stop bit code
-         ora   ,s+        mask in baud rate and clean up stack
-         pshs  d          save stopbits/baudrate and wordlength/parity temporarily
-         ldd   <Cpy.CR    get old control/format register copies
-         anda  #^(C.StpBit!C.Baud) clear stop bit and baud rate code bits
-         ora   ,s+        mask in stop bit(s) and baud rate
-         andb  #^(F.DatBit!F.Par) clear word length and parity code bits
-         orb   ,s+        mask in word length and parity
-         ldx   <V.PORT    get port address
-         std   <Cpy.CR    save control/format register copies
-         sta   CFReg,x    set control register
-         stb   CFReg,x    set format register
-         puls  cc,pc      recover IRQ enable and Carry status, return...
-         else  
-
-         ifeq  A6551-true
-SetPort  pshs  cc         save IRQ enable and Carry status
-         orcc  #IntMasks  disable IRQs while setting up ACIA registers
-         std   <Wrk.Type  save type/baud in data area
-         leax  BaudTabl,pcr
-         andb  #BaudRate  clear all but baud rate bits
-         ldb   b,x        get baud rate setting
-         pshs  b          save it temporarily
-         ldb   <Wrk.Baud  get baud info again
-         andb  #^(Ctl.RxCS!Ctl.Baud) clear clock source + baud rate code bits
-         orb   ,s+        mask in clock source + baud rate and clean up stack
-         ldx   <V.PORT    get port address
-         anda  #Cmd.Par   clear all except parity bits
-         pshs  a          save new command register contents temporarily
-         lda   CmdReg,x   get current command register contents
-         anda  #^Cmd.Par  clear parity control bits
-         ora   ,s+        mask in new parity
-         std   CmdReg,x   set command+control registers
-         puls  cc,pc      recover IRQ enable and Carry status, return...
-         endc  
-         endc  
-
-SetDP    pshs  u          save our data pointer
-         puls  dp         set our DP
-         leas  1,s        clean up stack
-         rts   
-
-AccumErr ora   <V.ERR
-         sta   <V.ERR
-         rts   
-
-
-         ifeq  A6552-true
-IRQSvc   equ   *
-         pshs  dp         save system DP
-         bsr   SetDP      go set our DP
-         ldx   <V.PORT
-         ldb   CSReg,x    get current Control/Status register
-         std   <Cpy.ISR   save ISR (from D.Poll check) and CSR copies
-         bita  #ISE.FOB!ISE.Par FRM/OVR/BRK or Parity error?
-         beq   ChkRDRF    no, go check Rx data
-         tst   DataReg,x  read Rx data register to clear DACIA error flags
-         bitb  #CS.Break  Rx line break?
-         beq   ChkParty   no, go check if parity error...
-         lda   <V.QUIT    default to keyboard quit ("Break") code
-         bra   RxBreak    go pretend we've received V.QUIT character...
-
-ChkParty anda  #ISE.Par   parity error?
-         beq   ChkFrame   no, go check framing error
-         lda   #ParityEr  mark parity error
-ChkFrame bitb  #CS.Frame  framing error?
-         beq   ChkOvRun   no, go check overrun error...
-         ora   #FrmingEr  mark Framing error
-ChkOvRun tsta             any other error flag(s) set?
-         bne   SaveErrs   yes, go save them...
-         ora   #OvrFloEr  must be overrun error, mark it
-SaveErrs bsr   AccumErr   go save accumulated errors...
-         lbra  ChkTrDCD   go check if DCD transition...
-
-ChkRDRF  bita  #ISE.RxF   Rx data?
-         lbeq  ChkTrDCD   no, go check DCD transition
-         lda   DataReg,x  get Rx data
-RxBreak  beq   SavRxDat   its a null, go save it...
-         clr   <SigSent   clear signal sent flag
-         cmpa  <V.INTR    interrupt?
-         bne   Chk.Quit   no, go on...
-         ldb   #S$Intrpt
-         bra   SendSig
-Chk.Quit cmpa  <V.QUIT    abort?
-         bne   Chk.PChr   no, go on...
-         ldb   #S$Abort
-SendSig  pshs  a          save Rx data
-         lda   <V.LPRC    get last process' ID
-         os9   F$Send
-         puls  a          recover Rx data
-         stb   <SigSent   set signal sent flag
-         bra   SavRxDat   go save Rx data...
-Chk.PChr cmpa  <V.PCHR    pause?
-         bne   Chk.Flow   no, go on...
-         ldx   <V.DEV2    attached device defined?
-         beq   SavRxDat   no, go save Rx data...
-         sta   V.PAUS,x   yes, pause attached device
-         bra   SavRxDat   go save Rx data...
-Chk.Flow ldb   <Wrk.Type
-         bitb  #TxSwFlow  Tx data software flow control enabled?
-         beq   SavRxDat   no, go save Rx data...
-         cmpa  <V.XON     XON?
-         bne   Chk.XOff   no, go on...
-         ldb   #^FCTxXOff clear XOFF received bit
-         andb  <FloCtlTx  clear software Tx flow control flag
-         bra   SetTxFlo   go save new Tx flow control flags...
-Chk.XOff cmpa  <V.XOFF    XOFF?
-         bne   SavRxDat   no, go save Rx data...
-         ldb   #FCTxXOff  set XOFF received bit
-         orb   <FloCtlTx  set software Tx flow control flag
-SetTxFlo stb   <FloCtlTx  save new Tx flow control flags
-         lbra  ChkTrDCD   go check DCD transition...
-SavRxDat ldb   <FloCtlRx  get Rx flow control flags
-         andb  #^FCRxSend clear possible pending XOFF flag
-         stb   <FloCtlRx  save Rx flow control flags
-         ldy   <RxBufPut  get Rx buffer input pointer
-         ldx   <RxDatLen  Rx get Rx buffer data length
-         cmpx  <RxBufSiz  Rx buffer already full?
-         blo   NotOvFlo   no, go skip overflow error...
-         lda   #OvrFloEr  mark Rx buffer overflow
-         lbsr  AccumErr   go save accumulated errors...
-         bra   DisRxFlo   go ensure Rx is disabled (if possible)
-NotOvFlo sta   ,y+        save Rx data
-         cmpy  <RxBufEnd  end of Rx buffer?
-         blo   SetLayDn   no, go keep laydown pointer
-         ldy   <RxBufPtr  get Rx buffer start address
-SetLayDn sty   <RxBufPut  set new Rx data laydown pointer
-         leax  1,x        one more byte in Rx buffer
-         stx   <RxDatLen  save new Rx data length
-         cmpx  <RxBufMax  at or past maximum (XOFF) fill point?
-         blo   SgnlRxD    no, go check Rx data signal...
-DisRxFlo lda   <Wrk.XTyp
-         ldb   <Cpy.FR    get Format register copy
-         bita  #ForceDTR  forced DTR?
-         bne   DisRxRTS   yes, go check RTS disable...
-         lda   <Wrk.Type
-         bita  #DSRFlow   DSR/DTR flow control enabled?
-         beq   DisRxRTS   no, go check RTS disable
-         lda   <FloCtlRx  get Rx flow control flags
-         ora   #FCRxDTR   mark Rx disabled by DTR
-         sta   <FloCtlRx  save new Rx flow control flags
-         orb   #F.DTR     set (disable) DTR bit
-DisRxRTS lda   <Wrk.Type
-         bita  #RTSFlow   CTS/RTS flow control enabled?
-         beq   NewRxFlo   no, go set new Rx flow control...
-         lda   <FloCtlRx  get Rx flow control flags
-         ora   #FCRxRTS   mark Rx disabled by RTS
-         sta   <FloCtlRx  save new Rx flow control flags
-         orb   #F.RTS     set (disable) RTS bit
-NewRxFlo ldx   <V.PORT
-         stb   <Cpy.FR    save Format register copy
-         stb   CFReg,x    set/clear DTR and RTS in Format register
-         lda   <Wrk.Type
-         bita  #RxSwFlow  Rx data software flow control enabled?
-         beq   SgnlRxD    no, go check Rx data signal...
-         lda   <V.XOFF    XOFF character defined?
-         beq   SgnlRxD    no, go check Rx data signal...
-         ldb   <FloCtlRx  get Rx flow control flags
-         bitb  #FCRxSent  XOFF already sent?
-         bne   SgnlRxD    yes, go check Rx data signal...
-         orb   #FCRxSend  set send XOFF flag
-         stb   <FloCtlRx  set new Rx flow control flags
-         ldb   <Cpy.CSR   get Control status register copy
-         bitb  #CS.TxE    Tx data register empty?
-         beq   SgnlRxD    no, go skip XOFF this time...
-         sta   DataReg,x  write XOFF character
-         ldb   #FCRxSent  set XOFF sent flag
-         orb   <FloCtlRx  mask in current Rx flow control flags
-         andb  #^FCRxSend clear send XOFF flag
-         stb   <FloCtlRx  save new flow control flags
-SgnlRxD  ldb   <SigSent   already sent abort/interrupt signal?
-         bne   ChkTrDCD   yes, go check DCD transition...
-         lda   <SSigPID   Rx data signal process ID?
-         beq   ChkTrDCD   none, go check DCD transition...
-         ldb   <SSigSig   Rx data signal code
-         clr   <SSigPID   clear Rx data signal
-         os9   F$Send
-
-ChkTrDCD ldd   <Cpy.ISR   get IRQ and Control Status copies
-         bita  #ISE.DCD   DCD transition?
-         beq   CkSuspnd   no, go check for suspended process...
-         bitb  #CS.DCD    DCD disabled now?
-         beq   SgnlDCD    no, go check DCD signal...
-         lda   <Wrk.Type
-         bita  #MdmKill   modem kill enabled?
-         beq   SgnlDCD    no, go on...
-         ldx   <V.PDLHd   path descriptor list header
-         beq   StCDLost   no list, go set DCD lost error...
-         lda   #PST.DCD   DCD lost flag
-PDListLp sta   PD.PST,x   set path status flag
-         ldx   PD.PLP,x   get next path descriptor in list
-         bne   PDListLp   not end of list, go do another...
-StCDLost lda   #DCDLstEr  DCD lost error flag
-         lbsr  AccumErr   go save accumulated errors...
-SgnlDCD  lda   <CDSigPID  get process ID, send a DCD signal?
-         beq   CkSuspnd   no, go check for suspended process...
-         ldb   <CDSigSig  get DCD signal code
-         clr   <CDSigPID  clear DCD signal
-         os9   F$Send
-
-CkSuspnd clrb             clear Carry (for exit) and LSB of process descriptor address
-         lda   <V.WAKE    anybody waiting? ([D]=process descriptor address)
-         beq   IRQExit    no, go return...
-         stb   <V.WAKE    mark I/O done
-         tfr   d,x        copy process descriptor pointer
-         lda   P$State,x  get state flags
-         anda  #^Suspend  clear suspend state
-         sta   P$State,x  save state flags
-IRQExit  puls  dp,pc      recover system DP, return...
-         else  
-
-         ifeq  A6551-true
-IRQSvc   equ   *
-         pshs  dp         save system DP
-         bsr   SetDP      go set our DP
-         ldx   <V.PORT
-         ldb   StatReg,x  get current Status register contents
-         stb   <Cpy.Stat  save Status register copy
-         bitb  #Stat.Err  error(s)?
-         beq   ChkRDRF    no, go check Rx data
-         tst   DataReg,x  read Rx data register to clear ACIA error flags
-         bitb  #Stat.Frm  framing error (assume Rx line Break)?
-         beq   ChkParty   no, go check if parity error...
-         lda   <V.QUIT    default to keyboard quit ("Break") code
-         bra   RxBreak    go pretend we've received V.QUIT character...
-
-ChkParty clra             clear old IRQ status
-         bitb  #Stat.Par  parity error?
-         beq   ChkOvRun   no, go check overrun error...
-         ora   #ParityEr  mark parity error
-ChkOvRun bita  #Stat.Ovr  overrun error?
-         beq   SaveErrs   no, go save errors...
-         ora   #OvrFloEr  mark overrun error
-SaveErrs bsr   AccumErr   go save accumulated errors...
-         lbra  ChkTrDCD   go check if DCD transition...
-
-ChkRDRF  bitb  #Stat.RxF  Rx data?
-         lbeq  ChkTrDCD   no, go check DCD transition
-         lda   DataReg,x  get Rx data
-RxBreak  beq   SavRxDat   its a null, go save it...
-         clr   <SigSent   clear signal sent flag
-         cmpa  <V.INTR    interrupt?
-         bne   Chk.Quit   no, go on...
-         ldb   #S$Intrpt
-         bra   SendSig
-Chk.Quit cmpa  <V.QUIT    abort?
-         bne   Chk.PChr   no, go on...
-         ldb   #S$Abort
-SendSig  pshs  a          save Rx data
-         lda   <V.LPRC    get last process' ID
-         os9   F$Send
-         puls  a          recover Rx data
-         stb   <SigSent   set signal sent flag
-         bra   SavRxDat   go save Rx data...
-Chk.PChr cmpa  <V.PCHR    pause?
-         bne   Chk.Flow   no, go on...
-         ldx   <V.DEV2    attached device defined?
-         beq   SavRxDat   no, go save Rx data...
-         sta   V.PAUS,x   yes, pause attached device
-         bra   SavRxDat   go save Rx data...
-Chk.Flow ldb   <Wrk.Type
-         bitb  #TxSwFlow  Tx data software flow control enabled?
-         beq   SavRxDat   no, go save Rx data...
-         cmpa  <V.XON     XON?
-         bne   Chk.XOff   no, go on...
-         ldb   #^FCTxXOff clear XOFF received bit
-         andb  <FloCtlTx  clear software Tx flow control flag
-         bra   SetTxFlo   go save new Tx flow control flags...
-Chk.XOff cmpa  <V.XOFF    XOFF?
-         bne   SavRxDat   no, go save Rx data...
-         ldb   #FCTxXOff  set XOFF received bit
-         orb   <FloCtlTx  set software Tx flow control flag
-SetTxFlo stb   <FloCtlTx  save new Tx flow control flags
-         lbra  ChkTrDCD   go check DCD transition...
-SavRxDat ldb   <FloCtlRx  get Rx flow control flags
-         andb  #^FCRxSend clear possible pending XOFF flag
-         stb   <FloCtlRx  save Rx flow control flags
-         ldy   <RxBufPut  get Rx buffer input pointer
-         ldx   <RxDatLen  Rx get Rx buffer data length
-         cmpx  <RxBufSiz  Rx buffer already full?
-         blo   NotOvFlo   no, go skip overflow error...
-         lda   #OvrFloEr  mark Rx buffer overflow
-         lbsr  AccumErr   go save accumulated errors...
-         bra   DisRxFlo   go ensure Rx is disabled (if possible)
-NotOvFlo sta   ,y+        save Rx data
-         cmpy  <RxBufEnd  end of Rx buffer?
-         blo   SetLayDn   no, go keep laydown pointer
-         ldy   <RxBufPtr  get Rx buffer start address
-SetLayDn sty   <RxBufPut  set new Rx data laydown pointer
-         leax  1,x        one more byte in Rx buffer
-         stx   <RxDatLen  save new Rx data length
-         cmpx  <RxBufMax  at or past maximum fill point?
-         blo   SgnlRxD    no, go check Rx data signal...
-DisRxFlo ldx   <V.PORT
-         lda   <Wrk.XTyp
-         ldb   CmdReg,x   get current Command register contents
-         bita  #ForceDTR  forced DTR?
-         bne   DisRxRTS   yes, go check RTS disable...
-         lda   <Wrk.Type
-         bita  #DSRFlow   DSR/DTR flow control enabled?
-         beq   DisRxRTS   no, go check RTS disable
-         lda   <FloCtlRx  get Rx flow control flags
-         ora   #FCRxDTR   mark Rx disabled by DTR
-         sta   <FloCtlRx  save new Rx flow control flags
-         andb  #^Cmd.DTR  clear (disable) DTR bit
-DisRxRTS lda   <Wrk.Type
-         bita  #RTSFlow   CTS/RTS flow control enabled?
-         beq   NewRxFlo   no, go set new Rx flow control...
-         lda   <FloCtlTx  get Tx flow control flags
-         bita  #FCTxBrk   currently transmitting line Break?
-         bne   NewRxFlo   yes, go set new Rx flow control...
-         lda   <FloCtlRx  get Rx flow control flags
-         ora   #FCRxRTS   mark Rx disabled by RTS
-         sta   <FloCtlRx  save new Rx flow control flags
-         andb  #^Cmd.TIRB clear Tx IRQ/RTS/Break control bits (disable RTS)
-NewRxFlo stb   CmdReg,x   set/clear DTR and RTS in Command register
-         lda   <Wrk.Type
-         bita  #RxSwFlow  Rx software flow control enabled?
-         beq   SgnlRxD    no, go check Rx data signal...
-         lda   <V.XOFF    XOFF character defined?
-         beq   SgnlRxD    no, go check Rx data signal...
-         ldb   <FloCtlRx  get Rx flow control flags
-         bitb  #FCRxSent  XOFF already sent?
-         bne   SgnlRxD    yes, go check Rx data signal...
-         orb   #FCRxSend  set send XOFF flag
-         stb   <FloCtlRx  set new Rx flow control flags
-         ldb   StatReg,x  get new Status register
-         bitb  #Stat.TxE  Tx data register empty?
-         beq   SgnlRxD    no, go skip XOFF this time...
-         sta   DataReg,x  write XOFF character
-         ldb   #FCRxSent  set XOFF sent flag
-         orb   <FloCtlRx  mask in current Rx flow control flags
-         andb  #^FCRxSend clear send XOFF flag
-         stb   <FloCtlRx  save new flow control flags
-SgnlRxD  ldb   <SigSent   already sent abort/interrupt signal?
-         bne   ChkTrDCD   yes, go check DCD transition...
-         lda   <SSigPID   Rx data signal process ID?
-         beq   ChkTrDCD   none, go check DCD transition...
-         ldb   <SSigSig   Rx data signal code
-         clr   <SSigPID   clear Rx data signal
-         os9   F$Send
-
-ChkTrDCD ldx   <V.PORT
-         lda   <Cpy.Stat  get Status register copy
-         tfr   a,b        copy it...
-         eora  <CpyDCDSR  mark changes from old DSR+DCD status copy
-         andb  #Stat.DSR!Stat.DCD clear all but DSR+DCD status
-         stb   <CpyDCDSR  save new DSR+DCD status copy
-         bita  <Mask.DCD  DCD transition?
-         beq   CkSuspnd   no, go check for suspended process...
-         bitb  <Mask.DCD  DCD disabled now?
-         beq   SgnlDCD    no, go check DCD signal...
-         lda   <Wrk.Type
-         bita  #MdmKill   modem kill enabled?
-         beq   SgnlDCD    no, go on...
-         ldx   <V.PDLHd   path descriptor list header
-         beq   StCDLost   no list, go set DCD lost error...
-         lda   #PST.DCD   DCD lost flag
-PDListLp sta   PD.PST,x   set path status flag
-         ldx   PD.PLP,x   get next path descriptor in list
-         bne   PDListLp   not end of list, go do another...
-StCDLost lda   #DCDLstEr  DCD lost error flag
-         lbsr  AccumErr   go save accumulated errors...
-SgnlDCD  lda   <CDSigPID  get process ID, send a DCD signal?
-         beq   CkSuspnd   no, go check for suspended process...
-         ldb   <CDSigSig  get DCD signal code
-         clr   <CDSigPID  clear DCD signal
-         os9   F$Send
-
-CkSuspnd clrb             clear Carry (for exit) and LSB of process descriptor address
-         lda   <V.WAKE    anybody waiting? ([D]=process descriptor address)
-         beq   IRQExit    no, go return...
-         stb   <V.WAKE    mark I/O done
-         tfr   d,x        copy process descriptor pointer
-         lda   P$State,x  get state flags
-         anda  #^Suspend  clear suspend state
-         sta   P$State,x  save state flags
-IRQExit  puls  dp,pc      recover system DP, return...
-         endc  
-         endc  
-
-
-         emod  
-ModSize  equ   *
-         end   
-