OSDN Git Service

2ae8b7b28813258f3d66b35bfa554db8124b7e71
[csp-qt/common_source_project-fm7.git] / source / src / vm / pc6001 / display.cpp
1 /*
2         NEC PC-6001 Emulator 'yaPC-6001'
3
4         Author : Takeda.Toshiya
5         Date   : 2013.08.22-
6
7         [ display ]
8 */
9
10 #include "display.h"
11 #include "timer.h"
12 #include "../mc6847.h"
13
14 void DISPLAY::reset()
15 {
16         vram_ptr = ram_ptr + 0xe000;
17 }
18
19 void DISPLAY::write_io8(uint32_t addr, uint32_t data)
20 {
21         unsigned int VRAMHead[4] = { 0xc000, 0xe000, 0x8000, 0xa000 };
22         uint16_t port=(addr & 0x00ff);
23         
24         switch (port) {
25         case 0xB0:
26                 vram_ptr = (ram_ptr + VRAMHead[(data & 0x06) >> 1]);
27                 d_timer->set_portB0(data);
28                 break;
29         }
30 }
31
32 void DISPLAY::draw_screen()
33 {
34         d_vdp->write_signal(SIG_MC6847_AG, *vram_ptr, 0x80);
35         d_vdp->write_signal(SIG_MC6847_GM, *vram_ptr >> 4, 1);
36         d_vdp->write_signal(SIG_MC6847_GM, *vram_ptr >> 2, 2);
37         d_vdp->write_signal(SIG_MC6847_GM, *vram_ptr >> 0, 4);
38         d_vdp->write_signal(SIG_MC6847_CSS, *vram_ptr, 0x02);
39         if(*vram_ptr & 0x80) {
40                 d_vdp->set_vram_ptr(vram_ptr + 0x200, 0x1800);
41         } else {
42                 d_vdp->set_vram_ptr(vram_ptr, 0x1800);
43         }
44         d_vdp->draw_screen();
45 }
46
47 #define STATE_VERSION   1
48
49 #include "../../statesub.h"
50
51 void DISPLAY::decl_state()
52 {
53         enter_decl_state(STATE_VERSION);
54
55         DECL_STATE_ENTRY_INT32(tmp_vram_size);
56         
57         leave_decl_state();
58 }
59
60 void DISPLAY::save_state(FILEIO* state_fio)
61 {
62         tmp_vram_size = (int)(vram_ptr - ram_ptr);
63         
64         if(state_entry != NULL) {
65                 state_entry->save_state(state_fio);
66         }
67 //      state_fio->FputUint32(STATE_VERSION);
68 //      state_fio->FputInt32(this_device_id);
69         
70 //      state_fio->FputInt32((int)(vram_ptr - ram_ptr));
71 }
72
73 bool DISPLAY::load_state(FILEIO* state_fio)
74 {
75         bool mb = false;
76         if(state_entry != NULL) {
77                 mb = state_entry->load_state(state_fio);
78         }
79         if(!mb) {
80                 return false;
81         }
82 //      if(state_fio->FgetUint32() != STATE_VERSION) {
83 //              return false;
84 //      }
85 //      if(state_fio->FgetInt32() != this_device_id) {
86 //              return false;
87 //      }
88 //      vram_ptr = ram_ptr + state_fio->FgetInt32();
89         vram_ptr = ram_ptr + tmp_vram_size;
90         return true;
91 }
92
93 bool DISPLAY::process_state(FILEIO* state_fio, bool loading)
94 {
95         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
96                 return false;
97         }
98         if(!state_fio->StateCheckInt32(this_device_id)) {
99                 return false;
100         }
101         if(loading) {
102                 vram_ptr = ram_ptr + state_fio->FgetInt32_LE();
103         } else {
104                 state_fio->FputInt32_LE((int)(vram_ptr - ram_ptr));
105         }
106         return true;
107 }