OSDN Git Service

[VM][STATE] Use namespace {VMNAME} to separate per VMs.
[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 namespace PC6001 {
15
16 void DISPLAY::reset()
17 {
18         vram_ptr = ram_ptr + 0xe000;
19 }
20
21 void DISPLAY::write_io8(uint32_t addr, uint32_t data)
22 {
23         unsigned int VRAMHead[4] = { 0xc000, 0xe000, 0x8000, 0xa000 };
24         uint16_t port=(addr & 0x00ff);
25         
26         switch (port) {
27         case 0xB0:
28                 vram_ptr = (ram_ptr + VRAMHead[(data & 0x06) >> 1]);
29                 d_timer->set_portB0(data);
30                 break;
31         }
32 }
33
34 void DISPLAY::draw_screen()
35 {
36         d_vdp->write_signal(SIG_MC6847_AG, *vram_ptr, 0x80);
37         d_vdp->write_signal(SIG_MC6847_GM, *vram_ptr >> 4, 1);
38         d_vdp->write_signal(SIG_MC6847_GM, *vram_ptr >> 2, 2);
39         d_vdp->write_signal(SIG_MC6847_GM, *vram_ptr >> 0, 4);
40         d_vdp->write_signal(SIG_MC6847_CSS, *vram_ptr, 0x02);
41         if(*vram_ptr & 0x80) {
42                 d_vdp->set_vram_ptr(vram_ptr + 0x200, 0x1800);
43         } else {
44                 d_vdp->set_vram_ptr(vram_ptr, 0x1800);
45         }
46         d_vdp->draw_screen();
47 }
48
49 #define STATE_VERSION   1
50
51 bool DISPLAY::process_state(FILEIO* state_fio, bool loading)
52 {
53         if(!state_fio->StateCheckUint32(STATE_VERSION)) {
54                 return false;
55         }
56         if(!state_fio->StateCheckInt32(this_device_id)) {
57                 return false;
58         }
59         if(loading) {
60                 vram_ptr = ram_ptr + state_fio->FgetInt32_LE();
61         } else {
62                 state_fio->FputInt32_LE((int)(vram_ptr - ram_ptr));
63         }
64         return true;
65 }
66
67 }