You can subscribe to this list here.
2003 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(35) |
Dec
(2) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
(37) |
Feb
(10) |
Mar
|
Apr
(2) |
May
(17) |
Jun
(1) |
Jul
(14) |
Aug
(14) |
Sep
(4) |
Oct
|
Nov
(14) |
Dec
(4) |
2005 |
Jan
(6) |
Feb
|
Mar
|
Apr
(6) |
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
|
Nov
(92) |
Dec
(12) |
2006 |
Jan
(3) |
Feb
(4) |
Mar
|
Apr
(5) |
May
(3) |
Jun
(15) |
Jul
(3) |
Aug
(1) |
Sep
(29) |
Oct
(1) |
Nov
(6) |
Dec
(5) |
2007 |
Jan
(2) |
Feb
(2) |
Mar
|
Apr
(3) |
May
(14) |
Jun
(2) |
Jul
(16) |
Aug
(73) |
Sep
(12) |
Oct
(9) |
Nov
(27) |
Dec
(3) |
2008 |
Jan
(4) |
Feb
(4) |
Mar
(3) |
Apr
(8) |
May
(23) |
Jun
(4) |
Jul
(1) |
Aug
(3) |
Sep
(7) |
Oct
(5) |
Nov
(1) |
Dec
(1) |
2009 |
Jan
|
Feb
(10) |
Mar
|
Apr
(4) |
May
(4) |
Jun
(10) |
Jul
|
Aug
(1) |
Sep
|
Oct
(7) |
Nov
|
Dec
(1) |
2010 |
Jan
|
Feb
(1) |
Mar
|
Apr
(6) |
May
|
Jun
(3) |
Jul
(11) |
Aug
(1) |
Sep
|
Oct
(15) |
Nov
(1) |
Dec
(5) |
2011 |
Jan
(4) |
Feb
(1) |
Mar
(6) |
Apr
|
May
(22) |
Jun
|
Jul
(8) |
Aug
(2) |
Sep
|
Oct
|
Nov
|
Dec
(2) |
2012 |
Jan
|
Feb
(10) |
Mar
(1) |
Apr
(6) |
May
(27) |
Jun
(48) |
Jul
(30) |
Aug
(4) |
Sep
|
Oct
(3) |
Nov
(1) |
Dec
(11) |
2013 |
Jan
(4) |
Feb
(7) |
Mar
(6) |
Apr
(18) |
May
(28) |
Jun
(20) |
Jul
|
Aug
(4) |
Sep
(1) |
Oct
(1) |
Nov
(2) |
Dec
(7) |
2014 |
Jan
(3) |
Feb
(2) |
Mar
(4) |
Apr
(9) |
May
(11) |
Jun
(10) |
Jul
|
Aug
(18) |
Sep
(12) |
Oct
(17) |
Nov
(10) |
Dec
(16) |
2015 |
Jan
(5) |
Feb
(1) |
Mar
(5) |
Apr
(4) |
May
(28) |
Jun
(2) |
Jul
|
Aug
|
Sep
(6) |
Oct
|
Nov
(2) |
Dec
(1) |
2016 |
Jan
(14) |
Feb
|
Mar
(3) |
Apr
|
May
|
Jun
(3) |
Jul
(4) |
Aug
(4) |
Sep
(1) |
Oct
(1) |
Nov
|
Dec
(1) |
2017 |
Jan
(11) |
Feb
|
Mar
(21) |
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
2018 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
(2) |
Sep
(4) |
Oct
(4) |
Nov
|
Dec
(1) |
2019 |
Jan
(1) |
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
(13) |
Sep
(4) |
Oct
|
Nov
|
Dec
|
2020 |
Jan
(10) |
Feb
(9) |
Mar
(5) |
Apr
(4) |
May
(3) |
Jun
(18) |
Jul
(4) |
Aug
(2) |
Sep
(20) |
Oct
(2) |
Nov
|
Dec
|
2021 |
Jan
|
Feb
|
Mar
|
Apr
(2) |
May
(1) |
Jun
(2) |
Jul
(1) |
Aug
(2) |
Sep
|
Oct
|
Nov
|
Dec
(2) |
2022 |
Jan
(1) |
Feb
(2) |
Mar
(2) |
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
(5) |
Sep
|
Oct
(1) |
Nov
|
Dec
(1) |
2023 |
Jan
(10) |
Feb
(7) |
Mar
(29) |
Apr
(31) |
May
(29) |
Jun
(34) |
Jul
(3) |
Aug
(24) |
Sep
(22) |
Oct
(10) |
Nov
(38) |
Dec
(27) |
2024 |
Jan
(15) |
Feb
(8) |
Mar
(4) |
Apr
(20) |
May
(33) |
Jun
(18) |
Jul
(15) |
Aug
(23) |
Sep
(26) |
Oct
(32) |
Nov
(6) |
Dec
(4) |
2025 |
Jan
(7) |
Feb
(1) |
Mar
(1) |
Apr
(4) |
May
(46) |
Jun
(19) |
Jul
(26) |
Aug
(48) |
Sep
(30) |
Oct
(6) |
Nov
|
Dec
|
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
|
|
|
|
|
|
1
|
2
|
3
(1) |
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
14
|
15
|
16
|
17
|
18
|
19
|
20
|
21
|
22
|
23
|
24
|
25
|
26
|
27
|
28
|
29
|
30
|
31
|
|
|
|
|
|
Revision: 647 http://cadcdev.svn.sourceforge.net/cadcdev/?rev=647&view=rev Author: ljsebald Date: 2009年08月03日 00:38:45 +0000 (2009年8月03日) Log Message: ----------- Support for multiple framebuffers when the PVR isn't being used. Modified Paths: -------------- kos/kernel/arch/dreamcast/hardware/video.c kos/kernel/arch/dreamcast/include/dc/video.h Modified: kos/kernel/arch/dreamcast/hardware/video.c =================================================================== --- kos/kernel/arch/dreamcast/hardware/video.c 2009年06月12日 02:40:54 UTC (rev 646) +++ kos/kernel/arch/dreamcast/hardware/video.c 2009年08月03日 00:38:45 UTC (rev 647) @@ -11,6 +11,8 @@ #include <string.h> #include <stdio.h> +#define FBPOS(n) (n * 0x200000) + /*-----------------------------------------------------------------------------*/ /* This table is indexed w/ DM_* */ vid_mode_t vid_builtin[DM_MODE_COUNT] = { @@ -205,6 +207,198 @@ { 0, 0, 0, 0 } }, + /* All of the modes below this comment are exactly the same as the ones + above, other than that they support multiple framebuffers (in the current + case, 4). They're only particularly useful if you're doing a drawing by + directly writing to the framebuffer, and are not useful at all if you're + using the PVR to do your drawing. */ + /* 320x240 VGA 60Hz */ + /* DM_320x240_VGA_MB */ + { + DM_320x240 | DM_MULTIBUFFER, + 320, 240, + VID_PIXELDOUBLE|VID_LINEDOUBLE, + CT_VGA, + 0, + 262, 857, + 0xAC, 0x28, + 0x15, 0x104, + 141, 843, + 24, 263, + 0, VID_MAX_FB, + { FBPOS(0), FBPOS(1), FBPOS(2), FBPOS(3) } + }, + + /* 320x240 NTSC 60Hz */ + /* DM_320x240_NTSC_MB */ + { + DM_320x240 | DM_MULTIBUFFER, + 320, 240, + VID_PIXELDOUBLE|VID_LINEDOUBLE, + CT_ANY, + 0, + 262, 857, + 0xA4, 0x18, + 0x15, 0x104, + 141, 843, + 24, 263, + 0, VID_MAX_FB, + { FBPOS(0), FBPOS(1), FBPOS(2), FBPOS(3) } + }, + + /* 640x480 VGA 60Hz */ + /* DM_640x480_VGA_MB */ + { + DM_640x480 | DM_MULTIBUFFER, + 640, 480, + VID_INTERLACE, + CT_VGA, + 0, + 0x20C, 0x359, + 0xAC, 0x28, + 0x15, 0x104, + 0x7E, 0x345, + 0x24, 0x204, + 0, VID_MAX_FB, + { FBPOS(0), FBPOS(1), FBPOS(2), FBPOS(3) } + }, + + /* 640x480 NTSC 60Hz IL */ + /* DM_640x480_NTSC_IL_MB */ + { + DM_640x480 | DM_MULTIBUFFER, + 640, 480, + VID_INTERLACE, + CT_ANY, + 0, + 0x20C, 0x359, + 0xA4, 0x12, + 0x15, 0x104, + 0x7E, 0x345, + 0x24, 0x204, + 0, VID_MAX_FB, + { FBPOS(0), FBPOS(1), FBPOS(2), FBPOS(3) } + }, + + /* 800x608 NTSC 60Hz (VGA) [BROKEN!] */ + /* DM_800x608_VGA_MB */ + { + DM_800x608 | DM_MULTIBUFFER, + 320, 240, + VID_INTERLACE, + 1/*CT_ANY*/, /* This will block the mode from being set. */ + 0, + 262, 857, + 164, 24, + 21, 82, + 141, 843, + 24, 264, + 0, VID_MAX_FB, + { FBPOS(0), FBPOS(1), FBPOS(2), FBPOS(3) } + }, + + /* 640x480 PAL 50Hz IL */ + /* DM_640x480_PAL_IL_MB */ + { + DM_640x480 | DM_MULTIBUFFER, + 640, 480, + VID_INTERLACE|VID_PAL, + CT_ANY, + 0, + 0x270, 0x35F, + 0xAE, 0x2D, + 0x15, 0x104, + 0x8D, 0x34B, + 0x2C, 0x26C, + 0, VID_MAX_FB, + { FBPOS(0), FBPOS(1), FBPOS(2), FBPOS(3) } + }, + + /* 256x256 PAL 50Hz IL (seems to output the same w/o VID_PAL, ie. in NTSC IL mode) */ + /* DM_256x256_PAL_IL_MB */ + { + DM_256x256 | DM_MULTIBUFFER, + 256, 256, + VID_PIXELDOUBLE|VID_LINEDOUBLE|VID_INTERLACE|VID_PAL, + CT_ANY, + 0, + 624, 863, + 226, 37, + 0x15, 0x104, + 0x8D, 0x34B, + 0x2C, 0x26C, + 0, VID_MAX_FB, + { FBPOS(0), FBPOS(1), FBPOS(2), FBPOS(3) } + }, + + /* 768x480 NTSC 60Hz IL (thanks DCGrendel) */ + /* DM_768x480_NTSC_IL_MB */ + { + DM_768x480 | DM_MULTIBUFFER, + 768, 480, + VID_INTERLACE, + CT_ANY, + 0, + 524, 857, + 96, 18, + 0x15, 0x104, + 0x2e, 0x345, + 0x24, 0x204, + 0, VID_MAX_FB, + { FBPOS(0), FBPOS(1), FBPOS(2), FBPOS(3) } + }, + + /* 768x576 PAL 50Hz IL (DCG) */ + /* DM_768x576_PAL_IL_MB */ + { + DM_768x576 | DM_MULTIBUFFER, + 768, 576, + VID_INTERLACE | VID_PAL, + CT_ANY, + 0, + 624, 863, + 88, 16, + 0x18, 0x104, + 0x36, 0x34b, + 0x2c, 0x26c, + 0, VID_MAX_FB, + { FBPOS(0), FBPOS(1), FBPOS(2), FBPOS(3) } + }, + + /* 768x480 PAL 50Hz IL */ + /* DM_768x480_PAL_IL_MB */ + { + DM_768x480 | DM_MULTIBUFFER, + 768, 480, + VID_INTERLACE | VID_PAL, + CT_ANY, + 0, + 624, 863, + 88, 16, + 0x18, 0x104, + 0x36, 0x34b, + 0x2c, 0x26c, + 0, VID_MAX_FB, + { FBPOS(0), FBPOS(1), FBPOS(2), FBPOS(3) } + }, + + /* 320x240 PAL 50Hz (thanks Marco Martins aka Mekanaizer) */ + /* DM_320x240_PAL_MB */ + { + DM_320x240 | DM_MULTIBUFFER, + 320, 240, + VID_PIXELDOUBLE|VID_LINEDOUBLE|VID_PAL, + CT_ANY, + 0, + 312, 863, + 174, 45, + 21, 260, + 141, 843, + 44, 620, + 0, VID_MAX_FB, + { FBPOS(0), FBPOS(1), FBPOS(2), FBPOS(3) } + }, + /* END */ /* DM_SENTINEL */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, { 0, 0, 0, 0 } } @@ -244,10 +438,15 @@ /*-----------------------------------------------------------------------------*/ void vid_set_mode(int dm, int pm) { vid_mode_t mode; - int i, ct, found; + int i, ct, found, dm2; ct = vid_check_cable(); + /* Remove the multi-buffering flag from the mode, if its present, and save + the state of that flag. */ + dm2 = dm & DM_MULTIBUFFER; + dm &= ~DM_MULTIBUFFER; + /* Check to see if we should use a direct mode index, a generic mode check, or if it's just invalid. */ if (dm > DM_INVALID && dm < DM_SENTINEL) { @@ -256,7 +455,7 @@ found = 0; for (i=1; i<DM_SENTINEL; i++) { /* Is it the right generic mode? */ - if (vid_builtin[i].generic != dm) + if (vid_builtin[i].generic != (dm | dm2)) continue; /* Do we have the right cable type? */ @@ -318,9 +517,10 @@ mode->scanlines *= 2; } - dbglog(DBG_INFO, "vid_set_mode: %ix%i%s %s\n", mode->width, mode->height, + dbglog(DBG_INFO, "vid_set_mode: %ix%i%s %s%s\n", mode->width, mode->height, (mode->flags & VID_INTERLACE) ? "IL" : "", - (mode->flags & VID_PAL) ? "PAL" : "NTSC"); + (mode->flags & VID_PAL) ? "PAL" : "NTSC", + (mode->generic & DM_MULTIBUFFER) ? " multi-buffered" : ""); vid_border_color(0, 0, 0); @@ -392,7 +592,9 @@ memcpy(&currmode, mode, sizeof(vid_mode_t)); vid_mode = &currmode; - vid_set_start(0); + /* Set up the framebuffer */ + vid_mode->fb_curr = -1; + vid_flip(0); /* Set cable type */ if (mode->cable_type & 1) { @@ -427,6 +629,7 @@ /*-----------------------------------------------------------------------------*/ void vid_flip(int fb) { uint16 oldfb; + uint32 base; oldfb = vid_mode->fb_curr; if (fb < 0) { @@ -441,6 +644,11 @@ } vid_set_start(vid_mode->fb_base[vid_mode->fb_curr]); + + /* Set the vram_* pointers as expected */ + base = vid_mode->fb_base[(vid_mode->fb_curr + 1) & (vid_mode->fb_count - 1)]; + vram_s = (uint16*)(0xA5000000|base); + vram_l = (uint32*)(0xA5000000|base); } /*-----------------------------------------------------------------------------*/ Modified: kos/kernel/arch/dreamcast/include/dc/video.h =================================================================== --- kos/kernel/arch/dreamcast/include/dc/video.h 2009年06月12日 02:40:54 UTC (rev 646) +++ kos/kernel/arch/dreamcast/include/dc/video.h 2009年08月03日 00:38:45 UTC (rev 647) @@ -38,6 +38,9 @@ DM_GENERIC_LAST = DM_768x576 }; +// OR this with the generic mode to get 4 framebuffers instead of one +#define DM_MULTIBUFFER 0x2000 + //----------------------------------------------------------------------------- // More specific modes (and actual indeces into the mode table) @@ -55,6 +58,17 @@ DM_768x576_PAL_IL, DM_768x480_PAL_IL, DM_320x240_PAL, + DM_320x240_VGA_MB, + DM_320x240_NTSC_MB, + DM_640x480_VGA_MB, + DM_640x480_NTSC_IL_MB, + DM_800x608_VGA_MB, + DM_640x480_PAL_IL_MB, + DM_256x256_PAL_IL_MB, + DM_768x480_NTSC_IL_MB, + DM_768x576_PAL_IL_MB, + DM_768x480_PAL_IL_MB, + DM_320x240_PAL_MB, // The below is only for counting.. DM_SENTINEL, DM_MODE_COUNT @@ -95,6 +109,12 @@ extern vid_mode_t *vid_mode; //----------------------------------------------------------------------------- +// These point to the current drawing area. If you're not using a multi-buffered +// mode, that means they do what KOS always used to do (they'll point at the +// start of VRAM). If you're using a multi-buffered mode, they'll point at the +// next framebuffer to be displayed. You must use vid_flip for this to work +// though (if you use vid_set_start, they'll point at the display base, for +// compatibility's sake). extern uint16 *vram_s; extern uint32 *vram_l; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.