aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVolker Ruppert <info@vruppert.de>2003-02-08 12:04:03 +0000
committerVolker Ruppert <info@vruppert.de>2003-02-08 12:04:03 +0000
commit5468a07ad6645416fd441ba929151fe81f654df3 (patch)
tree12fad80aefb1ffcc220e9b09a5892dd7fb4ffd6b
parent6ddbcdaf256462c0ed35f253faf591ef16a8f0a5 (diff)
downloadvgabios-5468a07ad6645416fd441ba929151fe81f654df3.tar.gz
- vbe_biosfn_return_current_mode() now returns the active standard VGA mode
TODO: return VESA mode if enabled - biosfn_set_video_mode() now clears the screen in CGA mode correctly - write character functions are now working in all PLANAR4 graphics modes - added stubs for unimplemented features in graphics modes
-rw-r--r--vbe.c21
-rw-r--r--vgabios.c108
2 files changed, 86 insertions, 43 deletions
diff --git a/vbe.c b/vbe.c
index 43ae682..d96de02 100644
--- a/vbe.c
+++ b/vbe.c
@@ -181,6 +181,12 @@ static void dispi_set_bpp(bpp)
outw(VBE_DISPI_IOPORT_DATA,bpp);
}
+static Bit16u dispi_get_enable()
+{
+ outw(VBE_DISPI_IOPORT_INDEX,VBE_DISPI_INDEX_ENABLE);
+ return inw(VBE_DISPI_IOPORT_DATA);
+}
+
void dispi_set_enable(enable)
Bit16u enable;
{
@@ -603,7 +609,7 @@ Bit16u *AX;Bit16u BX; Bit16u ES;Bit16u DI;
dispi_set_bank(0);
dispi_set_enable(VBE_DISPI_ENABLED);
- // FIXME: store current mode in CMOS
+ // FIXME: store current mode in BIOS data area
result = 0x4f;
}
@@ -639,15 +645,22 @@ void vbe_biosfn_return_current_mode(AX, BX)
Bit16u *AX;Bit16u *BX;
{
Bit16u ss=get_SS();
-
-// FIXME: get current mode from CMOS reg?
+ Bit16u mode=0xffff;
#ifdef DEBUG
printf("VBE vbe_biosfn_return_current_mode\n");
#endif
+ if(dispi_get_enable())
+ {
+ // FIXME: get current mode from BIOS data area
+ }
+ else
+ {
+ mode=read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE);
+ }
write_word(ss, AX, 0x4f);
- write_word(ss, BX, 0x3);
+ write_word(ss, BX, mode);
}
diff --git a/vgabios.c b/vgabios.c
index 2f262ce..d7f7192 100644
--- a/vgabios.c
+++ b/vgabios.c
@@ -906,17 +906,25 @@ static void biosfn_set_video_mode(mode) Bit8u mode;
inb(VGAREG_ACTL_RESET);
if(noclearmem==0x00)
- {if(mode<0x0d)
+ {
+ if(vga_modes[line].class==TEXT)
{
memsetw(vga_modes[line].sstart,0,0x0720,0x4000); // 32k
}
else
{
- outb( VGAREG_SEQU_ADDRESS, 0x02 );
- mmask = inb( VGAREG_SEQU_DATA );
- outb( VGAREG_SEQU_DATA, 0x0f ); // all planes
- memsetw(vga_modes[line].sstart,0,0x0000,0x8000); // 64k
- outb( VGAREG_SEQU_DATA, mmask );
+ if(mode<0x0d)
+ {
+ memsetw(vga_modes[line].sstart,0,0x0000,0x4000); // 32k
+ }
+ else
+ {
+ outb( VGAREG_SEQU_ADDRESS, 0x02 );
+ mmask = inb( VGAREG_SEQU_DATA );
+ outb( VGAREG_SEQU_DATA, 0x0f ); // all planes
+ memsetw(vga_modes[line].sstart,0,0x0000,0x8000); // 64k
+ outb( VGAREG_SEQU_DATA, mmask );
+ }
}
}
@@ -1131,41 +1139,52 @@ Bit8u nblines;Bit8u attr;Bit8u rul;Bit8u cul;Bit8u rlr;Bit8u clr;Bit8u page;Bit8
if(page==0xFF)
page=read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_PAGE);
- // Compute the address
- address=SCREEN_MEM_START(nbcols,nbrows,page);
+ if(vga_modes[line].class==TEXT)
+ {
+ // Compute the address
+ address=SCREEN_MEM_START(nbcols,nbrows,page);
#ifdef DEBUG
- printf("Scroll, address %04x (%04x %04x %02x)\n",address,nbrows,nbcols,page);
+ printf("Scroll, address %04x (%04x %04x %02x)\n",address,nbrows,nbcols,page);
#endif
- if(rlr>=nbrows)rlr=nbrows-1;
- if(clr>=nbcols)clr=nbcols-1;
- if(nblines>nbrows)nblines=0;
+ if(rlr>=nbrows)rlr=nbrows-1;
+ if(clr>=nbcols)clr=nbcols-1;
+ if(nblines>nbrows)nblines=0;
- if(nblines==0&&rul==0&&cul==0&&rlr==nbrows-1&&clr==nbcols-1)
- {
- memsetw(vga_modes[line].sstart,address,(Bit16u)attr*0x100+' ',nbrows*nbcols);
- }
- else
- {// if Scroll up
- if(dir==SCROLL_UP)
- {for(i=rul;i<=rlr;i++)
- {
- if((i+nblines>rlr)||(nblines==0))
- memsetw(vga_modes[line].sstart,address+(i*nbcols+cul)*2,(Bit16u)attr*0x100+' ',clr-cul+1);
- else
- memcpyw(vga_modes[line].sstart,address+(i*nbcols+cul)*2,vga_modes[line].sstart,((i+nblines)*nbcols+cul)*2,clr-cul+1);
- }
+ if(nblines==0&&rul==0&&cul==0&&rlr==nbrows-1&&clr==nbcols-1)
+ {
+ memsetw(vga_modes[line].sstart,address,(Bit16u)attr*0x100+' ',nbrows*nbcols);
}
else
- {for(i=rlr;i>=rul;i--)
- {
- if((i<rul+nblines)||(nblines==0))
- memsetw(vga_modes[line].sstart,address+(i*nbcols+cul)*2,(Bit16u)attr*0x100+' ',clr-cul+1);
- else
- memcpyw(vga_modes[line].sstart,address+(i*nbcols+cul)*2,vga_modes[line].sstart,((i-nblines)*nbcols+cul)*2,clr-cul+1);
+ {// if Scroll up
+ if(dir==SCROLL_UP)
+ {for(i=rul;i<=rlr;i++)
+ {
+ if((i+nblines>rlr)||(nblines==0))
+ memsetw(vga_modes[line].sstart,address+(i*nbcols+cul)*2,(Bit16u)attr*0x100+' ',clr-cul+1);
+ else
+ memcpyw(vga_modes[line].sstart,address+(i*nbcols+cul)*2,vga_modes[line].sstart,((i+nblines)*nbcols+cul)*2,clr-cul+1);
+ }
+ }
+ else
+ {for(i=rlr;i>=rul;i--)
+ {
+ if((i<rul+nblines)||(nblines==0))
+ memsetw(vga_modes[line].sstart,address+(i*nbcols+cul)*2,(Bit16u)attr*0x100+' ',clr-cul+1);
+ else
+ memcpyw(vga_modes[line].sstart,address+(i*nbcols+cul)*2,vga_modes[line].sstart,((i-nblines)*nbcols+cul)*2,clr-cul+1);
+ }
}
}
}
+ else
+ {
+ // FIXME gfx mode
+#ifdef DEBUG
+ printf("Scroll in graphics mode !\n");
+ unimplemented();
+#endif
+ }
}
// --------------------------------------------------------------------------------------------
@@ -1176,8 +1195,6 @@ Bit8u page;Bit16u *car;
Bit16u nbcols,nbrows,address;
Bit16u cursor,dummy;
- // FIXME gfx mode
-
// Get the mode
mode=read_byte(BIOSMEM_SEG,BIOSMEM_CURRENT_MODE);
line=find_vga_entry(mode);
@@ -1191,10 +1208,20 @@ Bit8u page;Bit16u *car;
nbrows=read_byte(BIOSMEM_SEG,BIOSMEM_NB_ROWS)+1;
nbcols=read_word(BIOSMEM_SEG,BIOSMEM_NB_COLS);
- // Compute the address
- address=SCREEN_MEM_START(nbcols,nbrows,page)+(xcurs+ycurs*nbcols)*2;
+ if(vga_modes[line].class==TEXT)
+ {
+ // Compute the address
+ address=SCREEN_MEM_START(nbcols,nbrows,page)+(xcurs+ycurs*nbcols)*2;
- write_word(ss,car,read_word(vga_modes[line].sstart,address));
+ write_word(ss,car,read_word(vga_modes[line].sstart,address));
+ }
+ else
+ {
+ // FIXME gfx mode
+#ifdef DEBUG
+ unimplemented();
+#endif
+ }
}
// --------------------------------------------------------------------------------------------
@@ -1257,7 +1284,7 @@ Bit8u car;Bit8u page;Bit8u attr;Bit16u count;
else
{
// FIXME gfx mode not complete
- if(mode==0x12)
+ if(vga_modes[line].memmodel==PLANAR4)
{
cheight=vga_modes[line].cheight;
address=xcurs+ycurs*cheight*nbcols;
@@ -1306,6 +1333,9 @@ Bit8u car;Bit8u page;Bit8u attr;Bit16u count;
else
{
// FIXME gfx mode
+#ifdef DEBUG
+ unimplemented();
+#endif
}
}
@@ -1417,7 +1447,7 @@ Bit8u car;Bit8u page;Bit8u attr;Bit8u flag;
else
{
// FIXME gfx mode not complete
- if(mode==0x12)
+ if(vga_modes[line].memmodel==PLANAR4)
{
cheight=vga_modes[line].cheight;
address=xcurs+ycurs*cheight*nbcols;