diff options
author | Volker Ruppert <info@vruppert.de> | 2003-02-04 21:06:04 +0000 |
---|---|---|
committer | Volker Ruppert <info@vruppert.de> | 2003-02-04 21:06:04 +0000 |
commit | 6ddbcdaf256462c0ed35f253faf591ef16a8f0a5 (patch) | |
tree | bf9481eeff0757ee719cbcddeb2fa1f9f5703935 | |
parent | 7e2677e3729f3f1cb21daf3b1754abead0a5e6fd (diff) | |
download | vgabios-6ddbcdaf256462c0ed35f253faf591ef16a8f0a5.tar.gz |
- set video mode: clear vga memory in graphics mode
- set video mode: load default font in text mode
- write character implemented for graphics mode 0x12
-rw-r--r-- | vgabios.c | 128 |
1 files changed, 103 insertions, 25 deletions
@@ -789,7 +789,7 @@ static void biosfn_set_video_mode(mode) Bit8u mode; // Should we clear the screen ? Bit8u noclearmem=mode&0x80; - Bit8u line,*palette; + Bit8u line,mmask,*palette; Bit16u i,twidth,theight,cheight; Bit8u modeset_ctl,video_ctl,vga_switches; Bit16u crtc_addr; @@ -906,12 +906,17 @@ static void biosfn_set_video_mode(mode) Bit8u mode; inb(VGAREG_ACTL_RESET); if(noclearmem==0x00) - {if(vga_modes[line].class==TEXT) + {if(mode<0x0d) { memsetw(vga_modes[line].sstart,0,0x0720,0x4000); // 32k } else - {// FIXME should handle gfx mode + { + 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 ); } } @@ -949,7 +954,10 @@ static void biosfn_set_video_mode(mode) Bit8u mode; biosfn_set_active_page(0x00); // Write the fonts in memory -// FIXME + if(vga_modes[line].class==TEXT) + { + biosfn_load_text_8_16_pat(0x04,0x00); + } // Set the ints 0x1F and 0x43 ASM_START @@ -1190,15 +1198,41 @@ Bit8u page;Bit16u *car; } // -------------------------------------------------------------------------------------------- +static void write_gfx_char(car,attr,addr,cols,cheight,fdata) +Bit8u car;Bit8u attr;Bit16u addr;Bit8u cols;Bit8u cheight;Bit8u *fdata; +{ + Bit8u back,fore,data,i,j,mmask; + Bit16u dest,src; + + src = car * cheight; + fore = attr & 0x0f; + outb( VGAREG_SEQU_ADDRESS, 0x02 ); + mmask = inb( VGAREG_SEQU_DATA ); + for(i=0;i<4;i++) + { + outb( VGAREG_SEQU_DATA, 1 << i ); + for(j=0;j<cheight;j++) + { + dest=addr+j*cols; + data = read_byte(0xa000,dest) & ~fdata[src+j]; + if(fore & (1 << i)) + { + data |= fdata[src+j]; + } + write_byte(0xa000,dest,data); + } + } + outb( VGAREG_SEQU_DATA, mmask ); +} + +// -------------------------------------------------------------------------------------------- static void biosfn_write_char_attr (car,page,attr,count) Bit8u car;Bit8u page;Bit8u attr;Bit16u count; { - Bit8u xcurs,ycurs,mode,line; + Bit8u cheight,xcurs,ycurs,mode,line; 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); @@ -1212,11 +1246,30 @@ Bit8u car;Bit8u page;Bit8u attr;Bit16u count; 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; - dummy=((Bit16u)attr<<8)+car; - memsetw(vga_modes[line].sstart,address,dummy,count); + dummy=((Bit16u)attr<<8)+car; + memsetw(vga_modes[line].sstart,address,dummy,count); + } + else + { + // FIXME gfx mode not complete + if(mode==0x12) + { + cheight=vga_modes[line].cheight; + address=xcurs+ycurs*cheight*nbcols; + write_gfx_char(car,attr,address,nbcols,cheight,&vgafont16); + } + else + { +#ifdef DEBUG + unimplemented(); +#endif + } + } } // -------------------------------------------------------------------------------------------- @@ -1227,8 +1280,6 @@ Bit8u car;Bit8u page;Bit8u attr;Bit16u count; 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); @@ -1242,12 +1293,19 @@ Bit8u car;Bit8u page;Bit8u attr;Bit16u count; 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; - while(count-->0) - {write_byte(vga_modes[line].sstart,address,car); - address+=2; + while(count-->0) + {write_byte(vga_modes[line].sstart,address,car); + address+=2; + } + } + else + { + // FIXME gfx mode } } @@ -1292,7 +1350,7 @@ static void biosfn_write_teletype (car, page, attr, flag) Bit8u car;Bit8u page;Bit8u attr;Bit8u flag; {// flag = WITH_ATTR / NO_ATTR - Bit8u xcurs,ycurs,mode,line; + Bit8u cheight,xcurs,ycurs,mode,line; Bit16u nbcols,nbrows,address; Bit16u cursor,dummy; @@ -1344,14 +1402,34 @@ Bit8u car;Bit8u page;Bit8u attr;Bit8u flag; break; default: - // Compute the address - address=SCREEN_MEM_START(nbcols,nbrows,page)+(xcurs+ycurs*nbcols)*2; - // Write the char - write_byte(vga_modes[line].sstart,address,car); + if(vga_modes[line].class==TEXT) + { + // Compute the address + address=SCREEN_MEM_START(nbcols,nbrows,page)+(xcurs+ycurs*nbcols)*2; - if(flag==WITH_ATTR) - write_byte(vga_modes[line].sstart,address+1,attr); + // Write the char + write_byte(vga_modes[line].sstart,address,car); + + if(flag==WITH_ATTR) + write_byte(vga_modes[line].sstart,address+1,attr); + } + else + { + // FIXME gfx mode not complete + if(mode==0x12) + { + cheight=vga_modes[line].cheight; + address=xcurs+ycurs*cheight*nbcols; + write_gfx_char(car,attr,address,nbcols,cheight,&vgafont16); + } + else + { +#ifdef DEBUG + unimplemented(); +#endif + } + } xcurs++; } |