diff --git a/bbb/Makefile b/bbb/Makefile
index d2381c2..3152d0f 100644
--- a/bbb/Makefile
+++ b/bbb/Makefile
@@ -2,7 +2,13 @@
 CAFLAGS = --target apple2enh --list-bytes 0
 LDFLAGS = --config apple2-asm.cfg
 
-TARGETS = bye.system.SYS buhbye.system.SYS
+OUTDIR = out
+
+HEADERS = $(wildcard *.inc) $(wildcard ../inc/*.inc)
+
+TARGETS = \
+	$(OUTDIR)/bye.system.SYS \
+	$(OUTDIR)/buhbye.system.SYS
 
 # For timestamps
 MM = $(shell date "+%-m")
@@ -11,17 +17,19 @@ YY = $(shell date "+%-y")
 DEFINES = -D DD=$(DD) -D MM=$(MM) -D YY=$(YY)
 
 .PHONY: clean all
-all: $(TARGETS)
+all: $(OUTDIR) $(TARGETS)
 
-HEADERS = $(wildcard *.inc) $(wildcard ../inc/*.inc)
+$(OUTDIR):
+	mkdir -p $(OUTDIR)
 
 clean:
-	rm -f *.o
-	rm -f $(TARGETS)
+	rm -f $(OUTDIR)/*.o
+	rm -f $(OUTDIR)/*.list
+	rm -f $(OUTDIR)/$(TARGETS)
 
-%.o: %.s $(HEADERS)
+$(OUTDIR)/%.o: %.s $(HEADERS)
 	ca65 $(CAFLAGS) $(DEFINES) --listing $(basename $@).list -o $@ $<
 
-%.SYS: %.o
+$(OUTDIR)/%.SYS: $(OUTDIR)/%.o
 	ld65 $(LDFLAGS) -o $@ $<
 	xattr -wx prodos.AuxType '00 20' $@
diff --git a/bbb/buhbye.system.s b/bbb/buhbye.system.s
index 71cbb16..87e2a4c 100644
--- a/bbb/buhbye.system.s
+++ b/bbb/buhbye.system.s
@@ -15,37 +15,7 @@
         .include "../inc/apple2.inc"
         .include "../inc/macros.inc"
         .include "../inc/prodos.inc"
-
-;;; Miscellaneous
-
-COL80HPOS       := $57B
-
-;;; I/O Soft Switches / Firmware
-
-ROMINNW         := $C082        ; Read ROM; no write
-ROMINWB1        := $C089        ; Read ROM; write RAM bank 1
-
-SLOT3           := $C300
-
-;;; Monitor
-
-SETTXT          := $FB39
-TABV            := $FB5B
-SETPWRC         := $FB6F
-BELL1           := $FBDD
-SETINV          := $FE80
-
-;;; ASCII/Key codes
-ASCII_TAB       := $9
-ASCII_DOWN      := $A           ; down arrow
-ASCII_UP        := $B           ; up arrow
-ASCII_CR        := $D
-ASCII_RIGHT     := $15          ; right arrow
-ASCII_SYN       := $16          ; scroll text window up
-ASCII_ETB       := $17          ; scroll text window down
-ASCII_EM        := $19          ; move cursor to upper left
-ASCII_ESCAPE    := $1B
-
+        .include "../inc/ascii.inc"
 
 ;;; ************************************************************
         .include "../inc/driver_preamble.inc"
@@ -75,7 +45,7 @@ ASCII_ESCAPE    := $1B
         src_ptr := $19
         dst_ptr := $1B
 
-        sta     ALTZPOFF
+        sta     ALTZPOFF        ; TODO: Necessary?
         lda     ROMIN           ; write bank 2
         lda     ROMIN
 
@@ -107,7 +77,7 @@ loop:   lda     (src_ptr)       ; *src_ptr = *dst_ptr
         cmp     #<end
         bne     loop
 
-        sta     ALTZPOFF
+        sta     ALTZPOFF        ; TODO: Necessary?
         sta     ROMINWB1
         sta     ROMINWB1
 
@@ -158,7 +128,6 @@ loop:   lda     (src_ptr)       ; *src_ptr = *dst_ptr
 ;;; ------------------------------------------------------------
 
         cld                     ; ProDOS protocol for QUIT routine
-        lda     ROMINNW         ; Page in ROM for reads, writes ignored
 
         lda     #$A0
         jsr     SLOT3           ; Activate 80-Column Firmware
diff --git a/bbb/bye.system.s b/bbb/bye.system.s
index 93e18db..62d18d8 100644
--- a/bbb/bye.system.s
+++ b/bbb/bye.system.s
@@ -2,64 +2,16 @@
 
         .setcpu "65C02"
         .include "apple2.inc"
-        .include "prodos.inc"
+        .include "apple2.mac"
 
-;;; Miscellaneous
-
-RESETVEC        := $3F2
-
-COL80HPOS       := $57B
-
-;;; I/O Soft Switches / Firmware
-
-RAMRDOFF        := $C002        ; If 80STORE Off: Read Main Mem $0200-$BFFF
-RAMRDON         := $C003        ; If 80STORE Off: Read Aux Mem $0200-$BFFF
-RAMWRTOFF       := $C004        ; If 80STORE Off: Write Main Mem $0200-$BFFF
-RAMWRTON        := $C005        ; If 80STORE Off: Write Aux Mem $0200-$BFFF
-ALTZPOFF        := $C008        ; Main Stack and Zero Page
-ALTZPON         := $C009        ; Aux Stack and Zero Page
-ROMINNW         := $C082        ; Read ROM; no write
-ROMINWB1        := $C089        ; Read ROM; write RAM bank 1
-
-SLOT3           := $C300
-
-;;; Monitor
-
-SETTXT          := $FB39
-TABV            := $FB5B
-SETPWRC         := $FB6F
-BELL1           := $FBDD
-HOME            := $FC58
-COUT            := $FDED
-SETINV          := $FE80
-SETNORM         := $FE84
-
-;;; ASCII/Key codes
-ASCII_TAB       := $9
-ASCII_DOWN      := $A           ; down arrow
-ASCII_UP        := $B           ; up arrow
-ASCII_CR        := $D
-ASCII_RIGHT     := $15          ; right arrow
-ASCII_SYN       := $16          ; scroll text window up
-ASCII_ETB       := $17          ; scroll text window down
-ASCII_EM        := $19          ; move cursor to upper left
-ASCII_ESCAPE    := $1B
+        .include "../inc/apple2.inc"
+        .include "../inc/prodos.inc"
+        .include "../inc/ascii.inc"
 
 ;;; ------------------------------------------------------------
 
 .define HI(char)        (char|$80)
 
-.macro  HIASCII arg
-        .repeat .strlen(arg), i
-        .byte   .strat(arg, i) | $80
-        .endrep
-.endmacro
-
-.macro  HIASCIIZ arg
-        HIASCII arg
-        .byte   0
-.endmacro
-
 
 ;;; ------------------------------------------------------------
 
@@ -121,7 +73,7 @@ ASCII_ESCAPE    := $1B
 ;;; ------------------------------------------------------------
 
         cld                     ; ProDOS protocol for QUIT routine
-        lda     ROMINNW         ; Page in ROM for reads, writes ignored
+        lda     ROMIN2          ; Page in ROM for reads, writes ignored
 
         ;; Point reset vector at this routine
         stz     RESETVEC
@@ -197,7 +149,7 @@ check_device:
         lda     open_params_ref_num
         sta     read_params_ref_num
         sta     mark_ref_num
-        lda     #DirectoryHeader::size
+        lda     #.sizeof(SubdirectoryHeader)
         sta     read_params_request
         stz     read_params_request+1
         jsr     do_read
@@ -205,7 +157,7 @@ check_device:
 
         ;; Store entry_length/entries_per_block/file_count
         ldx     #3
-:       lda     read_buffer + DirectoryHeader::entry_length,x
+:       lda     read_buffer + SubdirectoryHeader::entry_length,x
         sta     entry_length,x
         dex
         bpl     :-
@@ -256,7 +208,7 @@ carry:  inc     mark_position+1
         bcs     finish_read2
 
         inc     entry_num
-        lda     read_buffer + FileEntry::storage_type
+        lda     read_buffer + FileEntry::storage_type_name_length
         and     #$F0            ; mask off storage_type
         beq     floop           ; inactive file entry
         dec     file_count
@@ -269,9 +221,9 @@ carry:  inc     mark_position+1
 
         ;; Check file type
         lda     read_buffer + FileEntry::file_type
-        cmp     #FileType::Directory
+        cmp     #FT_DIRECTORY
         beq     :+
-        cmp     #FileType::System
+        cmp     #FT_SYSTEM
         bne     next_file_entry
 
         ;; Check to see if we have room
@@ -603,7 +555,8 @@ cout:   jmp     COUT
 
         string_start := *
 .proc help_string
-        HIASCIIZ "RETURN: Select | TAB: Chg Vol | ESC: Back"
+        scrcode "RETURN: Select | TAB: Chg Vol | ESC: Back"
+        .byte   0
 .endproc
 
         ;; Mousetext sequence: Enable, folder left, folder right, disable
@@ -714,7 +667,7 @@ loop:   lda     (src_ptr)
         lda     src_ptr
         cmp     #<end
         bne     loop
-        lda     (src_ptr)       ; WTF??
+        lda     (src_ptr)
         sta     (dst_ptr)
         sta     ALTZPOFF
         sta     ROMINWB1
diff --git a/bbb/prodos.inc b/bbb/prodos.inc
deleted file mode 100644
index 49b4344..0000000
--- a/bbb/prodos.inc
+++ /dev/null
@@ -1,102 +0,0 @@
-;;; ------------------------------------------------------------
-;;; ProDOS MLI
-;;; ------------------------------------------------------------
-
-;;; ------------------------------------------------------------
-;;; ProDOS Global Page
-
-MLI             := $BF00        ; Entry point
-DEVNUM          := $BF30        ; Most recent accessed device
-DEVCNT          := $BF31        ; Number of on-line devices minus 1
-DEVLST          := $BF32        ; Up to 14 units
-BITMAP          := $BF58
-BITMAP_SIZE     := $18          ; Bits for pages $00 to $BF
-DATELO          := $BF90        ; Date lo
-DATEHI          := $BF91        ; Date hi
-TIMELO          := $BF92        ; Time lo
-TIMEHI          := $BF93        ; Time hi
-
-
-;;; ------------------------------------------------------------
-;;; MLI Calls
-
-;;; Housekeeping Calls
-CREATE          := $C0
-DESTROY         := $C1
-RENAME          := $C2
-SET_FILE_INFO   := $C3
-GET_FILE_INFO   := $C4
-ON_LINE         := $C5
-SET_PREFIX      := $C6
-GET_PREFIX      := $C7
-
-;;; Filing Calls
-OPEN            := $C8
-NEWLINE         := $C9
-READ            := $CA
-WRITE           := $CB
-CLOSE           := $CC
-FLUSH           := $CD
-SET_MARK        := $CE
-GET_MARK        := $CF
-SET_EOF         := $D0
-GET_EOF         := $D1
-SET_BUF         := $D2
-GET_BUF         := $D3
-
-;;; System Calls
-GET_TIME        := $82
-ALLOC_INTERRUPT := $40
-DEALLOC_INTERRUPT       := $41
-QUIT            := $65
-
-;;; Direct Disk Access Commands
-READ_BLOCK      := $80
-WRITE_BLOCK     := $71
-
-;;; ------------------------------------------------------------
-;;; File Types
-
-FT_TYPELESS     := $00
-FT_BAD          := $01
-FT_TEXT         := $04
-FT_BINARY       := $06
-FT_DIRECTORY    := $0F
-FT_SRC          := $B0  ; IIgs system type; re-used?
-FT_BASIC        := $FC
-FT_SYSTEM       := $FF
-
-
-;;; ------------------------------------------------------------
-;;; Macros
-
-.macro  MLI_CALL    op, addr
-        jsr MLI
-        .byte op
-        .addr addr
-.endmacro
-
-
-;;; ------------------------------------------------------------
-;;; Structures
-
-.scope DirectoryHeader
-        entry_length    := $23
-        entries_per_block := $24
-        file_count      := $25
-
-        size := $2B
-.endscope
-
-.scope FileEntry
-        storage_type    := $00     ; high nibble
-        name_length     := $00     ; low nibble
-        file_name       := $01
-        file_type       := $10
-        access          := $1E
-.endscope
-
-.scope FileType
-        Directory := $0F
-        System    := $FF
-.endscope
diff --git a/cricket/cricket.system.s b/cricket/cricket.system.s
index c0cd1ab..79b49c8 100644
--- a/cricket/cricket.system.s
+++ b/cricket/cricket.system.s
@@ -17,6 +17,7 @@
         .include "../inc/apple2.inc"
         .include "../inc/macros.inc"
         .include "../inc/prodos.inc"
+        .include "../inc/ascii.inc"
 
 ;;; ************************************************************
         .include "../inc/driver_preamble.inc"
@@ -97,7 +98,7 @@ init_ssc:
 
 :       jsr     readbyte
         bcs     cricket_not_found ; timeout
-        cmp     #HI($0D)          ; = CR ?
+        cmp     #HI(ASCII_CR)
         beq     cricket_found
 digit:  cmp     #HI('0')          ; < '0' ?
         bcc     cricket_not_found
diff --git a/cricket/set.date.s b/cricket/set.date.s
index f302931..2aedb6b 100644
--- a/cricket/set.date.s
+++ b/cricket/set.date.s
@@ -10,6 +10,7 @@
 
         .include "../inc/apple2.inc"
         .include "../inc/macros.inc"
+        .include "../inc/ascii.inc"
 
         .org $2000
 
@@ -39,7 +40,7 @@
 loop:   lda     INPUT_BUFFER,x
         jsr     sendbyte
         inx
-        cmp     #HI($0D)        ; = CR
+        cmp     #HI(ASCII_CR)
         bne     loop
 
         rts
diff --git a/cricket/set.time.s b/cricket/set.time.s
index c416874..8d816f4 100644
--- a/cricket/set.time.s
+++ b/cricket/set.time.s
@@ -10,6 +10,7 @@
 
         .include "../inc/apple2.inc"
         .include "../inc/macros.inc"
+        .include "../inc/ascii.inc"
 
         .org $2000
 
@@ -39,7 +40,7 @@
 loop:   lda     INPUT_BUFFER,x
         jsr     sendbyte
         inx
-        cmp     #HI($0D)        ; = CR
+        cmp     #HI(ASCII_CR)
         bne     loop
 
         rts
diff --git a/cricket/test.s b/cricket/test.s
index d7fc712..5ef9fad 100644
--- a/cricket/test.s
+++ b/cricket/test.s
@@ -13,6 +13,7 @@
 
         .include "../inc/apple2.inc"
         .include "../inc/macros.inc"
+        .include "../inc/ascii.inc"
 
         .org $2000
 
@@ -84,7 +85,7 @@ init_ssc:
 
 :       jsr     readbyte
         bcs     cricket_not_found ; timeout
-        cmp     #HI($0D)          ; = CR ?
+        cmp     #HI(ASCII_CR)
         beq     cricket_found
 digit:  cmp     #HI('0')          ; < '0' ?
         bcc     cricket_not_found
diff --git a/inc/apple2.inc b/inc/apple2.inc
index a66c24e..8225237 100644
--- a/inc/apple2.inc
+++ b/inc/apple2.inc
@@ -8,6 +8,8 @@
 ;;; Soft Switches
 ;;; ============================================================
 
+;;; I/O Soft Switches / Firmware
+
 RAMRDOFF        := $C002
 RAMRDON         := $C003
 RAMWRTOFF       := $C004
@@ -24,6 +26,7 @@ RDPAGE2         := $C01C
 BANKSEL         := $C073        ; Select RamWorks bank
 
 ROMIN2          := $C082        ; Read ROM; no write
+ROMINWB1        := $C089        ; Read ROM; write RAM bank 1
 RWRAM1          := $C08B        ; Read/write RAM bank 1
 
 ;;; ============================================================
@@ -36,19 +39,36 @@ STATUS   := $C089 + $20         ; ACIA Status/Reset Register
 COMMAND  := $C08A + $20         ; ACIA Command Register (read/write)
 CONTROL  := $C08B + $20         ; ACIA Control Register (read/write)
 
+;;; ============================================================
+;;; Other Slots
+;;; ============================================================
+
+SLOT3           := $C300
+
 ;;; ============================================================
 ;;; Monitor ROM routines
 ;;; ============================================================
 
 INIT            := $FB2F
+SETTXT          := $FB39
+TABV            := $FB5B
+SETPWRC         := $FB6F
+BELL1           := $FBDD
 HOME            := $FC58
 GETLN           := $FD6A        ; with prompt character
 GETLN2          := $FD6F        ; no prompt character
 CROUT           := $FD8E
 PRBYTE          := $FDDA
 COUT            := $FDED
+SETINV          := $FE80
 SETNORM         := $FE84
 SETKBD          := $FE89
 SETVID          := $FE93
 
+;;; ============================================================
+;;; Well-known RAM locations
+;;; ============================================================
+
 INPUT_BUFFER    := $200
+RESETVEC        := $3F2
+COL80HPOS       := $57B
diff --git a/inc/ascii.inc b/inc/ascii.inc
new file mode 100644
index 0000000..38e90a8
--- /dev/null
+++ b/inc/ascii.inc
@@ -0,0 +1,13 @@
+;;; ============================================================
+;;; ASCII Code Points (also used as key codes)
+;;; ============================================================
+
+ASCII_TAB       := $09          ; tab
+ASCII_DOWN      := $0A          ; down arrow
+ASCII_UP        := $0B          ; up arrow
+ASCII_CR        := $0D          ; carriage return
+ASCII_RIGHT     := $15          ; right arrow
+ASCII_SYN       := $16          ; scroll text window up
+ASCII_ETB       := $17          ; scroll text window down
+ASCII_EM        := $19          ; move cursor to upper left
+ASCII_ESCAPE    := $1B          ; escape
diff --git a/inc/driver_preamble.inc b/inc/driver_preamble.inc
index 88ff901..42081b9 100644
--- a/inc/driver_preamble.inc
+++ b/inc/driver_preamble.inc
@@ -117,11 +117,11 @@ self_name:      .res    16
 
         ;; Update reset vector - ProDOS QUIT
         lda     #<quit
-        sta     $03F2
+        sta     RESETVEC
         lda     #>quit
-        sta     $03F3
+        sta     RESETVEC+1
         eor     #$A5
-        sta     $03F4
+        sta     RESETVEC+2
 
         ;; Quit 80-column firmware
         lda     #$95            ; Ctrl+U (quit 80 col firmware)
@@ -130,10 +130,11 @@ self_name:      .res    16
         ;; Reset I/O
         sta     CLR80VID
         sta     CLRALTCHAR
-        jsr     SETVID
-        jsr     SETKBD
+        sta     CLR80COL
         jsr     SETNORM
         jsr     INIT
+        jsr     SETVID
+        jsr     SETKBD
         jsr     HOME
 
         ;; Update System Bit Map
diff --git a/quit/Makefile b/quit/Makefile
index 484dac9..e3aa4db 100644
--- a/quit/Makefile
+++ b/quit/Makefile
@@ -2,7 +2,12 @@
 CAFLAGS = --target apple2enh --list-bytes 0
 LDFLAGS = --config apple2-asm.cfg
 
-TARGETS = quit.system.SYS
+OUTDIR = out
+
+HEADERS = $(wildcard *.inc) $(wildcard ../inc/*.inc)
+
+TARGETS = \
+	$(OUTDIR)/quit.system.SYS
 
 # For timestamps
 MM = $(shell date "+%-m")
@@ -11,17 +16,19 @@ YY = $(shell date "+%-y")
 DEFINES = -D DD=$(DD) -D MM=$(MM) -D YY=$(YY)
 
 .PHONY: clean all
-all: $(TARGETS)
+all: $(OUTDIR) $(TARGETS)
 
-HEADERS = $(wildcard *.inc) $(wildcard ../inc/*.inc)
+$(OUTDIR):
+	mkdir -p $(OUTDIR)
 
 clean:
-	rm -f *.o
-	rm -f $(TARGETS)
+	rm -f $(OUTDIR)/*.o
+	rm -f $(OUTDIR)/*.list
+	rm -f $(OUTDIR)/$(TARGETS)
 
-%.o: %.s $(HEADERS)
+$(OUTDIR)/%.o: %.s $(HEADERS)
 	ca65 $(CAFLAGS) $(DEFINES) --listing $(basename $@).list -o $@ $<
 
-%.SYS: %.o
+$(OUTDIR)/%.SYS: $(OUTDIR)/%.o
 	ld65 $(LDFLAGS) -o $@ $<
 	xattr -wx prodos.AuxType '00 20' $@
diff --git a/ram.drv/Makefile b/ram.drv/Makefile
index 19be6ba..74f22b8 100644
--- a/ram.drv/Makefile
+++ b/ram.drv/Makefile
@@ -6,7 +6,8 @@ OUTDIR = out
 
 HEADERS = $(wildcard *.inc) $(wildcard ../inc/*.inc)
 
-TARGETS = $(OUTDIR)/ram.drv.system.SYS
+TARGETS = \
+	$(OUTDIR)/ram.drv.system.SYS
 
 # For timestamps
 MM = $(shell date "+%-m")
@@ -23,12 +24,11 @@ $(OUTDIR):
 clean:
 	rm -f $(OUTDIR)/*.o
 	rm -f $(OUTDIR)/*.list
-	rm -f $(TARGETS)
+	rm -f $(OUTDIR)/$(TARGETS)
 
 $(OUTDIR)/%.o: %.s $(HEADERS)
 	ca65 $(CAFLAGS) $(DEFINES) --listing $(basename $@).list -o $@ $<
 
-# System Files .SYS
 $(OUTDIR)/%.SYS: $(OUTDIR)/%.o
-	ld65 $(LDFLAGS) -o '$@' $<
+	ld65 $(LDFLAGS) -o $@ $<
 	xattr -wx prodos.AuxType '00 20' $@