mirror of
https://github.com/aap/pdp6.git
synced 2026-01-13 15:27:46 +00:00
execution again
This commit is contained in:
parent
36f6269ff1
commit
20fd2cd681
423
apr.c
423
apr.c
@ -14,6 +14,22 @@ trace(char *fmt, ...)
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
#define SWAPLTRT(a) (a = (a)<<18 & LT | (a)>>18 & RT)
|
||||
#define CONS(a, b) ((a)< | (b)&RT)
|
||||
|
||||
void
|
||||
swap(word *a, word *b)
|
||||
{
|
||||
word tmp;
|
||||
tmp = *a;
|
||||
*a = *b;
|
||||
*b = tmp;
|
||||
}
|
||||
|
||||
// 6-10
|
||||
#define AR_OV_SET (apr->ar_cry0 != apr->ar_cry1)
|
||||
#define AR0_XOR_AROV (!!(apr->ar & F0) != apr->ar_cry0_xor_cry1)
|
||||
|
||||
/*
|
||||
* I'm a bit inconsistent with the decoding.
|
||||
* Some things are cached in variables,
|
||||
@ -49,7 +65,6 @@ trace(char *fmt, ...)
|
||||
#define FC_C_ACRT (apr->inst == POP || apr->inst == POPJ)
|
||||
#define FC_C_ACLT (apr->inst == JRA || apr->inst == BLT)
|
||||
|
||||
|
||||
// 5-8
|
||||
#define IR_MUL ((apr->inst & 0770) == 0220)
|
||||
#define IR_DIV ((apr->inst & 0770) == 0230)
|
||||
@ -63,6 +78,13 @@ trace(char *fmt, ...)
|
||||
#define AS_ADD (apr->ir_as && (apr->inst & 04) == 0)
|
||||
#define AS_SUB (apr->ir_as && apr->inst & 04)
|
||||
|
||||
// 5-10
|
||||
#define JP_JMP (apr->ir_jp && apr->inst != PUSH && apr->inst != POP)
|
||||
#define JP_FLAG_STOR (apr->inst == PUSHJ || apr->inst == JSR || apr->inst == JSP)
|
||||
// 6-3
|
||||
#define MB_PC_STO (apr->inst == PUSHJ || apr->inst == JSR || \
|
||||
apr->inst == JSP || apr->ir_jrst)
|
||||
|
||||
void
|
||||
decode_2xx(Apr *apr)
|
||||
{
|
||||
@ -113,13 +135,12 @@ decode_2xx(Apr *apr)
|
||||
|
||||
apr->ir_jp = (apr->inst & 0770) == 0260;
|
||||
if(apr->ir_jp){
|
||||
apr->e_long = 1;
|
||||
if(apr->inst == PUSHJ)
|
||||
apr->sc_e = apr->mb_pc_sto = 1;
|
||||
apr->sc_e = 1;
|
||||
if(apr->inst == PUSH)
|
||||
apr->sc_e = apr->fc_e = 1; // 5-4
|
||||
if(apr->inst == JSP || apr->inst == JSR)
|
||||
apr->mb_pc_sto = apr->fac_inh = 1; // 5-4
|
||||
apr->fac_inh = 1; // 5-4
|
||||
if(apr->inst == POP || apr->inst == JSR || apr->inst == JSA)
|
||||
apr->sc_e = 1;
|
||||
}
|
||||
@ -128,6 +149,7 @@ decode_2xx(Apr *apr)
|
||||
}
|
||||
|
||||
// 5-9
|
||||
#define IR_ACCP_MEMAC ((apr->inst & 0700) == 0300)
|
||||
#define ACCP ((apr->inst & 0760) == 0300)
|
||||
#define ACCP_DIR (ACCP && apr->inst & 010)
|
||||
#define MEMAC_TST ((apr->inst & 0760) == 0320)
|
||||
@ -136,24 +158,27 @@ decode_2xx(Apr *apr)
|
||||
#define MEMAC (MEMAC_TST || MEMAC_P1 || MEMAC_M1)
|
||||
#define MEMAC_MEM (MEMAC && apr->inst & 010)
|
||||
#define MEMAC_AC (MEMAC && (apr->inst & 010) == 0)
|
||||
#define ACCP_ETC_COND (IR_ACCP_MEMAC && apr->ir & H8 && AR0_XOR_AROV || \
|
||||
(apr->ir & H7) && apr->ar == 0)
|
||||
#define ACCP_ET_AL_TEST (ACCP_ETC_COND != !!(apr->ir & H6))
|
||||
|
||||
// 5-9
|
||||
#define HWT_LT (apr->hwt && (apr->inst & 040) == 0)
|
||||
#define HWT_RT (apr->hwt && apr->inst & 040)
|
||||
#define HWT_SWAP (apr->hwt && apr->inst & 04)
|
||||
#define HWT_AR_0 (apr->hwt && apr->inst & 030)
|
||||
#define HWT_LT (apr->ir_hwt && !(apr->inst & 040))
|
||||
#define HWT_RT (apr->ir_hwt && apr->inst & 040)
|
||||
#define HWT_SWAP (apr->ir_hwt && apr->inst & 04)
|
||||
#define HWT_AR_0 (apr->ir_hwt && apr->inst & 030)
|
||||
#define HWT_LT_SET (HWT_RT && apr->inst & 020 &&\
|
||||
((apr->inst & 010) == 0 || apr->mb & RSGN))
|
||||
(!(apr->inst & 010) || apr->mb & RSGN))
|
||||
#define HWT_RT_SET (HWT_LT && apr->inst & 020 &&\
|
||||
((apr->inst & 010) == 0 || apr->mb & SGN))
|
||||
(!(apr->inst & 010) || apr->mb & SGN))
|
||||
|
||||
// 5-9
|
||||
#define ACBM_DIR (apr->ir_acbm && apr->inst & 010)
|
||||
#define ACBM_SWAP (apr->ir_acbm && apr->inst & 01)
|
||||
#define ACBM_DN (apr->ir_acbm && (apr->inst & 060) == 0)
|
||||
#define ACBM_CL (apr->ir_acbm && (apr->inst & 060) == 1)
|
||||
#define ACBM_COM (apr->ir_acbm && (apr->inst & 060) == 2)
|
||||
#define ACBM_SET (apr->ir_acbm && (apr->inst & 060) == 3)
|
||||
#define ACBM_DN (apr->ir_acbm && (apr->inst & 060) == 000)
|
||||
#define ACBM_CL (apr->ir_acbm && (apr->inst & 060) == 020)
|
||||
#define ACBM_COM (apr->ir_acbm && (apr->inst & 060) == 040)
|
||||
#define ACBM_SET (apr->ir_acbm && (apr->inst & 060) == 060)
|
||||
|
||||
// 5-8
|
||||
#define UUO_A ((apr->inst & 0700) == 0)
|
||||
@ -184,8 +209,6 @@ decodeir(Apr *apr)
|
||||
apr->fac_inh = 0;
|
||||
apr->fc_e = 0;
|
||||
apr->fc_e_pse = 0;
|
||||
apr->e_long = 0;
|
||||
apr->mb_pc_sto = 0;
|
||||
apr->sc_e = 0;
|
||||
apr->sac_inh = 0;
|
||||
apr->sac2 = 0;
|
||||
@ -215,12 +238,11 @@ decodeir(Apr *apr)
|
||||
decode_2xx(apr); // 5-8
|
||||
|
||||
/* ACCP v MEMAC */
|
||||
if((apr->inst & 0700) == 0300){
|
||||
if(IR_ACCP_MEMAC){
|
||||
if(MEMAC_MEM)
|
||||
apr->fac_inh = apr->fc_e_pse = 1; // 5-4
|
||||
if(ACCP_DIR)
|
||||
apr->fc_e = 1; // 5-4
|
||||
apr->e_long = 1;
|
||||
if(ACCP)
|
||||
apr->sac_inh = 1;
|
||||
}
|
||||
@ -269,7 +291,6 @@ decodeir(Apr *apr)
|
||||
if(apr->ir_acbm){
|
||||
if(ACBM_DIR)
|
||||
apr->fc_e = 1; // 5-4
|
||||
apr->e_long = 1;
|
||||
if(!(apr->inst & 060))
|
||||
apr->sac_inh = 1;
|
||||
}
|
||||
@ -285,93 +306,26 @@ decodeir(Apr *apr)
|
||||
apr->ir_jrst = !apr->ex_ir_uuo && JRST_A; // 5-8
|
||||
apr->ir_iot = !apr->ex_ir_uuo && IOT_A; // 5-8
|
||||
|
||||
if(apr->ir_jrst)
|
||||
apr->mb_pc_sto = 1;
|
||||
|
||||
if(apr->ex_ir_uuo || apr->ir_iot)
|
||||
apr->fac_inh = 1; // 5-4
|
||||
if(IOT_BLK)
|
||||
apr->fc_e_pse = 1; // 5-4
|
||||
if(IOT_DATAO) // 8-1
|
||||
apr->fc_e = 1; // 5-4
|
||||
/* No need to check PC +1 for E LONG, it's already implied.
|
||||
* We have to wait until ET5 for PC SET */
|
||||
if(apr->ir_iot && (apr->inst & 0300) == 0300 || /* CONSZ, CONSO */
|
||||
apr->mb_pc_sto)
|
||||
apr->e_long = 1;
|
||||
if(apr->ir_iot && (apr->ir & 0140) == 040) /* DATAI, CONI */
|
||||
apr->sc_e = 1;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
swap(word *a, word *b)
|
||||
{
|
||||
word tmp;
|
||||
tmp = *a;
|
||||
*a = *b;
|
||||
*b = tmp;
|
||||
}
|
||||
|
||||
void
|
||||
swapltrt(word *a)
|
||||
{
|
||||
*a = *a<<18 & LT | *a>>18 & RT;
|
||||
}
|
||||
|
||||
bool
|
||||
accp_et_al_test(Apr *apr)
|
||||
{
|
||||
bool lt, cond;
|
||||
// 5-9
|
||||
lt = !!(apr->ar & SGN) != apr->ar_cry0_xor_cry1;
|
||||
cond = (apr->inst & 2) && apr->ar == 0 ||
|
||||
(ACCP || MEMAC) && (apr->inst & 1) && lt;
|
||||
return cond != !!(apr->inst & 040);
|
||||
}
|
||||
|
||||
bool
|
||||
selected_flag(Apr *apr)
|
||||
{
|
||||
// 5-12
|
||||
return apr->ir & 0400 && apr->ar_ov_flag ||
|
||||
apr->ir & 0200 && apr->ar_cry0_flag ||
|
||||
apr->ir & 0100 && apr->ar_cry1_flag ||
|
||||
apr->ir & 0040 && apr->ar_pc_chg_flag;
|
||||
}
|
||||
|
||||
void
|
||||
selected_flags_clr(Apr *apr)
|
||||
ar_jfcl_clr(Apr *apr)
|
||||
{
|
||||
// 6-10
|
||||
if(apr->ir & 0400) apr->ar_ov_flag = 0;
|
||||
if(apr->ir & 0200) apr->ar_cry0_flag = 0;
|
||||
if(apr->ir & 0100) apr->ar_cry1_flag = 0;
|
||||
if(apr->ir & 0040) apr->ar_pc_chg_flag = 0;
|
||||
if(apr->ir & H9) apr->ar_ov_flag = 0;
|
||||
if(apr->ir & H10) apr->ar_cry0_flag = 0;
|
||||
if(apr->ir & H11) apr->ar_cry1_flag = 0;
|
||||
if(apr->ir & H12) apr->ar_pc_chg_flag = 0;
|
||||
}
|
||||
|
||||
bool
|
||||
pc_set_enable(Apr *apr)
|
||||
{
|
||||
// 5-12
|
||||
return apr->inst == AOBJP && !(apr->ar & SGN) ||
|
||||
apr->inst == AOBJN && apr->ar & SGN ||
|
||||
MEMAC_AC && accp_et_al_test(apr) ||
|
||||
apr->inst == JFCL && selected_flag(apr);
|
||||
}
|
||||
|
||||
bool
|
||||
pc_inc_enable(Apr *apr)
|
||||
{
|
||||
// 5-12
|
||||
return (ACCP || apr->ir_acbm || MEMAC_MEM) && accp_et_al_test(apr) ||
|
||||
apr->ir_iot && ((apr->inst & 0340) == 0300 && apr->ar == 0 ||
|
||||
(apr->inst & 0340) == 0340 && apr->ar != 0);
|
||||
}
|
||||
|
||||
// 6-10
|
||||
#define AR_OV_SET (apr->ar_cry0 != apr->ar_cry1)
|
||||
|
||||
void
|
||||
ar_cry(Apr *apr)
|
||||
{
|
||||
@ -383,10 +337,10 @@ void
|
||||
ar_cry_in(Apr *apr, word c)
|
||||
{
|
||||
word a;
|
||||
a = (apr->ar & 0377777777777) + c;
|
||||
a = (apr->ar & ~F0) + c;
|
||||
apr->ar += c;
|
||||
apr->ar_cry0 = !!(apr->ar & 01000000000000);
|
||||
apr->ar_cry1 = !!(a & 0400000000000);
|
||||
apr->ar_cry0 = !!(apr->ar & FCRY);
|
||||
apr->ar_cry1 = !!(a & F0);
|
||||
apr->ar &= FW;
|
||||
ar_cry(apr);
|
||||
}
|
||||
@ -424,7 +378,7 @@ get_pi_req(Apr *apr)
|
||||
|
||||
/* clear highest held break */
|
||||
void
|
||||
dismiss_break(Apr *apr)
|
||||
clear_pih(Apr *apr)
|
||||
{
|
||||
// 8-3
|
||||
int chan;
|
||||
@ -440,6 +394,7 @@ dismiss_break(Apr *apr)
|
||||
void
|
||||
set_pir(Apr *apr, int pir)
|
||||
{
|
||||
// 8-3
|
||||
/* held breaks aren't retriggered */
|
||||
apr->pir = pir & ~apr->pih;
|
||||
apr->pi_req = get_pi_req(apr);
|
||||
@ -448,6 +403,7 @@ set_pir(Apr *apr, int pir)
|
||||
void
|
||||
set_pih(Apr *apr, int pih)
|
||||
{
|
||||
// 8-3
|
||||
apr->pih = pih;
|
||||
apr->pir &= ~apr->pih;
|
||||
apr->pi_req = get_pi_req(apr);
|
||||
@ -567,12 +523,12 @@ pulse(ar_flag_clr){
|
||||
|
||||
pulse(ar_flag_set){
|
||||
trace("AR FLAG SET\n");
|
||||
apr->ar_ov_flag = !!(apr->mb & 0400000000000); // 6-10
|
||||
apr->ar_cry0_flag = !!(apr->mb & 0200000000000); // 6-10
|
||||
apr->ar_cry1_flag = !!(apr->mb & 0100000000000); // 6-10
|
||||
apr->ar_pc_chg_flag = !!(apr->mb & 0040000000000); // 6-10
|
||||
apr->chf7 = !!(apr->mb & 0020000000000); // 6-19
|
||||
if(apr->mb & 0010000000000)
|
||||
apr->ar_ov_flag = !!(apr->mb & F0); // 6-10
|
||||
apr->ar_cry0_flag = !!(apr->mb & F1); // 6-10
|
||||
apr->ar_cry1_flag = !!(apr->mb & F2); // 6-10
|
||||
apr->ar_pc_chg_flag = !!(apr->mb & F3); // 6-10
|
||||
apr->chf7 = !!(apr->mb & F4); // 6-19
|
||||
if(apr->mb & F5)
|
||||
set_ex_mode_sync(apr, 1); // 5-13
|
||||
}
|
||||
|
||||
@ -629,17 +585,19 @@ pulse(ex_clr){
|
||||
pulse(mr_start){
|
||||
trace("MR START\n");
|
||||
// IOB RESET
|
||||
apr->cpa_iot_user = 0; // 8-5
|
||||
apr->cpa_illeg_op = 0; // 8-5
|
||||
apr->cpa_non_exist_mem = 0; // 8-5
|
||||
apr->cpa_clock_en = 0; // 8-5
|
||||
apr->cpa_clock_flag = 0; // 8-5
|
||||
apr->cpa_pc_chg_en = 0; // 8-5
|
||||
apr->cpa_pdl_ov = 0; // 8-5
|
||||
apr->cpa_arov_en = 0; // 8-5
|
||||
apr->cpa_pia33 = 0; // 8-5
|
||||
apr->cpa_pia34 = 0; // 8-5
|
||||
apr->cpa_pia35 = 0; // 8-5
|
||||
|
||||
// 8-5
|
||||
apr->cpa_iot_user = 0;
|
||||
apr->cpa_illeg_op = 0;
|
||||
apr->cpa_non_exist_mem = 0;
|
||||
apr->cpa_clock_enable = 0;
|
||||
apr->cpa_clock_flag = 0;
|
||||
apr->cpa_pc_chg_enable = 0;
|
||||
apr->cpa_pdl_ov = 0;
|
||||
apr->cpa_arov_enable = 0;
|
||||
apr->cpa_pia33 = 0;
|
||||
apr->cpa_pia34 = 0;
|
||||
apr->cpa_pia35 = 0;
|
||||
|
||||
// PI
|
||||
apr->pi_ov = 0; // 8-4
|
||||
@ -662,8 +620,11 @@ pulse(mr_pwr_clr){
|
||||
nextpulse(apr, mr_clr); // 5-2
|
||||
}
|
||||
|
||||
pulse(st7){
|
||||
trace("ST7\n");
|
||||
/*
|
||||
* IOT
|
||||
*/
|
||||
|
||||
pulse(iot_t0){
|
||||
}
|
||||
|
||||
/*
|
||||
@ -805,7 +766,8 @@ pulse(ar_ast0){
|
||||
* Priority Interrupt
|
||||
*/
|
||||
|
||||
#define IA_NOT_INT ((!apr->pi_req || apr->pi_cyc) && apr->ia_inh)
|
||||
// 5-3
|
||||
#define IA_NOT_INT ((!apr->pi_req || apr->pi_cyc) && !apr->ia_inh)
|
||||
// 8-4
|
||||
#define PI_BLK_RST (!apr->pi_ov && IOT_DATAIO)
|
||||
#define PI_RST (apr->ir_jrst && apr->ir & 0400 || PI_BLK_RST && apr->pi_cyc)
|
||||
@ -845,6 +807,10 @@ pulse(pi_sync){
|
||||
* Store
|
||||
*/
|
||||
|
||||
pulse(st7){
|
||||
trace("ST7\n");
|
||||
}
|
||||
|
||||
pulse(st3){
|
||||
trace("ST3\n");
|
||||
apr->sf3 = 0;
|
||||
@ -874,41 +840,56 @@ pulse(st1){
|
||||
#define PC_P1_INH (KEY_EXECUTE || (CH_INC_OP || CH_N_INC_OP) && apr->inst != CAO || \
|
||||
apr->inst == XCT || apr->ex_ir_uuo || apr->pi_cyc || \
|
||||
IOT_BLK || apr->inst == BLT)
|
||||
// 5-12
|
||||
#define JFCL_FLAGS (apr->ir & 0400 && apr->ar_ov_flag || \
|
||||
apr->ir & 0200 && apr->ar_cry0_flag || \
|
||||
apr->ir & 0100 && apr->ar_cry1_flag || \
|
||||
apr->ir & 0040 && apr->ar_pc_chg_flag)
|
||||
#define PC_SET_ENABLE (MEMAC_AC && ACCP_ET_AL_TEST || \
|
||||
apr->inst == AOBJN && apr->ar & SGN || \
|
||||
apr->inst == AOBJP && !(apr->ar & SGN) || \
|
||||
apr->inst == JFCL && JFCL_FLAGS)
|
||||
#define PC_INC_ENABLE ((MEMAC_MEM || ACCP || apr->ir_acbm) && ACCP_ET_AL_TEST || \
|
||||
IOT_CONSO && apr->ar != 0 || IOT_CONSZ && apr->ar == 0)
|
||||
#define PC_SET (PC_SET_ENABLE || JP_JMP || apr->ir_jrst)
|
||||
#define PC_INC_ET9 (apr->inst == JSR || apr->inst == JSA || PC_INC_ENABLE)
|
||||
// 5-5
|
||||
#define E_LONG (IOT_CONSZ || apr->ir_jp || apr->ir_acbm || apr->pc_set || \
|
||||
MB_PC_STO || PC_INC_ET9 || IOT_CONSO || IR_ACCP_MEMAC)
|
||||
|
||||
pulse(et10){
|
||||
trace("ET10\n");
|
||||
|
||||
if(PI_HOLD){
|
||||
// 8-4
|
||||
apr->pi_ov = 0;
|
||||
apr->pi_cyc = 0;
|
||||
}
|
||||
if(apr->ir_jrst || apr->inst == PUSHJ || apr->inst == PUSH)
|
||||
apr->ma |= apr->mb & RT;
|
||||
if(apr->inst == PUSH || apr->inst == PUSHJ || apr->ir_jrst)
|
||||
apr->ma |= apr->mb & RT; // 7-3
|
||||
if((apr->fc_e_pse || apr->sc_e) &&
|
||||
!(apr->ir_jp || apr->inst == EXCH || CH_DEP))
|
||||
apr->mb = apr->ar;
|
||||
if(apr->ir_jp && !(apr->inst & 04))
|
||||
swap(&apr->mb, &apr->ar);
|
||||
apr->mb = apr->ar; // 6-3
|
||||
if(apr->ir_jp && !(apr->ir & H6))
|
||||
swap(&apr->mb, &apr->ar); // 6-3
|
||||
if(MEMAC || apr->ir_as){
|
||||
// 6-10
|
||||
apr->ar_cry0_flag = apr->ar_cry0;
|
||||
apr->ar_cry1_flag = apr->ar_cry1;
|
||||
}
|
||||
|
||||
if(apr->hwt_10 || apr->hwt_11 || apr->fwt_10 || apr->fwt_11 ||
|
||||
MEMAC_MEM)
|
||||
apr->mb = apr->ar;
|
||||
if(apr->ir_fwt && !apr->ar_cry0 && apr->ar_cry1 ||
|
||||
(MEMAC || apr->ir_as) && apr->ar_cry0 != apr->ar_cry1){
|
||||
(MEMAC || apr->ir_as) && AR_OV_SET){
|
||||
apr->ar_ov_flag = 1; // 6-10
|
||||
if(apr->cpa_arov_en)
|
||||
;
|
||||
if(apr->cpa_arov_enable)
|
||||
; // TODO
|
||||
}
|
||||
if(apr->ir_jp && !(apr->inst & 04) && apr->ar_cry0){
|
||||
apr->cpa_pdl_ov = 1;
|
||||
;
|
||||
if(apr->ir_jp && !(apr->ir & H6) && apr->ar_cry0){
|
||||
apr->cpa_pdl_ov = 1; // 8-5
|
||||
; // TODO
|
||||
}
|
||||
if(apr->inst == JFCL)
|
||||
selected_flags_clr(apr);
|
||||
ar_jfcl_clr(apr); // 6-10
|
||||
nextpulse(apr, apr->sc_e ? st1 :
|
||||
apr->fc_e_pse ? st2 :
|
||||
st3);
|
||||
@ -918,22 +899,22 @@ pulse(et9){
|
||||
bool pc_inc;
|
||||
|
||||
trace("ET9\n");
|
||||
pc_inc = apr->inst == JSR || apr->inst == JSA || pc_inc_enable(apr);
|
||||
pc_inc = PC_INC_ET9;
|
||||
if(pc_inc)
|
||||
apr->pc = apr->pc+1 & FW;
|
||||
if((apr->pc_set || pc_inc) && !(apr->ir_jrst && apr->ir & 0100)){
|
||||
apr->ar_pc_chg_flag = 1;
|
||||
if(apr->cpa_pc_chg_en)
|
||||
apr->pc = apr->pc+1 & FW; // 5-12
|
||||
if((apr->pc_set || pc_inc) && !(apr->ir_jrst && apr->ir & H11)){
|
||||
apr->ar_pc_chg_flag = 1; // 6-10
|
||||
if(apr->cpa_pc_chg_enable) // 8-1
|
||||
;
|
||||
}
|
||||
|
||||
if(apr->ir_acbm || apr->ir_jp && apr->inst != JSR)
|
||||
swap(&apr->mb, &apr->ar);
|
||||
if(apr->ir_jrst || apr->inst == PUSHJ || apr->inst == PUSH)
|
||||
apr->ma = 0;
|
||||
swap(&apr->mb, &apr->ar); // 6-3
|
||||
if(apr->inst == PUSH || apr->inst == PUSHJ || apr->ir_jrst)
|
||||
apr->ma = 0; // 7-3
|
||||
if(apr->inst == JSR)
|
||||
apr->chf7 = 0;
|
||||
nextpulse(apr, et10);
|
||||
apr->chf7 = 0; // 6-19
|
||||
nextpulse(apr, et10); // 5-5
|
||||
}
|
||||
|
||||
pulse(et8){
|
||||
@ -941,8 +922,8 @@ pulse(et8){
|
||||
if(apr->pc_set)
|
||||
apr->pc |= apr->ma; // 5-12
|
||||
if(apr->inst == JSR)
|
||||
apr->ex_ill_op = 0;
|
||||
nextpulse(apr, et9);
|
||||
apr->ex_ill_op = 0; // 5-13
|
||||
nextpulse(apr, et9); // 5-5
|
||||
}
|
||||
|
||||
pulse(et7){
|
||||
@ -951,77 +932,73 @@ pulse(et7){
|
||||
apr->pc = 0; // 5-12
|
||||
if(apr->inst == JSR && (apr->ex_pi_sync || apr->ex_ill_op))
|
||||
apr->ex_user = 0; // 5-13
|
||||
|
||||
if(apr->ir_acbm)
|
||||
apr->ar = ~apr->ar;
|
||||
nextpulse(apr, et8);
|
||||
apr->ar = ~apr->ar & FW; // 6-8
|
||||
nextpulse(apr, et8); // 5-5
|
||||
}
|
||||
|
||||
pulse(et6){
|
||||
trace("ET6\n");
|
||||
if(apr->mb_pc_sto || apr->inst == JSA)
|
||||
apr->mb |= apr->pc;
|
||||
if(apr->inst == PUSHJ || apr->inst == JSR || apr->inst == JSP){
|
||||
if(MB_PC_STO || apr->inst == JSA)
|
||||
apr->mb |= apr->pc; // 6-3
|
||||
if(ACBM_CL)
|
||||
apr->mb &= apr->ar; // 6-3
|
||||
if(JP_FLAG_STOR){ // 6-4
|
||||
// 6-4
|
||||
if(apr->ar_ov_flag) apr->mb |= 0400000000000;
|
||||
if(apr->ar_cry0_flag) apr->mb |= 0200000000000;
|
||||
if(apr->ar_cry1_flag) apr->mb |= 0100000000000;
|
||||
if(apr->ar_pc_chg_flag) apr->mb |= 0040000000000;
|
||||
if(apr->chf7) apr->mb |= 0020000000000;
|
||||
if(apr->ex_user) apr->mb |= 0010000000000;
|
||||
if(apr->ar_ov_flag) apr->mb |= F0;
|
||||
if(apr->ar_cry0_flag) apr->mb |= F1;
|
||||
if(apr->ar_cry1_flag) apr->mb |= F2;
|
||||
if(apr->ar_pc_chg_flag) apr->mb |= F3;
|
||||
if(apr->chf7) apr->mb |= F4;
|
||||
if(apr->ex_user) apr->mb |= F5;
|
||||
}
|
||||
|
||||
if(apr->ir_acbm && (apr->inst & 060) == 020) /* Z */
|
||||
apr->mb &= apr->ar;
|
||||
nextpulse(apr, et7);
|
||||
if(IOT_CONSZ || IOT_CONSO)
|
||||
apr->ar &= apr->mb; // 6-8
|
||||
nextpulse(apr, et7); // 5-5
|
||||
}
|
||||
|
||||
pulse(et5){
|
||||
trace("ET5\n");
|
||||
if(apr->mb_pc_sto)
|
||||
apr->mb = 0;
|
||||
|
||||
if(MB_PC_STO)
|
||||
apr->mb = 0; // 6-3
|
||||
if(apr->ir_acbm)
|
||||
apr->ar = ~apr->ar;
|
||||
|
||||
// 5-12
|
||||
apr->pc_set = apr->ir_jp && !(apr->inst == PUSH || apr->inst == POP) ||
|
||||
apr->ir_jrst ||
|
||||
pc_set_enable(apr);
|
||||
nextpulse(apr, apr->e_long || apr->pc_set ? et6 : et10);
|
||||
apr->ar = ~apr->ar & FW; // 6-8
|
||||
apr->pc_set = PC_SET;
|
||||
nextpulse(apr, E_LONG ? et6 : et10); // 5-5
|
||||
}
|
||||
|
||||
pulse(et4){
|
||||
bool hwt_lt, hwt_rt;
|
||||
|
||||
trace("ET4\n");
|
||||
apr->et4_ar_pse = 0; // 5-5
|
||||
if(IOT_BLK)
|
||||
apr->ex_ill_op = 0; // 5-13
|
||||
|
||||
// 6-8
|
||||
if(apr->ir_boole && (apr->ir_boole_op == 04 ||
|
||||
apr->ir_boole_op == 010 ||
|
||||
apr->ir_boole_op == 011 ||
|
||||
apr->ir_boole_op == 014 ||
|
||||
apr->ir_boole_op == 015 ||
|
||||
apr->ir_boole_op == 016 ||
|
||||
apr->ir_boole_op == 017))
|
||||
apr->ar = ~apr->ar & FW; // 6-8
|
||||
apr->ir_boole_op == 010 ||
|
||||
apr->ir_boole_op == 011 ||
|
||||
apr->ir_boole_op == 014 ||
|
||||
apr->ir_boole_op == 015 ||
|
||||
apr->ir_boole_op == 016 ||
|
||||
apr->ir_boole_op == 017))
|
||||
apr->ar = ~apr->ar & FW;
|
||||
if(HWT_LT || IOT_CONO)
|
||||
apr->ar = CONS(apr->mb, apr->ar);
|
||||
if(HWT_RT)
|
||||
apr->ar = CONS(apr->ar, apr->mb);
|
||||
if(HWT_LT_SET)
|
||||
apr->ar = CONS(~apr->ar, apr->ar);
|
||||
if(HWT_RT_SET)
|
||||
apr->ar = CONS(apr->ar, ~apr->ar);
|
||||
|
||||
hwt_lt = apr->ir_hwt && !(apr->inst & 040);
|
||||
hwt_rt = apr->ir_hwt && apr->inst & 040;
|
||||
if(hwt_rt && apr->inst & 020 && (!(apr->inst & 010) || apr->mb & RSGN))
|
||||
apr->ar = apr->ar & ~LT | ~apr->ar & LT;
|
||||
if(hwt_lt && apr->inst & 020 && (!(apr->inst & 010) || apr->mb & SGN))
|
||||
apr->ar = apr->ar & ~RT | ~apr->ar & RT;
|
||||
if(hwt_lt)
|
||||
apr->ar = apr->ar & ~LT | apr->mb & LT;
|
||||
if(hwt_rt)
|
||||
apr->ar = apr->ar & ~RT | apr->mb & RT;
|
||||
|
||||
if(FWT_SWAP)
|
||||
if(FWT_SWAP || IOT_BLK || apr->ir_acbm)
|
||||
swap(&apr->mb, &apr->ar); // 6-3
|
||||
|
||||
if(apr->ir_acbm)
|
||||
swap(&apr->mb, &apr->ar);
|
||||
if(apr->ir_iot && ~IOT_BLK)
|
||||
apr->iot_go = 1; // 8-1
|
||||
if(IOT_BLK)
|
||||
nextpulse(apr, iot_t0); // 8-1
|
||||
|
||||
if(!ET5_INH)
|
||||
nextpulse(apr, et5); // 5-5
|
||||
}
|
||||
@ -1029,6 +1006,11 @@ pulse(et4){
|
||||
pulse(et3){
|
||||
trace("ET3\n");
|
||||
|
||||
if(apr->ex_ir_uuo){
|
||||
apr->mb = apr->ir & 0777740 | 037; // 6-3, 6-1
|
||||
apr->ma |= F30; // 7-3
|
||||
}
|
||||
|
||||
if(apr->inst == POPJ || apr->inst == BLT)
|
||||
apr->ma = apr->mb & RT; // 7-3
|
||||
|
||||
@ -1055,47 +1037,48 @@ pulse(et3){
|
||||
pulse(et1){
|
||||
trace("ET1\n");
|
||||
|
||||
if(apr->ex_ir_uuo)
|
||||
if(apr->ex_ir_uuo){
|
||||
apr->ex_ill_op = 1; // 5-13
|
||||
apr->mb &= RT; // 6-3
|
||||
}
|
||||
if(apr->ir_jrst && apr->ir & 040)
|
||||
apr->ex_mode_sync = 1; // 5-13
|
||||
if(apr->ir_jrst && apr->ir & 0100)
|
||||
ar_flag_set(apr); // 6-10
|
||||
if(PI_RST)
|
||||
dismiss_break(apr); // 8-4
|
||||
clear_pih(apr); // 8-4
|
||||
|
||||
// 6-8
|
||||
if(apr->ir_boole && (apr->ir_boole_op == 06 ||
|
||||
apr->ir_boole_op == 011 ||
|
||||
apr->ir_boole_op == 014))
|
||||
apr->ar ^= apr->mb; // 6-8
|
||||
apr->ir_boole_op == 011 ||
|
||||
apr->ir_boole_op == 014) ||
|
||||
ACBM_COM)
|
||||
apr->ar ^= apr->mb;
|
||||
if(apr->ir_boole && (apr->ir_boole_op == 01 ||
|
||||
apr->ir_boole_op == 02 ||
|
||||
apr->ir_boole_op == 015 ||
|
||||
apr->ir_boole_op == 016))
|
||||
apr->ar &= apr->mb; // 6-8
|
||||
apr->ir_boole_op == 02 ||
|
||||
apr->ir_boole_op == 015 ||
|
||||
apr->ir_boole_op == 016))
|
||||
apr->ar &= apr->mb;
|
||||
if(apr->ir_boole && (apr->ir_boole_op == 03 ||
|
||||
apr->ir_boole_op == 04 ||
|
||||
apr->ir_boole_op == 07 ||
|
||||
apr->ir_boole_op == 010 ||
|
||||
apr->ir_boole_op == 013))
|
||||
apr->ar |= apr->mb; // 6-8
|
||||
if(FWT_SWAP ||
|
||||
apr->ir_hwt && apr->inst & 04)
|
||||
apr->mb = apr->mb<<18 & LT | apr->mb>>18 & RT; // 6-3
|
||||
if(apr->ir_hwt && apr->inst & 030)
|
||||
apr->ar = 0; // 6-8
|
||||
apr->ir_boole_op == 04 ||
|
||||
apr->ir_boole_op == 07 ||
|
||||
apr->ir_boole_op == 010 ||
|
||||
apr->ir_boole_op == 013) ||
|
||||
ACBM_SET)
|
||||
apr->ar |= apr->mb;
|
||||
if(HWT_AR_0 || IOT_STATUS || IOT_DATAI)
|
||||
apr->ar = 0;
|
||||
|
||||
// 6-3
|
||||
if(apr->ir_acbm)
|
||||
apr->mb &= ~apr->ar;
|
||||
if(HWT_SWAP || FWT_SWAP || apr->inst == BLT)
|
||||
SWAPLTRT(apr->mb);
|
||||
|
||||
if(apr->inst == POPJ || apr->ex_ir_uuo || apr->inst == BLT)
|
||||
apr->ma = 0; // 7-3
|
||||
if(apr->shift_op && apr->mb & RSGN)
|
||||
nextpulse(apr, sht0); // 6-20
|
||||
|
||||
if(apr->ir_acbm){
|
||||
apr->mb &= apr->ar;
|
||||
if((apr->inst & 060) == 040) /* C */
|
||||
apr->ar ^= apr->mb;
|
||||
if((apr->inst & 060) == 060) /* O */
|
||||
apr->ar |= apr->mb;
|
||||
}
|
||||
nextpulse(apr, et3);
|
||||
}
|
||||
|
||||
@ -1147,7 +1130,7 @@ pulse(et0a){
|
||||
if(apr->inst == POP || apr->inst == POPJ || apr->inst == JRA)
|
||||
apr->mb = apr->mq; // 6-3
|
||||
if(ACBM_SWAP || IOT_CONO || apr->inst == JSA)
|
||||
swapltrt(&apr->mb); // 6-3
|
||||
SWAPLTRT(apr->mb); // 6-3
|
||||
if(apr->inst == FSC || apr->shift_op)
|
||||
apr->sc |= ~apr->mb & 0377 | ~apr->mb>>9 & 0400; // 6-15
|
||||
}
|
||||
@ -1223,7 +1206,7 @@ pulse(ft1a){
|
||||
if(!acltrt)
|
||||
swap(&apr->mb, &apr->ar); // 6-3
|
||||
if(FC_C_ACLT)
|
||||
apr->mb = apr->mb<<18 & LT | apr->mb>>18 & RT; // 6-3
|
||||
SWAPLTRT(apr->mb); // 6-3
|
||||
nextpulse(apr, apr->fac2 ? ft4 : // 5-4
|
||||
acltrt ? ft3 : // 5-4
|
||||
ft5); // 5-4
|
||||
|
||||
6
main.c
6
main.c
@ -839,10 +839,10 @@ error:
|
||||
ff_lght[22].state = apr.ar_cry1_flag;
|
||||
ff_lght[23].state = apr.ar_pc_chg_flag;
|
||||
ff_lght[24].state = apr.cpa_non_exist_mem;
|
||||
ff_lght[25].state = apr.cpa_clock_en;
|
||||
ff_lght[25].state = apr.cpa_clock_enable;
|
||||
ff_lght[26].state = apr.cpa_clock_flag;
|
||||
ff_lght[27].state = apr.cpa_pc_chg_en;
|
||||
ff_lght[28].state = apr.cpa_arov_en;
|
||||
ff_lght[27].state = apr.cpa_pc_chg_enable;
|
||||
ff_lght[28].state = apr.cpa_arov_enable;
|
||||
ff_lght[29].state = apr.cpa_pia33;
|
||||
ff_lght[30].state = apr.cpa_pia34;
|
||||
ff_lght[31].state = apr.cpa_pia35;
|
||||
|
||||
35
pdp6.h
35
pdp6.h
@ -20,6 +20,31 @@ enum Mask {
|
||||
RSGN = 0000000400000,
|
||||
};
|
||||
|
||||
enum HalfwordBits {
|
||||
H0 = 0400000, H1 = 0200000, H2 = 0100000,
|
||||
H3 = 0040000, H4 = 0020000, H5 = 0010000,
|
||||
H6 = 0004000, H7 = 0002000, H8 = 0001000,
|
||||
H9 = 0000400, H10 = 0000200, H11 = 0000100,
|
||||
H12 = 0000040, H13 = 0000020, H14 = 0000010,
|
||||
H15 = 0000004, H16 = 0000002, H17 = 0000001
|
||||
};
|
||||
|
||||
enum FullwordBits {
|
||||
FCRY = 01000000000000,
|
||||
F0 = 0400000000000, F1 = 0200000000000, F2 = 0100000000000,
|
||||
F3 = 0040000000000, F4 = 0020000000000, F5 = 0010000000000,
|
||||
F6 = 0004000000000, F7 = 0002000000000, F8 = 0001000000000,
|
||||
F9 = 0000400000000, F10 = 0000200000000, F11 = 0000100000000,
|
||||
F12 = 0000040000000, F13 = 0000020000000, F14 = 0000010000000,
|
||||
F15 = 0000004000000, F16 = 0000002000000, F17 = 0000001000000,
|
||||
F18 = 0000000400000, F19 = 0000000200000, F20 = 0000000100000,
|
||||
F21 = 0000000040000, F22 = 0000000020000, F23 = 0000000010000,
|
||||
F24 = 0000000004000, F25 = 0000000002000, F26 = 0000000001000,
|
||||
F27 = 0000000000400, F28 = 0000000000200, F29 = 0000000000100,
|
||||
F30 = 0000000000040, F31 = 0000000000020, F32 = 0000000000010,
|
||||
F33 = 0000000000004, F34 = 0000000000002, F35 = 0000000000001
|
||||
};
|
||||
|
||||
enum Opcode {
|
||||
FSC = 0132,
|
||||
IBP = 0133,
|
||||
@ -110,12 +135,14 @@ struct Apr {
|
||||
bool mc_rd, mc_wr, mc_rq, mc_stop, mc_stop_sync, mc_split_cyc_sync;
|
||||
|
||||
bool cpa_iot_user, cpa_illeg_op, cpa_non_exist_mem,
|
||||
cpa_clock_en, cpa_clock_flag, cpa_pc_chg_en, cpa_pdl_ov,
|
||||
cpa_arov_en, cpa_pia33, cpa_pia34, cpa_pia35;
|
||||
cpa_clock_enable, cpa_clock_flag, cpa_pc_chg_enable, cpa_pdl_ov,
|
||||
cpa_arov_enable, cpa_pia33, cpa_pia34, cpa_pia35;
|
||||
|
||||
bool iot_go;
|
||||
|
||||
/* ?? */
|
||||
bool mq36;
|
||||
bool iot_go, a_long, uuo_f1;
|
||||
bool a_long, uuo_f1;
|
||||
|
||||
/* sbr flip-flops */
|
||||
bool if1a;
|
||||
@ -145,7 +172,7 @@ struct Apr {
|
||||
|
||||
bool fac2;
|
||||
bool fac_inh, fc_e, fc_e_pse;
|
||||
bool e_long, mb_pc_sto, pc_set;
|
||||
bool pc_set;
|
||||
bool sc_e, sac_inh, sac2;
|
||||
|
||||
/* needed for the emulation */
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user