1
0
mirror of https://github.com/aap/pdp6.git synced 2026-01-11 23:53:31 +00:00
aap.pdp6/newemu/pdp6.h

328 lines
5.4 KiB
C

#include <stdbool.h>
typedef u64 Word;
typedef u32 Hword;
typedef struct PDP6 PDP6;
void addcleanup(void (*func)(void*), void *arg);
void exitcleanup(void);
#define F0 0400000000000
#define F1 0200000000000
#define F2 0100000000000
#define F3 0040000000000
#define F4 0020000000000
#define F5 0010000000000
#define F6 0004000000000
#define F7 0002000000000
#define F8 0001000000000
#define F9 0000400000000
#define F10 0000200000000
#define F11 0000100000000
#define F12 0000040000000
#define F13 0000020000000
#define F14 0000010000000
#define F15 0000004000000
#define F16 0000002000000
#define F17 0000001000000
#define F18 0000000400000
#define F19 0000000200000
#define F20 0000000100000
#define F21 0000000040000
#define F22 0000000020000
#define F23 0000000010000
#define F24 0000000004000
#define F25 0000000002000
#define F26 0000000001000
#define F27 0000000000400
#define F28 0000000000200
#define F29 0000000000100
#define F30 0000000000040
#define F31 0000000000020
#define F32 0000000000010
#define F33 0000000000004
#define F34 0000000000002
#define F35 0000000000001
#define LT 0777777000000
#define RT 0777777
#define FW 0777777777777
typedef u32 Code;
struct PDP6
{
int cycling;
int state, estate;
Code code;
bool key_start;
bool key_read_in;
bool key_mem_stop;
bool key_mem_cont;
bool key_inst_stop;
bool key_inst_cont;
bool key_ex;
bool key_ex_nxt;
bool key_dep;
bool key_dep_nxt;
bool key_io_reset;
bool key_execute;
bool key_manual; // for convenience
bool sw_power;
bool sw_mem_disable;
bool sw_addr_stop;
bool sw_repeat;
bool run;
bool key_rim_sbr;
bool mc_stop;
bool key_ex_st;
bool key_dep_st;
bool key_ex_sync;
bool key_dep_sync;
Word ar;
Word mq;
u8 mq36;
Word mb;
Word mi;
Word datasw;
Hword pc;
Hword ma;
Hword mas;
Hword ir;
Hword fe, sc; // 9 bits
Word iob;
u8 iob_req;
// SBR flip flops
// memory
bool key_rd_wr;
bool if1a;
bool af0, af3;
bool f1a, f4a, f6a;
bool sf3, sf5a, sf7;
bool uuo_f1;
bool blt_f0a;
bool iot_f0a;
bool chf6;
// AR
bool ar_com_cont;
bool af3a;
bool et4_ar_pause;
bool chf3;
bool blt_f3a, blt_f5a;
bool faf4;
bool msf1;
bool nrf1;
bool dsf1, dsf2, dsf3, dsf4, dsf5, dsf6, dsf8, dsf9;
// shift count
bool shf1;
bool chf4, lcf1, dcf1, faf3;
// SC add
bool chf2;
bool fsf1;
bool faf2;
bool fpf1, fpf2;
// exponent
bool fmf1;
bool fdf1;
// multiply
bool mpf1;
bool fmf2;
// divide
bool fdf2;
// misc FFs
bool faf1; // SC PAD enable
bool chf1; // SC PAD enable
bool nrf2; // ASHC enable
bool nrf3; // NR ROUND disable
bool dsf7; // division sign flag
bool mpf2; // multiply sign flag
bool iot_go;
// char state
bool chf5, chf7;
bool pi_active;
bool pi_cyc, pi_ov;
bool pi_on;
u8 pio, pir, pih, pi_req;
bool ex_user;
bool ex_mode_sync;
bool ex_pi_sync;
bool ex_uuo_sync;
bool ex_ill_op;
Hword pr, rlr, rla;
bool mem_busy;
bool mc_rq, mc_rd, mc_wr;
bool cpa_iot_user;
bool cpa_illeg_op;
bool cpa_non_exist_mem;
bool cpa_clock_enable;
bool cpa_clock_flag;
bool cpa_pc_chg_enable;
bool cpa_pdl_ov;
bool cpa_arov_enable;
u8 cpa_pia;
bool ar_cry0, ar_cry1;
bool ar_cry0_flag, ar_cry1_flag;
bool ar_ov_flag;
bool ar_pc_chg_flag;
/* PTP */
bool sw_ptr_motor_on;
bool sw_ptr_motor_off;
bool ptp_tape_feed;
bool ptp_motor_on;
bool ptp_busy;
bool ptp_flag;
bool ptp_b;
u8 ptp;
int ptp_pia;
int ptp_fd;
u64 ptp_punch_timer;
u64 ptp_motor_off_timer;
u64 ptp_motor_on_timer;
/* PTR */
bool ptr_tape_feed;
bool ptr_motor_on;
bool ptr_clutch;
u8 ptr_sr;
Word ptr;
bool ptr_busy;
bool ptr_flag;
bool ptr_b;
int ptr_pia;
FD ptr_fd;
u64 ptr_timer;
/* TTY */
u8 tty_pia;
bool tto_busy;
bool tto_flag;
bool tto_active;
u8 tto;
bool tti_busy;
bool tti_flag;
u8 tti;
//
int tty_baud, tty_dly;
FD tty_fd;
int tti_state;
u64 tti_timer;
u64 tto_timer;
FD netmem_fd;
bool dotrace;
u64 clk_timer;
/* temp - for time measurement */
u64 sim_start, sim_end;
u64 real_start, real_end;
bool ia_inh;
u64 ia_inh_timer;
};
void predecode(void);
void pwrclr(PDP6 *pdp);
void kt0(PDP6 *pdp);
void cycle(PDP6 *pdp);
void clr_run(PDP6 *pdp);
void handlenetmem(PDP6 *pdp);
extern u64 simtime;
extern u64 realtime;
enum {
IOB_CONO_CLR,
IOB_CONO_SET,
IOB_DATAO_CLR,
IOB_DATAO_SET,
IOB_DATAI,
IOB_STATUS,
IOB_RESET
};
typedef struct IOdev IOdev;
struct IOdev {
u8 req;
int devcode;
void *dev;
void (*handler)(PDP6 *pdp, IOdev *dev, int cmd);
void (*cycle)(PDP6 *pdp, IOdev *dev, int pwr);
};
void initdevs(PDP6 *pdp);
void installdev(PDP6 *pdp, IOdev *dev);
void cycle_io(PDP6 *pdp, int pwr);
void setreq(PDP6 *pdp, IOdev *dev, u8 req);
void attach_ptp(PDP6 *pdp);
void ptr_set_motor(PDP6 *pdp, int state);
void attach_ptr(PDP6 *pdp);
void attach_tty(PDP6 *pdp);
typedef struct Dis340 Dis340;
Dis340 *attach_dis(PDP6 *pdp);
void dis_connect(Dis340 *dis, int fd);
typedef struct Dc136 Dc136;
struct Dc136
{
PDP6 *pdp;
int pia;
int device;
int ch_mode;
Word da;
Word db;
int cct;
int sct;
bool data_clbd;
bool dbda_move;
bool darq;
bool dbrq;
bool inout;
};
Dc136 *attach_dc(PDP6 *pdp);
int dctkgv(Dc136 *dc, int dev, int ch, int rt);
typedef struct Ux555 Ux555;
typedef struct Ut551 Ut551;
Ut551 *attach_ut(PDP6 *pdp, Dc136 *dc);
Ux555 *attach_ux(Ut551 *ut, int num);
void uxmount(Ux555 *ux, const char *path);
void uxunmount(Ux555 *ux);
void attach_ge(PDP6 *pdp);
void initmusic(void);
void stopmusic(void);
void svc_music(PDP6 *pdp);