Revision b6343073
b/hw/cirrus_vga.c | ||
---|---|---|
2658 | 2658 |
|
2659 | 2659 |
static uint32_t cirrus_vga_ioport_read(void *opaque, uint32_t addr) |
2660 | 2660 |
{ |
2661 |
CirrusVGAState *s = opaque; |
|
2661 |
CirrusVGAState *c = opaque; |
|
2662 |
VGACommonState *s = &c->vga; |
|
2662 | 2663 |
int val, index; |
2663 | 2664 |
|
2664 |
if (vga_ioport_invalid(&s->vga, addr)) {
|
|
2665 |
if (vga_ioport_invalid(s, addr)) {
|
|
2665 | 2666 |
val = 0xff; |
2666 | 2667 |
} else { |
2667 | 2668 |
switch (addr) { |
2668 | 2669 |
case 0x3c0: |
2669 |
if (s->vga.ar_flip_flop == 0) {
|
|
2670 |
val = s->vga.ar_index;
|
|
2670 |
if (s->ar_flip_flop == 0) { |
|
2671 |
val = s->ar_index; |
|
2671 | 2672 |
} else { |
2672 | 2673 |
val = 0; |
2673 | 2674 |
} |
2674 | 2675 |
break; |
2675 | 2676 |
case 0x3c1: |
2676 |
index = s->vga.ar_index & 0x1f;
|
|
2677 |
index = s->ar_index & 0x1f; |
|
2677 | 2678 |
if (index < 21) |
2678 |
val = s->vga.ar[index];
|
|
2679 |
val = s->ar[index]; |
|
2679 | 2680 |
else |
2680 | 2681 |
val = 0; |
2681 | 2682 |
break; |
2682 | 2683 |
case 0x3c2: |
2683 |
val = s->vga.st00;
|
|
2684 |
val = s->st00; |
|
2684 | 2685 |
break; |
2685 | 2686 |
case 0x3c4: |
2686 |
val = s->vga.sr_index;
|
|
2687 |
val = s->sr_index; |
|
2687 | 2688 |
break; |
2688 | 2689 |
case 0x3c5: |
2689 |
if (cirrus_hook_read_sr(s, s->vga.sr_index, &val))
|
|
2690 |
if (cirrus_hook_read_sr(c, s->sr_index, &val))
|
|
2690 | 2691 |
break; |
2691 |
val = s->vga.sr[s->vga.sr_index];
|
|
2692 |
val = s->sr[s->sr_index];
|
|
2692 | 2693 |
#ifdef DEBUG_VGA_REG |
2693 |
printf("vga: read SR%x = 0x%02x\n", s->vga.sr_index, val);
|
|
2694 |
printf("vga: read SR%x = 0x%02x\n", s->sr_index, val); |
|
2694 | 2695 |
#endif |
2695 | 2696 |
break; |
2696 | 2697 |
case 0x3c6: |
2697 |
cirrus_read_hidden_dac(s, &val);
|
|
2698 |
cirrus_read_hidden_dac(c, &val);
|
|
2698 | 2699 |
break; |
2699 | 2700 |
case 0x3c7: |
2700 |
val = s->vga.dac_state;
|
|
2701 |
val = s->dac_state; |
|
2701 | 2702 |
break; |
2702 | 2703 |
case 0x3c8: |
2703 |
val = s->vga.dac_write_index;
|
|
2704 |
s->cirrus_hidden_dac_lockindex = 0;
|
|
2704 |
val = s->dac_write_index; |
|
2705 |
c->cirrus_hidden_dac_lockindex = 0;
|
|
2705 | 2706 |
break; |
2706 | 2707 |
case 0x3c9: |
2707 |
if (cirrus_hook_read_palette(s, &val))
|
|
2708 |
if (cirrus_hook_read_palette(c, &val))
|
|
2708 | 2709 |
break; |
2709 |
val = s->vga.palette[s->vga.dac_read_index * 3 + s->vga.dac_sub_index];
|
|
2710 |
if (++s->vga.dac_sub_index == 3) {
|
|
2711 |
s->vga.dac_sub_index = 0;
|
|
2712 |
s->vga.dac_read_index++;
|
|
2710 |
val = s->palette[s->dac_read_index * 3 + s->dac_sub_index];
|
|
2711 |
if (++s->dac_sub_index == 3) { |
|
2712 |
s->dac_sub_index = 0; |
|
2713 |
s->dac_read_index++; |
|
2713 | 2714 |
} |
2714 | 2715 |
break; |
2715 | 2716 |
case 0x3ca: |
2716 |
val = s->vga.fcr;
|
|
2717 |
val = s->fcr; |
|
2717 | 2718 |
break; |
2718 | 2719 |
case 0x3cc: |
2719 |
val = s->vga.msr;
|
|
2720 |
val = s->msr; |
|
2720 | 2721 |
break; |
2721 | 2722 |
case 0x3ce: |
2722 |
val = s->vga.gr_index;
|
|
2723 |
val = s->gr_index; |
|
2723 | 2724 |
break; |
2724 | 2725 |
case 0x3cf: |
2725 |
if (cirrus_hook_read_gr(s, s->vga.gr_index, &val))
|
|
2726 |
if (cirrus_hook_read_gr(c, s->gr_index, &val))
|
|
2726 | 2727 |
break; |
2727 |
val = s->vga.gr[s->vga.gr_index];
|
|
2728 |
val = s->gr[s->gr_index];
|
|
2728 | 2729 |
#ifdef DEBUG_VGA_REG |
2729 |
printf("vga: read GR%x = 0x%02x\n", s->vga.gr_index, val);
|
|
2730 |
printf("vga: read GR%x = 0x%02x\n", s->gr_index, val); |
|
2730 | 2731 |
#endif |
2731 | 2732 |
break; |
2732 | 2733 |
case 0x3b4: |
2733 | 2734 |
case 0x3d4: |
2734 |
val = s->vga.cr_index;
|
|
2735 |
val = s->cr_index; |
|
2735 | 2736 |
break; |
2736 | 2737 |
case 0x3b5: |
2737 | 2738 |
case 0x3d5: |
2738 |
if (cirrus_hook_read_cr(s, s->vga.cr_index, &val))
|
|
2739 |
if (cirrus_hook_read_cr(c, s->cr_index, &val))
|
|
2739 | 2740 |
break; |
2740 |
val = s->vga.cr[s->vga.cr_index];
|
|
2741 |
val = s->cr[s->cr_index];
|
|
2741 | 2742 |
#ifdef DEBUG_VGA_REG |
2742 |
printf("vga: read CR%x = 0x%02x\n", s->vga.cr_index, val);
|
|
2743 |
printf("vga: read CR%x = 0x%02x\n", s->cr_index, val); |
|
2743 | 2744 |
#endif |
2744 | 2745 |
break; |
2745 | 2746 |
case 0x3ba: |
2746 | 2747 |
case 0x3da: |
2747 | 2748 |
/* just toggle to fool polling */ |
2748 |
val = s->vga.st01 = s->vga.retrace(&s->vga);
|
|
2749 |
s->vga.ar_flip_flop = 0;
|
|
2749 |
val = s->st01 = s->retrace(s);
|
|
2750 |
s->ar_flip_flop = 0; |
|
2750 | 2751 |
break; |
2751 | 2752 |
default: |
2752 | 2753 |
val = 0x00; |
... | ... | |
2761 | 2762 |
|
2762 | 2763 |
static void cirrus_vga_ioport_write(void *opaque, uint32_t addr, uint32_t val) |
2763 | 2764 |
{ |
2764 |
CirrusVGAState *s = opaque; |
|
2765 |
CirrusVGAState *c = opaque; |
|
2766 |
VGACommonState *s = &c->vga; |
|
2765 | 2767 |
int index; |
2766 | 2768 |
|
2767 | 2769 |
/* check port range access depending on color/monochrome mode */ |
2768 |
if (vga_ioport_invalid(&s->vga, addr)) {
|
|
2770 |
if (vga_ioport_invalid(s, addr)) {
|
|
2769 | 2771 |
return; |
2770 | 2772 |
} |
2771 | 2773 |
#ifdef DEBUG_VGA |
... | ... | |
2774 | 2776 |
|
2775 | 2777 |
switch (addr) { |
2776 | 2778 |
case 0x3c0: |
2777 |
if (s->vga.ar_flip_flop == 0) {
|
|
2779 |
if (s->ar_flip_flop == 0) { |
|
2778 | 2780 |
val &= 0x3f; |
2779 |
s->vga.ar_index = val;
|
|
2781 |
s->ar_index = val; |
|
2780 | 2782 |
} else { |
2781 |
index = s->vga.ar_index & 0x1f;
|
|
2783 |
index = s->ar_index & 0x1f; |
|
2782 | 2784 |
switch (index) { |
2783 | 2785 |
case 0x00 ... 0x0f: |
2784 |
s->vga.ar[index] = val & 0x3f;
|
|
2786 |
s->ar[index] = val & 0x3f; |
|
2785 | 2787 |
break; |
2786 | 2788 |
case 0x10: |
2787 |
s->vga.ar[index] = val & ~0x10;
|
|
2789 |
s->ar[index] = val & ~0x10; |
|
2788 | 2790 |
break; |
2789 | 2791 |
case 0x11: |
2790 |
s->vga.ar[index] = val;
|
|
2792 |
s->ar[index] = val; |
|
2791 | 2793 |
break; |
2792 | 2794 |
case 0x12: |
2793 |
s->vga.ar[index] = val & ~0xc0;
|
|
2795 |
s->ar[index] = val & ~0xc0; |
|
2794 | 2796 |
break; |
2795 | 2797 |
case 0x13: |
2796 |
s->vga.ar[index] = val & ~0xf0;
|
|
2798 |
s->ar[index] = val & ~0xf0; |
|
2797 | 2799 |
break; |
2798 | 2800 |
case 0x14: |
2799 |
s->vga.ar[index] = val & ~0xf0;
|
|
2801 |
s->ar[index] = val & ~0xf0; |
|
2800 | 2802 |
break; |
2801 | 2803 |
default: |
2802 | 2804 |
break; |
2803 | 2805 |
} |
2804 | 2806 |
} |
2805 |
s->vga.ar_flip_flop ^= 1;
|
|
2807 |
s->ar_flip_flop ^= 1; |
|
2806 | 2808 |
break; |
2807 | 2809 |
case 0x3c2: |
2808 |
s->vga.msr = val & ~0x10;
|
|
2809 |
s->vga.update_retrace_info(&s->vga);
|
|
2810 |
s->msr = val & ~0x10; |
|
2811 |
s->update_retrace_info(s);
|
|
2810 | 2812 |
break; |
2811 | 2813 |
case 0x3c4: |
2812 |
s->vga.sr_index = val;
|
|
2814 |
s->sr_index = val; |
|
2813 | 2815 |
break; |
2814 | 2816 |
case 0x3c5: |
2815 |
if (cirrus_hook_write_sr(s, s->vga.sr_index, val))
|
|
2817 |
if (cirrus_hook_write_sr(c, s->sr_index, val))
|
|
2816 | 2818 |
break; |
2817 | 2819 |
#ifdef DEBUG_VGA_REG |
2818 |
printf("vga: write SR%x = 0x%02x\n", s->vga.sr_index, val);
|
|
2820 |
printf("vga: write SR%x = 0x%02x\n", s->sr_index, val); |
|
2819 | 2821 |
#endif |
2820 |
s->vga.sr[s->vga.sr_index] = val & sr_mask[s->vga.sr_index];
|
|
2821 |
if (s->vga.sr_index == 1) s->vga.update_retrace_info(&s->vga);
|
|
2822 |
s->sr[s->sr_index] = val & sr_mask[s->sr_index];
|
|
2823 |
if (s->sr_index == 1) s->update_retrace_info(s);
|
|
2822 | 2824 |
break; |
2823 | 2825 |
case 0x3c6: |
2824 |
cirrus_write_hidden_dac(s, val);
|
|
2826 |
cirrus_write_hidden_dac(c, val);
|
|
2825 | 2827 |
break; |
2826 | 2828 |
case 0x3c7: |
2827 |
s->vga.dac_read_index = val;
|
|
2828 |
s->vga.dac_sub_index = 0;
|
|
2829 |
s->vga.dac_state = 3;
|
|
2829 |
s->dac_read_index = val; |
|
2830 |
s->dac_sub_index = 0; |
|
2831 |
s->dac_state = 3; |
|
2830 | 2832 |
break; |
2831 | 2833 |
case 0x3c8: |
2832 |
s->vga.dac_write_index = val;
|
|
2833 |
s->vga.dac_sub_index = 0;
|
|
2834 |
s->vga.dac_state = 0;
|
|
2834 |
s->dac_write_index = val; |
|
2835 |
s->dac_sub_index = 0; |
|
2836 |
s->dac_state = 0; |
|
2835 | 2837 |
break; |
2836 | 2838 |
case 0x3c9: |
2837 |
if (cirrus_hook_write_palette(s, val))
|
|
2839 |
if (cirrus_hook_write_palette(c, val))
|
|
2838 | 2840 |
break; |
2839 |
s->vga.dac_cache[s->vga.dac_sub_index] = val;
|
|
2840 |
if (++s->vga.dac_sub_index == 3) {
|
|
2841 |
memcpy(&s->vga.palette[s->vga.dac_write_index * 3], s->vga.dac_cache, 3);
|
|
2842 |
s->vga.dac_sub_index = 0;
|
|
2843 |
s->vga.dac_write_index++;
|
|
2841 |
s->dac_cache[s->dac_sub_index] = val;
|
|
2842 |
if (++s->dac_sub_index == 3) { |
|
2843 |
memcpy(&s->palette[s->dac_write_index * 3], s->dac_cache, 3);
|
|
2844 |
s->dac_sub_index = 0; |
|
2845 |
s->dac_write_index++; |
|
2844 | 2846 |
} |
2845 | 2847 |
break; |
2846 | 2848 |
case 0x3ce: |
2847 |
s->vga.gr_index = val;
|
|
2849 |
s->gr_index = val; |
|
2848 | 2850 |
break; |
2849 | 2851 |
case 0x3cf: |
2850 |
if (cirrus_hook_write_gr(s, s->vga.gr_index, val))
|
|
2852 |
if (cirrus_hook_write_gr(c, s->gr_index, val))
|
|
2851 | 2853 |
break; |
2852 | 2854 |
#ifdef DEBUG_VGA_REG |
2853 |
printf("vga: write GR%x = 0x%02x\n", s->vga.gr_index, val);
|
|
2855 |
printf("vga: write GR%x = 0x%02x\n", s->gr_index, val); |
|
2854 | 2856 |
#endif |
2855 |
s->vga.gr[s->vga.gr_index] = val & gr_mask[s->vga.gr_index];
|
|
2857 |
s->gr[s->gr_index] = val & gr_mask[s->gr_index];
|
|
2856 | 2858 |
break; |
2857 | 2859 |
case 0x3b4: |
2858 | 2860 |
case 0x3d4: |
2859 |
s->vga.cr_index = val;
|
|
2861 |
s->cr_index = val; |
|
2860 | 2862 |
break; |
2861 | 2863 |
case 0x3b5: |
2862 | 2864 |
case 0x3d5: |
2863 |
if (cirrus_hook_write_cr(s, s->vga.cr_index, val))
|
|
2865 |
if (cirrus_hook_write_cr(c, s->cr_index, val))
|
|
2864 | 2866 |
break; |
2865 | 2867 |
#ifdef DEBUG_VGA_REG |
2866 |
printf("vga: write CR%x = 0x%02x\n", s->vga.cr_index, val);
|
|
2868 |
printf("vga: write CR%x = 0x%02x\n", s->cr_index, val); |
|
2867 | 2869 |
#endif |
2868 | 2870 |
/* handle CR0-7 protection */ |
2869 |
if ((s->vga.cr[0x11] & 0x80) && s->vga.cr_index <= 7) {
|
|
2871 |
if ((s->cr[0x11] & 0x80) && s->cr_index <= 7) {
|
|
2870 | 2872 |
/* can always write bit 4 of CR7 */ |
2871 |
if (s->vga.cr_index == 7)
|
|
2872 |
s->vga.cr[7] = (s->vga.cr[7] & ~0x10) | (val & 0x10);
|
|
2873 |
if (s->cr_index == 7) |
|
2874 |
s->cr[7] = (s->cr[7] & ~0x10) | (val & 0x10);
|
|
2873 | 2875 |
return; |
2874 | 2876 |
} |
2875 |
switch (s->vga.cr_index) {
|
|
2877 |
switch (s->cr_index) { |
|
2876 | 2878 |
case 0x01: /* horizontal display end */ |
2877 | 2879 |
case 0x07: |
2878 | 2880 |
case 0x09: |
2879 | 2881 |
case 0x0c: |
2880 | 2882 |
case 0x0d: |
2881 | 2883 |
case 0x12: /* vertical display end */ |
2882 |
s->vga.cr[s->vga.cr_index] = val;
|
|
2884 |
s->cr[s->cr_index] = val;
|
|
2883 | 2885 |
break; |
2884 | 2886 |
|
2885 | 2887 |
default: |
2886 |
s->vga.cr[s->vga.cr_index] = val;
|
|
2888 |
s->cr[s->cr_index] = val;
|
|
2887 | 2889 |
break; |
2888 | 2890 |
} |
2889 | 2891 |
|
2890 |
switch(s->vga.cr_index) {
|
|
2892 |
switch(s->cr_index) { |
|
2891 | 2893 |
case 0x00: |
2892 | 2894 |
case 0x04: |
2893 | 2895 |
case 0x05: |
... | ... | |
2895 | 2897 |
case 0x07: |
2896 | 2898 |
case 0x11: |
2897 | 2899 |
case 0x17: |
2898 |
s->vga.update_retrace_info(&s->vga);
|
|
2900 |
s->update_retrace_info(s);
|
|
2899 | 2901 |
break; |
2900 | 2902 |
} |
2901 | 2903 |
break; |
2902 | 2904 |
case 0x3ba: |
2903 | 2905 |
case 0x3da: |
2904 |
s->vga.fcr = val & 0x10;
|
|
2906 |
s->fcr = val & 0x10; |
|
2905 | 2907 |
break; |
2906 | 2908 |
} |
2907 | 2909 |
} |
Also available in: Unified diff