changeset 2872:dbc6d0647ac4

Rename various dw3 files to dw
author Tormod Volden <debian.tormod@gmail.com>
date Sun, 24 Nov 2013 12:07:31 +0100
parents 5f54794048cb
children 46c80d4b0de1
files level1/coco/bootlists/dw.bl level1/coco/bootlists/dw3.bl level1/coco/bootlists/dw3_coco1.bl level1/coco/bootlists/dw_coco1.bl level1/coco/scripts/mb.dw level1/coco/scripts/mb.dw3 level1/coco/scripts/mb.dw3_coco1 level1/coco/scripts/mb.dw_coco1 level1/modules/boot_dw.asm level1/modules/boot_dw3.asm level1/modules/clock2_dw.asm level1/modules/clock2_dw3.asm level1/modules/dw.asm level1/modules/dw3.asm level1/modules/dw3mess.asm level1/modules/dwmess.asm level1/modules/rbdw.asm level1/modules/rbdw3.asm level2/coco3/bootlists/dw.bl level2/coco3/bootlists/dw3.bl level2/coco3/scripts/mb.dw level2/coco3/scripts/mb.dw3 level2/coco3_6309/bootlists/dw.bl level2/coco3_6309/bootlists/dw3.bl level2/coco3_6309/scripts/mb.dw level2/coco3_6309/scripts/mb.dw3
diffstat 26 files changed, 2948 insertions(+), 2948 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/coco/bootlists/dw.bl	Sun Nov 24 12:07:31 2013 +0100
@@ -0,0 +1,191 @@
+***************************************
+* NitrOS-9 Level 1 CoCo Bootlist
+*
+* $Id$
+*
+* This bootlist is presented as an example for creating custom bootfiles.
+* A module may be excluded from the bootfile if an asterisk (*) is the
+* first character of the line.
+*
+***************************************
+* Kernel/System Section
+*
+* These modules are mandatory.
+../MODULES/SYSMODS/ioman
+*
+***************************************
+* CDF Section (HawkSoft)
+*
+*../MODULES/CDF/cdf.mn
+*
+* CDF descriptors - select as needed
+* SCSI descriptors (IDs 0-6)
+*../MODULES/CDF/sc0.dd
+*../MODULES/CDF/sc1.dd
+*../MODULES/CDF/sc2.dd
+*../MODULES/CDF/sc3.dd
+*../MODULES/CDF/sc4.dd
+*../MODULES/CDF/sc5.dd
+*../MODULES/CDF/sc6.dd
+* IDE descriptors (master/slave)
+*../MODULES/CDF/ic0.dd
+*../MODULES/CDF/ic1.dd
+*
+***************************************
+* RBF Section
+*
+../MODULES/RBF/rbf.mn
+*
+* DriveWire 3 RBF driver 
+../MODULES/RBF/rbdw3.dr
+../MODULES/RBF/dw3.sb
+*../MODULES/RBF/dw3_coco1.sb
+* DriveWire descriptors - select as needed
+../MODULES/RBF/ddx0.dd
+*../MODULES/RBF/x0.dd
+../MODULES/RBF/x1.dd
+../MODULES/RBF/x2.dd
+../MODULES/RBF/x3.dd
+*
+* SuperDriver Package
+*../MODULES/RBF/rbsuper.dr
+* Select Low level SCSI and/or IDE driver
+*../MODULES/RBF/lltc3.dr
+*../MODULES/RBF/llide.dr
+* SuperDriver descriptors - select as needed
+* TC^3 SCSI DD Descriptor (ID 0)
+*../MODULES/RBF/dds0_tc3.dd
+* TC^3 SCSI descriptors (IDs 0-6)
+*../MODULES/RBF/s0_tc3.dd
+*../MODULES/RBF/s1_tc3.dd
+*../MODULES/RBF/s2_tc3.dd
+*../MODULES/RBF/s3_tc3.dd
+*../MODULES/RBF/s4_tc3.dd
+*../MODULES/RBF/s5_tc3.dd
+*../MODULES/RBF/s6_tc3.dd
+* TC^3 SCSI HDB-DOS descriptor
+*../MODULES/RBF/sh_tc3.dd
+* IDE DD descriptor (Master)
+*../MODULES/RBF/ddi0_ide.dd
+* IDE descriptors (master/slave)
+*../MODULES/RBF/i0_ide.dd
+*../MODULES/RBF/i1_ide.dd
+* IDE HDB-DOS descriptor
+*../MODULES/RBF/ih_ide.dd
+*
+* WD1773 floppy support for Tandy and compatible disk controllers
+../MODULES/RBF/rb1773.dr
+* WD1773 floppy support for Disto Super Controller II
+*../MODULES/RBF/rb1773_scii_ff74.dr
+*../MODULES/RBF/rb1773_scii_ff58.dr
+* Floppy device descriptors
+* DD - default device - choose one if needed
+*../MODULES/RBF/ddd0_35s.dd
+*../MODULES/RBF/ddd0_40d.dd
+*../MODULES/RBF/ddd0_80d.dd
+* D0 - drive 0 - choose one if needed
+*../MODULES/RBF/d0_35s.dd
+../MODULES/RBF/d0_40d.dd
+*../MODULES/RBF/d0_80d.dd
+* D1 - drive 1 - choose one if needed
+*../MODULES/RBF/d1_35s.dd
+../MODULES/RBF/d1_40d.dd
+*../MODULES/RBF/d1_80d.dd
+* D2 - drive 2 - choose one if needed
+*../MODULES/RBF/d2_35s.dd
+../MODULES/RBF/d2_40d.dd
+*../MODULES/RBF/d2_80d.dd
+* D3 - drive 3 - choose if needed
+*../MODULES/RBF/d3_35s.dd
+***************************************
+* SCF Section
+*
+../MODULES/SCF/scf.mn
+*
+* Video Terminal I/O driver and subroutine modules
+../MODULES/SCF/vtio.dr
+* Choose from CoVDG (32x16 VDG) or CoHR (Hi-Res 51x24 graphics screen)
+../MODULES/SCF/covdg.io
+*../MODULES/SCF/cohr.io
+*
+* Select only one term descriptor
+../MODULES/SCF/term32.dt
+*../MODULES/SCF/term51.dt
+*../MODULES/SCF/term_scbbt.dt
+*../MODULES/SCF/term_sc6551.dt
+*
+* Serial port drivers
+* CoCo Bit-Banger terminal port
+*../MODULES/SCF/scbbt.dr
+*../MODULES/SCF/t1_scbbt.dd
+* 6551 ACIA
+*../MODULES/SCF/sc6551.dr
+*../MODULES/SCF/t2_sc6551.dd
+*../MODULES/SCF/t3_sc6551.dd
+*
+* Printer drivers
+* ../MODULES/SCF/scbbp.dr
+* ../MODULES/SCF/p_scbbp.dd
+*
+* DriveWire 3 Printer drivers
+* ../MODULES/SCF/scdwp.dr
+* ../MODULES/SCF/p_scdwp.dd
+*
+* DriveWire Networking
+*../MODULES/SCF/scdwn.dr
+*../MODULES/SCF/term_scdwn.dt
+*../MODULES/SCF/n_scdwn.dd
+*../MODULES/SCF/n1_scdwn.dd
+*../MODULES/SCF/n2_scdwn.dd
+*../MODULES/SCF/n3_scdwn.dd
+*../MODULES/SCF/n4_scdwn.dd
+*../MODULES/SCF/n5_scdwn.dd
+*../MODULES/SCF/n6_scdwn.dd
+*../MODULES/SCF/n7_scdwn.dd
+*../MODULES/SCF/n8_scdwn.dd
+*../MODULES/SCF/n9_scdwn.dd
+*../MODULES/SCF/n10_scdwn.dd
+*../MODULES/SCF/n11_scdwn.dd
+*../MODULES/SCF/n12_scdwn.dd
+*../MODULES/SCF/n13_scdwn.dd
+*../MODULES/SCF/n14_scdwn.dd
+*
+***************************************
+* Pipe Section
+*
+* Pipes are a useful but optional part of a system.
+../MODULES/PIPE/pipeman.mn
+../MODULES/PIPE/piper.dr
+../MODULES/PIPE/pipe.dd
+*
+***************************************
+* Clock Section
+*
+* Select one clock module depending upon your power line frequency
+* (60Hz = USA/Canada; 50Hz = Europe, Australia)
+../MODULES/CLOCKS/clock_60hz
+*../MODULES/CLOCKS/clock_50hz
+* Select one clock2 module that supports your real-time clock, if any.
+* Besides support for the internal software clock, the following
+* hardware clocks are supported: Burke & Burke, Disto 2-N-1, Disto 4-N-1,
+* Eliminator, Harris, SmartWatch, Cloud-9, the MESS emulator, Jeff
+* Vavasour's CoCo emulator, and DriveWire.
+*../MODULES/CLOCKS/clock2_soft
+*../MODULES/CLOCKS/clock2_bnb
+*../MODULES/CLOCKS/clock2_disto2
+*../MODULES/CLOCKS/clock2_disto4
+*../MODULES/CLOCKS/clock2_elim
+*../MODULES/CLOCKS/clock2_harris
+*../MODULES/CLOCKS/clock2_smart
+*../MODULES/CLOCKS/clock2_jvemu
+*../MODULES/CLOCKS/clock2_messemu
+*../MODULES/CLOCKS/clock2_cloud9
+../MODULES/CLOCKS/clock2_dw3
+* 
+***************************************
+* System Kick-Start Module
+*
+* Choose which startup module you wish to use. (sysgo_dd is recommended
+* for most configurations.)
+../MODULES/SYSMODS/sysgo_dd
+*../MODULES/SYSMODS/sysgo_h0
--- a/level1/coco/bootlists/dw3.bl	Sun Nov 24 11:45:32 2013 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,191 +0,0 @@
-***************************************
-* NitrOS-9 Level 1 CoCo Bootlist
-*
-* $Id$
-*
-* This bootlist is presented as an example for creating custom bootfiles.
-* A module may be excluded from the bootfile if an asterisk (*) is the
-* first character of the line.
-*
-***************************************
-* Kernel/System Section
-*
-* These modules are mandatory.
-../MODULES/SYSMODS/ioman
-*
-***************************************
-* CDF Section (HawkSoft)
-*
-*../MODULES/CDF/cdf.mn
-*
-* CDF descriptors - select as needed
-* SCSI descriptors (IDs 0-6)
-*../MODULES/CDF/sc0.dd
-*../MODULES/CDF/sc1.dd
-*../MODULES/CDF/sc2.dd
-*../MODULES/CDF/sc3.dd
-*../MODULES/CDF/sc4.dd
-*../MODULES/CDF/sc5.dd
-*../MODULES/CDF/sc6.dd
-* IDE descriptors (master/slave)
-*../MODULES/CDF/ic0.dd
-*../MODULES/CDF/ic1.dd
-*
-***************************************
-* RBF Section
-*
-../MODULES/RBF/rbf.mn
-*
-* DriveWire 3 RBF driver 
-../MODULES/RBF/rbdw3.dr
-../MODULES/RBF/dw3.sb
-*../MODULES/RBF/dw3_coco1.sb
-* DriveWire descriptors - select as needed
-../MODULES/RBF/ddx0.dd
-*../MODULES/RBF/x0.dd
-../MODULES/RBF/x1.dd
-../MODULES/RBF/x2.dd
-../MODULES/RBF/x3.dd
-*
-* SuperDriver Package
-*../MODULES/RBF/rbsuper.dr
-* Select Low level SCSI and/or IDE driver
-*../MODULES/RBF/lltc3.dr
-*../MODULES/RBF/llide.dr
-* SuperDriver descriptors - select as needed
-* TC^3 SCSI DD Descriptor (ID 0)
-*../MODULES/RBF/dds0_tc3.dd
-* TC^3 SCSI descriptors (IDs 0-6)
-*../MODULES/RBF/s0_tc3.dd
-*../MODULES/RBF/s1_tc3.dd
-*../MODULES/RBF/s2_tc3.dd
-*../MODULES/RBF/s3_tc3.dd
-*../MODULES/RBF/s4_tc3.dd
-*../MODULES/RBF/s5_tc3.dd
-*../MODULES/RBF/s6_tc3.dd
-* TC^3 SCSI HDB-DOS descriptor
-*../MODULES/RBF/sh_tc3.dd
-* IDE DD descriptor (Master)
-*../MODULES/RBF/ddi0_ide.dd
-* IDE descriptors (master/slave)
-*../MODULES/RBF/i0_ide.dd
-*../MODULES/RBF/i1_ide.dd
-* IDE HDB-DOS descriptor
-*../MODULES/RBF/ih_ide.dd
-*
-* WD1773 floppy support for Tandy and compatible disk controllers
-../MODULES/RBF/rb1773.dr
-* WD1773 floppy support for Disto Super Controller II
-*../MODULES/RBF/rb1773_scii_ff74.dr
-*../MODULES/RBF/rb1773_scii_ff58.dr
-* Floppy device descriptors
-* DD - default device - choose one if needed
-*../MODULES/RBF/ddd0_35s.dd
-*../MODULES/RBF/ddd0_40d.dd
-*../MODULES/RBF/ddd0_80d.dd
-* D0 - drive 0 - choose one if needed
-*../MODULES/RBF/d0_35s.dd
-../MODULES/RBF/d0_40d.dd
-*../MODULES/RBF/d0_80d.dd
-* D1 - drive 1 - choose one if needed
-*../MODULES/RBF/d1_35s.dd
-../MODULES/RBF/d1_40d.dd
-*../MODULES/RBF/d1_80d.dd
-* D2 - drive 2 - choose one if needed
-*../MODULES/RBF/d2_35s.dd
-../MODULES/RBF/d2_40d.dd
-*../MODULES/RBF/d2_80d.dd
-* D3 - drive 3 - choose if needed
-*../MODULES/RBF/d3_35s.dd
-***************************************
-* SCF Section
-*
-../MODULES/SCF/scf.mn
-*
-* Video Terminal I/O driver and subroutine modules
-../MODULES/SCF/vtio.dr
-* Choose from CoVDG (32x16 VDG) or CoHR (Hi-Res 51x24 graphics screen)
-../MODULES/SCF/covdg.io
-*../MODULES/SCF/cohr.io
-*
-* Select only one term descriptor
-../MODULES/SCF/term32.dt
-*../MODULES/SCF/term51.dt
-*../MODULES/SCF/term_scbbt.dt
-*../MODULES/SCF/term_sc6551.dt
-*
-* Serial port drivers
-* CoCo Bit-Banger terminal port
-*../MODULES/SCF/scbbt.dr
-*../MODULES/SCF/t1_scbbt.dd
-* 6551 ACIA
-*../MODULES/SCF/sc6551.dr
-*../MODULES/SCF/t2_sc6551.dd
-*../MODULES/SCF/t3_sc6551.dd
-*
-* Printer drivers
-* ../MODULES/SCF/scbbp.dr
-* ../MODULES/SCF/p_scbbp.dd
-*
-* DriveWire 3 Printer drivers
-* ../MODULES/SCF/scdwp.dr
-* ../MODULES/SCF/p_scdwp.dd
-*
-* DriveWire Networking
-*../MODULES/SCF/scdwn.dr
-*../MODULES/SCF/term_scdwn.dt
-*../MODULES/SCF/n_scdwn.dd
-*../MODULES/SCF/n1_scdwn.dd
-*../MODULES/SCF/n2_scdwn.dd
-*../MODULES/SCF/n3_scdwn.dd
-*../MODULES/SCF/n4_scdwn.dd
-*../MODULES/SCF/n5_scdwn.dd
-*../MODULES/SCF/n6_scdwn.dd
-*../MODULES/SCF/n7_scdwn.dd
-*../MODULES/SCF/n8_scdwn.dd
-*../MODULES/SCF/n9_scdwn.dd
-*../MODULES/SCF/n10_scdwn.dd
-*../MODULES/SCF/n11_scdwn.dd
-*../MODULES/SCF/n12_scdwn.dd
-*../MODULES/SCF/n13_scdwn.dd
-*../MODULES/SCF/n14_scdwn.dd
-*
-***************************************
-* Pipe Section
-*
-* Pipes are a useful but optional part of a system.
-../MODULES/PIPE/pipeman.mn
-../MODULES/PIPE/piper.dr
-../MODULES/PIPE/pipe.dd
-*
-***************************************
-* Clock Section
-*
-* Select one clock module depending upon your power line frequency
-* (60Hz = USA/Canada; 50Hz = Europe, Australia)
-../MODULES/CLOCKS/clock_60hz
-*../MODULES/CLOCKS/clock_50hz
-* Select one clock2 module that supports your real-time clock, if any.
-* Besides support for the internal software clock, the following
-* hardware clocks are supported: Burke & Burke, Disto 2-N-1, Disto 4-N-1,
-* Eliminator, Harris, SmartWatch, Cloud-9, the MESS emulator, Jeff
-* Vavasour's CoCo emulator, and DriveWire.
-*../MODULES/CLOCKS/clock2_soft
-*../MODULES/CLOCKS/clock2_bnb
-*../MODULES/CLOCKS/clock2_disto2
-*../MODULES/CLOCKS/clock2_disto4
-*../MODULES/CLOCKS/clock2_elim
-*../MODULES/CLOCKS/clock2_harris
-*../MODULES/CLOCKS/clock2_smart
-*../MODULES/CLOCKS/clock2_jvemu
-*../MODULES/CLOCKS/clock2_messemu
-*../MODULES/CLOCKS/clock2_cloud9
-../MODULES/CLOCKS/clock2_dw3
-* 
-***************************************
-* System Kick-Start Module
-*
-* Choose which startup module you wish to use. (sysgo_dd is recommended
-* for most configurations.)
-../MODULES/SYSMODS/sysgo_dd
-*../MODULES/SYSMODS/sysgo_h0
--- a/level1/coco/bootlists/dw3_coco1.bl	Sun Nov 24 11:45:32 2013 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,191 +0,0 @@
-***************************************
-* NitrOS-9 Level 1 CoCo Bootlist
-*
-* $Id$
-*
-* This bootlist is presented as an example for creating custom bootfiles.
-* A module may be excluded from the bootfile if an asterisk (*) is the
-* first character of the line.
-*
-***************************************
-* Kernel/System Section
-*
-* These modules are mandatory.
-../MODULES/SYSMODS/ioman
-*
-***************************************
-* CDF Section (HawkSoft)
-*
-*../MODULES/CDF/cdf.mn
-*
-* CDF descriptors - select as needed
-* SCSI descriptors (IDs 0-6)
-*../MODULES/CDF/sc0.dd
-*../MODULES/CDF/sc1.dd
-*../MODULES/CDF/sc2.dd
-*../MODULES/CDF/sc3.dd
-*../MODULES/CDF/sc4.dd
-*../MODULES/CDF/sc5.dd
-*../MODULES/CDF/sc6.dd
-* IDE descriptors (master/slave)
-*../MODULES/CDF/ic0.dd
-*../MODULES/CDF/ic1.dd
-*
-***************************************
-* RBF Section
-*
-../MODULES/RBF/rbf.mn
-*
-* DriveWire 3 RBF driver 
-../MODULES/RBF/rbdw3.dr
-*../MODULES/RBF/dw3.sb
-../MODULES/RBF/dw3_coco1.sb
-* DriveWire descriptors - select as needed
-../MODULES/RBF/ddx0.dd
-*../MODULES/RBF/x0.dd
-../MODULES/RBF/x1.dd
-../MODULES/RBF/x2.dd
-../MODULES/RBF/x3.dd
-*
-* SuperDriver Package
-*../MODULES/RBF/rbsuper.dr
-* Select Low level SCSI and/or IDE driver
-*../MODULES/RBF/lltc3.dr
-*../MODULES/RBF/llide.dr
-* SuperDriver descriptors - select as needed
-* TC^3 SCSI DD Descriptor (ID 0)
-*../MODULES/RBF/dds0_tc3.dd
-* TC^3 SCSI descriptors (IDs 0-6)
-*../MODULES/RBF/s0_tc3.dd
-*../MODULES/RBF/s1_tc3.dd
-*../MODULES/RBF/s2_tc3.dd
-*../MODULES/RBF/s3_tc3.dd
-*../MODULES/RBF/s4_tc3.dd
-*../MODULES/RBF/s5_tc3.dd
-*../MODULES/RBF/s6_tc3.dd
-* TC^3 SCSI HDB-DOS descriptor
-*../MODULES/RBF/sh_tc3.dd
-* IDE DD descriptor (Master)
-*../MODULES/RBF/ddi0_ide.dd
-* IDE descriptors (master/slave)
-*../MODULES/RBF/i0_ide.dd
-*../MODULES/RBF/i1_ide.dd
-* IDE HDB-DOS descriptor
-*../MODULES/RBF/ih_ide.dd
-*
-* WD1773 floppy support for Tandy and compatible disk controllers
-../MODULES/RBF/rb1773.dr
-* WD1773 floppy support for Disto Super Controller II
-*../MODULES/RBF/rb1773_scii_ff74.dr
-*../MODULES/RBF/rb1773_scii_ff58.dr
-* Floppy device descriptors
-* DD - default device - choose one if needed
-*../MODULES/RBF/ddd0_35s.dd
-*../MODULES/RBF/ddd0_40d.dd
-*../MODULES/RBF/ddd0_80d.dd
-* D0 - drive 0 - choose one if needed
-*../MODULES/RBF/d0_35s.dd
-../MODULES/RBF/d0_40d.dd
-*../MODULES/RBF/d0_80d.dd
-* D1 - drive 1 - choose one if needed
-*../MODULES/RBF/d1_35s.dd
-../MODULES/RBF/d1_40d.dd
-*../MODULES/RBF/d1_80d.dd
-* D2 - drive 2 - choose one if needed
-*../MODULES/RBF/d2_35s.dd
-../MODULES/RBF/d2_40d.dd
-*../MODULES/RBF/d2_80d.dd
-* D3 - drive 3 - choose if needed
-*../MODULES/RBF/d3_35s.dd
-***************************************
-* SCF Section
-*
-../MODULES/SCF/scf.mn
-*
-* Video Terminal I/O driver and subroutine modules
-../MODULES/SCF/vtio.dr
-* Choose from CoVDG (32x16 VDG) or CoHR (Hi-Res 51x24 graphics screen)
-../MODULES/SCF/covdg.io
-*../MODULES/SCF/cohr.io
-*
-* Select only one term descriptor
-../MODULES/SCF/term32.dt
-*../MODULES/SCF/term51.dt
-*../MODULES/SCF/term_scbbt.dt
-*../MODULES/SCF/term_sc6551.dt
-*
-* Serial port drivers
-* CoCo Bit-Banger terminal port
-*../MODULES/SCF/scbbt.dr
-*../MODULES/SCF/t1_scbbt.dd
-* 6551 ACIA
-*../MODULES/SCF/sc6551.dr
-*../MODULES/SCF/t2_sc6551.dd
-*../MODULES/SCF/t3_sc6551.dd
-*
-* Printer drivers
-* ../MODULES/SCF/scbbp.dr
-* ../MODULES/SCF/p_scbbp.dd
-*
-* DriveWire 3 Printer drivers
-* ../MODULES/SCF/scdwp.dr
-* ../MODULES/SCF/p_scdwp.dd
-*
-* DriveWire Networking
-*../MODULES/SCF/scdwn.dr
-*../MODULES/SCF/term_scdwn.dt
-*../MODULES/SCF/n_scdwn.dd
-*../MODULES/SCF/n1_scdwn.dd
-*../MODULES/SCF/n2_scdwn.dd
-*../MODULES/SCF/n3_scdwn.dd
-*../MODULES/SCF/n4_scdwn.dd
-*../MODULES/SCF/n5_scdwn.dd
-*../MODULES/SCF/n6_scdwn.dd
-*../MODULES/SCF/n7_scdwn.dd
-*../MODULES/SCF/n8_scdwn.dd
-*../MODULES/SCF/n9_scdwn.dd
-*../MODULES/SCF/n10_scdwn.dd
-*../MODULES/SCF/n11_scdwn.dd
-*../MODULES/SCF/n12_scdwn.dd
-*../MODULES/SCF/n13_scdwn.dd
-*../MODULES/SCF/n14_scdwn.dd
-*
-***************************************
-* Pipe Section
-*
-* Pipes are a useful but optional part of a system.
-../MODULES/PIPE/pipeman.mn
-../MODULES/PIPE/piper.dr
-../MODULES/PIPE/pipe.dd
-*
-***************************************
-* Clock Section
-*
-* Select one clock module depending upon your power line frequency
-* (60Hz = USA/Canada; 50Hz = Europe, Australia)
-../MODULES/CLOCKS/clock_60hz
-*../MODULES/CLOCKS/clock_50hz
-* Select one clock2 module that supports your real-time clock, if any.
-* Besides support for the internal software clock, the following
-* hardware clocks are supported: Burke & Burke, Disto 2-N-1, Disto 4-N-1,
-* Eliminator, Harris, SmartWatch, Cloud-9, the MESS emulator, Jeff
-* Vavasour's CoCo emulator, and DriveWire.
-*../MODULES/CLOCKS/clock2_soft
-*../MODULES/CLOCKS/clock2_bnb
-*../MODULES/CLOCKS/clock2_disto2
-*../MODULES/CLOCKS/clock2_disto4
-*../MODULES/CLOCKS/clock2_elim
-*../MODULES/CLOCKS/clock2_harris
-*../MODULES/CLOCKS/clock2_smart
-*../MODULES/CLOCKS/clock2_jvemu
-*../MODULES/CLOCKS/clock2_messemu
-*../MODULES/CLOCKS/clock2_cloud9
-../MODULES/CLOCKS/clock2_dw3
-* 
-***************************************
-* System Kick-Start Module
-*
-* Choose which startup module you wish to use. (sysgo_dd is recommended
-* for most configurations.)
-../MODULES/SYSMODS/sysgo_dd
-*../MODULES/SYSMODS/sysgo_h0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/coco/bootlists/dw_coco1.bl	Sun Nov 24 12:07:31 2013 +0100
@@ -0,0 +1,191 @@
+***************************************
+* NitrOS-9 Level 1 CoCo Bootlist
+*
+* $Id$
+*
+* This bootlist is presented as an example for creating custom bootfiles.
+* A module may be excluded from the bootfile if an asterisk (*) is the
+* first character of the line.
+*
+***************************************
+* Kernel/System Section
+*
+* These modules are mandatory.
+../MODULES/SYSMODS/ioman
+*
+***************************************
+* CDF Section (HawkSoft)
+*
+*../MODULES/CDF/cdf.mn
+*
+* CDF descriptors - select as needed
+* SCSI descriptors (IDs 0-6)
+*../MODULES/CDF/sc0.dd
+*../MODULES/CDF/sc1.dd
+*../MODULES/CDF/sc2.dd
+*../MODULES/CDF/sc3.dd
+*../MODULES/CDF/sc4.dd
+*../MODULES/CDF/sc5.dd
+*../MODULES/CDF/sc6.dd
+* IDE descriptors (master/slave)
+*../MODULES/CDF/ic0.dd
+*../MODULES/CDF/ic1.dd
+*
+***************************************
+* RBF Section
+*
+../MODULES/RBF/rbf.mn
+*
+* DriveWire 3 RBF driver 
+../MODULES/RBF/rbdw3.dr
+*../MODULES/RBF/dw3.sb
+../MODULES/RBF/dw3_coco1.sb
+* DriveWire descriptors - select as needed
+../MODULES/RBF/ddx0.dd
+*../MODULES/RBF/x0.dd
+../MODULES/RBF/x1.dd
+../MODULES/RBF/x2.dd
+../MODULES/RBF/x3.dd
+*
+* SuperDriver Package
+*../MODULES/RBF/rbsuper.dr
+* Select Low level SCSI and/or IDE driver
+*../MODULES/RBF/lltc3.dr
+*../MODULES/RBF/llide.dr
+* SuperDriver descriptors - select as needed
+* TC^3 SCSI DD Descriptor (ID 0)
+*../MODULES/RBF/dds0_tc3.dd
+* TC^3 SCSI descriptors (IDs 0-6)
+*../MODULES/RBF/s0_tc3.dd
+*../MODULES/RBF/s1_tc3.dd
+*../MODULES/RBF/s2_tc3.dd
+*../MODULES/RBF/s3_tc3.dd
+*../MODULES/RBF/s4_tc3.dd
+*../MODULES/RBF/s5_tc3.dd
+*../MODULES/RBF/s6_tc3.dd
+* TC^3 SCSI HDB-DOS descriptor
+*../MODULES/RBF/sh_tc3.dd
+* IDE DD descriptor (Master)
+*../MODULES/RBF/ddi0_ide.dd
+* IDE descriptors (master/slave)
+*../MODULES/RBF/i0_ide.dd
+*../MODULES/RBF/i1_ide.dd
+* IDE HDB-DOS descriptor
+*../MODULES/RBF/ih_ide.dd
+*
+* WD1773 floppy support for Tandy and compatible disk controllers
+../MODULES/RBF/rb1773.dr
+* WD1773 floppy support for Disto Super Controller II
+*../MODULES/RBF/rb1773_scii_ff74.dr
+*../MODULES/RBF/rb1773_scii_ff58.dr
+* Floppy device descriptors
+* DD - default device - choose one if needed
+*../MODULES/RBF/ddd0_35s.dd
+*../MODULES/RBF/ddd0_40d.dd
+*../MODULES/RBF/ddd0_80d.dd
+* D0 - drive 0 - choose one if needed
+*../MODULES/RBF/d0_35s.dd
+../MODULES/RBF/d0_40d.dd
+*../MODULES/RBF/d0_80d.dd
+* D1 - drive 1 - choose one if needed
+*../MODULES/RBF/d1_35s.dd
+../MODULES/RBF/d1_40d.dd
+*../MODULES/RBF/d1_80d.dd
+* D2 - drive 2 - choose one if needed
+*../MODULES/RBF/d2_35s.dd
+../MODULES/RBF/d2_40d.dd
+*../MODULES/RBF/d2_80d.dd
+* D3 - drive 3 - choose if needed
+*../MODULES/RBF/d3_35s.dd
+***************************************
+* SCF Section
+*
+../MODULES/SCF/scf.mn
+*
+* Video Terminal I/O driver and subroutine modules
+../MODULES/SCF/vtio.dr
+* Choose from CoVDG (32x16 VDG) or CoHR (Hi-Res 51x24 graphics screen)
+../MODULES/SCF/covdg.io
+*../MODULES/SCF/cohr.io
+*
+* Select only one term descriptor
+../MODULES/SCF/term32.dt
+*../MODULES/SCF/term51.dt
+*../MODULES/SCF/term_scbbt.dt
+*../MODULES/SCF/term_sc6551.dt
+*
+* Serial port drivers
+* CoCo Bit-Banger terminal port
+*../MODULES/SCF/scbbt.dr
+*../MODULES/SCF/t1_scbbt.dd
+* 6551 ACIA
+*../MODULES/SCF/sc6551.dr
+*../MODULES/SCF/t2_sc6551.dd
+*../MODULES/SCF/t3_sc6551.dd
+*
+* Printer drivers
+* ../MODULES/SCF/scbbp.dr
+* ../MODULES/SCF/p_scbbp.dd
+*
+* DriveWire 3 Printer drivers
+* ../MODULES/SCF/scdwp.dr
+* ../MODULES/SCF/p_scdwp.dd
+*
+* DriveWire Networking
+*../MODULES/SCF/scdwn.dr
+*../MODULES/SCF/term_scdwn.dt
+*../MODULES/SCF/n_scdwn.dd
+*../MODULES/SCF/n1_scdwn.dd
+*../MODULES/SCF/n2_scdwn.dd
+*../MODULES/SCF/n3_scdwn.dd
+*../MODULES/SCF/n4_scdwn.dd
+*../MODULES/SCF/n5_scdwn.dd
+*../MODULES/SCF/n6_scdwn.dd
+*../MODULES/SCF/n7_scdwn.dd
+*../MODULES/SCF/n8_scdwn.dd
+*../MODULES/SCF/n9_scdwn.dd
+*../MODULES/SCF/n10_scdwn.dd
+*../MODULES/SCF/n11_scdwn.dd
+*../MODULES/SCF/n12_scdwn.dd
+*../MODULES/SCF/n13_scdwn.dd
+*../MODULES/SCF/n14_scdwn.dd
+*
+***************************************
+* Pipe Section
+*
+* Pipes are a useful but optional part of a system.
+../MODULES/PIPE/pipeman.mn
+../MODULES/PIPE/piper.dr
+../MODULES/PIPE/pipe.dd
+*
+***************************************
+* Clock Section
+*
+* Select one clock module depending upon your power line frequency
+* (60Hz = USA/Canada; 50Hz = Europe, Australia)
+../MODULES/CLOCKS/clock_60hz
+*../MODULES/CLOCKS/clock_50hz
+* Select one clock2 module that supports your real-time clock, if any.
+* Besides support for the internal software clock, the following
+* hardware clocks are supported: Burke & Burke, Disto 2-N-1, Disto 4-N-1,
+* Eliminator, Harris, SmartWatch, Cloud-9, the MESS emulator, Jeff
+* Vavasour's CoCo emulator, and DriveWire.
+*../MODULES/CLOCKS/clock2_soft
+*../MODULES/CLOCKS/clock2_bnb
+*../MODULES/CLOCKS/clock2_disto2
+*../MODULES/CLOCKS/clock2_disto4
+*../MODULES/CLOCKS/clock2_elim
+*../MODULES/CLOCKS/clock2_harris
+*../MODULES/CLOCKS/clock2_smart
+*../MODULES/CLOCKS/clock2_jvemu
+*../MODULES/CLOCKS/clock2_messemu
+*../MODULES/CLOCKS/clock2_cloud9
+../MODULES/CLOCKS/clock2_dw3
+* 
+***************************************
+* System Kick-Start Module
+*
+* Choose which startup module you wish to use. (sysgo_dd is recommended
+* for most configurations.)
+../MODULES/SYSMODS/sysgo_dd
+*../MODULES/SYSMODS/sysgo_h0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/coco/scripts/mb.dw	Sun Nov 24 12:07:31 2013 +0100
@@ -0,0 +1,30 @@
+-t
+-x
+tmode .1 pau=0
+echo * NitrOS-9 Level 1 Boot Creation Script
+echo *
+echo * This script creates a bootable DriveWire 3 disk image
+echo * using the dw.bl bootlist file.
+echo *
+echo * The resulting disk will boot NitrOS-9 from DriveWire drive 0.
+echo *
+prompt Insert a blank disk in /x1 and press a key:
+echo *
+echo * Step 1: Format disk in /x1
+format /x1 "NitrOS-9 Level 1 Boot Disk" r
+ynn
+echo *
+echo * Step 2: Create a custom boot track
+del bttemp
+merge ../MODULES/BOOTTRACK/rel ../MODULES/KERNEL/krn ../MODULES/KERNEL/krnp2 ../MODULES/SYSMODS/init ../MODULES/BOOTTRACK/boot_dw>bttemp
+echo *
+echo * Step 3: Create the bootfile and boot track
+os9gen /x1 -t=bttemp<../BOOTLISTS/dw.bl
+del bttemp
+echo *
+echo * Step 4: Populate the disk with essential files
+copy ../MODULES/SYSMODS/sysgo_dd /x1/sysgo
+makdir /x1/CMDS
+copy -w=/x1/CMDS ../CMDS/shell
+echo *
+echo * We're done
--- a/level1/coco/scripts/mb.dw3	Sun Nov 24 11:45:32 2013 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
--t
--x
-tmode .1 pau=0
-echo * NitrOS-9 Level 1 Boot Creation Script
-echo *
-echo * This script creates a bootable DriveWire 3 disk image
-echo * using the dw3.bl bootlist file.
-echo *
-echo * The resulting disk will boot NitrOS-9 from DriveWire drive 0.
-echo *
-prompt Insert a blank disk in /x1 and press a key:
-echo *
-echo * Step 1: Format disk in /x1
-format /x1 "NitrOS-9 Level 1 Boot Disk" r
-ynn
-echo *
-echo * Step 2: Create a custom boot track
-del bttemp
-merge ../MODULES/BOOTTRACK/rel ../MODULES/KERNEL/krn ../MODULES/KERNEL/krnp2 ../MODULES/SYSMODS/init ../MODULES/BOOTTRACK/boot_dw3>bttemp
-echo *
-echo * Step 3: Create the bootfile and boot track
-os9gen /x1 -t=bttemp<../BOOTLISTS/dw3.bl
-del bttemp
-echo *
-echo * Step 4: Populate the disk with essential files
-copy ../MODULES/SYSMODS/sysgo_dd /x1/sysgo
-makdir /x1/CMDS
-copy -w=/x1/CMDS ../CMDS/shell
-echo *
-echo * We're done
--- a/level1/coco/scripts/mb.dw3_coco1	Sun Nov 24 11:45:32 2013 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
--t
--x
-tmode .1 pau=0
-echo * NitrOS-9 Level 1 Boot Creation Script
-echo *
-echo * This script creates a bootable DriveWire 3 disk image
-echo * using the dw3_coco1.bl bootlist file.
-echo *
-echo * The resulting disk will boot NitrOS-9 from DriveWire disk 0.
-echo *
-echo "Please type the destination device (e.g. /x0, /x1)"
-var.1
-prompt Insert a blank disk in %1 and press a key:
-echo *
-echo * Step 1: Format disk in %1
-format %1 "NitrOS-9 Level 1 Boot Disk" r
-echo *
-echo * Step 2: Create a custom boot track
-merge ../MODULES/BOOTTRACK/rel ../MODULES/KERNEL/krn ../MODULES/KERNEL/krnp2 ../MODULES/SYSMODS/init ../MODULES/BOOTTRACK/boot_dw3_coco1>-bttemp
-echo *
-echo * Step 3: Create the bootfile and boot track
-os9gen %1 -t=bttemp<../BOOTLISTS/dw3_coco1.bl
-del bttemp
-echo *
-echo * Step 4: Populate the disk with essential files
-copy ../MODULES/SYSMODS/sysgo_dd %1/sysgo
-makdir %1/CMDS
-copy -w=%1/CMDS ../CMDS/shell
-echo *
-echo * We're done
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/coco/scripts/mb.dw_coco1	Sun Nov 24 12:07:31 2013 +0100
@@ -0,0 +1,30 @@
+-t
+-x
+tmode .1 pau=0
+echo * NitrOS-9 Level 1 Boot Creation Script
+echo *
+echo * This script creates a bootable DriveWire 3 disk image
+echo * using the dw_coco1.bl bootlist file.
+echo *
+echo * The resulting disk will boot NitrOS-9 from DriveWire disk 0.
+echo *
+echo "Please type the destination device (e.g. /x0, /x1)"
+var.1
+prompt Insert a blank disk in %1 and press a key:
+echo *
+echo * Step 1: Format disk in %1
+format %1 "NitrOS-9 Level 1 Boot Disk" r
+echo *
+echo * Step 2: Create a custom boot track
+merge ../MODULES/BOOTTRACK/rel ../MODULES/KERNEL/krn ../MODULES/KERNEL/krnp2 ../MODULES/SYSMODS/init ../MODULES/BOOTTRACK/boot_dw_coco1>-bttemp
+echo *
+echo * Step 3: Create the bootfile and boot track
+os9gen %1 -t=bttemp<../BOOTLISTS/dw_coco1.bl
+del bttemp
+echo *
+echo * Step 4: Populate the disk with essential files
+copy ../MODULES/SYSMODS/sysgo_dd %1/sysgo
+makdir %1/CMDS
+copy -w=%1/CMDS ../CMDS/shell
+echo *
+echo * We're done
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/modules/boot_dw.asm	Sun Nov 24 12:07:31 2013 +0100
@@ -0,0 +1,143 @@
+********************************************************************
+* Boot - DriveWire 3 Boot Module
+*
+* $Id$
+*
+* Edt/Rev  YYYY/MM/DD  Modified by
+* Comment
+* ------------------------------------------------------------------
+*   1      2008/02/09  Boisy G. Pitre
+* Created.
+
+               NAM       Boot
+               TTL       DriveWire Boot Module
+
+               IFP1      
+               USE       defsfile
+               USE       drivewire.d
+               ENDC      
+
+tylg           SET       Systm+Objct
+atrv           SET       ReEnt+rev
+rev            SET       0
+edition        SET       1
+
+               MOD       eom,name,tylg,atrv,start,size
+
+* on-stack buffer to use
+               ORG       0
+seglist        RMB       2                   pointer to segment list
+blockloc       RMB       2                   pointer to memory requested
+blockimg       RMB       2                   duplicate of the above
+bootloc        RMB       3                   sector pointer; not byte pointer
+bootsize       RMB       2                   size in bytes
+LSN0Ptr        RMB       2                   LSN0 pointer
+size           EQU       .
+
+name           EQU       *
+               FCS       /Boot/
+               FCB       edition
+
+
+* Common booter-required defines
+LSN24BIT       EQU       1
+FLOPPY         EQU       0
+
+
+               USE       boot_common.asm
+
+
+************************************************************
+************************************************************
+*              Hardware-Specific Booter Area               *
+************************************************************
+************************************************************                   
+
+* HWInit - Initialize the device
+*   Entry: Y = hardware address
+*   Exit:  Carry Clear = OK, Set = Error
+*          B = error (Carry Set)
+HWInit                   
+* Set up DDR for side B
+*               ldx       #PIA1Base           get base address of PIA
+*               ldb       3,x
+*               andb      #%11111011
+*               stb       3,x
+*               lda       #%11111010
+*               sta       2,x
+*               orb       #%00000100
+*               stb       3,x
+
+* Set up DDR for side A
+*               ldb       1,x
+*               andb      #%11111011
+*               stb       1,x                 $FF20 is now Data Direction Register
+*               lda       #%11111110          data direction bits (1=out, 0=in)
+*               sta       ,x                  tell HW
+*               orb       #%00000100          reset $FF20 to I/O register
+*               stb       1,x                 $FF20 is now Data Direction Register
+HWTerm         clrb      
+               rts       
+
+
+* HWRead - Read a 256 byte sector from the device
+*   Entry: Y = hardware address
+*          B = bits 23-16 of LSN
+*          X = bits 15-0  of LSN
+* 		   blockloc,u = ptr to 256 byte sector
+*   Exit:  X = ptr to data (i.e. ptr in blockloc,u)
+HWRead         
+               pshs      cc,d,x
+* Send out op code and 3 byte LSN
+               lda       #OP_READEX           load A with READ opcode
+Read2          ldb       WhichDrv,pcr
+               std       ,s
+               leax      ,s
+               ldy       #5
+               lbsr      DWWrite              send it to server
+* Get 256 bytes of sector data
+               ldx       blockloc,u
+               ldy       #256
+               bsr       DWRead               read bytes from server
+               bcs       ReadEr               branch if framing error
+               bne       ReadEr2
+               
+* Send two byte checksum
+               pshs      y
+	 		      leax      ,s
+			      ldy       #2
+			      lbsr      DWWrite 
+                              ldy       #1
+			      bsr       DWRead 
+			      leas      2,s
+     			   bcs       ReadEx
+                           bne      ReadEr2
+			      ldb       ,s
+			      beq       ReadEx
+			      cmpb      #E_CRC
+			      bne       ReadEr
+               lda       #OP_REREADEX
+               bra       Read2
+ReadEx         EQU       *
+               leas      5,s                 eat stack
+               ldx       blockloc,u
+               clrb      
+               rts
+ReadEr2        ldb       #E$Read
+ReadEr
+               leas      5,s                 eat stack
+               orcc      #Carry
+               rts
+
+               USE       dwread.asm
+               USE       dwwrite.asm
+
+               IFGT      Level-1
+Pad            FILL      $39,$1D0-3-2-1-*
+               ENDC      
+
+Address        FDB       $0000
+WhichDrv       FCB       $00
+               EMOD      
+eom            EQU       *
+               END       
--- a/level1/modules/boot_dw3.asm	Sun Nov 24 11:45:32 2013 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,143 +0,0 @@
-********************************************************************
-* Boot - DriveWire 3 Boot Module
-*
-* $Id$
-*
-* Edt/Rev  YYYY/MM/DD  Modified by
-* Comment
-* ------------------------------------------------------------------
-*   1      2008/02/09  Boisy G. Pitre
-* Created.
-
-               NAM       Boot
-               TTL       DriveWire Boot Module
-
-               IFP1      
-               USE       defsfile
-               USE       drivewire.d
-               ENDC      
-
-tylg           SET       Systm+Objct
-atrv           SET       ReEnt+rev
-rev            SET       0
-edition        SET       1
-
-               MOD       eom,name,tylg,atrv,start,size
-
-* on-stack buffer to use
-               ORG       0
-seglist        RMB       2                   pointer to segment list
-blockloc       RMB       2                   pointer to memory requested
-blockimg       RMB       2                   duplicate of the above
-bootloc        RMB       3                   sector pointer; not byte pointer
-bootsize       RMB       2                   size in bytes
-LSN0Ptr        RMB       2                   LSN0 pointer
-size           EQU       .
-
-name           EQU       *
-               FCS       /Boot/
-               FCB       edition
-
-
-* Common booter-required defines
-LSN24BIT       EQU       1
-FLOPPY         EQU       0
-
-
-               USE       boot_common.asm
-
-
-************************************************************
-************************************************************
-*              Hardware-Specific Booter Area               *
-************************************************************
-************************************************************                   
-
-* HWInit - Initialize the device
-*   Entry: Y = hardware address
-*   Exit:  Carry Clear = OK, Set = Error
-*          B = error (Carry Set)
-HWInit                   
-* Set up DDR for side B
-*               ldx       #PIA1Base           get base address of PIA
-*               ldb       3,x
-*               andb      #%11111011
-*               stb       3,x
-*               lda       #%11111010
-*               sta       2,x
-*               orb       #%00000100
-*               stb       3,x
-
-* Set up DDR for side A
-*               ldb       1,x
-*               andb      #%11111011
-*               stb       1,x                 $FF20 is now Data Direction Register
-*               lda       #%11111110          data direction bits (1=out, 0=in)
-*               sta       ,x                  tell HW
-*               orb       #%00000100          reset $FF20 to I/O register
-*               stb       1,x                 $FF20 is now Data Direction Register
-HWTerm         clrb      
-               rts       
-
-
-* HWRead - Read a 256 byte sector from the device
-*   Entry: Y = hardware address
-*          B = bits 23-16 of LSN
-*          X = bits 15-0  of LSN
-* 		   blockloc,u = ptr to 256 byte sector
-*   Exit:  X = ptr to data (i.e. ptr in blockloc,u)
-HWRead         
-               pshs      cc,d,x
-* Send out op code and 3 byte LSN
-               lda       #OP_READEX           load A with READ opcode
-Read2          ldb       WhichDrv,pcr
-               std       ,s
-               leax      ,s
-               ldy       #5
-               lbsr      DWWrite              send it to server
-* Get 256 bytes of sector data
-               ldx       blockloc,u
-               ldy       #256
-               bsr       DWRead               read bytes from server
-               bcs       ReadEr               branch if framing error
-               bne       ReadEr2
-               
-* Send two byte checksum
-               pshs      y
-	 		      leax      ,s
-			      ldy       #2
-			      lbsr      DWWrite 
-                              ldy       #1
-			      bsr       DWRead 
-			      leas      2,s
-     			   bcs       ReadEx
-                           bne      ReadEr2
-			      ldb       ,s
-			      beq       ReadEx
-			      cmpb      #E_CRC
-			      bne       ReadEr
-               lda       #OP_REREADEX
-               bra       Read2
-ReadEx         EQU       *
-               leas      5,s                 eat stack
-               ldx       blockloc,u
-               clrb      
-               rts
-ReadEr2        ldb       #E$Read
-ReadEr
-               leas      5,s                 eat stack
-               orcc      #Carry
-               rts
-
-               USE       dwread.asm
-               USE       dwwrite.asm
-
-               IFGT      Level-1
-Pad            FILL      $39,$1D0-3-2-1-*
-               ENDC      
-
-Address        FDB       $0000
-WhichDrv       FCB       $00
-               EMOD      
-eom            EQU       *
-               END       
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/modules/clock2_dw.asm	Sun Nov 24 12:07:31 2013 +0100
@@ -0,0 +1,123 @@
+********************************************************************
+* Clock2 - DriveWire 3 RTC Driver
+*
+* $Id$
+*
+* Edt/Rev  YYYY/MM/DD  Modified by
+* Comment
+* ------------------------------------------------------------------
+*   1      2004/08/18  Boisy G. Pitre
+* Separated clock2 modules for source clarity.
+*
+*   2      2010/01/02  Boisy G. Pitre
+* Saved some bytes by optimizing
+
+          nam       Clock2
+          ttl       DriveWire 3 RTC Driver
+
+          ifp1            
+          use       defsfile  
+          use       drivewire.d  
+          endc            
+
+tylg      set       Sbrtn+Objct
+atrv      set       ReEnt+rev
+rev       set       $00
+edition   set       2
+
+
+RTC.Base  equ       $0000     
+
+          mod       eom,name,tylg,atrv,JmpTable,RTC.Base
+
+name      fcs       "Clock2"  
+          fcb       edition
+
+subname   fcs       "dw3"
+
+* Three Entry Points:
+*   - Init
+*   - GetTime
+*   - SetTIme
+JmpTable                 
+          bra       Init
+          nop
+          bra       GetTime   	RTC Get Time
+          nop
+
+SetTime   pshs      u,y,x,d
+          IFNE      atari
+          tst       D.ATARIFLAGS
+          bmi       UpdLeave
+          ENDC
+          IFGT      Level-1
+          ldu       <D.DWSubAddr
+          ELSE
+          ldu       >D.DWSubAddr
+          ENDC
+          beq       UpdLeave      in case we failed to link it, just exit
+          lda       #OP_SETTIME
+          pshs      a
+          ldy       #$0001
+          leax      ,s
+          jsr       DW$Write,u
+          puls      a
+          ldx       #D.Year
+          ldy       #$0006
+          jsr       DW$Write,u
+          bra       UpdLeave
+
+GetTime 
+          lda       #OP_TIME        Time packet
+          pshs      u,y,x,d
+          IFNE      atari
+          tst       D.ATARIFLAGS
+          bmi       UpdLeave
+          ENDC
+          IFGT      Level-1
+          ldu       <D.DWSubAddr
+          ELSE
+          ldu       >D.DWSubAddr
+          ENDC
+          beq       UpdLeave      in case we failed to link it, just exit
+          leax      ,s
+          ldy       #$0001
+          jsr       DW$Write,u
+          ldx       #D.Year
+          ldy       #$0006
+          jsr       DW$Read,u
+UpdLeave  puls      d,x,y,u,pc
+
+
+Init     
+* Check if subroutine already linked
+          IFGT      Level-1
+          ldx       <D.DWSubAddr
+          ELSE
+          ldx       >D.DWSubAddr
+          ENDC
+          bne       leave
+          IFGT      Level-1
+          ldx       <D.Proc
+          pshs      x
+          ldx       <D.SysPrc
+          stx       <D.Proc
+          ENDC
+          leax      subname,pcr
+          clra
+          os9       F$Link
+          IFGT      Level-1
+          puls      x
+          stx       <D.Proc
+          bcs       leave
+          sty       <D.DWSubAddr
+          ELSE
+          bcs       leave
+          sty       >D.DWSubAddr
+          ENDC
+          jmp       ,y			call initialization routine
+leave     rts
+
+          emod          
+eom       equ   *         
+          end             
--- a/level1/modules/clock2_dw3.asm	Sun Nov 24 11:45:32 2013 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,123 +0,0 @@
-********************************************************************
-* Clock2 - DriveWire 3 RTC Driver
-*
-* $Id$
-*
-* Edt/Rev  YYYY/MM/DD  Modified by
-* Comment
-* ------------------------------------------------------------------
-*   1      2004/08/18  Boisy G. Pitre
-* Separated clock2 modules for source clarity.
-*
-*   2      2010/01/02  Boisy G. Pitre
-* Saved some bytes by optimizing
-
-          nam       Clock2
-          ttl       DriveWire 3 RTC Driver
-
-          ifp1            
-          use       defsfile  
-          use       drivewire.d  
-          endc            
-
-tylg      set       Sbrtn+Objct
-atrv      set       ReEnt+rev
-rev       set       $00
-edition   set       2
-
-
-RTC.Base  equ       $0000     
-
-          mod       eom,name,tylg,atrv,JmpTable,RTC.Base
-
-name      fcs       "Clock2"  
-          fcb       edition
-
-subname   fcs       "dw3"
-
-* Three Entry Points:
-*   - Init
-*   - GetTime
-*   - SetTIme
-JmpTable                 
-          bra       Init
-          nop
-          bra       GetTime   	RTC Get Time
-          nop
-
-SetTime   pshs      u,y,x,d
-          IFNE      atari
-          tst       D.ATARIFLAGS
-          bmi       UpdLeave
-          ENDC
-          IFGT      Level-1
-          ldu       <D.DWSubAddr
-          ELSE
-          ldu       >D.DWSubAddr
-          ENDC
-          beq       UpdLeave      in case we failed to link it, just exit
-          lda       #OP_SETTIME
-          pshs      a
-          ldy       #$0001
-          leax      ,s
-          jsr       DW$Write,u
-          puls      a
-          ldx       #D.Year
-          ldy       #$0006
-          jsr       DW$Write,u
-          bra       UpdLeave
-
-GetTime 
-          lda       #OP_TIME        Time packet
-          pshs      u,y,x,d
-          IFNE      atari
-          tst       D.ATARIFLAGS
-          bmi       UpdLeave
-          ENDC
-          IFGT      Level-1
-          ldu       <D.DWSubAddr
-          ELSE
-          ldu       >D.DWSubAddr
-          ENDC
-          beq       UpdLeave      in case we failed to link it, just exit
-          leax      ,s
-          ldy       #$0001
-          jsr       DW$Write,u
-          ldx       #D.Year
-          ldy       #$0006
-          jsr       DW$Read,u
-UpdLeave  puls      d,x,y,u,pc
-
-
-Init     
-* Check if subroutine already linked
-          IFGT      Level-1
-          ldx       <D.DWSubAddr
-          ELSE
-          ldx       >D.DWSubAddr
-          ENDC
-          bne       leave
-          IFGT      Level-1
-          ldx       <D.Proc
-          pshs      x
-          ldx       <D.SysPrc
-          stx       <D.Proc
-          ENDC
-          leax      subname,pcr
-          clra
-          os9       F$Link
-          IFGT      Level-1
-          puls      x
-          stx       <D.Proc
-          bcs       leave
-          sty       <D.DWSubAddr
-          ELSE
-          bcs       leave
-          sty       >D.DWSubAddr
-          ENDC
-          jmp       ,y			call initialization routine
-leave     rts
-
-          emod          
-eom       equ   *         
-          end             
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/modules/dw.asm	Sun Nov 24 12:07:31 2013 +0100
@@ -0,0 +1,580 @@
+********************************************************************
+* DW3 - DriveWire 3 Low Level Subroutine Module
+*
+* $Id$
+*
+* Edt/Rev  YYYY/MM/DD  Modified by
+* Comment
+* ------------------------------------------------------------------
+*   1      2008/01/26  Boisy G. Pitre
+* Started as a segregated subroutine module.
+*
+*   2      2010/01/20  Boisy G. Pitre
+* Added support for DWNet
+*
+*   3      2010/01/23  Aaron A. Wolfe
+* Added dynamic polling frequency
+*
+               nam       DW3
+               ttl       DriveWire 3 Low Level Subroutine Module
+
+               ifp1      
+               use       defsfile
+               use       drivewire.d
+               endc      
+
+tylg           set       Sbrtn+Objct
+atrv           set       ReEnt+rev
+rev            set       $01
+
+               mod       eom,name,tylg,atrv,start,0
+
+* irq
+IRQPckt        fcb       $00,$01,$0A         ;IRQ packet Flip(1),Mask(1),Priority(1) bytes
+* Default time packet
+DefTime        fcb       109,12,31,23,59,59
+
+* for dynamic poll frequency, number of ticks between firing poller - should we move to dwdefs?
+* speed 1 = interactive (typing)
+PollSpd1       fcb       3
+* speed 2 = bulk transfer (depending on how much processing needs to be done to incoming stream, 5-8 seems good)
+PollSpd2       fcb       6
+* speed 3 = idle 
+PollSpd3       fcb       40
+* X pollidle -> drop to next slower rate
+PollIdle       fcb       60
+
+
+name           fcs       /dw3/
+
+* DriveWire subroutine entry table
+start          lbra      Init
+               bra       Read
+               nop       
+               lbra      Write
+
+* Term
+*
+* Entry:
+*    U  = address of device memory area
+*
+* Exit:
+*    CC = carry set on error
+*    B  = error code
+*
+Term                     
+               clrb                          clear Carry
+               rts       
+
+Read                     
+               use       dwread.asm
+
+Write                    
+               use       dwwrite.asm
+
+
+			use		dwinit.asm
+			
+* Init
+*
+* Entry:
+*    Y  = address of device descriptor
+*    U  = address of device memory area
+*
+* Exit:
+*    CC = carry set on error
+*    B  = error code
+*
+* Initialize the serial device
+Init                     
+               clrb                          clear Carry
+               pshs      y,x,cc              then push CC on stack
+               bsr		DWInit
+
+; allocate DW statics page
+               pshs      u
+               ldd       #$0100
+               os9       F$SRqMem
+               tfr       u,x
+               puls      u
+               lbcs      InitEx
+               ifgt      Level-1
+               stx       <D.DWStat
+               else      
+               stx       >D.DWStat
+               endc      
+; clear out 256 byte page at X
+               clrb      
+loop@          clr       ,x+
+               decb      
+               bne       loop@
+
+* send OP_DWINIT
+         ; setup DWsub command
+               pshs      u
+               ldb		 #1					 ; DRIVER VERSION
+               lda       #OP_DWINIT          ; load command
+               pshs      d                   ; command store on stack
+               leax      ,s                  ; point X to stack 
+               ldy       #2                  ; 1 byte to send
+               ifgt      Level-1
+               ldu       <D.DWSubAddr
+               else      
+               ldu       >D.DWSubAddr
+               endc      
+               jsr       DW$Write,u                 ; call DWrite
+               leas      1,s                 ; leave one byte on stack for response 
+               
+               ; read protocol version response, 1 byte
+               leax      ,s                  ; point X to stack head
+               ldy       #1                  ; 1 byte to retrieve
+               jsr       DW$Read,u                 ; call DWRead
+               IFNE      atari-1
+               beq       InstIRQ             ; branch if no error
+               ENDC
+               leas      3,s                 ; error, cleanup stack (u and 1 byte from read) 
+               lbra      InitEx            	 ; don't install IRQ handler
+
+* install ISR
+InstIRQ                  
+			   puls      a,u		; a has proto version from server.. not used yet
+
+			   ifgt      Level-1
+               ldx       <D.DWStat
+               else      
+               ldx       >D.DWStat
+               endc      
+               leax      DW.VIRQPkt,x
+               pshs      u
+               tfr       x,u
+               leax      Vi.Stat,x           ;fake VIRQ status register
+               lda       #$80                ;VIRQ flag clear, repeated VIRQs
+               sta       ,x                  ;set it while we're here...
+               tfr       x,d                 ;copy fake VIRQ status register address
+               leax      IRQPckt,pcr         ;IRQ polling packet
+               leay      IRQSvc,pcr          ;IRQ service entry
+               os9       F$IRQ               ;install
+               puls      u
+               bcs       InitEx              ;exit with error
+               clra      
+               ldb       PollSpd3,pcr        ; start at idle
+               ifgt      Level-1
+               ldx       <D.DWStat
+               else      
+               ldx       >D.DWStat
+               endc      
+               leax      DW.VIRQPkt,x
+               std       Vi.Rst,x            ; reset count
+               tfr       x,y                 ; move VIRQ software packet to Y
+tryagain                 
+               ldx       #$0001              ; code to install new VIRQ
+               os9       F$VIRQ              ; install
+               bcc       IRQok               ; no error, continue
+               cmpb      #E$UnkSvc
+               bne       InitEx
+; if we get an E$UnkSvc error, then clock has not been initialized, so do it here
+               leax      DefTime,pcr
+               os9       F$STime
+               bra       tryagain            ; note: this has the slim potential of looping forever
+IRQok                    
+               ifgt      Level-1
+               ldx       <D.DWStat
+               else      
+               ldx       >D.DWStat
+               endc      
+; cheat: we know DW.StatTbl is at offset $00 from D.DWStat, do not bother with leax
+               leax      DW.StatTbl,x
+               tfr       u,d
+               ldb       <V.PORT+1,u         ; get our port #
+               sta       b,x                 ; store in table
+
+InitEx                   
+               puls      cc,x,y,pc
+
+
+; ***********************************************************************
+; Interrupt handler  - Much help from Darren Atkinson
+
+IRQMulti3      anda      #$0F                ; mask first 4 bits, a is now port #+1
+               deca                          ; we pass +1 to use 0 for no data
+               pshs      a                   ; save port #
+               cmpb      RxGrab,u            ; compare room in buffer to server's byte
+               bhs       IRQM06              ; room left >= server's bytes, no problem
+
+               stb       RxGrab,u            ; else replace with room left in our buffer
+
+          ; also limit to end of buffer
+IRQM06         ldd       RxBufEnd,u          ; end addr of buffer
+               subd      RxBufPut,u          ; subtract current write pointer, result is # bytes left going forward in buff.
+
+IRQM05         cmpb      RxGrab,u            ; compare b (room left) to grab bytes  
+               bhs       IRQM03              ; branch if we have room for grab bytes
+
+               stb       RxGrab,u            ; else set grab to room left
+
+          ; send multiread req
+IRQM03         puls      a                   ; port # is on stack
+               ldb       RxGrab,u
+
+               pshs      u
+
+          ; setup DWsub command
+               pshs      d                   ; (a port, b bytes)
+               lda       #OP_SERREADM        ; load command
+               pshs      a                   ; command store on stack
+               leax      ,s                  ; point X to stack 
+               ldy       #3                  ; 3 bytes to send
+
+               ifgt      Level-1
+               ldu       <D.DWSubAddr
+               else      
+               ldu       >D.DWSubAddr
+               endc      
+               jsr       DW$Write,u                 ; call DWrite
+
+               leas      3,s                 ; clean 3 DWsub args from stack 
+
+               ldx       ,s                  ; pointer to this port's area (from U prior), leave it on stack
+               ldb       RxGrab,x            ; set B to grab bytes
+               clra                          ; 0 in high byte		
+               tfr       d,y                 ; set # bytes for DW
+
+               ldx       RxBufPut,x          ; point X to insert position in this port's buffer
+          ; receive response
+               jsr       DW$Read,u                 ; call DWRead
+          ; handle errors?
+
+
+               puls      u
+               ldb       RxGrab,u            ; our grab bytes
+
+          ; set new RxBufPut
+               ldx       RxBufPut,u          ; current write pointer
+               abx                           ; add b (# bytes) to RxBufPut
+               cmpx      RxBufEnd,u          ; end of Rx buffer?
+               blo       IRQM04              ; no, go keep laydown pointer
+               ldx       RxBufPtr,u          ; get Rx buffer start address
+IRQM04         stx       RxBufPut,u          ; set new Rx data laydown pointer
+
+          ; set new RxDatLen
+               ldb       RxDatLen,u
+               addb      RxGrab,u
+               stb       RxDatLen,u          ; store new value
+
+               lbra      CkSSig              ; had to lbra
+
+IRQMulti                 
+		  ; set IRQ freq for bulk
+               pshs      a
+               lda       PollSpd2,pcr
+               lbsr      IRQsetFRQ
+               puls      a
+
+          ; initial grab bytes
+               stb       RxGrab,u
+
+          ; limit server bytes to bufsize - datlen
+               ldb       RxBufSiz,u          ; size of buffer
+               subb      RxDatLen,u          ; current bytes in buffer
+               bne       IRQMulti3           ; continue, we have some space in buffer
+          ; no room in buffer
+               tstb      
+               lbne      CkSSig              ;had to lbra
+               lbra      IRQExit             ;had to lbra
+
+
+; **** IRQ ENTRY POINT
+IRQSvc         equ       *
+               pshs      cc,dp               ; save system cc,DP
+               orcc      #IntMasks           ; mask interrupts
+
+          ; mark VIRQ handled (note U is pointer to our VIRQ packet in DP)
+               lda       Vi.Stat,u           ; VIRQ status register
+               anda      #^Vi.IFlag          ; clear flag in VIRQ status register
+               sta       Vi.Stat,u           ; save it...
+
+          ; poll server for incoming serial data
+
+          ; send request
+               lda       #OP_SERREAD         ; load command
+               pshs      a                   ; command store on stack
+               leax      ,s                  ; point X to stack 
+               ldy       #1                  ; 1 byte to send
+
+               ifgt      Level-1
+               ldu       <D.DWSubAddr
+               else      
+               ldu       >D.DWSubAddr
+               endc      
+               jsr       DW$Write,u                 ; call DWrite
+
+          ; receive response
+               leas      -1,s                ; one more byte to fit response
+               leax      ,s                  ; point X to stack head
+               ldy       #2                  ; 2 bytes to retrieve
+               jsr       DW$Read,u                 ; call DWRead
+               beq       IRQSvc2             ; branch if no error
+               leas      2,s                 ; error, cleanup stack 2
+               lbra      IRQExit2            ; don't reset error count on the way out
+
+          ; process response	
+IRQSvc2                  
+               ldd       ,s++                ; pull returned status byte into A,data into B (set Z if zero, N if multiread)
+               bne       IRQGotOp            ; branch if D != 0 (something to do)
+* this is a NOP response.. do we need to reschedule
+               ifgt      Level-1
+               ldx       <D.DWStat
+               else      
+               ldx       >D.DWStat
+               endc      
+               lda       DW.VIRQPkt+Vi.Rst+1,x
+               cmpa      PollSpd3,pcr
+               lbeq      IRQExit             ;we are already at idle speed
+
+               lda       DW.VIRQNOP,x
+               inca      
+               cmpa      PollIdle,pcr
+               beq       FRQdown
+
+               sta       DW.VIRQNOP,x        ;inc NOP count, exit
+               lbra      IRQExit
+
+FRQdown        lda       DW.VIRQPkt+Vi.Rst+1,x
+               cmpa      PollSpd1,pcr
+               beq       FRQd1
+               lda       PollSpd3,pcr
+FRQd2                    
+               sta       DW.VIRQPkt+Vi.Rst+1,x
+               clr       DW.VIRQNOP,x
+               lbra      IRQExit
+FRQd1          lda       PollSpd2,pcr
+               bra       FRQd2
+
+; save back D on stack and build our U
+IRQGotOp       pshs      d
+          * mode switch on bits 7+6 of A: 00 = vserial, 01 = vwindow, 10 = wirebug?, 11 = ?							
+               anda      #$C0                ; mask last 6 bits
+               beq       mode00              ; virtual serial mode
+          					; future - handle other modes
+               cmpa      #%01000000          ; vwindow?
+               beq       mode01
+               lbra      IRQExit             ; for now, bail
+
+* Virtual Window Handler
+mode01
+               lda       ,s
+               anda      #%00110000
+               beq       key
+               lbra      IRQExit
+
+key
+               lda       ,s
+               anda      #$0F
+               ora       #$10
+               ifgt      Level-1
+               ldx       <D.DWStat
+               else      
+               ldx       >D.DWStat
+               endc      
+; cheat: we know DW.StatTbl is at offset $00 from D.DWStat, do not bother with leax
+;			leax    DW.StatTbl,x
+               lda       a,x
+               clrb      
+               tfr       d,u
+               puls      d
+               lbra      IRQPutch
+
+               
+* Virtual Serial Handler
+mode00         lda       ,s                  ; restore A		  
+               anda      #$0F                ; mask first 4 bits, a is now port #+1
+               beq       IRQCont             ; if we're here with 0 in the port, its not really a port # (can we jump straight to status?)
+               deca                          ; we pass +1 to use 0 for no data
+; here we set U to the static storage area of the device we are working with
+               ifgt      Level-1
+               ldx       <D.DWStat
+               else      
+               ldx       >D.DWStat
+               endc      
+; cheat: we know DW.StatTbl is at offset $00 from D.DWStat, do not bother with leax
+;			leax    DW.StatTbl,x
+               lda       a,x
+               bne       IRQCont             ; if A is 0, then this device is not active, so exit
+               puls      d
+               lbra      IRQExit
+IRQCont                  
+               clrb      
+               tfr       d,u
+
+               puls      d
+
+          * multiread/status flag is in bit 4 of A
+               bita      #$10
+               beq       IRQPutch            ; branch for read1 if multiread not set
+
+          * all 0s in port means status, anything else is multiread
+
+               bita      #$0F                ;mask bit 7-4
+               beq       dostat              ;port # all 0, this is a status response
+               lbra      IRQMulti            ;its not all 0, this is a multiread
+
+
+		 * in status events, databyte is split, 4bits status, 4bits port #          
+dostat         bitb      #$F0                ;mask low bits
+               lbne      IRQExit             ;we only implement code 0000, term
+			* set u to port #
+               ifgt      Level-1
+               ldx       <D.DWStat
+               else      
+               ldx       >D.DWStat
+               endc      
+               lda       b,x
+               bne       statcont            ; if A is 0, then this device is not active, so exit
+               lbra      IRQExit
+
+* IRQ set freq routine
+* sets freq and clears NOP counter
+* a = desired IRQ freq
+IRQsetFRQ      pshs      x                   ; preserve
+               ifgt      Level-1
+               ldx       <D.DWStat
+               else      
+               ldx       >D.DWStat
+               endc      
+               sta       DW.VIRQPkt+Vi.Rst+1,x
+* +++ BGP +++ added following line so that the counter (which was copied by
+* clock before calling us) gets reset to the same value the reset value. Without
+* this line, we get called again with the PRIOR Vi.Rst value.
+               sta       DW.VIRQPkt+Vi.Cnt+1,x
+               clr       DW.VIRQNOP,x
+               puls      x
+               rts       
+
+
+* This routine roots through process descriptors in a queue and
+* checks to see if the process has a path that is open to the device
+* represented by the static storage pointer in U. if so, the S$HUP
+* signal is sent to that process
+*
+* Entry: X = process descriptor to evaluate
+*        U = static storage of device we want to check against
+RootThrough              
+               ldb       #NumPaths
+               leay      P$Path,x
+               pshs      x
+loop           decb      
+               bmi       out
+               lda       ,y+
+               beq       loop
+               pshs      y
+               ifgt      Level-1
+               ldx       <D.PthDBT
+               else      
+               ldx       >D.PthDBT
+               endc      
+               os9       F$Find64
+               ldx       PD.DEV,y
+               leax      V$STAT,x
+               puls      y
+               bcs       out
+
+               cmpu      ,x
+               bne       loop
+
+               ldx       ,s
+               lda       P$ID,x
+               ldb       #S$HUP
+               os9       F$Send
+
+out            puls      x
+               ldx       P$Queue,x
+               bne       RootThrough
+               rts       
+
+statcont       clrb      
+               tfr       d,u
+* NEW: root through all process descriptors. if any has a path open to this
+* device, send then S$HUP
+               ldx       <D.AProcQ
+               beq       dowaitq
+               bsr       RootThrough
+dowaitq        ldx       <D.WProcQ
+               beq       dosleepq
+               bsr       RootThrough
+dosleepq       ldx       <D.SProcQ
+               beq       CkLPRC
+               bsr       RootThrough
+
+CkLPRC                   
+               lda       <V.LPRC,u
+               beq       IRQExit             ; no last process, bail
+               ldb       #S$HUP
+               os9       F$Send              ; send signal, don't think we can do anything about an error result anyway.. so
+               bra       CkSuspnd            ; do we need to go check suspend?
+
+; put byte B in port As buffer - optimization help from Darren Atkinson       
+IRQPutCh                 
+		  ; set IRQ freq for bulk
+               lda       PollSpd1,pcr
+               lbsr      IRQsetFRQ
+               ldx       RxBufPut,u          ; point X to the data buffer
+
+; process interrupt/quit characters here
+; note we will have to do this in the multiread (ugh)
+               tfr       b,a                 ; put byte in A
+               ldb       #S$Intrpt
+               cmpa      V.INTR,u
+               beq       send@
+               ldb       #S$Abort
+               cmpa      V.QUIT,u
+               bne       store
+send@          lda       V.LPRC,u
+               beq       IRQExit
+               os9       F$Send
+               bra       IRQExit
+
+store                    
+          ; store our data byte
+               sta       ,x+                 ; store and increment buffer pointer
+
+          ; adjust RxBufPut	
+               cmpx      RxBufEnd,u          ; end of Rx buffer?
+               blo       IRQSkip1            ; no, go keep laydown pointer
+               ldx       RxBufPtr,u          ; get Rx buffer start address
+IRQSkip1       stx       RxBufPut,u          ; set new Rx data laydown pointer
+
+          ; increment RxDatLen
+               inc       RxDatLen,u
+
+CkSSig                   
+               lda       <SSigID,u           ; send signal on data ready?
+               beq       CkSuspnd
+               ldb       <SSigSg,u           ; else get signal code
+               os9       F$Send
+               clr       <SSigID,u
+               bra       IRQExit
+
+          ; check if we have a process waiting for data	
+CkSuspnd                 
+               lda       <V.WAKE,u           ; V.WAKE?
+               beq       IRQExit             ; no
+               clr       <V.WAKE,u           ; clear V.WAKE
+
+          ; wake up waiter for read
+               ifeq      Level-1
+               ldb       #S$Wake
+               os9       F$Send
+               else      
+               clrb      
+               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
+               endc      
+
+IRQExit                  
+IRQExit2       puls      cc,dp,pc            ; restore interrupts cc,dp, return
+
+               emod      
+eom            equ       *
+               end       
--- a/level1/modules/dw3.asm	Sun Nov 24 11:45:32 2013 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,580 +0,0 @@
-********************************************************************
-* DW3 - DriveWire 3 Low Level Subroutine Module
-*
-* $Id$
-*
-* Edt/Rev  YYYY/MM/DD  Modified by
-* Comment
-* ------------------------------------------------------------------
-*   1      2008/01/26  Boisy G. Pitre
-* Started as a segregated subroutine module.
-*
-*   2      2010/01/20  Boisy G. Pitre
-* Added support for DWNet
-*
-*   3      2010/01/23  Aaron A. Wolfe
-* Added dynamic polling frequency
-*
-               nam       DW3
-               ttl       DriveWire 3 Low Level Subroutine Module
-
-               ifp1      
-               use       defsfile
-               use       drivewire.d
-               endc      
-
-tylg           set       Sbrtn+Objct
-atrv           set       ReEnt+rev
-rev            set       $01
-
-               mod       eom,name,tylg,atrv,start,0
-
-* irq
-IRQPckt        fcb       $00,$01,$0A         ;IRQ packet Flip(1),Mask(1),Priority(1) bytes
-* Default time packet
-DefTime        fcb       109,12,31,23,59,59
-
-* for dynamic poll frequency, number of ticks between firing poller - should we move to dwdefs?
-* speed 1 = interactive (typing)
-PollSpd1       fcb       3
-* speed 2 = bulk transfer (depending on how much processing needs to be done to incoming stream, 5-8 seems good)
-PollSpd2       fcb       6
-* speed 3 = idle 
-PollSpd3       fcb       40
-* X pollidle -> drop to next slower rate
-PollIdle       fcb       60
-
-
-name           fcs       /dw3/
-
-* DriveWire subroutine entry table
-start          lbra      Init
-               bra       Read
-               nop       
-               lbra      Write
-
-* Term
-*
-* Entry:
-*    U  = address of device memory area
-*
-* Exit:
-*    CC = carry set on error
-*    B  = error code
-*
-Term                     
-               clrb                          clear Carry
-               rts       
-
-Read                     
-               use       dwread.asm
-
-Write                    
-               use       dwwrite.asm
-
-
-			use		dwinit.asm
-			
-* Init
-*
-* Entry:
-*    Y  = address of device descriptor
-*    U  = address of device memory area
-*
-* Exit:
-*    CC = carry set on error
-*    B  = error code
-*
-* Initialize the serial device
-Init                     
-               clrb                          clear Carry
-               pshs      y,x,cc              then push CC on stack
-               bsr		DWInit
-
-; allocate DW statics page
-               pshs      u
-               ldd       #$0100
-               os9       F$SRqMem
-               tfr       u,x
-               puls      u
-               lbcs      InitEx
-               ifgt      Level-1
-               stx       <D.DWStat
-               else      
-               stx       >D.DWStat
-               endc      
-; clear out 256 byte page at X
-               clrb      
-loop@          clr       ,x+
-               decb      
-               bne       loop@
-
-* send OP_DWINIT
-         ; setup DWsub command
-               pshs      u
-               ldb		 #1					 ; DRIVER VERSION
-               lda       #OP_DWINIT          ; load command
-               pshs      d                   ; command store on stack
-               leax      ,s                  ; point X to stack 
-               ldy       #2                  ; 1 byte to send
-               ifgt      Level-1
-               ldu       <D.DWSubAddr
-               else      
-               ldu       >D.DWSubAddr
-               endc      
-               jsr       DW$Write,u                 ; call DWrite
-               leas      1,s                 ; leave one byte on stack for response 
-               
-               ; read protocol version response, 1 byte
-               leax      ,s                  ; point X to stack head
-               ldy       #1                  ; 1 byte to retrieve
-               jsr       DW$Read,u                 ; call DWRead
-               IFNE      atari-1
-               beq       InstIRQ             ; branch if no error
-               ENDC
-               leas      3,s                 ; error, cleanup stack (u and 1 byte from read) 
-               lbra      InitEx            	 ; don't install IRQ handler
-
-* install ISR
-InstIRQ                  
-			   puls      a,u		; a has proto version from server.. not used yet
-
-			   ifgt      Level-1
-               ldx       <D.DWStat
-               else      
-               ldx       >D.DWStat
-               endc      
-               leax      DW.VIRQPkt,x
-               pshs      u
-               tfr       x,u
-               leax      Vi.Stat,x           ;fake VIRQ status register
-               lda       #$80                ;VIRQ flag clear, repeated VIRQs
-               sta       ,x                  ;set it while we're here...
-               tfr       x,d                 ;copy fake VIRQ status register address
-               leax      IRQPckt,pcr         ;IRQ polling packet
-               leay      IRQSvc,pcr          ;IRQ service entry
-               os9       F$IRQ               ;install
-               puls      u
-               bcs       InitEx              ;exit with error
-               clra      
-               ldb       PollSpd3,pcr        ; start at idle
-               ifgt      Level-1
-               ldx       <D.DWStat
-               else      
-               ldx       >D.DWStat
-               endc      
-               leax      DW.VIRQPkt,x
-               std       Vi.Rst,x            ; reset count
-               tfr       x,y                 ; move VIRQ software packet to Y
-tryagain                 
-               ldx       #$0001              ; code to install new VIRQ
-               os9       F$VIRQ              ; install
-               bcc       IRQok               ; no error, continue
-               cmpb      #E$UnkSvc
-               bne       InitEx
-; if we get an E$UnkSvc error, then clock has not been initialized, so do it here
-               leax      DefTime,pcr
-               os9       F$STime
-               bra       tryagain            ; note: this has the slim potential of looping forever
-IRQok                    
-               ifgt      Level-1
-               ldx       <D.DWStat
-               else      
-               ldx       >D.DWStat
-               endc      
-; cheat: we know DW.StatTbl is at offset $00 from D.DWStat, do not bother with leax
-               leax      DW.StatTbl,x
-               tfr       u,d
-               ldb       <V.PORT+1,u         ; get our port #
-               sta       b,x                 ; store in table
-
-InitEx                   
-               puls      cc,x,y,pc
-
-
-; ***********************************************************************
-; Interrupt handler  - Much help from Darren Atkinson
-
-IRQMulti3      anda      #$0F                ; mask first 4 bits, a is now port #+1
-               deca                          ; we pass +1 to use 0 for no data
-               pshs      a                   ; save port #
-               cmpb      RxGrab,u            ; compare room in buffer to server's byte
-               bhs       IRQM06              ; room left >= server's bytes, no problem
-
-               stb       RxGrab,u            ; else replace with room left in our buffer
-
-          ; also limit to end of buffer
-IRQM06         ldd       RxBufEnd,u          ; end addr of buffer
-               subd      RxBufPut,u          ; subtract current write pointer, result is # bytes left going forward in buff.
-
-IRQM05         cmpb      RxGrab,u            ; compare b (room left) to grab bytes  
-               bhs       IRQM03              ; branch if we have room for grab bytes
-
-               stb       RxGrab,u            ; else set grab to room left
-
-          ; send multiread req
-IRQM03         puls      a                   ; port # is on stack
-               ldb       RxGrab,u
-
-               pshs      u
-
-          ; setup DWsub command
-               pshs      d                   ; (a port, b bytes)
-               lda       #OP_SERREADM        ; load command
-               pshs      a                   ; command store on stack
-               leax      ,s                  ; point X to stack 
-               ldy       #3                  ; 3 bytes to send
-
-               ifgt      Level-1
-               ldu       <D.DWSubAddr
-               else      
-               ldu       >D.DWSubAddr
-               endc      
-               jsr       DW$Write,u                 ; call DWrite
-
-               leas      3,s                 ; clean 3 DWsub args from stack 
-
-               ldx       ,s                  ; pointer to this port's area (from U prior), leave it on stack
-               ldb       RxGrab,x            ; set B to grab bytes
-               clra                          ; 0 in high byte		
-               tfr       d,y                 ; set # bytes for DW
-
-               ldx       RxBufPut,x          ; point X to insert position in this port's buffer
-          ; receive response
-               jsr       DW$Read,u                 ; call DWRead
-          ; handle errors?
-
-
-               puls      u
-               ldb       RxGrab,u            ; our grab bytes
-
-          ; set new RxBufPut
-               ldx       RxBufPut,u          ; current write pointer
-               abx                           ; add b (# bytes) to RxBufPut
-               cmpx      RxBufEnd,u          ; end of Rx buffer?
-               blo       IRQM04              ; no, go keep laydown pointer
-               ldx       RxBufPtr,u          ; get Rx buffer start address
-IRQM04         stx       RxBufPut,u          ; set new Rx data laydown pointer
-
-          ; set new RxDatLen
-               ldb       RxDatLen,u
-               addb      RxGrab,u
-               stb       RxDatLen,u          ; store new value
-
-               lbra      CkSSig              ; had to lbra
-
-IRQMulti                 
-		  ; set IRQ freq for bulk
-               pshs      a
-               lda       PollSpd2,pcr
-               lbsr      IRQsetFRQ
-               puls      a
-
-          ; initial grab bytes
-               stb       RxGrab,u
-
-          ; limit server bytes to bufsize - datlen
-               ldb       RxBufSiz,u          ; size of buffer
-               subb      RxDatLen,u          ; current bytes in buffer
-               bne       IRQMulti3           ; continue, we have some space in buffer
-          ; no room in buffer
-               tstb      
-               lbne      CkSSig              ;had to lbra
-               lbra      IRQExit             ;had to lbra
-
-
-; **** IRQ ENTRY POINT
-IRQSvc         equ       *
-               pshs      cc,dp               ; save system cc,DP
-               orcc      #IntMasks           ; mask interrupts
-
-          ; mark VIRQ handled (note U is pointer to our VIRQ packet in DP)
-               lda       Vi.Stat,u           ; VIRQ status register
-               anda      #^Vi.IFlag          ; clear flag in VIRQ status register
-               sta       Vi.Stat,u           ; save it...
-
-          ; poll server for incoming serial data
-
-          ; send request
-               lda       #OP_SERREAD         ; load command
-               pshs      a                   ; command store on stack
-               leax      ,s                  ; point X to stack 
-               ldy       #1                  ; 1 byte to send
-
-               ifgt      Level-1
-               ldu       <D.DWSubAddr
-               else      
-               ldu       >D.DWSubAddr
-               endc      
-               jsr       DW$Write,u                 ; call DWrite
-
-          ; receive response
-               leas      -1,s                ; one more byte to fit response
-               leax      ,s                  ; point X to stack head
-               ldy       #2                  ; 2 bytes to retrieve
-               jsr       DW$Read,u                 ; call DWRead
-               beq       IRQSvc2             ; branch if no error
-               leas      2,s                 ; error, cleanup stack 2
-               lbra      IRQExit2            ; don't reset error count on the way out
-
-          ; process response	
-IRQSvc2                  
-               ldd       ,s++                ; pull returned status byte into A,data into B (set Z if zero, N if multiread)
-               bne       IRQGotOp            ; branch if D != 0 (something to do)
-* this is a NOP response.. do we need to reschedule
-               ifgt      Level-1
-               ldx       <D.DWStat
-               else      
-               ldx       >D.DWStat
-               endc      
-               lda       DW.VIRQPkt+Vi.Rst+1,x
-               cmpa      PollSpd3,pcr
-               lbeq      IRQExit             ;we are already at idle speed
-
-               lda       DW.VIRQNOP,x
-               inca      
-               cmpa      PollIdle,pcr
-               beq       FRQdown
-
-               sta       DW.VIRQNOP,x        ;inc NOP count, exit
-               lbra      IRQExit
-
-FRQdown        lda       DW.VIRQPkt+Vi.Rst+1,x
-               cmpa      PollSpd1,pcr
-               beq       FRQd1
-               lda       PollSpd3,pcr
-FRQd2                    
-               sta       DW.VIRQPkt+Vi.Rst+1,x
-               clr       DW.VIRQNOP,x
-               lbra      IRQExit
-FRQd1          lda       PollSpd2,pcr
-               bra       FRQd2
-
-; save back D on stack and build our U
-IRQGotOp       pshs      d
-          * mode switch on bits 7+6 of A: 00 = vserial, 01 = vwindow, 10 = wirebug?, 11 = ?							
-               anda      #$C0                ; mask last 6 bits
-               beq       mode00              ; virtual serial mode
-          					; future - handle other modes
-               cmpa      #%01000000          ; vwindow?
-               beq       mode01
-               lbra      IRQExit             ; for now, bail
-
-* Virtual Window Handler
-mode01
-               lda       ,s
-               anda      #%00110000
-               beq       key
-               lbra      IRQExit
-
-key
-               lda       ,s
-               anda      #$0F
-               ora       #$10
-               ifgt      Level-1
-               ldx       <D.DWStat
-               else      
-               ldx       >D.DWStat
-               endc      
-; cheat: we know DW.StatTbl is at offset $00 from D.DWStat, do not bother with leax
-;			leax    DW.StatTbl,x
-               lda       a,x
-               clrb      
-               tfr       d,u
-               puls      d
-               lbra      IRQPutch
-
-               
-* Virtual Serial Handler
-mode00         lda       ,s                  ; restore A		  
-               anda      #$0F                ; mask first 4 bits, a is now port #+1
-               beq       IRQCont             ; if we're here with 0 in the port, its not really a port # (can we jump straight to status?)
-               deca                          ; we pass +1 to use 0 for no data
-; here we set U to the static storage area of the device we are working with
-               ifgt      Level-1
-               ldx       <D.DWStat
-               else      
-               ldx       >D.DWStat
-               endc      
-; cheat: we know DW.StatTbl is at offset $00 from D.DWStat, do not bother with leax
-;			leax    DW.StatTbl,x
-               lda       a,x
-               bne       IRQCont             ; if A is 0, then this device is not active, so exit
-               puls      d
-               lbra      IRQExit
-IRQCont                  
-               clrb      
-               tfr       d,u
-
-               puls      d
-
-          * multiread/status flag is in bit 4 of A
-               bita      #$10
-               beq       IRQPutch            ; branch for read1 if multiread not set
-
-          * all 0s in port means status, anything else is multiread
-
-               bita      #$0F                ;mask bit 7-4
-               beq       dostat              ;port # all 0, this is a status response
-               lbra      IRQMulti            ;its not all 0, this is a multiread
-
-
-		 * in status events, databyte is split, 4bits status, 4bits port #          
-dostat         bitb      #$F0                ;mask low bits
-               lbne      IRQExit             ;we only implement code 0000, term
-			* set u to port #
-               ifgt      Level-1
-               ldx       <D.DWStat
-               else      
-               ldx       >D.DWStat
-               endc      
-               lda       b,x
-               bne       statcont            ; if A is 0, then this device is not active, so exit
-               lbra      IRQExit
-
-* IRQ set freq routine
-* sets freq and clears NOP counter
-* a = desired IRQ freq
-IRQsetFRQ      pshs      x                   ; preserve
-               ifgt      Level-1
-               ldx       <D.DWStat
-               else      
-               ldx       >D.DWStat
-               endc      
-               sta       DW.VIRQPkt+Vi.Rst+1,x
-* +++ BGP +++ added following line so that the counter (which was copied by
-* clock before calling us) gets reset to the same value the reset value. Without
-* this line, we get called again with the PRIOR Vi.Rst value.
-               sta       DW.VIRQPkt+Vi.Cnt+1,x
-               clr       DW.VIRQNOP,x
-               puls      x
-               rts       
-
-
-* This routine roots through process descriptors in a queue and
-* checks to see if the process has a path that is open to the device
-* represented by the static storage pointer in U. if so, the S$HUP
-* signal is sent to that process
-*
-* Entry: X = process descriptor to evaluate
-*        U = static storage of device we want to check against
-RootThrough              
-               ldb       #NumPaths
-               leay      P$Path,x
-               pshs      x
-loop           decb      
-               bmi       out
-               lda       ,y+
-               beq       loop
-               pshs      y
-               ifgt      Level-1
-               ldx       <D.PthDBT
-               else      
-               ldx       >D.PthDBT
-               endc      
-               os9       F$Find64
-               ldx       PD.DEV,y
-               leax      V$STAT,x
-               puls      y
-               bcs       out
-
-               cmpu      ,x
-               bne       loop
-
-               ldx       ,s
-               lda       P$ID,x
-               ldb       #S$HUP
-               os9       F$Send
-
-out            puls      x
-               ldx       P$Queue,x
-               bne       RootThrough
-               rts       
-
-statcont       clrb      
-               tfr       d,u
-* NEW: root through all process descriptors. if any has a path open to this
-* device, send then S$HUP
-               ldx       <D.AProcQ
-               beq       dowaitq
-               bsr       RootThrough
-dowaitq        ldx       <D.WProcQ
-               beq       dosleepq
-               bsr       RootThrough
-dosleepq       ldx       <D.SProcQ
-               beq       CkLPRC
-               bsr       RootThrough
-
-CkLPRC                   
-               lda       <V.LPRC,u
-               beq       IRQExit             ; no last process, bail
-               ldb       #S$HUP
-               os9       F$Send              ; send signal, don't think we can do anything about an error result anyway.. so
-               bra       CkSuspnd            ; do we need to go check suspend?
-
-; put byte B in port As buffer - optimization help from Darren Atkinson       
-IRQPutCh                 
-		  ; set IRQ freq for bulk
-               lda       PollSpd1,pcr
-               lbsr      IRQsetFRQ
-               ldx       RxBufPut,u          ; point X to the data buffer
-
-; process interrupt/quit characters here
-; note we will have to do this in the multiread (ugh)
-               tfr       b,a                 ; put byte in A
-               ldb       #S$Intrpt
-               cmpa      V.INTR,u
-               beq       send@
-               ldb       #S$Abort
-               cmpa      V.QUIT,u
-               bne       store
-send@          lda       V.LPRC,u
-               beq       IRQExit
-               os9       F$Send
-               bra       IRQExit
-
-store                    
-          ; store our data byte
-               sta       ,x+                 ; store and increment buffer pointer
-
-          ; adjust RxBufPut	
-               cmpx      RxBufEnd,u          ; end of Rx buffer?
-               blo       IRQSkip1            ; no, go keep laydown pointer
-               ldx       RxBufPtr,u          ; get Rx buffer start address
-IRQSkip1       stx       RxBufPut,u          ; set new Rx data laydown pointer
-
-          ; increment RxDatLen
-               inc       RxDatLen,u
-
-CkSSig                   
-               lda       <SSigID,u           ; send signal on data ready?
-               beq       CkSuspnd
-               ldb       <SSigSg,u           ; else get signal code
-               os9       F$Send
-               clr       <SSigID,u
-               bra       IRQExit
-
-          ; check if we have a process waiting for data	
-CkSuspnd                 
-               lda       <V.WAKE,u           ; V.WAKE?
-               beq       IRQExit             ; no
-               clr       <V.WAKE,u           ; clear V.WAKE
-
-          ; wake up waiter for read
-               ifeq      Level-1
-               ldb       #S$Wake
-               os9       F$Send
-               else      
-               clrb      
-               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
-               endc      
-
-IRQExit                  
-IRQExit2       puls      cc,dp,pc            ; restore interrupts cc,dp, return
-
-               emod      
-eom            equ       *
-               end       
--- a/level1/modules/dw3mess.asm	Sun Nov 24 11:45:32 2013 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,574 +0,0 @@
-********************************************************************
-* DW3 - DriveWire 3 Low Level Subroutine Module - MESS version
-*
-* $Id$
-*
-* Edt/Rev  YYYY/MM/DD  Modified by
-* Comment
-* ------------------------------------------------------------------
-*   1      2008/01/26  Boisy G. Pitre
-* Started as a segregated subroutine module.
-*
-*   2      2010/01/20  Boisy G. Pitre
-* Added support for DWNet
-*
-*   3      2010/01/23  Aaron A. Wolfe
-* Added dynamic polling frequency
-*
-*   4     2010/04/27   Aaron A. Wolfe
-* hacked to use MESS FIFO routines
-*
-*
-               nam       DW3
-               ttl       DriveWire 3 Low Level Subroutine Module
-
-               ifp1      
-               use       defsfile
-               use       dwdefs.d
-               endc      
-
-tylg           set       Sbrtn+Objct
-atrv           set       ReEnt+rev
-rev            set       $01
-
-               mod       eom,name,tylg,atrv,start,0
-
-* irq
-IRQPckt        fcb       $00,$01,$0A         ;IRQ packet Flip(1),Mask(1),Priority(1) bytes
-* Default time packet
-DefTime        fcb       109,12,31,23,59,59
-
-* for dynamic poll frequency, number of ticks between firing poller - should we move to dwdefs?
-* speed 1 = interactive (typing)
-PollSpd1       fcb       3
-* speed 2 = bulk transfer (depending on how much processing needs to be done to incoming stream, 5-8 seems good)
-PollSpd2       fcb       6
-* speed 3 = idle 
-PollSpd3       fcb       40
-* X pollidle -> drop to next slower rate
-PollIdle       fcb       60
-
-
-name           fcs       /dw3/
-
-* DriveWire subroutine entry table
-start          lbra      Init
-               bra       Read
-               nop       
-               lbra      Write
-
-* Term
-*
-* Entry:
-*    U  = address of device memory area
-*
-* Exit:
-*    CC = carry set on error
-*    B  = error code
-*
-Term                     
-               clrb                          clear Carry
-               rts       
-
-* Read
-*
-*  ON ENTRY:
-*    X = ADDRESS OF THE RECEIVE BUFFER
-*    A = TIMEOUT VALUE (182 = APPROX ONE SECOND @ 0.89 MHz)
-*
-*  ON EXIT:
-*    Y = DATA CHECKSUM
-*    D = ACTUAL NUMBER OF BYTES RECEIVED
-*    X AND U ARE PRESERVED
-*    CC.CARRY IS SET IF A FRAMING ERROR WAS DETECTED
-*
-Read                     
-               use       dwrdmess.asm
-
-* Write
-*
-* Entry:
-Write                    
-               use       dwwrmess.asm
-
-* Init
-*
-* Entry:
-*    Y  = address of device descriptor
-*    U  = address of device memory area
-*
-* Exit:
-*    CC = carry set on error
-*    B  = error code
-*
-* Initialize the serial device
-Init                     
-               clrb                          clear Carry
-               pshs      y,x,cc              then push CC on stack
-               orcc      #IntMasks
-* no init for bitbanger in mess
-*               ldx       #PIA1Base           $FF20
-*               clr       1,x                 clear CD
-*               lda       #%11111110
-*               sta       ,x
-*               lda       #%00110100
-*               sta       1,x
-*               lda       ,x
-
-; allocate DW statics page
-               pshs      u
-               ldd       #$0100
-               os9       F$SRqMem
-               tfr       u,x
-               puls      u
-               lbcs      InitEx
-               ifgt      Level-1
-               stx       <D.DWStat
-               else      
-               stx       >D.DWStat
-               endc      
-; clear out 256 byte page at X
-               clrb      
-loop@          clr       ,x+
-               decb      
-               bne       loop@
-
-* send OP_DWINIT
-         ; setup DWsub command
-               pshs      u
-               ldb		 #1					 ; DRIVER VERSION
-               lda       #OP_DWINIT          ; load command
-               pshs      d                   ; command store on stack
-               leax      ,s                  ; point X to stack 
-               ldy       #2                  ; 1 byte to send
-               ifgt      Level-1
-               ldu       <D.DWSubAddr
-               else      
-               ldu       >D.DWSubAddr
-               endc      
-               jsr       6,u                 ; call DWrite
-               leas      1,s                 ; leave one byte on stack for response 
-               
-               ; read protocol version response, 1 byte
-               leax      ,s                  ; point X to stack head
-               ldy       #1                  ; 1 byte to retrieve
-               jsr       3,u                 ; call DWRead
-               beq       InstIRQ             ; branch if no error
-               leas      3,s                 ; error, cleanup stack (u and 1 byte from read) 
-               lbra      InitEx            	 ; don't install IRQ handler
-
-* install ISR
-InstIRQ                  
-			   puls      a,u		; a has proto version from server.. not used yet
-
-			   ifgt      Level-1
-               ldx       <D.DWStat
-               else      
-               ldx       >D.DWStat
-               endc      
-               leax      DW.VIRQPkt,x
-               pshs      u
-               tfr       x,u
-               leax      Vi.Stat,x           ;fake VIRQ status register
-               lda       #$80                ;VIRQ flag clear, repeated VIRQs
-               sta       ,x                  ;set it while we're here...
-               tfr       x,d                 ;copy fake VIRQ status register address
-               leax      IRQPckt,pcr         ;IRQ polling packet
-               leay      IRQSvc,pcr          ;IRQ service entry
-               os9       F$IRQ               ;install
-               puls      u
-               bcs       InitEx              ;exit with error
-               clra      
-               ldb       PollSpd3,pcr        ; start at idle
-               ifgt      Level-1
-               ldx       <D.DWStat
-               else      
-               ldx       >D.DWStat
-               endc      
-               leax      DW.VIRQPkt,x
-               std       Vi.Rst,x            ; reset count
-               tfr       x,y                 ; move VIRQ software packet to Y
-tryagain                 
-               ldx       #$0001              ; code to install new VIRQ
-               os9       F$VIRQ              ; install
-               bcc       IRQok               ; no error, continue
-               cmpb      #E$UnkSvc
-               bne       InitEx
-; if we get an E$UnkSvc error, then clock has not been initialized, so do it here
-               leax      DefTime,pcr
-               os9       F$STime
-               bra       tryagain            ; note: this has the slim potential of looping forever
-IRQok                    
-               ifgt      Level-1
-               ldx       <D.DWStat
-               else      
-               ldx       >D.DWStat
-               endc      
-; cheat: we know DW.StatTbl is at offset $00 from D.DWStat, do not bother with leax
-               leax      DW.StatTbl,x
-               tfr       u,d
-               ldb       <V.PORT+1,u         ; get our port #
-               sta       b,x                 ; store in table
-
-InitEx                   
-               puls      cc,x,y,pc
-
-
-; ***********************************************************************
-; Interrupt handler  - Much help from Darren Atkinson
-
-IRQMulti3      anda      #$0F                ; mask first 4 bits, a is now port #+1
-               deca                          ; we pass +1 to use 0 for no data
-               pshs      a                   ; save port #
-               cmpb      RxGrab,u            ; compare room in buffer to server's byte
-               bhs       IRQM06              ; room left >= server's bytes, no problem
-
-               stb       RxGrab,u            ; else replace with room left in our buffer
-
-          ; also limit to end of buffer
-IRQM06         ldd       RxBufEnd,u          ; end addr of buffer
-               subd      RxBufPut,u          ; subtract current write pointer, result is # bytes left going forward in buff.
-
-IRQM05         cmpb      RxGrab,u            ; compare b (room left) to grab bytes  
-               bhs       IRQM03              ; branch if we have room for grab bytes
-
-               stb       RxGrab,u            ; else set grab to room left
-
-          ; send multiread req
-IRQM03         puls      a                   ; port # is on stack
-               ldb       RxGrab,u
-
-               pshs      u
-
-          ; setup DWsub command
-               pshs      d                   ; (a port, b bytes)
-               lda       #OP_SERREADM        ; load command
-               pshs      a                   ; command store on stack
-               leax      ,s                  ; point X to stack 
-               ldy       #3                  ; 3 bytes to send
-
-               ifgt      Level-1
-               ldu       <D.DWSubAddr
-               else      
-               ldu       >D.DWSubAddr
-               endc      
-               jsr       6,u                 ; call DWrite
-
-               leas      3,s                 ; clean 3 DWsub args from stack 
-
-               ldx       ,s                  ; pointer to this port's area (from U prior), leave it on stack
-               ldb       RxGrab,x            ; set B to grab bytes
-               clra                          ; 0 in high byte		
-               tfr       d,y                 ; set # bytes for DW
-
-               ldx       RxBufPut,x          ; point X to insert position in this port's buffer
-          ; receive response
-               jsr       3,u                 ; call DWRead
-          ; handle errors?
-
-
-               puls      u
-               ldb       RxGrab,u            ; our grab bytes
-
-          ; set new RxBufPut
-               ldx       RxBufPut,u          ; current write pointer
-               abx                           ; add b (# bytes) to RxBufPut
-               cmpx      RxBufEnd,u          ; end of Rx buffer?
-               blo       IRQM04              ; no, go keep laydown pointer
-               ldx       RxBufPtr,u          ; get Rx buffer start address
-IRQM04         stx       RxBufPut,u          ; set new Rx data laydown pointer
-
-          ; set new RxDatLen
-               ldb       RxDatLen,u
-               addb      RxGrab,u
-               stb       RxDatLen,u          ; store new value
-
-               lbra      CkSSig              ; had to lbra
-
-IRQMulti                 
-		  ; set IRQ freq for bulk
-               pshs      a
-               lda       PollSpd2,pcr
-               lbsr      IRQsetFRQ
-               puls      a
-
-          ; initial grab bytes
-               stb       RxGrab,u
-
-          ; limit server bytes to bufsize - datlen
-               ldb       RxBufSiz,u          ; size of buffer
-               subb      RxDatLen,u          ; current bytes in buffer
-               bne       IRQMulti3           ; continue, we have some space in buffer
-          ; no room in buffer
-               tstb      
-               lbne      CkSSig              ;had to lbra
-               lbra      IRQExit             ;had to lbra
-
-
-; **** IRQ ENTRY POINT
-IRQSvc         equ       *
-               pshs      cc,dp               ; save system cc,DP
-               orcc      #IntMasks           ; mask interrupts
-
-          ; mark VIRQ handled (note U is pointer to our VIRQ packet in DP)
-               lda       Vi.Stat,u           ; VIRQ status register
-               anda      #^Vi.IFlag          ; clear flag in VIRQ status register
-               sta       Vi.Stat,u           ; save it...
-
-          ; poll server for incoming serial data
-
-          ; send request
-               lda       #OP_SERREAD         ; load command
-               pshs      a                   ; command store on stack
-               leax      ,s                  ; point X to stack 
-               ldy       #1                  ; 1 byte to send
-
-               ifgt      Level-1
-               ldu       <D.DWSubAddr
-               else      
-               ldu       >D.DWSubAddr
-               endc      
-               jsr       6,u                 ; call DWrite
-
-          ; receive response
-               leas      -1,s                ; one more byte to fit response
-               leax      ,s                  ; point X to stack head
-               ldy       #2                  ; 2 bytes to retrieve
-               jsr       3,u                 ; call DWRead
-               beq       IRQSvc2             ; branch if no error
-               leas      2,s                 ; error, cleanup stack 2
-               lbra      IRQExit2            ; don't reset error count on the way out
-
-          ; process response	
-IRQSvc2                  
-               ldd       ,s++                ; pull returned status byte into A,data into B (set Z if zero, N if multiread)
-               bne       IRQGotOp            ; branch if D != 0 (something to do)
-* this is a NOP response.. do we need to reschedule
-               ifgt      Level-1
-               ldx       <D.DWStat
-               else      
-               ldx       >D.DWStat
-               endc      
-               lda       DW.VIRQPkt+Vi.Rst+1,x
-               cmpa      PollSpd3,pcr
-               lbeq      IRQExit             ;we are already at idle speed
-
-               lda       DW.VIRQNOP,x
-               inca      
-               cmpa      PollIdle,pcr
-               beq       FRQdown
-
-               sta       DW.VIRQNOP,x        ;inc NOP count, exit
-               lbra      IRQExit
-
-FRQdown        lda       DW.VIRQPkt+Vi.Rst+1,x
-               cmpa      PollSpd1,pcr
-               beq       FRQd1
-               lda       PollSpd3,pcr
-FRQd2                    
-               sta       DW.VIRQPkt+Vi.Rst+1,x
-               clr       DW.VIRQNOP,x
-               lbra      IRQExit
-FRQd1          lda       PollSpd2,pcr
-               bra       FRQd2
-
-; save back D on stack and build our U
-IRQGotOp       pshs      d
-          * mode switch on bits 7+6 of A: 00 = vserial, 01 = system, 10 = wirebug?, 11 = ?							
-               anda      #$C0                ; mask last 6 bits
-               beq       mode00              ; virtual serial mode
-          					; future - handle other modes
-               lbra      IRQExit             ; for now, bail
-
-mode00         lda       ,s                  ; restore A		  
-               anda      #$0F                ; mask first 4 bits, a is now port #+1
-               beq       IRQCont             ; if we're here with 0 in the port, its not really a port # (can we jump straight to status?)
-               deca                          ; we pass +1 to use 0 for no data
-; here we set U to the static storage area of the device we are working with
-               ifgt      Level-1
-               ldx       <D.DWStat
-               else      
-               ldx       >D.DWStat
-               endc      
-; cheat: we know DW.StatTbl is at offset $00 from D.DWStat, do not bother with leax
-;			leax    DW.StatTbl,x
-               lda       a,x
-               bne       IRQCont             ; if A is 0, then this device is not active, so exit
-               puls      d
-               lbra      IRQExit
-IRQCont                  
-               clrb      
-               tfr       d,u
-
-               puls      d
-
-          * multiread/status flag is in bit 4 of A
-               bita      #$10
-               beq       IRQPutch            ; branch for read1 if multiread not set
-
-          * all 0s in port means status, anything else is multiread
-
-               bita      #$0F                ;mask bit 7-4
-               beq       dostat              ;port # all 0, this is a status response
-               lbra      IRQMulti            ;its not all 0, this is a multiread
-
-
-		 * in status events, databyte is split, 4bits status, 4bits port #          
-dostat         bitb      #$F0                ;mask low bits
-               lbne      IRQExit             ;we only implement code 0000, term
-			* set u to port #
-               ifgt      Level-1
-               ldx       <D.DWStat
-               else      
-               ldx       >D.DWStat
-               endc      
-               lda       b,x
-               bne       statcont            ; if A is 0, then this device is not active, so exit
-               lbra      IRQExit
-
-* IRQ set freq routine
-* sets freq and clears NOP counter
-* a = desired IRQ freq
-IRQsetFRQ      pshs      x                   ; preserve
-               ifgt      Level-1
-               ldx       <D.DWStat
-               else      
-               ldx       >D.DWStat
-               endc      
-               sta       DW.VIRQPkt+Vi.Rst+1,x
-* +++ BGP +++ added following line so that the counter (which was copied by
-* clock before calling us) gets reset to the same value the reset value. Without
-* this line, we get called again with the PRIOR Vi.Rst value.
-               sta       DW.VIRQPkt+Vi.Cnt+1,x
-               clr       DW.VIRQNOP,x
-               puls      x
-               rts       
-
-
-* This routine roots through process descriptors in a queue and
-* checks to see if the process has a path that is open to the device
-* represented by the static storage pointer in U. if so, the S$HUP
-* signal is sent to that process
-*
-* Entry: X = process descriptor to evaluate
-*        U = static storage of device we want to check against
-RootThrough              
-               ldb       #NumPaths
-               leay      P$Path,x
-               pshs      x
-loop           decb      
-               bmi       out
-               lda       ,y+
-               beq       loop
-               pshs      y
-               ifgt      Level-1
-               ldx       <D.PthDBT
-               else      
-               ldx       >D.PthDBT
-               endc      
-               os9       F$Find64
-               ldx       PD.DEV,y
-               leax      V$STAT,x
-               puls      y
-               bcs       out
-
-               cmpu      ,x
-               bne       loop
-
-               ldx       ,s
-               lda       P$ID,x
-               ldb       #S$HUP
-               os9       F$Send
-
-out            puls      x
-               ldx       P$Queue,x
-               bne       RootThrough
-               rts       
-
-statcont       clrb      
-               tfr       d,u
-* NEW: root through all process descriptors. if any has a path open to this
-* device, send then S$HUP
-               ldx       <D.AProcQ
-               beq       dowaitq
-               bsr       RootThrough
-dowaitq        ldx       <D.WProcQ
-               beq       dosleepq
-               bsr       RootThrough
-dosleepq       ldx       <D.SProcQ
-               beq       CkLPRC
-               bsr       RootThrough
-
-CkLPRC                   
-               lda       <V.LPRC,u
-               beq       IRQExit             ; no last process, bail
-               ldb       #S$HUP
-               os9       F$Send              ; send signal, don't think we can do anything about an error result anyway.. so
-               bra       CkSuspnd            ; do we need to go check suspend?
-
-; put byte B in port As buffer - optimization help from Darren Atkinson       
-IRQPutCh                 
-		  ; set IRQ freq for bulk
-               lda       PollSpd1,pcr
-               lbsr      IRQsetFRQ
-               ldx       RxBufPut,u          ; point X to the data buffer
-
-; process interrupt/quit characters here
-; note we will have to do this in the multiread (ugh)
-               tfr       b,a                 ; put byte in A
-               ldb       #S$Intrpt
-               cmpa      V.INTR,u
-               beq       send@
-               ldb       #S$Abort
-               cmpa      V.QUIT,u
-               bne       store
-send@          lda       V.LPRC,u
-               beq       IRQExit
-               os9       F$Send
-               bra       IRQExit
-
-store                    
-          ; store our data byte
-               sta       ,x+                 ; store and increment buffer pointer
-
-          ; adjust RxBufPut	
-               cmpx      RxBufEnd,u          ; end of Rx buffer?
-               blo       IRQSkip1            ; no, go keep laydown pointer
-               ldx       RxBufPtr,u          ; get Rx buffer start address
-IRQSkip1       stx       RxBufPut,u          ; set new Rx data laydown pointer
-
-          ; increment RxDatLen
-               inc       RxDatLen,u
-
-CkSSig                   
-               lda       <SSigID,u           ; send signal on data ready?
-               beq       CkSuspnd
-               ldb       <SSigSg,u           ; else get signal code
-               os9       F$Send
-               clr       <SSigID,u
-               bra       IRQExit
-
-          ; check if we have a process waiting for data	
-CkSuspnd                 
-               lda       <V.WAKE,u           ; V.WAKE?
-               beq       IRQExit             ; no
-               clr       <V.WAKE,u           ; clear V.WAKE
-
-          ; wake up waiter for read
-               ifeq      Level-1
-               ldb       #S$Wake
-               os9       F$Send
-               else      
-               clrb      
-               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
-               endc      
-
-IRQExit                  
-IRQExit2       puls      cc,dp,pc            ; restore interrupts cc,dp, return
-
-               emod      
-eom            equ       *
-               end       
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/modules/dwmess.asm	Sun Nov 24 12:07:31 2013 +0100
@@ -0,0 +1,574 @@
+********************************************************************
+* DW3 - DriveWire 3 Low Level Subroutine Module - MESS version
+*
+* $Id$
+*
+* Edt/Rev  YYYY/MM/DD  Modified by
+* Comment
+* ------------------------------------------------------------------
+*   1      2008/01/26  Boisy G. Pitre
+* Started as a segregated subroutine module.
+*
+*   2      2010/01/20  Boisy G. Pitre
+* Added support for DWNet
+*
+*   3      2010/01/23  Aaron A. Wolfe
+* Added dynamic polling frequency
+*
+*   4     2010/04/27   Aaron A. Wolfe
+* hacked to use MESS FIFO routines
+*
+*
+               nam       DW3
+               ttl       DriveWire 3 Low Level Subroutine Module
+
+               ifp1      
+               use       defsfile
+               use       dwdefs.d
+               endc      
+
+tylg           set       Sbrtn+Objct
+atrv           set       ReEnt+rev
+rev            set       $01
+
+               mod       eom,name,tylg,atrv,start,0
+
+* irq
+IRQPckt        fcb       $00,$01,$0A         ;IRQ packet Flip(1),Mask(1),Priority(1) bytes
+* Default time packet
+DefTime        fcb       109,12,31,23,59,59
+
+* for dynamic poll frequency, number of ticks between firing poller - should we move to dwdefs?
+* speed 1 = interactive (typing)
+PollSpd1       fcb       3
+* speed 2 = bulk transfer (depending on how much processing needs to be done to incoming stream, 5-8 seems good)
+PollSpd2       fcb       6
+* speed 3 = idle 
+PollSpd3       fcb       40
+* X pollidle -> drop to next slower rate
+PollIdle       fcb       60
+
+
+name           fcs       /dw3/
+
+* DriveWire subroutine entry table
+start          lbra      Init
+               bra       Read
+               nop       
+               lbra      Write
+
+* Term
+*
+* Entry:
+*    U  = address of device memory area
+*
+* Exit:
+*    CC = carry set on error
+*    B  = error code
+*
+Term                     
+               clrb                          clear Carry
+               rts       
+
+* Read
+*
+*  ON ENTRY:
+*    X = ADDRESS OF THE RECEIVE BUFFER
+*    A = TIMEOUT VALUE (182 = APPROX ONE SECOND @ 0.89 MHz)
+*
+*  ON EXIT:
+*    Y = DATA CHECKSUM
+*    D = ACTUAL NUMBER OF BYTES RECEIVED
+*    X AND U ARE PRESERVED
+*    CC.CARRY IS SET IF A FRAMING ERROR WAS DETECTED
+*
+Read                     
+               use       dwrdmess.asm
+
+* Write
+*
+* Entry:
+Write                    
+               use       dwwrmess.asm
+
+* Init
+*
+* Entry:
+*    Y  = address of device descriptor
+*    U  = address of device memory area
+*
+* Exit:
+*    CC = carry set on error
+*    B  = error code
+*
+* Initialize the serial device
+Init                     
+               clrb                          clear Carry
+               pshs      y,x,cc              then push CC on stack
+               orcc      #IntMasks
+* no init for bitbanger in mess
+*               ldx       #PIA1Base           $FF20
+*               clr       1,x                 clear CD
+*               lda       #%11111110
+*               sta       ,x
+*               lda       #%00110100
+*               sta       1,x
+*               lda       ,x
+
+; allocate DW statics page
+               pshs      u
+               ldd       #$0100
+               os9       F$SRqMem
+               tfr       u,x
+               puls      u
+               lbcs      InitEx
+               ifgt      Level-1
+               stx       <D.DWStat
+               else      
+               stx       >D.DWStat
+               endc      
+; clear out 256 byte page at X
+               clrb      
+loop@          clr       ,x+
+               decb      
+               bne       loop@
+
+* send OP_DWINIT
+         ; setup DWsub command
+               pshs      u
+               ldb		 #1					 ; DRIVER VERSION
+               lda       #OP_DWINIT          ; load command
+               pshs      d                   ; command store on stack
+               leax      ,s                  ; point X to stack 
+               ldy       #2                  ; 1 byte to send
+               ifgt      Level-1
+               ldu       <D.DWSubAddr
+               else      
+               ldu       >D.DWSubAddr
+               endc      
+               jsr       6,u                 ; call DWrite
+               leas      1,s                 ; leave one byte on stack for response 
+               
+               ; read protocol version response, 1 byte
+               leax      ,s                  ; point X to stack head
+               ldy       #1                  ; 1 byte to retrieve
+               jsr       3,u                 ; call DWRead
+               beq       InstIRQ             ; branch if no error
+               leas      3,s                 ; error, cleanup stack (u and 1 byte from read) 
+               lbra      InitEx            	 ; don't install IRQ handler
+
+* install ISR
+InstIRQ                  
+			   puls      a,u		; a has proto version from server.. not used yet
+
+			   ifgt      Level-1
+               ldx       <D.DWStat
+               else      
+               ldx       >D.DWStat
+               endc      
+               leax      DW.VIRQPkt,x
+               pshs      u
+               tfr       x,u
+               leax      Vi.Stat,x           ;fake VIRQ status register
+               lda       #$80                ;VIRQ flag clear, repeated VIRQs
+               sta       ,x                  ;set it while we're here...
+               tfr       x,d                 ;copy fake VIRQ status register address
+               leax      IRQPckt,pcr         ;IRQ polling packet
+               leay      IRQSvc,pcr          ;IRQ service entry
+               os9       F$IRQ               ;install
+               puls      u
+               bcs       InitEx              ;exit with error
+               clra      
+               ldb       PollSpd3,pcr        ; start at idle
+               ifgt      Level-1
+               ldx       <D.DWStat
+               else      
+               ldx       >D.DWStat
+               endc      
+               leax      DW.VIRQPkt,x
+               std       Vi.Rst,x            ; reset count
+               tfr       x,y                 ; move VIRQ software packet to Y
+tryagain                 
+               ldx       #$0001              ; code to install new VIRQ
+               os9       F$VIRQ              ; install
+               bcc       IRQok               ; no error, continue
+               cmpb      #E$UnkSvc
+               bne       InitEx
+; if we get an E$UnkSvc error, then clock has not been initialized, so do it here
+               leax      DefTime,pcr
+               os9       F$STime
+               bra       tryagain            ; note: this has the slim potential of looping forever
+IRQok                    
+               ifgt      Level-1
+               ldx       <D.DWStat
+               else      
+               ldx       >D.DWStat
+               endc      
+; cheat: we know DW.StatTbl is at offset $00 from D.DWStat, do not bother with leax
+               leax      DW.StatTbl,x
+               tfr       u,d
+               ldb       <V.PORT+1,u         ; get our port #
+               sta       b,x                 ; store in table
+
+InitEx                   
+               puls      cc,x,y,pc
+
+
+; ***********************************************************************
+; Interrupt handler  - Much help from Darren Atkinson
+
+IRQMulti3      anda      #$0F                ; mask first 4 bits, a is now port #+1
+               deca                          ; we pass +1 to use 0 for no data
+               pshs      a                   ; save port #
+               cmpb      RxGrab,u            ; compare room in buffer to server's byte
+               bhs       IRQM06              ; room left >= server's bytes, no problem
+
+               stb       RxGrab,u            ; else replace with room left in our buffer
+
+          ; also limit to end of buffer
+IRQM06         ldd       RxBufEnd,u          ; end addr of buffer
+               subd      RxBufPut,u          ; subtract current write pointer, result is # bytes left going forward in buff.
+
+IRQM05         cmpb      RxGrab,u            ; compare b (room left) to grab bytes  
+               bhs       IRQM03              ; branch if we have room for grab bytes
+
+               stb       RxGrab,u            ; else set grab to room left
+
+          ; send multiread req
+IRQM03         puls      a                   ; port # is on stack
+               ldb       RxGrab,u
+
+               pshs      u
+
+          ; setup DWsub command
+               pshs      d                   ; (a port, b bytes)
+               lda       #OP_SERREADM        ; load command
+               pshs      a                   ; command store on stack
+               leax      ,s                  ; point X to stack 
+               ldy       #3                  ; 3 bytes to send
+
+               ifgt      Level-1
+               ldu       <D.DWSubAddr
+               else      
+               ldu       >D.DWSubAddr
+               endc      
+               jsr       6,u                 ; call DWrite
+
+               leas      3,s                 ; clean 3 DWsub args from stack 
+
+               ldx       ,s                  ; pointer to this port's area (from U prior), leave it on stack
+               ldb       RxGrab,x            ; set B to grab bytes
+               clra                          ; 0 in high byte		
+               tfr       d,y                 ; set # bytes for DW
+
+               ldx       RxBufPut,x          ; point X to insert position in this port's buffer
+          ; receive response
+               jsr       3,u                 ; call DWRead
+          ; handle errors?
+
+
+               puls      u
+               ldb       RxGrab,u            ; our grab bytes
+
+          ; set new RxBufPut
+               ldx       RxBufPut,u          ; current write pointer
+               abx                           ; add b (# bytes) to RxBufPut
+               cmpx      RxBufEnd,u          ; end of Rx buffer?
+               blo       IRQM04              ; no, go keep laydown pointer
+               ldx       RxBufPtr,u          ; get Rx buffer start address
+IRQM04         stx       RxBufPut,u          ; set new Rx data laydown pointer
+
+          ; set new RxDatLen
+               ldb       RxDatLen,u
+               addb      RxGrab,u
+               stb       RxDatLen,u          ; store new value
+
+               lbra      CkSSig              ; had to lbra
+
+IRQMulti                 
+		  ; set IRQ freq for bulk
+               pshs      a
+               lda       PollSpd2,pcr
+               lbsr      IRQsetFRQ
+               puls      a
+
+          ; initial grab bytes
+               stb       RxGrab,u
+
+          ; limit server bytes to bufsize - datlen
+               ldb       RxBufSiz,u          ; size of buffer
+               subb      RxDatLen,u          ; current bytes in buffer
+               bne       IRQMulti3           ; continue, we have some space in buffer
+          ; no room in buffer
+               tstb      
+               lbne      CkSSig              ;had to lbra
+               lbra      IRQExit             ;had to lbra
+
+
+; **** IRQ ENTRY POINT
+IRQSvc         equ       *
+               pshs      cc,dp               ; save system cc,DP
+               orcc      #IntMasks           ; mask interrupts
+
+          ; mark VIRQ handled (note U is pointer to our VIRQ packet in DP)
+               lda       Vi.Stat,u           ; VIRQ status register
+               anda      #^Vi.IFlag          ; clear flag in VIRQ status register
+               sta       Vi.Stat,u           ; save it...
+
+          ; poll server for incoming serial data
+
+          ; send request
+               lda       #OP_SERREAD         ; load command
+               pshs      a                   ; command store on stack
+               leax      ,s                  ; point X to stack 
+               ldy       #1                  ; 1 byte to send
+
+               ifgt      Level-1
+               ldu       <D.DWSubAddr
+               else      
+               ldu       >D.DWSubAddr
+               endc      
+               jsr       6,u                 ; call DWrite
+
+          ; receive response
+               leas      -1,s                ; one more byte to fit response
+               leax      ,s                  ; point X to stack head
+               ldy       #2                  ; 2 bytes to retrieve
+               jsr       3,u                 ; call DWRead
+               beq       IRQSvc2             ; branch if no error
+               leas      2,s                 ; error, cleanup stack 2
+               lbra      IRQExit2            ; don't reset error count on the way out
+
+          ; process response	
+IRQSvc2                  
+               ldd       ,s++                ; pull returned status byte into A,data into B (set Z if zero, N if multiread)
+               bne       IRQGotOp            ; branch if D != 0 (something to do)
+* this is a NOP response.. do we need to reschedule
+               ifgt      Level-1
+               ldx       <D.DWStat
+               else      
+               ldx       >D.DWStat
+               endc      
+               lda       DW.VIRQPkt+Vi.Rst+1,x
+               cmpa      PollSpd3,pcr
+               lbeq      IRQExit             ;we are already at idle speed
+
+               lda       DW.VIRQNOP,x
+               inca      
+               cmpa      PollIdle,pcr
+               beq       FRQdown
+
+               sta       DW.VIRQNOP,x        ;inc NOP count, exit
+               lbra      IRQExit
+
+FRQdown        lda       DW.VIRQPkt+Vi.Rst+1,x
+               cmpa      PollSpd1,pcr
+               beq       FRQd1
+               lda       PollSpd3,pcr
+FRQd2                    
+               sta       DW.VIRQPkt+Vi.Rst+1,x
+               clr       DW.VIRQNOP,x
+               lbra      IRQExit
+FRQd1          lda       PollSpd2,pcr
+               bra       FRQd2
+
+; save back D on stack and build our U
+IRQGotOp       pshs      d
+          * mode switch on bits 7+6 of A: 00 = vserial, 01 = system, 10 = wirebug?, 11 = ?							
+               anda      #$C0                ; mask last 6 bits
+               beq       mode00              ; virtual serial mode
+          					; future - handle other modes
+               lbra      IRQExit             ; for now, bail
+
+mode00         lda       ,s                  ; restore A		  
+               anda      #$0F                ; mask first 4 bits, a is now port #+1
+               beq       IRQCont             ; if we're here with 0 in the port, its not really a port # (can we jump straight to status?)
+               deca                          ; we pass +1 to use 0 for no data
+; here we set U to the static storage area of the device we are working with
+               ifgt      Level-1
+               ldx       <D.DWStat
+               else      
+               ldx       >D.DWStat
+               endc      
+; cheat: we know DW.StatTbl is at offset $00 from D.DWStat, do not bother with leax
+;			leax    DW.StatTbl,x
+               lda       a,x
+               bne       IRQCont             ; if A is 0, then this device is not active, so exit
+               puls      d
+               lbra      IRQExit
+IRQCont                  
+               clrb      
+               tfr       d,u
+
+               puls      d
+
+          * multiread/status flag is in bit 4 of A
+               bita      #$10
+               beq       IRQPutch            ; branch for read1 if multiread not set
+
+          * all 0s in port means status, anything else is multiread
+
+               bita      #$0F                ;mask bit 7-4
+               beq       dostat              ;port # all 0, this is a status response
+               lbra      IRQMulti            ;its not all 0, this is a multiread
+
+
+		 * in status events, databyte is split, 4bits status, 4bits port #          
+dostat         bitb      #$F0                ;mask low bits
+               lbne      IRQExit             ;we only implement code 0000, term
+			* set u to port #
+               ifgt      Level-1
+               ldx       <D.DWStat
+               else      
+               ldx       >D.DWStat
+               endc      
+               lda       b,x
+               bne       statcont            ; if A is 0, then this device is not active, so exit
+               lbra      IRQExit
+
+* IRQ set freq routine
+* sets freq and clears NOP counter
+* a = desired IRQ freq
+IRQsetFRQ      pshs      x                   ; preserve
+               ifgt      Level-1
+               ldx       <D.DWStat
+               else      
+               ldx       >D.DWStat
+               endc      
+               sta       DW.VIRQPkt+Vi.Rst+1,x
+* +++ BGP +++ added following line so that the counter (which was copied by
+* clock before calling us) gets reset to the same value the reset value. Without
+* this line, we get called again with the PRIOR Vi.Rst value.
+               sta       DW.VIRQPkt+Vi.Cnt+1,x
+               clr       DW.VIRQNOP,x
+               puls      x
+               rts       
+
+
+* This routine roots through process descriptors in a queue and
+* checks to see if the process has a path that is open to the device
+* represented by the static storage pointer in U. if so, the S$HUP
+* signal is sent to that process
+*
+* Entry: X = process descriptor to evaluate
+*        U = static storage of device we want to check against
+RootThrough              
+               ldb       #NumPaths
+               leay      P$Path,x
+               pshs      x
+loop           decb      
+               bmi       out
+               lda       ,y+
+               beq       loop
+               pshs      y
+               ifgt      Level-1
+               ldx       <D.PthDBT
+               else      
+               ldx       >D.PthDBT
+               endc      
+               os9       F$Find64
+               ldx       PD.DEV,y
+               leax      V$STAT,x
+               puls      y
+               bcs       out
+
+               cmpu      ,x
+               bne       loop
+
+               ldx       ,s
+               lda       P$ID,x
+               ldb       #S$HUP
+               os9       F$Send
+
+out            puls      x
+               ldx       P$Queue,x
+               bne       RootThrough
+               rts       
+
+statcont       clrb      
+               tfr       d,u
+* NEW: root through all process descriptors. if any has a path open to this
+* device, send then S$HUP
+               ldx       <D.AProcQ
+               beq       dowaitq
+               bsr       RootThrough
+dowaitq        ldx       <D.WProcQ
+               beq       dosleepq
+               bsr       RootThrough
+dosleepq       ldx       <D.SProcQ
+               beq       CkLPRC
+               bsr       RootThrough
+
+CkLPRC                   
+               lda       <V.LPRC,u
+               beq       IRQExit             ; no last process, bail
+               ldb       #S$HUP
+               os9       F$Send              ; send signal, don't think we can do anything about an error result anyway.. so
+               bra       CkSuspnd            ; do we need to go check suspend?
+
+; put byte B in port As buffer - optimization help from Darren Atkinson       
+IRQPutCh                 
+		  ; set IRQ freq for bulk
+               lda       PollSpd1,pcr
+               lbsr      IRQsetFRQ
+               ldx       RxBufPut,u          ; point X to the data buffer
+
+; process interrupt/quit characters here
+; note we will have to do this in the multiread (ugh)
+               tfr       b,a                 ; put byte in A
+               ldb       #S$Intrpt
+               cmpa      V.INTR,u
+               beq       send@
+               ldb       #S$Abort
+               cmpa      V.QUIT,u
+               bne       store
+send@          lda       V.LPRC,u
+               beq       IRQExit
+               os9       F$Send
+               bra       IRQExit
+
+store                    
+          ; store our data byte
+               sta       ,x+                 ; store and increment buffer pointer
+
+          ; adjust RxBufPut	
+               cmpx      RxBufEnd,u          ; end of Rx buffer?
+               blo       IRQSkip1            ; no, go keep laydown pointer
+               ldx       RxBufPtr,u          ; get Rx buffer start address
+IRQSkip1       stx       RxBufPut,u          ; set new Rx data laydown pointer
+
+          ; increment RxDatLen
+               inc       RxDatLen,u
+
+CkSSig                   
+               lda       <SSigID,u           ; send signal on data ready?
+               beq       CkSuspnd
+               ldb       <SSigSg,u           ; else get signal code
+               os9       F$Send
+               clr       <SSigID,u
+               bra       IRQExit
+
+          ; check if we have a process waiting for data	
+CkSuspnd                 
+               lda       <V.WAKE,u           ; V.WAKE?
+               beq       IRQExit             ; no
+               clr       <V.WAKE,u           ; clear V.WAKE
+
+          ; wake up waiter for read
+               ifeq      Level-1
+               ldb       #S$Wake
+               os9       F$Send
+               else      
+               clrb      
+               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
+               endc      
+
+IRQExit                  
+IRQExit2       puls      cc,dp,pc            ; restore interrupts cc,dp, return
+
+               emod      
+eom            equ       *
+               end       
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/modules/rbdw.asm	Sun Nov 24 12:07:31 2013 +0100
@@ -0,0 +1,448 @@
+********************************************************************
+* rbdw3 - DriveWire 3 driver
+*
+* $Id$
+*
+* This driver works in conjuction with the DriveWire Server on Linux,
+* Mac or Windows, providing the CoCo with pseudo-disk access through
+* the serial port.
+*
+* It adheres to the DriveWire Version 3 Protocol.
+*
+* The baud rate is set at 115200 and the communications requirements
+* are set to 8-N-1.  For OS-9 Level One on a CoCo 2, the baud rate
+* is 57600.
+*
+* Edt/Rev  YYYY/MM/DD  Modified by
+* Comment
+* ------------------------------------------------------------------
+*   1      2008/02/08  Boisy G. Pitre
+* Started from drivewire.asm in DriveWire 2 Product folder.
+*
+*   2      2008/04/22  Boisy G. Pitre
+* Verified working operation on a CoCo 3 running NitrOS-9/6809 Level 1 @ 57.6Kbps
+*
+*   3      2009/03/09  Boisy G. Pitre
+* Added checks for size after reading as noted by Darren A's email.
+*
+*   4      2009/12/31  Boisy G. Pitre
+* Fixed a crash in Term by adding a check for DWSubAddr of $0000 
+* (possible if Init fails due to subroutine module not being in
+*  memory and I$Detach calls Term)
+
+         nam   rbdw3
+         ttl   DriveWire 3 driver
+
+NUMRETRIES equ  8
+
+         ifp1
+         use   defsfile
+         use   drivewire.d
+         endc
+
+NumDrvs  set   4
+
+tylg     set   Drivr+Objct   
+atrv     set   ReEnt+rev
+rev      set   $01
+edition  set   4
+
+         mod   eom,name,tylg,atrv,start,size
+
+         rmb   DRVBEG+(DRVMEM*NumDrvs)
+driveno  rmb   1
+retries  rmb   1
+size     equ   .
+
+         fcb   DIR.+SHARE.+PEXEC.+PREAD.+PWRIT.+EXEC.+UPDAT.
+
+name     fcs   /rbdw3/
+         fcb   edition
+
+start    bra   Init
+         nop
+         bra   Read
+         nop
+         lbra  Write
+         lbra  GetStat
+         lbra  SetStat
+
+* Term
+*
+* Entry:
+*    U  = address of device memory area
+*
+* Exit:
+*    CC = carry set on error
+*    B  = error code
+*
+Term
+         clrb
+         pshs cc
+* Send OP_TERM to the server
+          IFGT  LEVEL-1
+         ldu   <D.DWSubAddr
+         ELSE
+         ldu   >D.DWSubAddr
+         ENDC
+* Fix crash in certain cases
+         beq   no@
+         ldy   #$0001
+         IFNE  atari
+         lda   D.ATARIFLAGS
+         ora   #DWIOSEMA
+         sta   D.ATARIFLAGS
+         ENDC
+         lda   #OP_TERM
+         pshs a
+         leax ,s
+         orcc  #IntMasks
+         jsr   DW$Write,u
+         IFNE  atari
+         lda   D.ATARIFLAGS
+         anda  #^DWIOSEMA
+         sta   D.ATARIFLAGS
+         ENDC
+         clrb
+         puls a
+no@      puls cc,pc
+
+* Init
+*
+* Entry:
+*    Y  = address of device descriptor
+*    U  = address of device memory area
+*
+* Exit:
+*    CC = carry set on error
+*    B  = error code
+*
+Init
+         IFGT  Level-1
+* Perform this so we can successfully do F$Link below
+         ldx   <D.Proc
+         pshs  a,x
+         ldx   <D.SysPrc
+         stx   <D.Proc 
+         ELSE
+         pshs  a
+         ENDC
+
+         ldb   #NumDrvs
+         stb   V.NDRV,u
+         leax  DRVBEG,u
+         lda   #$FF
+Init2    sta   DD.TOT,x			invalidate drive tables
+         sta   DD.TOT+1,x
+         sta   DD.TOT+2,x
+         leax  DRVMEM,x
+         decb
+         bne   Init2
+
+* Check if subroutine module has already been linked
+         IFGT  LEVEL-1
+         ldu   <D.DWSubAddr
+         ELSE
+         ldu   >D.DWSubAddr
+         ENDC
+         bne   InitEx
+* Link to subroutine module
+         clra
+         leax  name+2,pcr
+         os9   F$Link
+         bcs   InitEx 
+         tfr   y,u		 
+         IFGT  LEVEL-1
+         stu   <D.DWSubAddr
+         ELSE
+         stu   >D.DWSubAddr
+         ENDC
+* Initialize the low level device
+         IFNE  atari
+         lda   D.ATARIFLAGS
+         ora   #DWIOSEMA
+         sta   D.ATARIFLAGS
+         ENDC
+         jsr   DW$Init,u
+         lda   #OP_INIT
+         sta   ,s
+         leax  ,s
+         ldy   #$0001
+         jsr   DW$Write,u
+         IFNE  atari
+         lda   D.ATARIFLAGS
+         anda  #^DWIOSEMA
+         sta   D.ATARIFLAGS
+         ENDC
+         clrb
+
+InitEx
+         IFGT  Level-1
+         puls  a,x
+         stx   <D.Proc
+InitEx2
+         rts
+         ELSE
+InitEx2
+         puls  a,pc
+         ENDC
+
+* Read
+*
+* Entry:
+*    B  = MSB of LSN
+*    X  = LSB of LSN
+*    Y  = address of path descriptor
+*    U  = address of device memory area
+*
+* Exit:
+*    CC = carry set on error
+*    B  = error code
+*
+Read 
+         lda   #NUMRETRIES
+         sta   retries,u
+         cmpx  #$0000			LSN 0?
+         bne   ReadSect			branch if not
+         tstb	   			LSN 0?
+         bne   ReadSect			branch if not
+* At this point we are reading LSN0
+         bsr   ReadSect			read the sector
+         bcs   CpyLSNEx			if error, exit
+         leax  DRVBEG,u			point to start of drive table
+         ldb   <PD.DRV,y		get drive number
+NextDrv  beq   CopyLSN0			branch if terminal count
+         leax  <DRVMEM,x		else move to next drive table entry
+         decb				decrement counter
+         bra   NextDrv			and continue
+CopyLSN0 ldb   #DD.SIZ			get size to copy
+         ldy   PD.BUF,y			point to buffer
+CpyLSNLp lda   ,y+			get byte from buffer
+         sta   ,x+			and save in drive table
+         decb
+         bne   CpyLSNLp
+CpyLSNEx rts
+
+
+ReadSect pshs  cc
+         pshs  u,y,x,b,a,cc			then push CC and others on stack
+* Send out op code and 3 byte LSN
+         lda   PD.DRV,y			get drive number
+         cmpa  #NumDrvs
+         blo   Read1
+         ldb   #E$Unit
+         bra   ReadEr2
+Read1    sta   driveno,u
+         IFNE  atari
+         lda   D.ATARIFLAGS
+         ora   #DWIOSEMA
+         sta   D.ATARIFLAGS
+         ENDC
+         lda   #OP_READEX		load A with READ opcode
+         
+Read2
+         ldb   driveno,u
+         leax  ,s
+         std   ,x
+         ldy   #5 
+         IFGT  LEVEL-1
+         ldu   <D.DWSubAddr
+         ELSE
+         ldu   >D.DWSubAddr
+         ENDC
+         orcc  #IntMasks
+         jsr   DW$Write,u
+		 
+* Get 256 bytes of sector data
+         ldx   5,s
+         ldx   PD.BUF,x			get buffer pointer into X
+         ldy   #$0100
+         jsr   DW$Read,u
+         bcs   ReadEr1
+         bne   ReadEr1
+         pshs  y
+         leax  ,s
+         ldy   #$0002
+         jsr   DW$Write,u				write checksum to server
+
+* Get error code byte
+         leax  ,s
+         ldy   #$0001
+         jsr   DW$Read,u
+         puls  d
+         bcs   ReadEr0			branch if we timed out
+         bne   ReadEr0
+         tfr   a,b				transfer byte to B (in case of error)
+         tstb					is it zero?
+         beq   ReadEx			if not, exit with error
+         cmpb  #E$CRC
+         bne   ReadEr2
+         ldu   7,s				get U from stack
+         dec   retries,u		decrement retries
+         beq   ReadEr1
+         
+         lda   #OP_REREADEX		reread opcode
+         bra   Read2			and try getting sector again
+ReadEr0 
+ReadEr1  ldb   #E$Read			read error
+ReadEr2  lda   9,s
+         ora   #Carry
+         sta   9,s
+ReadEx   leas  5,s
+         IFNE  atari
+         lda   D.ATARIFLAGS
+         anda  #^DWIOSEMA
+         sta   D.ATARIFLAGS
+         ENDC
+         puls  y,u
+         puls  cc,pc
+
+* Write
+*
+* Entry:
+*    B  = MSB of LSN
+*    X  = LSB of LSN
+*    Y  = address of path descriptor
+*    U  = address of device memory area
+*
+* Exit:
+*    CC = carry set on error
+*    B  = error code
+*
+Write    lda   #NUMRETRIES
+         sta   retries,u
+         pshs  cc
+         pshs  u,y,x,b,a,cc
+         IFNE  atari
+         lda   D.ATARIFLAGS
+         ora   #DWIOSEMA
+         sta   D.ATARIFLAGS
+         ENDC
+* Send out op code and 3 byte LSN
+         lda   PD.DRV,y
+         cmpa  #NumDrvs
+         blo   Write1
+         comb			set Carry
+         ldb   #E$Unit
+         bra   WritEx
+Write1   sta   driveno,u
+         lda   #OP_WRITE
+Write15
+         ldb   driveno,u
+         leax  ,s
+         std   ,x
+         ldy   #$0005
+         IFGT  LEVEL-1
+         ldu   <D.DWSubAddr
+         ELSE
+         ldu   >D.DWSubAddr
+         ENDC
+         orcc  #IntMasks
+         jsr   DW$Write,u
+
+* Compute checksum on sector we just sent and send checksum to server
+         ldy   5,s				get Y from stack
+         ldx   PD.BUF,y			point to buffer
+         ldy   #256
+         jsr   6,u
+         leax  -256,x
+         bsr   DoCSum
+         pshs  d
+         leax  ,s
+         ldy   #$0002
+         jsr   DW$Write,u
+
+* Await acknowledgement from server on receipt of sector
+         leax  ,s
+         ldy   #$0001
+         jsr   DW$Read,u				read ack byte from server
+         bcs   WritEx0
+         bne   WritEx0
+         puls  d				  
+         tsta
+         beq   WritEx			yep
+         tfr   a,b
+         cmpb  #E$CRC			checksum error?
+         bne   WritEx2
+         ldu   7,s				get U from stack
+         dec   retries,u		decrement retries
+         beq   WritEx1			exit with error if no more
+         lda   #OP_REWRIT		else resend
+         bra   Write15
+WritEx0  puls  d
+WritEx1  ldb   #E$Write
+WritEx2  lda   9,s
+         ora   #Carry
+         sta   9,s
+WritEx   leas  5,s
+         IFNE  atari
+         lda   D.ATARIFLAGS
+         anda  #^DWIOSEMA
+         sta   D.ATARIFLAGS
+         ENDC
+         puls  y,u
+         puls  cc,pc
+ 
+         use   dwcheck.asm
+		 
+* SetStat
+*
+* Entry:
+*    R$B = function code
+*    Y   = address of path descriptor
+*    U   = address of device memory area
+*
+* Exit:
+*    CC = carry set on error
+*    B  = error code
+*
+SetStat  lda   #OP_SETSTA
+* Size optimization
+		 fcb   $8C  skip next two bytes
+
+
+* GetStat
+*
+* Entry:
+*    R$B = function code
+*    Y   = address of path descriptor
+*    U   = address of device memory area
+*
+* Exit:
+*    CC = carry set on error
+*    B  = error code
+*
+GetStat  
+         IFNE  atari
+         lda   D.ATARIFLAGS
+         ora   #DWIOSEMA
+         sta   D.ATARIFLAGS
+         ENDC
+         lda   #OP_GETSTA
+         clrb				clear Carry
+         pshs  cc			and push CC on stack
+         leas  -3,s
+         sta   ,s
+         lda   PD.DRV,y			get drive number
+         ldx   PD.RGS,y
+         ldb   R$B,x
+         std   1,s
+         leax  ,s
+         ldy   #$0003
+         IFGT  LEVEL-1
+         ldu   <D.DWSubAddr
+         ELSE
+         ldu   >D.DWSubAddr
+         ENDC
+         jsr   6,u
+         leas  3,s
+         IFNE  atari
+         lda   D.ATARIFLAGS
+         anda  #^DWIOSEMA
+         sta   D.ATARIFLAGS
+         ENDC
+         puls  cc,pc
+		 
+         emod
+eom      equ   *
+         end
--- a/level1/modules/rbdw3.asm	Sun Nov 24 11:45:32 2013 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,448 +0,0 @@
-********************************************************************
-* rbdw3 - DriveWire 3 driver
-*
-* $Id$
-*
-* This driver works in conjuction with the DriveWire Server on Linux,
-* Mac or Windows, providing the CoCo with pseudo-disk access through
-* the serial port.
-*
-* It adheres to the DriveWire Version 3 Protocol.
-*
-* The baud rate is set at 115200 and the communications requirements
-* are set to 8-N-1.  For OS-9 Level One on a CoCo 2, the baud rate
-* is 57600.
-*
-* Edt/Rev  YYYY/MM/DD  Modified by
-* Comment
-* ------------------------------------------------------------------
-*   1      2008/02/08  Boisy G. Pitre
-* Started from drivewire.asm in DriveWire 2 Product folder.
-*
-*   2      2008/04/22  Boisy G. Pitre
-* Verified working operation on a CoCo 3 running NitrOS-9/6809 Level 1 @ 57.6Kbps
-*
-*   3      2009/03/09  Boisy G. Pitre
-* Added checks for size after reading as noted by Darren A's email.
-*
-*   4      2009/12/31  Boisy G. Pitre
-* Fixed a crash in Term by adding a check for DWSubAddr of $0000 
-* (possible if Init fails due to subroutine module not being in
-*  memory and I$Detach calls Term)
-
-         nam   rbdw3
-         ttl   DriveWire 3 driver
-
-NUMRETRIES equ  8
-
-         ifp1
-         use   defsfile
-         use   drivewire.d
-         endc
-
-NumDrvs  set   4
-
-tylg     set   Drivr+Objct   
-atrv     set   ReEnt+rev
-rev      set   $01
-edition  set   4
-
-         mod   eom,name,tylg,atrv,start,size
-
-         rmb   DRVBEG+(DRVMEM*NumDrvs)
-driveno  rmb   1
-retries  rmb   1
-size     equ   .
-
-         fcb   DIR.+SHARE.+PEXEC.+PREAD.+PWRIT.+EXEC.+UPDAT.
-
-name     fcs   /rbdw3/
-         fcb   edition
-
-start    bra   Init
-         nop
-         bra   Read
-         nop
-         lbra  Write
-         lbra  GetStat
-         lbra  SetStat
-
-* Term
-*
-* Entry:
-*    U  = address of device memory area
-*
-* Exit:
-*    CC = carry set on error
-*    B  = error code
-*
-Term
-         clrb
-         pshs cc
-* Send OP_TERM to the server
-          IFGT  LEVEL-1
-         ldu   <D.DWSubAddr
-         ELSE
-         ldu   >D.DWSubAddr
-         ENDC
-* Fix crash in certain cases
-         beq   no@
-         ldy   #$0001
-         IFNE  atari
-         lda   D.ATARIFLAGS
-         ora   #DWIOSEMA
-         sta   D.ATARIFLAGS
-         ENDC
-         lda   #OP_TERM
-         pshs a
-         leax ,s
-         orcc  #IntMasks
-         jsr   DW$Write,u
-         IFNE  atari
-         lda   D.ATARIFLAGS
-         anda  #^DWIOSEMA
-         sta   D.ATARIFLAGS
-         ENDC
-         clrb
-         puls a
-no@      puls cc,pc
-
-* Init
-*
-* Entry:
-*    Y  = address of device descriptor
-*    U  = address of device memory area
-*
-* Exit:
-*    CC = carry set on error
-*    B  = error code
-*
-Init
-         IFGT  Level-1
-* Perform this so we can successfully do F$Link below
-         ldx   <D.Proc
-         pshs  a,x
-         ldx   <D.SysPrc
-         stx   <D.Proc 
-         ELSE
-         pshs  a
-         ENDC
-
-         ldb   #NumDrvs
-         stb   V.NDRV,u
-         leax  DRVBEG,u
-         lda   #$FF
-Init2    sta   DD.TOT,x			invalidate drive tables
-         sta   DD.TOT+1,x
-         sta   DD.TOT+2,x
-         leax  DRVMEM,x
-         decb
-         bne   Init2
-
-* Check if subroutine module has already been linked
-         IFGT  LEVEL-1
-         ldu   <D.DWSubAddr
-         ELSE
-         ldu   >D.DWSubAddr
-         ENDC
-         bne   InitEx
-* Link to subroutine module
-         clra
-         leax  name+2,pcr
-         os9   F$Link
-         bcs   InitEx 
-         tfr   y,u		 
-         IFGT  LEVEL-1
-         stu   <D.DWSubAddr
-         ELSE
-         stu   >D.DWSubAddr
-         ENDC
-* Initialize the low level device
-         IFNE  atari
-         lda   D.ATARIFLAGS
-         ora   #DWIOSEMA
-         sta   D.ATARIFLAGS
-         ENDC
-         jsr   DW$Init,u
-         lda   #OP_INIT
-         sta   ,s
-         leax  ,s
-         ldy   #$0001
-         jsr   DW$Write,u
-         IFNE  atari
-         lda   D.ATARIFLAGS
-         anda  #^DWIOSEMA
-         sta   D.ATARIFLAGS
-         ENDC
-         clrb
-
-InitEx
-         IFGT  Level-1
-         puls  a,x
-         stx   <D.Proc
-InitEx2
-         rts
-         ELSE
-InitEx2
-         puls  a,pc
-         ENDC
-
-* Read
-*
-* Entry:
-*    B  = MSB of LSN
-*    X  = LSB of LSN
-*    Y  = address of path descriptor
-*    U  = address of device memory area
-*
-* Exit:
-*    CC = carry set on error
-*    B  = error code
-*
-Read 
-         lda   #NUMRETRIES
-         sta   retries,u
-         cmpx  #$0000			LSN 0?
-         bne   ReadSect			branch if not
-         tstb	   			LSN 0?
-         bne   ReadSect			branch if not
-* At this point we are reading LSN0
-         bsr   ReadSect			read the sector
-         bcs   CpyLSNEx			if error, exit
-         leax  DRVBEG,u			point to start of drive table
-         ldb   <PD.DRV,y		get drive number
-NextDrv  beq   CopyLSN0			branch if terminal count
-         leax  <DRVMEM,x		else move to next drive table entry
-         decb				decrement counter
-         bra   NextDrv			and continue
-CopyLSN0 ldb   #DD.SIZ			get size to copy
-         ldy   PD.BUF,y			point to buffer
-CpyLSNLp lda   ,y+			get byte from buffer
-         sta   ,x+			and save in drive table
-         decb
-         bne   CpyLSNLp
-CpyLSNEx rts
-
-
-ReadSect pshs  cc
-         pshs  u,y,x,b,a,cc			then push CC and others on stack
-* Send out op code and 3 byte LSN
-         lda   PD.DRV,y			get drive number
-         cmpa  #NumDrvs
-         blo   Read1
-         ldb   #E$Unit
-         bra   ReadEr2
-Read1    sta   driveno,u
-         IFNE  atari
-         lda   D.ATARIFLAGS
-         ora   #DWIOSEMA
-         sta   D.ATARIFLAGS
-         ENDC
-         lda   #OP_READEX		load A with READ opcode
-         
-Read2
-         ldb   driveno,u
-         leax  ,s
-         std   ,x
-         ldy   #5 
-         IFGT  LEVEL-1
-         ldu   <D.DWSubAddr
-         ELSE
-         ldu   >D.DWSubAddr
-         ENDC
-         orcc  #IntMasks
-         jsr   DW$Write,u
-		 
-* Get 256 bytes of sector data
-         ldx   5,s
-         ldx   PD.BUF,x			get buffer pointer into X
-         ldy   #$0100
-         jsr   DW$Read,u
-         bcs   ReadEr1
-         bne   ReadEr1
-         pshs  y
-         leax  ,s
-         ldy   #$0002
-         jsr   DW$Write,u				write checksum to server
-
-* Get error code byte
-         leax  ,s
-         ldy   #$0001
-         jsr   DW$Read,u
-         puls  d
-         bcs   ReadEr0			branch if we timed out
-         bne   ReadEr0
-         tfr   a,b				transfer byte to B (in case of error)
-         tstb					is it zero?
-         beq   ReadEx			if not, exit with error
-         cmpb  #E$CRC
-         bne   ReadEr2
-         ldu   7,s				get U from stack
-         dec   retries,u		decrement retries
-         beq   ReadEr1
-         
-         lda   #OP_REREADEX		reread opcode
-         bra   Read2			and try getting sector again
-ReadEr0 
-ReadEr1  ldb   #E$Read			read error
-ReadEr2  lda   9,s
-         ora   #Carry
-         sta   9,s
-ReadEx   leas  5,s
-         IFNE  atari
-         lda   D.ATARIFLAGS
-         anda  #^DWIOSEMA
-         sta   D.ATARIFLAGS
-         ENDC
-         puls  y,u
-         puls  cc,pc
-
-* Write
-*
-* Entry:
-*    B  = MSB of LSN
-*    X  = LSB of LSN
-*    Y  = address of path descriptor
-*    U  = address of device memory area
-*
-* Exit:
-*    CC = carry set on error
-*    B  = error code
-*
-Write    lda   #NUMRETRIES
-         sta   retries,u
-         pshs  cc
-         pshs  u,y,x,b,a,cc
-         IFNE  atari
-         lda   D.ATARIFLAGS
-         ora   #DWIOSEMA
-         sta   D.ATARIFLAGS
-         ENDC
-* Send out op code and 3 byte LSN
-         lda   PD.DRV,y
-         cmpa  #NumDrvs
-         blo   Write1
-         comb			set Carry
-         ldb   #E$Unit
-         bra   WritEx
-Write1   sta   driveno,u
-         lda   #OP_WRITE
-Write15
-         ldb   driveno,u
-         leax  ,s
-         std   ,x
-         ldy   #$0005
-         IFGT  LEVEL-1
-         ldu   <D.DWSubAddr
-         ELSE
-         ldu   >D.DWSubAddr
-         ENDC
-         orcc  #IntMasks
-         jsr   DW$Write,u
-
-* Compute checksum on sector we just sent and send checksum to server
-         ldy   5,s				get Y from stack
-         ldx   PD.BUF,y			point to buffer
-         ldy   #256
-         jsr   6,u
-         leax  -256,x
-         bsr   DoCSum
-         pshs  d
-         leax  ,s
-         ldy   #$0002
-         jsr   DW$Write,u
-
-* Await acknowledgement from server on receipt of sector
-         leax  ,s
-         ldy   #$0001
-         jsr   DW$Read,u				read ack byte from server
-         bcs   WritEx0
-         bne   WritEx0
-         puls  d				  
-         tsta
-         beq   WritEx			yep
-         tfr   a,b
-         cmpb  #E$CRC			checksum error?
-         bne   WritEx2
-         ldu   7,s				get U from stack
-         dec   retries,u		decrement retries
-         beq   WritEx1			exit with error if no more
-         lda   #OP_REWRIT		else resend
-         bra   Write15
-WritEx0  puls  d
-WritEx1  ldb   #E$Write
-WritEx2  lda   9,s
-         ora   #Carry
-         sta   9,s
-WritEx   leas  5,s
-         IFNE  atari
-         lda   D.ATARIFLAGS
-         anda  #^DWIOSEMA
-         sta   D.ATARIFLAGS
-         ENDC
-         puls  y,u
-         puls  cc,pc
- 
-         use   dwcheck.asm
-		 
-* SetStat
-*
-* Entry:
-*    R$B = function code
-*    Y   = address of path descriptor
-*    U   = address of device memory area
-*
-* Exit:
-*    CC = carry set on error
-*    B  = error code
-*
-SetStat  lda   #OP_SETSTA
-* Size optimization
-		 fcb   $8C  skip next two bytes
-
-
-* GetStat
-*
-* Entry:
-*    R$B = function code
-*    Y   = address of path descriptor
-*    U   = address of device memory area
-*
-* Exit:
-*    CC = carry set on error
-*    B  = error code
-*
-GetStat  
-         IFNE  atari
-         lda   D.ATARIFLAGS
-         ora   #DWIOSEMA
-         sta   D.ATARIFLAGS
-         ENDC
-         lda   #OP_GETSTA
-         clrb				clear Carry
-         pshs  cc			and push CC on stack
-         leas  -3,s
-         sta   ,s
-         lda   PD.DRV,y			get drive number
-         ldx   PD.RGS,y
-         ldb   R$B,x
-         std   1,s
-         leax  ,s
-         ldy   #$0003
-         IFGT  LEVEL-1
-         ldu   <D.DWSubAddr
-         ELSE
-         ldu   >D.DWSubAddr
-         ENDC
-         jsr   6,u
-         leas  3,s
-         IFNE  atari
-         lda   D.ATARIFLAGS
-         anda  #^DWIOSEMA
-         sta   D.ATARIFLAGS
-         ENDC
-         puls  cc,pc
-		 
-         emod
-eom      equ   *
-         end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level2/coco3/bootlists/dw.bl	Sun Nov 24 12:07:31 2013 +0100
@@ -0,0 +1,288 @@
+***************************************
+* NitrOS-9 Level 2 CoCo 3 Bootlist
+*
+* $Id$
+*
+* This bootlist is presented as an example for creating custom bootfiles.
+* A module may be excluded from the bootfile if an asterisk (*) is the
+* first character of the line.
+*
+***************************************
+* Kernel/System Section
+*
+* These modules are mandatory.
+../MODULES/KERNEL/krnp2
+*../MODULES/KERNEL/krnp3_perr
+*../MODULES/KERNEL/krnp4_regdump
+../MODULES/SYSMODS/ioman
+../MODULES/SYSMODS/init
+*
+***************************************
+* CDF Section (HawkSoft)
+*
+*../MODULES/CDF/cdf.mn
+*
+* CDF descriptors - select as needed
+* SCSI descriptors (IDs 0-6)
+*../MODULES/CDF/sc0.dd
+*../MODULES/CDF/sc1.dd
+*../MODULES/CDF/sc2.dd
+*../MODULES/CDF/sc3.dd
+*../MODULES/CDF/sc4.dd
+*../MODULES/CDF/sc5.dd
+*../MODULES/CDF/sc6.dd
+* IDE descriptors (master/slave)
+*../MODULES/CDF/ic0.dd
+*../MODULES/CDF/ic1.dd
+*
+***************************************
+* RBF Section
+*
+../MODULES/RBF/rbf.mn
+*
+* DriveWire 3 driver
+../MODULES/RBF/rbdw3.dr
+../MODULES/RBF/dw3.sb
+* DriveWire descriptors - select as needed
+../MODULES/RBF/ddx0.dd
+*../MODULES/RBF/x0.dd
+../MODULES/RBF/x1.dd
+../MODULES/RBF/x2.dd
+../MODULES/RBF/x3.dd  
+*
+* SuperDriver Package (Cloud-9 product)
+*../MODULES/RBF/rbsuper.dr
+* Select Low level SCSI and/or IDE driver
+*../MODULES/RBF/lltc3.dr
+*../MODULES/RBF/llide.dr
+* SuperDriver descriptors - select as needed
+* TC^3 SCSI DD descriptor (ID 0)
+*../MODULES/RBF/dds0_tc3.dd
+* TC^3 SCSI descriptors (IDs 0-6)
+*../MODULES/RBF/s0_tc3.dd
+*../MODULES/RBF/s1_tc3.dd
+*../MODULES/RBF/s2_tc3.dd
+*../MODULES/RBF/s3_tc3.dd
+*../MODULES/RBF/s4_tc3.dd
+*../MODULES/RBF/s5_tc3.dd
+*../MODULES/RBF/s6_tc3.dd
+* TC^3 SCSI HDB-DOS descriptor
+*../MODULES/RBF/sh_tc3.dd
+* IDE DD descriptor (Master)
+*../MODULES/RBF/ddi0_ide.dd
+* IDE descriptors (master/slave)
+*../MODULES/RBF/i0_ide.dd
+*../MODULES/RBF/i1_ide.dd
+* IDE HDB-DOS descriptor
+*../MODULES/RBF/ih_ide.dd
+*
+* WD1773 floppy support for Tandy and compatible disk controllers
+../MODULES/RBF/rb1773.dr
+* WD1773 floppy support for Disto Super Controller II
+*../MODULES/RBF/rb1773_scii_ff74.dr
+*../MODULES/RBF/rb1773_scii_ff58.dr
+* Floppy device descriptors
+* DD - default device - choose one if needed
+*../MODULES/RBF/ddd0_35s.dd
+*../MODULES/RBF/ddd0_40d.dd
+*../MODULES/RBF/ddd0_80d.dd
+* D0 - drive 0 - choose one if needed
+*../MODULES/RBF/d0_35s.dd
+../MODULES/RBF/d0_40d.dd
+*../MODULES/RBF/d0_80d.dd
+* D1 - drive 1 - choose one if needed
+*../MODULES/RBF/d1_35s.dd
+../MODULES/RBF/d1_40d.dd
+*../MODULES/RBF/d1_80d.dd
+* D2 - drive 2 - choose one if needed
+*../MODULES/RBF/d2_35s.dd
+../MODULES/RBF/d2_40d.dd
+*../MODULES/RBF/d2_80d.dd
+* D3 - drive 3 - choose if needed
+*../MODULES/RBF/d3_35s.dd
+*
+* RAMDisk driver
+*../MODULES/RBF/rammer.dr
+* RAMDisk descriptors - select as needed
+*../MODULES/RBF/ddr0_8k.dd
+*../MODULES/RBF/ddr0_96k.dd
+*../MODULES/RBF/ddr0_128k.dd
+*../MODULES/RBF/ddr0_192k.dd
+*../MODULES/RBF/r0_8k.dd
+*../MODULES/RBF/r0_96k.dd
+*../MODULES/RBF/r0_128k.dd
+*../MODULES/RBF/r0_192k.dd
+* Memory device descriptor
+*../MODULES/RBF/md.dd
+***************************************
+* SCF Section
+*
+../MODULES/SCF/scf.mn
+*
+* CoCo 3 I/O sub-drivers
+../MODULES/SCF/vtio.dr
+../MODULES/SCF/keydrv_cc3.sb
+* Sound module: CoCo 3 built-in sound generator
+../MODULES/SCF/snddrv_cc3.sb
+* Joystick modules: choose joy for hi-res joystick adapter or
+* (M)icrosoft or (L)ogitech mouse using 6551 or 6552 ACIA
+../MODULES/SCF/joydrv_joy.sb
+*../MODULES/SCF/joydrv_6551M.sb
+*../MODULES/SCF/joydrv_6552M.sb
+*../MODULES/SCF/joydrv_6551L.sb
+*../MODULES/SCF/joydrv_6552L.sb
+*
+* CoGrf/CoWin subroutine module
+* Use CoWin with Multi-Vue; use CoGrf
+* for basic text and graphic window support..
+* Select only one.
+*../MODULES/SCF/cogrf.io
+../MODULES/SCF/cowin.io
+*
+* CoVDG I/O subroutine module
+* Select one or both
+*../MODULES/SCF/covdg.io
+*../MODULES/SCF/covdg_small.io
+*
+* Select only one term descriptor
+*../MODULES/SCF/term_vdg.dt
+*../MODULES/SCF/term_win40.dt
+../MODULES/SCF/term_win80.dt
+*../MODULES/SCF/term_scbbt.dt
+*../MODULES/SCF/term_sc6551.dt
+*
+* Select as many window descriptors as needed
+../MODULES/SCF/w.dw
+../MODULES/SCF/w1.dw
+../MODULES/SCF/w2.dw
+../MODULES/SCF/w3.dw
+../MODULES/SCF/w4.dw
+../MODULES/SCF/w5.dw
+../MODULES/SCF/w6.dw
+../MODULES/SCF/w7.dw
+../MODULES/SCF/w8.dw
+../MODULES/SCF/w9.dw
+../MODULES/SCF/w10.dw
+../MODULES/SCF/w11.dw
+../MODULES/SCF/w12.dw
+../MODULES/SCF/w13.dw
+../MODULES/SCF/w14.dw
+../MODULES/SCF/w15.dw
+*
+* Select as many VDG window descriptors as needed
+*../MODULES/SCF/v1.dw
+*../MODULES/SCF/v2.dw
+*../MODULES/SCF/v3.dw
+*../MODULES/SCF/v4.dw
+*../MODULES/SCF/v5.dw
+*../MODULES/SCF/v6.dw
+*../MODULES/SCF/v7.dw
+*
+* Serial port drivers
+* CoCo Bit-Banger terminal port
+*../MODULES/SCF/scbbt.dr
+*../MODULES/SCF/t1_scbbt.dd
+* 6551 ACIA
+*../MODULES/SCF/sc6551.dr
+*../MODULES/SCF/t2_sc6551.dd
+*../MODULES/SCF/t3_sc6551.dd
+* Tandy Modem Pak
+*../MODULES/SCF/modpak.dr
+*../MODULES/SCF/m1.dd
+*../MODULES/SCF/m2.dd
+*
+* Printer drivers
+* ../MODULES/SCF/scbbp.dr
+* ../MODULES/SCF/p_scbbp.dd
+*
+* DriveWire 3 Printer drivers
+* ../MODULES/SCF/scdwp.dr
+* ../MODULES/SCF/p_scdwp.dd
+*
+* DriveWire Networking
+*../MODULES/SCF/scdwn.dr
+*../MODULES/SCF/term_scdwn.dt
+*../MODULES/SCF/n_scdwn.dd
+*../MODULES/SCF/n1_scdwn.dd
+*../MODULES/SCF/n2_scdwn.dd
+*../MODULES/SCF/n3_scdwn.dd
+*../MODULES/SCF/n4_scdwn.dd
+*../MODULES/SCF/n5_scdwn.dd
+*../MODULES/SCF/n6_scdwn.dd
+*../MODULES/SCF/n7_scdwn.dd
+*../MODULES/SCF/n8_scdwn.dd
+*../MODULES/SCF/n9_scdwn.dd
+*../MODULES/SCF/n10_scdwn.dd
+*../MODULES/SCF/n11_scdwn.dd
+*../MODULES/SCF/n12_scdwn.dd
+*../MODULES/SCF/n13_scdwn.dd
+*../MODULES/SCF/n14_scdwn.dd
+*
+* DriveWire Networking
+*../MODULES/SCF/scdwn.dr
+*../MODULES/SCF/term_scdwn.dt
+*../MODULES/SCF/n0_scdwn.dd
+*../MODULES/SCF/n1_scdwn.dd
+*../MODULES/SCF/n2_scdwn.dd
+*../MODULES/SCF/n3_scdwn.dd
+*../MODULES/SCF/n4_scdwn.dd
+*../MODULES/SCF/n5_scdwn.dd
+*../MODULES/SCF/n6_scdwn.dd
+*../MODULES/SCF/n7_scdwn.dd
+*../MODULES/SCF/n8_scdwn.dd
+*../MODULES/SCF/n9_scdwn.dd
+*../MODULES/SCF/n10_scdwn.dd
+*../MODULES/SCF/n11_scdwn.dd
+*../MODULES/SCF/n12_scdwn.dd
+*../MODULES/SCF/n13_scdwn.dd
+*../MODULES/SCF/n14_scdwn.dd
+*
+* VRN is a driver module used by certain games, including King's Quest III,
+* Leisure Suit Larry and Flight Simulator II.  A /nil descriptor is also
+* supported.
+../MODULES/SCF/vrn.dr
+../MODULES/SCF/vi.dd
+../MODULES/SCF/ftdd.dd
+*
+***************************************
+* Pipe Section
+*
+* Pipes are a useful but optional part of a system.
+../MODULES/PIPE/pipeman.mn
+../MODULES/PIPE/piper.dr
+../MODULES/PIPE/pipe.dd
+*
+***************************************
+* Clock Section
+*
+* Select one clock module depending upon your power line frequency
+* (60Hz = USA/Canada; 50Hz = Europe, Australia)
+../MODULES/CLOCKS/clock_60hz
+*../MODULES/CLOCKS/clock_50hz
+* Select one clock2 module that supports your real-time clock, if any.
+* Besides support for the internal software clock, the following
+* hardware clocks are supported: Burke & Burke, Disto 2-N-1, Disto 4-N-1,
+* Eliminator, Harris, SmartWatch, Cloud-9 (SuperIDE), the MESS emulator, Jeff
+* Vavasour's CoCo emulator and DriveWire
+*../MODULES/CLOCKS/clock2_soft
+*../MODULES/CLOCKS/clock2_bnb
+*../MODULES/CLOCKS/clock2_disto2
+*../MODULES/CLOCKS/clock2_disto4
+*../MODULES/CLOCKS/clock2_elim
+*../MODULES/CLOCKS/clock2_harris
+*../MODULES/CLOCKS/clock2_smart
+*../MODULES/CLOCKS/clock2_jvemu
+*../MODULES/CLOCKS/clock2_messemu
+*../MODULES/CLOCKS/clock2_cloud9
+../MODULES/CLOCKS/clock2_dw3
+*
+***************************************
+* System Kick-Start Module
+*
+* Choose which startup module you wish to use. (sysgo_dd is recommended
+* for most configurations.)
+* 
+* Alternatively, this module can reside in the root directory of the
+* boot device, saving precious system RAM.
+../MODULES/SYSMODS/sysgo_dd
+*../MODULES/SYSMODS/sysgo_h0
--- a/level2/coco3/bootlists/dw3.bl	Sun Nov 24 11:45:32 2013 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,288 +0,0 @@
-***************************************
-* NitrOS-9 Level 2 CoCo 3 Bootlist
-*
-* $Id$
-*
-* This bootlist is presented as an example for creating custom bootfiles.
-* A module may be excluded from the bootfile if an asterisk (*) is the
-* first character of the line.
-*
-***************************************
-* Kernel/System Section
-*
-* These modules are mandatory.
-../MODULES/KERNEL/krnp2
-*../MODULES/KERNEL/krnp3_perr
-*../MODULES/KERNEL/krnp4_regdump
-../MODULES/SYSMODS/ioman
-../MODULES/SYSMODS/init
-*
-***************************************
-* CDF Section (HawkSoft)
-*
-*../MODULES/CDF/cdf.mn
-*
-* CDF descriptors - select as needed
-* SCSI descriptors (IDs 0-6)
-*../MODULES/CDF/sc0.dd
-*../MODULES/CDF/sc1.dd
-*../MODULES/CDF/sc2.dd
-*../MODULES/CDF/sc3.dd
-*../MODULES/CDF/sc4.dd
-*../MODULES/CDF/sc5.dd
-*../MODULES/CDF/sc6.dd
-* IDE descriptors (master/slave)
-*../MODULES/CDF/ic0.dd
-*../MODULES/CDF/ic1.dd
-*
-***************************************
-* RBF Section
-*
-../MODULES/RBF/rbf.mn
-*
-* DriveWire 3 driver
-../MODULES/RBF/rbdw3.dr
-../MODULES/RBF/dw3.sb
-* DriveWire descriptors - select as needed
-../MODULES/RBF/ddx0.dd
-*../MODULES/RBF/x0.dd
-../MODULES/RBF/x1.dd
-../MODULES/RBF/x2.dd
-../MODULES/RBF/x3.dd  
-*
-* SuperDriver Package (Cloud-9 product)
-*../MODULES/RBF/rbsuper.dr
-* Select Low level SCSI and/or IDE driver
-*../MODULES/RBF/lltc3.dr
-*../MODULES/RBF/llide.dr
-* SuperDriver descriptors - select as needed
-* TC^3 SCSI DD descriptor (ID 0)
-*../MODULES/RBF/dds0_tc3.dd
-* TC^3 SCSI descriptors (IDs 0-6)
-*../MODULES/RBF/s0_tc3.dd
-*../MODULES/RBF/s1_tc3.dd
-*../MODULES/RBF/s2_tc3.dd
-*../MODULES/RBF/s3_tc3.dd
-*../MODULES/RBF/s4_tc3.dd
-*../MODULES/RBF/s5_tc3.dd
-*../MODULES/RBF/s6_tc3.dd
-* TC^3 SCSI HDB-DOS descriptor
-*../MODULES/RBF/sh_tc3.dd
-* IDE DD descriptor (Master)
-*../MODULES/RBF/ddi0_ide.dd
-* IDE descriptors (master/slave)
-*../MODULES/RBF/i0_ide.dd
-*../MODULES/RBF/i1_ide.dd
-* IDE HDB-DOS descriptor
-*../MODULES/RBF/ih_ide.dd
-*
-* WD1773 floppy support for Tandy and compatible disk controllers
-../MODULES/RBF/rb1773.dr
-* WD1773 floppy support for Disto Super Controller II
-*../MODULES/RBF/rb1773_scii_ff74.dr
-*../MODULES/RBF/rb1773_scii_ff58.dr
-* Floppy device descriptors
-* DD - default device - choose one if needed
-*../MODULES/RBF/ddd0_35s.dd
-*../MODULES/RBF/ddd0_40d.dd
-*../MODULES/RBF/ddd0_80d.dd
-* D0 - drive 0 - choose one if needed
-*../MODULES/RBF/d0_35s.dd
-../MODULES/RBF/d0_40d.dd
-*../MODULES/RBF/d0_80d.dd
-* D1 - drive 1 - choose one if needed
-*../MODULES/RBF/d1_35s.dd
-../MODULES/RBF/d1_40d.dd
-*../MODULES/RBF/d1_80d.dd
-* D2 - drive 2 - choose one if needed
-*../MODULES/RBF/d2_35s.dd
-../MODULES/RBF/d2_40d.dd
-*../MODULES/RBF/d2_80d.dd
-* D3 - drive 3 - choose if needed
-*../MODULES/RBF/d3_35s.dd
-*
-* RAMDisk driver
-*../MODULES/RBF/rammer.dr
-* RAMDisk descriptors - select as needed
-*../MODULES/RBF/ddr0_8k.dd
-*../MODULES/RBF/ddr0_96k.dd
-*../MODULES/RBF/ddr0_128k.dd
-*../MODULES/RBF/ddr0_192k.dd
-*../MODULES/RBF/r0_8k.dd
-*../MODULES/RBF/r0_96k.dd
-*../MODULES/RBF/r0_128k.dd
-*../MODULES/RBF/r0_192k.dd
-* Memory device descriptor
-*../MODULES/RBF/md.dd
-***************************************
-* SCF Section
-*
-../MODULES/SCF/scf.mn
-*
-* CoCo 3 I/O sub-drivers
-../MODULES/SCF/vtio.dr
-../MODULES/SCF/keydrv_cc3.sb
-* Sound module: CoCo 3 built-in sound generator
-../MODULES/SCF/snddrv_cc3.sb
-* Joystick modules: choose joy for hi-res joystick adapter or
-* (M)icrosoft or (L)ogitech mouse using 6551 or 6552 ACIA
-../MODULES/SCF/joydrv_joy.sb
-*../MODULES/SCF/joydrv_6551M.sb
-*../MODULES/SCF/joydrv_6552M.sb
-*../MODULES/SCF/joydrv_6551L.sb
-*../MODULES/SCF/joydrv_6552L.sb
-*
-* CoGrf/CoWin subroutine module
-* Use CoWin with Multi-Vue; use CoGrf
-* for basic text and graphic window support..
-* Select only one.
-*../MODULES/SCF/cogrf.io
-../MODULES/SCF/cowin.io
-*
-* CoVDG I/O subroutine module
-* Select one or both
-*../MODULES/SCF/covdg.io
-*../MODULES/SCF/covdg_small.io
-*
-* Select only one term descriptor
-*../MODULES/SCF/term_vdg.dt
-*../MODULES/SCF/term_win40.dt
-../MODULES/SCF/term_win80.dt
-*../MODULES/SCF/term_scbbt.dt
-*../MODULES/SCF/term_sc6551.dt
-*
-* Select as many window descriptors as needed
-../MODULES/SCF/w.dw
-../MODULES/SCF/w1.dw
-../MODULES/SCF/w2.dw
-../MODULES/SCF/w3.dw
-../MODULES/SCF/w4.dw
-../MODULES/SCF/w5.dw
-../MODULES/SCF/w6.dw
-../MODULES/SCF/w7.dw
-../MODULES/SCF/w8.dw
-../MODULES/SCF/w9.dw
-../MODULES/SCF/w10.dw
-../MODULES/SCF/w11.dw
-../MODULES/SCF/w12.dw
-../MODULES/SCF/w13.dw
-../MODULES/SCF/w14.dw
-../MODULES/SCF/w15.dw
-*
-* Select as many VDG window descriptors as needed
-*../MODULES/SCF/v1.dw
-*../MODULES/SCF/v2.dw
-*../MODULES/SCF/v3.dw
-*../MODULES/SCF/v4.dw
-*../MODULES/SCF/v5.dw
-*../MODULES/SCF/v6.dw
-*../MODULES/SCF/v7.dw
-*
-* Serial port drivers
-* CoCo Bit-Banger terminal port
-*../MODULES/SCF/scbbt.dr
-*../MODULES/SCF/t1_scbbt.dd
-* 6551 ACIA
-*../MODULES/SCF/sc6551.dr
-*../MODULES/SCF/t2_sc6551.dd
-*../MODULES/SCF/t3_sc6551.dd
-* Tandy Modem Pak
-*../MODULES/SCF/modpak.dr
-*../MODULES/SCF/m1.dd
-*../MODULES/SCF/m2.dd
-*
-* Printer drivers
-* ../MODULES/SCF/scbbp.dr
-* ../MODULES/SCF/p_scbbp.dd
-*
-* DriveWire 3 Printer drivers
-* ../MODULES/SCF/scdwp.dr
-* ../MODULES/SCF/p_scdwp.dd
-*
-* DriveWire Networking
-*../MODULES/SCF/scdwn.dr
-*../MODULES/SCF/term_scdwn.dt
-*../MODULES/SCF/n_scdwn.dd
-*../MODULES/SCF/n1_scdwn.dd
-*../MODULES/SCF/n2_scdwn.dd
-*../MODULES/SCF/n3_scdwn.dd
-*../MODULES/SCF/n4_scdwn.dd
-*../MODULES/SCF/n5_scdwn.dd
-*../MODULES/SCF/n6_scdwn.dd
-*../MODULES/SCF/n7_scdwn.dd
-*../MODULES/SCF/n8_scdwn.dd
-*../MODULES/SCF/n9_scdwn.dd
-*../MODULES/SCF/n10_scdwn.dd
-*../MODULES/SCF/n11_scdwn.dd
-*../MODULES/SCF/n12_scdwn.dd
-*../MODULES/SCF/n13_scdwn.dd
-*../MODULES/SCF/n14_scdwn.dd
-*
-* DriveWire Networking
-*../MODULES/SCF/scdwn.dr
-*../MODULES/SCF/term_scdwn.dt
-*../MODULES/SCF/n0_scdwn.dd
-*../MODULES/SCF/n1_scdwn.dd
-*../MODULES/SCF/n2_scdwn.dd
-*../MODULES/SCF/n3_scdwn.dd
-*../MODULES/SCF/n4_scdwn.dd
-*../MODULES/SCF/n5_scdwn.dd
-*../MODULES/SCF/n6_scdwn.dd
-*../MODULES/SCF/n7_scdwn.dd
-*../MODULES/SCF/n8_scdwn.dd
-*../MODULES/SCF/n9_scdwn.dd
-*../MODULES/SCF/n10_scdwn.dd
-*../MODULES/SCF/n11_scdwn.dd
-*../MODULES/SCF/n12_scdwn.dd
-*../MODULES/SCF/n13_scdwn.dd
-*../MODULES/SCF/n14_scdwn.dd
-*
-* VRN is a driver module used by certain games, including King's Quest III,
-* Leisure Suit Larry and Flight Simulator II.  A /nil descriptor is also
-* supported.
-../MODULES/SCF/vrn.dr
-../MODULES/SCF/vi.dd
-../MODULES/SCF/ftdd.dd
-*
-***************************************
-* Pipe Section
-*
-* Pipes are a useful but optional part of a system.
-../MODULES/PIPE/pipeman.mn
-../MODULES/PIPE/piper.dr
-../MODULES/PIPE/pipe.dd
-*
-***************************************
-* Clock Section
-*
-* Select one clock module depending upon your power line frequency
-* (60Hz = USA/Canada; 50Hz = Europe, Australia)
-../MODULES/CLOCKS/clock_60hz
-*../MODULES/CLOCKS/clock_50hz
-* Select one clock2 module that supports your real-time clock, if any.
-* Besides support for the internal software clock, the following
-* hardware clocks are supported: Burke & Burke, Disto 2-N-1, Disto 4-N-1,
-* Eliminator, Harris, SmartWatch, Cloud-9 (SuperIDE), the MESS emulator, Jeff
-* Vavasour's CoCo emulator and DriveWire
-*../MODULES/CLOCKS/clock2_soft
-*../MODULES/CLOCKS/clock2_bnb
-*../MODULES/CLOCKS/clock2_disto2
-*../MODULES/CLOCKS/clock2_disto4
-*../MODULES/CLOCKS/clock2_elim
-*../MODULES/CLOCKS/clock2_harris
-*../MODULES/CLOCKS/clock2_smart
-*../MODULES/CLOCKS/clock2_jvemu
-*../MODULES/CLOCKS/clock2_messemu
-*../MODULES/CLOCKS/clock2_cloud9
-../MODULES/CLOCKS/clock2_dw3
-*
-***************************************
-* System Kick-Start Module
-*
-* Choose which startup module you wish to use. (sysgo_dd is recommended
-* for most configurations.)
-* 
-* Alternatively, this module can reside in the root directory of the
-* boot device, saving precious system RAM.
-../MODULES/SYSMODS/sysgo_dd
-*../MODULES/SYSMODS/sysgo_h0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level2/coco3/scripts/mb.dw	Sun Nov 24 12:07:31 2013 +0100
@@ -0,0 +1,31 @@
+-t
+-x
+tmode .1 pau=0
+echo * NitrOS-9 Level 2 Boot Creation Script
+echo *
+echo * This script creates a bootable DriveWire 3 disk image
+echo * using the dw.bl bootlist file.
+echo *
+echo * The resulting disk will boot NitrOS-9 from DriveWire disk 0.
+echo *
+echo "Please type the destination device (e.g. /x0, /x1)"
+var.1
+prompt Insert a blank disk in %1 and press a key:
+echo *
+echo * Step 1: Format disk in %1
+format %1 "NitrOS-9 Level 2 Boot Disk" r
+ynn
+echo *
+echo * Step 2: Create a custom boot track
+merge ../MODULES/BOOTTRACK/rel_80 ../MODULES/BOOTTRACK/boot_dw ../MODULES/BOOTTRACK/krn>-bttemp
+echo *
+echo * Step 3: Create the bootfile and boot track
+os9gen %1 -t=bttemp<../BOOTLISTS/dw.bl
+del bttemp
+echo *
+echo * Step 4: Populate the disk with essential files
+copy ../MODULES/SYSMODS/sysgo_dd %1/sysgo
+makdir %1/CMDS
+copy -w=%1/CMDS ../CMDS/shell ../CMDS/grfdrv
+echo *
+echo * We're done
--- a/level2/coco3/scripts/mb.dw3	Sun Nov 24 11:45:32 2013 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
--t
--x
-tmode .1 pau=0
-echo * NitrOS-9 Level 2 Boot Creation Script
-echo *
-echo * This script creates a bootable DriveWire 3 disk image
-echo * using the dw3.bl bootlist file.
-echo *
-echo * The resulting disk will boot NitrOS-9 from DriveWire disk 0.
-echo *
-echo "Please type the destination device (e.g. /x0, /x1)"
-var.1
-prompt Insert a blank disk in %1 and press a key:
-echo *
-echo * Step 1: Format disk in %1
-format %1 "NitrOS-9 Level 2 Boot Disk" r
-ynn
-echo *
-echo * Step 2: Create a custom boot track
-merge ../MODULES/BOOTTRACK/rel_80 ../MODULES/BOOTTRACK/boot_dw3 ../MODULES/BOOTTRACK/krn>-bttemp
-echo *
-echo * Step 3: Create the bootfile and boot track
-os9gen %1 -t=bttemp<../BOOTLISTS/dw3.bl
-del bttemp
-echo *
-echo * Step 4: Populate the disk with essential files
-copy ../MODULES/SYSMODS/sysgo_dd %1/sysgo
-makdir %1/CMDS
-copy -w=%1/CMDS ../CMDS/shell ../CMDS/grfdrv
-echo *
-echo * We're done
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level2/coco3_6309/bootlists/dw.bl	Sun Nov 24 12:07:31 2013 +0100
@@ -0,0 +1,288 @@
+***************************************
+* NitrOS-9 Level 2 CoCo 3 Bootlist
+*
+* $Id$
+*
+* This bootlist is presented as an example for creating custom bootfiles.
+* A module may be excluded from the bootfile if an asterisk (*) is the
+* first character of the line.
+*
+***************************************
+* Kernel/System Section
+*
+* These modules are mandatory.
+../MODULES/KERNEL/krnp2
+*../MODULES/KERNEL/krnp3_perr
+*../MODULES/KERNEL/krnp4_regdump
+../MODULES/SYSMODS/ioman
+../MODULES/SYSMODS/init
+*
+***************************************
+* CDF Section (HawkSoft)
+*
+*../MODULES/CDF/cdf.mn
+*
+* CDF descriptors - select as needed
+* SCSI descriptors (IDs 0-6)
+*../MODULES/CDF/sc0.dd
+*../MODULES/CDF/sc1.dd
+*../MODULES/CDF/sc2.dd
+*../MODULES/CDF/sc3.dd
+*../MODULES/CDF/sc4.dd
+*../MODULES/CDF/sc5.dd
+*../MODULES/CDF/sc6.dd
+* IDE descriptors (master/slave)
+*../MODULES/CDF/ic0.dd
+*../MODULES/CDF/ic1.dd
+*
+***************************************
+* RBF Section
+*
+../MODULES/RBF/rbf.mn
+*
+* DriveWire 3 driver
+../MODULES/RBF/rbdw3.dr
+../MODULES/RBF/dw3.sb
+* DriveWire descriptors - select as needed
+../MODULES/RBF/ddx0.dd
+*../MODULES/RBF/x0.dd
+../MODULES/RBF/x1.dd
+../MODULES/RBF/x2.dd
+../MODULES/RBF/x3.dd  
+*
+* SuperDriver Package (Cloud-9 product)
+*../MODULES/RBF/rbsuper.dr
+* Select Low level SCSI and/or IDE driver
+*../MODULES/RBF/lltc3.dr
+*../MODULES/RBF/llide.dr
+* SuperDriver descriptors - select as needed
+* TC^3 SCSI DD descriptor (ID 0)
+*../MODULES/RBF/dds0_tc3.dd
+* TC^3 SCSI descriptors (IDs 0-6)
+*../MODULES/RBF/s0_tc3.dd
+*../MODULES/RBF/s1_tc3.dd
+*../MODULES/RBF/s2_tc3.dd
+*../MODULES/RBF/s3_tc3.dd
+*../MODULES/RBF/s4_tc3.dd
+*../MODULES/RBF/s5_tc3.dd
+*../MODULES/RBF/s6_tc3.dd
+* TC^3 SCSI HDB-DOS descriptor
+*../MODULES/RBF/sh_tc3.dd
+* IDE DD descriptor (Master)
+*../MODULES/RBF/ddi0_ide.dd
+* IDE descriptors (master/slave)
+*../MODULES/RBF/i0_ide.dd
+*../MODULES/RBF/i1_ide.dd
+* IDE HDB-DOS descriptor
+*../MODULES/RBF/ih_ide.dd
+*
+* WD1773 floppy support for Tandy and compatible disk controllers
+../MODULES/RBF/rb1773.dr
+* WD1773 floppy support for Disto Super Controller II
+*../MODULES/RBF/rb1773_scii_ff74.dr
+*../MODULES/RBF/rb1773_scii_ff58.dr
+* Floppy device descriptors
+* DD - default device - choose one if needed
+*../MODULES/RBF/ddd0_35s.dd
+*../MODULES/RBF/ddd0_40d.dd
+*../MODULES/RBF/ddd0_80d.dd
+* D0 - drive 0 - choose one if needed
+*../MODULES/RBF/d0_35s.dd
+../MODULES/RBF/d0_40d.dd
+*../MODULES/RBF/d0_80d.dd
+* D1 - drive 1 - choose one if needed
+*../MODULES/RBF/d1_35s.dd
+../MODULES/RBF/d1_40d.dd
+*../MODULES/RBF/d1_80d.dd
+* D2 - drive 2 - choose one if needed
+*../MODULES/RBF/d2_35s.dd
+../MODULES/RBF/d2_40d.dd
+*../MODULES/RBF/d2_80d.dd
+* D3 - drive 3 - choose if needed
+*../MODULES/RBF/d3_35s.dd
+*
+* RAMDisk driver
+*../MODULES/RBF/rammer.dr
+* RAMDisk descriptors - select as needed
+*../MODULES/RBF/ddr0_8k.dd
+*../MODULES/RBF/ddr0_96k.dd
+*../MODULES/RBF/ddr0_128k.dd
+*../MODULES/RBF/ddr0_192k.dd
+*../MODULES/RBF/r0_8k.dd
+*../MODULES/RBF/r0_96k.dd
+*../MODULES/RBF/r0_128k.dd
+*../MODULES/RBF/r0_192k.dd
+* Memory device descriptor
+*../MODULES/RBF/md.dd
+***************************************
+* SCF Section
+*
+../MODULES/SCF/scf.mn
+*
+* CoCo 3 I/O sub-drivers
+../MODULES/SCF/vtio.dr
+../MODULES/SCF/keydrv_cc3.sb
+* Sound module: CoCo 3 built-in sound generator
+../MODULES/SCF/snddrv_cc3.sb
+* Joystick modules: choose joy for hi-res joystick adapter or
+* (M)icrosoft or (L)ogitech mouse using 6551 or 6552 ACIA
+../MODULES/SCF/joydrv_joy.sb
+*../MODULES/SCF/joydrv_6551M.sb
+*../MODULES/SCF/joydrv_6552M.sb
+*../MODULES/SCF/joydrv_6551L.sb
+*../MODULES/SCF/joydrv_6552L.sb
+*
+* CoGrf/CoWin subroutine module
+* Use CoWin with Multi-Vue; use CoGrf
+* for basic text and graphic window support..
+* Select only one.
+*../MODULES/SCF/cogrf.io
+../MODULES/SCF/cowin.io
+*
+* CoVDG I/O subroutine module
+* Select one or both
+*../MODULES/SCF/covdg.io
+*../MODULES/SCF/covdg_small.io
+*
+* Select only one term descriptor
+*../MODULES/SCF/term_vdg.dt
+*../MODULES/SCF/term_win40.dt
+../MODULES/SCF/term_win80.dt
+*../MODULES/SCF/term_scbbt.dt
+*../MODULES/SCF/term_sc6551.dt
+*
+* Select as many window descriptors as needed
+../MODULES/SCF/w.dw
+../MODULES/SCF/w1.dw
+../MODULES/SCF/w2.dw
+../MODULES/SCF/w3.dw
+../MODULES/SCF/w4.dw
+../MODULES/SCF/w5.dw
+../MODULES/SCF/w6.dw
+../MODULES/SCF/w7.dw
+../MODULES/SCF/w8.dw
+../MODULES/SCF/w9.dw
+../MODULES/SCF/w10.dw
+../MODULES/SCF/w11.dw
+../MODULES/SCF/w12.dw
+../MODULES/SCF/w13.dw
+../MODULES/SCF/w14.dw
+../MODULES/SCF/w15.dw
+*
+* Select as many VDG window descriptors as needed
+*../MODULES/SCF/v1.dw
+*../MODULES/SCF/v2.dw
+*../MODULES/SCF/v3.dw
+*../MODULES/SCF/v4.dw
+*../MODULES/SCF/v5.dw
+*../MODULES/SCF/v6.dw
+*../MODULES/SCF/v7.dw
+*
+* Serial port drivers
+* CoCo Bit-Banger terminal port
+*../MODULES/SCF/scbbt.dr
+*../MODULES/SCF/t1_scbbt.dd
+* 6551 ACIA
+*../MODULES/SCF/sc6551.dr
+*../MODULES/SCF/t2_sc6551.dd
+*../MODULES/SCF/t3_sc6551.dd
+* Tandy Modem Pak
+*../MODULES/SCF/modpak.dr
+*../MODULES/SCF/m1.dd
+*../MODULES/SCF/m2.dd
+*
+* Printer drivers
+* ../MODULES/SCF/scbbp.dr
+* ../MODULES/SCF/p_scbbp.dd
+*
+* DriveWire 3 Printer drivers
+* ../MODULES/SCF/scdwp.dr
+* ../MODULES/SCF/p_scdwp.dd
+*
+* DriveWire Networking
+*../MODULES/SCF/scdwn.dr
+*../MODULES/SCF/term_scdwn.dt
+*../MODULES/SCF/n_scdwn.dd
+*../MODULES/SCF/n1_scdwn.dd
+*../MODULES/SCF/n2_scdwn.dd
+*../MODULES/SCF/n3_scdwn.dd
+*../MODULES/SCF/n4_scdwn.dd
+*../MODULES/SCF/n5_scdwn.dd
+*../MODULES/SCF/n6_scdwn.dd
+*../MODULES/SCF/n7_scdwn.dd
+*../MODULES/SCF/n8_scdwn.dd
+*../MODULES/SCF/n9_scdwn.dd
+*../MODULES/SCF/n10_scdwn.dd
+*../MODULES/SCF/n11_scdwn.dd
+*../MODULES/SCF/n12_scdwn.dd
+*../MODULES/SCF/n13_scdwn.dd
+*../MODULES/SCF/n14_scdwn.dd
+*
+* DriveWire Networking
+*../MODULES/SCF/scdwn.dr
+*../MODULES/SCF/term_scdwn.dt
+*../MODULES/SCF/n0_scdwn.dd
+*../MODULES/SCF/n1_scdwn.dd
+*../MODULES/SCF/n2_scdwn.dd
+*../MODULES/SCF/n3_scdwn.dd
+*../MODULES/SCF/n4_scdwn.dd
+*../MODULES/SCF/n5_scdwn.dd
+*../MODULES/SCF/n6_scdwn.dd
+*../MODULES/SCF/n7_scdwn.dd
+*../MODULES/SCF/n8_scdwn.dd
+*../MODULES/SCF/n9_scdwn.dd
+*../MODULES/SCF/n10_scdwn.dd
+*../MODULES/SCF/n11_scdwn.dd
+*../MODULES/SCF/n12_scdwn.dd
+*../MODULES/SCF/n13_scdwn.dd
+*../MODULES/SCF/n14_scdwn.dd
+*
+* VRN is a driver module used by certain games, including King's Quest III,
+* Leisure Suit Larry and Flight Simulator II.  A /nil descriptor is also
+* supported.
+../MODULES/SCF/vrn.dr
+../MODULES/SCF/vi.dd
+../MODULES/SCF/ftdd.dd
+*
+***************************************
+* Pipe Section
+*
+* Pipes are a useful but optional part of a system.
+../MODULES/PIPE/pipeman.mn
+../MODULES/PIPE/piper.dr
+../MODULES/PIPE/pipe.dd
+*
+***************************************
+* Clock Section
+*
+* Select one clock module depending upon your power line frequency
+* (60Hz = USA/Canada; 50Hz = Europe, Australia)
+../MODULES/CLOCKS/clock_60hz
+*../MODULES/CLOCKS/clock_50hz
+* Select one clock2 module that supports your real-time clock, if any.
+* Besides support for the internal software clock, the following
+* hardware clocks are supported: Burke & Burke, Disto 2-N-1, Disto 4-N-1,
+* Eliminator, Harris, SmartWatch, Cloud-9 (SuperIDE), the MESS emulator, Jeff
+* Vavasour's CoCo emulator and DriveWire
+*../MODULES/CLOCKS/clock2_soft
+*../MODULES/CLOCKS/clock2_bnb
+*../MODULES/CLOCKS/clock2_disto2
+*../MODULES/CLOCKS/clock2_disto4
+*../MODULES/CLOCKS/clock2_elim
+*../MODULES/CLOCKS/clock2_harris
+*../MODULES/CLOCKS/clock2_smart
+*../MODULES/CLOCKS/clock2_jvemu
+*../MODULES/CLOCKS/clock2_messemu
+*../MODULES/CLOCKS/clock2_cloud9
+../MODULES/CLOCKS/clock2_dw3
+*
+***************************************
+* System Kick-Start Module
+*
+* Choose which startup module you wish to use. (sysgo_dd is recommended
+* for most configurations.)
+* 
+* Alternatively, this module can reside in the root directory of the
+* boot device, saving precious system RAM.
+../MODULES/SYSMODS/sysgo_dd
+*../MODULES/SYSMODS/sysgo_h0
--- a/level2/coco3_6309/bootlists/dw3.bl	Sun Nov 24 11:45:32 2013 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,288 +0,0 @@
-***************************************
-* NitrOS-9 Level 2 CoCo 3 Bootlist
-*
-* $Id$
-*
-* This bootlist is presented as an example for creating custom bootfiles.
-* A module may be excluded from the bootfile if an asterisk (*) is the
-* first character of the line.
-*
-***************************************
-* Kernel/System Section
-*
-* These modules are mandatory.
-../MODULES/KERNEL/krnp2
-*../MODULES/KERNEL/krnp3_perr
-*../MODULES/KERNEL/krnp4_regdump
-../MODULES/SYSMODS/ioman
-../MODULES/SYSMODS/init
-*
-***************************************
-* CDF Section (HawkSoft)
-*
-*../MODULES/CDF/cdf.mn
-*
-* CDF descriptors - select as needed
-* SCSI descriptors (IDs 0-6)
-*../MODULES/CDF/sc0.dd
-*../MODULES/CDF/sc1.dd
-*../MODULES/CDF/sc2.dd
-*../MODULES/CDF/sc3.dd
-*../MODULES/CDF/sc4.dd
-*../MODULES/CDF/sc5.dd
-*../MODULES/CDF/sc6.dd
-* IDE descriptors (master/slave)
-*../MODULES/CDF/ic0.dd
-*../MODULES/CDF/ic1.dd
-*
-***************************************
-* RBF Section
-*
-../MODULES/RBF/rbf.mn
-*
-* DriveWire 3 driver
-../MODULES/RBF/rbdw3.dr
-../MODULES/RBF/dw3.sb
-* DriveWire descriptors - select as needed
-../MODULES/RBF/ddx0.dd
-*../MODULES/RBF/x0.dd
-../MODULES/RBF/x1.dd
-../MODULES/RBF/x2.dd
-../MODULES/RBF/x3.dd  
-*
-* SuperDriver Package (Cloud-9 product)
-*../MODULES/RBF/rbsuper.dr
-* Select Low level SCSI and/or IDE driver
-*../MODULES/RBF/lltc3.dr
-*../MODULES/RBF/llide.dr
-* SuperDriver descriptors - select as needed
-* TC^3 SCSI DD descriptor (ID 0)
-*../MODULES/RBF/dds0_tc3.dd
-* TC^3 SCSI descriptors (IDs 0-6)
-*../MODULES/RBF/s0_tc3.dd
-*../MODULES/RBF/s1_tc3.dd
-*../MODULES/RBF/s2_tc3.dd
-*../MODULES/RBF/s3_tc3.dd
-*../MODULES/RBF/s4_tc3.dd
-*../MODULES/RBF/s5_tc3.dd
-*../MODULES/RBF/s6_tc3.dd
-* TC^3 SCSI HDB-DOS descriptor
-*../MODULES/RBF/sh_tc3.dd
-* IDE DD descriptor (Master)
-*../MODULES/RBF/ddi0_ide.dd
-* IDE descriptors (master/slave)
-*../MODULES/RBF/i0_ide.dd
-*../MODULES/RBF/i1_ide.dd
-* IDE HDB-DOS descriptor
-*../MODULES/RBF/ih_ide.dd
-*
-* WD1773 floppy support for Tandy and compatible disk controllers
-../MODULES/RBF/rb1773.dr
-* WD1773 floppy support for Disto Super Controller II
-*../MODULES/RBF/rb1773_scii_ff74.dr
-*../MODULES/RBF/rb1773_scii_ff58.dr
-* Floppy device descriptors
-* DD - default device - choose one if needed
-*../MODULES/RBF/ddd0_35s.dd
-*../MODULES/RBF/ddd0_40d.dd
-*../MODULES/RBF/ddd0_80d.dd
-* D0 - drive 0 - choose one if needed
-*../MODULES/RBF/d0_35s.dd
-../MODULES/RBF/d0_40d.dd
-*../MODULES/RBF/d0_80d.dd
-* D1 - drive 1 - choose one if needed
-*../MODULES/RBF/d1_35s.dd
-../MODULES/RBF/d1_40d.dd
-*../MODULES/RBF/d1_80d.dd
-* D2 - drive 2 - choose one if needed
-*../MODULES/RBF/d2_35s.dd
-../MODULES/RBF/d2_40d.dd
-*../MODULES/RBF/d2_80d.dd
-* D3 - drive 3 - choose if needed
-*../MODULES/RBF/d3_35s.dd
-*
-* RAMDisk driver
-*../MODULES/RBF/rammer.dr
-* RAMDisk descriptors - select as needed
-*../MODULES/RBF/ddr0_8k.dd
-*../MODULES/RBF/ddr0_96k.dd
-*../MODULES/RBF/ddr0_128k.dd
-*../MODULES/RBF/ddr0_192k.dd
-*../MODULES/RBF/r0_8k.dd
-*../MODULES/RBF/r0_96k.dd
-*../MODULES/RBF/r0_128k.dd
-*../MODULES/RBF/r0_192k.dd
-* Memory device descriptor
-*../MODULES/RBF/md.dd
-***************************************
-* SCF Section
-*
-../MODULES/SCF/scf.mn
-*
-* CoCo 3 I/O sub-drivers
-../MODULES/SCF/vtio.dr
-../MODULES/SCF/keydrv_cc3.sb
-* Sound module: CoCo 3 built-in sound generator
-../MODULES/SCF/snddrv_cc3.sb
-* Joystick modules: choose joy for hi-res joystick adapter or
-* (M)icrosoft or (L)ogitech mouse using 6551 or 6552 ACIA
-../MODULES/SCF/joydrv_joy.sb
-*../MODULES/SCF/joydrv_6551M.sb
-*../MODULES/SCF/joydrv_6552M.sb
-*../MODULES/SCF/joydrv_6551L.sb
-*../MODULES/SCF/joydrv_6552L.sb
-*
-* CoGrf/CoWin subroutine module
-* Use CoWin with Multi-Vue; use CoGrf
-* for basic text and graphic window support..
-* Select only one.
-*../MODULES/SCF/cogrf.io
-../MODULES/SCF/cowin.io
-*
-* CoVDG I/O subroutine module
-* Select one or both
-*../MODULES/SCF/covdg.io
-*../MODULES/SCF/covdg_small.io
-*
-* Select only one term descriptor
-*../MODULES/SCF/term_vdg.dt
-*../MODULES/SCF/term_win40.dt
-../MODULES/SCF/term_win80.dt
-*../MODULES/SCF/term_scbbt.dt
-*../MODULES/SCF/term_sc6551.dt
-*
-* Select as many window descriptors as needed
-../MODULES/SCF/w.dw
-../MODULES/SCF/w1.dw
-../MODULES/SCF/w2.dw
-../MODULES/SCF/w3.dw
-../MODULES/SCF/w4.dw
-../MODULES/SCF/w5.dw
-../MODULES/SCF/w6.dw
-../MODULES/SCF/w7.dw
-../MODULES/SCF/w8.dw
-../MODULES/SCF/w9.dw
-../MODULES/SCF/w10.dw
-../MODULES/SCF/w11.dw
-../MODULES/SCF/w12.dw
-../MODULES/SCF/w13.dw
-../MODULES/SCF/w14.dw
-../MODULES/SCF/w15.dw
-*
-* Select as many VDG window descriptors as needed
-*../MODULES/SCF/v1.dw
-*../MODULES/SCF/v2.dw
-*../MODULES/SCF/v3.dw
-*../MODULES/SCF/v4.dw
-*../MODULES/SCF/v5.dw
-*../MODULES/SCF/v6.dw
-*../MODULES/SCF/v7.dw
-*
-* Serial port drivers
-* CoCo Bit-Banger terminal port
-*../MODULES/SCF/scbbt.dr
-*../MODULES/SCF/t1_scbbt.dd
-* 6551 ACIA
-*../MODULES/SCF/sc6551.dr
-*../MODULES/SCF/t2_sc6551.dd
-*../MODULES/SCF/t3_sc6551.dd
-* Tandy Modem Pak
-*../MODULES/SCF/modpak.dr
-*../MODULES/SCF/m1.dd
-*../MODULES/SCF/m2.dd
-*
-* Printer drivers
-* ../MODULES/SCF/scbbp.dr
-* ../MODULES/SCF/p_scbbp.dd
-*
-* DriveWire 3 Printer drivers
-* ../MODULES/SCF/scdwp.dr
-* ../MODULES/SCF/p_scdwp.dd
-*
-* DriveWire Networking
-*../MODULES/SCF/scdwn.dr
-*../MODULES/SCF/term_scdwn.dt
-*../MODULES/SCF/n_scdwn.dd
-*../MODULES/SCF/n1_scdwn.dd
-*../MODULES/SCF/n2_scdwn.dd
-*../MODULES/SCF/n3_scdwn.dd
-*../MODULES/SCF/n4_scdwn.dd
-*../MODULES/SCF/n5_scdwn.dd
-*../MODULES/SCF/n6_scdwn.dd
-*../MODULES/SCF/n7_scdwn.dd
-*../MODULES/SCF/n8_scdwn.dd
-*../MODULES/SCF/n9_scdwn.dd
-*../MODULES/SCF/n10_scdwn.dd
-*../MODULES/SCF/n11_scdwn.dd
-*../MODULES/SCF/n12_scdwn.dd
-*../MODULES/SCF/n13_scdwn.dd
-*../MODULES/SCF/n14_scdwn.dd
-*
-* DriveWire Networking
-*../MODULES/SCF/scdwn.dr
-*../MODULES/SCF/term_scdwn.dt
-*../MODULES/SCF/n0_scdwn.dd
-*../MODULES/SCF/n1_scdwn.dd
-*../MODULES/SCF/n2_scdwn.dd
-*../MODULES/SCF/n3_scdwn.dd
-*../MODULES/SCF/n4_scdwn.dd
-*../MODULES/SCF/n5_scdwn.dd
-*../MODULES/SCF/n6_scdwn.dd
-*../MODULES/SCF/n7_scdwn.dd
-*../MODULES/SCF/n8_scdwn.dd
-*../MODULES/SCF/n9_scdwn.dd
-*../MODULES/SCF/n10_scdwn.dd
-*../MODULES/SCF/n11_scdwn.dd
-*../MODULES/SCF/n12_scdwn.dd
-*../MODULES/SCF/n13_scdwn.dd
-*../MODULES/SCF/n14_scdwn.dd
-*
-* VRN is a driver module used by certain games, including King's Quest III,
-* Leisure Suit Larry and Flight Simulator II.  A /nil descriptor is also
-* supported.
-../MODULES/SCF/vrn.dr
-../MODULES/SCF/vi.dd
-../MODULES/SCF/ftdd.dd
-*
-***************************************
-* Pipe Section
-*
-* Pipes are a useful but optional part of a system.
-../MODULES/PIPE/pipeman.mn
-../MODULES/PIPE/piper.dr
-../MODULES/PIPE/pipe.dd
-*
-***************************************
-* Clock Section
-*
-* Select one clock module depending upon your power line frequency
-* (60Hz = USA/Canada; 50Hz = Europe, Australia)
-../MODULES/CLOCKS/clock_60hz
-*../MODULES/CLOCKS/clock_50hz
-* Select one clock2 module that supports your real-time clock, if any.
-* Besides support for the internal software clock, the following
-* hardware clocks are supported: Burke & Burke, Disto 2-N-1, Disto 4-N-1,
-* Eliminator, Harris, SmartWatch, Cloud-9 (SuperIDE), the MESS emulator, Jeff
-* Vavasour's CoCo emulator and DriveWire
-*../MODULES/CLOCKS/clock2_soft
-*../MODULES/CLOCKS/clock2_bnb
-*../MODULES/CLOCKS/clock2_disto2
-*../MODULES/CLOCKS/clock2_disto4
-*../MODULES/CLOCKS/clock2_elim
-*../MODULES/CLOCKS/clock2_harris
-*../MODULES/CLOCKS/clock2_smart
-*../MODULES/CLOCKS/clock2_jvemu
-*../MODULES/CLOCKS/clock2_messemu
-*../MODULES/CLOCKS/clock2_cloud9
-../MODULES/CLOCKS/clock2_dw3
-*
-***************************************
-* System Kick-Start Module
-*
-* Choose which startup module you wish to use. (sysgo_dd is recommended
-* for most configurations.)
-* 
-* Alternatively, this module can reside in the root directory of the
-* boot device, saving precious system RAM.
-../MODULES/SYSMODS/sysgo_dd
-*../MODULES/SYSMODS/sysgo_h0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level2/coco3_6309/scripts/mb.dw	Sun Nov 24 12:07:31 2013 +0100
@@ -0,0 +1,31 @@
+-t
+-x
+tmode .1 pau=0
+echo * NitrOS-9 Level 2 Boot Creation Script
+echo *
+echo * This script creates a bootable DriveWire 3 disk image
+echo * using the dw.bl bootlist file.
+echo *
+echo * The resulting disk will boot NitrOS-9 from DriveWire disk 0.
+echo *
+echo "Please type the destination device (e.g. /x0, /x1)"
+var.1
+prompt Insert a blank disk in %1 and press a key:
+echo *
+echo * Step 1: Format disk in %1
+format %1 "NitrOS-9 Level 2 Boot Disk" r
+ynn
+echo *
+echo * Step 2: Create a custom boot track
+merge ../MODULES/BOOTTRACK/rel_80 ../MODULES/BOOTTRACK/boot_dw ../MODULES/BOOTTRACK/krn>-bttemp
+echo *
+echo * Step 3: Create the bootfile and boot track
+os9gen %1 -t=bttemp<../BOOTLISTS/dw.bl
+del bttemp
+echo *
+echo * Step 4: Populate the disk with essential files
+copy ../MODULES/SYSMODS/sysgo_dd %1/sysgo
+makdir %1/CMDS
+copy -w=%1/CMDS ../CMDS/shell ../CMDS/grfdrv
+echo *
+echo * We're done
--- a/level2/coco3_6309/scripts/mb.dw3	Sun Nov 24 11:45:32 2013 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
--t
--x
-tmode .1 pau=0
-echo * NitrOS-9 Level 2 Boot Creation Script
-echo *
-echo * This script creates a bootable DriveWire 3 disk image
-echo * using the dw3.bl bootlist file.
-echo *
-echo * The resulting disk will boot NitrOS-9 from DriveWire disk 0.
-echo *
-echo "Please type the destination device (e.g. /x0, /x1)"
-var.1
-prompt Insert a blank disk in %1 and press a key:
-echo *
-echo * Step 1: Format disk in %1
-format %1 "NitrOS-9 Level 2 Boot Disk" r
-ynn
-echo *
-echo * Step 2: Create a custom boot track
-merge ../MODULES/BOOTTRACK/rel_80 ../MODULES/BOOTTRACK/boot_dw3 ../MODULES/BOOTTRACK/krn>-bttemp
-echo *
-echo * Step 3: Create the bootfile and boot track
-os9gen %1 -t=bttemp<../BOOTLISTS/dw3.bl
-del bttemp
-echo *
-echo * Step 4: Populate the disk with essential files
-copy ../MODULES/SYSMODS/sysgo_dd %1/sysgo
-makdir %1/CMDS
-copy -w=%1/CMDS ../CMDS/shell ../CMDS/grfdrv
-echo *
-echo * We're done