X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=source%2Fsrc%2Fvm%2Ftk80bs%2Fdisplay.cpp;h=28a4d7b76e37bf6abdb282e119d9f52251fc6921;hb=1a7386afa4c2ce25de158ba8285bc795446a8584;hp=ee2508d8bb49b121b16fdd82f51038a08e587948;hpb=65befd5af5a70ba35d1ade73e51ac98742d7a8b8;p=csp-qt%2Fcommon_source_project-fm7.git diff --git a/source/src/vm/tk80bs/display.cpp b/source/src/vm/tk80bs/display.cpp index ee2508d8b..28a4d7b76 100644 --- a/source/src/vm/tk80bs/display.cpp +++ b/source/src/vm/tk80bs/display.cpp @@ -1,5 +1,7 @@ /* NEC TK-80BS (COMPO BS/80) Emulator 'eTK-80BS' + NEC TK-80 Emulator 'eTK-80' + NEC TK-85 Emulator 'eTK-85' Author : Takeda.Toshiya Date : 2008.08.26 - @@ -9,7 +11,10 @@ #include "display.h" -static const int led_pattern[46][33] = { +namespace TK80 { + +static const int led_pattern[LED_SIZE_Y][LED_SIZE_X] = { +#if defined(_TK80BS) || defined(_TK80) {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9}, {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9}, {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9}, @@ -56,10 +61,52 @@ static const int led_pattern[46][33] = { {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9}, {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9}, {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9}, +#else + {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9}, + {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9}, + {9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9}, + {9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9}, + {9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9}, + {9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9}, + {9,9,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,0,0,0,9,9}, + {9,9,0,0,0,0,6,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,2,0,0,0,9,9}, + {9,9,0,0,0,0,6,6,0,1,1,1,1,1,1,1,1,1,1,1,0,2,2,2,0,0,0,9,9}, + {9,9,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,9,9}, + {9,9,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,9,9}, + {9,9,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,9,9}, + {9,9,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,9,9}, + {9,9,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,9,9}, + {9,9,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,9,9}, + {9,9,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,9,9}, + {9,9,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,9,9}, + {9,9,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,9,9}, + {9,9,0,0,0,0,6,0,7,7,7,7,7,7,7,7,7,7,7,7,0,2,0,0,0,0,0,9,9}, + {9,9,0,0,0,0,0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,0,0,9,9}, + {9,9,0,0,0,0,5,0,7,7,7,7,7,7,7,7,7,7,7,7,0,3,0,0,0,0,0,9,9}, + {9,9,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,9,9}, + {9,9,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,9,9}, + {9,9,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,9,9}, + {9,9,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,9,9}, + {9,9,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,9,9}, + {9,9,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,9,9}, + {9,9,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,9,9}, + {9,9,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,9,9}, + {9,9,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,0,0,0,0,0,9,9}, + {9,9,0,0,5,5,0,4,4,4,4,4,4,4,4,4,4,4,0,3,3,3,0,8,8,8,0,9,9}, + {9,9,0,0,5,0,4,4,4,4,4,4,4,4,4,4,4,4,4,0,3,3,0,8,8,8,0,9,9}, + {9,9,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0,3,0,8,8,8,0,9,9}, + {9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9}, + {9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9}, + {9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9}, + {9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,9}, + {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9}, + {9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9}, +#endif }; void DISPLAY::initialize() { +#if defined(_TK80BS) // load rom image FILEIO* fio = new FILEIO(); if(fio->Fopen(create_local_path(_T("FONT.ROM")), FILEIO_READ_BINARY)) { @@ -69,15 +116,19 @@ void DISPLAY::initialize() delete fio; mode = 2; +#endif dma = true; } void DISPLAY::write_signal(int id, uint32_t data, uint32_t mask) { +#if defined(_TK80BS) if(id == SIG_DISPLAY_MODE) { // 8255 PC on TK-80BS mode = data & mask; - } else if(id == SIG_DISPLAY_DMA) { + } else +#endif + if(id == SIG_DISPLAY_DMA) { // 8255 PC on TK-80 dma = ((data & mask) != 0); } @@ -85,9 +136,11 @@ void DISPLAY::write_signal(int id, uint32_t data, uint32_t mask) void DISPLAY::draw_screen() { +#if defined(_TK80BS) // draw screen scrntype_t color_w = (mode & 2) ? RGB_COLOR(255, 255, 255) : RGB_COLOR(0, 0, 1); scrntype_t color_b = (mode & 2) ? RGB_COLOR(0, 0, 1) : RGB_COLOR(255, 255, 255); + scrntype_t screen[36][256] = {0}; int code_ofs = (mode & 1) << 8; int ptr = 0; @@ -95,7 +148,7 @@ void DISPLAY::draw_screen() for(int x = 0; x < 256; x += 8) { int code = vram[ptr++]; if(code != 0x20) { - vm->draw_ranges = 9; + static_cast(vm)->draw_ranges = 9; } code |= code_ofs; uint8_t* font_base = &font[code << 3]; @@ -124,14 +177,20 @@ void DISPLAY::draw_screen() memcpy(dest1, dest0, 256 * 2 * sizeof(scrntype_t)); } } +#endif + // draw 7-seg LEDs scrntype_t col[10]; scrntype_t color_on = RGB_COLOR(255, 8, 72); +#if defined(_TK80BS) || defined(_TK80) scrntype_t color_off = RGB_COLOR(56, 0, 0); col[0] = RGB_COLOR(38, 8, 0); +#else + scrntype_t color_off = RGB_COLOR(111, 33, 33); + col[0] = RGB_COLOR(96, 53, 53); +#endif col[9] = color_off; - memset(screen, 0, sizeof(screen)); for(int i = 0; i < 8; i++) { uint8_t pat = dma ? led[i] : 0; col[1] = pat & 0x01 ? color_on : color_off; @@ -142,9 +201,9 @@ void DISPLAY::draw_screen() col[6] = pat & 0x20 ? color_on : color_off; col[7] = pat & 0x40 ? color_on : color_off; col[8] = pat & 0x80 ? color_on : color_off; - for(int y = 0; y < 46; y++) { + for(int y = 0; y < LED_SIZE_Y; y++) { scrntype_t* dest = emu->get_screen_buffer(vm_ranges[i].y + y) + vm_ranges[i].x; - for(int x = 0; x < 33; x++) { + for(int x = 0; x < LED_SIZE_X; x++) { dest[x] = col[led_pattern[y][x]]; } } @@ -153,25 +212,19 @@ void DISPLAY::draw_screen() #define STATE_VERSION 1 -void DISPLAY::save_state(FILEIO* state_fio) +bool DISPLAY::process_state(FILEIO* state_fio, bool loading) { - state_fio->FputUint32(STATE_VERSION); - state_fio->FputInt32(this_device_id); - - state_fio->FputInt32(mode); - state_fio->FputBool(dma); -} - -bool DISPLAY::load_state(FILEIO* state_fio) -{ - if(state_fio->FgetUint32() != STATE_VERSION) { + if(!state_fio->StateCheckUint32(STATE_VERSION)) { return false; } - if(state_fio->FgetInt32() != this_device_id) { + if(!state_fio->StateCheckInt32(this_device_id)) { return false; } - mode = state_fio->FgetInt32(); - dma = state_fio->FgetBool(); +#if defined(_TK80BS) + state_fio->StateInt32(mode); +#endif + state_fio->StateBool(dma); return true; } +}