analog/v2-analog-rev1/vga/render.c
2023-01-29 10:50:12 -05:00

172 lines
4.8 KiB
C

#include <string.h>
#include <pico/stdlib.h>
#include <hardware/timer.h>
#include "common/config.h"
#include "vga/vgabuf.h"
#include "vga/render.h"
#include "vga/character_rom.h"
#include "vga/vgaout.h"
#include "pico_hal.h"
uint16_t text_fore;
uint16_t text_back;
uint16_t text_border;
compat_t machinefont = MACHINE_II;
bool userfont = false;
// Initialize the character generator ROM
void switch_font() {
switch(current_machine) {
default:
case MACHINE_II:
memcpy(character_rom, default_character_rom, 2048);
break;
case MACHINE_IIE:
memcpy(character_rom, appleiie_character_rom, 2048);
break;
case MACHINE_IIGS:
memcpy(character_rom, appleiigs_character_rom, 2048);
break;
}
machinefont = current_machine;
}
void load_font() {
int file = pico_open("font", LFS_O_RDONLY);
int br = 0;
userfont = false;
if(file < 0) {
return;
}
br = pico_read(file, character_rom, 2048);
if(br == 2048) {
userfont = true;
}
pico_close(file);
return;
}
void render_init() {
int i;
load_font();
if(!userfont)
switch_font();
if((soft_switches & SOFTSW_MODE_MASK) == 0)
soft_switches |= SOFTSW_TEST;
terminal_tbcolor = 0xf0;
terminal_border = 0x00;
render_test_init();
}
// Blank screen
void __time_critical_func(render_blank)() {
struct vga_scanline *sl = vga_prepare_scanline();
uint sl_pos = 0;
while(sl_pos < VGA_WIDTH/16) {
sl->data[sl_pos] = (text_border|THEN_EXTEND_7) | ((text_border|THEN_EXTEND_7) << 16); // 8 pixels per word
sl_pos++;
}
sl->length = sl_pos;
sl->repeat_count = 479;
vga_submit_scanline(sl);
}
uint32_t screentimeout = 0;
uint32_t testdone = 0;
void __noinline __time_critical_func(render_loop)() {
while(current_mode == MODE_VGACARD) {
config_handler();
#if 0
if((busactive == 0) && (screentimeout > (30 * 60))) {
render_blank();
} else if((busactive == 0) && (screentimeout > (15 * 60))) {
render_testpattern();
screentimeout++;
} else if((busactive == 0) && (screentimeout == 15 * 60)) {
render_test_sleep();
render_testpattern();
screentimeout++;
} else {
if(busactive == 0) {
screentimeout++;
} else {
screentimeout = 0;
}
busactive = 0;
#endif
if(!userfont && (machinefont != current_machine)) {
switch_font();
}
update_text_flasher();
text_fore = lores_palette[TERMINAL_FORE];
text_back = lores_palette[TERMINAL_BACK];
text_border = lores_palette[TERMINAL_BORDER];
if(soft_switches & SOFTSW_TEST) {
render_testpattern();
// Automatically dismiss the test pattern when the Apple II is seen.
if(((soft_switches & SOFTSW_MODE_MASK) != 0) && (testdone == 0)) {
soft_switches &= ~SOFTSW_TEST;
testdone = 1;
render_about_init();
}
#if 0
} else if(soft_switches & SOFTSW_VIDEX) {
render_videx();
} else if(soft_switches & SOFTSW_SHR) {
render_shr();
#endif
} else {
switch(soft_switches & SOFTSW_MODE_MASK) {
case 0:
if(soft_switches & SOFTSW_DGR) {
render_dgr();
} else {
render_lores();
}
break;
case SOFTSW_MIX_MODE:
if((soft_switches & (SOFTSW_80COL | SOFTSW_DGR)) == (SOFTSW_80COL | SOFTSW_DGR)) {
render_mixed_dgr();
} else {
render_mixed_lores();
}
break;
case SOFTSW_HIRES_MODE:
if(soft_switches & SOFTSW_DGR) {
render_dhgr();
} else {
render_hires();
}
break;
case SOFTSW_HIRES_MODE|SOFTSW_MIX_MODE:
if((soft_switches & (SOFTSW_80COL | SOFTSW_DGR)) == (SOFTSW_80COL | SOFTSW_DGR)) {
render_mixed_dhgr();
} else {
render_mixed_hires();
}
break;
default:
render_text();
break;
}
}
// }
}
}