summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/includes/pdp1.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/includes/pdp1.h')
-rw-r--r--src/mess/includes/pdp1.h273
1 files changed, 273 insertions, 0 deletions
diff --git a/src/mess/includes/pdp1.h b/src/mess/includes/pdp1.h
new file mode 100644
index 00000000000..18b3633d502
--- /dev/null
+++ b/src/mess/includes/pdp1.h
@@ -0,0 +1,273 @@
+/*****************************************************************************
+ *
+ * includes/pdp1.h
+ *
+ ****************************************************************************/
+
+#ifndef PDP1_H_
+#define PDP1_H_
+
+
+/* defines for each bit and mask in input port "CSW" */
+enum
+{
+ /* bit numbers */
+ pdp1_control_bit = 0,
+
+ pdp1_extend_bit = 1,
+ pdp1_start_nobrk_bit= 2,
+ pdp1_start_brk_bit = 3,
+ pdp1_stop_bit = 4,
+ pdp1_continue_bit = 5,
+ pdp1_examine_bit = 6,
+ pdp1_deposit_bit = 7,
+ pdp1_read_in_bit = 8,
+ pdp1_reader_bit = 9,
+ pdp1_tape_feed_bit = 10,
+ pdp1_single_step_bit= 11,
+ pdp1_single_inst_bit= 12,
+
+ /* masks */
+ pdp1_control = (1 << pdp1_control_bit),
+ pdp1_extend = (1 << pdp1_extend_bit),
+ pdp1_start_nobrk = (1 << pdp1_start_nobrk_bit),
+ pdp1_start_brk = (1 << pdp1_start_brk_bit),
+ pdp1_stop = (1 << pdp1_stop_bit),
+ pdp1_continue = (1 << pdp1_continue_bit),
+ pdp1_examine = (1 << pdp1_examine_bit),
+ pdp1_deposit = (1 << pdp1_deposit_bit),
+ pdp1_read_in = (1 << pdp1_read_in_bit),
+ pdp1_reader = (1 << pdp1_reader_bit),
+ pdp1_tape_feed = (1 << pdp1_tape_feed_bit),
+ pdp1_single_step = (1 << pdp1_single_step_bit),
+ pdp1_single_inst = (1 << pdp1_single_inst_bit)
+};
+
+/* defines for each bit in input port pdp1_spacewar_controllers*/
+#define ROTATE_LEFT_PLAYER1 0x01
+#define ROTATE_RIGHT_PLAYER1 0x02
+#define THRUST_PLAYER1 0x04
+#define FIRE_PLAYER1 0x08
+#define ROTATE_LEFT_PLAYER2 0x10
+#define ROTATE_RIGHT_PLAYER2 0x20
+#define THRUST_PLAYER2 0x40
+#define FIRE_PLAYER2 0x80
+#define HSPACE_PLAYER1 0x100
+#define HSPACE_PLAYER2 0x200
+
+/* defines for each field in input port pdp1_config */
+enum
+{
+ pdp1_config_extend_bit = 0,
+ pdp1_config_extend_mask = 0x3, /* 2 bits */
+ pdp1_config_hw_mul_div_bit = 2,
+ pdp1_config_hw_mul_div_mask = 0x1,
+ /*pdp1_config_hw_obsolete_bit = 3,
+ pdp1_config_hw_obsolete_mask = 0x1,*/
+ pdp1_config_type_20_sbs_bit = 4,
+ pdp1_config_type_20_sbs_mask = 0x1,
+ pdp1_config_lightpen_bit = 5,
+ pdp1_config_lightpen_mask = 0x1
+};
+
+/* defines for each field in input port pdp1_lightpen_state */
+enum
+{
+ pdp1_lightpen_down_bit = 0,
+ pdp1_lightpen_smaller_bit = 1,
+ pdp1_lightpen_larger_bit = 2,
+
+ pdp1_lightpen_down = (1 << pdp1_lightpen_down_bit),
+ pdp1_lightpen_smaller = (1 << pdp1_lightpen_smaller_bit),
+ pdp1_lightpen_larger = (1 << pdp1_lightpen_larger_bit)
+};
+
+/* defines for our font */
+enum
+{
+ pdp1_charnum = /*104*/128, /* ASCII set + 8 special characters */
+ /* for whatever reason, 104 breaks some characters */
+
+ pdp1_fontdata_size = 8 * pdp1_charnum
+};
+
+enum
+{
+ /* size and position of crt window */
+ crt_window_width = 512,
+ crt_window_height = 512,
+ crt_window_offset_x = 0,
+ crt_window_offset_y = 0,
+ /* size and position of operator control panel window */
+ panel_window_width = 384,
+ panel_window_height = 128,
+ panel_window_offset_x = crt_window_width,
+ panel_window_offset_y = 0,
+ /* size and position of typewriter window */
+ typewriter_window_width = 640,
+ typewriter_window_height = 160,
+ typewriter_window_offset_x = 0,
+ typewriter_window_offset_y = crt_window_height
+};
+
+enum
+{
+ total_width = crt_window_width + panel_window_width,
+ total_height = crt_window_height + typewriter_window_height,
+
+ /* respect 4:3 aspect ratio to keep pixels square */
+ virtual_width_1 = ((total_width+3)/4)*4,
+ virtual_height_1 = ((total_height+2)/3)*3,
+ virtual_width_2 = virtual_height_1*4/3,
+ virtual_height_2 = virtual_width_1*3/4,
+ virtual_width = (virtual_width_1 > virtual_width_2) ? virtual_width_1 : virtual_width_2,
+ virtual_height = (virtual_height_1 > virtual_height_2) ? virtual_height_1 : virtual_height_2
+};
+
+enum
+{ /* refresh rate in Hz: can be changed at will */
+ refresh_rate = 60
+};
+
+/* Color codes */
+enum
+{
+ /* first pen_crt_num_levels colors used for CRT (with remanence) */
+ pen_crt_num_levels = 69,
+ pen_crt_max_intensity = pen_crt_num_levels-1,
+
+ /* next colors used for control panel and typewriter */
+ pen_black = pen_crt_num_levels,
+ pen_white,
+ pen_green,
+ pen_dk_green,
+ pen_red,
+ pen_lt_gray,
+
+ /* color constants for control panel */
+ pen_panel_bg = pen_black,
+ pen_panel_caption = pen_white,
+ color_panel_caption = 0,
+ pen_switch_nut = pen_lt_gray,
+ pen_switch_button = pen_white,
+ pen_lit_lamp = pen_green,
+ pen_unlit_lamp = pen_dk_green,
+
+ /* color constants for typewriter */
+ pen_typewriter_bg = pen_white,
+ color_typewriter_black = 1,
+ color_typewriter_red = 2,
+
+ /* color constants used for light pen */
+ pen_lightpen_nonpressed = pen_red,
+ pen_lightpen_pressed = pen_green
+};
+
+/* tape reader registers */
+typedef struct tape_reader_t
+{
+ device_image_interface *fd; /* file descriptor of tape image */
+
+ int motor_on; /* 1-bit reader motor on */
+
+ int rb; /* 18-bit reader buffer */
+ int rcl; /* 1-bit reader clutch */
+ int rc; /* 2-bit reader counter */
+ int rby; /* 1-bit reader binary mode flip-flop */
+ int rcp; /* 1-bit reader "need a completion pulse" flip-flop */
+
+ emu_timer *timer; /* timer to simulate reader timing */
+} tape_reader_t;
+
+
+
+/* tape puncher registers */
+typedef struct tape_puncher_t
+{
+ device_image_interface *fd; /* file descriptor of tape image */
+
+ emu_timer *timer; /* timer to generate completion pulses */
+} tape_puncher_t;
+
+
+
+/* typewriter registers */
+typedef struct typewriter_t
+{
+ device_image_interface *fd; /* file descriptor of output image */
+
+ int tb; /* typewriter buffer */
+
+ emu_timer *tyo_timer;/* timer to generate completion pulses */
+} typewriter_t;
+
+/* MIT parallel drum (mostly similar to type 23) */
+typedef struct parallel_drum_t
+{
+ device_image_interface *fd; /* file descriptor of drum image */
+
+ int il; /* initial location (12-bit) */
+ int wc; /* word counter (12-bit) */
+ int wcl; /* word core location counter (16-bit) */
+ int rfb; /* read field buffer (5-bit) */
+ int wfb; /* write field buffer (5-bit) */
+
+ int dba;
+
+ emu_timer *rotation_timer; /* timer called each time dc is 0 */
+ emu_timer *il_timer; /* timer called each time dc is il */
+} parallel_drum_t;
+
+
+typedef struct lightpen_t
+{
+ char active;
+ char down;
+ short x, y;
+ short radius;
+} lightpen_t;
+
+
+class pdp1_state : public driver_device
+{
+public:
+ pdp1_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag) { }
+
+ pdp1_reset_param_t m_reset_param;
+ int m_io_status;
+ tape_reader_t m_tape_reader;
+ tape_puncher_t m_tape_puncher;
+ typewriter_t m_typewriter;
+ emu_timer *m_dpy_timer;
+ lightpen_t m_lightpen;
+ parallel_drum_t m_parallel_drum;
+ int m_old_typewriter_keys[4];
+ int m_old_lightpen;
+ int m_old_control_keys;
+ int m_old_tw_keys;
+ int m_old_ta_keys;
+ int m_typewriter_color;
+ bitmap_ind16 m_panel_bitmap;
+ bitmap_ind16 m_typewriter_bitmap;
+ lightpen_t m_lightpen_state;
+ lightpen_t m_previous_lightpen_state;
+ int m_pos;
+ int m_case_shift;
+ device_t *m_crt;
+};
+
+
+
+/*----------- defined in video/pdp1.c -----------*/
+
+VIDEO_START( pdp1 );
+SCREEN_VBLANK( pdp1 );
+SCREEN_UPDATE_IND16( pdp1 );
+
+void pdp1_plot(running_machine &machine, int x, int y);
+void pdp1_typewriter_drawchar(running_machine &machine, int character);
+void pdp1_update_lightpen_state(running_machine &machine, const lightpen_t *new_state);
+
+
+#endif /* PDP1_H_ */