diff --git a/libsrc/atmos/capslock.s b/libsrc/atmos/capslock.s
new file mode 100644
index 000000000..0ed6e70da
--- /dev/null
+++ b/libsrc/atmos/capslock.s
@@ -0,0 +1,49 @@
+;
+; When Oric computers are in BASIC's command mode, the keyboard is in CAPS lock
+; mode (because Oric BASIC keywords must be typed in upper-case).  This
+; constructor disables that mode, so that text will be typed as lower-case
+; (which is the default on other cc65 platforms).
+; This module is linked by the conio and POSIX input functions.
+;
+; 2014-09-04, Greg King
+;
+
+        .constructor    disable_caps
+        .destructor     restore_caps
+
+        .include        "atmos.inc"
+
+
+;--------------------------------------------------------------------------
+; Put this constructor into a segment that can be re-used by programs.
+;
+.segment        "INIT"
+
+; Turn the capitals lock off.
+
+disable_caps:
+        lda     CAPSLOCK
+        sta     capsave
+        lda     #$7F
+        sta     CAPSLOCK
+        rts
+
+
+;--------------------------------------------------------------------------
+
+.code
+
+; Restore the old capitals-lock state.
+
+restore_caps:
+        lda     capsave
+        sta     CAPSLOCK
+        rts
+
+
+;--------------------------------------------------------------------------
+
+.bss
+
+capsave:
+        .res    1
diff --git a/libsrc/atmos/cgetc.s b/libsrc/atmos/cgetc.s
index e13d143d2..e4ea15ac6 100644
--- a/libsrc/atmos/cgetc.s
+++ b/libsrc/atmos/cgetc.s
@@ -1,13 +1,15 @@
 ;
 ; 2003-04-13, Ullrich von Bassewitz
-; 2013-07-26, Greg King
+; 2014-09-04, Greg King
 ;
 ; char cgetc (void);
 ;
 
         .export         _cgetc
         .constructor    initcgetc
+
         .import         cursor
+        .forceimport    disable_caps
 
         .include        "atmos.inc"
 
@@ -22,11 +24,11 @@
 
 ; No character, enable cursor and wait
 
-        lda     cursor          ; Cursor currently off?
+        lda     cursor          ; Should cursor be off?
         beq     @L1             ; Skip if so
-        lda     STATUS
-        ora     #%00000001      ; Cursor ON
-        sta     STATUS
+        lsr     STATUS
+        sec                     ; Cursor ON
+        rol     STATUS
 @L1:    lda     KEYBUF
         bpl     @L1
 
@@ -34,17 +36,17 @@
 
         ldx     cursor
         beq     @L2
-        ldx     #$00            ; Zero high byte
         dec     STATUS          ; Clear bit zero
 
-; We have the character, clear avail flag
+; We have the character, clear the "available" flag
 
 @L2:    and     #$7F            ; Mask out avail flag
         sta     KEYBUF
+        ldx     #>$0000
         ldy     MODEKEY
         cpy     #FUNCTKEY
         bne     @L3
-        ora     #$80            ; FUNCT pressed
+        ora     #$80            ; FUNCT-key pressed
 
 ; Done
 
@@ -53,16 +55,12 @@
 .endproc
 
 ; ------------------------------------------------------------------------
-; Switch the cursor off, disable capslock. Code goes into the INIT segment
+; Switch the cursor off. Code goes into the INIT segment
 ; which may be reused after it is run.
 
 .segment        "INIT"
 
 initcgetc:
-        lda     STATUS
-        and     #%11111110
-        sta     STATUS
-        lda     #$7F
-        sta     CAPSLOCK
+        lsr     STATUS
+        asl     STATUS          ; Clear bit zero
         rts
-
diff --git a/libsrc/atmos/crt0.s b/libsrc/atmos/crt0.s
index 1588cbec0..1d919f348 100644
--- a/libsrc/atmos/crt0.s
+++ b/libsrc/atmos/crt0.s
@@ -2,6 +2,7 @@
 ; Startup code for cc65 (Oric version)
 ;
 ; By Debrune J�r�me <jede@oric.org> and Ullrich von Bassewitz <uz@cc65.org>
+; 2014-08-22, Greg King
 ;
 
         .export         _exit
@@ -39,26 +40,26 @@
 
 .segment        "STARTUP"
 
-; Save the zero page area we're about to use
+; Save the zero-page area that we're about to use.
 
         ldx     #zpspace-1
 L1:     lda     sp,x
-        sta     zpsave,x        ; Save the zero page locations we need
+        sta     zpsave,x
         dex
         bpl     L1
 
-; Clear the BSS data
+; Clear the BSS data.
 
         jsr     zerobss
 
-; Unprotect columns 0 and 1
+; Unprotect screen columns 0 and 1.
 
         lda     STATUS
         sta     stsave
         and     #%11011111
         sta     STATUS
 
-; Save system stuff and setup the stack
+; Save some system stuff; and, set up the stack.
 
         tsx
         stx     spsave          ; Save system stk ptr
@@ -68,26 +69,26 @@ L1:     lda     sp,x
         lda     #>(__RAM_START__ + __RAM_SIZE__ + __STACKSIZE__)
         sta     sp+1            ; Set argument stack ptr
 
-; Call module constructors
+; Call the module constructors.
 
         jsr     initlib
 
-; Push arguments and call main()
+; Push the command-line arguments; and, call main().
 
         jsr     callmain
 
-; Call module destructors. This is also the _exit entry.
+; Call the module destructors. This is also the exit() entry.
 
 _exit:  jsr     donelib         ; Run module destructors
 
-; Restore system stuff
+; Restore the system stuff.
 
         ldx     spsave
         txs
         lda     stsave
         sta     STATUS
 
-; Copy back the zero page stuff
+; Copy back the zero-page stuff.
 
         ldx     #zpspace-1
 L2:     lda     zpsave,x
@@ -95,7 +96,7 @@ L2:     lda     zpsave,x
         dex
         bpl     L2
 
-; Back to BASIC
+; Back to BASIC.
 
         rts
 
diff --git a/libsrc/atmos/read.s b/libsrc/atmos/read.s
index 443808fa8..324ac789e 100644
--- a/libsrc/atmos/read.s
+++ b/libsrc/atmos/read.s
@@ -1,5 +1,5 @@
 ;
-; 2013-12-24, Greg King
+; 2014-08-22, Greg King
 ;
 ; int read (int fd, void* buf, unsigned count);
 ;
@@ -11,6 +11,7 @@
 
         .import         popax
         .importzp       ptr1, ptr2, ptr3
+        .forceimport    disable_caps
 
         .macpack        generic
         .include        "atmos.inc"