Set font
(&mut self, font: &Font)
| 282 | |
| 283 | // Set font |
| 284 | pub fn setfont(&mut self, font: &Font) |
| 285 | { |
| 286 | let mut seq: Port<u16> = Port::new(SEQ_ADDRESS_REG); |
| 287 | let mut graphics: Port<u16> = Port::new(GRAPHICS_ADDRESS_REG); |
| 288 | let buffer = 0xA0000 as *mut u8; |
| 289 | |
| 290 | unsafe |
| 291 | { |
| 292 | // Sync reset |
| 293 | seq.write(0x0100); |
| 294 | |
| 295 | // Write to plane 2 |
| 296 | seq.write(0x0402); |
| 297 | |
| 298 | // Sequential access |
| 299 | seq.write(0x0704); |
| 300 | |
| 301 | // End reset |
| 302 | seq.write(0x0300); |
| 303 | |
| 304 | // Read plane 2 |
| 305 | graphics.write(0x0204); |
| 306 | |
| 307 | // Disable odd/even |
| 308 | graphics.write(0x0005); |
| 309 | |
| 310 | // VRAM @ 0xA0000 |
| 311 | graphics.write(0x0006); |
| 312 | |
| 313 | for i in 0..font.sz as usize |
| 314 | { |
| 315 | for j in 0..font.h as usize |
| 316 | { |
| 317 | // VGA offset |
| 318 | let os_vga = j + i * 32 as usize; |
| 319 | |
| 320 | // Font offset |
| 321 | let os_font = j + i * font.h as usize; |
| 322 | buffer.add(os_vga).write_volatile(font.dat[os_font]); |
| 323 | } |
| 324 | } |
| 325 | |
| 326 | // Sync reset |
| 327 | seq.write(0x0100); |
| 328 | |
| 329 | // Write plane 0/1 |
| 330 | seq.write(0x0302); |
| 331 | |
| 332 | // Even/odd access |
| 333 | seq.write(0x0304); |
| 334 | |
| 335 | // End reset |
| 336 | seq.write(0x0300); |
| 337 | |
| 338 | // Restore defaults |
| 339 | graphics.write(0x0004); |
| 340 | |
| 341 | // Resume odd/even |