diff options
Diffstat (limited to 'src/mame/video/ssystem3.c')
-rw-r--r-- | src/mame/video/ssystem3.c | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/src/mame/video/ssystem3.c b/src/mame/video/ssystem3.c new file mode 100644 index 00000000000..a755dff5a4b --- /dev/null +++ b/src/mame/video/ssystem3.c @@ -0,0 +1,236 @@ +// license:GPL-2.0+ +// copyright-holders:Peter Trauner +/****************************************************************************** + PeT mess@utanet.at +******************************************************************************/ + +#include "emu.h" +#include "includes/ssystem3.h" + +void ssystem3_state::ssystem3_lcd_reset() +{ + m_lcd.count=0; m_lcd.clock=1; +} + +void ssystem3_state::ssystem3_lcd_write(int clock, int data) +{ + if (clock&&!m_lcd.clock) { + m_lcd.data[m_lcd.count/8]&=~(1<<(m_lcd.count&7)); + if (data) m_lcd.data[m_lcd.count/8]|=1<<(m_lcd.count&7); + if (m_lcd.count+1==40) { + logerror("%.4x lcd %02x%02x%02x%02x%02x\n",(int)m_maincpu->pc(), + m_lcd.data[0], m_lcd.data[1], m_lcd.data[2], m_lcd.data[3], m_lcd.data[4]); + } + m_lcd.count=(m_lcd.count+1)%40; + } + m_lcd.clock=clock; +} + + + +static const unsigned char ssystem3_palette[] = +{ + 0,12,12, + 80,82,75, + 0,12,12 +}; + + +PALETTE_INIT_MEMBER(ssystem3_state, ssystem3) +{ + int i; + + for ( i = 0; i < sizeof(ssystem3_palette) / 3; i++ ) { + m_palette->set_pen_color(i, ssystem3_palette[i*3], ssystem3_palette[i*3+1], ssystem3_palette[i*3+2]); + } +} + + +void ssystem3_state::video_start() +{ + // artwork seams to need this + m_videoram = auto_alloc_array(machine(), UINT8, 6 * 2 + 24); +} + + +static const char led[]={ + " aaaaaaaaaaaa\r" + " f aaaaaaaaaa b\r" + " ff aaaaaaaa bb\r" + " fff aaaaaa bbb\r" + " ffff bbbb\r" + " ffff bbbb\r" + " ffff bbbb\r" + " ffff bbbb\r" + " ffff bbbb\r" + " ffff bbbb\r" + " fff bbb\r" + " f gggggggg b\r" + " gggggggggggg\r" + " gggggggggggg\r" + " e gggggggg c\r" + " eee ccc\r" + " eeee cccc\r" + " eeee cccc\r" + "eeee cccc\r" + "eeee cccc\r" + "eeee cccc\r" + "eeee cccc\r" + "eee dddddd ccc\r" + "ee dddddddd cc\r" + "e dddddddddd c\r" + " dddddddddddd" +}; + +void ssystem3_state::ssystem3_draw_7segment(bitmap_ind16 &bitmap,int value, int x, int y) +{ + int i, xi, yi, mask, color; + + for (i=0, xi=0, yi=0; led[i]; i++) { + mask=0; + switch (led[i]) { + case 'a': mask=0x80; break; + case 'b': mask=0x40; break; + case 'c': mask=0x20; break; + case 'd': mask=0x10; break; + case 'e': mask=8; break; + case 'f': mask=4; break; + case 'g': mask=2; break; + case 'h': + // this is more likely wired to the separate leds + mask=1; + break; + } + + if (mask!=0) { + color=(value&mask)?1:0; + bitmap.pix16(y+yi, x+xi) = color; + } + if (led[i]!='\r') xi++; + else { yi++, xi=0; } + } +} + +static const struct { + int x,y; +} ssystem3_led_pos[5]={ + {150,123}, + {170,123}, + {200,123}, + {220,123}, + {125,123} +}; + +static const char single_led[]= +" c 1 1\r" +" bb ccccc bb 1 1\r" +" bb c bb 1 1\r" +" bb bb bb bb 1 1\r" +" bb bbbbbbbbbbb bb 111 111\r" +" 1 1\r" +" 99 9999999 99 1 1\r" +" 99 99 1 1\r" +" 88888888888 9 1 1\r" +" 88 8 9999\r" +" 8888 6666666 8 9999\r" +" 8888 6 6\r" +" 6 777 6\r" +" 6 777 6\r" +" 6 777 6\r" +" 6 777 6\r" +" 6 77777 6\r" +" 6 77777 6 2 2 4\r" +" 6 7777777 6 2 2 4\r" +" 6 7777777 6 2 2 4\r" +" 6 777777777 6 2 2 44444\r" +" 6 777777777 6 2 2 4\r" +" 6 77777777777 6 2 2 33433\r" +" 6 7 6 2 2 4\r" +" 6666666 7 6666666 2 2 4\r" +" 7 2 2 4\r" +" 77777777777777777\r" +"\r" +"\r" +"\r" +" 5555555555555555555 000000 000000 00 00 0000000 00 00 00000000 00 00 00 0000000\r" +"5 5 0000000 00000000 000 000 00000000 00 00 00000000 00 000 00 00000000\r" +"5 5 00 00 00 0000 0000 00 00 00 00 00 00 0000 00 00\r" +"5 5 00 00 00 00 00 00 00 00000000 00 00 00 00 00 00 00 00 0000\r" +"5 5 00 00 00 00 00 00 00 0000000 00 00 00 00 00 0000 00 00\r" +"5 5 0000000 00000000 00 0000 00 00 00000000 00 00 00 000 00000000\r" +" 55555555 55555555 000000 000000 00 00 00 00 000000 00 00 00 00 0000000" +; + +void ssystem3_state::ssystem3_draw_led(bitmap_ind16 &bitmap,INT16 color, int x, int y, int ch) +{ + int j, xi=0; + for (j=0; single_led[j]; j++) { + switch (single_led[j]) { + default: + if (ch==single_led[j]) { + bitmap.pix16(y, x+xi) = color; + } + xi++; + break; + case ' ': + xi++; + break; + case '\r': + xi=0; + y++; + break; + }; + } +} + +UINT32 ssystem3_state::screen_update_ssystem3(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + int i; + + for (i=0; i<4; i++) { + ssystem3_draw_7segment(bitmap, m_lcd.data[1+i], ssystem3_led_pos[i].x, ssystem3_led_pos[i].y); + } + + ssystem3_draw_led(bitmap, m_lcd.data[0]&1?1:0, ssystem3_led_pos[4].x, ssystem3_led_pos[4].y, '0'); //? + ssystem3_draw_led(bitmap, m_lcd.data[0]&2?1:0, ssystem3_led_pos[4].x, ssystem3_led_pos[4].y, '5'); + ssystem3_draw_led(bitmap, m_lcd.data[0]&4?1:0, ssystem3_led_pos[4].x, ssystem3_led_pos[4].y, '7'); + ssystem3_draw_led(bitmap, m_lcd.data[0]&8?1:0, ssystem3_led_pos[4].x, ssystem3_led_pos[4].y, 'b'); + ssystem3_draw_led(bitmap, m_lcd.data[0]&0x10?1:0, ssystem3_led_pos[4].x, ssystem3_led_pos[4].y, '9'); + ssystem3_draw_led(bitmap, m_lcd.data[0]&0x20?1:0, ssystem3_led_pos[4].x, ssystem3_led_pos[4].y, '8'); + ssystem3_draw_led(bitmap, m_lcd.data[0]&0x40?1:0, ssystem3_led_pos[4].x, ssystem3_led_pos[4].y, 'c'); + ssystem3_draw_led(bitmap, m_lcd.data[0]&0x80?1:0, ssystem3_led_pos[4].x, ssystem3_led_pos[4].y, '6'); + ssystem3_draw_led(bitmap, m_lcd.data[1]&1?1:0, ssystem3_led_pos[4].x, ssystem3_led_pos[4].y, '2'); + ssystem3_draw_led(bitmap, m_lcd.data[2]&1?1:0, ssystem3_led_pos[4].x, ssystem3_led_pos[4].y, '1'); //? + ssystem3_draw_led(bitmap, m_lcd.data[3]&1?1:0, ssystem3_led_pos[4].x, ssystem3_led_pos[4].y, '3'); + ssystem3_draw_led(bitmap, m_lcd.data[4]&1?1:0, ssystem3_led_pos[4].x, ssystem3_led_pos[4].y, '4'); + + if (m_configuration->read() & 1) { // playfield(optional device) + static const int lcd_signs_on[]={ + 0, // empty + 1, // bauer + 3, // springer + 0x11, // l??ufer + 7, // turm + 0x1f, // dame + 0x17, // k??nig + 0 + }; + int y, x; + for (y=0; y<8; y++) { + for (x=0; x<8; x++) { + int figure, black; + int xp=263+x*22; + int yp=55+(y^7)*28; + ssystem3_playfield_getfigure(x, y, &figure, &black); + ssystem3_draw_led(bitmap, lcd_signs_on[figure]&1?1:0, xp, yp, '6'); + ssystem3_draw_led(bitmap, lcd_signs_on[figure]&2?1:0, xp, yp, '8'); + ssystem3_draw_led(bitmap, lcd_signs_on[figure]&4?1:0, xp, yp, '9'); + ssystem3_draw_led(bitmap, lcd_signs_on[figure]&8?1:0, xp, yp, 'b'); + ssystem3_draw_led(bitmap, lcd_signs_on[figure]&0x10?1:0, xp, yp, 'c'); + ssystem3_draw_led(bitmap, figure!=0 && black?1:0, xp, yp, '7'); + } + } + } + + return 0; +} |