+
+/* ========================================================================= */
+/* video tape definitions */
+/* ========================================================================= */
+
+/* some positions in the video tape control window */
+#define VIDEO_DATE_LABEL_XPOS (VIDEO_DISPLAY1_XPOS)
+#define VIDEO_DATE_LABEL_YPOS (VIDEO_DISPLAY1_YPOS)
+#define VIDEO_DATE_LABEL_XSIZE (VIDEO_DISPLAY_XSIZE)
+#define VIDEO_DATE_LABEL_YSIZE (VIDEO_DISPLAY_YSIZE)
+#define VIDEO_DATE_XPOS (VIDEO_DISPLAY1_XPOS + 2)
+#define VIDEO_DATE_YPOS (VIDEO_DISPLAY1_YPOS + 14)
+#define VIDEO_DATE_XSIZE (VIDEO_DISPLAY_XSIZE)
+#define VIDEO_DATE_YSIZE 16
+#define VIDEO_REC_LABEL_XPOS (VIDEO_DISPLAY2_XPOS)
+#define VIDEO_REC_LABEL_YPOS (VIDEO_DISPLAY2_YPOS)
+#define VIDEO_REC_LABEL_XSIZE 20
+#define VIDEO_REC_LABEL_YSIZE 12
+#define VIDEO_REC_SYMBOL_XPOS (VIDEO_DISPLAY2_XPOS + 20)
+#define VIDEO_REC_SYMBOL_YPOS (VIDEO_DISPLAY2_YPOS)
+#define VIDEO_REC_SYMBOL_XSIZE 16
+#define VIDEO_REC_SYMBOL_YSIZE 16
+#define VIDEO_PLAY_LABEL_XPOS (VIDEO_DISPLAY2_XPOS + 65)
+#define VIDEO_PLAY_LABEL_YPOS (VIDEO_DISPLAY2_YPOS)
+#define VIDEO_PLAY_LABEL_XSIZE 22
+#define VIDEO_PLAY_LABEL_YSIZE 12
+#define VIDEO_PLAY_SYMBOL_XPOS (VIDEO_DISPLAY2_XPOS + 52)
+#define VIDEO_PLAY_SYMBOL_YPOS (VIDEO_DISPLAY2_YPOS)
+#define VIDEO_PLAY_SYMBOL_XSIZE 11
+#define VIDEO_PLAY_SYMBOL_YSIZE 13
+#define VIDEO_PAUSE_LABEL_XPOS (VIDEO_DISPLAY2_XPOS)
+#define VIDEO_PAUSE_LABEL_YPOS (VIDEO_DISPLAY2_YPOS + 20)
+#define VIDEO_PAUSE_LABEL_XSIZE 35
+#define VIDEO_PAUSE_LABEL_YSIZE 8
+#define VIDEO_PAUSE_SYMBOL_XPOS (VIDEO_DISPLAY2_XPOS + 35)
+#define VIDEO_PAUSE_SYMBOL_YPOS (VIDEO_DISPLAY2_YPOS)
+#define VIDEO_PAUSE_SYMBOL_XSIZE 17
+#define VIDEO_PAUSE_SYMBOL_YSIZE 13
+#define VIDEO_TIME_XPOS (VIDEO_DISPLAY2_XPOS + 39)
+#define VIDEO_TIME_YPOS (VIDEO_DISPLAY2_YPOS + 14)
+#define VIDEO_TIME_XSIZE 50
+#define VIDEO_TIME_YSIZE 16
+
+/* some default values for tape labels and symbols */
+#define VIDEO_LABEL_XPOS 5
+#define VIDEO_LABEL_YPOS 42
+#define VIDEO_LABEL_XSIZE 40
+#define VIDEO_LABEL_YSIZE 28
+#define VIDEO_SYMBOL_XPOS 39
+#define VIDEO_SYMBOL_YPOS 42
+#define VIDEO_SYMBOL_XSIZE 56
+#define VIDEO_SYMBOL_YSIZE 13
+
+/* values for certain tape labels and symbols */
+#define VIDEO_FFWD_LABEL_XPOS VIDEO_LABEL_XPOS
+#define VIDEO_FFWD_LABEL_YPOS 193
+#define VIDEO_FFWD_LABEL_XSIZE VIDEO_LABEL_XSIZE
+#define VIDEO_FFWD_LABEL_YSIZE VIDEO_LABEL_YSIZE
+#define VIDEO_FFWD_SYMBOL_XPOS VIDEO_SYMBOL_XPOS
+#define VIDEO_FFWD_SYMBOL_YPOS 193
+#define VIDEO_FFWD_SYMBOL_XSIZE 27
+#define VIDEO_FFWD_SYMBOL_YSIZE VIDEO_SYMBOL_YSIZE
+
+#define VIDEO_PBEND_LABEL_XPOS VIDEO_LABEL_XPOS
+#define VIDEO_PBEND_LABEL_YPOS 221
+#define VIDEO_PBEND_LABEL_XSIZE VIDEO_LABEL_XSIZE
+#define VIDEO_PBEND_LABEL_YSIZE VIDEO_LABEL_YSIZE
+#define VIDEO_PBEND_SYMBOL_XPOS VIDEO_SYMBOL_XPOS
+#define VIDEO_PBEND_SYMBOL_YPOS 221
+#define VIDEO_PBEND_SYMBOL_XSIZE 27
+#define VIDEO_PBEND_SYMBOL_YSIZE VIDEO_SYMBOL_YSIZE
+
+#define VIDEO_WARP_LABEL_XPOS VIDEO_LABEL_XPOS
+#define VIDEO_WARP_LABEL_YPOS 165
+#define VIDEO_WARP_LABEL_XSIZE VIDEO_LABEL_XSIZE
+#define VIDEO_WARP_LABEL_YSIZE VIDEO_LABEL_YSIZE
+#define VIDEO_WARP_SYMBOL_XPOS VIDEO_SYMBOL_XPOS
+#define VIDEO_WARP_SYMBOL_YPOS 165
+#define VIDEO_WARP_SYMBOL_XSIZE 27
+#define VIDEO_WARP_SYMBOL_YSIZE VIDEO_SYMBOL_YSIZE
+#define VIDEO_WARP2_SYMBOL_XPOS VIDEO_SYMBOL_XPOS
+#define VIDEO_WARP2_SYMBOL_YPOS 152
+#define VIDEO_WARP2_SYMBOL_XSIZE 27
+#define VIDEO_WARP2_SYMBOL_YSIZE VIDEO_SYMBOL_YSIZE
+
+#define VIDEO_1STEP_SYMBOL_XPOS (VIDEO_SYMBOL_XPOS + 18)
+#define VIDEO_1STEP_SYMBOL_YPOS 139
+#define VIDEO_1STEP_SYMBOL_XSIZE (VIDEO_SYMBOL_XSIZE - 18)
+#define VIDEO_1STEP_SYMBOL_YSIZE VIDEO_SYMBOL_YSIZE
+
+#define PG_X3(x) (DOOR_GFX_PAGEX3 + (x))
+#define PG_X4(x) (DOOR_GFX_PAGEX4 + (x))
+#define PG_X5(x) (DOOR_GFX_PAGEX5 + (x))
+#define PG_X6(x) (DOOR_GFX_PAGEX6 + (x))
+
+#define PG_Y1(y) (DOOR_GFX_PAGEY1 + (y))
+#define PG_Y2(y) (DOOR_GFX_PAGEY2 + (y))
+
+#define VIDEO_INFO_OFF (VIDEO_STATE_DATE_OFF | \
+ VIDEO_STATE_TIME_OFF | \
+ VIDEO_STATE_FRAME_OFF)
+#define VIDEO_STATE_OFF (VIDEO_STATE_PLAY_OFF | \
+ VIDEO_STATE_REC_OFF | \
+ VIDEO_STATE_PAUSE_OFF | \
+ VIDEO_STATE_FFWD_OFF | \
+ VIDEO_STATE_PBEND_OFF | \
+ VIDEO_STATE_1STEP_OFF)
+#define VIDEO_PRESS_OFF (VIDEO_PRESS_PLAY_OFF | \
+ VIDEO_PRESS_REC_OFF | \
+ VIDEO_PRESS_PAUSE_OFF | \
+ VIDEO_PRESS_STOP_OFF | \
+ VIDEO_PRESS_EJECT_OFF)
+#define VIDEO_ALL_OFF (VIDEO_INFO_OFF | \
+ VIDEO_STATE_OFF | \
+ VIDEO_PRESS_OFF)
+
+#define VIDEO_INFO_ON (VIDEO_STATE_DATE_ON | \
+ VIDEO_STATE_TIME_ON | \
+ VIDEO_STATE_FRAME_ON)
+#define VIDEO_STATE_ON (VIDEO_STATE_PLAY_ON | \
+ VIDEO_STATE_REC_ON | \
+ VIDEO_STATE_PAUSE_ON | \
+ VIDEO_STATE_FFWD_ON | \
+ VIDEO_STATE_PBEND_ON | \
+ VIDEO_STATE_1STEP_ON)
+#define VIDEO_PRESS_ON (VIDEO_PRESS_PLAY_ON | \
+ VIDEO_PRESS_REC_ON | \
+ VIDEO_PRESS_PAUSE_ON | \
+ VIDEO_PRESS_STOP_ON | \
+ VIDEO_PRESS_EJECT_ON)
+#define VIDEO_ALL_ON (VIDEO_INFO_ON | \
+ VIDEO_STATE_ON | \
+ VIDEO_PRESS_ON)
+
+#define VIDEO_INFO (VIDEO_INFO_ON | VIDEO_INFO_OFF)
+#define VIDEO_STATE (VIDEO_STATE_ON | VIDEO_STATE_OFF)
+#define VIDEO_PRESS (VIDEO_PRESS_ON | VIDEO_PRESS_OFF)
+#define VIDEO_ALL (VIDEO_ALL_ON | VIDEO_ALL_OFF)
+
+#define NUM_TAPE_FUNCTIONS 11
+#define NUM_TAPE_FUNCTION_PARTS 2
+#define NUM_TAPE_FUNCTION_STATES 2
+
+
+/* ========================================================================= */
+/* video display functions */
+/* ========================================================================= */
+
+static void DrawVideoDisplay_Graphics(unsigned int state, unsigned int value)
+{
+ int i, j, k;
+
+ static struct
+ {
+ int graphic;
+ struct XY *pos;
+ }
+ video_pos[NUM_TAPE_FUNCTIONS][NUM_TAPE_FUNCTION_PARTS] =
+ {
+ {
+ { IMG_GFX_TAPE_LABEL_PLAY, &tape.label.play },
+ { IMG_GFX_TAPE_SYMBOL_PLAY, &tape.symbol.play },
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_RECORD, &tape.label.record },
+ { IMG_GFX_TAPE_SYMBOL_RECORD, &tape.symbol.record },
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_PAUSE, &tape.label.pause },
+ { IMG_GFX_TAPE_SYMBOL_PAUSE, &tape.symbol.pause },
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_DATE, &tape.label.date },
+ { -1, NULL },
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_TIME, &tape.label.time },
+ { -1, NULL },
+ },
+ {
+ /* (no label for displaying optional frame) */
+ { -1, NULL },
+ { -1, NULL },
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_FAST_FORWARD, &tape.label.fast_forward },
+ { IMG_GFX_TAPE_SYMBOL_FAST_FORWARD, &tape.symbol.fast_forward },
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_PAUSE_BEFORE_END, &tape.label.pause_before_end },
+ { IMG_GFX_TAPE_SYMBOL_PAUSE_BEFORE_END, &tape.symbol.pause_before_end },
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_WARP_FORWARD_BLIND, &tape.label.warp_forward_blind},
+ { IMG_GFX_TAPE_SYMBOL_WARP_FORWARD_BLIND, &tape.symbol.warp_forward_blind},
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_WARP_FORWARD, &tape.label.warp_forward },
+ { IMG_GFX_TAPE_SYMBOL_WARP_FORWARD, &tape.symbol.warp_forward },
+ },
+ {
+ { IMG_GFX_TAPE_LABEL_SINGLE_STEP, &tape.label.single_step },
+ { IMG_GFX_TAPE_SYMBOL_SINGLE_STEP, &tape.symbol.single_step },
+ },
+ };
+
+ for (k = 0; k < NUM_TAPE_FUNCTION_STATES; k++) /* on or off states */
+ {
+ for (i = 0; i < NUM_TAPE_FUNCTIONS; i++) /* record, play, ... */
+ {
+ for (j = 0; j < NUM_TAPE_FUNCTION_PARTS; j++) /* label or symbol */
+ {
+ int graphic = video_pos[i][j].graphic;
+ struct XY *pos = video_pos[i][j].pos;
+
+ if (graphic == -1 ||
+ pos->x == -1 ||
+ pos->y == -1)
+ continue;
+
+ if (state & (1 << (i * 2 + k)))
+ {
+ struct GraphicInfo *gfx_bg = &graphic_info[IMG_BACKGROUND_TAPE];
+ struct GraphicInfo *gfx = &graphic_info[graphic];
+ Bitmap *gd_bitmap;
+ int gd_x, gd_y;
+ int skip_value =
+ (j == 0 ? VIDEO_DISPLAY_SYMBOL_ONLY : VIDEO_DISPLAY_LABEL_ONLY);
+
+ if (value == skip_value)
+ continue;
+
+ if (k == 1) /* on */
+ {
+ gd_bitmap = gfx->bitmap;
+ gd_x = gfx->src_x;
+ gd_y = gfx->src_y;
+ }
+ else /* off */
+ {
+ gd_bitmap = gfx_bg->bitmap;
+ gd_x = gfx_bg->src_x + pos->x;
+ gd_y = gfx_bg->src_y + pos->y;
+ }
+
+ /* some tape graphics may be undefined -- only draw if defined */
+ if (gd_bitmap != NULL)
+ BlitBitmap(gd_bitmap, drawto, gd_x, gd_y, gfx->width, gfx->height,
+ VX + pos->x, VY + pos->y);
+
+ redraw_mask |= REDRAW_DOOR_2;
+ }
+ }
+ }
+ }
+}
+
+
+#define DATETIME_NONE (0)
+
+#define DATETIME_DATE_YYYY (1 << 0)
+#define DATETIME_DATE_YY (1 << 1)
+#define DATETIME_DATE_MON (1 << 2)
+#define DATETIME_DATE_MM (1 << 3)
+#define DATETIME_DATE_DD (1 << 4)
+
+#define DATETIME_TIME_HH (1 << 5)
+#define DATETIME_TIME_MIN (1 << 6)
+#define DATETIME_TIME_MM (1 << 7)
+#define DATETIME_TIME_SS (1 << 8)
+
+#define DATETIME_FRAME (1 << 9)
+
+#define DATETIME_XOFFSET_1 (1 << 10)
+#define DATETIME_XOFFSET_2 (1 << 11)
+
+#define DATETIME_DATE (DATETIME_DATE_YYYY | \
+ DATETIME_DATE_YY | \
+ DATETIME_DATE_MON | \
+ DATETIME_DATE_MM | \
+ DATETIME_DATE_DD)
+
+#define DATETIME_TIME (DATETIME_TIME_HH | \
+ DATETIME_TIME_MIN | \
+ DATETIME_TIME_MM | \
+ DATETIME_TIME_SS)
+
+#define MAX_DATETIME_STRING_SIZE 32
+
+static void DrawVideoDisplay_DateTime(unsigned int state, unsigned int value)