src/mess/video/hd66421.c
| r12418 | r12419 | |
| 58 | 58 | |
| 59 | 59 | typedef struct |
| 60 | 60 | { |
| 61 | | UINT8 idx, dat[32]; // index and data registers |
| 62 | | UINT8 *ram; // display ram |
| 63 | | UINT32 pos; // current position in ram |
| 61 | UINT8 cmd, reg[32]; |
| 62 | UINT8 *ram; |
| 63 | int x, y; |
| 64 | 64 | } HD66421; |
| 65 | 65 | |
| 66 | 66 | static HD66421 lcd; |
| r12418 | r12419 | |
| 68 | 68 | UINT8 hd66421_reg_idx_r(void) |
| 69 | 69 | { |
| 70 | 70 | _logerror( 2, ("hd66421_reg_idx_r\n")); |
| 71 | | return lcd.idx; |
| 71 | return lcd.cmd; |
| 72 | 72 | } |
| 73 | 73 | |
| 74 | 74 | void hd66421_reg_idx_w(UINT8 data) |
| 75 | 75 | { |
| 76 | 76 | _logerror( 2, ("hd66421_reg_idx_w (%02X)\n", data)); |
| 77 | | lcd.idx = data; |
| 77 | lcd.cmd = data; |
| 78 | 78 | } |
| 79 | 79 | |
| 80 | 80 | UINT8 hd66421_reg_dat_r(void) |
| 81 | 81 | { |
| 82 | 82 | _logerror( 2, ("hd66421_reg_dat_r\n")); |
| 83 | | return lcd.dat[lcd.idx]; |
| 83 | return lcd.reg[lcd.cmd]; |
| 84 | 84 | } |
| 85 | 85 | |
| 86 | 86 | void hd66421_reg_dat_w(UINT8 data) |
| 87 | 87 | { |
| 88 | 88 | _logerror( 2, ("hd66421_reg_dat_w (%02X)\n", data)); |
| 89 | | lcd.dat[lcd.idx] = data; |
| 90 | | switch (lcd.idx) |
| 89 | lcd.reg[lcd.cmd] = data; |
| 90 | switch (lcd.cmd) |
| 91 | 91 | { |
| 92 | | case LCD_REG_ADDR_Y : lcd.pos = data * HD66421_WIDTH / 4; break; |
| 93 | | case LCD_REG_RAM : lcd.ram[lcd.pos++] = data; break; |
| 92 | case LCD_REG_ADDR_X : |
| 93 | { |
| 94 | lcd.x = data; |
| 95 | } |
| 96 | break; |
| 97 | case LCD_REG_ADDR_Y : |
| 98 | { |
| 99 | lcd.y = data; |
| 100 | } |
| 101 | break; |
| 102 | case LCD_REG_RAM : |
| 103 | { |
| 104 | UINT8 r1; |
| 105 | *(lcd.ram + lcd.y * (HD66421_WIDTH / 4) + lcd.x) = data; |
| 106 | r1 = lcd.reg[LCD_REG_CONTROL_2]; |
| 107 | if (r1 & 0x02) |
| 108 | { |
| 109 | lcd.x++; |
| 110 | } |
| 111 | else |
| 112 | { |
| 113 | lcd.y++; |
| 114 | } |
| 115 | if (lcd.x >= (HD66421_WIDTH / 4)) |
| 116 | { |
| 117 | lcd.x = 0; |
| 118 | lcd.y++; |
| 119 | } |
| 120 | if (lcd.y >= HD66421_HEIGHT) |
| 121 | { |
| 122 | lcd.y = 0; |
| 123 | } |
| 124 | } |
| 125 | break; |
| 94 | 126 | } |
| 95 | 127 | } |
| 96 | 128 | |
| r12418 | r12419 | |
| 116 | 148 | static void hd66421_state_save(running_machine &machine) |
| 117 | 149 | { |
| 118 | 150 | const char *name = "hd66421"; |
| 119 | | state_save_register_item(machine, name, NULL, 0, lcd.idx); |
| 120 | | state_save_register_item_array(machine, name, NULL, 0, lcd.dat); |
| 121 | | state_save_register_item(machine, name, NULL, 0, lcd.pos); |
| 151 | state_save_register_item(machine, name, NULL, 0, lcd.cmd); |
| 152 | state_save_register_item_array(machine, name, NULL, 0, lcd.reg); |
| 153 | state_save_register_item(machine, name, NULL, 0, lcd.x); |
| 154 | state_save_register_item(machine, name, NULL, 0, lcd.y); |
| 122 | 155 | state_save_register_item_pointer(machine, name, NULL, 0, lcd.ram, HD66421_RAM_SIZE); |
| 123 | 156 | } |
| 124 | 157 | |
| r12418 | r12419 | |
| 140 | 173 | { |
| 141 | 174 | double bright; |
| 142 | 175 | int temp; |
| 143 | | temp = 31 - (lcd.dat[LCD_REG_COLOR_1+i] - lcd.dat[LCD_REG_CONTRAST] + 0x03); |
| 176 | temp = 31 - (lcd.reg[LCD_REG_COLOR_1+i] - lcd.reg[LCD_REG_CONTRAST] + 0x03); |
| 144 | 177 | if (temp < 0) temp = 0; |
| 145 | 178 | if (temp > 31) temp = 31; |
| 146 | 179 | bright = 1.0 * temp / 31; |
| r12418 | r12419 | |
| 152 | 185 | #endif |
| 153 | 186 | } |
| 154 | 187 | // draw bitmap (bottom to top) |
| 155 | | if (lcd.dat[0] & LCD_R0_DISP) |
| 188 | if (lcd.reg[0] & LCD_R0_DISP) |
| 156 | 189 | { |
| 157 | 190 | int x, y; |
| 158 | 191 | x = 0; |