]> git.sur5r.net Git - cc65/commitdiff
Added support for switching between 40/80 columns. As the Apple //e 80 column firmwar...
authorol.sc <ol.sc@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 10 Sep 2009 09:04:05 +0000 (09:04 +0000)
committerol.sc <ol.sc@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 10 Sep 2009 09:04:05 +0000 (09:04 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@4140 b7a2c559-68d2-44c3-8de9-860c34a00d81

doc/funcref.sgml
include/apple2enh.h
libsrc/apple2/videomode.s [new file with mode: 0644]
libsrc/apple2enh/Makefile

index 294265c78ec934c8b7f93b920ccb3a0b033920de..bc49e0828d868790d40218ff18a352236ec003cf 100644 (file)
@@ -77,6 +77,7 @@ function.
 <item>_textframe
 <item>_textframexy
 <item><ref id="get_ostype" name="get_ostype">
+<item><ref id="videomode" name="videomode">
 </itemize>
 
 
@@ -5031,19 +5032,20 @@ used in presence of a prototype.
 <quote>
 <descrip>
 <tag/Function/Switch to either 40 or 80 column mode.
-<tag/Header/<tt/<ref id="c128.h" name="c128.h">/
+<tag/Header/<tt/<ref id="apple2enh.h" name="apple2enh.h">,
+<ref id="c128.h" name="c128.h">/
 <tag/Declaration/<tt/unsigned __fastcall__ videomode (unsigned Mode);/
 <tag/Description/Switch to 40 or 80 column mode depending on the argument. If
 the requested mode is already active, nothing happens. The old mode is returned
 from the call.
 <tag/Limits/<itemize>
-<item>The function is specific to the C128.
-<item>This function is replaces <ref id="toggle_videomode"
+<item>The function is specific to the C128 and enhanced Apple //e.
+<item>This function replaces <ref id="toggle_videomode"
 name="toggle_videomode">.
 <item>The function is only available as fastcall function, so it may only be
 used in presence of a prototype.
 </itemize>
-<tag/Availability/C128
+<tag/Availability/C128 and enhanced Apple //e
 <tag/See also/
 <ref id="fast" name="fast">,
 <ref id="slow" name="slow">,
index 5185fd6938b1608c96211aa452526afa6a648840..39aefdd9ffc895934a91bb3b956dbfaa5cbe3163 100644 (file)
 #define _TEXTFRAME_WIDE        0x00
 #define _TEXTFRAME_TALL        0x04
 
+/* Video modes */
+#define VIDEOMODE_40x24 0x0011
+#define VIDEOMODE_80x24 0x0012
+#define VIDEOMODE_40COL VIDEOMODE_40x24
+#define VIDEOMODE_80COL VIDEOMODE_80x24
+
 
 
 /*****************************************************************************/
@@ -87,7 +93,7 @@
 void __fastcall__ _textframe (unsigned char width, unsigned char height,
                              unsigned char style);
 /* Output a frame on the text screen with the given width and height
- * starting at the current cursor position and using the given style
+ * starting at the current cursor position and using the given style.
  */
 
 void __fastcall__ _textframexy (unsigned char x, unsigned char y,
@@ -95,6 +101,11 @@ void __fastcall__ _textframexy (unsigned char x, unsigned char y,
                                unsigned char style);
 /* Same as "gotoxy (x, y); _textframe (width, height, style);" */
 
+unsigned __fastcall__ videomode (unsigned mode);
+/* Set the video mode, return the old mode. Call with one of the VIDEOMODE_xx
+ * constants.
+ */
+
 
 
 /* End of apple2enh.h */
diff --git a/libsrc/apple2/videomode.s b/libsrc/apple2/videomode.s
new file mode 100644 (file)
index 0000000..bf99819
--- /dev/null
@@ -0,0 +1,65 @@
+;
+; Oliver Schmidt, 07.09.2009
+;
+; unsigned __fastcall__ videomode (unsigned mode);
+;
+
+       .export         _videomode
+        .import         COUT
+
+        .include        "apple2.inc"
+
+        .segment        "LOWCODE"
+
+_videomode:
+        ; Get and save current videomode flag
+        bit     RD80VID
+        php
+        
+        ; If we are in 80 column mode then the 80 column firmware is
+        ; known to be active so we can just print the ctrl-char code
+        ; (even if this only means staying in the current videomode)
+        bpl     :+
+        jsr     COUT
+        bra     done
+
+        ; If we are in 40 column mode and want to set 40 column mode
+        ; then we explicitly do nothing as we neither know about the
+        ; current state of the 80 column firmware nor want to fix it
+:       cmp     #$11            ; Ctrl-char code for 40 cols
+        beq     done
+        
+        ; If we are in 40 column mode and want to set 80 column mode
+        ; then we first presume the 80 column firmware being already
+        ; active and print the ctrl-char code (this causes a garbage
+        : char to be printed on the screen if isn't already active)
+        jsr     COUT
+        
+        ; If we successfully switched to 80 column mode then the 80
+        ; column firmware was in fact already active and we're done
+        bit     RD80VID
+        bmi     done
+        
+        ; The 80 column firmware isn't already active so we need to
+        ; initialize it - causing the screen to be cleared and thus
+        ; the garbage char printed above to be erased (but for some
+        ; reason the cursor horizontal position not not be zeroed)
+        stz     CH
+
+        ; Initializing the 80 column firmware needs the ROM switched
+        ; in, otherwise it would copy the F8 ROM to the LC (@ $CEF4)
+        bit     $C082
+
+        ; Initialize 80 column firmware
+        jsr     $C300           ; PR#3
+
+        ; Switch in LC bank 2 for R/O
+        bit     $C080
+                
+        ; Return ctrl-char code for setting previous
+        ; videomode using the saved videomode flag
+done:   lda     #$11            ; Ctrl-char code for 40 cols
+        plp
+        bpl     :+
+        lda     #$12            ; Ctrl-char code for 80 cols
+:       rts                     ; X was preserved all the way
index d3da3ca62677371bf8764e85cc3be6027ddb1a9e..d030d24367dda4f14bcdfb27ee9eec10040cb94e 100644 (file)
@@ -100,6 +100,7 @@ S_OBJS=     _scrsize.o      \
         sysuname.o      \
        textframe.o     \
         tgi_mode_table.o\
+        videomode.o     \
         vtabz.o         \
        wherex.o        \
                wherey.o        \