changeset 3116:174eb9eda7b1

New port "mc09" for Multicomp09, an FPGA-based 6809 machine Include new commands/descriptor for mc09 clock and SD controller
author Neal Crook <foofoobedoo@gmail.com>
date Sat, 17 Oct 2015 21:21:11 +0100
parents 460fdd304adf
children 47cd23dcf55e
files defs/mc09.d defs/mc09vtio.d level1/mc09/bootfiles/defsfile level1/mc09/bootfiles/makefile level1/mc09/bootlists/dw.bl level1/mc09/bootlists/standard.bl level1/mc09/cmds/defsfile level1/mc09/cmds/makefile level1/mc09/defs/defsfile.asm level1/mc09/defs/makefile level1/mc09/defsfile level1/mc09/makefile level1/mc09/modules/defsfile level1/mc09/modules/kernel/defsfile level1/mc09/modules/kernel/makefile level1/mc09/modules/makefile level1/mc09/port.mak level1/mc09/scripts/mb.dw level1/mc09/scripts/mb.floppy level1/mc09/startup level1/mc09/startup.dw level1/mc09/sys/makefile level1/mc09/wwwroot/Makefile level1/modules/mc09clock.asm level1/modules/mc09sdc.asm level1/modules/mc09sdcdesc.asm lib/mc09.as
diffstat 27 files changed, 4012 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/defs/mc09.d	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,298 @@
+               IFNE      MC09.D-1
+MC09.D         SET       1
+
+********************************************************************
+* mc09.d - NitrOS-9 System Definitions for the Multicomp09
+*
+* When the primary boot loader passes control to the "track34" code
+* the system memory map looks like this:
+*
+*     $0000----> ==================================
+*               |                                  |
+*               |                                  |
+*               |              RAM                 |
+*               |                                  |
+*               |                                  |
+*     $FFD0---->|==================================|
+*               |              I/O                 |
+*     $FFE0---->|==================================|
+*               |              RAM                 |
+*               |==================================|
+*     $FFFF---->
+*
+* The exception vectors at $FFF2 and onwards are initialised to vector to RAM
+* as per coco1, just as krn expects. Specifically:
+*
+* $FFF2 holds vector to $0100 for SWI3
+* $FFF4 holds vector to $0103 for SWI2
+* $FFF6 holds vector to $010F for FIRQ
+* $FFF8 holds vector to $010C for IRQ
+* $FFFA holds vector to $0106 for SWI
+* $FFFC holds vector to $0109 for NMI
+*
+* The 16-location I/O space and the interrupt hook-up are described below.
+*
+* $Id$
+*
+* Edt/Rev  YYYY/MM/DD  Modified by
+* Comment
+* ------------------------------------------------------------------
+* 0.1      2015/10/17  Neal Crook. Tidy-up for first commit.
+*
+               NAM       Multicomp09Defs
+               IFEQ      Level-1
+               TTL       NitrOS-9 System Definitions for the Multicomp09
+               ELSE
+               IFEQ      Level-2
+               TTL       NitrOS-9 Level 2 System Type Definitions
+               ELSE
+               IFEQ      Level-3
+               TTL       NitrOS-9 Level 3 System Type Definitions
+               ENDC
+               ENDC
+               ENDC
+
+
+**********************
+* CPU Type Definitions
+*
+Color          SET       1
+Color3         SET       2
+               IFEQ      Level-1
+CPUType        SET       Color
+               ELSE
+CPUType        SET       Color3
+               ENDC
+
+
+******************************
+* Clock Speed Type Definitions
+*
+OneMHz         EQU       1
+TwoMHz         EQU       2
+               IFEQ      CPUType-Color
+CPUSpeed       SET       OneMHz
+               ELSE
+CPUSpeed       SET       TwoMHz
+               ENDC
+
+
+**********************************
+* Power Line Frequency Definitions
+* Multicomp09 has no dependency on power line frequency but setting
+* it to Hz50 is the simplest way to make TkPerSec 50, which is important
+* [NAC HACK 2015Aug31] actually no need to change it - gets applied at
+* command line in modules/makefile to generate a 50Hz and 60Hz version.
+*
+Hz50           EQU       50                  Assemble clock for 50 hz power
+Hz60           EQU       60                  Assemble clock for 60 hz power
+               IFNDEF    PwrLnFrq
+PwrLnFrq       SET       Hz50                Set to Appropriate freq
+               ENDC
+
+
+**********************************
+* Ticks per second
+*
+               IFNDEF    TkPerSec
+               IFEQ      PwrLnFrq-Hz50
+TkPerSec       SET       50
+               ELSE
+TkPerSec       SET       60
+               ENDC
+               ENDC
+
+
+******************
+* ACIA type set up
+*
+* [NAC HACK 2015Sep06] is this used anywhere?
+               ORG       1
+ACIA6850       RMB       1                   MC6850 acia.
+ACIA6551       RMB       1                   SY6551 acia.
+ACIA2661       RMB       1                   SC2661 acia.
+ACIATYPE       SET       ACIA6551
+
+
+****************************************
+* Special character Bit position equates
+*
+SHIFTBIT       EQU       %00000001
+CNTRLBIT       EQU       %00000010
+ALTERBIT       EQU       %00000100
+UPBIT          EQU       %00001000
+DOWNBIT        EQU       %00010000
+LEFTBIT        EQU       %00100000
+RIGHTBIT       EQU       %01000000
+SPACEBIT       EQU       %10000000
+
+
+********************************************************************
+* Multicomp09 Interrupts:
+*
+* NMI - wired to single-step logic
+* FIRQ - (currently) unused
+* IRQ - wired to timer interrupt, VDU/KBD virtual ACIA and serial
+*       ports 1 and 2.
+
+********************************************************************
+* Multicomp09 I/O space is $FFD0-$FFDF (16 locations). The equates
+* below describe the I/O registers.
+
+********************************************************************
+* VDU/KBD (VIRTUAL ACIA)
+VDUSTA         EQU $FFD0
+VDUDAT         EQU $FFD1
+
+* SERIAL PORT 1
+UARTSTA1       EQU $FFD2
+UARTDAT1       EQU $FFD3
+
+* SERIAL PORT 2
+UARTSTA2       EQU $FFD4
+UARTDAT2       EQU $FFD5
+
+* GPIO device
+GPIOADR        EQU $FFD6
+GPIODAT        EQU $FFD7
+
+********************************************************************
+* SDCARD CONTROL REGISTERS
+* SEE VHDL HEADER FOR PROG GUIDE
+SDDATA         EQU $FFD8
+SDCTL          EQU $FFD9
+SDLBA0         EQU $FFDA
+SDLBA1         EQU $FFDB
+SDLBA2         EQU $FFDC
+
+********************************************************************
+* 50Hz TIMER INTERRUPT
+* TIMER (READ/WRITE)
+*
+* AT RESET, THE TIMER IS DISABLED AND THE INTERRUPT IS DEASSERTED. TIMER READS AS 0.
+* BIT[1] IS READ/WRITE, TIMER ENABLE.
+* BIT[7] IS READ/WRITE-1-TO-CLEAR, INTERRUPT.
+*
+* IN AN ISR THE TIMER CAN BE SERVICED BY PERFORMING AN INC ON ITS ADDRESS
+*
+* READ  WRITE  COMMENT
+*  N/A   $02   ENABLE TIMER
+*  $00   $01   TIMER WAS/REMAINS DISABLED. N=0.
+*  $02   $03   TIMER WAS/REMAINS ENABLED, NO INTERRUPT. N=0.
+*  $80   $81   TIMER WAS/REMAINS DISABLED, OLD PENDING INTERRUPT CLEARED. N=1.
+*  $82   $83   TIMER WAS/REMAINS DISABLED, OLD PENDING INTERRUPT CLEARED. N=1.
+*
+TIMER          EQU $FFDD
+
+********************************************************************
+* MEM_MAPPER2 CONTROL REGISTERS
+* MMUADR (WRITE-ONLY)
+* 7   - ROMDIS (RESET TO 0)
+* 6   - TR
+* 5   - MMUEN
+* 4   - RESERVED
+* 3:0 - MAPSEL
+* MMUDAT (WRITE-ONLY)
+* 7   - WRPROT
+* 6:0 - PHYSICAL BLOCK FOR CURRENT MAPSEL
+
+MMUADR         EQU $FFDE
+MMUDAT         EQU $FFDF
+
+
+
+********************************************************************
+********************************************************************
+* Coco stuff that's needed to allow other files to compile
+* [NAC HACK 2015Oct17] need to get rid of this eventually.
+
+A.AciaP        SET       $FF68               Aciapak Address
+A.ModP         SET       $FF6C               ModPak Address
+DPort          SET       $FF40               Disk controller base address
+MPI.Slct       SET       $FF7F               Multi-Pak slot select
+MPI.Slot       SET       $03                 Multi-Pak default slot
+PIA0Base       EQU       $FF00
+PIA1Base       EQU       $FF20
+
+
+******************
+* VDG Devices
+*
+A.TermV        SET       $FFC0               VDG Term
+A.V1           SET       $FFC1               Possible additional VDG Devices
+A.V2           SET       $FFC2
+A.V3           SET       $FFC3
+A.V4           SET       $FFC4
+A.V5           SET       $FFC5
+A.V6           SET       $FFC6
+A.V7           SET       $FFC7
+
+
+               IFEQ      Level-1
+
+*************************************************
+*
+* NitrOS-9 Level 1 Section
+*
+*************************************************
+
+HW.Page        SET       $FF                 Device descriptor hardware page
+
+               ELSE
+
+*************************************************
+*
+* NitrOS-9 Level 2 Section
+*
+*************************************************
+
+****************************************
+* Dynamic Address Translator Definitions
+*
+DAT.BlCt       EQU       8                   D.A.T. blocks/address space
+DAT.BlSz       EQU       (256/DAT.BlCt)*256  D.A.T. block size
+DAT.ImSz       EQU       DAT.BlCt*2          D.A.T. Image size
+DAT.Addr       EQU       -(DAT.BlSz/256)     D.A.T. MSB Address bits
+DAT.Task       EQU       $FF91               Task Register address
+DAT.TkCt       EQU       32                  Number of DAT Tasks
+DAT.Regs       EQU       $FFA0               DAT Block Registers base address
+DAT.Free       EQU       $333E               Free Block Number
+DAT.BlMx       EQU       $3F                 Maximum Block number
+DAT.BMSz       EQU       $40                 Memory Block Map size
+DAT.WrPr       EQU       0                   no write protect
+DAT.WrEn       EQU       0                   no write enable
+SysTask        EQU       0                   Coco System Task number
+IOBlock        EQU       $3F
+ROMBlock       EQU       $3F
+IOAddr         EQU       $7F
+ROMCount       EQU       1                   number of blocks of ROM (High RAM Block)
+RAMCount       EQU       1                   initial blocks of RAM
+MoveBlks       EQU       DAT.BlCt-ROMCount-2 Block numbers used for copies
+BlockTyp       EQU       1                   chk only first bytes of RAM block
+ByteType       EQU       2                   chk entire block of RAM
+Limited        EQU       1                   chk only upper memory for ROM modules
+UnLimitd       EQU       2                   chk all NotRAM for modules
+* NOTE: this check assumes any NotRAM with a module will
+*       always start with $87CD in first two bytes of block
+RAMCheck       EQU       BlockTyp            chk only beg bytes of block
+ROMCheck       EQU       Limited             chk only upper few blocks for ROM
+LastRAM        EQU       IOBlock             maximum RAM block number
+
+***************************
+* Color Computer 3 Specific
+*
+MappedIO       EQU       true                (Actually False but it works better this way)
+
+********************
+* Hardware addresses
+*
+GIMERegs       EQU       $FF00               Base address of GIME registers
+IrqEnR         EQU       $FF92               GIME IRQ enable/status register
+BordReg        EQU       $FF9A               Border color register
+PalAdr         EQU       $FFB0               Palette registers
+
+HW.Page        SET       $07                 Device descriptor hardware page
+
+               ENDC
+
+               ENDC
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/defs/mc09vtio.d	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,906 @@
+               IFNE      COCOVTIO.D-1
+COCOVTIO.D     SET       1
+
+               IFEQ      Level-1
+
+********************************************************************
+* VTIODefs - Video Terminal I/O Definitions for CoCo 1/2
+*
+* $Id$
+*
+* Edt/Rev  YYYY/MM/DD  Modified by
+* Comment
+* ------------------------------------------------------------------
+*          2004/11/29  P.Harvey-Smith.
+* Added symbolic defines for bits in V.CoLoad.
+*
+*          2004/12/02  P.Harvey-Smith.
+* Moved over all variables from co51.asm
+*
+*          2005/04/09  P.Harvey-Smith.
+* Decoded rest of the CoHR memory locations.
+*
+*	       2005/04/24  P.Harvey-Smith.
+* Added variables for cursor flash, currently only implemented in co51
+*
+               NAM       VTIODefs  
+               TTL       Video Terminal I/O Definitions for CoCo 1/2
+
+********************
+* VTIO Static Memory
+*
+               ORG       V.SCF
+V.ScrnA        RMB       2                   (2) screen start address in system memory
+V.ScrnE        RMB       2                   (2) address of end of screen
+V.CrsrA        RMB       1                   (2) cursor address
+V.CrsAL        RMB       1                   cursor address low
+V.CChar        RMB       1                   value of character under cursor
+V.Mode         RMB       1                   mode: 0=256x192 x2, 1=128x192 x4
+V.NGChr        RMB       1                   number of additional characters to get
+V.RTAdd        RMB       2                   (2) return address after getting characters
+V.NChar        RMB       1                   character to process
+V.NChr2        RMB       1                   and the next one
+               RMB       1
+V.Chr1         RMB       1                   same as under cursor character
+V.CColr        RMB       1                   cursor color
+V.Col          RMB       1                   number of columns for this screen
+V.Row          RMB       1                   number of rows
+V.Alpha        RMB       1                   0 when in alpha mode
+V.PIA1         RMB       1                   PIA1Base value
+V.Rdy          RMB       1                   device ready (see SS.DStat 0=not ready)
+V.CFlg1        RMB       1                   VDG display code values
+V.SBAdd        RMB       2                   (2) address of block screen is in
+V.GBuff        RMB       2                   allocation for graphics buffers (block#)
+V.AGBuf        RMB       4                   (2) additional graphics buffer
+V.FFMem        RMB       2                   Flood fill alloc'ed mem
+V.FFSPt        RMB       2                   Flood fill current stack pointer
+V.FFSTp        RMB       1                   Flood fill stack top
+V.FF6          RMB       1                   flood fill flag
+V.FFFlag       RMB       1                   ??
+V.MTabl        RMB       2                   (2) address of mask table for pixels in byte
+V.PixBt        RMB       1                   bit mask for modes (0=$07, 1=$03 )#pixels/byte
+V.GCrsX        RMB       1                   graphics cursor X value
+V.GCrsY        RMB       1                   graphics cursor Y
+V.Msk1         RMB       1                   mask byte 1
+V.Msk2         RMB       1                   mask byte 2 (00,55,AA,FF)
+V.MCol         RMB       1                   color? (C003,8001)
+V.4A           RMB       1
+V.PMask        RMB       1                   pixel mask for colors (i.e. $55, $CC etc)
+V.4C           RMB       1
+V.4D           RMB       1
+V.4E           RMB       1
+V.4F           RMB       1
+V.Caps         RMB       1                   caps lock info: $00=lower $FF=upper
+V.ClkCnt       RMB       1                   clock count ??
+V.WrChr        RMB       1                   character to write
+V.CurCo        RMB       1                   current CO-module in use
+* start of CoWP-specific static memory
+V.Co80X        RMB       1                   V.54
+V.Co80Y        RMB       1                   V.55
+V.ColPtr       RMB       1                   V.56
+V.RowPtr       RMB       1                   V.57
+V.C80X         RMB       1                   CoWP X position
+V.C80Y         RMB       1                   CoWP Y position
+V.Invers       RMB       1
+* end of CoWP-specific static memory
+V.DspVct       RMB       2                   vector to display screen
+V.CnvVct       RMB       2                   vector to X/Y to address conversion
+V.LKeyCd       RMB       1                   last key code
+V.2Key1        RMB       1                   2nd Key 1
+V.2Key2        RMB       1                   2nd Key 2
+V.2Key3        RMB       1                   2nd Key 3
+V.Key1         RMB       1                   Key 1
+V.Key2         RMB       1                   Key 2
+V.Key3         RMB       1                   Key 3
+V.ShftDn       RMB       1                   SHIFT/CTRL state
+V.CtrlDn       RMB       1                   CTRL key down
+V.KeyFlg       RMB       1                   key flag
+V.AltDwn       RMB       1                   ALT key down
+V.KySns        RMB       1                   key sense flags
+V.KySame       RMB       1                   key same as last flag
+V.KySnsF       RMB       1                   key sense flag
+V.Spcl         RMB       1
+V.KTblLC       RMB       1                   key table entry #
+V.6F           RMB       1                   ???
+V.COLoad       RMB       1                   CO-module loaded flags
+V.CFlag        RMB       1                   true lowercase flag $10=true, $00=false
+V.GrfDrvE      RMB       2                   GrfDrv entry point
+V.CoVDGE       RMB       2                   CoVDG entry point
+V.CoWPE        RMB       2                   CoWP entry point
+V.CoHRE        RMB       2                   CoHR entry point
+
+V.Flash        RMB       2                   Cursor flash routine address.
+v.FlashCount   RMB       1                   Cursor flash count
+V.NoFlash      RMB       1                   When this is non-zero do not flash cursor
+
+* CoHR vars
+
+V.51ScrnA      RMB       2                   * Screen address.
+V.51XPos       RMB       1                   * X co-ordinate
+V.51YPos       RMB       1                   * Y co-ordinate
+V.51EscSeq     RMB       1                   * In escape sequence
+V.51ReverseFlag RMB       1                   * Reverse video flag
+V.51UnderlineFlag RMB       1                   * Underline flag
+V.51CtrlDispatch RMB       2                   * Ctrl char dispatch address, currently processing
+V.51BytePixOffset RMB       1                   * byte offset in screen line, of character X position        
+V.51OldCursorPosX RMB       1                   * Position of old cursor before update        
+V.51OldCursorPosY RMB       1
+V.51CursorChanged RMB       1                   * Has cursor position changed ? 1=yes,0=no
+V.51CursorOn   RMB       1                   * Is cursor on ? 1=yes 0=no		         
+V.51XORFlag    RMB       1                   * and data to screen (0) or Xor (1)  		       
+V.51ScreenMask1 RMB       1                   * screen masks for drawing characters on screen         
+V.51ScreenMask2 RMB       1
+* End of CoHR vars
+**** Note these have to come at the end of the defs, or the keyboard ****
+**** code can clobber variables defined after these !                ****
+V.IBufH        RMB       1                   input buffer head
+V.IBufT        RMB       1                   input buffer tail
+V.InBuf        RMB       1                   input buffer ptr
+V.51End        RMB       1
+               RMB       250-.
+V.Last         EQU       .
+
+
+* Unknown for now
+*VD.FFMem rmb   2  (2) bottom of stack for flood fill
+*VD.FFSPt rmb   2  (2) flood fill stack pointer
+*VD.FFSTp rmb   2  (2) flood fill stack top pointer
+*VD.FF6   rmb   1   flood fill flag
+*VD.MCol2 rmb   1  color
+*VD.FF1   rmb   1  data for flood fill
+*VD.FF2   rmb   1  data for flood fill
+*VD.FFMsk rmb   1  flood fill mask
+*VD.FFFlg rmb   1  flood fill flag
+*VD.Palet rmb   16 (16) current palette values
+*VD.PlFlg rmb   1  initialized to $08 by L00DB, and then unused!
+
+*
+* Defs for V.COLoad flags.
+* 
+
+ModCoVDG       EQU       %00000010           CoVDG, Built-in VDG 32x16.
+ModCoWP        EQU       %00000100           CoWP, WordPak, 80x25
+ModCoHR        EQU       %00001000           CoHR, PMODE 4 51x25 text
+
+*
+* Defs for cursor flash counter
+*
+
+CFlash50hz     EQU       25                  * 50Hz flash counter
+CFlash60Hz     EQU       30                  * 60Hz flash counter
+
+               ELSE
+               
+********************************************************************
+* VTIODefs - Video Terminal I/O Definitions for CoCo 3
+*
+* $Id$
+*
+* Edt/Rev  YYYY/MM/DD  Modified by
+* Comment
+* ------------------------------------------------------------------
+*          2004/07/18  Boisy G. Pitre
+* Started from systype
+
+               NAM       VTIODefs
+               TTL       Video Terminal I/O Definitions for CoCo 3
+
+****************
+* Window Devices
+*
+               ORG       $FF9F
+A.W            RMB       1                   $FF9F Generic Window Descriptor
+A.TermW        RMB       1                   $FFA0 Windowing Term
+A.W1           RMB       1                   $FFA1
+A.W2           RMB       1                   $FFA2
+A.W3           RMB       1                   $FFA3
+A.W4           RMB       1                   $FFA4
+A.W5           RMB       1                   $FFA5
+A.W6           RMB       1                   $FFA6
+A.W7           RMB       1                   $FFA7
+A.W8           RMB       1                   $FFA8
+A.W9           RMB       1                   $FFA9
+A.W10          RMB       1                   $FFAA
+A.W11          RMB       1                   $FFAB
+A.W12          RMB       1                   $FFAC
+A.W13          RMB       1                   $FFAD
+A.W14          RMB       1                   $FFAE
+A.W15          RMB       1                   $FFAF
+
+**********************************
+* Pointer Device Packet Definition
+*
+               ORG       0
+Pt.Valid       RMB       1                   Is returned info valid (0=no/1=yes)
+Pt.Actv        RMB       1                   Active Side 0=off/1=Right/2=left
+Pt.ToTm        RMB       1                   Time out Initial value
+               RMB       2                   reserved
+Pt.TTTo        RMB       1                   Time Till Timeout
+Pt.TSSt        RMB       2                   Time Since Start Counter
+Pt.CBSA        RMB       1                   Current Button State Button A
+Pt.CBSB        RMB       1                   Current Button State Button B
+Pt.CCtA        RMB       1                   Click Count Button A
+Pt.CCtB        RMB       1                   Click Count Button B
+Pt.TTSA        RMB       1                   Time This State Counter Button A
+Pt.TTSB        RMB       1                   Time This State Counter Button B
+Pt.TLSA        RMB       1                   Time Last State Counter Button A
+Pt.TLSB        RMB       1                   Time Last State Counter Button B
+               RMB       2                   Reserved
+Pt.BDX         RMB       2                   Button down X value EXPERIMENTAL
+Pt.BDY         RMB       2                   Button down Y value
+Pt.Stat        RMB       1                   Window Pointer type location
+Pt.Res         RMB       1                   Resolution (0..640 by: 0=ten/1=one)
+Pt.AcX         RMB       2                   Actual X Value
+Pt.AcY         RMB       2                   Actual Y Value
+Pt.WRX         RMB       2                   Window Relative X
+Pt.WRY         RMB       2                   Window Relative Y
+Pt.Siz         EQU       .                   Packet Size 32 bytes
+
+**************************
+* window regions for mouse
+*
+WR.Cntnt       EQU       0                   content region
+WR.Cntrl       EQU       1                   control region
+WR.OfWin       EQU       2                   off window
+
+*************************************
+* Standard system get/put buffer defs
+*
+*
+* system group numbers
+*
+               ORG       200
+Grp.Fnt        RMB       1                   font group
+Grp.Clip       RMB       1                   clipboard group
+Grp.Ptr        RMB       1                   pointer group
+Grp.Pat2       RMB       1                   pattern group 2 color
+Grp.Pat4       RMB       1                   pattern group 4 color
+Grp.Pat6       RMB       1                   pattern group 16 color
+*
+* font buffer numbers
+*
+               ORG       1
+Fnt.S8x8       RMB       1                   standard 8x8 font
+Fnt.S6x8       RMB       1                   standard 6x8 font
+Fnt.G8x8       RMB       1                   standard graphics 8x8 font
+*
+* pattern buffer numbers
+*
+               ORG       1
+Pat.Dot        RMB       1
+Pat.Vrt        RMB       1
+Pat.Hrz        RMB       1
+Pat.XHtc       RMB       1
+Pat.LSnt       RMB       1
+Pat.RSnt       RMB       1
+Pat.SDot       RMB       1
+Pat.BDot       RMB       1
+*
+* pointer buffer numbers
+*
+               ORG       1
+Ptr.Arr        RMB       1                   Arrow pointer
+Ptr.Pen        RMB       1                   Pencil pointer
+Ptr.LCH        RMB       1                   Large cross hair pointer
+Ptr.Slp        RMB       1                   Wait timer pointer
+Ptr.Ill        RMB       1                   Illegal action pointer
+Ptr.Txt        RMB       1                   Text pointer
+Ptr.SCH        RMB       1                   Small cross hair pointer
+
+**********************
+* KeyDrv Entry Points
+               ORG       0
+K$Init         RMB       3                   joystick initialization
+K$Term         RMB       3                   joystick termination
+K$FnKey        RMB       3                   get function key states
+K$RdKey        RMB       3                   get key states
+
+**********************
+* JoyDrv Entry Points
+               ORG       0
+J$Init         RMB       3                   joystick initialization
+J$Term         RMB       3                   joystick termination
+J$MsBtn        RMB       3                   get mouse button states
+J$MsXY         RMB       3                   get mouse X/Y coordinates
+J$JyBtn        RMB       3                   get joystick button states
+J$JyXY         RMB       3                   get joystick X/Y coordinates
+
+**********************
+* SndDrv Entry Points
+               ORG       0
+S$Init         RMB       3                   joystick initialization
+S$GetStt       RMB       3                   joystick termination
+S$SetStt       RMB       3                   joystick termination
+S$Term         RMB       3                   get joystick X/Y coordinates
+
+********************************
+* Window/Menu Bar Data Structure
+*
+* To be used in SS.WnSet SETSTAT to set up a Framed Window
+* for use in the high level windowing package.
+*
+NUMMENS        EQU       10                  maximum number of menus on menu bar
+NUMITMS        EQU       20                  maximum number of items in a menu
+MXTTLEN        EQU       15                  max chars for menu and item names
+WINSYNC        EQU       $C0C0               synch bytes for window validation
+*
+* Menu Item Descriptor : (MN.ITEMS)
+* one required for each item within the menu
+*
+               ORG       0
+MI.TTL         RMB       MXTTLEN             item name
+MI.ENBL        RMB       1                   enable flag
+MI.RES         RMB       5                   reserved bytes
+MI.SIZ         EQU       .                   size of menu item descriptor
+*
+* Menu Descriptor :
+* one for each menu on the manu bar
+* each is pointed to by MB.MPTR below
+*
+               ORG       0
+MN.TTL         RMB       MXTTLEN             menu title
+MN.ID          RMB       1                   menu id number (1-255)
+MN.XSIZ        RMB       1                   horiz. size of desired pull down
+MN.NITS        RMB       1                   number of items in menu
+MN.ENBL        RMB       1                   enable flag
+MN.RES         RMB       2                   reserved bytes
+MN.ITEMS       RMB       2                   pointer to array of menu items
+MN.SIZ         EQU       .                   size of menu descriptor
+*
+* Window Descriptor:
+* one required for each application in a framed window
+*
+               ORG       0
+WN.TTL         RMB       20                  title of window for title bar
+WN.NMNS        RMB       1                   number of menus in menu bar
+WN.XMIN        RMB       1                   minimal horiz. size for application to run
+WN.YMIN        RMB       1                   minimal vert. size for application to run
+WN.SYNC        RMB       2                   synch bytes ($C0C0)
+WN.RES         RMB       7                   reserved bytes
+WN.BAR         RMB       2                   pointer to arry of menu descriptors
+WN.SIZ         EQU       .                   size of window/menu bar descriptor
+
+*************************
+* Window Type Definitions
+*
+* To be used in setting up the border of the window in
+* the SS.WnSel SETSTAT
+*
+               ORG       0
+WT.NBox        RMB       1                   No Box
+WT.FWin        RMB       1                   Framed Window
+WT.FSWin       RMB       1                   Framed Window w/Scroll Bars
+WT.SBox        RMB       1                   Shadowed Box
+WT.DBox        RMB       1                   Double Box
+WT.PBox        RMB       1                   Plain Box
+
+*************************************
+* Pre-Defined Menu IDs for the system
+*
+               ORG       1
+MId.Mov        RMB       1                   move box
+MId.Cls        RMB       1                   close box
+MId.Grw        RMB       1                   grow box
+MId.SUp        RMB       1                   scroll up
+MId.SDn        RMB       1                   scroll down
+MId.SRt        RMB       1                   scroll right
+MId.SLt        RMB       1                   scroll left
+MId.Chr        RMB       1                   character was depressed
+               ORG       20
+MId.Tdy        RMB       1                   Tandy menu
+MId.Fil        RMB       1                   Files Menu
+MId.Edt        RMB       1                   Edit Menu
+MId.Sty        RMB       1                   Styles menu
+MId.Fnt        RMB       1                   Font menu
+
+
+******************************************************************************
+******************************************************************************
+**                                                                          **
+** NitrOS-9 Windowing system Global data definitions                        **
+**                                                                          **
+******************************************************************************
+******************************************************************************
+**                                                                          **
+** System memory block 0 layout:                                            **
+**                                                                          **
+** $0000-$0001 : FHL/Isted WD 1002-05 - interface base address              **
+** $0002       : FHL/Isted WD 1002-05 - boot device physical drive #        **
+** $0008       : Bruce Isted Serial mouse - button counter & rx count       **
+** $0009-$000B : Bruce Isted Serial mouse - RX buffer                       **
+** $000C-$000D : Bruce Isted Serial mouse - Current X position              **
+** $000E-$000F : Bruce Isted Serial mouse - Current Y position              **
+** $0010-$001F : unused (User definable)                                    **
+** $0020-$00FF : system direct page & some IRQ vectors                      **
+** $0100-$011F : Task usage table                                           **
+** $0120-$01FF : Virtual DAT tasks (pointed to by <D.TskIPt)                **
+** $0200-$02FF : memory block usage map ($80=Not RAM,$01=in use,$02=module) **
+** $0300-$03FF : system's system call dispatch table                        **
+** $0400-$04FF : user's sysem call dispatch table                           **
+** $0500-$05FF : process descriptor pointer table                           **
+** $0600-$07FF : System task (Task 0, ID 1) process descriptor              **
+** $0800-$08FF : System's stack space (initial ptr is $0900)                **
+** $0900-$09FF : SMAP table ($01=in used, $80=NOT RAM)                      **
+** $0A00-$0FFF : module directory DAT Images (8 bytes each)                 **
+** $1000-$10FF : System Global memory (pointed to by D.CCMem)               **
+** $1100-$11FF : GRFDRV global memory (DP=$11 in GRFDRV)                    **
+** $1200-$1247 : shared buffer between Grf/WindInt & GRFDRV (GP buffers)    **
+** $1248-$127F : ????                                                       **
+** $1280-$1A7F : the window tables (32 of $40 bytes each)                   **
+** $1A80-$1C7F : the screen tables (16 of $20 bytes each)                   **
+** $1C80-$2000 : the CC3 global mem stack (for windowing)                   **
+**                                                                          **
+******************************************************************************
+******************************************************************************
+
+* User settable values for VTIO/TC9IO/GrfInt/WindInt & GrfDrv
+MaxLines       EQU       25                  Max. Y coord text value
+Meg            SET       false               "true" if 1 or 2 meg machine
+
+COMP           EQU       0                   composite monitor
+RGB            EQU       1                   RGB Analog monitor 
+MONO           EQU       2                   monochrome monitor
+
+Monitor        SET       RGB
+
+* Global definitions
+KeyMse         EQU       %00000001           keyboard mouse enabled
+NumLck         EQU       %00000010           Numlock enabled (TC-9 use only)
+CapsLck        EQU       %00000100           Capslock enabled
+MaxRows        EQU       640                 maximum X co-ordinate allowed on mouse
+               IFEQ      MaxLines-25
+MaxLine        EQU       198                 maximum Y co-ordinate allowed on mouse
+               ELSE      
+MaxLine        EQU       191                 maximum Y co-ordinate allowed on mouse
+               ENDC      
+
+*****************************************************************************
+* Static memory area for each window (VTIO/TC9IO)
+* Should set up a write buffer (using parm area?) between SCF, VTIO & Grfdrv
+* so we can 'burst mode' text output (copy up to 48 chars to Grfdrv's parm
+* area, and have grfdrv loop through & write all 48 chars to screen in 1 loop
+* May have to have smaller limit for text to gfx screens, as it will run much
+* slower, unless GrfDrv is made Partially/Fully Re-Entrant
+*
+* STRONG CAUTION:  scfdefs MUST be included first before this file if
+* V.SCF is to be resolved properly in pass 1!!
+               ORG       V.SCF
+V.WinType      RMB       1                   window type (0=Windint/GrfInt,2=VDGInt)      $1D
+V.InfVld       RMB       1                   Rest of info here valid? (0=NO, >0 = YES)    $1E
+V.DevPar       RMB       2                   high bit=window device                       $1F
+V.ULCase       RMB       1                   special key flags (Capslck & keyboard mouse) $21
+V.KySnsFlg     RMB       1                   flag for key sense setstat                   $22
+V.ScrChg       RMB       1                   screen change flag                           $23
+V.SSigID       RMB       1                   data ready process ID                        $24
+V.SSigSg       RMB       1                   data ready signal code                       $25
+V.MSigID       RMB       1                   mouse signal process ID                      $26
+V.MSigSg       RMB       1                   mouse signal signal code                     $27
+V.MSmpl        RMB       1                   mouse sample rate                            $28
+V.MTime        RMB       1                   mouse timeout value                          $29
+               RMB       1                   unused                                       $2A
+V.MAutoF       RMB       1                   auto follow mouse flag                       $2B
+V.ParmCnt      RMB       1                   parameter count                              $2C
+V.ParmVct      RMB       2                   parameter vector                             $2D
+V.PrmStrt      RMB       2                   pointer to params start                      $2F
+V.NxtPrm       RMB       2                   pointer to next param storage                $31
+V.EndPtr       RMB       1                   last character read offset                   $33
+V.InpPtr       RMB       1                   next character read offset                   $34
+V.WinNum       RMB       1                   window table entry #                         $35
+V.DWNum        RMB       1                   dwnum from descriptor                        $36
+V.CallCde      RMB       1                   internal comod call code #                   $37
+CC3Parm        RMB       128-.               global parameter area
+ReadBuf        RMB       256-.               read input buffer (keyboard)
+CC3DSiz        EQU       .
+
+*****************************************************************************
+* GrfInt/WindInt global memory area
+* This area sits in system block 0 from $1000 to $10ff
+WGlobal        EQU       $1000               useful value (points to address starting below)
+               ORG       0
+G.CurTik       RMB       1                   Constant - # Clock ticks/cursor updates (2)
+G.CntTik       RMB       1                   Current tick count for cursor updates
+G.GfBusy       RMB       1                   Grfdrv is busy flag (1=busy)
+G.OrgAlt       RMB       2                   Place to store D.AltIRQ before altering
+*g0003    rmb   2          NEW: UNUSED
+g0005          RMB       2                   Temp save in Windint RG
+G.GrfStk       RMB       2                   grfdrv stack pointer ($07)
+G.MonTyp       RMB       1                   monitor type
+g000A          EQU       .                   Old label for compatibility
+G.CrDvFl       RMB       1  Are we current device flag (only set when all
+*                           Parms have been moved to Dev Mem)
+*                           0=We are not on our device
+*                           1=We are the current device
+*                           (Used by comod (GRF/WIND/VDGInt) to determine
+*                           whether or not to update GIME regs themselves
+*                           If not current device, they don't.)
+G.WinType      RMB       1                   current device's V.TYPE
+G.CurDvM       RMB       2                   current device memory pointer for co-module use
+G.WIBusy       RMB       1                   WindInt is busy flag (1=busy)
+G.AlPckt       RMB       6                   F$Alarm time packet
+G.AlPID        RMB       1                   F$Alarm proc ID ($15)
+G.AlSig        RMB       1                   F$Alarm signal code ($16)
+G.BelVec       RMB       2                   BELL routine vector
+G.DefPal       RMB       2                   pointer to default palette data in global mem
+G.TnCnt        RMB       1                   SS.Tone duration counter
+G.BelTnF       RMB       1                   BELL tone flag
+g001D          RMB       3
+G.CurDev       RMB       2                   current device's static memory pointer ($20)
+G.PrWMPt       RMB       2                   previous window static mem pointer $(22)
+G.BCFFlg       RMB       1                   bit coded co-module found flags ($24)
+*                           00000010 : VDGInt found
+*                           10000000 : GrfDrv found
+g0025          RMB       1
+G.KTblLC       RMB       1                   Key table entry# last checked (1-3)
+*         IFEQ  TC9-true
+*CurLght  rmb   1          current keyboard light settings
+*         ELSE  
+G.LastCh       RMB       1                   last keyboard character (ASCII value)
+*         ENDC  
+G.LKeyCd       RMB       1                   last keyboard code
+G.KyRept       RMB       1                   key repeat counter
+* A secondary 3 key table (same format as g002D below)
+G.2Key1        RMB       1                   $2A
+G.2Key2        RMB       1                   $2B
+G.2Key3        RMB       1
+* Up to 3 keys can be registerd at once, and they are stored here. If more
+* than 3 are hit, the last key is overwritten with the very last key down that
+* was checked. Format for all three is the same as the PIA column/row byte @
+* KeyFlag below.
+G.Key1         RMB       1                   Key 1 being held down (Row/Column #)
+G.Key2         RMB       1                   Key 2 being held down (Row/Column #)
+G.Key3         RMB       1                   Key 3 being held down (Row/Column #)
+G.ShftDn       RMB       1                   SHIFT key down flag (COM'd) ($30)
+G.CntlDn       RMB       1                   CTRL key down flag (0=NO)
+G.KeyFlg       RMB       1                   Keyboard PIA bit #'s for columns/rows
+*                           %00000111-Column # (Output, 0-7)
+*                           %00111000-Row # (Input, 0-6)
+G.AltDwn       RMB       1                   ALT key down flag (0=NO)
+G.KySns        RMB       1                   key sense byte
+G.KySame       RMB       1                   same key flag
+G.CapLok       RMB       1                   CapsLock/SysRq key down flag
+               RMB       1
+g0038          RMB       1                   grfdrv initialized flag
+               RMB       2
+G.MSmpRt       RMB       1                   Current mouse sample # (# ticks till next read)
+G.Mouse        RMB       Pt.Siz              mouse packet ($3C)
+g005C          RMB       2                   Temp for relative mouse X coord calculation
+g005E          RMB       2                   Temp for relative mouse Y coord calculation
+G.MSmpRV       RMB       1                   Mouse sample reset value (# ticks till next read)
+G.KyDly        RMB       1                   initial key repeat delay constant ($61)
+G.KySpd        RMB       1                   secondary key repeat delay constant
+*         IFEQ  TC9-true
+*KeyParm  rmb   1          keyboard command parameter byte
+*         ELSE  
+G.KyMse        RMB       1                   keyboard mouse flag ($63)
+*         ENDC  
+G.Clear        RMB       1                   "one-shot" CapsLock/SysRq key flag ($64)
+G.KyButt       RMB       1                   keyboard F1 and F2 "fire" button info ($65)
+G.AutoMs       RMB       1                   Auto-follow mouse flag for current device (0=NO)
+G.MseMv        RMB       1                   mouse moved flag ($67)
+G.CoTble       RMB       6                   co-module table ($68)
+G.GrfEnt       RMB       2                   GRFDRV Entry address ($6E)
+g0070          RMB       1                   # bytes to move in 1 block (1-72)
+G.WUseTb       RMB       4                   windows in use bit table (0=unused, 32 windows) ($71)
+G.GfxTbl       RMB       2                   Pointer to GFX tables ($75)
+G.WrkWTb       RMB       $40                 Work window table. WindInt only ($77)
+g00B7          RMB       2                   Current Device static mem ptr for WindInt
+g00B9          RMB       2                   Current window table ptr for WindInt
+g00BB          RMB       2                   Pointer to work window table (g0077+$10)
+g00BD          RMB       1                   Current screen type for work window table
+g00BE          RMB       1                   Topmost overlay window # when check for title bars
+g00BF          RMB       1                   Flag for keypress while processing menu select
+g00C0          RMB       2                   Ptr to current path descriptor
+G.WindBk       RMB       2                   shift-clear routine vector
+G.MsInit       RMB       2                   set mouse routine vector
+G.MsSig        RMB       1                   mouse signal flag
+G.DefPls       RMB       16                  Default palettes (2 repeats of 8 is default) ($C7)
+g00D7          RMB       9
+G.KeyEnt       RMB       2                   entry to keydrv subroutine module ($E0)
+G.KeyMem       RMB       8                   static memory for keydrv subroutine module
+G.JoyEnt       RMB       2                   entry to joydrv subroutine module ($EA)
+G.JoyMem       RMB       8                   static memory for joydrv subroutine module
+G.SndEnt       RMB       2                   entry to snddrv subroutine module ($F4)
+G.SndMem       RMB       8                   static memory for snddrv subroutine module
+
+*****************************************************************************
+* GrfDrv global memory data definitions
+* This area sits in system block 0 from $1100 to $119E
+GrfMem         EQU       $1100               useful label used to point to mem starting below
+               ORG       0
+gr0000         RMB       1                   Pixel mask for 1st byte of GP line
+gr0001         RMB       1                   Pixel mask for last byte of a GP line
+gr0002         RMB       2                   Ptr to table of bit masks for colors
+gr0004         RMB       1                   # of bytes wide GP buffer is (including partials)
+gr0005         RMB       1                   # pixels per byte in GP Buffer
+gr0006         RMB       1                   # of pixels used in 1st byte of GP buffer line
+gr0007         RMB       1                   # of pixels used in last byte of GP buffer line
+gr0008         RMB       1                   Bit mask that is common to both screen & GP buffer
+gr0009         RMB       1                   # bytes for width of overlay window
+gr000A         RMB       1                   # bytes to offset to get to next line after
+*                             overlay width has been copied
+gr000B         RMB       1
+gr000C         RMB       2                   Cursor address for proportional spacing?
+gr000E         RMB       1
+gr000F         RMB       1                   Left-based bit mask for proportional spacing?
+gr0010         RMB       2                   Vector for text to gfx screen (either prop. or normal)
+gr0012         RMB       6
+gr0018         RMB       2                   Working Center X coord for Circle/Ellipse
+gr001A         RMB       2                   Working Center Y coord for Circle/Ellipse
+gr001C         RMB       2                   Some variable for Circle/Ellipse (initially 0)
+gr001E         RMB       2                   Working Y radius value for Circle/Ellipse
+gr0020         RMB       2                   Arc 'clip line' X01
+gr0022         RMB       2                   Arc 'clip line' Y01
+gr0024         RMB       2                   Arc 'clip line' X02
+gr0026         RMB       2                   Arc 'clip line' Y02
+gr0028         RMB       1                   full-byte background color to FFILL on mask
+gr0029         RMB       1                   pixels per byte: set up by FFILL
+gr002A         RMB       1                   Flag for FFill: 1=no error, 0=Stack overflow error
+gr002B         RMB       1                   current Y-direction to travel in FFILL
+gr002C         RMB       2
+gr002E         RMB       2                   current window table entry
+gr0030         RMB       2                   current screen table ptr
+gr0032         RMB       1                   Last block # we used for buffers
+gr0033         RMB       2                   Last offset we used for buffers
+gr0035         RMB       1                   group
+gr0036         RMB       2                   offset
+gr0038         RMB       1                   group returned (new)
+gr0039         RMB       1                   0=Text cursor inverted off, >0 is inverted on
+gr003A         RMB       1                   0=Graphics cursor XOR'd off,>0 is XOR'd on scrn
+gr003B         RMB       2                   end of vars ptr?
+gr003D         RMB       2                   Last X coordinate Graphics cursor was ON at
+gr003F         RMB       2                   Last Y coordinate Graphics cursor was ON at
+gr0041         RMB       2                   Screen address for start of current gfx cursor
+gr0043         RMB       1                   Pixel mask for start of gfx cursor
+gr0044         RMB       1                   Block # Graphics cursor is in
+gr0045         RMB       2                   Offset in block Graphics cursor is in
+gr0047         RMB       2                   'Working' X coordinate
+gr0049         RMB       2                   'Working' Y coordinate
+gr004B         RMB       2                   current X
+gr004D         RMB       2                   current Y
+gr004F         RMB       2                   X Size (in bytes)
+gr0051         RMB       2                   Y Size (in bytes)
+gr0053         RMB       2                   Horizontal radius (circle/ellipse/arc)
+gr0055         RMB       2                   Vertical radius (circle/ellipse/arc)
+gr0057         RMB       1                   group
+gr0058         RMB       1                   buffer #
+gr0059         RMB       1                   save switch for overlay
+gr005A         RMB       1                   PRN
+gr005B         RMB       2                   X coordinate of Graphics cursor
+gr005D         RMB       2                   Y coordinate of Graphics cursor
+gr005F         RMB       1                   ATD: new video mode for 24/25/28-line windows
+Gr.STYMk       RMB       1                   STY marker
+gr0061         RMB       1                   foreground RGB data
+gr0062         RMB       1                   background RGB data
+gr0063         RMB       1                   bytes/row (on current screen...not window)
+gr0064         RMB       2                   PSet vector
+gr0066         RMB       2                   pset offset
+gr0068         RMB       2                   LSet vector
+gr006A         RMB       2                   max X co-ordinate
+gr006C         RMB       2                   max Y co-ordinate
+gr006E         RMB       2                   X pixel count
+gr0070         RMB       2                   Y pixel count
+gr0072         RMB       2                   Screen address of pixel we are doing
+gr0074         RMB       1                   Pixel mask for pixel we are doing
+gr0075         RMB       2                   ??? Pixel mask for last byte of GP buffer?
+gr0077         RMB       2                   Vector for right direction FFill
+gr0079         RMB       1                   bit mask for 1st pixel in byte for right dir. FFill
+gr007A         RMB       2                   Vector for left direction FFill
+gr007C         RMB       1                   bit mask for last pixel in byte for left dir. FFill
+gr007D         RMB       1                   buffer block #
+gr007E         RMB       2                   buffer offset #
+gr0080         RMB       2                   Buffer length (in bytes)
+gr0082         RMB       3                   3 byte extended screen address
+gr0085         RMB       2                   temp
+gr0087         RMB       16                  grfdrv (sysmap 1) DAT image
+gr0097         RMB       1                   temp
+gr0098         RMB       1                   temp
+* In ARC, 97-98 is the width of the clip line in pixels (after scaling)
+gr0099         RMB       2                   temp
+* In ARC, 99-9A is the height of the clip line in pixels (after scaling)
+gr009B         RMB       1                   counter temp
+gr009C         RMB       1
+gr009D         RMB       2                   offset to buffer in block
+gr009F         RMB       1
+gr00A0         RMB       1                   # lines left to do of GP buffer onto screen
+gr00A1         RMB       2                   vector routine for (changes lots)
+* In ARC A1-A2 is the vector to the proper clipping routine
+gr00A3         RMB       2                   Vector for shifting GP buffers
+gr00A5         RMB       2                   Vector for shifting GP buffers (can dupe A1)
+gr00A7         RMB       2
+gr00A9         RMB       2                   NEW: Window tbl ptr for last window GRFDRV used
+grBigFnt       RMB       2                   Flag for 224 char font/gfx mode on (0=No) V2.00a
+gr00AD         RMB       2                   FFill:orig. start X coord|Circ/Ell saved start X
+gr00AF         RMB       2                   FFill:orig. start Y coord|Circ/Ell saved end X
+gr00B1         RMB       1                   Flag in FFill: 1=1st time through, 0=not 1st time
+gr00B2         RMB       1                   Filled (circle,ellipse) flag 0=Not filled
+*gr00B3   rmb    256-.       ??? UNUSED
+gr00B3         RMB       1                   temp veriable grfdrv
+gr00B4         RMB       1                   temp veriable grfdrv
+gr00B5         RMB       1                   regW for grfdrv
+gr00B6         RMB       1
+gr00B7         RMB       2
+gr00B9         RMB       2                   previously used in grfdrv at $B2 but not for Filled Flag
+gr00BB         RMB       2                   previously used in grfdrv at $B4
+gr00BD         RMB       2                   previously used in grfdrv at $B6
+gr00BF         RMB       256-.
+* GPLoad buffer - $1200 in system block 0
+GPBuf          RMB       72                  common move buffer for gpload/get/put
+gb0000         EQU       72                  Size of get/put buffer ($48)
+
+*****************************************************************************
+* Window table entry structure
+* These tables sit in system block 0 and there is 1 for every window init'd
+* including any overlay windows.
+MaxWind        EQU       32                  maximum allowable window tables
+WinBase        EQU       $1290               base address to start of window tables
+               ORG       -$10
+Wt.STbl        RMB       2                   Screen table pointer ($FFFF=Not used)       -$10
+Wt.BLnk        RMB       1                   overlay window parent entry # ($FF=base)    -$0E
+Wt.LStrt       RMB       2                   screen logical start address                -$0D
+Wt.CPX         RMB       1                   current X coord. start                      -$0B
+Wt.CPY         RMB       1                   current Y coord. start                      -$0A
+Wt.SZX         RMB       1                   current X size (CWArea)                     -$09
+Wt.SZY         RMB       1                   current Y size (CWArea)                     -$08
+Wt.SXFct       RMB       1                   X scaling factor                            -$07
+Wt.SYFct       RMB       1                   Y scaling factor (0=no scaling)             -$06
+Wt.Cur         RMB       2                   cursor physical address on screen           -$05
+Wt.FMsk        RMB       1                   font bit mask (based from left)             -$03
+Wt.CurX        RMB       2                   X coord of cursor                           -$02
+Wt.CurY        RMB       2                   Y Coord of cursor                            $00
+Wt.XBCnt       RMB       1                   width of window (in bytes)                   $02
+Wt.CWTmp       RMB       1                   bytes wide each text chr (1,2,4)             $03
+Wt.BRow        RMB       2                   bytes/text row (8x width in gfx)             $04
+Wt.Fore        RMB       1                   foreground palette #                         $06
+Wt.Back        RMB       1                   background palette #                         $07
+Wt.Attr        RMB       1                   default attributes (FUTTTBBB)                $08
+Wt.BSW         RMB       1                   character BSW switches                       $09
+Wt.LSet        RMB       1                   LSet type                                    $0A
+Wt.FBlk        RMB       1                   Font memory block #                          $0B
+Wt.FOff        RMB       2                   Font offset in block                         $0C
+Wt.PBlk        RMB       1                   PSet memory block #                          $0E
+Wt.POff        RMB       2                   PSet offset in block                         $0F
+Wt.OBlk        RMB       1                   Overlay memory block #                       $11
+Wt.OOff        RMB       2                   Overlay offset in block                      $12
+Wt.LVec        RMB       2                   LSet vector                                  $14
+Wt.PVec        RMB       2                   PSet vector                                  $16
+Wt.GBlk        RMB       1                   GCursor memory block #                       $18
+Wt.GOff        RMB       2                   GCursor offset in block                      $19
+Wt.MaxX        RMB       2                   Maximum X cord. (0-79,0-639)                 $1B
+Wt.MaxY        RMB       2                   Maximum Y cord. (0-24,0-191)                 $1D
+Wt.BLen        RMB       2                   bytes left in GPLoad block below             $1F
+Wt.NBlk        RMB       1                   memory block # for next GPLoad               $21
+Wt.NOff        RMB       2                   Offset in block for next GPLoad              $22
+Wt.LStDf       RMB       2                   screen logical start default                 $24
+* NOTE: The following default settings are what the window was initialized
+*       with, and thus are the MAXIMUM start/size the window can handle
+*       until it is restarted (DWEnd & DWSet)
+*       They also appear to be used in WindInt to determine the coords &
+*       sizes for control+content regions
+Wt.DfCPX       RMB       1                   default X cord. start                        $26
+Wt.DfCPY       RMB       1                   default Y cord. start                        $27
+Wt.DfSZX       RMB       1                   default X size                               $28
+Wt.DfSZY       RMB       1                   default Y size                               $29
+Wt.Res         RMB       6                   unused                                   $2A-$2F
+Wt.Siz         EQU       .+$10
+
+*****************************************************************************
+* Screen table entrys
+* These tables sit in system block 0 base=$1A80
+
+STblMax        EQU       16                  Maximum number of screen tables
+STblBse        EQU       $1A80               base address of screen tables
+               ORG       0
+St.Sty         RMB       1                   Screen type                         $00
+St.SBlk        RMB       1                   Ram block start #                   $01
+St.LStrt       RMB       2                   Screen logical start (for GIME)     $02
+St.BRow        RMB       1                   Bytes per row                       $04
+St.Brdr        RMB       1                   Border palette register #           $05
+St.Fore        RMB       1                   Foreground palette register #       $06
+St.Back        RMB       1                   Background palette register #       $07
+St.ScSiz       RMB       1                   screen size: 24..28 lines           $08
+St.Res         RMB       7                   UNUSED???                           $09
+* NOTE: SHOULD USE ONE OF THESE UNUSED BYTES TO KEEP THE # OF DEVICE WINDOW
+* TABLES THAT ARE USING THIS SCREEN TABLE. DWSET & DWEND WOULD KEEP TRACK OF
+* THESE, AND THE WINDINT TITLE BAR ROUTINE WOULD CHECK IT. IF IT IS ONLY 1,
+* IT WON'T BOTHER CHANGING THE TITLE BAR WHEN SELECTING WINDOWS
+St.Pals        RMB       16                  Palette register contents           $10
+St.Siz         EQU       .
+
+*****************************************************************************
+* Graphics buffer tables
+* They contain a 20 byte header (shown below), followed by the raw pixel
+* data.
+               ORG       0
+Grf.Bck        RMB       1                   back block link #                   $00
+Grf.Off        RMB       2                   back block header offset            $01
+Grf.Grp        RMB       1                   group #                             $03
+Grf.Buff       RMB       1                   buffer #                            $04
+Grf.BSz        RMB       2                   buffer size (not including header)  $05
+Grf.XSz        RMB       2                   X size (in pixels)                  $07
+Grf.YSz        RMB       2                   Y size (in pixels/bytes)            $09
+Grf.XBSz       RMB       1                   X size in bytes                     $0B
+Grf.LfPx       RMB       1                   # pixels used in first byte of line $0C
+Grf.RtPx       RMB       1                   # pixels used in last byte of line  $0D
+Grf.STY        RMB       1                   Screen type buffer intended for     $0E
+Grf.NBlk       RMB       1                   number blocks used                  $0F
+Grf.Pal        RMB       16                  Copy of palette registers?          $10
+Grf.Siz        EQU       .                   $20
+
+*****************************************************************************
+* GFX tables (1 for each window, 18 ($12) bytes each) pointed to by
+* $1075-$0176
+* GRFINT only uses gt0001-gt0004, the rest is exclusive to WINDINT
+               ORG       0
+Gt.WTyp        RMB       1                   WindInt window type (Framed, Scroll Bar, etc.) $00
+Gt.GXCur       RMB       2                   X coord of graphics cursor                     $01
+Gt.GYCur       RMB       2                   Y coord of graphics cursor                     $03
+Gt.DPtr        RMB       2                   Ptr to WindInt window descriptor               $05
+Gt.FClr        RMB       1                   Foreground color                               $07
+Gt.BClr        RMB       1                   Background color                               $08
+Gt.FMsk        RMB       1                   Foreground mask                                $09
+Gt.BMsk        RMB       1                   Background mask                                $0A
+Gt.GBlk        RMB       1                   Block # of graphics cursor                     $0B
+Gt.GOff        RMB       2                   Offset into block of graphics cursor           $0C
+Gt.Proc        RMB       1                   Process # of window creator                    $0E
+Gt.PBlk        RMB       1                   Process descriptor block # of creator          $0F
+Gt.Res         RMB       2                   ??? RESERVED ???                               $10
+GTabSz         EQU       .
+
+*****************************************************************************
+* This table is located in the graphics table memory and is offset from
+* graphics table pointer stored at $1075-$1076. This is used exclusively by
+* WindInt.
+* NOTE: USING UNUSED BYTES IN CC3 GLOBAL MEM, SET UP SEPARATE PTRS FOR EACH
+*  OF THE BELOW SO WE CAN SPEED UP ACCESS BY NOT HAVING TO DO A LOAD/LEAx
+*  COMBINATION EVERY TIME
+               ORG       $0240
+               RMB       WN.SIZ              copy of last accessed window descriptor
+               RMB       MN.SIZ              copy of last accessed menu descriptor
+               RMB       MI.SIZ              copy of last accessed item descriptor
+               RMB       65                  menu handling table (16 entrys of 4 bytes)
+
+*****************************************************************************
+* WindInt menu handling table entry definition
+               ORG       0
+MnuXNum        RMB       1                   menu #
+MnuXStrt       RMB       1                   X start text co-ordinate
+MnuXEnd        RMB       1                   X end text co-ordinate
+               RMB       1                   unused?
+MnuHSiz        EQU       .
+
+*****************************************************************************
+* Character binary switches
+TChr           EQU       %10000000           transparent characters
+Under          EQU       %01000000           underline characters
+Bold           EQU       %00100000           bold characters
+Prop           EQU       %00010000           proportional spacing of characters
+Scale          EQU       %00001000           automatic window scaling
+Invers         EQU       %00000100           inverse characters
+NoCurs         EQU       %00000010           no cursor display
+Protect        EQU       %00000001           device window protection
+
+*****************************************************************************
+* Screen types (high bit set=hardware text, else graphics) in GRFDRV
+Current        EQU       $ff                 Current screen
+*         equ   1          640x200x2
+*         equ   2          320x200x4
+*         equ   3          640x200x4
+*         equ   4          320x200x16
+*         equ   $85        80 column text
+*         equ   $86        40 column text
+
+*************************************
+* Window default palette color codes
+*
+               ORG       0
+White.         RMB       1
+Blue.          RMB       1
+Black.         RMB       1
+Green.         RMB       1
+Red.           RMB       1
+Yellow.        RMB       1
+Magenta.       RMB       1
+Cyan.          RMB       1
+
+               ENDC      
+               ENDC      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/bootfiles/defsfile	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,2 @@
+          use    ../defsfile
+          use    scfdefs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/bootfiles/makefile	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,425 @@
+include ../port.mak
+
+# Module directory
+MD		= ../modules
+# Commands directory
+CMDSDIR		= ../cmds
+
+DEPENDS		= ./makefile
+
+KERNEL_1773	= $(MD)/rel $(MD)/krn $(MD)/krnp2 $(MD)/init \
+		$(MD)/boot_1773_6ms
+
+ifeq ($(PORT),coco1)
+KERNEL_DW	= $(MD)/rel $(MD)/krn $(MD)/krnp2 $(MD)/init \
+		$(MD)/boot_dw_coco1
+else
+KERNEL_DW	= $(MD)/rel $(MD)/krn $(MD)/krnp2 $(MD)/init \
+		$(MD)/boot_dw
+endif
+
+KERNEL_BECKER	= $(MD)/rel $(MD)/krn $(MD)/krnp2 $(MD)/init \
+		$(MD)/boot_dw_becker
+
+KERNEL_ARDUINO	= $(MD)/rel $(MD)/krn $(MD)/krnp2 $(MD)/init \
+		$(MD)/boot_dw_arduino
+#[NAC HACK 2015Sep02] used for mc09
+KERNEL_COCOSDC	= $(MD)/rel $(MD)/krn $(MD)/krnp2 $(MD)/init \
+		$(MD)/boot_sdc
+
+IDE		= $(3PD)/ide
+SCSI		= $(3PD)/scsisys
+
+FLOPPY_40D	= $(MD)/rb1773.dr $(MD)/d0_40d.dd $(MD)/d1_40d.dd $(MD)/d2_40d.dd 
+
+FLOPPY_80D	= $(MD)/rb1773.dr $(MD)/d0_40d.dd $(MD)/d1_40d.dd $(MD)/d2_40d.dd 
+
+MC09SDC_80D	= $(MD)/mc09sdc.dr $(MD)/s0_80d.dd $(MD)/s1_80d.dd $(MD)/s2_80d.dd $(MD)/s3_80d.dd
+
+TERM_MC09       = $(MD)/mc6850.dr $(MD)/term_mc6850.dt $(MD)/term_mc6850_t0.dt $(MD)/term_mc6850_t1.dt
+VTIO_COVDG	= $(MD)/vtio.dr $(MD)/covdg.io $(MD)/term_vdg.dt
+VTIO_COHR	= $(MD)/vtio.dr $(MD)/cohr.io $(MD)/term_hr.dt
+VTIO_CO80	= $(MD)/vtio.dr $(MD)/co80.io $(MD)/term_80.dt
+PIPE		= $(MD)/pipeman.mn $(MD)/piper.dr $(MD)/pipe.dd
+CLOCK50HZMC09	= $(MD)/mc09clock_50hz $(MD)/clock2_soft
+CLOCK60HZ	= $(MD)/clock_60hz $(MD)/clock2_soft
+CLOCK60HZDW	= $(MD)/clock_60hz $(MD)/clock2_dw
+ifeq ($(PORT),coco1)
+RBDW		= $(MD)/rbdw.dr $(MD)/dwio_coco1.sb \
+		$(MD)/x1.dd $(MD)/x2.dd $(MD)/x3.dd
+else
+RBDW		= $(MD)/rbdw.dr $(MD)/dwio.sb \
+		$(MD)/x1.dd $(MD)/x2.dd $(MD)/x3.dd
+endif
+RBBECKER	= $(MD)/rbdw.dr $(MD)/dwio_becker.sb \
+		$(MD)/x1.dd $(MD)/x2.dd $(MD)/x3.dd
+
+RBARDUINO	= $(MD)/rbdw.dr $(MD)/dwio_arduino.sb \
+		$(MD)/x1.dd $(MD)/x2.dd $(MD)/x3.dd
+
+RBCOCOSDC	= $(MD)/rbsuper.dr $(MD)/llcocosdc.dr \
+		$(MD)/sd0_cocosdc.dd $(MD)/sd1_cocosdc.dd
+
+SCDWV_NET  = $(MD)/n_scdwv.dd $(MD)/n1_scdwv.dd $(MD)/n2_scdwv.dd \
+		$(MD)/n3_scdwv.dd $(MD)/n4_scdwv.dd $(MD)/n5_scdwv.dd \
+		$(MD)/n6_scdwv.dd $(MD)/n7_scdwv.dd $(MD)/n8_scdwv.dd \
+		$(MD)/n9_scdwv.dd $(MD)/n10_scdwv.dd $(MD)/n11_scdwv.dd \
+		$(MD)/n12_scdwv.dd $(MD)/n13_scdwv.dd $(MD)/midi_scdwv.dd
+SCDWV_WIN  = $(MD)/z1_scdwv.dd $(MD)/z2_scdwv.dd $(MD)/z3_scdwv.dd \
+		$(MD)/z4_scdwv.dd $(MD)/z5_scdwv.dd $(MD)/z6_scdwv.dd \
+		$(MD)/z7_scdwv.dd 
+SCDWP     = $(MD)/scdwp.dr $(MD)/p_scdwp.dd
+
+BOOTFILE_COVDG	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(FLOPPY_40D) \
+		$(MD)/ddd0_40d.dd \
+		$(MD)/scf.mn \
+		$(VTIO_COVDG) \
+		$(MD)/scbbp.dr $(MD)/p_scbbp.dd \
+		$(MD)/scbbt.dr $(MD)/t1_scbbt.dd \
+		$(PIPE) \
+		$(CLOCK60HZ) \
+		$(MD)/sysgo_dd
+
+BOOTFILE_COHR	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(FLOPPY_40D) \
+		$(MD)/ddd0_40d.dd \
+		$(MD)/scf.mn \
+		$(VTIO_COHR) \
+		$(MD)/scbbp.dr $(MD)/p_scbbp.dd \
+		$(MD)/scbbt.dr $(MD)/t1_scbbt.dd \
+		$(PIPE) \
+		$(CLOCK60HZ) \
+		$(MD)/sysgo_dd
+
+BOOTFILE_CO80	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(FLOPPY_40D) \
+		$(MD)/ddd0_40d.dd \
+		$(MD)/scf.mn \
+		$(VTIO_CO80) \
+		$(MD)/scbbp.dr $(MD)/p_scbbp.dd \
+		$(MD)/scbbt.dr $(MD)/t1_scbbt.dd \
+		$(PIPE) \
+		$(CLOCK60HZ) \
+		$(MD)/sysgo_dd
+
+BOOTFILE_DW_HEADLESS	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(RBDW) \
+		$(MD)/ddx0.dd \
+		$(MD)/scf.mn \
+		$(MD)/scdwv.dr \
+		$(MD)/term_scdwv.dt \
+		$(SCDWV_NET) \
+		$(SCDWV_WIN) \
+		$(SCDWP) \
+		$(CLOCK60HZDW) \
+		$(MD)/sysgo_dd
+
+BOOTFILE_BECKER_HEADLESS	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(RBBECKER) \
+		$(MD)/ddx0.dd \
+		$(MD)/scf.mn \
+		$(MD)/scdwv.dr \
+		$(MD)/term_scdwv.dt \
+		$(SCDWV_NET) \
+		$(SCDWV_WIN) \
+		$(SCDWP) \
+		$(CLOCK60HZDW) \
+		$(MD)/sysgo_dd
+
+BOOTFILE_ARDUINO_HEADLESS	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(RBARDUINO) \
+		$(MD)/ddx0.dd \
+		$(MD)/scf.mn \
+		$(MD)/scdwv.dr \
+		$(MD)/term_scdwv.dt \
+		$(SCDWV_NET) \
+		$(SCDWV_WIN) \
+		$(SCDWP) \
+		$(CLOCK60HZDW) \
+		$(MD)/sysgo_dd
+
+BOOTFILE_COVDG_DW	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(FLOPPY_40D) \
+		$(RBDW) \
+		$(MD)/ddx0.dd \
+		$(MD)/scf.mn \
+		$(VTIO_COVDG) \
+		$(MD)/scdwv.dr \
+		$(SCDWV_NET) \
+		$(SCDWV_WIN) \
+		$(SCDWP) \
+		$(PIPE) \
+		$(CLOCK60HZDW) \
+		$(MD)/sysgo_dd
+
+BOOTFILE_COVDG_DW_GAME	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(RBDW) \
+		$(MD)/ddx0.dd \
+		$(MD)/scf.mn \
+		$(VTIO_COVDG) \
+		$(PIPE) \
+		$(CLOCK60HZDW) \
+		$(MD)/sysgo_dd \
+		$(CMDSDIR)/shell_21
+
+BOOTFILE_COVDG_BECKER	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(RBBECKER) \
+		$(FLOPPY_40D) \
+		$(MD)/ddx0.dd \
+		$(MD)/scf.mn \
+		$(VTIO_COVDG) \
+		$(MD)/scdwv.dr \
+		$(SCDWV_NET) \
+		$(SCDWV_WIN) \
+		$(SCDWP) \
+		$(PIPE) \
+		$(CLOCK60HZDW) \
+		$(MD)/sysgo_dd
+
+BOOTFILE_COVDG_BECKER_GAME	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(RBBECKER) \
+		$(MD)/ddx0.dd \
+		$(MD)/scf.mn \
+		$(VTIO_COVDG) \
+		$(PIPE) \
+		$(CLOCK60HZDW) \
+		$(MD)/sysgo_dd \
+		$(CMDSDIR)/shell_21
+
+BOOTFILE_COVDG_ARDUINO	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(FLOPPY_40D) \
+		$(RBARDUINO) \
+		$(MD)/ddx0.dd \
+		$(MD)/scf.mn \
+		$(VTIO_COVDG) \
+		$(MD)/scdwv.dr \
+		$(SCDWV_NET) \
+		$(SCDWV_WIN) \
+		$(SCDWP) \
+		$(PIPE) \
+		$(CLOCK60HZDW) \
+		$(MD)/sysgo_dd
+
+BOOTFILE_COVDG_ARDUINO_GAME	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(RBARDUINO) \
+		$(MD)/ddx0.dd \
+		$(MD)/scf.mn \
+		$(VTIO_COVDG) \
+		$(PIPE) \
+		$(CLOCK60HZDW) \
+		$(MD)/sysgo_dd \
+		$(CMDSDIR)/shell_21
+
+BOOTFILE_COVDG_DS80	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(FLOPPY_80D) \
+		$(MD)/ddd0_80d.dd \
+		$(MD)/scf.mn \
+		$(VTIO_COVDG) \
+		$(MD)/scbbp.dr $(MD)/p_scbbp.dd \
+		$(MD)/scbbt.dr $(MD)/t1_scbbt.dd \
+		$(PIPE) \
+		$(CLOCK60HZ) \
+		$(MD)/sysgo_dd
+
+# [NAC HACK 2015Aug31] used for mc09
+BOOTFILE_COVDG_SD80	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(MD)/dds0_80d.dd \
+		$(MC09SDC_80D) \
+		$(MD)/scf.mn \
+		$(TERM_MC09) \
+		$(PIPE) \
+		$(CLOCK50HZMC09) \
+		$(MD)/sysgo_dd
+
+BOOTFILE_COVDG_COCOSDC	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(RBCOCOSDC) \
+		$(MD)/ddsd0_cocosdc.dd \
+		$(FLOPPY_40D) \
+		$(MD)/scf.mn \
+		$(VTIO_COVDG) \
+		$(MD)/scbbp.dr $(MD)/p_scbbp.dd \
+		$(MD)/scbbt.dr $(MD)/t1_scbbt.dd \
+		$(PIPE) \
+		$(CLOCK60HZ) \
+		$(MD)/sysgo_dd
+
+BOOTFILE_COVDG_COCOSDC_GAME	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(RBCOCOSDC) \
+		$(MD)/ddsd0_cocosdc.dd \
+		$(MD)/scf.mn \
+		$(VTIO_COVDG) \
+		$(PIPE) \
+		$(CLOCK60HZ) \
+		$(MD)/sysgo_dd \
+		$(CMDSDIR)/shell_21
+
+BOOTFILE_COHR_DW	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(FLOPPY_40D) \
+		$(RBDW) \
+		$(MD)/ddx0.dd \
+		$(MD)/scf.mn \
+		$(VTIO_COHR) \
+		$(MD)/scdwv.dr \
+		$(SCDWV_NET) \
+		$(SCDWP)\
+		$(PIPE) \
+		$(CLOCK60HZDW) \
+		$(MD)/sysgo_dd
+
+BOOTFILE_COHR_BECKER	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(FLOPPY_40D) \
+		$(RBBECKER) \
+		$(MD)/ddx0.dd \
+		$(MD)/scf.mn \
+		$(VTIO_COHR) \
+		$(MD)/scdwv.dr \
+		$(SCDWV_NET) \
+		$(SCDWP) \
+		$(PIPE) \
+		$(CLOCK60HZDW) \
+		$(MD)/sysgo_dd
+
+BOOTFILE_COHR_ARDUINO	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(FLOPPY_40D) \
+		$(RBARDUINO) \
+		$(MD)/ddx0.dd \
+		$(MD)/scf.mn \
+		$(VTIO_COHR) \
+		$(MD)/scdwv.dr \
+		$(SCDWV_NET) \
+		$(SCDWP) \
+		$(PIPE) \
+		$(CLOCK60HZDW) \
+		$(MD)/sysgo_dd
+
+BOOTFILE_COHR_DS80	= $(MD)/ioman \
+		$(MD)/rbf.mn \
+		$(FLOPPY_80D) \
+		$(MD)/ddd0_80d.dd \
+		$(MD)/scf.mn \
+		$(VTIO_CO80) \
+		$(MD)/scbbp.dr $(MD)/p_scbbp.dd \
+		$(MD)/scbbt.dr $(MD)/t1_scbbt.dd \
+		$(PIPE) \
+		$(CLOCK60HZ) \
+		$(MD)/sysgo_dd
+
+BOOTFILES	= bootfile_covdg bootfile_cohr bootfile_covdg_dw \
+		bootfile_dw_headless bootfile_covdg_becker \
+		bootfile_covdg_becker_game bootfile_covdg_dw_game \
+		bootfile_covdg_cocosdc bootfile_covdg_cocosdc_game \
+		bootfile_cohr_dw bootfile_covdg_ds80 bootfile_covdg_sd80 bootfile_cohr_ds80 \
+		bootfile_cohr_becker bootfile_becker_headless \
+		bootfile_covdg_arduino bootfile_arduino_headless \
+		bootfile_cohr_arduino bootfile_covdg_arduino_game 
+
+KERNELS		= kernel_1773 kernel_dw kernel_becker kernel_arduino kernel_cocosdc
+
+ALLOBJS		= $(BOOTFILES) $(KERNELS)
+
+all:	$(ALLOBJS)
+
+bootfile_covdg: $(BOOTFILE_COVDG) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_COVDG)>$@
+
+bootfile_cohr: $(BOOTFILE_COHR) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_COHR)>$@
+
+bootfile_co80: $(BOOTFILE_CO80) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_CO80)>$@
+
+bootfile_covdg_ds80: $(BOOTFILE_COVDG_DS80) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_COVDG_DS80)>$@
+
+bootfile_covdg_sd80: $(BOOTFILE_COVDG_SD80) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_COVDG_SD80)>$@
+
+bootfile_dw_headless: $(BOOTFILE_DW_HEADLESS) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_DW_HEADLESS)>$@
+
+bootfile_becker_headless: $(BOOTFILE_BECKER_HEADLESS) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_BECKER_HEADLESS)>$@
+
+bootfile_arduino_headless: $(BOOTFILE_ARDUINO_HEADLESS) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_ARDUINO_HEADLESS)>$@
+
+bootfile_covdg_dw: $(BOOTFILE_COVDG_DW) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_COVDG_DW)>$@
+
+bootfile_covdg_dw_game: $(BOOTFILE_COVDG_DW_GAME) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_COVDG_DW_GAME)>$@
+
+bootfile_covdg_becker: $(BOOTFILE_COVDG_BECKER) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_COVDG_BECKER)>$@
+
+bootfile_covdg_becker_game: $(BOOTFILE_COVDG_BECKER_GAME) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_COVDG_BECKER_GAME)>$@
+
+bootfile_covdg_arduino: $(BOOTFILE_COVDG_ARDUINO) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_COVDG_ARDUINO)>$@
+
+bootfile_covdg_arduino_game: $(BOOTFILE_COVDG_ARDUINO_GAME) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_COVDG_ARDUINO_GAME)>$@
+
+bootfile_covdg_cocosdc: $(BOOTFILE_COVDG_COCOSDC) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_COVDG_COCOSDC)>$@
+
+bootfile_covdg_cocosdc_game: $(BOOTFILE_COVDG_COCOSDC_GAME) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_COVDG_COCOSDC_GAME)>$@
+
+bootfile_cohr_ds80: $(BOOTFILE_COHR_DS80) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_COHR_DS80)>$@
+
+bootfile_cohr_dw: $(BOOTFILE_COHR_DW) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_COHR_DW)>$@
+
+bootfile_cohr_becker: $(BOOTFILE_COHR_BECKER) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_COHR_BECKER)>$@
+
+bootfile_cohr_arduino: $(BOOTFILE_COHR_ARDUINO) $(DEPENDS)
+	$(MERGE) $(BOOTFILE_COHR_ARDUINO)>$@
+
+# WD1773 Kernel
+kernel_1773: $(KERNEL_1773) $(DEPENDS)
+	$(MERGE) $(KERNEL_1773)>$@
+	$(PADROM) 4608 $@
+
+# DriveWire 3 Kernel
+kernel_dw: $(KERNEL_DW) $(DEPENDS)
+	$(MERGE) $(KERNEL_DW)>$@
+	$(PADROM) 4608 $@
+
+kernel_becker: $(KERNEL_BECKER) $(DEPENDS)
+	$(MERGE) $(KERNEL_BECKER)>$@
+	$(PADROM) 4608 $@
+
+kernel_arduino: $(KERNEL_ARDUINO) $(DEPENDS)
+	$(MERGE) $(KERNEL_ARDUINO)>$@
+	$(PADROM) 4608 $@
+
+kernel_cocosdc: $(KERNEL_COCOSDC) $(DEPENDS) 
+	$(MERGE) $(KERNEL_COCOSDC)>$@
+	$(PADROM) 4608 $@
+
+clean:
+	$(RM) $(ALLOBJS)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/bootlists/dw.bl	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,200 @@
+***************************************
+* 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 RBF driver 
+../MODULES/RBF/rbdw.dr
+../MODULES/RBF/dwio.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), CoHR (Hi-Res 51x24 graphics screen) or Co80 (Word-Pak)
+../MODULES/SCF/covdg.io
+*../MODULES/SCF/cohr.io
+*../MODULES/SCF/co80.io
+*
+* Select only one term descriptor
+../MODULES/SCF/term_vdg.dt
+*../MODULES/SCF/term_hr.dt
+*../MODULES/SCF/term_80.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 Virtual Channel Driver
+*../MODULES/SCF/scdwv.dr
+*../MODULES/SCF/term_scdwv.dt
+*../MODULES/SCF/n_scdwv.dd
+*../MODULES/SCF/n1_scdwv.dd
+*../MODULES/SCF/n2_scdwv.dd
+*../MODULES/SCF/n3_scdwv.dd
+*../MODULES/SCF/n4_scdwv.dd
+*../MODULES/SCF/n5_scdwv.dd
+*../MODULES/SCF/n6_scdwv.dd
+*../MODULES/SCF/n7_scdwv.dd
+*../MODULES/SCF/n8_scdwv.dd
+*../MODULES/SCF/n9_scdwv.dd
+*../MODULES/SCF/n10_scdwv.dd
+*../MODULES/SCF/n11_scdwv.dd
+*../MODULES/SCF/n12_scdwv.dd
+*../MODULES/SCF/n13_scdwv.dd
+*../MODULES/SCF/n14_scdwv.dd
+*../MODULES/SCF/term_z_scdwv.dt
+*../MODULES/SCF/z1_scdwv.dd
+*../MODULES/SCF/z2_scdwv.dd
+*../MODULES/SCF/z3_scdwv.dd
+*../MODULES/SCF/z4_scdwv.dd
+*../MODULES/SCF/z5_scdwv.dd
+*../MODULES/SCF/z6_scdwv.dd
+*../MODULES/SCF/z7_scdwv.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_dw
+* 
+***************************************
+* 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/mc09/bootlists/standard.bl	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,199 @@
+***************************************
+* 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 RBF driver
+*../MODULES/RBF/rbdw.dr
+*../MODULES/RBF/dwio.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), CoHR (Hi-Res 51x24 graphics screen) or Co80 (WordPak)
+../MODULES/SCF/covdg.io
+*../MODULES/SCF/cohr.io
+*
+* Select only one term descriptor
+../MODULES/SCF/term_vdg.dt
+*../MODULES/SCF/term_hr.dt
+*../MODULES/SCF/term_80.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 Virtual Channel Driver
+*../MODULES/SCF/scdwv.dr
+*../MODULES/SCF/term_scdwv.dt
+*../MODULES/SCF/n_scdwv.dd
+*../MODULES/SCF/n1_scdwv.dd
+*../MODULES/SCF/n2_scdwv.dd
+*../MODULES/SCF/n3_scdwv.dd
+*../MODULES/SCF/n4_scdwv.dd
+*../MODULES/SCF/n5_scdwv.dd
+*../MODULES/SCF/n6_scdwv.dd
+*../MODULES/SCF/n7_scdwv.dd
+*../MODULES/SCF/n8_scdwv.dd
+*../MODULES/SCF/n9_scdwv.dd
+*../MODULES/SCF/n10_scdwv.dd
+*../MODULES/SCF/n11_scdwv.dd
+*../MODULES/SCF/n12_scdwv.dd
+*../MODULES/SCF/n13_scdwv.dd
+*../MODULES/SCF/n14_scdwv.dd
+*../MODULES/SCF/term_z_scdwv.dt
+*../MODULES/SCF/z1_scdwv.dd
+*../MODULES/SCF/z2_scdwv.dd
+*../MODULES/SCF/z3_scdwv.dd
+*../MODULES/SCF/z4_scdwv.dd
+*../MODULES/SCF/z5_scdwv.dd
+*../MODULES/SCF/z6_scdwv.dd
+*../MODULES/SCF/z7_scdwv.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_dw
+* 
+***************************************
+* 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/mc09/cmds/defsfile	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,1 @@
+          use    ../defsfile
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/cmds/makefile	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,58 @@
+include ../port.mak
+
+vpath %.as $(LEVEL1)/cmds
+vpath %.asm $(LEVEL1)/cmds:$(3RDPARTY)/packages/basic09
+
+DEPENDS		= ./makefile
+
+AFLAGS		+= --includedir=$(3RDPARTY)/packages/basic09
+LFLAGS		+= -L $(NITROS9DIR)/lib -lnet -lmc09 -lalib
+
+BASIC09FILES	= basic09.asm runb.asm gfx.asm inkey.asm syscall.asm
+CMDS		= asm attr backup binex build calldbg cmp cobbler copy cputype \
+		date dcheck debug ded deiniz del deldir devs dir dirsort disasm \
+		display dmode dsave dump echo edit error exbin format \
+		free grfdrv help ident iniz irqs link list load login makdir \
+		megaread mdir merge mfree minted mpi os9gen padrom park printerr procs prompt pwd pxd \
+		rename save setime shellplus shell_21 sleep \
+		tee tmode touch tsmon tuneport unlink verify xmode
+
+CMDS_D2		= basic09 runb gfx inkey syscall copy del echo format \
+		merge os9gen prompt tmode
+
+CMDS_DW		= inetd telnet dw httpd
+
+SUBS		= gfx inkey syscall
+ALLOBJS		= $(CMDS) $(CMDS_D2) $(CMDS_DW) $(SUBS)
+
+all:	$(ALLOBJS)
+
+pwd:	pd.asm
+	$(AS) $(AFLAGS) $< $(ASOUT)$@ -DPWD=1
+
+xmode:	xmode.asm
+	$(AS) $(AFLAGS) $< $(ASOUT)$@ -DXMODE=1
+
+tmode:	xmode.asm
+	$(AS) $(AFLAGS) $< $(ASOUT)$@ -DTMODE=1
+
+pxd:	pd.asm
+	$(AS) $(AFLAGS) $< $(ASOUT)$@ -DPXD=1
+
+clean:
+	$(RM) $(ALLOBJS)
+
+identify:
+	$(IDENT_SHORT) $(ALLOBJS)
+
+showobjs:
+	@$(ECHO) $(CMDS)
+
+showobjs_d2:
+	@$(ECHO) $(CMDS_D2)
+
+showobjs_dw:
+	@$(ECHO) $(sort $(CMDS) $(CMDS_DW))
+
+showallobjs:
+	@$(ECHO) $(ALLOBJS)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/defs/defsfile.asm	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,8 @@
+Level equ 1
+
+ ifp1
+ use /dd/defs/os9.d
+ use /dd/defs/rbf.d
+ use /dd/defs/scf.d
+ use /dd/defs/mc09.d
+ endc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/defs/makefile	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,34 @@
+include ../port.mak
+
+DEPENDS		= ./makefile
+
+DEFOPTS		= --preprocess -DLevel=1
+DEFSDIR		= ../../../defs
+DEFS		= defsfile os9.d rbf.d scf.d mc09.d mc09vtio.d
+ALLOBJS		= $(DEFS)
+
+all:	$(ALLOBJS)
+
+defsfile: defsfile.asm
+	$(AS) $(DEFOPTS)  $< > $@
+
+os9.d: $(DEFSDIR)/os9.d
+	$(AS) $(DEFOPTS) -DOS9.D=0 $< > $@
+
+rbf.d: $(DEFSDIR)/rbf.d
+	$(AS) $(DEFOPTS) -DRBF.D=0 $< > $@
+
+scf.d: $(DEFSDIR)/scf.d
+	$(AS) $(DEFOPTS) -DSCF.D=0 $< > $@
+
+mc09.d: $(DEFSDIR)/mc09.d
+	$(AS) $(DEFOPTS) -DMC09.D=0 $< > $@
+
+mc09vtio.d: $(DEFSDIR)/mc09vtio.d
+	$(AS) $(DEFOPTS) -DMC09VTIO.D=0 $< > $@
+
+clean:
+	$(RM) $(DEFS)
+
+showobjs:
+	@$(ECHO) $(ALLOBJS)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/defsfile	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,6 @@
+Level    equ   1
+
+         use   os9.d
+         use   scf.d
+         use   rbf.d
+         use   mc09.d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/makefile	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,604 @@
+include port.mak
+
+# Level 1 - Specify which shell should be used
+#WHICHSHELL	= shellplus
+WHICHSHELL	= shell_21
+
+DISTRO		= $(CPU)L$(LEVEL)
+DISTRONAME	= nos9$(CPU)l$(LEVEL)
+DISTROVER	= $(DISTRONAME)$(NITROS9VER)$(PORT)
+BOOTFILE_COVDG	= bootfiles/bootfile_covdg
+BOOTFILE_COHR	= bootfiles/bootfile_cohr
+BOOTFILE_COVDG_DS80	= bootfiles/bootfile_covdg_ds80
+BOOTFILE_COVDG_SD80	= bootfiles/bootfile_covdg_sd80
+BOOTFILE_DW_HEADLESS	= bootfiles/bootfile_dw_headless
+BOOTFILE_BECKER_HEADLESS	= bootfiles/bootfile_becker_headless
+BOOTFILE_ARDUINO_HEADLESS	= bootfiles/bootfile_arduino_headless
+BOOTFILE_COVDG_DW	= bootfiles/bootfile_covdg_dw
+BOOTFILE_COVDG_BECKER	= bootfiles/bootfile_covdg_becker
+BOOTFILE_COVDG_ARDUINO	= bootfiles/bootfile_covdg_arduino
+BOOTFILE_COVDG_COCOSDC	= bootfiles/bootfile_covdg_cocosdc
+BOOTFILE_COHR_DS80	= bootfiles/bootfile_cohr_ds80
+BOOTFILE_COHR_DW	= bootfiles/bootfile_cohr_dw
+BOOTFILE_COHR_BECKER	= bootfiles/bootfile_cohr_becker
+BOOTFILE_COHR_ARDUINO	= bootfiles/bootfile_cohr_arduino
+KERNELFILE	= bootfiles/kernel_1773
+KERNELFILE_DW	= bootfiles/kernel_dw
+KERNELFILE_BECKER	= bootfiles/kernel_becker
+KERNELFILE_ARDUINO	= bootfiles/kernel_arduino
+KERNELFILE_COCOSDC	= bootfiles/kernel_cocosdc
+DIRS		= cmds modules defs sys bootfiles wwwroot
+
+
+CMDS		= $(shell $(CD) cmds; make --no-print-directory showobjs)
+CMDS_D2		= $(shell $(CD) cmds; make --no-print-directory showobjs_d2)
+CMDS_DW		= $(shell $(CD) cmds; make --no-print-directory showobjs_dw)
+BOOTTRACK	= $(shell $(CD) modules; make --no-print-directory showboottrack)
+KERNEL		= $(shell $(CD) modules; make --no-print-directory showkernel)
+SYSMODS		= $(shell $(CD) modules; make --no-print-directory showsysmods)
+CLOCKS		= $(shell $(CD) modules; make --no-print-directory showclocks)
+RBF		= $(shell $(CD) modules; make --no-print-directory showrbf)
+SCF		= $(shell $(CD) modules; make --no-print-directory showscf)
+PIPE		= $(shell $(CD) modules; make --no-print-directory showpipe)
+MODULECMDS	= $(WHICHSHELL) del echo format makdir merge os9gen prompt tmode
+
+SYS		= $(shell $(CD) sys; make --no-print-directory showobjs)
+WWWROOT		= $(shell $(CD) wwwroot; make --no-print-directory showobjs)
+DEFS		= $(shell $(CD) defs; make --no-print-directory showobjs)
+STARTUP		= startup
+STARTUP_DW	= startup.dw
+
+PACKAGENAME	 = $(DISTROVER).zip
+DSKDW           = $(DISTROVER)_dw.dsk
+LDSKDW          = $(DISTRONAME)$(PORT)_dw.dsk
+DSKDWHEADLESS   = $(DISTROVER)_dw_headless.dsk
+LDSKDWHEADLESS  = $(DISTRONAME)$(PORT)_dw_headless.dsk
+DSK360K_1       = $(DISTROVER)_40d_1.dsk
+LDSK360K_1      = $(DISTRONAME)$(PORT)_40d_1.dsk
+DSK360K_2       = $(DISTROVER)_40d_2.dsk
+LDSK360K_2      = $(DISTRONAME)$(PORT)_40d_2.dsk
+DSK720K         = $(DISTROVER)_80d.dsk
+LDSK720K        = $(DISTRONAME)$(PORT)_80d.dsk
+DSKBECKER	= $(DISTROVER)_becker.dsk
+LDSKBECKER	= $(DISTRONAME)$(PORT)_becker.dsk
+DSKBECKERHEADLESS	= $(DISTROVER)_becker_headless.dsk
+LDSKBECKERHEADLESS	= $(DISTRONAME)$(PORT)_becker_headless.dsk
+DSKARDUINO	= $(DISTROVER)_arduino.dsk
+LDSKARDUINO	= $(DISTRONAME)$(PORT)_arduino.dsk
+DSKARDUINOHEADLESS	= $(DISTROVER)_arduino_headless.dsk
+LDSKARDUINOHEADLESS	= $(DISTRONAME)$(PORT)_arduino_headless.dsk
+DSKCOCOSDC	= $(DISTROVER)_cocosdc.dsk
+LDSKCOCOSDC	= $(DISTRONAME)$(PORT)_cocosdc.dsk
+
+#DSKS		= $(DSKDW) $(DSKDWHEADLESS) $(DSKBECKER) $(DSKBECKERHEADLESS) \
+#		$(DSKARDUINO) $(DSKARDUINOHEADLESS) $(DSK360K_1) $(DSK360K_2) \
+#		$(DSK720K) $(DSKCOCOSDC)
+#LDSKS		= $(LDSKDW) $(LDSKDWHEADLESS) $(LDSKBECKER) $(LDSKBECKERHEADLESS) \
+#		$(LDSKARDUINO) $(LDSKARDUINOHEADLESS) $(LDSK360K_1) $(LDSK360K_2) \
+#		$(LDSK720K) $(LDSKCOCOSDC)
+DSKS		= $(DSK720K)
+LDSKS		= $(LDSK720K)
+
+# Make all components
+all:
+	@$(ECHO) "************************************************************"
+	@$(ECHO) "*"
+	@$(ECHO) "*      NitrOS-9/$(CPU) Level $(LEVEL) $(MACHINE) ($(PORT))"
+	@$(ECHO) "*"
+	@$(ECHO) "************************************************************"
+	$(foreach dir,$(DIRS),$(MAKE) -C $(dir) &&) :
+
+# Clean all components
+clean:	dskclean
+	$(foreach dir, $(DIRS), ($(CD) $(dir); make clean);)
+
+dskclean:
+	$(RM) $(PACKAGENAME) $(DSKS) $(LDSKS)
+
+dsk: all $(PACKAGENAME)
+
+dskcopy: dsk
+	$(CP) $(DSKS) $(DSKDIR)
+
+scp: dsk
+	scp $(PACKAGENAME) boisy@cvs.nitros9.org:/home/nitros9/public_html
+
+$(PACKAGENAME): $(DSKS) ../../ReadMe ../../ChangeLog
+	$(ARCHIVE) $@ $^
+
+$(DSKDW):
+	$(RM) $@
+	$(OS9FORMAT_DW) -q $@ -n"NitrOS-9/$(CPU) Level $(LEVEL)"
+	$(OS9GEN) $@ -b=$(BOOTFILE_COVDG_DW) -t=$(KERNELFILE_DW)
+	$(MAKDIR) $@,CMDS
+	$(MAKDIR) $@,SYS
+	$(MAKDIR) $@,DEFS
+	$(MAKDIR) $@,WWWROOT
+	$(CD) cmds; $(OS9COPY) $(sort $(CMDS_DW) $(CMDS_D2)) ../$@,CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(sort $(CMDS_DW) $(CMDS_D2)),$@,CMDS/$(file))
+	$(OS9RENAME) $@,CMDS/$(WHICHSHELL) shell
+	$(CD) sys; $(CPL) $(SYS) ../$@,SYS
+	$(OS9ATTR_TEXT) $(foreach file,$(SYS),$@,SYS/$(file))
+	$(CD) wwwroot; $(OS9COPY) $(WWWROOT) ../$@,WWWROOT
+	$(OS9ATTR_TEXT) $(foreach file,$(WWWROOT),$@,WWWROOT/$(file))
+	$(CD) defs; $(CPL) $(DEFS) ../$@,DEFS
+	$(OS9ATTR_TEXT) $(foreach file,$(DEFS),$@,DEFS/$(file))
+	$(CPL) $(STARTUP_DW) $@,startup
+	$(OS9ATTR_TEXT) $@,startup
+	$(MAKDIR) $@,NITROS9
+	$(MAKDIR) $@,NITROS9/$(DISTRO)
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/CMDS
+	$(CD) cmds; $(OS9COPY) $(MODULECMDS) ../$@,NITROS9/$(DISTRO)/CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(MODULECMDS),$@,NITROS9/$(DISTRO)/CMDS/$(file))
+	$(OS9RENAME) $@,NITROS9/$(DISTRO)/CMDS/$(WHICHSHELL) shell
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(CD) modules; $(OS9COPY) $(BOOTTRACK) ../$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(OS9ATTR_EXEC) $(foreach file,$(BOOTTRACK),$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(CD) modules; $(OS9COPY) $(KERNEL) ../$@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(OS9ATTR_EXEC) $(foreach file,$(KERNEL),$@,NITROS9/$(DISTRO)/MODULES/KERNEL/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(CD) modules; $(OS9COPY) $(SYSMODS) ../$@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(OS9ATTR_EXEC) $(foreach file,$(SYSMODS),$@,NITROS9/$(DISTRO)/MODULES/SYSMODS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(CD) modules; $(OS9COPY) $(CLOCKS) ../$@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(OS9ATTR_EXEC) $(foreach file,$(CLOCKS),$@,NITROS9/$(DISTRO)/MODULES/CLOCKS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(CD) modules; $(OS9COPY) $(RBF) ../$@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(OS9ATTR_EXEC) $(foreach file,$(RBF),$@,NITROS9/$(DISTRO)/MODULES/RBF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(CD) modules; $(OS9COPY) $(SCF) ../$@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(OS9ATTR_EXEC) $(foreach file,$(SCF),$@,NITROS9/$(DISTRO)/MODULES/SCF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(CD) modules; $(OS9COPY) $(PIPE) ../$@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(OS9ATTR_EXEC) $(foreach file,$(PIPE),$@,NITROS9/$(DISTRO)/MODULES/PIPE/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(CD) bootlists; $(CPL) *.bl ../$@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/SCRIPTS
+	$(CD) scripts; $(CPL) mb* ../$@,NITROS9/$(DISTRO)/SCRIPTS
+	$(RM) $(LDSKDW)
+	$(SOFTLINK) $@ $(LDSKDW)
+
+$(DSKBECKER):
+	$(RM) $@
+	$(OS9FORMAT_DW) -q $@ -n"NitrOS-9/$(CPU) Level $(LEVEL)"
+	$(OS9GEN) $@ -b=$(BOOTFILE_COVDG_BECKER) -t=$(KERNELFILE_BECKER)
+	$(MAKDIR) $@,CMDS
+	$(MAKDIR) $@,SYS
+	$(MAKDIR) $@,DEFS
+	$(MAKDIR) $@,WWWROOT
+	$(CD) cmds; $(OS9COPY) $(sort $(CMDS_DW) $(CMDS_D2)) ../$@,CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(sort $(CMDS_DW) $(CMDS_D2)),$@,CMDS/$(file))
+	$(OS9RENAME) $@,CMDS/$(WHICHSHELL) shell
+	$(CD) sys; $(CPL) $(SYS) ../$@,SYS
+	$(OS9ATTR_TEXT) $(foreach file,$(SYS),$@,SYS/$(file))
+	$(CD) wwwroot; $(OS9COPY) $(WWWROOT) ../$@,WWWROOT
+	$(OS9ATTR_TEXT) $(foreach file,$(WWWROOT),$@,WWWROOT/$(file))
+	$(CD) defs; $(CPL) $(DEFS) ../$@,DEFS
+	$(OS9ATTR_TEXT) $(foreach file,$(DEFS),$@,DEFS/$(file))
+	$(CPL) $(STARTUP_DW) $@,startup
+	$(OS9ATTR_TEXT) $@,startup
+	$(MAKDIR) $@,NITROS9
+	$(MAKDIR) $@,NITROS9/$(DISTRO)
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/CMDS
+	$(CD) cmds; $(OS9COPY) $(MODULECMDS) ../$@,NITROS9/$(DISTRO)/CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(MODULECMDS),$@,NITROS9/$(DISTRO)/CMDS/$(file))
+	$(OS9RENAME) $@,NITROS9/$(DISTRO)/CMDS/$(WHICHSHELL) shell
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(CD) modules; $(OS9COPY) $(BOOTTRACK) ../$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(OS9ATTR_EXEC) $(foreach file,$(BOOTTRACK),$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(CD) modules; $(OS9COPY) $(KERNEL) ../$@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(OS9ATTR_EXEC) $(foreach file,$(KERNEL),$@,NITROS9/$(DISTRO)/MODULES/KERNEL/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(CD) modules; $(OS9COPY) $(SYSMODS) ../$@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(OS9ATTR_EXEC) $(foreach file,$(SYSMODS),$@,NITROS9/$(DISTRO)/MODULES/SYSMODS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(CD) modules; $(OS9COPY) $(CLOCKS) ../$@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(OS9ATTR_EXEC) $(foreach file,$(CLOCKS),$@,NITROS9/$(DISTRO)/MODULES/CLOCKS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(CD) modules; $(OS9COPY) $(RBF) ../$@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(OS9ATTR_EXEC) $(foreach file,$(RBF),$@,NITROS9/$(DISTRO)/MODULES/RBF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(CD) modules; $(OS9COPY) $(SCF) ../$@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(OS9ATTR_EXEC) $(foreach file,$(SCF),$@,NITROS9/$(DISTRO)/MODULES/SCF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(CD) modules; $(OS9COPY) $(PIPE) ../$@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(OS9ATTR_EXEC) $(foreach file,$(PIPE),$@,NITROS9/$(DISTRO)/MODULES/PIPE/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(CD) bootlists; $(CPL) *.bl ../$@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/SCRIPTS
+	$(CD) scripts; $(CPL) mb* ../$@,NITROS9/$(DISTRO)/SCRIPTS
+	$(RM) $(LDSKBECKER)
+	$(SOFTLINK) $@ $(LDSKBECKER)
+
+$(DSKARDUINO):
+	$(RM) $@
+	$(OS9FORMAT_DW) -q $@ -n"NitrOS-9/$(CPU) Level $(LEVEL)"
+	$(OS9GEN) $@ -b=$(BOOTFILE_COVDG_ARDUINO) -t=$(KERNELFILE_ARDUINO)
+	$(MAKDIR) $@,CMDS
+	$(MAKDIR) $@,SYS
+	$(MAKDIR) $@,DEFS
+	$(MAKDIR) $@,WWWROOT
+	$(CD) cmds; $(OS9COPY) $(sort $(CMDS_DW) $(CMDS_D2)) ../$@,CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(sort $(CMDS_DW) $(CMDS_D2)),$@,CMDS/$(file))
+	$(OS9RENAME) $@,CMDS/$(WHICHSHELL) shell
+	$(CD) sys; $(CPL) $(SYS) ../$@,SYS
+	$(OS9ATTR_TEXT) $(foreach file,$(SYS),$@,SYS/$(file))
+	$(CD) wwwroot; $(OS9COPY) $(WWWROOT) ../$@,WWWROOT
+	$(OS9ATTR_TEXT) $(foreach file,$(WWWROOT),$@,WWWROOT/$(file))
+	$(CD) defs; $(CPL) $(DEFS) ../$@,DEFS
+	$(OS9ATTR_TEXT) $(foreach file,$(DEFS),$@,DEFS/$(file))
+	$(CPL) $(STARTUP_DW) $@,startup
+	$(OS9ATTR_TEXT) $@,startup
+	$(MAKDIR) $@,NITROS9
+	$(MAKDIR) $@,NITROS9/$(DISTRO)
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/CMDS
+	$(CD) cmds; $(OS9COPY) $(MODULECMDS) ../$@,NITROS9/$(DISTRO)/CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(MODULECMDS),$@,NITROS9/$(DISTRO)/CMDS/$(file))
+	$(OS9RENAME) $@,NITROS9/$(DISTRO)/CMDS/$(WHICHSHELL) shell
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(CD) modules; $(OS9COPY) $(BOOTTRACK) ../$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(OS9ATTR_EXEC) $(foreach file,$(BOOTTRACK),$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(CD) modules; $(OS9COPY) $(KERNEL) ../$@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(OS9ATTR_EXEC) $(foreach file,$(KERNEL),$@,NITROS9/$(DISTRO)/MODULES/KERNEL/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(CD) modules; $(OS9COPY) $(SYSMODS) ../$@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(OS9ATTR_EXEC) $(foreach file,$(SYSMODS),$@,NITROS9/$(DISTRO)/MODULES/SYSMODS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(CD) modules; $(OS9COPY) $(CLOCKS) ../$@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(OS9ATTR_EXEC) $(foreach file,$(CLOCKS),$@,NITROS9/$(DISTRO)/MODULES/CLOCKS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(CD) modules; $(OS9COPY) $(RBF) ../$@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(OS9ATTR_EXEC) $(foreach file,$(RBF),$@,NITROS9/$(DISTRO)/MODULES/RBF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(CD) modules; $(OS9COPY) $(SCF) ../$@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(OS9ATTR_EXEC) $(foreach file,$(SCF),$@,NITROS9/$(DISTRO)/MODULES/SCF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(CD) modules; $(OS9COPY) $(PIPE) ../$@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(OS9ATTR_EXEC) $(foreach file,$(PIPE),$@,NITROS9/$(DISTRO)/MODULES/PIPE/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(CD) bootlists; $(CPL) *.bl ../$@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/SCRIPTS
+	$(CD) scripts; $(CPL) mb* ../$@,NITROS9/$(DISTRO)/SCRIPTS
+	$(RM) $(LDSKARDUINO)
+	$(SOFTLINK) $@ $(LDSKARDUINO)
+
+$(DSKCOCOSDC):
+	$(RM) $@
+	$(OS9FORMAT) -t1024 -q $@ -n"NitrOS-9/$(CPU) Level $(LEVEL)"
+	$(OS9GEN) $@ -b=$(BOOTFILE_COVDG_COCOSDC) -t=$(KERNELFILE_COCOSDC)
+	$(MAKDIR) $@,CMDS
+	$(MAKDIR) $@,SYS
+	$(MAKDIR) $@,DEFS
+	$(MAKDIR) $@,WWWROOT
+	$(CD) cmds; $(OS9COPY) $(sort $(CMDS_DW) $(CMDS_D2)) ../$@,CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(sort $(CMDS_DW) $(CMDS_D2)),$@,CMDS/$(file))
+	$(OS9RENAME) $@,CMDS/$(WHICHSHELL) shell
+	$(CD) sys; $(CPL) $(SYS) ../$@,SYS
+	$(OS9ATTR_TEXT) $(foreach file,$(SYS),$@,SYS/$(file))
+	$(CD) wwwroot; $(OS9COPY) $(WWWROOT) ../$@,WWWROOT
+	$(OS9ATTR_TEXT) $(foreach file,$(WWWROOT),$@,WWWROOT/$(file))
+	$(CD) defs; $(CPL) $(DEFS) ../$@,DEFS
+	$(OS9ATTR_TEXT) $(foreach file,$(DEFS),$@,DEFS/$(file))
+	$(CPL) $(STARTUP_DW) $@,startup
+	$(OS9ATTR_TEXT) $@,startup
+	$(MAKDIR) $@,NITROS9
+	$(MAKDIR) $@,NITROS9/$(DISTRO)
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/CMDS
+	$(CD) cmds; $(OS9COPY) $(MODULECMDS) ../$@,NITROS9/$(DISTRO)/CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(MODULECMDS),$@,NITROS9/$(DISTRO)/CMDS/$(file))
+	$(OS9RENAME) $@,NITROS9/$(DISTRO)/CMDS/$(WHICHSHELL) shell
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(CD) modules; $(OS9COPY) $(BOOTTRACK) ../$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(OS9ATTR_EXEC) $(foreach file,$(BOOTTRACK),$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(CD) modules; $(OS9COPY) $(KERNEL) ../$@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(OS9ATTR_EXEC) $(foreach file,$(KERNEL),$@,NITROS9/$(DISTRO)/MODULES/KERNEL/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(CD) modules; $(OS9COPY) $(SYSMODS) ../$@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(OS9ATTR_EXEC) $(foreach file,$(SYSMODS),$@,NITROS9/$(DISTRO)/MODULES/SYSMODS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(CD) modules; $(OS9COPY) $(CLOCKS) ../$@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(OS9ATTR_EXEC) $(foreach file,$(CLOCKS),$@,NITROS9/$(DISTRO)/MODULES/CLOCKS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(CD) modules; $(OS9COPY) $(RBF) ../$@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(OS9ATTR_EXEC) $(foreach file,$(RBF),$@,NITROS9/$(DISTRO)/MODULES/RBF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(CD) modules; $(OS9COPY) $(SCF) ../$@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(OS9ATTR_EXEC) $(foreach file,$(SCF),$@,NITROS9/$(DISTRO)/MODULES/SCF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(CD) modules; $(OS9COPY) $(PIPE) ../$@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(OS9ATTR_EXEC) $(foreach file,$(PIPE),$@,NITROS9/$(DISTRO)/MODULES/PIPE/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(CD) bootlists; $(CPL) *.bl ../$@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/SCRIPTS
+	$(CD) scripts; $(CPL) mb* ../$@,NITROS9/$(DISTRO)/SCRIPTS
+	$(RM) $(LDSKCOCOSDC)
+	$(SOFTLINK) $@ $(LDSKCOCOSDC)
+
+$(DSKDWHEADLESS):
+	$(RM) $@
+	$(OS9FORMAT_DW) -q $@ -n"NitrOS-9/$(CPU) Level $(LEVEL)"
+	$(OS9GEN) $@ -b=$(BOOTFILE_DW_HEADLESS) -t=$(KERNELFILE_DW)
+	$(MAKDIR) $@,CMDS
+	$(MAKDIR) $@,SYS
+	$(MAKDIR) $@,DEFS
+	$(MAKDIR) $@,WWWROOT
+	$(CD) cmds; $(OS9COPY) $(sort $(CMDS_DW) $(CMDS_D2)) ../$@,CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(sort $(CMDS_DW) $(CMDS_D2)),$@,CMDS/$(file))
+	$(OS9RENAME) $@,CMDS/$(WHICHSHELL) shell
+	$(CD) sys; $(CPL) $(SYS) ../$@,SYS
+	$(OS9ATTR_TEXT) $(foreach file,$(SYS),$@,SYS/$(file))
+	$(CD) wwwroot; $(OS9COPY) $(WWWROOT) ../$@,WWWROOT
+	$(OS9ATTR_TEXT) $(foreach file,$(WWWROOT),$@,WWWROOT/$(file))
+	$(CD) defs; $(CPL) $(DEFS) ../$@,DEFS
+	$(OS9ATTR_TEXT) $(foreach file,$(DEFS),$@,DEFS/$(file))
+	$(CPL) $(STARTUP_DW) $@,startup
+	$(OS9ATTR_TEXT) $@,startup
+	$(MAKDIR) $@,NITROS9
+	$(MAKDIR) $@,NITROS9/$(DISTRO)
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/CMDS
+	$(CD) cmds; $(OS9COPY) $(MODULECMDS) ../$@,NITROS9/$(DISTRO)/CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(MODULECMDS),$@,NITROS9/$(DISTRO)/CMDS/$(file))
+	$(OS9RENAME) $@,NITROS9/$(DISTRO)/CMDS/$(WHICHSHELL) shell
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(CD) modules; $(OS9COPY) $(BOOTTRACK) ../$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(OS9ATTR_EXEC) $(foreach file,$(BOOTTRACK),$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(CD) modules; $(OS9COPY) $(KERNEL) ../$@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(OS9ATTR_EXEC) $(foreach file,$(KERNEL),$@,NITROS9/$(DISTRO)/MODULES/KERNEL/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(CD) modules; $(OS9COPY) $(SYSMODS) ../$@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(OS9ATTR_EXEC) $(foreach file,$(SYSMODS),$@,NITROS9/$(DISTRO)/MODULES/SYSMODS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(CD) modules; $(OS9COPY) $(CLOCKS) ../$@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(OS9ATTR_EXEC) $(foreach file,$(CLOCKS),$@,NITROS9/$(DISTRO)/MODULES/CLOCKS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(CD) modules; $(OS9COPY) $(RBF) ../$@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(OS9ATTR_EXEC) $(foreach file,$(RBF),$@,NITROS9/$(DISTRO)/MODULES/RBF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(CD) modules; $(OS9COPY) $(SCF) ../$@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(OS9ATTR_EXEC) $(foreach file,$(SCF),$@,NITROS9/$(DISTRO)/MODULES/SCF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(CD) modules; $(OS9COPY) $(PIPE) ../$@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(OS9ATTR_EXEC) $(foreach file,$(PIPE),$@,NITROS9/$(DISTRO)/MODULES/PIPE/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(CD) bootlists; $(CPL) *.bl ../$@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/SCRIPTS
+	$(CD) scripts; $(CPL) mb* ../$@,NITROS9/$(DISTRO)/SCRIPTS
+	$(RM) $(LDSKDWHEADLESS)
+	$(SOFTLINK) $@ $(LDSKDWHEADLESS)
+
+$(DSKBECKERHEADLESS):
+	$(RM) $@
+	$(OS9FORMAT_DW) -q $@ -n"NitrOS-9/$(CPU) Level $(LEVEL)"
+	$(OS9GEN) $@ -b=$(BOOTFILE_BECKER_HEADLESS) -t=$(KERNELFILE_BECKER)
+	$(MAKDIR) $@,CMDS
+	$(MAKDIR) $@,SYS
+	$(MAKDIR) $@,DEFS
+	$(MAKDIR) $@,WWWROOT
+	$(CD) cmds; $(OS9COPY) $(sort $(CMDS_DW) $(CMDS_D2)) ../$@,CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(sort $(CMDS_DW) $(CMDS_D2)),$@,CMDS/$(file))
+	$(OS9RENAME) $@,CMDS/$(WHICHSHELL) shell
+	$(CD) sys; $(CPL) $(SYS) ../$@,SYS
+	$(OS9ATTR_TEXT) $(foreach file,$(SYS),$@,SYS/$(file))
+	$(CD) wwwroot; $(OS9COPY) $(WWWROOT) ../$@,WWWROOT
+	$(OS9ATTR_TEXT) $(foreach file,$(WWWROOT),$@,WWWROOT/$(file))
+	$(CD) defs; $(CPL) $(DEFS) ../$@,DEFS
+	$(OS9ATTR_TEXT) $(foreach file,$(DEFS),$@,DEFS/$(file))
+	$(CPL) $(STARTUP_DW) $@,startup
+	$(OS9ATTR_TEXT) $@,startup
+	$(MAKDIR) $@,NITROS9
+	$(MAKDIR) $@,NITROS9/$(DISTRO)
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/CMDS
+	$(CD) cmds; $(OS9COPY) $(MODULECMDS) ../$@,NITROS9/$(DISTRO)/CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(MODULECMDS),$@,NITROS9/$(DISTRO)/CMDS/$(file))
+	$(OS9RENAME) $@,NITROS9/$(DISTRO)/CMDS/$(WHICHSHELL) shell
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(CD) modules; $(OS9COPY) $(BOOTTRACK) ../$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(OS9ATTR_EXEC) $(foreach file,$(BOOTTRACK),$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(CD) modules; $(OS9COPY) $(KERNEL) ../$@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(OS9ATTR_EXEC) $(foreach file,$(KERNEL),$@,NITROS9/$(DISTRO)/MODULES/KERNEL/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(CD) modules; $(OS9COPY) $(SYSMODS) ../$@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(OS9ATTR_EXEC) $(foreach file,$(SYSMODS),$@,NITROS9/$(DISTRO)/MODULES/SYSMODS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(CD) modules; $(OS9COPY) $(CLOCKS) ../$@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(OS9ATTR_EXEC) $(foreach file,$(CLOCKS),$@,NITROS9/$(DISTRO)/MODULES/CLOCKS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(CD) modules; $(OS9COPY) $(RBF) ../$@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(OS9ATTR_EXEC) $(foreach file,$(RBF),$@,NITROS9/$(DISTRO)/MODULES/RBF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(CD) modules; $(OS9COPY) $(SCF) ../$@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(OS9ATTR_EXEC) $(foreach file,$(SCF),$@,NITROS9/$(DISTRO)/MODULES/SCF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(CD) modules; $(OS9COPY) $(PIPE) ../$@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(OS9ATTR_EXEC) $(foreach file,$(PIPE),$@,NITROS9/$(DISTRO)/MODULES/PIPE/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(CD) bootlists; $(CPL) *.bl ../$@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/SCRIPTS
+	$(CD) scripts; $(CPL) mb* ../$@,NITROS9/$(DISTRO)/SCRIPTS
+	$(RM) $(LDSKBECKERHEADLESS)
+	$(SOFTLINK) $@ $(LDSKBECKERHEADLESS)
+
+$(DSKARDUINOHEADLESS):
+	$(RM) $@
+	$(OS9FORMAT_DW) -q $@ -n"NitrOS-9/$(CPU) Level $(LEVEL)"
+	$(OS9GEN) $@ -b=$(BOOTFILE_ARDUINO_HEADLESS) -t=$(KERNELFILE_ARDUINO)
+	$(MAKDIR) $@,CMDS
+	$(MAKDIR) $@,SYS
+	$(MAKDIR) $@,DEFS
+	$(MAKDIR) $@,WWWROOT
+	$(CD) cmds; $(OS9COPY) $(sort $(CMDS_DW) $(CMDS_D2)) ../$@,CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(sort $(CMDS_DW) $(CMDS_D2)),$@,CMDS/$(file))
+	$(OS9RENAME) $@,CMDS/$(WHICHSHELL) shell
+	$(CD) sys; $(CPL) $(SYS) ../$@,SYS
+	$(OS9ATTR_TEXT) $(foreach file,$(SYS),$@,SYS/$(file))
+	$(CD) wwwroot; $(OS9COPY) $(WWWROOT) ../$@,WWWROOT
+	$(OS9ATTR_TEXT) $(foreach file,$(WWWROOT),$@,WWWROOT/$(file))
+	$(CD) defs; $(CPL) $(DEFS) ../$@,DEFS
+	$(OS9ATTR_TEXT) $(foreach file,$(DEFS),$@,DEFS/$(file))
+	$(CPL) $(STARTUP_DW) $@,startup
+	$(OS9ATTR_TEXT) $@,startup
+	$(MAKDIR) $@,NITROS9
+	$(MAKDIR) $@,NITROS9/$(DISTRO)
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/CMDS
+	$(CD) cmds; $(OS9COPY) $(MODULECMDS) ../$@,NITROS9/$(DISTRO)/CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(MODULECMDS),$@,NITROS9/$(DISTRO)/CMDS/$(file))
+	$(OS9RENAME) $@,NITROS9/$(DISTRO)/CMDS/$(WHICHSHELL) shell
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(CD) modules; $(OS9COPY) $(BOOTTRACK) ../$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(OS9ATTR_EXEC) $(foreach file,$(BOOTTRACK),$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(CD) modules; $(OS9COPY) $(KERNEL) ../$@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(OS9ATTR_EXEC) $(foreach file,$(KERNEL),$@,NITROS9/$(DISTRO)/MODULES/KERNEL/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(CD) modules; $(OS9COPY) $(SYSMODS) ../$@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(OS9ATTR_EXEC) $(foreach file,$(SYSMODS),$@,NITROS9/$(DISTRO)/MODULES/SYSMODS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(CD) modules; $(OS9COPY) $(CLOCKS) ../$@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(OS9ATTR_EXEC) $(foreach file,$(CLOCKS),$@,NITROS9/$(DISTRO)/MODULES/CLOCKS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(CD) modules; $(OS9COPY) $(RBF) ../$@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(OS9ATTR_EXEC) $(foreach file,$(RBF),$@,NITROS9/$(DISTRO)/MODULES/RBF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(CD) modules; $(OS9COPY) $(SCF) ../$@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(OS9ATTR_EXEC) $(foreach file,$(SCF),$@,NITROS9/$(DISTRO)/MODULES/SCF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(CD) modules; $(OS9COPY) $(PIPE) ../$@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(OS9ATTR_EXEC) $(foreach file,$(PIPE),$@,NITROS9/$(DISTRO)/MODULES/PIPE/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(CD) bootlists; $(CPL) *.bl ../$@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/SCRIPTS
+	$(CD) scripts; $(CPL) mb* ../$@,NITROS9/$(DISTRO)/SCRIPTS
+	$(RM) $(LDSKARDUINOHEADLESS)
+	$(SOFTLINK) $@ $(LDSKARDUINOHEADLESS)
+
+$(DSK360K_1):
+	$(RM) $@
+	$(OS9FORMAT_DS40) -q $@ -n"NitrOS-9/$(CPU) Level $(LEVEL) Disk 1"
+	$(OS9GEN) $@ -b=$(BOOTFILE_COVDG) -t=$(KERNELFILE)
+	$(MAKDIR) $@,CMDS
+	$(MAKDIR) $@,SYS
+	$(CD) cmds; $(OS9COPY) $(CMDS) ../$@,CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(CMDS),$@,CMDS/$(file))
+	$(OS9RENAME) $@,CMDS/$(WHICHSHELL) shell
+	$(CD) sys; $(CPL) $(SYS) ../$@,SYS
+	$(OS9ATTR_TEXT) $(foreach file,$(SYS),$@,SYS/$(file))
+	$(MAKDIR) $@,DEFS
+	$(CD) defs; $(CPL) $(DEFS) ../$@,DEFS
+	$(OS9ATTR_TEXT) $(foreach file,$(DEFS),$@,DEFS/$(file))
+	$(CPL) $(STARTUP) $@,startup
+	$(OS9ATTR_TEXT) $@,startup
+	$(RM) $(LDSK360K_1)
+	$(SOFTLINK) $@ $(LDSK360K_1)
+
+$(DSK360K_2):
+	$(RM) $@
+	$(OS9FORMAT_DS40) -q $@ -n"NitrOS-9/$(CPU) Level $(LEVEL) Disk 2"
+	$(MAKDIR) $@,CMDS
+	$(CD) cmds; $(OS9COPY) $(CMDS_D2) ../$@,CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(CMDS_D2),$@,CMDS/$(file))
+	$(MAKDIR) $@,NITROS9
+	$(MAKDIR) $@,NITROS9/$(DISTRO)
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/CMDS
+	$(CD) cmds; $(OS9COPY) $(MODULECMDS) ../$@,NITROS9/$(DISTRO)/CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(MODULECMDS),$@,NITROS9/$(DISTRO)/CMDS/$(file))
+	$(OS9RENAME) $@,NITROS9/$(DISTRO)/CMDS//$(WHICHSHELL) shell
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(CD) modules; $(OS9COPY) $(BOOTTRACK) ../$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(OS9ATTR_EXEC) $(foreach file,$(BOOTTRACK),$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(CD) modules; $(OS9COPY) $(KERNEL) ../$@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(OS9ATTR_EXEC) $(foreach file,$(KERNEL),$@,NITROS9/$(DISTRO)/MODULES/KERNEL/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(CD) modules; $(OS9COPY) $(SYSMODS) ../$@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(OS9ATTR_EXEC) $(foreach file,$(SYSMODS),$@,NITROS9/$(DISTRO)/MODULES/SYSMODS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(CD) modules; $(OS9COPY) $(CLOCKS) ../$@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(OS9ATTR_EXEC) $(foreach file,$(CLOCKS),$@,NITROS9/$(DISTRO)/MODULES/CLOCKS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(CD) modules; $(OS9COPY) $(RBF) ../$@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(OS9ATTR_EXEC) $(foreach file,$(RBF),$@,NITROS9/$(DISTRO)/MODULES/RBF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(CD) modules; $(OS9COPY) $(SCF) ../$@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(OS9ATTR_EXEC) $(foreach file,$(SCF),$@,NITROS9/$(DISTRO)/MODULES/SCF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(CD) modules; $(OS9COPY) $(PIPE) ../$@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(OS9ATTR_EXEC) $(foreach file,$(PIPE),$@,NITROS9/$(DISTRO)/MODULES/PIPE/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(CD) bootlists; $(CPL) *.bl ../$@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/SCRIPTS
+	$(CD) scripts; $(CPL) mb* ../$@,NITROS9/$(DISTRO)/SCRIPTS
+	$(RM) $(LDSK360K_2)
+	$(SOFTLINK) $@ $(LDSK360K_2)
+
+# [NAC HACK 2015Aug31] this is the image I'm targetting for multicomp09
+# _DS80 to format the disk double-sided. Bootfile _SD80 for my SDcontroller
+# driver.
+$(DSK720K):
+	$(RM) $@
+	$(OS9FORMAT_DS80) -q $@ -n"NitrOS-9/$(CPU) Level $(LEVEL)"
+	$(OS9GEN) $@ -b=$(BOOTFILE_COVDG_SD80) -t=$(KERNELFILE_COCOSDC)
+	$(MAKDIR) $@,CMDS
+	$(MAKDIR) $@,SYS
+	$(MAKDIR) $@,DEFS
+	$(CD) cmds; $(OS9COPY) $(sort $(CMDS) $(CMDS_D2)) ../$@,CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(sort $(CMDS) $(CMDS_D2)),$@,CMDS/$(file))
+	$(OS9RENAME) $@,CMDS/$(WHICHSHELL) shell
+	$(CD) sys; $(CPL) $(SYS) ../$@,SYS
+	$(OS9ATTR_TEXT) $(foreach file,$(SYS),$@,SYS/$(file))
+	$(CD) defs; $(CPL) $(DEFS) ../$@,DEFS
+	$(OS9ATTR_TEXT) $(foreach file,$(DEFS),$@,DEFS/$(file))
+	$(CPL) $(STARTUP) $@,startup
+	$(OS9ATTR_TEXT) $@,startup
+	$(MAKDIR) $@,NITROS9
+	$(MAKDIR) $@,NITROS9/$(DISTRO)
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/CMDS
+	$(CD) cmds; $(OS9COPY) $(MODULECMDS) ../$@,NITROS9/$(DISTRO)/CMDS
+	$(OS9ATTR_EXEC) $(foreach file,$(MODULECMDS),$@,NITROS9/$(DISTRO)/CMDS/$(file))
+	$(OS9RENAME) $@,NITROS9/$(DISTRO)/CMDS/$(WHICHSHELL) shell
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(CD) modules; $(OS9COPY) $(BOOTTRACK) ../$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK
+	$(OS9ATTR_EXEC) $(foreach file,$(BOOTTRACK),$@,NITROS9/$(DISTRO)/MODULES/BOOTTRACK/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(CD) modules; $(OS9COPY) $(KERNEL) ../$@,NITROS9/$(DISTRO)/MODULES/KERNEL
+	$(OS9ATTR_EXEC) $(foreach file,$(KERNEL),$@,NITROS9/$(DISTRO)/MODULES/KERNEL/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(CD) modules; $(OS9COPY) $(SYSMODS) ../$@,NITROS9/$(DISTRO)/MODULES/SYSMODS
+	$(OS9ATTR_EXEC) $(foreach file,$(SYSMODS),$@,NITROS9/$(DISTRO)/MODULES/SYSMODS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(CD) modules; $(OS9COPY) $(CLOCKS) ../$@,NITROS9/$(DISTRO)/MODULES/CLOCKS
+	$(OS9ATTR_EXEC) $(foreach file,$(CLOCKS),$@,NITROS9/$(DISTRO)/MODULES/CLOCKS/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(CD) modules; $(OS9COPY) $(RBF) ../$@,NITROS9/$(DISTRO)/MODULES/RBF
+	$(OS9ATTR_EXEC) $(foreach file,$(RBF),$@,NITROS9/$(DISTRO)/MODULES/RBF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(CD) modules; $(OS9COPY) $(SCF) ../$@,NITROS9/$(DISTRO)/MODULES/SCF
+	$(OS9ATTR_EXEC) $(foreach file,$(SCF),$@,NITROS9/$(DISTRO)/MODULES/SCF/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(CD) modules; $(OS9COPY) $(PIPE) ../$@,NITROS9/$(DISTRO)/MODULES/PIPE
+	$(OS9ATTR_EXEC) $(foreach file,$(PIPE),$@,NITROS9/$(DISTRO)/MODULES/PIPE/$(file))
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(CD) bootlists; $(CPL) *.bl ../$@,NITROS9/$(DISTRO)/BOOTLISTS
+	$(MAKDIR) $@,NITROS9/$(DISTRO)/SCRIPTS
+	$(CD) scripts; $(CPL) mb* ../$@,NITROS9/$(DISTRO)/SCRIPTS
+	$(RM) $(LDSK720K)
+	$(SOFTLINK) $@ $(LDSK720K)
+
+info:
+	@$(ECHO) "*** NitrOS-9/$(CPU) Level $(LEVEL) for the $(MACHINE) ***" 
+	@$(foreach dsk, $(DSKS), $(ECHO) $(dsk);)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/modules/defsfile	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,1 @@
+         use   ../defsfile
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/modules/kernel/defsfile	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,1 @@
+         use   ../../defsfile
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/modules/kernel/makefile	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,34 @@
+ifeq ($(PORT),)
+        PORT=mc09
+endif
+include $(NITROS9DIR)/rules.mak
+
+vpath %.asm $(LEVEL1)/modules/kernel
+
+DEPENDS		= ./makefile
+
+KERNEL		= krn
+KERNELP2	= krnp2
+SYSCALLS	= fcmpnam.asm fprsnam.asm
+
+AFLAGS		+= -I$(LEVEL1)/modules/kernel
+
+ALLOBJS		= $(KERNEL) $(KERNELP2)
+
+all:	$(ALLOBJS)
+
+$(KERNEL):	krn.asm $(SYSCALLS)
+
+$(KERNELP2):	krnp2.asm $(SYSCALLS)
+
+clean:
+	$(RM) $(ALLOBJS)
+
+showobjs:
+	@$(ECHO) $(ALLOBJS)
+
+showcopyobjs:
+	@$(ECHO) $(COPYOBJS)
+
+identify:
+	$(IDENT_SHORT) $(ALLOBJS)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/modules/makefile	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,433 @@
+include ../port.mak
+
+vpath %.asm $(LEVEL1)/modules
+
+AFLAGS		+= -I$(LEVEL1)/modules
+
+CLOCKELIM       = -DRTCElim=1
+CLOCKDISTO2     = -DRTCDsto2=1
+CLOCKDISTO4     = -DRTCDsto4=1
+CLOCKBNB        = -DRTCBB=1
+CLOCKSMART      = -DRTCSmart=1 -DMPIFlag=1
+CLOCKHARRIS     = -DRTCHarrs=1
+CLOCKCLOUD9     = -DRTCCloud9=1
+CLOCKSOFT       = -DRTCSoft=1
+CLOCKMESSEMU    = -DRTCMessEmu=1
+CLOCKJVEMU      = -DRTCJVEmu=1
+TC3FLAGS        = $(AFLAGS) -DTC3=1 $(FLAGS)
+IDEFLAGS        = $(AFLAGS) -DIDE=1 $(FLAGS)
+SDFLAGS		= $(AFLAGS) -DCOCOSDC=1 -DITTYP=128 $(FLAGS)
+
+DEPENDS		= ./makefile
+TPB		= $(3RDPARTY)/booters
+
+BOOTERS		= boot_1773_6ms boot_1773_30ms \
+		boot_burke boot_rampak boot_wd1002 boot_dw \
+		boot_tc3 boot_ide boot_rom boot_dw_becker \
+		boot_dw_arduino boot_dw_coco1 boot_sdc
+BOOTTRACK	= rel $(BOOTERS)
+KERNEL		= krn krnp2 wbug
+SYSMODS		= ioman init sysgo_dd sysgo_h0 rominfo rominfo_pak vectors
+CLOCKS          = clock_60hz clock_50hz mc09clock_50hz\
+		clock2_elim clock2_disto2 clock2_disto4 clock2_bnb \
+                clock2_smart clock2_harris clock2_cloud9 clock2_soft \
+		clock2_messemu clock2_jvemu clock2_dw
+
+RBF		= rbf.mn \
+		rbdw.dr dwio.sb dwio_coco1.sb dwio_becker.sb dwio_arduino.sb \
+		mc09sdc.dr rb1773.dr rb1773_scii_ff74.dr rb1773_scii_ff58.dr \
+		ddd0_35s.dd d0_35s.dd d1_35s.dd d2_35s.dd d3_35s.dd \
+		ddd0_40d.dd d0_40d.dd d1_40d.dd d2_40d.dd \
+		ddd0_80d.dd d0_80d.dd d1_80d.dd d2_80d.dd \
+		dds0_80d.dd s0_80d.dd s1_80d.dd s2_80d.dd s3_80d.dd \
+		ddx0.dd x0.dd x1.dd x2.dd x3.dd \
+		rbsuper.dr lltc3.dr llide.dr llcocosdc.dr \
+		ddi0_ide.dd i0_ide.dd i1_ide.dd ih_ide.dd \
+		dds0_tc3.dd s0_tc3.dd s1_tc3.dd s2_tc3.dd s3_tc3.dd s4_tc3.dd \
+                s5_tc3.dd s6_tc3.dd sh_tc3.dd \
+		ddsd0_cocosdc.dd sd0_cocosdc.dd sd1_cocosdc.dd
+
+SCF		= scf.mn \
+		sc6551.dr vrn.dr scbbp.dr scbbt.dr scdwp.dr sspak.dr vtio.dr \
+		covdg.io cohr.io co80.io \
+		nil.dd p_scbbp.dd p_scdwp.dd pipe.dd ssp.dd \
+		term_scbbt.dt term_sc6551.dt t1_scbbt.dd t2_sc6551.dd t3_sc6551.dd \
+		mc6850.dr term_mc6850.dt term_mc6850_t0.dt term_mc6850_t1.dt \
+		term_vdg.dt term_hr.dt term_80.dt \
+		scdwv.dr term_scdwv.dt n_scdwv.dd n1_scdwv.dd n2_scdwv.dd \
+		n3_scdwv.dd n4_scdwv.dd n5_scdwv.dd n6_scdwv.dd n7_scdwv.dd \
+		n8_scdwv.dd n9_scdwv.dd n10_scdwv.dd n11_scdwv.dd n12_scdwv.dd \
+		n13_scdwv.dd midi_scdwv.dd \
+		term_z_scdwv.dt z1_scdwv.dd z2_scdwv.dd z3_scdwv.dd z4_scdwv.dd z5_scdwv.dd \
+		z6_scdwv.dd z7_scdwv.dd
+
+PIPE		= pipeman.mn \
+		piper.dr \
+		pipe.dd
+
+RFM		= rfm.mn rfmdrv.dr ddy0.dd y0.dd y1.dd y2.dd y3.dd
+
+ALLOBJS		= $(BOOTTRACK) $(KERNEL) $(SYSMODS) $(CLOCKS) $(RBF) $(SCF) $(PIPE) $(RFM)
+
+all:	$(ALLOBJS)
+
+# Kernel
+krn krnp2:
+	$(CD) kernel; make $@
+	$(OS9COPY) kernel/$@ .
+
+# Special cases
+
+rominfo_pak: rominfo.asm
+	$(AS) $(ASOUT)$@ $< $(AFLAGS) -DROMPak=1
+
+# TC^3 SCSI Booter
+boot_tc3: boot_scsi.asm
+	$(AS) $(ASOUT)$@ $< $(TC3FLAGS)
+
+# SuperIDE/Glenside IDE Booter
+boot_ide: boot_ide.asm
+	$(AS) $(ASOUT)$@ $< $(IDEFLAGS)
+
+# CoCo SDC Booter
+boot_sdc: boot_sdc.asm
+	$(AS) $(ASOUT)$@ $< $(SDFLAGS)
+
+# DriveWire Becker Booter
+boot_dw_becker:	boot_dw.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DBECKER=1
+
+# DriveWire Becker Submodule
+dwio_becker.sb:	dwio.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DBECKER=1
+
+# DriveWire Arduino Booter
+boot_dw_arduino:	boot_dw.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DARDUINO=1
+
+# DriveWire Arduino Submodule
+dwio_arduino.sb:	dwio.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DARDUINO=1
+
+# DriveWire CoCo1 Booter
+boot_dw_coco1:	boot_dw.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DBAUD38400=1
+
+# DriveWire CoCo1 Submodule
+dwio_coco1.sb:	dwio.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DBAUD38400=1
+
+# DriveWire 3
+boot_1773_6ms:	boot_1773.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DDNum=0 -DSTEP=0
+
+boot_1773_30ms:	boot_1773.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DDNum=0 -DSTEP=3
+
+rb1773_scii_ff74.dr:	rb1773.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DSCII=1
+
+rb1773_scii_ff58.dr:	rb1773.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DSCII=1 -DSCIIALT=1
+
+# TC^3 SCSI Driver
+lltc3.dr: llscsi.asm
+	$(AS) $(ASOUT)$@ $< $(TC3FLAGS)
+
+# IDE Driver
+llide.dr: llide.asm
+	$(AS) $(ASOUT)$@ $< $(IDEFLAGS)
+
+# Floppy descriptors
+SSDD35		= -DCyls=35 -DSides=1 -DSectTrk=18 -DSectTrk0=18 \
+		-DInterlv=3 -DSAS=8 -DDensity=1
+DSDD40		= -DCyls=40 -DSides=2 -DSectTrk=18 -DSectTrk0=18 \
+		-DInterlv=3 -DSAS=8 -DDensity=1
+DSDD80		= -DCyls=80 -DSides=2 -DSectTrk=18 -DSectTrk0=18 \
+		-DInterlv=3 -DSAS=8 -DDensity=1 -DD35
+
+# HDB-DOS for SuperDriver
+HDBDOS                  = -DHB $(SSDD35) -DITDNS=8 $(ID0)
+
+ddd0_35s.dd: rb1773desc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) $(SSDD35) -DDNum=0 -DDD=1
+
+d0_35s.dd: rb1773desc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) $(SSDD35) -DDNum=0
+
+d1_35s.dd: rb1773desc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) $(SSDD35) -DDNum=1
+
+d2_35s.dd: rb1773desc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) $(SSDD35) -DDNum=2
+
+d3_35s.dd: rb1773desc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) $(SSDD35) -DDNum=3
+
+ddd0_40d.dd: rb1773desc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) $(DSDD40) -DDNum=0 -DDD=1
+
+d0_40d.dd: rb1773desc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) $(DSDD40) -DDNum=0
+
+d1_40d.dd: rb1773desc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) $(DSDD40) -DDNum=1
+
+d2_40d.dd: rb1773desc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) $(DSDD40) -DDNum=2
+
+ddd0_80d.dd: rb1773desc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) $(DSDD80) -DDNum=0 -DDD=1
+
+d0_80d.dd: rb1773desc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) $(DSDD80) -DDNum=0
+
+d1_80d.dd: rb1773desc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) $(DSDD80) -DDNum=1
+
+d2_80d.dd: rb1773desc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) $(DSDD80) -DDNum=2
+
+# OFFSET is the high 16 bits of the 24-bit block address
+# where the disk image starts on the SDcard. It must match
+# the value used in the create_sd_image script. Needs to be
+# expressed in DECIMAL here (at least, I don't know how to pass
+# it in and have it treated as hex)
+dds0_80d.dd: mc09sdcdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DDNum=0 -DDD=1 -DOFFSET=640
+
+s0_80d.dd: mc09sdcdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DDNum=0        -DOFFSET=640
+
+s1_80d.dd: mc09sdcdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DDNum=1        -DOFFSET=656
+
+s2_80d.dd: mc09sdcdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DDNum=2        -DOFFSET=672
+
+s3_80d.dd: mc09sdcdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DDNum=3        -DOFFSET=688
+
+# Serial ports for mc09
+term_mc6850_t0.dt: term_mc6850.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DTNum=0        -DHwBASE=0xFFD2
+
+term_mc6850_t1.dt: term_mc6850.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DTNum=1        -DHwBASE=0xFFD4
+
+
+
+
+# DriveWire 3 SCF descriptors
+term_scdwv.dt: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=0
+
+n_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=255
+
+n1_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=1
+
+n2_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=2
+
+n3_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=3
+
+n4_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=4
+
+n5_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=5
+
+n6_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=6
+
+n7_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=7
+
+n8_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=8
+
+n9_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=9
+
+n10_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=10
+
+n11_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=11
+
+n12_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=12
+
+n13_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=13
+
+midi_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=14
+
+term_z_scdwv.dt: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=16
+
+z1_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=17
+
+z2_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=18
+
+z3_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=19
+
+z4_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=20
+
+z5_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=21
+
+z6_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=22
+
+z7_scdwv.dd: scdwvdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DAddr=23
+
+# DriveWire 3 RBF descriptors
+ddx0.dd: dwdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DDD=1 -DDNum=0
+
+x0.dd: dwdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DDNum=0
+
+x1.dd: dwdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DDNum=1
+
+x2.dd: dwdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DDNum=2
+
+x3.dd: dwdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DDNum=3
+
+# TC^3 SCSI Descriptors
+dds0_tc3.dd: superdesc.asm
+	$(AS) $(ASOUT)$@ $< $(TC3FLAGS) $(ID0) -DDD=1
+
+s0_tc3.dd: superdesc.asm
+	$(AS) $(ASOUT)$@ $< $(TC3FLAGS) $(ID0) $(SCSI_HD)
+
+s1_tc3.dd: superdesc.asm
+	$(AS) $(ASOUT)$@ $< $(TC3FLAGS) $(ID1) $(SCSI_HD)
+
+s2_tc3.dd: superdesc.asm
+	$(AS) $(ASOUT)$@ $< $(TC3FLAGS) $(ID2) $(SCSI_HD)
+
+s3_tc3.dd: superdesc.asm
+	$(AS) $(ASOUT)$@ $< $(TC3FLAGS) $(ID3) $(SCSI_HD)
+
+s4_tc3.dd: superdesc.asm
+	$(AS) $(ASOUT)$@ $< $(TC3FLAGS) $(ID4) $(SCSI_HD)
+
+s5_tc3.dd: superdesc.asm
+	$(AS) $(ASOUT)$@ $< $(TC3FLAGS) $(ID5) $(SCSI_HD)
+
+s6_tc3.dd: superdesc.asm
+	$(AS) $(ASOUT)$@ $< $(TC3FLAGS) $(ID6) $(SCSI_HD)
+
+sh_tc3.dd: superdesc.asm
+	$(AS) $(ASOUT)$@ $< $(TC3FLAGS) $(HDBDOS)
+
+# IDE Descriptors
+ddi0_ide.dd: superdesc.asm
+	$(AS) $(ASOUT)$@ $< $(IDEFLAGS) $(MASTER) -DDD=1
+
+i0_ide.dd: superdesc.asm
+	$(AS) $(ASOUT)$@ $< $(IDEFLAGS) $(MASTER)
+
+i1_ide.dd: superdesc.asm
+	$(AS) $(ASOUT)$@ $< $(IDEFLAGS) $(SLAVE)
+
+ih_ide.dd: superdesc.asm
+	$(AS) $(ASOUT)$@ $< $(IDEFLAGS) $(HDBDOS)
+
+# CoCo SDC Descriptors
+ddsd0_cocosdc.dd: superdesc.asm
+	$(AS) $(ASOUT)$@ $< $(SDFLAGS) -DDD=1
+
+sd0_cocosdc.dd: superdesc.asm
+	$(AS) $(ASOUT)$@ $< $(SDFLAGS) -DITDRV=0
+
+sd1_cocosdc.dd: superdesc.asm
+	$(AS) $(ASOUT)$@ $< $(SDFLAGS) -DITDRV=1
+
+# RFM descriptors
+ddy0.dd: rfmdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DDD=1 -DDNum=0
+
+y0.dd: rfmdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DDNum=0
+
+y1.dd: rfmdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DDNum=1
+
+y2.dd: rfmdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DDNum=2
+
+y3.dd: rfmdesc.asm
+	$(AS) $< $(ASOUT)$@ $(AFLAGS) -DDNum=3
+
+rel: rel.asm
+	$(AS) $(AFLAGS) $(ASOUT)$@ $<
+
+sysgo_dd: sysgo.asm
+	$(AS) $(AFLAGS) $(ASOUT)$@ $< -DDD=1
+
+sysgo_h0: sysgo.asm
+	$(AS) $(AFLAGS) $(ASOUT)$@ $<
+
+# Clocks
+clock_60hz: clock.asm
+	$(AS) $(AFLAGS) $(ASOUT)$@ $< -DPwrLnFrq=60
+
+clock_50hz: clock.asm
+	$(AS) $(AFLAGS) $(ASOUT)$@ $< -DPwrLnFrq=50
+
+mc09clock_50hz: mc09clock.asm
+	$(AS) $(AFLAGS) $(ASOUT)$@ $< -DPwrLnFrq=50
+
+clock2_bnb: clock2_ds1315.asm
+	$(AS) $(AFLAGS) $(ASOUT)$@ $< -DBNB=1
+
+clock2_cloud9: clock2_ds1315.asm
+	$(AS) $(AFLAGS) $(ASOUT)$@ $< -DCLOUD9=1
+
+clean:
+	$(CD) kernel; make $@
+	$(RM) $(ALLOBJS)
+
+showobjs:
+	@$(ECHO) $(ALLOBJS)
+
+showboottrack:
+	@$(ECHO) $(BOOTTRACK)
+
+showkernel:
+	@$(ECHO) $(KERNEL)
+
+showsysmods:
+	@$(ECHO) $(SYSMODS)
+
+showclocks:
+	@$(ECHO) $(CLOCKS)
+
+showrbf:
+	@$(ECHO) $(RBF)
+
+showscf:
+	@$(ECHO) $(SCF)
+
+showpipe:
+	@$(ECHO) $(PIPE)
+
+identify:
+	$(IDENT_SHORT) $(ALLOBJS)
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/port.mak	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,8 @@
+PORT = mc09
+MACHINE = Multicomp09 FPGA-based Computer
+CPU = 6809
+LEVEL = 1
+TELNET_PORT = 6802
+HTTPD_PORT = 8802
+
+include $(NITROS9DIR)/rules.mak
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/scripts/mb.dw	Sat Oct 17 21:21:11 2015 +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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/scripts/mb.floppy	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,29 @@
+-t
+-x
+tmode .1 pau=0
+echo * NitrOS-9 Level 1 Boot Creation Script
+echo *
+echo * This script creates a bootable floppy disk
+echo * using the standard.bl bootlist file.
+echo *
+echo * The resulting disk will boot NitrOS-9 from drive 0.
+echo *
+prompt Insert a blank disk in /d0 and press a key:
+echo *
+echo * Step 1: Format disk in /d0
+format /d0 "NitrOS-9 Level 1 Boot Disk" r
+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_1773_6ms>bttemp
+echo *
+echo * Step 3: Create the bootfile and boot track
+os9gen /d0 -t=bttemp<../BOOTLISTS/standard.bl
+del bttemp
+echo *
+echo * Step 4: Populate the disk with essential files
+copy ../MODULES/SYSMODS/sysgo_dd /d0/sysgo
+makdir /d0/CMDS
+copy -w=/d0/CMDS ../CMDS/shell
+echo *
+echo * We're done
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/startup	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,6 @@
+* Echo welcome message
+echo * Welcome to NitrOS-9 Level 1 on the Multicomp09 *
+* Start system time from keyboard
+setime </term
+date -t
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/startup.dw	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,3 @@
+* Echo welcome message
+echo * Welcome to NitrOS-9 Level 1 with DriveWire 4 on the Multicomp09 *
+date -t
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/sys/makefile	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,38 @@
+include ../port.mak
+
+vpath %.hp	$(LEVEL1)/sys
+
+DEPENDS		= ./makefile
+
+SYSFILES	= ../../sys/errmsg ../../sys/motd ../../sys/password inetd.conf
+HELPFILES	= asm.hp attr.hp backup.hp binex.hp build.hp chd.hp \
+		chx.hp cmp.hp cobbler.hp config.hp copy.hp cputype.hp date.hp \
+		dcheck.hp debug.hp ded.hp deiniz.hp del.hp deldir.hp devs.hp \
+		dir.hp dirsort.hp disasm.hp display.hp dmode.hp dsave.hp dump.hp echo.hp \
+		edit.hp error.hp ex.hp exbin.hp format.hp free.hp gfx.hp \
+		help.hp ident.hp iniz.hp inkey.hp irqs.hp kill.hp link.hp \
+		list.hp load.hp login.hp makdir.hp \
+		mdir.hp megaread.hp merge.hp minted.hp mpi.hp mfree.hp os9gen.hp \
+		padrom.hp park.hp procs.hp prompt.hp pwd.hp pxd.hp \
+	 	rename.hp save.hp setime.hp \
+		setpr.hp shell.hp sleep.hp tee.hp tmode.hp touch.hp tsmon.hp \
+		tuneport.hp unlink.hp verify.hp xmode.hp
+HELPMSG		= helpmsg
+ALLOBJS		= $(SYSFILES) $(HELPMSG)
+
+
+all:	$(ALLOBJS) $(DEPENDS)
+
+inetd.conf:     $(LEVEL1)/sys/inetd.conf
+	@sed -e 's/%TELNET_PORT%/$(TELNET_PORT)/' -e 's/%HTTPD_PORT%/$(HTTPD_PORT)/' $^ > $@
+
+alldragon: $(ALLOBJS)
+
+helpmsg: $(HELPFILES)
+	$(MERGE) $^ > $@
+
+clean:
+	$(RM) $(HELPMSG) inetd.conf
+
+showobjs:
+	@$(ECHO) $(ALLOBJS)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/mc09/wwwroot/Makefile	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,1 @@
+include ../../wwwroot/Makefile
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/modules/mc09clock.asm	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,273 @@
+********************************************************************
+* Clock - NitrOS-9 System Clock
+*
+* $Id$
+*
+* Edt/Rev  YYYY/MM/DD  Modified by
+* Comment
+* ------------------------------------------------------------------
+*          2015/09/09  Neal Crook
+* Created from clock.asm version 9r8. This version for 50Hz timer on
+* multicomp09.
+
+
+* [NAC HACK 2015Sep09] Inherited behaviour: this just stomps into
+* D.IRQ so I assume that nothing could have been there before (ie
+* because it's the "owner" of this vector). If there is an interrupt
+* that is NOT a timer interrupt we jump through D.SvcIRQ, which is
+* the list of other devices that might want to claim the interrupt.
+* At the end of the timer interrupt service routine (ISR) we don't
+* jump through D.SvcIRQ. The assumption is that there is only one
+* interruptor. If that assumption tests false, the interrupt will
+* still be asserted and we'll come straight back into this ISR.
+* The timer ISR checks something and considers dispatching through
+* AltIRQ. What's that all about?
+
+
+         nam   Clock
+         ttl   NitrOS-9 System Clock
+
+         use   defsfile
+
+tylg     set   Systm+Objct
+atrv     set   ReEnt+rev
+rev      set   8
+edition  set   9
+
+*------------------------------------------------------------
+* For a detailed hardware description of the Multicomp09
+* timer, refer to mc09.d
+*
+
+*------------------------------------------------------------
+*
+* Start of module
+*
+         mod   len,name,tylg,atrv,init,0
+
+name     fcs   "Clock"
+         fcb   edition
+
+
+TkPerTS  equ   TkPerSec/10 ticks per time slice
+
+*
+* Table to set up Service Calls
+*
+NewSvc   fcb   F$Time
+         fdb   FTime-*-2
+         fcb   F$VIRQ
+         fdb   FVIRQ-*-2
+         fcb   F$STime
+         fdb   FSTime-*-2
+         fcb   $80        end of service call installation table
+
+
+*------------------------------------------------------------
+*
+* Handle F$STime system call
+*
+* First, copy time packet from user address space to system time
+* variables, then fall through to code to update RTC.
+*
+FSTime   equ   *
+         ldx   R$X,u
+         ldd   ,x
+         std   <D.Year
+         ldd   2,x
+         std   <D.Day
+         ldd   4,x
+         std   <D.Min
+         lda   #TkPerSec  reset to start of second
+         sta   <D.Tick
+         ldx   <D.Clock2  get entry point to Clock2
+         clra             clear carry
+         jmp   $06,x      and call SetTime entry point
+
+*--------------------------------------------------
+*
+* Clock Initialization
+*
+* This vector is called by the kernel to service the first F$STime
+* call.  F$STime is usually called by SysGo (with a dummy argument)
+* in order to initialize the clock.  F$STime is re-vectored to the
+* service code above to handle future F$STime calls.
+*
+*
+
+Clock2   fcs   "Clock2"
+
+init
+         pshs  dp,cc      save DP and CC
+         clra
+         tfr   a,dp       set DP to zero
+         leax  <Clock2,pcr
+         lda   #Sbrtn+Objct
+         os9   F$Link
+         bcc   LinkOk
+         jmp   >$FFFE     level 1: jump to reset vector
+
+LinkOk
+         puls  cc,dp      ; Restore saved dp and cc
+         sty   <D.Clock2  save entry point
+InitCont
+* Do not need to explicitly read RTC during initialization
+         ldd   #59*256+$01 last second and last tick
+         std   <D.Sec     will prompt RTC read at next time slice
+         ldb   #TkPerSec
+         stb   <D.TSec    set ticks per second
+         ldb   #TkPerTS   get ticks per time slice
+         stb   <D.TSlice  set ticks per time slice
+         stb   <D.Slice   set first time slice
+
+         leax  SvcIRQ,pcr set IRQ handler
+         stx   <D.IRQ
+
+         leay  NewSvc,pcr insert syscalls
+         os9   F$SSvc
+
+* Call Clock2 init routine
+         ldy   <D.Clock2  get entry point to Clock2
+         jsr   ,y         call init entry point of Clock2
+
+* Initialize clock hardware
+         lda   #2         enable timer and its interrupt
+         sta   TIMER
+         rts
+
+
+*
+* Clock IRQ Entry Point
+*
+* For Multicomp09, called 50 times/s ie once every 20ms
+SvcIRQ
+         clra
+         tfr   a,dp       set direct page to zero
+
+* The increment sets N depending upon whether the timer interrupted
+         inc   TIMER
+         bmi   TimInt
+         jmp   [>D.SvcIRQ] else service other possible IRQ
+TimInt
+         dec   <D.Tick    decrement tick counter
+         bne   L007F      go around if not zero
+         ldb   <D.Sec     get minutes/seconds
+* Seconds increment
+         incb             increment seconds
+         cmpb  #60        full minute?
+         bcs   L0079      nope...
+*
+* Call GetTime entry point in Clock2
+*
+         ldx   <D.Clock2  get entry point to Clock2
+         jsr   $03,x      call GetTime entry point
+         fcb   $8C        skip next 2 bytes
+L0079    stb   <D.Sec     update sec
+L007B    lda   <D.TSec    get ticks per second value
+         sta   <D.Tick    and repopulate tick decrement counter
+L007F    clra             clear A
+         pshs  a          and save it on the stack
+         ldy   <D.CLTb    get pointer to VIRQ Polling Entries
+         bra   L009E      go to the processing portion of the loop
+L0087    ldd   Vi.Cnt,x   get count down counter
+         subd  #$0001     subtract tick count
+         bne   L009C      branch if not at terminal count ($0000)
+         lda   #$01
+         sta   ,s         set flag on stack to 1
+         lda   Vi.Stat,x  get status byte
+         beq   DelEntry   branch if zero (one shot, so delete)
+L0096    ora   #Vi.IFlag  set interrupted flag
+         sta   Vi.Stat,x  save in packet
+         ldd   Vi.Rst,x   get reset count
+L009C    std   Vi.Cnt,x   save tick count back
+L009E    ldx   ,y++       get two bytes at Y
+         bne   L0087      if not zero, branch
+         lda   ,s+        else get byte off stack
+         beq   GoAltIRQ   branch if zero
+         ldx   <D.Proc    else get pointer to current process descriptor
+         beq   L00AE      branch if none
+         tst   P$State,x  test process state
+         bpl   UsrPoll    branch if system state not set
+L00AE    jsr   [>D.Poll]  poll ISRs
+         bcc   L00AE      keep polling until carry set
+GoAltIRQ
+         jmp   [>D.AltIRQ] jump into an alternate IRQ if available
+DelEntry
+         bsr   DelVIRQ    delete the VIRQ entry
+         bra   L0096
+
+UsrPoll  leay  >up@,pcr   point to routine to execute
+         jmp   [>D.URtoSs] User to System
+up@      jsr   [>D.Poll]  call polling routine
+         bcc   up@        keep polling until carry set
+         ldx   <D.Proc    get current process descriptor
+         ldb   P$State,x  and its state
+         andb  #^SysState turn off sysstate bit
+         stb   P$State,x  save new state
+         ldd   <P$SWI2,x
+         std   <D.SWI2
+         ldd   <D.UsrIRQ
+         std   <D.SvcIRQ
+         bra   GoAltIRQ
+
+DelVIRQ  pshs  y,x        save off Y,X
+dl@      ldx   ,y++       get next entry
+         stx   -$04,y     move up
+         bne   dl@        continue until all are moved
+         puls  y,x        restore
+         leay  -2,y       move back 2 from Y (points to last entry)
+         rts              return
+
+* Install or Remove VIRQ Entry
+FVIRQ    pshs  cc
+         orcc  #IntMasks  mask all interrupts
+         ldy   <D.CLTb    get pointer to VIRQ polling table
+         ldx   <D.Init    get pointer to init module
+         ldb   PollCnt,x  get poll count
+         ldx   R$X,u      get pointer to caller's X
+         beq   L0118      branch if removing
+         tst   ,y         entry available?
+         beq   L010C
+         subb  #$02
+         lslb
+         leay  b,y
+         tst   ,y
+         bne   PTblFul    polling table full
+L0106    tst   ,--y
+         beq   L0106
+         leay  $02,y
+L010C    ldx   R$Y,u
+         stx   ,y
+         ldy   R$D,u
+         sty   ,x
+         bra   L0124
+L0118    leax  R$Y,u      X = caller's Y
+L011A    tst   ,y         end of VIRQ table
+         beq   L0124      branch if so
+         cmpx  ,y++       else compare to current VIRQ entry and inc Y
+         bne   L011A      continue searching if not matched
+         bsr   DelVIRQ    else delete entry
+L0124    puls  cc
+         clrb
+         rts
+PTblFul  puls  cc
+         comb
+         ldb   #E$Poll
+         rts
+
+
+
+* F$Time system call code
+FTime    ldx   R$X,u
+         ldd   <D.Year
+         std   ,x
+         ldd   <D.Day
+         std   2,x
+         ldd   <D.Min
+         std   4,x
+         clrb
+         rts
+
+         emod
+len      equ   *
+         end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/modules/mc09sdc.asm	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,314 @@
+********************************************************************
+* mc09sdc - Multicomp09 SDCC Device Driver
+*
+* $Id$
+*
+* Edt/Rev  YYYY/MM/DD  Modified by
+* Comment
+* ------------------------------------------------------------------
+*          2015/08/31  NAC
+* Created from 1773 driver to support "virtual 720k disk" on SD card.
+*
+
+         nam   mc09sdc
+         ttl   Multicomp09 SDCC Device Driver
+
+         use   defsfile
+
+tylg     set   Drivr+Objct
+atrv     set   ReEnt+rev
+rev      set   $01
+edition  set   1
+
+* Configuration Settings
+N.Drives equ   4              number of drives to support
+
+         mod   eom,name,tylg,atrv,start,size
+
+u0000    rmb   DRVBEG+(DRVMEM*N.Drives)
+
+lsn0cp   rmb   1              Loaded by LdSDAdrs - bytes to copy
+size     equ   .
+
+         fcb   DIR.+SHARE.+PEXEC.+PWRIT.+PREAD.+EXEC.+UPDAT.
+
+name     fcs   /mc09sd/
+         fcb   edition
+
+* [NAC HACK 2015Sep04] probably ought to have timeouts on each of the
+* wait loops.
+
+
+* [NAC HACK 2015Sep04] based on tech ref and rb1773 we're supposed to
+* get the base address from the device data structure and then access all
+* the hw registers relative to that base address. rb1773 does it once and
+* for all other access it uses a define. Tsk.
+* Also, the device data structure doesn't seem to match what's in the
+* tech ref.
+
+*******************************************************************
+* Init
+*
+* Entry:
+*    Y  = address of device descriptor
+*    U  = address of device memory area
+*
+* Exit:
+*    CC = carry set on error
+*    B  = error code
+*
+* Multicomp09 SDCC does not require any initialisation
+* [NAC HACK 2015Sep02] futures: new card detection and re-init when
+* the hardware supports it.
+* BUT the tech ref xplains there's other stuff we need to do.
+Init     equ   *
+
+         ldd   #$FF*256+N.Drives  'invalid' value & # of drives
+         leax  DRVBEG,u       point to start of drive tables
+Init1    sta   ,x             DD.TOT MSB to bogus value
+         sta   <V.TRAK,x      init current track # to bogus value
+         leax  <DRVMEM,x      point to next drive table
+         decb                 done all drives yet?
+         bne   Init1          no, init them all
+
+* unlike rb1773 we do not need a sector buffer (AFAIK) so we're done.
+
+         clrb                 clear carry
+         rts
+
+
+*******************************************************************
+* GetStat
+*
+* Entry:
+*    A  = function code
+*    Y  = address of path descriptor
+*    U  = address of device memory area
+*
+* Exit:
+*    CC = carry set on error
+*    B  = error code
+*
+* There are no get status calls.
+* [NAC HACK 2015Sep02] futures: use it to retrieve SDcard offset of each
+* drive.
+GetStat  clrb                 no GetStt calls - return, no error, ignore
+Return   rts
+
+
+*******************************************************************
+* SetStat
+*
+* Entry:
+*    A  = function code
+*    Y  = address of path descriptor
+*    U  = address of device memory area
+*
+* Exit:
+*    CC = carry set on error
+*    B  = error code
+*
+* There are no set status calls.
+* [NAC HACK 2015Sep02] futures: use it to set SDcard offset of each
+* drive, maybe mark drives as not available.
+SetStat  clrb                 clear carry
+         rts
+
+
+*******************************************************************
+* Term
+*
+* Entry:
+*    U  = address of device memory area
+*
+* Exit:
+*    CC = carry set on error
+*    B  = error code
+*
+* There is no memory allocated so nothing to do here, either. I almost
+* feel bad..
+Term     clrb
+         rts
+
+
+*******************************************************************
+* Jump table for the public routines of this module. 3 bytes per entry,
+* so any bra must be padded with a NOP.
+start    bra   Init
+         nop
+         bra   Read
+         nop
+         bra   Write
+         nop
+         bra   GetStat
+         nop
+         bra   SetStat
+         nop
+         bra   Term
+         nop
+
+*******************************************************************
+* 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
+*
+* The SDcard base block for this disk is at Y+$2D
+*
+Read     bsr   LdSDAdrs       set up address in controller
+         ldx   PD.BUF,y       Get physical sector buffer ptr
+
+* If LSN0 is selected, will need to store the first few bytes
+* both in the destination buffer and in the drive table.
+* Calculate the drive table address in case we need it.
+         lda   PD.DRV,y
+         ldb   #DRVMEM
+         mul
+         leay  DRVBEG,u
+         leay  d,y
+
+* wait for previous command (if any) to complete
+RdBiz    lda   SDCTL
+         cmpa  #$80
+         bne   RdBiz
+
+* issue the read command to the sdcard controller
+         clra
+         sta   SDCTL
+
+* transfer 512 bytes, waiting for each in turn. only want 256
+* of them - discard the rest
+
+         clrb             zero is like 256
+RdDBiz   lda   SDCTL
+         cmpa  #$e0
+         bne   RdDBiz     byte not ready
+         lda   SDDATA     get byte
+         sta   ,x+        store in sector buffer
+
+* do we also need to store it in the drive table?
+         pshs  b          remember the count
+         ldb   lsn0cp,u
+         beq   nocp
+         sta   ,y+        store in drive table
+         dec   lsn0cp,u
+
+nocp     puls  b
+         decb
+         bne   RdDBiz     next
+
+RdDBiz2  lda   SDCTL      b is already zero (like 256)
+         cmpa  #$e0
+         bne   RdDBiz2    byte not ready
+         lda   SDDATA     get byte (but do nothing with it)
+         decb
+         bne   RdDBiz2    next
+
+         clra             carry clear => successful completion
+         rts
+
+
+*******************************************************************
+* 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
+*
+* [NAC HACK 2015Sep04] LdSDArs should take care of selecting the right offset
+* based on the drive that's selected.
+Write
+         bsr   LdSDAdrs       set up address in controller
+         ldx   PD.BUF,y       Get physical sector buffer ptr
+
+* wait for previous command (if any) to complete
+WrBiz    lda   SDCTL
+         cmpa  #$80
+         bne   WrBiz
+
+* issue the write command to the sdcard controller
+         lda   #1
+         sta   SDCTL
+
+* transfer 512 bytes, waiting for each in turn. Only have 256
+* bytes so transfer them twice
+         pshs  x              preserve data source
+         clrb                 zero is like 256
+WrDBiz   lda   SDCTL
+         cmpa  #$a0
+         bne   WrDBiz         space not available
+         lda   ,x+            get byte from buffer
+         sta   SDDATA         store to SD
+         decb
+         bne   WrDBiz         next
+
+         puls  x              restore data source for 2nd copy
+WrDBiz2  lda   SDCTL          b is zero (like 256)
+         cmpa  #$a0
+         bne   WrDBiz2        space not available
+         lda   ,x+            get byte from buffer
+         sta   SDDATA         store to SD
+         decb
+         bne   WrDBiz2        next
+
+         clra                 clear carry => successful completion
+         rts
+
+
+*******************************************************************
+* SET SDLBA2 SDLBA1 SDLBA0 FOR NEXT SD OPERATION
+* 1. The 16-bit value stored at $2D,Y is the upper 16 bits of the
+*    base block address of the disk image on the SDcard
+* 2. If this value is QQQQ, add QQQQ00 to {B,XH,XL} to form the
+*    value inot the hardware registers.
+* 2. Load lsn0cp with the number of bytes to be copied into the
+*    LSN0 buffer - if {B,XH,XL} == 0, this DD.SIZ. Otherwise,
+*    it is 0. Loaded for every operation, only used for Read.
+*
+* Can destroy A, B, X, CC
+*
+* It is a constraint that the disk image is aligned so that the
+* low 8-bits of its offset are 0 (ie, it is on a 256*512 byte
+* boundary). Therefore, the incoming XL value needs no manipulation
+*
+* [NAC HACK 2015Sep04] hack! the hardware addresses should be
+* offsets from the base address stored in the device's data structure.
+LdSDAdrs clr   lsn0cp,u       default: copy nothing
+         pshs  b
+
+         pshs  x              copy of X to pull off byte by byte
+         addb  ,s+            form b+xl
+         adcb  ,s+            form b+xl+xh
+         bne   notlsn0        it is not LSN0. We're done.
+         ldb   #DD.SIZ
+         stb   lsn0cp,u       it is LSN0, need to copy this many bytes
+
+notlsn0  tfr   x,d
+         stb   SDLBA0         ls byte is done.
+
+         ldb   $2D,y          bits 23:16 of drive base
+
+         adda  $2E,y          add bits 15:8 of drive base
+         sta   SDLBA1         middle byte is done
+
+         adcb  #$00           add carry from middle byte
+         addb  ,s+            add and drop stacked b
+         stb   SDLBA2
+         rts
+
+         emod
+eom      equ   *
+         end
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/level1/modules/mc09sdcdesc.asm	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,92 @@
+********************************************************************
+* mc09sdcdesc - Multicomp09 SDCC Device Descriptor Template
+*
+* $Id$
+*
+* Edt/Rev  YYYY/MM/DD  Modified by
+* Comment
+* ------------------------------------------------------------------
+*          2015/08/31  ncrook
+* Created from 1773 descriptor template
+
+         nam   mc09sddesc
+         ttl   Multicomp09 SDCC Device Descriptor Template
+
+         use   defsfile
+
+tylg     set   Devic+Objct
+atrv     set   ReEnt+rev
+rev      set   $00
+
+* [NAC HACK 2015Sep04] this data structure is described in the TechRef so
+* I assume it is Required. The DNum/Type are swapped in the TechRef (Type
+* is first) Error here or there?
+         IFNDEF DNum
+DNum     set   0
+         ENDC
+* [NAC HACK 2015Sep02] not sure whether the fact I'm emulating a floppy means
+* that I need all this stuff, eg for interacting with LSN0? Reconsider later
+* and maybe strip it all out
+         IFNE  D35
+Type     set   TYP.CCF+TYP.3
+         ELSE
+Type     set   TYP.CCF+TYP.5
+         ENDC
+         IFNDEF Density
+Density  set   DNS.MFM
+         ENDC
+Step     set   STP.6ms
+         IFNDEF Cyls
+Cyls     set   35
+         ENDC
+         IFNDEF Sides
+Sides    set   1
+         ENDC
+Verify   set   1
+         IFNDEF SectTrk
+SectTrk  set   18
+         ENDC
+         IFNDEF SectTrk0
+SectTrk0 set   18
+         ENDC
+         IFNDEF Interlv
+Interlv  set   3
+         ENDC
+         IFNDEF SAS
+SAS      set   8
+         ENDC
+
+         mod   eom,name,tylg,atrv,mgrnam,drvnam
+
+         fcb   DIR.!SHARE.!PEXEC.!PWRIT.!PREAD.!EXEC.!UPDAT. mode byte
+         fcb   HW.Page    extended controller address
+         fdb   $FFD8      physical controller (base) address
+         fcb   initsize-*-1 initialization table size
+         fcb   DT.RBF     device type:0=scf,1=rbf,2=pipe,3=scf
+         fcb   DNum       drive number
+         fcb   Step       step rate
+         fcb   Type       drive device type
+         fcb   Density    media density:0=single,1=double
+         fdb   Cyls       number of cylinders (tracks)
+         fcb   Sides      number of sides
+         fcb   Verify     verify disk writes:0=on
+         fdb   SectTrk    # of sectors per track
+         fdb   SectTrk0   # of sectors per track (track 0)
+         fdb   OFFSET     high 16 bits of 24-bit block address on
+*                         SDcard where this disk image starts.
+**nac removed but (for now) keep the entry the same size
+**nac         fcb   Interlv    sector interleave factor
+**nac         fcb   SAS        minimum size of sector allocation
+initsize equ   *
+
+         IFNE  DD
+name     fcs   /DD/
+         ELSE
+name     fcb   'D,'0+DNum+$80
+         ENDC
+mgrnam   fcs   /RBF/
+drvnam   fcs   /mc09sd/
+
+         emod
+eom      equ   *
+         end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/mc09.as	Sat Oct 17 21:21:11 2015 +0100
@@ -0,0 +1,8 @@
+               use       sys6809l1.as
+
+               section   _constant
+
+               use       ../defs/mc09.d
+               use       ../defs/mc09vtio.d
+
+               endsect