diff options
author | Volker Ruppert <info@vruppert.de> | 2003-02-08 12:04:03 +0000 |
---|---|---|
committer | Volker Ruppert <info@vruppert.de> | 2003-02-08 12:04:03 +0000 |
commit | 5468a07ad6645416fd441ba929151fe81f654df3 (patch) | |
tree | 12fad80aefb1ffcc220e9b09a5892dd7fb4ffd6b | |
parent | 6ddbcdaf256462c0ed35f253faf591ef16a8f0a5 (diff) | |
download | vgabios-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.c | 21 | ||||
-rw-r--r-- | vgabios.c | 108 |
2 files changed, 86 insertions, 43 deletions
@@ -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); } @@ -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; |