From db9bf321124a521ce0afabe5faa1dcb2c72c2b0a Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Mon, 23 Apr 2012 11:50:43 -0700 Subject: [PATCH] Merge of Bob's simh-v3.9-0-rc3 --- I1401/i1401_sys.c | 3 +- Interdata/id_defs.h | 5 +- Interdata/id_pas.c | 7 +- Interdata/id_tt.c | 8 +- Interdata/id_ttp.c | 8 +- Interdata/id_uvc.c | 15 +- NOVA/eclipse_cpu.c | 7 +- NOVA/nova_defs.h | 3 +- NOVA/nova_sys.c | 3 +- PDP10/pdp10_cpu.c | 5 +- PDP10/pdp10_fe.c | 8 +- PDP10/pdp10_tim.c | 5 +- PDP11/pdp11_dc.c | 5 +- PDP11/pdp11_dl.c | 5 +- PDP11/pdp11_dz.c | 2 +- PDP11/pdp11_stddev.c | 10 +- PDP11/pdp11_sys.c | 2 +- PDP11/pdp11_ts.c | 1 + PDP11/pdp11_tu.c | 2 +- PDP18B/pdp18b_defs.h | 5 +- PDP18B/pdp18b_stddev.c | 32 +- PDP18B/pdp18b_tt1.c | 5 +- PDP8/pdp8_clk.c | 23 +- PDP8/pdp8_defs.h | 7 +- PDP8/pdp8_tt.c | 11 +- PDP8/pdp8_ttx.c | 21 +- VAX/vax780_stddev.c | 10 +- VAX/vax780_uba.c | 3 +- VAX/vax_cpu.c | 2 +- VAX/vax_fpa.c | 2 +- VAX/vax_io.c | 3 +- VAX/vax_stddev.c | 21 +- Visual Studio Projects/Simh.sln | 8 +- .../{SWTP.vcproj => swtp6800mp-a.vcproj} | 72 +- Visual Studio Projects/swtp6800mp-a2.vcproj | 318 +++ descrip.mms | 74 +- makefile | 27 +- swtp/6800boot.dsk | Bin 1474560 -> 0 bytes swtp/6800work.dsk | Bin 1474560 -> 0 bytes swtp/swtp | Bin 258454 -> 0 bytes swtp/swtp.txt | 100 - swtp/swtp6800 | 9 - swtp/swtp_cpu.c | 2293 ----------------- swtp/swtp_dsk.c | 506 ---- swtp/swtp_sio.c | 312 --- swtp/swtp_sys.c | 425 --- swtp6800/common/bootrom.c | 231 ++ swtp6800/common/dc-4.c | 570 ++++ swtp6800/common/i2716.c | 221 ++ swtp6800/common/m6800.c | 2018 +++++++++++++++ swtp6800/common/m6810.c | 146 ++ swtp6800/common/mp-8m.c | 209 ++ swtp6800/common/mp-a.c | 211 ++ swtp6800/common/mp-a2.c | 263 ++ swtp6800/common/mp-b2.c | 322 +++ swtp6800/common/mp-s.c | 330 +++ swtp6800/swtp6800/mp-a2_sys.c | 87 + swtp6800/swtp6800/mp-a_sys.c | 85 + swtp6800/swtp6800/swtbug.bin | Bin 0 -> 1024 bytes swtp6800/swtp6800/swtp6800mp-a.ini | 8 + swtp6800/swtp6800/swtp6800mp-a2.ini | 9 + {swtp => swtp6800/swtp6800}/swtp_defs.h | 35 +- 62 files changed, 5342 insertions(+), 3796 deletions(-) rename Visual Studio Projects/{SWTP.vcproj => swtp6800mp-a.vcproj} (78%) create mode 100644 Visual Studio Projects/swtp6800mp-a2.vcproj delete mode 100644 swtp/6800boot.dsk delete mode 100644 swtp/6800work.dsk delete mode 100644 swtp/swtp delete mode 100644 swtp/swtp.txt delete mode 100644 swtp/swtp6800 delete mode 100644 swtp/swtp_cpu.c delete mode 100644 swtp/swtp_dsk.c delete mode 100644 swtp/swtp_sio.c delete mode 100644 swtp/swtp_sys.c create mode 100644 swtp6800/common/bootrom.c create mode 100644 swtp6800/common/dc-4.c create mode 100644 swtp6800/common/i2716.c create mode 100644 swtp6800/common/m6800.c create mode 100644 swtp6800/common/m6810.c create mode 100644 swtp6800/common/mp-8m.c create mode 100644 swtp6800/common/mp-a.c create mode 100644 swtp6800/common/mp-a2.c create mode 100644 swtp6800/common/mp-b2.c create mode 100644 swtp6800/common/mp-s.c create mode 100644 swtp6800/swtp6800/mp-a2_sys.c create mode 100644 swtp6800/swtp6800/mp-a_sys.c create mode 100644 swtp6800/swtp6800/swtbug.bin create mode 100644 swtp6800/swtp6800/swtp6800mp-a.ini create mode 100644 swtp6800/swtp6800/swtp6800mp-a2.ini rename {swtp => swtp6800/swtp6800}/swtp_defs.h (64%) diff --git a/I1401/i1401_sys.c b/I1401/i1401_sys.c index 3b9dc881..bab227f3 100644 --- a/I1401/i1401_sys.c +++ b/I1401/i1401_sys.c @@ -1,6 +1,6 @@ /* i1401_sys.c: IBM 1401 simulator interface - Copyright (c) 1993-2008, Robert M. Supnik + Copyright (c) 1993-2012, Robert M. Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -23,6 +23,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Robert M Supnik. + 25-Mar-12 RMS Fixed && -> & in test (Peter Schorn) 20-Sep-05 RMS Revised for new code tables 04-Jan-05 WVS Added address argument support 14-Nov-04 WVS Added data printout support diff --git a/Interdata/id_defs.h b/Interdata/id_defs.h index 77b643dd..2afd3446 100644 --- a/Interdata/id_defs.h +++ b/Interdata/id_defs.h @@ -1,6 +1,6 @@ /* id_defs.h: Interdata 16b/32b simulator definitions - Copyright (c) 2000-2010, Robert M. Supnik + Copyright (c) 2000-2012, Robert M. Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -26,6 +26,7 @@ The author gratefully acknowledges the help of Carl Friend and Al Kossow, who provided key documents about the Interdata product line. + 18-Apr-12 RMS Added clock coschedule prototype 22-May-10 RMS Added check for 64b definitions 09-Mar-06 RMS Increased register sets to architectural limit 25-Jan-04 RMS Removed local logging support @@ -483,4 +484,6 @@ t_stat set_dev (UNIT *uptr, int32 val, char *cptr, void *desc); t_stat show_sch (FILE *st, UNIT *uptr, int32 val, void *desc); t_stat show_dev (FILE *st, UNIT *uptr, int32 val, void *desc); +int32 lfc_cosched (int32 wait); + #endif diff --git a/Interdata/id_pas.c b/Interdata/id_pas.c index 7ce00973..dfc27ccf 100644 --- a/Interdata/id_pas.c +++ b/Interdata/id_pas.c @@ -25,6 +25,7 @@ pas Programmable asynchronous line adapter(s) + 18-Apr-12 RMS Revised to use clock coscheduling 21-Mar-12 RMS Fixed TT_GET_MODE test to use TTUF_MODE_x (Michael Bloom) 19-Nov-08 RMS Revised for common TMXR show routines 18-Jun-07 RMS Added UNIT_IDLE flag @@ -319,7 +320,7 @@ int32 ln, c, out; if ((uptr->flags & UNIT_ATT) == 0) /* attached? */ return SCPE_OK; -sim_activate (uptr, lfc_poll); /* continue poll */ +sim_activate (uptr, lfc_cosched (lfc_poll)); /* continue poll */ ln = tmxr_poll_conn (&pas_desc); /* look for connect */ if (ln >= 0) { /* got one? */ if ((pasl_unit[ln].flags & UNIT_MDM) && /* modem control */ @@ -468,7 +469,7 @@ else { pasl_dev.flags = pasl_dev.flags & ~DEV_DIS; } if (pas_unit.flags & UNIT_ATT) /* master att? */ - sim_activate_abs (&pas_unit, lfc_poll); /* cosched with clock */ + sim_activate (&pas_unit, lfc_poll); else sim_cancel (&pas_unit); /* else stop */ for (i = 0; i < PAS_LINES; i++) pas_reset_ln (i); @@ -484,7 +485,7 @@ t_stat r; r = tmxr_attach (&pas_desc, uptr, cptr); /* attach */ if (r != SCPE_OK) /* error */ return r; -sim_activate_abs (uptr, 100); /* quick poll */ +sim_activate (uptr, 100); /* quick poll */ return SCPE_OK; } diff --git a/Interdata/id_tt.c b/Interdata/id_tt.c index e56f4c7c..64bdc3f3 100644 --- a/Interdata/id_tt.c +++ b/Interdata/id_tt.c @@ -1,6 +1,6 @@ /* id_tt.c: Interdata teletype - Copyright (c) 2000-2008, Robert M. Supnik + Copyright (c) 2000-2012, Robert M. Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ tt console + 18-Apr-12 RMS Revised to use clock coscheduling 18-Jun-07 RMS Added UNIT_IDLE flag to console input 18-Oct-06 RMS Sync keyboard to LFC clock 30-Sep-06 RMS Fixed handling of non-printable characters in KSR mode @@ -183,7 +184,8 @@ t_stat tti_svc (UNIT *uptr) { int32 out, temp; -sim_activate (uptr, KBD_WAIT (uptr->wait, lfc_poll)); /* continue poll */ +sim_activate (uptr, KBD_WAIT (uptr->wait, lfc_cosched (lfc_poll))); + /* continue poll */ tt_sta = tt_sta & ~STA_BRK; /* clear break */ if ((temp = sim_poll_kbd ()) < SCPE_KFLAG) /* no char or error? */ return temp; @@ -239,7 +241,7 @@ t_stat tt_reset (DEVICE *dptr) { if (dptr->flags & DEV_DIS) /* dis? cancel poll */ sim_cancel (&tt_unit[TTI]); -else sim_activate_abs (&tt_unit[TTI], KBD_WAIT (tt_unit[TTI].wait, lfc_poll)); +else sim_activate (&tt_unit[TTI], KBD_WAIT (tt_unit[TTI].wait, lfc_poll)); sim_cancel (&tt_unit[TTO]); /* cancel output */ tt_rd = tt_fdpx = 1; /* read, full duplex */ tt_chp = 0; /* no char */ diff --git a/Interdata/id_ttp.c b/Interdata/id_ttp.c index e580d303..660fd469 100644 --- a/Interdata/id_ttp.c +++ b/Interdata/id_ttp.c @@ -1,6 +1,6 @@ /* id_ttp.c: Interdata PASLA console interface - Copyright (c) 2000-2008, Robert M. Supnik + Copyright (c) 2000-2012, Robert M. Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ ttp console (on PAS) + 18-Apr-12 RMS Revised to use clock coscheduling 18-Jun-07 RMS Added UNIT_IDLE flag to console input 18-Oct-06 RMS Sync keyboard to LFC clock 22-Nov-05 RMS Revised for new terminal processing routines @@ -179,7 +180,8 @@ t_stat ttpi_svc (UNIT *uptr) { int32 c, out; -sim_activate (uptr, KBD_WAIT (uptr->wait, lfc_poll)); /* continue poll */ +sim_activate (uptr, KBD_WAIT (uptr->wait, lfc_cosched (lfc_poll))); + /* continue poll */ ttp_sta = ttp_sta & ~STA_FR; /* clear break */ if ((c = sim_poll_kbd ()) < SCPE_KFLAG) /* no char or error? */ return c; @@ -237,7 +239,7 @@ t_stat ttp_reset (DEVICE *dptr) { if (dptr->flags & DEV_DIS) sim_cancel (&ttp_unit[TTI]); -else sim_activate_abs (&ttp_unit[TTI], KBD_WAIT (ttp_unit[TTI].wait, lfc_poll)); +else sim_activate (&ttp_unit[TTI], KBD_WAIT (ttp_unit[TTI].wait, lfc_poll)); sim_cancel (&ttp_unit[TTO]); CLR_INT (v_TTP); /* clear int */ CLR_ENB (v_TTP); diff --git a/Interdata/id_uvc.c b/Interdata/id_uvc.c index d94b2a65..7ccc070a 100644 --- a/Interdata/id_uvc.c +++ b/Interdata/id_uvc.c @@ -1,6 +1,6 @@ /* id_uvc.c: Interdata universal clock - Copyright (c) 2001-2008, Robert M. Supnik + Copyright (c) 2001-2012, Robert M. Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -26,6 +26,7 @@ pic precision incremental clock lfc line frequency clock + 18-Apr-12 RMS Added lfc_cosched routine 18-Jun-07 RMS Added UNIT_IDLE flag 18-Oct-06 RMS Changed LFC to be free running, export tmr_poll 23-Jul-05 RMS Fixed {} error in OC @@ -351,12 +352,22 @@ if (lfc_arm) { /* armed? */ return SCPE_OK; } +/* Clock coscheduling routine */ + +int32 lfc_cosched (int32 wait) +{ +int32 t; + +t = sim_is_active (&lfc_unit); +return (t? t - 1: wait); +} + /* Reset routine */ t_stat lfc_reset (DEVICE *dptr) { lfc_poll = sim_rtcn_init (lfc_unit.wait, TMR_LFC); -sim_activate_abs (&lfc_unit, lfc_poll); /* init clock */ +sim_activate (&lfc_unit, lfc_poll); /* init clock */ CLR_INT (v_LFC); /* clear int */ CLR_ENB (v_LFC); /* disable int */ lfc_arm = 0; /* disarm int */ diff --git a/NOVA/eclipse_cpu.c b/NOVA/eclipse_cpu.c index 50f0bfcf..2e9efc42 100644 --- a/NOVA/eclipse_cpu.c +++ b/NOVA/eclipse_cpu.c @@ -2,7 +2,7 @@ Modified from the original NOVA simulator by Robert Supnik. - Copyright (c) 1998-2006, Charles E Owen + Copyright (c) 1998-2012, Charles E Owen Portions Copyright (c) 1993-2002, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a @@ -28,8 +28,9 @@ cpu Eclipse central processor - 07-Jun-06 RMS Fixed bug in DIVS (found by Mark Hittinger) - 22-Sep-05 RMS Fixed declarations (from Sterling Garwood) + 25-Mar-12 RMS Fixed declarations (Mark Pizzolato) + 07-Jun-06 RMS Fixed bug in DIVS (Mark Hittinger) + 22-Sep-05 RMS Fixed declarations (Sterling Garwood) 25-Aug-05 RMS Fixed DIVS overflow cases 29-Nov-03 CEO Corrected POPJ and Bit operations bugs 26-Nov-03 CEO Added FPU and PIT devices diff --git a/NOVA/nova_defs.h b/NOVA/nova_defs.h index 1dabed0e..5f5f6ffa 100644 --- a/NOVA/nova_defs.h +++ b/NOVA/nova_defs.h @@ -1,6 +1,6 @@ /* nova_defs.h: NOVA/Eclipse simulator definitions - Copyright (c) 1993-2010, Robert M. Supnik + Copyright (c) 1993-2012, Robert M. Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -23,6 +23,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Robert M Supnik. + 25-Mar-12 RMS Added missing parameters to prototypes (Mark Pizzolato) 22-May-10 RMS Added check for 64b definitions 04-Jul-07 BKR BUSY/DONE/INTR "convenience" macros added, INT_TRAP added for Nova 3, 4 trap instruction handling, diff --git a/NOVA/nova_sys.c b/NOVA/nova_sys.c index 6411e7d5..36a4cf22 100644 --- a/NOVA/nova_sys.c +++ b/NOVA/nova_sys.c @@ -1,6 +1,6 @@ /* nova_sys.c: NOVA simulator interface - Copyright (c) 1993-2008, Robert M. Supnik + Copyright (c) 1993-2012, Robert M. Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -23,6 +23,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Robert M Supnik. + 25-Mar-12 RMS Fixed declaration (Mark Pizzolato) 04-Jul-07 BKR DEC's IOF/ION changed to DG's INTDS/INTEN mnemonic, Fixed QTY/ADCV device name, RDSW changed to DDG's READS mnemonic, diff --git a/PDP10/pdp10_cpu.c b/PDP10/pdp10_cpu.c index b73e88c0..d5c9fc10 100644 --- a/PDP10/pdp10_cpu.c +++ b/PDP10/pdp10_cpu.c @@ -1,6 +1,6 @@ /* pdp10_cpu.c: PDP-10 CPU simulator - Copyright (c) 1993-2008, Robert M. Supnik + Copyright (c) 1993-2012, Robert M. Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,9 +25,10 @@ cpu KS10 central processor + 25-Mar-12 RMS Added missing parameters to prototypes (Mark Pizzolato) 17-Jul-07 RMS Fixed non-portable usage in SHOW HISTORY 28-Apr-07 RMS Removed clock initialization - 22-Sep-05 RMS Fixed declarations (from Sterling Garwood) + 22-Sep-05 RMS Fixed declarations (Sterling Garwood) Fixed warning in MOVNI 16-Aug-05 RMS Fixed C++ declaration and cast problems 10-Nov-04 RMS Added instruction history diff --git a/PDP10/pdp10_fe.c b/PDP10/pdp10_fe.c index 43df088c..97cbb20d 100644 --- a/PDP10/pdp10_fe.c +++ b/PDP10/pdp10_fe.c @@ -1,6 +1,6 @@ /* pdp10_fe.c: PDP-10 front end (console terminal) simulator - Copyright (c) 1993-2007, Robert M Supnik + Copyright (c) 1993-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ fe KS10 console front end + 18-Apr-12 RMS Added clock coscheduling 18-Jun-07 RMS Added UNIT_IDLE flag to console input 17-Oct-06 RMS Synced keyboard to clock for idling 28-May-04 RMS Removed SET FE CTRL-C @@ -142,7 +143,8 @@ t_stat fei_svc (UNIT *uptr) { int32 temp; -sim_activate (uptr, KBD_WAIT (uptr->wait, tmxr_poll)); /* continue poll */ +sim_activate (uptr, KBD_WAIT (uptr->wait, clk_cosched (tmxr_poll))); + /* continue poll */ if ((temp = sim_poll_kbd ()) < SCPE_KFLAG) /* no char or error? */ return temp; if (temp & SCPE_BREAK) /* ignore break */ @@ -161,7 +163,7 @@ t_stat fe_reset (DEVICE *dptr) fei_unit.buf = feo_unit.buf = 0; M[FE_CTYIN] = M[FE_CTYOUT] = 0; apr_flg = apr_flg & ~(APRF_ITC | APRF_CON); -sim_activate_abs (&fei_unit, KBD_WAIT (fei_unit.wait, tmxr_poll)); +sim_activate (&fei_unit, KBD_WAIT (fei_unit.wait, tmxr_poll)); return SCPE_OK; } diff --git a/PDP10/pdp10_tim.c b/PDP10/pdp10_tim.c index 726e06f4..c15cd503 100644 --- a/PDP10/pdp10_tim.c +++ b/PDP10/pdp10_tim.c @@ -1,6 +1,6 @@ /* pdp10_tim.c: PDP-10 tim subsystem simulator - Copyright (c) 1993-2008, Robert M Supnik + Copyright (c) 1993-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ tim timer subsystem + 18-Apr-12 RMS Removed absolute scheduling on reset 18-Jun-07 RMS Added UNIT_IDLE flag 03-Nov-06 RMS Rewritten to support idling 29-Oct-06 RMS Added clock coscheduling function @@ -239,7 +240,7 @@ tim_period = 0; /* clear timer */ tim_ttg = 0; apr_flg = apr_flg & ~APRF_TIM; /* clear interrupt */ tmr_poll = sim_rtc_init (tim_unit.wait); /* init timer */ -sim_activate_abs (&tim_unit, tmr_poll); /* activate unit */ +sim_activate (&tim_unit, tmr_poll); /* activate unit */ tmxr_poll = tmr_poll * tim_mult; /* set mux poll */ return SCPE_OK; } diff --git a/PDP11/pdp11_dc.c b/PDP11/pdp11_dc.c index b1def4a7..1c653fe8 100644 --- a/PDP11/pdp11_dc.c +++ b/PDP11/pdp11_dc.c @@ -1,6 +1,6 @@ /* pdp11_dc.c: PDP-11 DC11 multiple terminal interface simulator - Copyright (c) 1993-2011, Robert M Supnik + Copyright (c) 1993-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ dci,dco DC11 terminal input/output + 18-Apr-2012 RMS Modified to use clock coscheduling 17-Aug-2011 RMS Added AUTOCONFIGURE modifier 19-Nov-2008 RMS Revised for common TMXR show routines Revised to autoconfigure vectors @@ -367,7 +368,7 @@ int32 ln, c, temp; if ((uptr->flags & UNIT_ATT) == 0) /* attached? */ return SCPE_OK; -sim_activate (uptr, tmxr_poll); /* continue poll */ +sim_activate (uptr, clk_cosched (tmxr_poll)); /* continue poll */ ln = tmxr_poll_conn (&dcx_desc); /* look for connect */ if (ln >= 0) { /* got one? */ dcx_ldsc[ln].rcve = 1; /* set rcv enb */ diff --git a/PDP11/pdp11_dl.c b/PDP11/pdp11_dl.c index aebd38f4..2caf6832 100644 --- a/PDP11/pdp11_dl.c +++ b/PDP11/pdp11_dl.c @@ -1,6 +1,6 @@ /* pdp11_dl.c: PDP-11 multiple terminal interface simulator - Copyright (c) 1993-2011, Robert M Supnik + Copyright (c) 1993-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ dli,dlo DL11 terminal input/output + 18-Apr-2012 RMS Modified to use clock coscheduling 17-Aug-2011 RMS Added AUTOCONFIGURE modifier 19-Nov-2008 RMS Revised for common TMXR show routines Revised to autoconfigure vectors @@ -330,7 +331,7 @@ int32 ln, c, temp; if ((uptr->flags & UNIT_ATT) == 0) /* attached? */ return SCPE_OK; -sim_activate (uptr, tmxr_poll); /* continue poll */ +sim_activate (uptr, clk_cosched (tmxr_poll)); /* continue poll */ ln = tmxr_poll_conn (&dlx_desc); /* look for connect */ if (ln >= 0) { /* got one? rcv enb */ dlx_ldsc[ln].rcve = 1; diff --git a/PDP11/pdp11_dz.c b/PDP11/pdp11_dz.c index 8f237cbc..5e96a6de 100644 --- a/PDP11/pdp11_dz.c +++ b/PDP11/pdp11_dz.c @@ -435,7 +435,7 @@ if (t) { /* any enabled? */ dz_update_rcvi (); /* upd rcv intr */ tmxr_poll_tx (&dz_desc); /* poll output */ dz_update_xmti (); /* upd xmt intr */ - sim_activate (uptr, tmxr_poll); /* reactivate */ + sim_activate (uptr, clk_cosched (tmxr_poll)); /* reactivate */ } return SCPE_OK; } diff --git a/PDP11/pdp11_stddev.c b/PDP11/pdp11_stddev.c index d68199b3..c20a0168 100644 --- a/PDP11/pdp11_stddev.c +++ b/PDP11/pdp11_stddev.c @@ -1,6 +1,6 @@ /* pdp11_stddev.c: PDP-11 standard I/O devices simulator - Copyright (c) 1993-2008, Robert M Supnik + Copyright (c) 1993-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -26,6 +26,7 @@ tti,tto DL11 terminal input/output clk KW11L (and other) line frequency clock + 18-Apr-12 RMS Modified to use clock coscheduling 20-May-08 RMS Standardized clock delay at 1mips 18-Jun-07 RMS Added UNIT_IDLE flag to console input, clock 29-Oct-06 RMS Synced keyboard and clock @@ -287,7 +288,8 @@ t_stat tti_svc (UNIT *uptr) { int32 c; -sim_activate (uptr, KBD_WAIT (uptr->wait, tmr_poll)); /* continue poll */ +sim_activate (uptr, KBD_WAIT (uptr->wait, clk_cosched (tmr_poll))); + /* continue poll */ if ((c = sim_poll_kbd ()) < SCPE_KFLAG) /* no char or error? */ return c; if (c & SCPE_BREAK) /* break? */ @@ -307,7 +309,7 @@ t_stat tti_reset (DEVICE *dptr) tti_unit.buf = 0; tti_csr = 0; CLR_INT (TTI); -sim_activate_abs (&tti_unit, KBD_WAIT (tti_unit.wait, tmr_poll)); +sim_activate (&tti_unit, KBD_WAIT (tti_unit.wait, tmr_poll)); return SCPE_OK; } @@ -475,7 +477,7 @@ clk_tps = clk_default; /* set default tps */ clk_csr = CSR_DONE; /* set done */ CLR_INT (CLK); sim_rtcn_init (clk_unit.wait, TMR_CLK); /* init line clock */ -sim_activate_abs (&clk_unit, clk_unit.wait); /* activate unit */ +sim_activate (&clk_unit, clk_unit.wait); /* activate unit */ tmr_poll = clk_unit.wait; /* set timer poll */ tmxr_poll = clk_unit.wait; /* set mux poll */ return SCPE_OK; diff --git a/PDP11/pdp11_sys.c b/PDP11/pdp11_sys.c index 98ca200b..16ca83b4 100644 --- a/PDP11/pdp11_sys.c +++ b/PDP11/pdp11_sys.c @@ -27,7 +27,7 @@ 15-May-08 RMS Added KE11-A, DC11 support Renamed DL11 04-Feb-08 RMS Modified to allow -A, -B use with 8b devices - 25-Jan-08 RMS Added RC11, KG11A support (John Dundas) + 25-Jan-08 RMS Added RC11, KG11A support from John Dundas 10-Sep-07 RMS Cleaned up binary loader 20-Dec-06 RMS Added TA11 support 12-Nov-06 RMS Fixed operand order in EIS instructions (W.F.J. Mueller) diff --git a/PDP11/pdp11_ts.c b/PDP11/pdp11_ts.c index ccad942a..11ab6f11 100644 --- a/PDP11/pdp11_ts.c +++ b/PDP11/pdp11_ts.c @@ -25,6 +25,7 @@ ts TS11/TSV05 magtape + 19-Mar-12 RMS Fixed declaration of cpu_opt (Mark Pizzolato) 22-May-10 RMS Fixed t_addr printouts for 64b big-endian systems (Mark Pizzolato) 16-Feb-06 RMS Added tape capacity checking diff --git a/PDP11/pdp11_tu.c b/PDP11/pdp11_tu.c index f924ebac..9175b996 100644 --- a/PDP11/pdp11_tu.c +++ b/PDP11/pdp11_tu.c @@ -27,7 +27,7 @@ 18-Apr-11 MP Fixed t_addr printouts for 64b big-endian systems 17-May-07 RMS CS1 DVA resides in device, not MBA - 29-Apr-07 RMS Fixed bug in setting FCE on TMK (Naoki Hamada) + 29-Apr-07 RMS Fixed bug in setting FCE on TMK Naoki Hamada) 16-Feb-06 RMS Added tape capacity checking 12-Nov-05 RMS Changed default formatter to TM03 (for VMS) 31-Oct-05 RMS Fixed address width for large files diff --git a/PDP18B/pdp18b_defs.h b/PDP18B/pdp18b_defs.h index eef82cf6..9a997886 100644 --- a/PDP18B/pdp18b_defs.h +++ b/PDP18B/pdp18b_defs.h @@ -1,6 +1,6 @@ /* pdp18b_defs.h: 18b PDP simulator definitions - Copyright (c) 1993-2010, Robert M Supnik + Copyright (c) 1993-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -23,6 +23,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Robert M Supnik. + 18-Apr-12 RMS Added clk_cosched prototype 22-May-10 RMS Added check for 64b definitions 30-Oct-06 RMS Added infinite loop stop 14-Jan-04 RMS Revised IO device call interface @@ -495,4 +496,6 @@ typedef struct { t_stat set_devno (UNIT *uptr, int32 val, char *cptr, void *desc); t_stat show_devno (FILE *st, UNIT *uptr, int32 val, void *desc); +int32 clk_cosched (int32 wait); + #endif diff --git a/PDP18B/pdp18b_stddev.c b/PDP18B/pdp18b_stddev.c index c2e5c827..966b6dd1 100644 --- a/PDP18B/pdp18b_stddev.c +++ b/PDP18B/pdp18b_stddev.c @@ -1,6 +1,6 @@ /* pdp18b_stddev.c: 18b PDP's standard devices - Copyright (c) 1993-2008, Robert M Supnik + Copyright (c) 1993-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -29,6 +29,8 @@ tto teleprinter clk clock + 18-Apr-12 RMS Added clk_cosched routine + Revised clk and tti scheduling 18-Jun-07 RMS Added UNIT_IDLE to console input, clock 18-Oct-06 RMS Added PDP-15 programmable duplex control Fixed handling of non-printable characters in KSR mode @@ -477,6 +479,16 @@ int32 clk_iors (void) return (TST_INT (CLK)? IOS_CLK: 0); } +/* Clock coscheduling routine */ + +int32 clk_cosched (int32 wait) +{ +int32 t; + +t = sim_is_active (&clk_unit); +return (t? t - 1: wait); +} + /* Reset routine */ t_stat clk_reset (DEVICE *dptr) @@ -1002,7 +1014,8 @@ t_stat tti_svc (UNIT *uptr) #if defined (KSR28) /* Baudot... */ int32 in, c, out; -sim_activate (uptr, KBD_WAIT (uptr->wait, tmxr_poll)); /* continue poll */ +sim_activate (uptr, KBD_WAIT (uptr->wait, clk_cosched (tmxr_poll))); + /* continue poll */ if (tti_2nd) { /* char waiting? */ uptr->buf = tti_2nd; /* return char */ tti_2nd = 0; /* not waiting */ @@ -1037,7 +1050,8 @@ else { #else /* ASCII... */ int32 c, out; -sim_activate (uptr, KBD_WAIT (uptr->wait, tmxr_poll)); /* continue poll */ +sim_activate (uptr, KBD_WAIT (uptr->wait, clk_cosched (tmxr_poll))); + /* continue poll */ if ((c = sim_poll_kbd ()) < SCPE_KFLAG) /* no char or error? */ return c; out = c & 0177; /* mask echo to 7b */ @@ -1068,12 +1082,14 @@ return (TST_INT (TTI)? IOS_TTI: 0); t_stat tti_reset (DEVICE *dptr) { -tti_unit.buf = 0; /* clear buffer */ -tti_2nd = 0; -tty_shift = 0; /* clear state */ -tti_fdpx = 0; /* clear dpx mode */ CLR_INT (TTI); /* clear flag */ -sim_activate_abs (&tti_unit, KBD_WAIT (tti_unit.wait, tmxr_poll)); +if (!sim_is_running) { /* RESET (not CAF)? */ + tti_unit.buf = 0; /* clear buffer */ + tti_2nd = 0; + tty_shift = 0; /* clear state */ + tti_fdpx = 0; /* clear dpx mode */ + } +sim_activate (&tti_unit, KBD_WAIT (tti_unit.wait, tmxr_poll)); return SCPE_OK; } diff --git a/PDP18B/pdp18b_tt1.c b/PDP18B/pdp18b_tt1.c index 300830d5..fdc5ac22 100644 --- a/PDP18B/pdp18b_tt1.c +++ b/PDP18B/pdp18b_tt1.c @@ -1,6 +1,6 @@ /* pdp18b_ttx.c: PDP-9/15 additional terminals simulator - Copyright (c) 1993-2008, Robert M Supnik + Copyright (c) 1993-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ ttix,ttox LT15/LT19 terminal input/output + 18-Apr-12 RMS Revised to use clock coscheduling 19-Nov-08 RMS Revised for common TMXR show routines 18-Jun-07 RMS Added UNIT_IDLE flag 30-Sep-06 RMS Fixed handling of non-printable characters in KSR mode @@ -214,7 +215,7 @@ int32 ln, c, temp; if ((uptr->flags & UNIT_ATT) == 0) /* attached? */ return SCPE_OK; -sim_activate (uptr, tmxr_poll); /* continue poll */ +sim_activate (uptr, clk_cosched (tmxr_poll)); /* continue poll */ ln = tmxr_poll_conn (&ttx_desc); /* look for connect */ if (ln >= 0) /* got one? rcv enab */ ttx_ldsc[ln].rcve = 1; diff --git a/PDP8/pdp8_clk.c b/PDP8/pdp8_clk.c index f19d982d..968ac229 100644 --- a/PDP8/pdp8_clk.c +++ b/PDP8/pdp8_clk.c @@ -1,6 +1,6 @@ /* pdp8_clk.c: PDP-8 real-time clock simulator - Copyright (c) 1993-2011, Robert M Supnik + Copyright (c) 1993-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ clk real time clock + 18-Apr-12 RMS Added clock coscheduling 18-Jun-07 RMS Added UNIT_IDLE flag 01-Mar-03 RMS Aded SET/SHOW CLK FREQ support 04-Oct-02 RMS Added DIB, device number support @@ -43,6 +44,8 @@ extern int32 int_req, int_enable, dev_done, stop_inst; int32 clk_tps = 60; /* ticks/second */ int32 tmxr_poll = 16000; /* term mux poll */ +extern int32 sim_is_running; + int32 clk (int32 IR, int32 AC); t_stat clk_svc (UNIT *uptr); t_stat clk_reset (DEVICE *dptr); @@ -150,6 +153,16 @@ tmxr_poll = t; /* set mux poll */ return SCPE_OK; } +/* Clock coscheduling routine */ + +int32 clk_cosched (int32 wait) +{ +int32 t; + +t = sim_is_active (&clk_unit); +return (t? t - 1: wait); +} + /* Reset routine */ t_stat clk_reset (DEVICE *dptr) @@ -159,9 +172,11 @@ int32 t; dev_done = dev_done & ~INT_CLK; /* clear done, int */ int_req = int_req & ~INT_CLK; int_enable = int_enable & ~INT_CLK; /* clear enable */ -t = sim_rtcn_init (clk_unit.wait, TMR_CLK); -sim_activate_abs (&clk_unit, t); /* activate unit */ -tmxr_poll = t; +if (!sim_is_running) { /* RESET (not CAF)? */ + t = sim_rtcn_init (clk_unit.wait, TMR_CLK); + sim_activate (&clk_unit, t); /* activate unit */ + tmxr_poll = t; + } return SCPE_OK; } diff --git a/PDP8/pdp8_defs.h b/PDP8/pdp8_defs.h index 1cebab76..5d2ee547 100644 --- a/PDP8/pdp8_defs.h +++ b/PDP8/pdp8_defs.h @@ -1,6 +1,6 @@ /* pdp8_defs.h: PDP-8 simulator definitions - Copyright (c) 1993-2010, Robert M Supnik + Copyright (c) 1993-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -23,6 +23,8 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Robert M Supnik. + 18-Apr-12 RMS Removed separate timer for additional terminals; + added clock_cosched prototype 22-May-10 RMS Added check for 64b definitions 21-Aug-07 RMS Added FPP8 support 13-Dec-06 RMS Added TA8E support @@ -78,7 +80,6 @@ /* Timers */ #define TMR_CLK 0 /* timer 0 = clock */ -#define TMR_TTX 1 /* timer 1 = TTx */ /* Device information block */ @@ -209,4 +210,6 @@ typedef struct { t_stat set_dev (UNIT *uptr, int32 val, char *cptr, void *desc); t_stat show_dev (FILE *st, UNIT *uptr, int32 val, void *desc); +int32 clk_cosched (int32 wait); + #endif diff --git a/PDP8/pdp8_tt.c b/PDP8/pdp8_tt.c index 8ae9b168..9f39b5d1 100644 --- a/PDP8/pdp8_tt.c +++ b/PDP8/pdp8_tt.c @@ -1,6 +1,6 @@ /* pdp8_tt.c: PDP-8 console terminal simulator - Copyright (c) 1993-2011, Robert M Supnik + Copyright (c) 1993-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ tti,tto KL8E terminal input/output + 18-Apr-12 RMS Revised to use clock coscheduling 18-Jun-07 RMS Added UNIT_IDLE flag to console input 18-Oct-06 RMS Synced keyboard to clock 30-Sep-06 RMS Fixed handling of non-printable characters in KSR mode @@ -44,7 +45,7 @@ #include extern int32 int_req, int_enable, dev_done, stop_inst; -extern int32 tmxr_poll; +extern int32 tmxr_poll, sim_is_running; int32 tti (int32 IR, int32 AC); int32 tto (int32 IR, int32 AC); @@ -175,7 +176,8 @@ t_stat tti_svc (UNIT *uptr) { int32 c; -sim_activate (uptr, KBD_WAIT (uptr->wait, tmxr_poll)); /* continue poll */ +sim_activate (uptr, KBD_WAIT (uptr->wait, clk_cosched (tmxr_poll))); + /* continue poll */ if ((c = sim_poll_kbd ()) < SCPE_KFLAG) /* no char or error? */ return c; if (c & SCPE_BREAK) /* break? */ @@ -195,7 +197,8 @@ tti_unit.buf = 0; dev_done = dev_done & ~INT_TTI; /* clear done, int */ int_req = int_req & ~INT_TTI; int_enable = int_enable | INT_TTI; /* set enable */ -sim_activate_abs (&tti_unit, KBD_WAIT (tti_unit.wait, tmxr_poll)); +if (!sim_is_running) /* RESET (not CAF)? */ + sim_activate (&tti_unit, KBD_WAIT (tti_unit.wait, tmxr_poll)); return SCPE_OK; } diff --git a/PDP8/pdp8_ttx.c b/PDP8/pdp8_ttx.c index 8c0ca6ed..0956178c 100644 --- a/PDP8/pdp8_ttx.c +++ b/PDP8/pdp8_ttx.c @@ -1,6 +1,6 @@ /* pdp8_ttx.c: PDP-8 additional terminals simulator - Copyright (c) 1993-2011, Robert M Supnik + Copyright (c) 1993-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ ttix,ttox PT08/KL8JA terminal input/output + 18-Apr-12 RMS Revised to use clock coscheduling 19-Nov-08 RMS Revised for common TMXR show routines 07-Jun-06 RMS Added UNIT_IDLE flag 06-Jul-06 RMS Fixed bug in DETACH routine @@ -60,6 +61,7 @@ #define TTX_GETLN(x) (((x) >> 4) & TTX_MASK) extern int32 int_req, int_enable, dev_done, stop_inst; +extern int32 tmxr_poll, sim_is_running; uint8 ttix_buf[TTX_LINES] = { 0 }; /* input buffers */ uint8 ttox_buf[TTX_LINES] = { 0 }; /* output buffers */ @@ -224,8 +226,7 @@ int32 ln, c, temp; if ((uptr->flags & UNIT_ATT) == 0) /* attached? */ return SCPE_OK; -temp = sim_rtcn_calb (ttx_tps, TMR_TTX); /* calibrate */ -sim_activate (uptr, temp); /* continue poll */ +sim_activate (uptr, clk_cosched (tmxr_poll)); /* continue poll */ ln = tmxr_poll_conn (&ttx_desc); /* look for connect */ if (ln >= 0) /* got one? rcv enb*/ ttx_ldsc[ln].rcve = 1; @@ -249,15 +250,11 @@ return SCPE_OK; t_stat ttix_reset (DEVICE *dptr) { -int32 t, ln, itto; +int32 ln, itto; ttx_enbdis (dptr->flags & DEV_DIS); /* sync enables */ -if (ttix_unit.flags & UNIT_ATT) { /* if attached, */ - if (!sim_is_active (&ttix_unit)) { - t = sim_rtcn_init (ttix_unit.wait, TMR_TTX); - sim_activate (&ttix_unit, t); /* activate */ - } - } +if (ttix_unit.flags & UNIT_ATT) /* if attached, */ + sim_activate (&ttix_unit, tmxr_poll); /* activate */ else sim_cancel (&ttix_unit); /* else stop */ for (ln = 0; ln < TTX_LINES; ln++) { /* for all lines */ ttix_buf[ln] = 0; /* clear buf, */ @@ -358,14 +355,12 @@ return SCPE_OK; t_stat ttx_attach (UNIT *uptr, char *cptr) { -int32 t; t_stat r; r = tmxr_attach (&ttx_desc, uptr, cptr); /* attach */ if (r != SCPE_OK) /* error */ return r; -t = sim_rtcn_init (ttix_unit.wait, TMR_TTX); /* init calib */ -sim_activate (uptr, t); /* start poll */ +sim_activate (uptr, tmxr_poll); /* start poll */ return SCPE_OK; } diff --git a/VAX/vax780_stddev.c b/VAX/vax780_stddev.c index 84245806..ec576050 100644 --- a/VAX/vax780_stddev.c +++ b/VAX/vax780_stddev.c @@ -1,6 +1,6 @@ /* vax780_stddev.c: VAX 11/780 standard I/O devices - Copyright (c) 1998-2011, Robert M Supnik + Copyright (c) 1998-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -29,6 +29,7 @@ todr TODR clock tmr interval timer + 18-Apr-12 RMS Revised to use clock coscheduling 28-Sep-11 MP Generalized setting TODR for all OSes. Unbound the TODR value from the 100hz clock tick interrupt. TODR now behaves like the original @@ -461,7 +462,8 @@ t_stat tti_svc (UNIT *uptr) { int32 c; -sim_activate (uptr, KBD_WAIT (uptr->wait, tmr_poll)); /* continue poll */ +sim_activate (uptr, KBD_WAIT (uptr->wait, clk_cosched (tmr_poll))); + /* continue poll */ if ((c = sim_poll_kbd ()) < SCPE_KFLAG) /* no char or error? */ return c; if (c & SCPE_BREAK) /* break? */ @@ -481,7 +483,7 @@ t_stat tti_reset (DEVICE *dptr) tti_buf = 0; tti_csr = 0; tti_int = 0; -sim_activate_abs (&tti_unit, KBD_WAIT (tti_unit.wait, tmr_poll)); +sim_activate (&tti_unit, KBD_WAIT (tti_unit.wait, tmr_poll)); return SCPE_OK; } @@ -679,7 +681,7 @@ return (t? t - 1: wait); t_stat clk_reset (DEVICE *dptr) { tmr_poll = sim_rtcn_init (clk_unit.wait, TMR_CLK); /* init 100Hz timer */ -sim_activate_abs (&clk_unit, tmr_poll); /* activate 100Hz unit */ +sim_activate (&clk_unit, tmr_poll); /* activate 100Hz unit */ tmxr_poll = tmr_poll * TMXR_MULT; /* set mux poll */ if (clk_unit.filebuf == NULL) { /* make sure the TODR is initialized */ clk_unit.filebuf = calloc(sizeof(TOY), 1); diff --git a/VAX/vax780_uba.c b/VAX/vax780_uba.c index 245e8a22..bb6105fe 100644 --- a/VAX/vax780_uba.c +++ b/VAX/vax780_uba.c @@ -1,6 +1,6 @@ /* vax780_uba.c: VAX 11/780 Unibus adapter - Copyright (c) 2004-2008, Robert M Supnik + Copyright (c) 2004-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ uba DW780 Unibus adapter + 25-Mar-12 RMS Added parameter to int_ack prototype (Mark Pizzolata) 19-Nov-08 RMS Moved I/O support routines to I/O library 28-May-08 RMS Inlined physical memory routines 25-Jan-08 RMS Fixed declarations (Mark Pizzolato) diff --git a/VAX/vax_cpu.c b/VAX/vax_cpu.c index dcf712f5..7614cd00 100644 --- a/VAX/vax_cpu.c +++ b/VAX/vax_cpu.c @@ -1,6 +1,6 @@ /* vax_cpu.c: VAX CPU - Copyright (c) 1998-2011, Robert M Supnik + Copyright (c) 1998-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), diff --git a/VAX/vax_fpa.c b/VAX/vax_fpa.c index 7b789cb5..1b15c179 100644 --- a/VAX/vax_fpa.c +++ b/VAX/vax_fpa.c @@ -1,6 +1,6 @@ /* vax_fpa.c - VAX f_, d_, g_floating instructions - Copyright (c) 1998-2011, Robert M Supnik + Copyright (c) 1998-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), diff --git a/VAX/vax_io.c b/VAX/vax_io.c index 48a2da35..8d6baab0 100644 --- a/VAX/vax_io.c +++ b/VAX/vax_io.c @@ -1,6 +1,6 @@ /* vax_io.c: VAX 3900 Qbus IO simulator - Copyright (c) 1998-2008, Robert M Supnik + Copyright (c) 1998-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ qba Qbus adapter + 25-Mar-12 RMS Added parameter to int_ack prototype (Mark Pizzolata) 28-May-08 RMS Inlined physical memory routines 25-Jan-08 RMS Fixed declarations (Mark Pizzolato) 03-Dec-05 RMS Added SHOW QBA VIRT and ex/dep via map diff --git a/VAX/vax_stddev.c b/VAX/vax_stddev.c index 204be3fe..2d98e3f7 100644 --- a/VAX/vax_stddev.c +++ b/VAX/vax_stddev.c @@ -1,6 +1,6 @@ /* vax_stddev.c: VAX 3900 standard I/O devices - Copyright (c) 1998-2008, Robert M Supnik + Copyright (c) 1998-2012, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -27,6 +27,8 @@ tto terminal output clk 100Hz and TODR clock + 18-Apr-12 RMS Revised TTI to use clock coscheduling and + remove IORESET bug 13-Jan-12 MP Normalized the saved format of the TODR persistent file so that it may be moved around from one platform to another along with other simulator state files @@ -92,7 +94,7 @@ extern int32 int_req[IPL_HLVL]; extern int32 hlt_pin; -extern int32 sim_switches; +extern int32 sim_switches, sim_is_running; int32 tti_csr = 0; /* control/status */ int32 tto_csr = 0; /* control/status */ @@ -319,7 +321,8 @@ t_stat tti_svc (UNIT *uptr) { int32 c; -sim_activate (uptr, KBD_WAIT (uptr->wait, tmr_poll)); /* continue poll */ +sim_activate (uptr, KBD_WAIT (uptr->wait, clk_cosched (tmr_poll))); + /* continue poll */ if ((c = sim_poll_kbd ()) < SCPE_KFLAG) /* no char or error? */ return c; if (c & SCPE_BREAK) { /* break? */ @@ -340,7 +343,7 @@ t_stat tti_reset (DEVICE *dptr) tti_unit.buf = 0; tti_csr = 0; CLR_INT (TTI); -sim_activate_abs (&tti_unit, KBD_WAIT (tti_unit.wait, tmr_poll)); +sim_activate (&tti_unit, KBD_WAIT (tti_unit.wait, tmr_poll)); return SCPE_OK; } @@ -496,10 +499,12 @@ int32 t; clk_csr = 0; CLR_INT (CLK); -t = sim_rtcn_init (clk_unit.wait, TMR_CLK); /* init timer */ -sim_activate_abs (&clk_unit, t); /* activate unit */ -tmr_poll = t; /* set tmr poll */ -tmxr_poll = t * TMXR_MULT; /* set mux poll */ +if (!sim_is_running) { /* RESET (not IORESET)? */ + t = sim_rtcn_init (clk_unit.wait, TMR_CLK); /* init timer */ + sim_activate (&clk_unit, t); /* activate unit */ + tmr_poll = t; /* set tmr poll */ + tmxr_poll = t * TMXR_MULT; /* set mux poll */ + } if (clk_unit.filebuf == NULL) { /* make sure the TODR is initialized */ clk_unit.filebuf = calloc(sizeof(TOY), 1); if (clk_unit.filebuf == NULL) diff --git a/Visual Studio Projects/Simh.sln b/Visual Studio Projects/Simh.sln index 9eb34c1c..af35fd58 100644 --- a/Visual Studio Projects/Simh.sln +++ b/Visual Studio Projects/Simh.sln @@ -59,7 +59,9 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lgp", "lgp.vcproj", "{927C3 EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "I7094", "I7094.vcproj", "{927C3BD9-BD0C-4A23-99F9-DEAD402BEEF9}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SWTP", "SWTP.vcproj", "{0ABAF350-853E-4A8F-8435-B583E29FB78C}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "swtp6800mp-a", "swtp6800mp-a.vcproj", "{0ABAF350-853E-4A8F-8435-B583E29FB78C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "swtp6800mp-a2", "swtp6800mp-a2.vcproj", "{A0BAF350-853E-4A8F-8435-B583E29FFACE}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BuildROMs", "BuildROMs.vcproj", "{D40F3AF1-EEE7-4432-9807-2AD287B490F8}" EndProject @@ -177,6 +179,10 @@ Global {0ABAF350-853E-4A8F-8435-B583E29FB78C}.Debug|Win32.Build.0 = Debug|Win32 {0ABAF350-853E-4A8F-8435-B583E29FB78C}.Release|Win32.ActiveCfg = Release|Win32 {0ABAF350-853E-4A8F-8435-B583E29FB78C}.Release|Win32.Build.0 = Release|Win32 + {A0BAF350-853E-4A8F-8435-B583E29FFACE}.Debug|Win32.ActiveCfg = Debug|Win32 + {A0BAF350-853E-4A8F-8435-B583E29FFACE}.Debug|Win32.Build.0 = Debug|Win32 + {A0BAF350-853E-4A8F-8435-B583E29FFACE}.Release|Win32.ActiveCfg = Release|Win32 + {A0BAF350-853E-4A8F-8435-B583E29FFACE}.Release|Win32.Build.0 = Release|Win32 {D40F3AF1-EEE7-4432-9807-2AD287B490F8}.Debug|Win32.ActiveCfg = Debug|Win32 {D40F3AF1-EEE7-4432-9807-2AD287B490F8}.Debug|Win32.Build.0 = Debug|Win32 {D40F3AF1-EEE7-4432-9807-2AD287B490F8}.Release|Win32.ActiveCfg = Release|Win32 diff --git a/Visual Studio Projects/SWTP.vcproj b/Visual Studio Projects/swtp6800mp-a.vcproj similarity index 78% rename from Visual Studio Projects/SWTP.vcproj rename to Visual Studio Projects/swtp6800mp-a.vcproj index e573d26e..4c1907ad 100644 --- a/Visual Studio Projects/SWTP.vcproj +++ b/Visual Studio Projects/swtp6800mp-a.vcproj @@ -2,9 +2,9 @@ @@ -19,7 +19,7 @@ + + + + + + + + + + + + + + + + + + @@ -217,22 +253,6 @@ RelativePath="..\sim_tmxr.c" > - - - - - - - - diff --git a/Visual Studio Projects/swtp6800mp-a2.vcproj b/Visual Studio Projects/swtp6800mp-a2.vcproj new file mode 100644 index 00000000..d7c86620 --- /dev/null +++ b/Visual Studio Projects/swtp6800mp-a2.vcproj @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/descrip.mms b/descrip.mms index e02bd0e3..9a5414b1 100644 --- a/descrip.mms +++ b/descrip.mms @@ -38,7 +38,8 @@ # PDP15 Just Build The DEC PDP-15. # S3 Just Build The IBM System 3. # SDS Just Build The SDS 940. -# SWTP Just Build The SWTP. +# SWTP6800MP-A Just Build The SWTP6800MP-A. +# SWTP6800MP-A2 Just Build The SWTP6800MP-A2. # VAX Just Build The DEC VAX. # VAX780 Just Build The DEC VAX780. # CLEAN Will Clean Files Back To Base Kit. @@ -573,13 +574,28 @@ SDS_SOURCE = $(SDS_DIR)SDS_CPU.C,$(SDS_DIR)SDS_DRM.C,$(SDS_DIR)SDS_DSK.C,\ SDS_OPTIONS = /INCL=($(SIMH_DIR),$(SDS_DIR))/DEF=($(CC_DEFS)) # -# SWTP 6800 +# SWTP 6800MP A # -SWTP_DIR = SYS$DISK:[.SWTP] -SWTP_LIB = $(LIB_DIR)SWTP-$(ARCH).OLB -SWTP_SOURCE = $(SWTP_DIR)SWTP_CPU.C,$(SWTP_DIR)SWTP_DSK.C,$(SWTP_DIR)SWTP_SIO.C,\ - $(SWTP_DIR)SWTP_SYS.C -SWTP_OPTIONS = /INCL=($(SIMH_DIR),$(SWTP_DIR))/DEF=($(CC_DEFS)) +SWTP6800MP_A_DIR = SYS$DISK:[.SWTP6800.SWTP6800] +SWTP6800MP_A_COMMON = SYS$DISK:[.SWTP6800.COMMON] +SWTP6800MP_A_LIB = $(LIB_DIR)SWTP6800MP-A-$(ARCH).OLB +SWTP6800MP_A_SOURCE = $(SWTP6800MP_A_COMMON)mp-a.c,$(SWTP6800MP_A_COMMON)m6800.c,\ + $(SWTP6800MP_A_COMMON)m6810.c,$(SWTP6800MP_A_COMMON)bootrom.c,$(SWTP6800MP_A_COMMON)dc-4.c,\ + $(SWTP6800MP_A_COMMON)mp-s.c,$(SWTP6800MP_A_DIR)mp-a_sys.c,$(SWTP6800MP_A_COMMON)mp-b2.c,\ + $(SWTP6800MP_A_COMMON)mp-8m.c +SWTP6800MP_A_OPTIONS = /INCL=($(SIMH_DIR),$(SWTP6800MP_A_DIR))/DEF=($(CC_DEFS)) + +# +# SWTP 6800MP A2 +# +SWTP6800MP_A2_DIR = SYS$DISK:[.SWTP6800.SWTP6800] +SWTP6800MP_A2_COMMON = SYS$DISK:[.SWTP6800.COMMON] +SWTP6800MP_A2_LIB = $(LIB_DIR)SWTP6800MP-A2-$(ARCH).OLB +SWTP6800MP_A2_SOURCE = $(SWTP6800MP_A2_COMMON)mp-a2.c,$(SWTP6800MP_A2_COMMON)m6800.c,\ + $(SWTP6800MP_A2_COMMON)m6810.c,$(SWTP6800MP_A2_COMMON)bootrom.c,$(SWTP6800MP_A2_COMMON)dc-4.c,\ + $(SWTP6800MP_A2_COMMON)mp-s.c,$(SWTP6800MP_A2_DIR)mp-a2_sys.c,$(SWTP6800MP_A2_COMMON)mp-b2.c,\ + $(SWTP6800MP_A2_COMMON)mp-8m.c,$(SWTP6800MP_A2_COMMON)i2716.c +SWTP6800MP_A2_OPTIONS = /INCL=($(SIMH_DIR),$(SWTP6800MP_A2_DIR))/DEF=($(CC_DEFS)) # # Digital Equipment VAX Simulator Definitions. @@ -657,14 +673,15 @@ I7094_OPTIONS = /INCL=($(SIMH_DIR),$(I7094_DIR))/DEF=($(CC_DEFS)) .IFDEF ALPHA_OR_IA64 ALL : ALTAIR ALTAIRZ80 ECLIPSE GRI LGP H316 HP2100 I1401 I1620 IBM1130 ID16 \ ID32 NOVA PDP1 PDP4 PDP7 PDP8 PDP9 PDP10 PDP11 PDP15 S3 VAX VAX780 SDS \ - I7094 SWTP + I7094 SWTP6800MP-A SWTP6800MP-A2 $! No further actions necessary .ELSE # # Else We Are On VAX And Build Everything EXCEPT the 64b simulators # ALL : ALTAIR ALTAIRZ80 GRI H316 HP2100 I1401 I1620 IBM1130 ID16 ID32 \ - NOVA PDP1 PDP4 PDP7 PDP8 PDP9 PDP11 PDP15 S3 VAX VAX780 SDS SWTP + NOVA PDP1 PDP4 PDP7 PDP8 PDP9 PDP11 PDP15 S3 VAX VAX780 SDS SWTP6800MP-A \ + SWTP6800MP-A2 $! No further actions necessary .ENDIF @@ -1036,11 +1053,22 @@ $(SDS_LIB) : $(SDS_SOURCE) $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;* -$(SWTP_LIB) : $(SWTP_SOURCE) +$(SWTP6800MP_A_LIB) : $(SWTP6800MP_A_SOURCE) $! $! Building The $(SWTP_LIB) Library. $! - $ $(CC)$(SWTP_OPTIONS) - + $ $(CC)$(SWTP6800MP_A_OPTIONS) - + /OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST) + $ IF (F$SEARCH("$(MMS$TARGET)").EQS."") THEN - + LIBRARY/CREATE $(MMS$TARGET) + $ LIBRARY/REPLACE $(MMS$TARGET) $(BLD_DIR)*.OBJ + $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;* + +$(SWTP6800MP_A2_LIB) : $(SWTP6800MP_A2_SOURCE) + $! + $! Building The $(SWTP_LIB) Library. + $! + $ $(CC)$(SWTP6800MP_A2_OPTIONS) - /OBJ=$(BLD_DIR) $(MMS$CHANGED_LIST) $ IF (F$SEARCH("$(MMS$TARGET)").EQS."") THEN - LIBRARY/CREATE $(MMS$TARGET) @@ -1435,16 +1463,28 @@ $(BIN_DIR)SDS-$(ARCH).EXE : $(SIMH_MAIN) $(SIMH_LIB) $(SDS_LIB) $(BLD_DIR)SCP.OBJ,$(SDS_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;* -SWTP : $(BIN_DIR)SWTP-$(ARCH).EXE - $! SWTP done +SWTP6800MP-A : $(BIN_DIR)SWTP6800MP-A-$(ARCH).EXE + $! SWTP6800MP-A done -$(BIN_DIR)SWTP-$(ARCH).EXE : $(SIMH_MAIN) $(SIMH_LIB) $(SWTP_LIB) +$(BIN_DIR)SWTP6800MP-A-$(ARCH).EXE : $(SIMH_MAIN) $(SIMH_LIB) $(SWTP6800MP_A_LIB) $! - $! Building The $(BIN_DIR)SWTP-$(ARCH).EXE Simulator. + $! Building The $(BIN_DIR)SWTP6800MP-A-$(ARCH).EXE Simulator. $! $ $(CC)$(SWTP_OPTIONS)/OBJ=$(BLD_DIR) SCP.C - $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)SWTP-$(ARCH).EXE - - $(BLD_DIR)SCP.OBJ,$(SWTP_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY + $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)SWTP6800MP-A-$(ARCH).EXE - + $(BLD_DIR)SCP.OBJ,$(SWTP6800MP_A_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY + $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;* + +SWTP6800MP-A2 : $(BIN_DIR)SWTP6800MP-A2-$(ARCH).EXE + $! SWTP6800MP-A2 done + +$(BIN_DIR)SWTP6800MP-A2-$(ARCH).EXE : $(SIMH_MAIN) $(SIMH_LIB) $(SWTP6800MP_A2_LIB) + $! + $! Building The $(BIN_DIR)SWTP6800MP-A2-$(ARCH).EXE Simulator. + $! + $ $(CC)$(SWTP_OPTIONS)/OBJ=$(BLD_DIR) SCP.C + $ LINK $(LINK_DEBUG)/EXE=$(BIN_DIR)SWTP6800MP-A2-$(ARCH).EXE - + $(BLD_DIR)SCP.OBJ,$(SWTP6800MP_A2_LIB)/LIBRARY,$(SIMH_LIB)/LIBRARY $ DELETE/NOLOG/NOCONFIRM $(BLD_DIR)*.OBJ;* VAX : $(BIN_DIR)VAX-$(ARCH).EXE diff --git a/makefile b/makefile index a0debfc0..cd253954 100644 --- a/makefile +++ b/makefile @@ -598,10 +598,15 @@ SDS = ${SDSD}/sds_cpu.c ${SDSD}/sds_drm.c ${SDSD}/sds_dsk.c ${SDSD}/sds_io.c \ ${SDSD}/sds_stddev.c ${SDSD}/sds_sys.c SDS_OPT = -I ${SDSD} -SWTPD = swtp -SWTP = ${SWTPD}/swtp_cpu.c ${SWTPD}/swtp_dsk.c ${SWTPD}/swtp_sio.c \ - ${SWTPD}/swtp_sys.c -SWTP_OPT = -I ${SWTPD} +SWTP6800D = swtp6800/swtp6800 +SWTP6800C = swtp6800/common +SWTP6800MP-A = ${SWTP6800C}/mp-a.c ${SWTP6800C}/m6800.c ${SWTP6800C}/m6810.c \ + ${SWTP6800C}/bootrom.c ${SWTP6800C}/dc-4.c ${SWTP6800C}/mp-s.c ${SWTP6800D}/mp-a_sys.c \ + ${SWTP6800C}/mp-b2.c ${SWTP6800C}/mp-8m.c +SWTP6800MP-A2 = ${SWTP6800C}/mp-a2.c ${SWTP6800C}/m6800.c ${SWTP6800C}/m6810.c \ + ${SWTP6800C}/bootrom.c ${SWTP6800C}/dc-4.c ${SWTP6800C}/mp-s.c ${SWTP6800D}/mp-a2_sys.c \ + ${SWTP6800C}/mp-b2.c ${SWTP6800C}/mp-8m.c ${SWTP6800C}/i2716.c +SWTP6800_OPT = -I ${SWTP6800D} # @@ -610,7 +615,7 @@ SWTP_OPT = -I ${SWTPD} ALL = pdp1 pdp4 pdp7 pdp8 pdp9 pdp15 pdp11 pdp10 \ vax vax780 nova eclipse hp2100 i1401 i1620 s3 \ altair altairz80 gri i7094 ibm1130 id16 \ - id32 sds lgp h316 swtp + id32 sds lgp h316 swtp6800mp-a swtp6800mp-a2 all : ${ALL} @@ -799,8 +804,14 @@ ${BIN}sds${EXE} : ${SDS} ${SIM} ${MKDIRBIN} ${CC} ${SDS} ${SIM} ${SDS_OPT} $(CC_OUTSPEC) ${LDFLAGS} -swtp : ${BIN}swtp${EXE} +swtp6800mp-a : ${BIN}swtp6800mp-a${EXE} -${BIN}swtp${EXE} : ${SWTP} ${SIM} +${BIN}swtp6800mp-a${EXE} : ${SWTP6800MP-A} ${SIM} ${MKDIRBIN} - ${CC} ${SWTP} ${SIM} ${SWTP_OPT} $(CC_OUTSPEC) ${LDFLAGS} + ${CC} ${SWTP6800MP-A} ${SIM} ${SWTP6800_OPT} $(CC_OUTSPEC) ${LDFLAGS} + +swtp6800mp-a2 : ${BIN}swtp6800mp-a2${EXE} + +${BIN}swtp6800mp-a2${EXE} : ${SWTP6800MP-A2} ${SIM} + ${MKDIRBIN} + ${CC} ${SWTP6800MP-A2} ${SIM} ${SWTP6800_OPT} $(CC_OUTSPEC) ${LDFLAGS} diff --git a/swtp/6800boot.dsk b/swtp/6800boot.dsk deleted file mode 100644 index 132cd56935e98384e1a2f7f9fdbcc441ac45ceb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1474560 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 O{ht!<|5W1h|Nb8cMGD9O diff --git a/swtp/6800work.dsk b/swtp/6800work.dsk deleted file mode 100644 index 34a1da5eaab46067eff4ba6b00b0a236018e457c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1474560 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%0ANejgO{F()TkUKBDADAH$4Cb}&G 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

4u;Qn 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 diff --git a/swtp/swtp.txt b/swtp/swtp.txt deleted file mode 100644 index 4d16f9fb..00000000 --- a/swtp/swtp.txt +++ /dev/null @@ -1,100 +0,0 @@ -SWTP 6800 Emulator -===================== - -1. Background. - - The Southwest Technical Products (SWTP) SWTP 6800 was announced 1n the 1976 SWTP Catalog, which boasted you could buy and build this powerful computer kit for only $395. The kit consisted at that time of only the parts to build a case, power supply, mother board, CPU card, serial card with RS-232 or 20 ma loop interface, and memory card with 2048 *bytes* of static memory. - -2. Hardware - - We are simulating a fairly "loaded" SWTP 6800 from about 1978, with the following configuration: - - device simulates - name(s) - - CPU SWTP MP-A with Motorola 6080 CPU board, 62KB of RAM, 2K of EPROM with start boot ROM. - SIO SWTP MP-S Dual Serial Interface Board. Port 1 is assumed to be connected to a serial "glass TTY" that is your terminal running the Simulator. - PTR Second serial port of SIO is assumed to be connected to the paper tap reader/punch. - PTP Second serial port of SIO is assumed to be connected to the paper tap reader/punch. - DSK SWTP DC-4 Floppy Disk controller with up to four drives. - -2.1 The CPU Card (MP-A) - - We allow you to select memory sizes, but be aware that some sample software requires the full 32K (i.e. FLEX). We emulate the SWTP SWTBUG boot rom. - - SET CPU ITRAP Causes the simulator to halt if an invalid 8080 Opcode is detected. - SET CPU NOITRAP Does not stop on an invalid Opcode. This is how the real 6800 operates. - SET CPU MTRAP Causes the simulator to halt if an invalid address is accessed. - SET CPU NOMTRAP Does not stop on invalid address access. This is how a real 6800 operates. - SET CPU 4K - SET CPU 8K - SET CPU 12K - SET CPU 16K - ...... - SET CPU 32K All these set various CPU memory configurations. - The 2K EPROM at the high end of memory is always present and will always boot. - SET CPU MA000 Enable 8 K bytes of memory at $A000-$BFFF. Otherwise, only 128 bytes re available at $A000. - SET CPU NOMA000 Enable only 128 bytes of memory at $A000. - -The SWTBUG EPROM maps to both addresses $E000-E3FF and $FC00-FFFF. - -The real 6800, on receiving a HLT (Halt) instruction, freezes the processor and only an interrupt or CPU hardware reset will restore it. The simulator is a lot nicer, it will halt but send you back to the simulator command line. - -CPU Registers include the following: - - name size comments - - PC 16 Program Counter - A 8 Accumulator A - B 8 Accumulator B - IX 16 Index Register - C 1 Carry flag - Z 1 Zero Flag - H 1 Half-Carry flag - I 1 Interrupt flag - N 1 Negative flag - V 1 Overflao Flag - - -2.2 The Serial I/O Card (MP-S) - - This simple programmed I/O device provides 2 serial ports to the outside world, which could be hardware jumpered to support RS-232 plugs or a TTY current loop interface. The standard I/O addresses assigned by SWTP was $8004-8005 for the first port, and $8006-8007 for the second. We follow this standard in the Simulator. - - The simulator directs I/O to/from the first port to the screen. The second port reads from an attachable "tape reader" file on input, and writes to an attachable "punch file" on output. These files are considered a simple stream of 8-bit bytes. - -2.3 The Floppy Disk controller (DC4) - - The SWTP DC4 is a simple programmed I/O interface to the SWTP MF-68 5-inch dual floppy drive, which was basically a pair of Shugart SA-400s with a power supply and buffer board builtin. The controller supports neither interrupts nor DMA, so floppy access required the sustained attention of the CPU. The standard I/O addresses were $8018-801B, and we follow the standard. Details on controlling this hardware are in the swtp_dsk.c source file. - - -3. Sample Software - - Running an SWTP 6800 in 1978 you would be running the FLEX Version 2.0 Operating System from Technical Systems Consultants, Inc. - -3.1 CP/M Version 2.2 - - This version is a port of the standard FLEX Version 2.0 to the SWTP 6800. - - To boot FLEX: - - sim> set cpu hex - sim> set cpu itrap - sim> set cpu mtrap - sim> att dsk 6800boot.dsk - sim> att dsk1 6800work.dsk - sim> set cpu MA000 - sim> set dsk1 rw - sim> go - - $D ; Capital D causes SWTBUG to boot Flex - FLEX 2.0 - - DATE (MM,DD,YY)? 03,09,99 ; Must enter a date from last century! - - +++ ;Flex prompt! - - - - - - diff --git a/swtp/swtp6800 b/swtp/swtp6800 deleted file mode 100644 index 0c8c2d1d..00000000 --- a/swtp/swtp6800 +++ /dev/null @@ -1,9 +0,0 @@ -reset -set cpu hex -set cpu itrap -set cpu mtrap -att dsk 6800boot.dsk -att dsk1 6800work.dsk -set cpu MA000 -set dsk1 rw -g diff --git a/swtp/swtp_cpu.c b/swtp/swtp_cpu.c deleted file mode 100644 index e93797f9..00000000 --- a/swtp/swtp_cpu.c +++ /dev/null @@ -1,2293 +0,0 @@ -/* swtp_6800_cpu.c: SWTP 6800 Motorola 6800 CPU simulator - - Copyright (c) 2005, 2007, William Beech - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - WILLIAM A. BEECH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the name of William A. Beech shall not - be used in advertising or otherwise to promote the sale, use or other dealings - in this Software without prior written authorization from William A. Beech. - - Based on work by Charles E Owen (c) 1997 and Peter Schorn (c) 2002-2005 - - cpu 6800 CPU - - The register state for the 6800 CPU is: - - A<0:7> Accumulator A - B<0:7> Accumulator B - IX<0:15> Index Register - H half-carry flag - I interrupt flag - N negative flag - Z zero flag - V overflow flag - C carry flag - PC<0:15> program counter - SP<0:15> Stack Pointer - - The 6800 is an 8-bit CPU, which uses 16-bit registers to address - up to 64KB of memory. - - The 72 basic instructions come in 1, 2, and 3-byte flavors. - - This routine is the instruction decode routine for the 6800. - It is called from the simulator control program to execute - instructions in simulated memory, starting at the simulated PC. - It runs until 'reason' is set non-zero. - - General notes: - - 1. Reasons to stop. The simulator can be stopped by: - - WAI instruction - I/O error in I/O simulator - Invalid OP code (if ITRAP is set on CPU) - Invalid mamory address (if MTRAP is set on CPU) - - 2. Interrupts. - There are 4 types of interrupt, and in effect they do a - hardware CALL instruction to one of 4 possible high memory addresses. - - 3. Non-existent memory. On the SWTP 6800, reads to non-existent memory - return 0FFH, and writes are ignored. In the simulator, the - largest possible memory is instantiated and initialized to zero. - Thus, only writes need be checked against actual memory size. - - 4. Adding I/O devices. These modules must be modified: - - swtp_6800_cpu.c add I/O service routines to dev_table - swtp_sys.c add pointer to data structures in sim_devices -*/ - -#include - -#include "swtp_defs.h" - -//#include -//#include - -#define UNIT_V_OPSTOP (UNIT_V_UF) /* Stop on Invalid OP? */ -#define UNIT_OPSTOP (1 << UNIT_V_OPSTOP) -#define UNIT_V_MSTOP (UNIT_V_UF+1) /* Stop on Invalid memory? */ -#define UNIT_MSTOP (1 << UNIT_V_MSTOP) -#define UNIT_V_MSIZE (UNIT_V_UF+2) /* Memory Size */ -#define UNIT_MSIZE (1 << UNIT_V_MSIZE) -#define UNIT_V_MA000 (UNIT_V_UF+2) /* 128B or 8kB at 0xA000 */ -#define UNIT_MA000 (1 << UNIT_V_MA000) - -uint8 M[MAXMEMSIZE]; /* Memory */ -int32 A = 0; /* Accumulator A */ -int32 B = 0; /* Accumulator B */ -int32 IX = 0; /* Index register */ -int32 SP = 0; /* Stack pointer */ -int32 H = 0; /* Half-carry flag */ -int32 I = 1; /* Interrupt flag */ -int32 N = 0; /* Negative flag */ -int32 Z = 0; /* Zero flag */ -int32 V = 0; /* Overflow flag */ -int32 C = 0; /* Carry flag */ -int32 saved_PC = 0; /* Program counter */ -int32 INTE = 0; /* Interrupt Enable */ -int32 int_req = 0; /* Interrupt request */ - -int32 mem_fault = 0; /* memory fault flag */ - -extern int32 sim_int_char; -extern uint32 sim_brk_types, sim_brk_dflt, sim_brk_summ;/* breakpoint info */ - -/* function prototypes */ - -t_stat cpu_ex (t_value *vptr, t_addr addr, UNIT *uptr, int32 sw); -t_stat cpu_dep (t_value val, t_addr addr, UNIT *uptr, int32 sw); -t_stat cpu_reset (DEVICE *dptr); -t_stat cpu_set_size (UNIT *uptr, int32 val, char *cptr, void *desc); -void dump_regs(); -void go_rel(int32 cond); -int32 get_rel_addr(); -int32 get_dir_val(); -int32 get_dir_addr(); -int32 get_indir_val(); -int32 get_indir_addr(); -int32 get_ext_val(); -int32 get_ext_addr(); -int32 get_psw(); -void set_psw(int32 psw); -void condevalH(int32 res); -void condevalN(int32 res); -void condevalZ(int32 res); -void condevalC(int32 res); -void condevalVa(int32 op1, int32 op2); -void condevalVs(int32 op1, int32 op2); -void mem_put_byte(int32 addr, int32 val); -void mem_put_word(int32 addr, int32 val); -int32 mem_get_byte(int32 addr); -int32 mem_get_word(int32 addr); -int32 nulldev(int32 io, int32 data); - -/* external routines */ - -extern int32 sio0s(int32 io, int32 data); -extern int32 sio0d(int32 io, int32 data); -extern int32 sio1s(int32 io, int32 data); -extern int32 sio1d(int32 io, int32 data); -extern int32 fdcdrv(int32 io, int32 data); -extern int32 fdccmd(int32 io, int32 data); -extern int32 fdctrk(int32 io, int32 data); -extern int32 fdcsec(int32 io, int32 data); -extern int32 fdcdata(int32 io, int32 data); -extern int32 fprint_sym (FILE *of, int32 addr, uint32 *val, - UNIT *uptr, int32 sw); - - -/* This is the I/O configuration table. There are 32 possible -device addresses, if a device is plugged into a port it's routine -address is here, 'nulldev' means no device is available -*/ - -struct idev { - int32 (*routine)(int32, int32); -}; - -struct idev dev_table[32] = { - {&nulldev}, {&nulldev}, {&nulldev}, {&nulldev}, /*Port 0 8000-8003*/ - {&sio0s}, {&sio0d}, {&sio1s}, {&sio1d}, /*Port 1 8004-8007*/ -/* sio1x routines just return the last value read on the matching - sio0x routine. SWTBUG tests for the MP-C with most port reads! */ - {&nulldev}, {&nulldev}, {&nulldev}, {&nulldev}, /*Port 2 8008-800B*/ - {&nulldev}, {&nulldev}, {&nulldev}, {&nulldev}, /*Port 3 800C-800F*/ - {&nulldev}, {&nulldev}, {&nulldev}, {&nulldev}, /*Port 4 8010-8013*/ - {&fdcdrv}, {&nulldev}, {&nulldev}, {&nulldev}, /*Port 5 8014-8017*/ - {&fdccmd}, {&fdctrk}, {&fdcsec}, {&fdcdata}, /*Port 6 8018-801B*/ - {&nulldev}, {&nulldev}, {&nulldev}, {&nulldev} /*Port 7 801C-801F*/ -}; - -/* SWTP 6800 SWTBUG BOOT EPROM, fits at 0E000-0E3FFH and replicated - at 0FC000-0FFFF for the interrupt vectors */ - -#define BOOTLEN 1024 - -int32 bootrom[BOOTLEN] = { -0xFE,0xA0,0x00,0x6E,0x00,0x8D,0x40,0x6E, -0x00,0x10,0x16,0x04,0xBD,0xE3,0x34,0x8D, -0x67,0x81,0x53,0x26,0xFA,0x8D,0x61,0x81, -0x39,0x27,0x29,0x81,0x31,0x26,0xF0,0x7F, -0xA0,0x0F,0x8D,0x31,0x80,0x02,0xB7,0xA0, -0x47,0x8D,0x1C,0x8D,0x28,0x7A,0xA0,0x47, -0x27,0x09,0xA7,0x00,0xA1,0x00,0x26,0x08, -0x08,0x20,0xF0,0x7C,0xA0,0x0F,0x27,0xCF, -0x86,0x3F,0x8D,0x31,0x7E,0xE2,0xD4,0x8D, -0x0C,0xB7,0xA0,0x0D,0x8D,0x07,0xB7,0xA0, -0x0E,0xFE,0xA0,0x0D,0x39,0x8D,0x53,0x48, -0x48,0x48,0x48,0x16,0x8D,0x4C,0x1B,0x16, -0xFB,0xA0,0x0F,0xF7,0xA0,0x0F,0x39,0x44, -0x44,0x44,0x44,0x84,0x0F,0x8B,0x30,0x81, -0x39,0x23,0x02,0x8B,0x07,0x7E,0xE1,0xD1, -0x7E,0xE1,0xAC,0x8D,0xF8,0x08,0xA6,0x00, -0x81,0x04,0x26,0xF7,0x39,0x7E,0xE1,0x4A, -0x8D,0xBD,0xCE,0xE1,0x9D,0x8D,0xEF,0xCE, -0xA0,0x0D,0x8D,0x34,0xFE,0xA0,0x0D,0x8D, -0x31,0x8D,0x31,0x8D,0xDB,0x81,0x20,0x27, -0xFA,0x81,0x0D,0x27,0xE0,0x81,0x5E,0x20, -0x2C,0x01,0x8D,0xCC,0x80,0x30,0x2B,0x4C, -0x81,0x09,0x2F,0x0A,0x81,0x11,0x2B,0x44, -0x81,0x16,0x2E,0x40,0x80,0x07,0x39,0xA6, -0x00,0x8D,0xA4,0xA6,0x00,0x08,0x20,0xA3, -0x8D,0xF5,0x8D,0xF3,0x86,0x20,0x20,0xA5, -0x8E,0xA0,0x42,0x20,0x2C,0x26,0x07,0x09, -0x09,0xFF,0xA0,0x0D,0x20,0xAC,0xFF,0xA0, -0x0D,0x20,0x02,0x20,0x6D,0x81,0x30,0x25, -0xA1,0x81,0x46,0x22,0x9D,0x8D,0xBD,0xBD, -0xE0,0x57,0x09,0xA7,0x00,0xA1,0x00,0x27, -0x91,0x7E,0xE0,0x40,0xBE,0xA0,0x08,0x20, -0x49,0xBF,0xA0,0x08,0x86,0xFF,0xBD,0xE3, -0x08,0xCE,0x80,0x04,0xBD,0xE2,0x84,0xA6, -0x00,0xA1,0x02,0x20,0x02,0x20,0x19,0x26, -0x39,0x86,0x03,0xA7,0x00,0x86,0x11,0xA7, -0x00,0x20,0x2F,0x01,0xBF,0xA0,0x08,0x30, -0x6D,0x06,0x26,0x02,0x6A,0x05,0x6A,0x06, -0xCE,0xE1,0x9D,0xBD,0xE0,0x7E,0xFE,0xA0, -0x08,0x08,0x8D,0x8E,0x8D,0x8C,0x8D,0x8A, -0x8D,0x86,0x8D,0x84,0xCE,0xA0,0x08,0xBD, -0xE0,0xC8,0xFE,0xA0,0x12,0x8C,0xE1,0x23, -0x27,0x19,0x8E,0xA0,0x42,0xCE,0x80,0x04, -0xFF,0xA0,0x0A,0x7F,0xA0,0x0C,0x8D,0x73, -0x27,0x03,0xBD,0xE2,0x7D,0xBD,0xE3,0x53, -0xBD,0xE3,0x47,0xCE,0xE1,0x9C,0xBD,0xE0, -0x7E,0x8D,0x39,0xCE,0xE3,0xD1,0xA1,0x00, -0x26,0x07,0xBD,0xE0,0xCC,0xEE,0x01,0x6E, -0x00,0x08,0x08,0x08,0x8C,0xE3,0xF8,0x26, -0xED,0x20,0xBF,0xFE,0xA0,0x12,0x6E,0x00, -0x53,0x39,0x04,0x0D,0x0A,0x15,0x00,0x00, -0x00,0x53,0x31,0x04,0x13,0x0D,0x0A,0x15, -0x00,0x00,0x00,0x24,0x04,0x20,0x4C,0xFE, -0xA0,0x06,0x6E,0x00,0x20,0x40,0xBD,0xE0, -0x47,0xFF,0xA0,0x04,0xBD,0xE0,0x47,0xBD, -0xE0,0x55,0x16,0xA6,0x00,0xFF,0xA0,0x0D, -0x11,0x27,0x02,0x20,0x21,0xCE,0xE1,0x9D, -0xBD,0xE0,0x7E,0xCE,0xA0,0x0D,0x20,0x10, -0x3B,0x20,0x3A,0xFF,0xA0,0x10,0xFE,0xA0, -0x0A,0x37,0xE6,0x01,0xE1,0x03,0x33,0x39, -0xBD,0xE0,0xC8,0xFE,0xA0,0x0D,0xBC,0xA0, -0x04,0x27,0x9E,0x08,0x20,0xCD,0x8D,0x06, -0x84,0x7F,0x39,0x31,0x31,0x31,0x37,0x8D, -0xDA,0x26,0x28,0x86,0x15,0xA7,0x00,0xA6, -0x00,0x47,0x24,0xFB,0xA6,0x01,0xF6,0xA0, -0x0C,0x27,0x07,0x20,0x11,0x37,0x8D,0xC3, -0x26,0x2E,0xC6,0x11,0xE7,0x00,0xE6,0x00, -0x57,0x57,0x24,0xFA,0xA7,0x01,0x33,0xFE, -0xA0,0x10,0x39,0xA6,0x00,0x2B,0xFC,0x8D, -0x3A,0xC6,0x04,0xE7,0x02,0x58,0x8D,0x2A, -0x0D,0x69,0x00,0x46,0x5A,0x26,0xF7,0x8D, -0x21,0xF6,0xA0,0x0C,0x27,0x13,0x20,0xDE, -0x8D,0x23,0xC6,0x0A,0x6A,0x00,0x8D,0x16, -0x8D,0x10,0xA7,0x00,0x0D,0x46,0x5A,0x26, -0xF7,0xE6,0x02,0x58,0x2A,0xC8,0x8D,0x02, -0x20,0xC4,0x6D,0x02,0x2A,0xFC,0x6C,0x02, -0x6A,0x02,0x39,0x6F,0x02,0x8D,0xF7,0x20, -0xF1,0x8D,0x83,0x16,0x7F,0xA0,0x0B,0xFE, -0xA0,0x0A,0x8D,0x10,0x8D,0x07,0xCE,0xE3, -0xEF,0x17,0x7E,0xE1,0x76,0x86,0x34,0xA7, -0x03,0xA7,0x02,0x39,0x6C,0x00,0x86,0x07, -0xA7,0x01,0x6C,0x00,0xA7,0x02,0x39,0x7F, -0x80,0x14,0x8D,0x2E,0xC6,0x0B,0x8D,0x25, -0xE6,0x04,0xC5,0x01,0x26,0xFA,0x6F,0x06, -0x8D,0x1D,0xC6,0x9C,0x8D,0x17,0xCE,0x24, -0x00,0xC5,0x02,0x27,0x06,0xB6,0x80,0x1B, -0xA7,0x00,0x08,0xF6,0x80,0x18,0xC5,0x01, -0x26,0xEF,0x7E,0x24,0x00,0xE7,0x04,0x8D, -0x00,0x39,0xCE,0xFF,0xFF,0x09,0x8C,0x80, -0x14,0x26,0xFA,0x39,0xCE,0xE0,0x09,0xBD, -0xE0,0x7E,0x8D,0xF1,0xBD,0xE3,0x47,0x20, -0x58,0xCE,0xE1,0x23,0xBC,0xA0,0x12,0x27, -0x1A,0x08,0x8D,0x32,0xBD,0xE0,0x47,0xFF, -0xA0,0x14,0xA6,0x00,0xB7,0xA0,0x16,0x86, -0x3F,0xA7,0x00,0xCE,0xE1,0x23,0x8D,0x1E, -0x7E,0xE1,0x6B,0xFE,0xA0,0x14,0xB6,0xA0, -0x16,0xA7,0x00,0xCE,0xE1,0x24,0x20,0xDA, -0xB7,0xA0,0x43,0xFE,0xA0,0x12,0x8C,0xE1, -0x23,0x27,0x06,0xCE,0xE1,0x24,0xFF,0xA0, -0x12,0x39,0x8D,0x5A,0x20,0x0F,0xCE,0xA0, -0x49,0xFF,0xA0,0x04,0x09,0x8D,0x52,0xCE, -0xE1,0x90,0xBD,0xE0,0x7E,0x8D,0x24,0x8D, -0x91,0x7E,0xE1,0x52,0x73,0xA0,0x0C,0x86, -0x11,0xC6,0x20,0x8D,0x1A,0xBD,0xE1,0xD9, -0x27,0x04,0x86,0x3C,0xA7,0x03,0x39,0x86, -0x13,0xC6,0x10,0x20,0x0A,0x86,0x12,0xC6, -0x04,0x20,0x04,0x86,0x14,0xC6,0x08,0xBD, -0xE0,0x75,0xBD,0xE1,0xD6,0x27,0x16,0x86, -0x02,0xCA,0x01,0x8D,0x0C,0x8D,0x08,0x86, -0x02,0xC6,0x01,0xE7,0x00,0x8D,0x02,0x86, -0x06,0xA7,0x01,0xE7,0x00,0x39,0xFE,0xA0, -0x02,0xFF,0xA0,0x44,0x8D,0xCF,0xB6,0xA0, -0x05,0xB0,0xA0,0x45,0xF6,0xA0,0x04,0xF2, -0xA0,0x44,0x26,0x04,0x81,0x10,0x25,0x02, -0x86,0x0F,0x8B,0x04,0xB7,0xA0,0x47,0x80, -0x03,0xB7,0xA0,0x46,0xCE,0xE1,0x93,0xBD, -0xE0,0x7E,0x5F,0xCE,0xA0,0x47,0x8D,0x24, -0xCE,0xA0,0x44,0x8D,0x1F,0x8D,0x1D,0xFE, -0xA0,0x44,0x8D,0x18,0x7A,0xA0,0x46,0x26, -0xF9,0xFF,0xA0,0x44,0x53,0x37,0x30,0x8D, -0x0B,0x33,0xFE,0xA0,0x44,0x09,0xBC,0xA0, -0x04,0x26,0xB3,0x39,0xEB,0x00,0x7E,0xE0, -0xBF,0x47,0xE1,0xD0,0x5A,0xC0,0x00,0x4D, -0xE0,0x88,0x46,0xE1,0xAE,0x52,0xE1,0x30, -0x4A,0xE0,0x05,0x43,0xE2,0xCC,0x44,0xE2, -0x8F,0x42,0xE2,0xD9,0x4F,0xE2,0x69,0x50, -0xE3,0x1A,0x4C,0xE0,0x0C,0x45,0xE3,0x1E, -0xE0,0x00,0xE1,0x8B,0xE1,0xA7,0xE0,0xD0 -}; - -/* CPU data structures - - cpu_dev CPU device descriptor - cpu_unit CPU unit descriptor - cpu_reg CPU register list - cpu_mod CPU modifiers list */ - -UNIT cpu_unit = { UDATA (NULL, UNIT_FIX + UNIT_BINK, - 32768) }; - -REG cpu_reg[] = { - { HRDATA (PC, saved_PC, 16) }, - { HRDATA (A, A, 8) }, - { HRDATA (B, B, 8) }, - { HRDATA (IX, IX, 16) }, - { HRDATA (SP, SP, 16) }, - { FLDATA (H, H, 16) }, - { FLDATA (I, I, 16) }, - { FLDATA (N, N, 16) }, - { FLDATA (Z, Z, 16) }, - { FLDATA (V, V, 16) }, - { FLDATA (C, C, 16) }, - { FLDATA (INTE, INTE, 16) }, - { ORDATA (WRU, sim_int_char, 8) }, - { NULL } }; - -MTAB cpu_mod[] = { - { UNIT_OPSTOP, UNIT_OPSTOP, "ITRAP", "ITRAP", NULL }, - { UNIT_OPSTOP, 0, "NOITRAP", "NOITRAP", NULL }, - { UNIT_MSTOP, UNIT_MSTOP, "MTRAP", "MTRAP", NULL }, - { UNIT_MSTOP, 0, "NOMTRAP", "NOMTRAP", NULL }, - { UNIT_MSIZE, 4096, NULL, "4K", &cpu_set_size }, - { UNIT_MSIZE, 8192, NULL, "8K", &cpu_set_size }, - { UNIT_MSIZE, 12288, NULL, "12K", &cpu_set_size }, - { UNIT_MSIZE, 16384, NULL, "16K", &cpu_set_size }, - { UNIT_MSIZE, 20480, NULL, "20K", &cpu_set_size }, - { UNIT_MSIZE, 24576, NULL, "24K", &cpu_set_size }, - { UNIT_MSIZE, 28672, NULL, "28K", &cpu_set_size }, - { UNIT_MSIZE, 32768, NULL, "32K", &cpu_set_size }, - { UNIT_MA000, UNIT_MA000, "MA000", "MA000", NULL }, - { UNIT_MA000, 0, "NOMA000", "NOMA000", NULL }, - { 0 } }; - -DEVICE cpu_dev = { - "CPU", &cpu_unit, cpu_reg, cpu_mod, - 1, 16, 16, 1, 16, 8, - &cpu_ex, &cpu_dep, &cpu_reset, - NULL, NULL, NULL }; - -int32 PC; /* global for the helper routines */ - -int32 sim_instr (void) -{ - extern int32 sim_interval; - int32 IR, OP, DAR, reason, hi, lo, op1; -// uint32 val1[3]; - - PC = saved_PC & ADDRMASK; /* load local PC */ - reason = 0; - - /* Main instruction fetch/decode loop */ - - while (reason == 0) { /* loop until halted */ - if (sim_interval <= 0) /* check clock queue */ - if (reason = sim_process_event ()) - break; - if (mem_fault) { /* memory fault? */ - mem_fault = 0; /* reset fault flag */ - reason = STOP_MEMORY; - break; - } - if (int_req > 0) { /* interrupt? */ - /* 6800 interrupts not implemented yet. None were used, - on a standard SWTP 6800. All I/O is programmed. */ - } /* end interrupt */ - if (sim_brk_summ && - sim_brk_test (PC, SWMASK ('E'))) { /* breakpoint? */ - reason = STOP_IBKPT; /* stop simulation */ - break; - } - /* transient routine area - trace */ - /* - if (PC >= 0xa100 && PC < 0xa400) { - dump_regs(); - printf("\n\r%04X: ", PC); - val1[0] = M[PC]; - val1[1] = M[PC+1]; - val1[2] = M[PC+2]; - fprint_sym(stdout, PC, val1, NULL, SWMASK ('M')); - } -*/ - IR = OP = mem_get_byte(PC); /* fetch instruction */ - PC = (PC + 1) & ADDRMASK; /* increment PC */ - sim_interval--; - - /* The Big Instruction Decode Switch */ - - switch (IR) { - - case 0x01: /* NOP */ - break; - case 0x06: /* TAP */ - set_psw(A); - break; - case 0x07: /* TPA */ - A = get_psw(); - break; - case 0x08: /* INX */ - IX = (IX + 1) & ADDRMASK; - condevalZ(IX); - break; - case 0x09: /* DEX */ - IX = (IX - 1) & ADDRMASK; - condevalZ(IX); - break; - case 0x0A: /* CLV */ - V = 0; - break; - case 0x0B: /* SEV */ - V = 0x10000; - break; - case 0x0C: /* CLC */ - C = 0; - break; - case 0x0D: /* SEC */ - C = 0x10000; - break; - case 0x0E: /* CLI */ - I = 0; - break; - case 0x0F: /* SEI */ - I = 0x10000; - break; - case 0x10: /* SBA */ - op1 = A; - A = A - B; - condevalN(A); - condevalZ(A); - condevalC(A); - condevalVs(B, op1); - A &= 0xFF; - break; - case 0x11: /* CBA */ - lo = A - B; - condevalN(lo); - condevalZ(lo); - condevalC(lo); - condevalVs(B, A); - break; - case 0x16: /* TAB */ - B = A; - condevalN(B); - condevalZ(B); - V = 0; - break; - case 0x17: /* TBA */ - A = B; - condevalN(B); - condevalZ(B); - V = 0; - break; - case 0x19: /* DAA */ - DAR = A & 0x0F; - op1 = C; - if (DAR > 9 || C) { - DAR += 6; - A &= 0xF0; - A |= DAR & 0x0F; - C = 0; - if (DAR & 0x10) - C = 0x10000; - } - DAR = (A >> 4) & 0x0F; - if (DAR > 9 || C) { - DAR += 6; - if (C) - DAR++; - A &= 0x0F; - A |= (DAR << 4); - } - C = op1; - if ((DAR << 4) & 0x100) - C = 0x10000; - condevalN(A); - condevalZ(A); - A &= 0xFF; - break; - case 0x1B: /* ABA */ - A += B; - condevalH(A); - condevalN(A); - condevalZ(A); - condevalC(A); - condevalVa(A, B); - A &= 0xFF; - break; - case 0x20: /* BRA rel */ - go_rel(1); - break; - case 0x22: /* BHI rel */ - go_rel(!(C | Z)); - break; - case 0x23: /* BLS rel */ - go_rel(C | Z); - break; - case 0x24: /* BCC rel */ - go_rel(!C); - break; - case 0x25: /* BCS rel */ - go_rel(C); - break; - case 0x26: /* BNE rel */ - go_rel(!Z); - break; - case 0x27: /* BEQ rel */ - go_rel(Z); - break; - case 0x28: /* BVC rel */ - go_rel(!V); - break; - case 0x29: /* BVS rel */ - go_rel(V); - break; - case 0x2A: /* BPL rel */ - go_rel(!N); - break; - case 0x2B: /* BMI rel */ - go_rel(N); - break; - case 0x2C: /* BGE rel */ - go_rel(!(N ^ V)); - break; - case 0x2D: /* BLT rel */ - go_rel(N ^ V); - break; - case 0x2E: /* BGT rel */ - go_rel(!(Z | (N ^ V))); - break; - case 0x2F: /* BLE rel */ - go_rel(Z | (N ^ V)); - break; - case 0x30: /* TSX */ - IX = (SP + 1) & ADDRMASK; - break; - case 0x31: /* INS */ - SP = (SP + 1) & ADDRMASK; - break; - case 0x32: /* PUL A */ - SP = (SP + 1) & ADDRMASK; - A = mem_get_byte(SP); - break; - case 0x33: /* PUL B */ - SP = (SP + 1) & ADDRMASK; - B = mem_get_byte(SP); - break; - case 0x34: /* DES */ - SP = (SP - 1) & ADDRMASK; - break; - case 0x35: /* TXS */ - SP = (IX - 1) & ADDRMASK; - break; - case 0x36: /* PSH A */ - mem_put_byte(SP, A); - SP = (SP - 1) & ADDRMASK; - break; - case 0x37: /* PSH B */ - mem_put_byte(SP, B); - SP = (SP - 1) & ADDRMASK; - break; - case 0x39: /* RTS */ - SP = (SP + 1) & ADDRMASK; - PC = mem_get_word(SP) & ADDRMASK; - SP = (SP + 1) & ADDRMASK; - break; - case 0x3B: /* RTI */ - SP = (SP + 1) & ADDRMASK; - set_psw(mem_get_byte(SP)); - SP = (SP + 1) & ADDRMASK; - B = mem_get_byte(SP); - SP = (SP + 1) & ADDRMASK; - A = mem_get_byte(SP); - SP = (SP + 1) & ADDRMASK; - IX = mem_get_word(SP); - SP = (SP + 2) & ADDRMASK; - PC = mem_get_word(SP) & ADDRMASK; - SP = (SP + 1) & ADDRMASK; - break; - case 0x3E: /* WAI */ - SP = (SP - 1) & ADDRMASK; - mem_put_word(SP, PC); - SP = (SP - 2) & ADDRMASK; - mem_put_word(SP, IX); - SP = (SP - 1) & ADDRMASK; - mem_put_byte(SP, A); - SP = (SP - 1) & ADDRMASK; - mem_put_byte(SP, B); - SP = (SP - 1) & ADDRMASK; - mem_put_byte(SP, get_psw()); - SP = (SP - 1) & ADDRMASK; - if (I) { - reason = STOP_HALT; - continue; - } else { - I = 0x10000; - PC = mem_get_word(0xFFFE) & ADDRMASK; - } - break; - case 0x3F: /* SWI */ - SP = (SP - 1) & ADDRMASK; - mem_put_word(SP, PC); - SP = (SP - 2) & ADDRMASK; - mem_put_word(SP, IX); - SP = (SP - 1) & ADDRMASK; - mem_put_byte(SP, A); - SP = (SP - 1) & ADDRMASK; - mem_put_byte(SP, B); - SP = (SP - 1) & ADDRMASK; - mem_put_byte(SP, get_psw()); - SP = (SP - 1) & ADDRMASK; - I = 0x10000; - PC = mem_get_word(0xFFFB) & ADDRMASK; - break; - case 0x40: /* NEG A */ - A = (0 - A) & 0xFF; - V = 0; - if (A & 0x80) - V = 0x10000; - C = 0; - if (A) - C = 0x10000; - condevalN(A); - condevalZ(A); - break; - case 0x43: /* COM A */ - A = ~A & 0xFF; - V = 0; - C = 0x10000; - condevalN(A); - condevalZ(A); - break; - case 0x44: /* LSR A */ - C = 0; - if (A & 0x01) - C = 0x10000; - A = (A >> 1) & 0xFF; - N = 0; - condevalZ(A); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x46: /* ROR A */ - hi = C; - C = 0; - if (A & 0x01) - C = 0x10000; - A = (A >> 1) & 0xFF; - if (hi) - A |= 0x80; - condevalN(A); - condevalZ(A); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x47: /* ASR A */ - C = 0; - if (A & 0x01) - C = 0x10000; - lo = A & 0x8000; - A = (A >> 1) & 0xFF; - A |= lo; - condevalN(A); - condevalZ(A); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x48: /* ASL A */ - C = 0; - if (A & 0x80) - C = 0x10000; - A = (A << 1) & 0xFF; - condevalN(A); - condevalZ(A); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x49: /* ROL A */ - hi = C; - C = 0; - if (A & 0x80) - C = 0x10000; - A = (A << 1) & 0xFF; - if (hi) - A |= 0x01; - condevalN(A); - condevalZ(A); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x4A: /* DEC A */ - V = 0; - if (A == 0x80) - V = 0x10000; - A = (A - 1) & 0xFF; - condevalN(A); - condevalZ(A); - break; - case 0x4C: /* INC A */ - V = 0; - if (A == 0x7F) - V = 0x10000; - A = (A + 1) & 0xFF; - condevalN(A); - condevalZ(A); - break; - case 0x4D: /* TST A */ - lo = (A - 0) & 0xFF; - V = 0; - C = 0; - condevalN(lo); - condevalZ(lo); - break; - case 0x4F: /* CLR A */ - A = 0; - N = V = C = 0; - Z = 0x10000; - break; - case 0x50: /* NEG B */ - B = (0 - V) & 0xFF; - V = 0; - if (B & 0x8000) - V = 0x10000; - C = 0; - if (B) - C = 0x10000; - condevalN(B); - condevalZ(B); - break; - case 0x53: /* COM B */ - B = ~B & 0xFF; - V = 0; - C = 0x10000; - condevalN(B); - condevalZ(B); - break; - case 0x54: /* LSR B */ - C = 0; - if (B & 0x01) - C = 0x10000; - B = (B >> 1) & 0xFF; - N = 0; - condevalZ(B); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x56: /* ROR B */ - hi = C; - C = 0; - if (B & 0x01) - C = 0x10000; - B = (B >> 1) & 0xFF; - if (hi) - B |= 0x80; - condevalN(B); - condevalZ(B); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x57: /* ASR B */ - C = 0; - if (B & 0x01) - C = 0x10000; - lo = B & 0x8000; - B = (B >> 1) & 0xFF; - B |= lo; - condevalN(B); - condevalZ(B); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x58: /* ASL B */ - C = 0; - if (B & 0x80) - C = 0x10000; - B = (B << 1) & 0xFF; - condevalN(B); - condevalZ(B); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x59: /* ROL B */ - hi = C; - C = 0; - if (B & 0x80) - C = 0x10000; - B = (B << 1) & 0xFF; - if (hi) - B |= 0x01; - condevalN(B); - condevalZ(B); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x5A: /* DEC B */ - V = 0; - if (B == 0x80) - V = 0x10000; - B = (B - 1) & 0xFF; - condevalN(B); - condevalZ(B); - break; - case 0x5C: /* INC B */ - V = 0; - if (B == 0x7F) - V = 0x10000; - B = (B + 1) & 0xFF; - condevalN(B); - condevalZ(B); - break; - case 0x5D: /* TST B */ - lo = (B - 0) & 0xFF; - V = 0; - C = 0; - condevalN(lo); - condevalZ(lo); - break; - case 0x5F: /* CLR B */ - B = 0; - N = V = C = 0; - Z = 0x10000; - break; - case 0x60: /* NEG ind */ - DAR = get_indir_addr(); - lo = (0 - mem_get_byte(DAR)) & 0xFF; - mem_put_byte(DAR, lo); - V = 0; - if (lo & 0x80) - V = 0x10000; - C = 0; - if (lo) - C = 0x10000; - condevalN(lo); - condevalZ(lo); - break; - case 0x63: /* COM ind */ - DAR = get_indir_addr(); - lo = ~mem_get_byte(DAR) & 0xFF; - mem_put_byte(DAR, lo); - V = 0; - C = 0x10000; - condevalN(lo); - condevalZ(lo); - break; - case 0x64: /* LSR ind */ - DAR = get_indir_addr(); - lo = mem_get_byte(DAR); - C = 0; - if (lo & 0x01) - C = 0x10000; - lo >>= 1; - mem_put_byte(DAR, lo); - N = 0; - condevalZ(lo); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x66: /* ROR ind */ - DAR = get_indir_addr(); - lo = mem_get_byte(DAR); - hi = C; - C = 0; - if (lo & 0x01) - C = 0x10000; - lo >>= 1; - if (hi) - lo |= 0x80; - mem_put_byte(DAR, lo); - condevalN(lo); - condevalZ(lo); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x67: /* ASR ind */ - DAR = get_indir_addr(); - lo = mem_get_byte(DAR); - C = 0; - if (lo & 0x01) - C = 0x10000; - lo = (lo & 0x80) | (lo >> 1); - mem_put_byte(DAR, lo); - condevalN(lo); - condevalZ(lo); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x68: /* ASL ind */ - DAR = get_indir_addr(); - lo = mem_get_byte(DAR); - C = 0; - if (lo & 0x80) - C = 0x10000; - lo <<= 1; - mem_put_byte(DAR, lo); - condevalN(lo); - condevalZ(lo); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x69: /* ROL ind */ - DAR = get_indir_addr(); - lo = mem_get_byte(DAR); - hi = C; - C = 0; - if (lo & 0x80) - C = 0x10000; - lo <<= 1; - if (hi) - lo |= 0x01; - mem_put_byte(DAR, lo); - condevalN(lo); - condevalZ(lo); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x6A: /* DEC ind */ - DAR = get_indir_addr(); - lo = mem_get_byte(DAR); - V = 0; - if (lo == 0x80) - V = 0x10000; - lo = (lo - 1) & 0xFF; - mem_put_byte(DAR, lo); - condevalN(lo); - condevalZ(lo); - break; - case 0x6C: /* INC ind */ - DAR= get_indir_addr(); - lo = mem_get_byte(DAR); - V = 0; - if (lo == 0x7F) - V = 0x10000; - lo = (lo + 1) & 0xFF; - mem_put_byte(DAR, lo); - condevalN(lo); - condevalZ(lo); - break; - case 0x6D: /* TST ind */ - lo = (get_indir_val() - 0) & 0xFF; - V = 0; - C = 0; - condevalN(lo); - condevalZ(lo); - break; - case 0x6E: /* JMP ind */ - PC = get_indir_addr(); - break; - case 0x6F: /* CLR ind */ - mem_put_byte(get_indir_addr(), 0); - N = V = C = 0; - Z = 0x10000; - break; - case 0x70: /* NEG ext */ - DAR = get_ext_addr(PC); - lo = (0 - mem_get_byte(DAR)) & 0xFF; - mem_put_byte(DAR, lo); - V = 0; - if (lo & 0x80) - V = 0x10000; - C = 0; - if (lo) - C = 0x10000; - condevalN(lo); - condevalZ(lo); - break; - case 0x73: /* COM ext */ - DAR = get_ext_addr(); - lo = ~mem_get_byte(DAR) & 0xFF; - mem_put_byte(DAR, lo); - V = 0; - C = 0x10000; - condevalN(lo); - condevalZ(lo); - break; - case 0x74: /* LSR ext */ - DAR = get_ext_addr(); - lo = mem_get_byte(DAR); - C = 0; - if (lo & 0x01) - C = 0x10000; - lo >>= 1; - mem_put_byte(DAR, lo); - N = 0; - condevalZ(lo); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x76: /* ROR ext */ - DAR = get_ext_addr(); - hi = C; - lo = mem_get_byte(DAR); - C = 0; - if (lo & 0x01) - C = 0x10000; - lo >>= 1; - if (hi) - lo |= 0x80; - mem_put_byte(DAR, lo); - condevalN(lo); - condevalZ(lo); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x77: /* ASR ext */ - DAR = get_ext_addr(); - lo = mem_get_byte(DAR); - C = 0; - if (lo & 0x01) - C = 0x10000; - hi = lo & 0x80; - lo >>= 1; - lo |= hi; - mem_put_byte(DAR, lo); - condevalN(lo); - condevalZ(lo); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x78: /* ASL ext */ - DAR = get_ext_addr(); - lo = mem_get_byte(DAR); - C = 0; - if (lo & 0x80) - C = 0x10000; - lo <<= 1; - mem_put_byte(DAR, lo); - condevalN(lo); - condevalZ(lo); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x79: /* ROL ext */ - DAR = get_ext_addr(); - lo = mem_get_byte(DAR); - hi = C; - C = 0; - if (lo & 0x80) - C = 0x10000; - lo <<= 1; - if (hi) - lo |= 0x01; - mem_put_byte(DAR, lo); - condevalN(lo); - condevalZ(lo); - V = 0; - if (N ^ C) - V = 0x10000; - break; - case 0x7A: /* DEC ext */ - DAR = get_ext_addr(); - lo = mem_get_byte(DAR); - V = 0; - if (lo == 0x80) - V = 0x10000; - lo = (lo - 1) & 0xFF; - mem_put_byte(DAR, lo); - condevalN(lo); - condevalZ(lo); - break; - case 0x7C: /* INC ext */ - DAR = get_ext_addr(); - lo = mem_get_byte(DAR); - V = 0; - if (lo == 0x7F) - V = 0x10000; - lo = (lo + 1) & 0xFF; - mem_put_byte(DAR, lo); - condevalN(lo); - condevalZ(lo); - break; - case 0x7D: /* TST ext */ - lo = mem_get_byte(get_ext_addr()) - 0; - V = 0; - C = 0; - condevalN(lo); - condevalZ(lo & 0xFF); - break; - case 0x7E: /* JMP ext */ - PC = get_ext_addr() & ADDRMASK; - break; - case 0x7F: /* CLR ext */ - mem_put_byte(get_ext_addr(), 0); - N = V = C = 0; - Z = 0x10000; - break; - case 0x80: /* SUB A imm */ - op1 = get_dir_addr(); - A = A - op1; - condevalN(A); - condevalC(A); - condevalVs(A, op1); - A &= 0xFF; - condevalZ(A); - break; - case 0x81: /* CMP A imm */ - op1 = get_dir_addr(); - lo = A - op1; - condevalN(lo); - condevalZ(lo & 0xFF); - condevalC(lo); - condevalVs(lo, op1); - break; - case 0x82: /* SBC A imm */ - op1 = get_dir_addr(); - if (C) - A = A - op1 - 1; - else - A = A - op1; - condevalN(A); - condevalC(A); - condevalVs(A, op1); - A &= 0xFF; - condevalZ(A); - break; - case 0x84: /* AND A imm */ - A = (A & get_dir_addr()) & 0xFF; - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0x85: /* BIT A imm */ - lo = (A & get_dir_addr()) & 0xFF; - V = 0; - condevalN(lo); - condevalZ(lo); - break; - case 0x86: /* LDA A imm */ - A = get_dir_addr(); - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0x88: /* EOR A imm */ - A = (A ^ get_dir_addr()) & 0xFF; - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0x89: /* ADC A imm */ - op1 = get_dir_addr(); - if (C) - A = A + op1 + 1; - else - A = A + op1; - condevalH(A); - condevalN(A); - condevalC(A); - condevalVa(A, op1); - A &= 0xFF; - condevalZ(A); - break; - case 0x8A: /* ORA A imm */ - A = (A | get_dir_addr()) & 0xFF; - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0x8B: /* ADD A imm */ - op1 = get_dir_addr(); - A = A + op1; - condevalH(A); - condevalN(A); - condevalC(A); - condevalVa(A, op1); - A &= 0xFF; - condevalZ(A); - break; - case 0x8C: /* CPX imm */ - op1 = IX - get_ext_addr(); - condevalZ(op1); - condevalN(op1 >> 8); - V = op1 & 0x10000; - break; - case 0x8D: /* BSR rel */ - lo = get_rel_addr(); - SP = (SP - 1) & ADDRMASK; - mem_put_word(SP, PC); - SP = (SP - 1) & ADDRMASK; - PC = PC + lo; - PC &= ADDRMASK; - break; - case 0x8E: /* LDS imm */ - SP = get_ext_addr(); - condevalN(SP >> 8); - condevalZ(SP); - V = 0; - break; - case 0x90: /* SUB A dir */ - op1 = get_dir_val(); - A = A - op1; - condevalN(A); - condevalC(A); - condevalVs(A, op1); - A &= 0xFF; - condevalZ(A); - break; - case 0x91: /* CMP A dir */ - op1 = get_dir_val(); - lo = A - op1; - condevalN(lo); - condevalZ(lo & 0xff); - condevalC(lo); - condevalVs(A, op1); - break; - case 0x92: /* SBC A dir */ - op1 = get_dir_val(); - if (C) - A = A - op1 - 1; - else - A = A - op1; - condevalN(A); - condevalC(A); - condevalVs(A, op1); - A &= 0xFF; - condevalZ(A); - break; - case 0x94: /* AND A dir */ - A = (A & get_dir_val()) & 0xFF; - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0x95: /* BIT A dir */ - lo = (A & get_dir_val()) & 0xFF; - V = 0; - condevalN(lo); - condevalZ(lo); - break; - case 0x96: /* LDA A dir */ - A = get_dir_val(); - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0x97: /* STA A dir */ - mem_put_byte(get_dir_addr(), A); - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0x98: /* EOR A dir */ - A = (A ^ get_dir_val()) & 0xFF; - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0x99: /* ADC A dir */ - op1 = get_dir_val(); - if (C) - A = A + op1 + 1; - else - A = A + op1; - condevalH(A); - condevalN(A); - condevalC(A); - condevalVa(A, op1); - A &= 0xFF; - condevalZ(A); - break; - case 0x9A: /* ORA A dir */ - A = (A | get_dir_val()) & 0xFF; - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0x9B: /* ADD A dir */ - op1 = get_dir_val(); - A = A + op1; - condevalH(A); - condevalN(A); - condevalC(A); - condevalVa(A, op1); - A &= 0xFF; - condevalZ(A); - break; - case 0x9C: /* CPX dir */ - op1 = IX - mem_get_word(get_dir_addr()); - condevalZ(op1); - condevalN(op1 >> 8); - V = op1 & 0x10000; - break; - case 0x9E: /* LDS dir */ - SP = mem_get_word(get_dir_addr()); - condevalN(SP >> 8); - condevalZ(SP); - V = 0; - break; - case 0x9F: /* STS dir */ - mem_put_word(get_dir_addr(), SP); - condevalN(SP >> 8); - condevalZ(SP); - V = 0; - break; - case 0xA0: /* SUB A ind */ - op1 = get_indir_val(); - A = A - op1; - condevalN(A); - condevalC(A); - condevalVs(A, op1); - A &= 0xFF; - condevalZ(A); - break; - case 0xA1: /* CMP A ind */ - op1 = get_indir_val(); - lo = A - op1; - condevalN(lo); - condevalZ(lo & 0xFF); - condevalC(lo); - condevalVs(A, op1); - break; - case 0xA2: /* SBC A ind */ - op1 = get_indir_val(); - if (C) - A = A - op1 - 1; - else - A = A - op1; - condevalN(A); - condevalC(A); - condevalVs(A, op1); - A &= 0xFF; - condevalZ(A); - break; - case 0xA4: /* AND A ind */ - A = (A & get_indir_val()) & 0xFF; - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0xA5: /* BIT A ind */ - lo = (A & get_indir_val()) & 0xFF; - V = 0; - condevalN(lo); - condevalZ(lo); - break; - case 0xA6: /* LDA A ind */ - A = get_indir_val(); - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0xA7: /* STA A ind */ - mem_put_byte(get_indir_addr(), A); - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0xA8: /* EOR A ind */ - A = (A ^ get_indir_val()) & 0xFF; - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0xA9: /* ADC A ind */ - op1 = get_indir_val(); - if (C) - A = A + op1 + 1; - else - A = A + op1; - condevalH(A); - condevalN(A); - condevalC(A); - condevalVa(A, op1); - A &= 0xFF; - condevalZ(A); - break; - case 0xAA: /* ORA A ind */ - A = (A | get_indir_val()) & 0xFF; - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0xAB: /* ADD A ind */ - op1 = get_indir_val(); - A = A + op1; - condevalH(A); - condevalN(A); - condevalC(A); - condevalVa(A, op1); - A &= 0xFF; - condevalZ(A); - break; - case 0xAC: /* CPX ind */ - op1 = (IX - get_indir_addr()) & ADDRMASK; - condevalZ(op1); - condevalN(op1 >> 8); - V = op1 & 0x10000; - break; - case 0xAD: /* JSR ind */ - DAR = get_indir_addr(); - SP = (SP - 1) & ADDRMASK; - mem_put_word(SP, PC); - SP = (SP - 1) & ADDRMASK; - PC = DAR; - break; - case 0xAE: /* LDS ind */ - SP = mem_get_word(get_indir_addr()); - condevalN(SP >> 8); - condevalZ(SP); - V = 0; - break; - case 0xAF: /* STS ind */ - mem_put_word(get_indir_addr(), SP); - condevalN(SP >> 8); - condevalZ(SP); - V = 0; - break; - case 0xB0: /* SUB A ext */ - op1 = get_ext_val(); - A = A - op1; - condevalN(A); - condevalC(A); - condevalVs(A, op1); - A &= 0xFF; - condevalZ(A); - break; - case 0xB1: /* CMP A ext */ - op1 = get_ext_val(); - lo = A - op1; - condevalN(lo); - condevalZ(lo & 0xFF); - condevalC(lo); - condevalVs(A, op1); - break; - case 0xB2: /* SBC A ext */ - op1 = get_ext_val(); - if (C) - A = A - op1 - 1; - else - A = A - op1; - condevalN(A); - condevalC(A); - condevalVs(A, op1); - A &= 0xFF; - condevalZ(A); - break; - case 0xB4: /* AND A ext */ - A = (A & get_ext_val()) & 0xFF; - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0xB5: /* BIT A ext */ - lo = (A & get_ext_val()) & 0xFF; - V = 0; - condevalN(lo); - condevalZ(lo); - break; - case 0xB6: /* LDA A ext */ - A = get_ext_val(); - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0xB7: /* STA A ext */ - mem_put_byte(get_ext_addr(), A); - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0xB8: /* EOR A ext */ - A = (A ^ get_ext_val()) & 0xFF; - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0xB9: /* ADC A ext */ - op1 = get_ext_val(); - if (C) - A = A + op1 + 1; - else - A = A + op1; - condevalH(A); - condevalN(A); - condevalC(A); - condevalVa(A, op1); - A &= 0xFF; - condevalZ(A); - break; - case 0xBA: /* ORA A ext */ - A = (A | get_ext_val()) & 0xFF; - V = 0; - condevalN(A); - condevalZ(A); - break; - case 0xBB: /* ADD A ext */ - op1 = get_ext_val(); - A = A + op1; - condevalH(A); - condevalN(A); - condevalC(A); - condevalVa(A, op1); - A &= 0xFF; - condevalZ(A); - break; - case 0xBC: /* CPX ext */ - op1 = (IX - mem_get_word(get_ext_addr())) & ADDRMASK; - condevalZ(op1); - condevalN(op1 >> 8); - V = op1 & 0x10000; - break; - case 0xBD: /* JSR ext */ - DAR = get_ext_addr(); - SP = (SP - 1) & ADDRMASK; - mem_put_word(SP, PC); - SP = (SP - 1) & ADDRMASK; - PC = DAR; - break; - case 0xBE: /* LDS ext */ - SP = mem_get_word(get_ext_addr()); - condevalN(SP >> 8); - condevalZ(SP); - V = 0; - break; - case 0xBF: /* STS ext */ - mem_put_word(get_ext_addr(), SP); - condevalN(SP >> 8); - condevalZ(SP); - V = 0; - break; - case 0xC0: /* SUB B imm */ - op1 = get_dir_addr(); - B = B - op1; - condevalN(B); - condevalC(B); - condevalVs(B, op1); - B &= 0xFF; - condevalZ(B); - break; - case 0xC1: /* CMP B imm */ - op1 = get_dir_addr(); - lo = B - op1; - condevalN(lo); - condevalZ(lo & 0xFF); - condevalC(lo); - condevalVs(B, op1); - break; - case 0xC2: /* SBC B imm */ - op1 = get_dir_addr(); - if (C) - B = B - op1 - 1; - else - B = B - op1; - condevalN(B); - condevalC(B); - condevalVs(B, op1); - B &= 0xFF; - condevalZ(B); - break; - case 0xC4: /* AND B imm */ - B = (B & get_dir_addr()) & 0xFF; - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xC5: /* BIT B imm */ - lo = (B & get_dir_addr()) & 0xFF; - V = 0; - condevalN(lo); - condevalZ(lo); - break; - case 0xC6: /* LDA B imm */ - B = get_dir_addr(); - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xC8: /* EOR B imm */ - B = (B ^ get_dir_addr()) & 0xFF; - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xC9: /* ADC B imm */ - op1 = get_dir_addr(); - if (C) - B = B + op1 + 1; - else - B = B + op1; - condevalH(B); - condevalN(B); - condevalC(B); - condevalVa(B, op1); - B &= 0xFF; - condevalZ(B); - break; - case 0xCA: /* ORA B imm */ - B = (B | get_dir_addr()) & 0xFF; - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xCB: /* ADD B imm */ - op1 = get_dir_addr(); - B = B + op1; - condevalH(B); - condevalN(B); - condevalC(B); - condevalVa(B, op1); - B &= 0xFF; - condevalZ(B); - break; - case 0xCE: /* LDX imm */ - IX = get_ext_addr(); - condevalN(IX >> 8); - condevalZ(IX); - V = 0; - break; - case 0xD0: /* SUB B dir */ - op1 = get_dir_val(); - B = B - op1; - condevalN(B); - condevalC(B); - condevalVs(B, op1); - B &= 0xFF; - condevalZ(B); - break; - case 0xD1: /* CMP B dir */ - op1 = get_dir_val(); - lo = B - op1; - condevalN(lo); - condevalZ(lo); - condevalC(lo); - condevalVs(B, op1); - break; - case 0xD2: /* SBC B dir */ - op1 = get_dir_val(); - if (C) - B = B - op1 - 1; - else - B = B - op1; - condevalN(B); - condevalC(B); - condevalVs(B, op1); - B &= 0xFF; - condevalZ(B); - break; - case 0xD4: /* AND B dir */ - B = (B & get_dir_val()) & 0xFF; - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xD5: /* BIT B dir */ - lo = (B & get_dir_val()) & 0xFF; - V = 0; - condevalN(lo); - condevalZ(lo); - break; - case 0xD6: /* LDA B dir */ - B = get_dir_val(); - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xD7: /* STA B dir */ - mem_put_byte(get_dir_addr(), B); - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xD8: /* EOR B dir */ - B = (B ^ get_dir_val()) & 0xFF; - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xD9: /* ADC B dir */ - op1 = get_dir_val(); - if (C) - B = B + op1 + 1; - else - B = B + op1; - condevalH(B); - condevalN(B); - condevalC(B); - condevalVa(B, op1); - B &= 0xFF; - condevalZ(B); - break; - case 0xDA: /* ORA B dir */ - B = (B | get_dir_val()) & 0xFF; - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xDB: /* ADD B dir */ - op1 = get_dir_val(); - B = B + op1; - condevalH(B); - condevalN(B); - condevalC(B); - condevalVa(B, op1); - B &= 0xFF; - condevalZ(B); - break; - case 0xDE: /* LDX dir */ - IX = mem_get_word(get_dir_addr()); - condevalN(IX >> 8); - condevalZ(IX); - V = 0; - break; - case 0xDF: /* STX dir */ - mem_put_word(get_dir_addr(), IX); - condevalN(IX >> 8); - condevalZ(IX); - V = 0; - break; - case 0xE0: /* SUB B ind */ - op1 = get_indir_val(); - B = B - op1; - condevalN(B); - condevalC(B); - condevalVs(B, op1); - B &= 0xFF; - condevalZ(B); - break; - case 0xE1: /* CMP B ind */ - op1 = get_indir_val(); - lo = B - op1; - condevalN(lo); - condevalZ(lo & 0xFF); - condevalC(lo); - condevalVs(B, op1); - break; - case 0xE2: /* SBC B ind */ - op1 = get_indir_val(); - if (C) - B = B - op1 - 1; - else - B = B - op1; - condevalN(B); - condevalC(B); - condevalVs(B, op1); - B &= 0xFF; - condevalZ(B); - break; - case 0xE4: /* AND B ind */ - B = (B & get_indir_val()) & 0xFF; - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xE5: /* BIT B ind */ - lo = (B & get_indir_val()) & 0xFF; - V = 0; - condevalN(lo); - condevalZ(lo); - break; - case 0xE6: /* LDA B ind */ - B = get_indir_val(); - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xE7: /* STA B ind */ - mem_put_byte(get_indir_addr(), B); - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xE8: /* EOR B ind */ - B = (B ^ get_indir_val()) & 0xFF; - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xE9: /* ADC B ind */ - op1 = get_indir_val(); - if (C) - B = B + op1 + 1; - else - B = B + op1; - condevalH(B); - condevalN(B); - condevalC(B); - condevalVa(B, op1); - B &= 0xFF; - condevalZ(B); - break; - case 0xEA: /* ORA B ind */ - B = (B | get_indir_val()) & 0xFF; - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xEB: /* ADD B ind */ - op1 = get_indir_val(); - B = B + op1; - condevalH(B); - condevalN(B); - condevalC(B); - condevalVa(B, op1); - B &= 0xFF; - condevalZ(B); - break; - case 0xEE: /* LDX ind */ - IX = mem_get_word(get_indir_addr()); - condevalN(IX >> 8); - condevalZ(IX); - V = 0; - break; - case 0xEF: /* STX ind */ - mem_put_word(get_indir_addr(), IX); - condevalN(IX >> 8); - condevalZ(IX); - V = 0; - break; - case 0xF0: /* SUB B ext */ - op1 = get_ext_val(); - B = B - op1; - condevalN(B); - condevalC(B); - condevalVs(B, op1); - B &= 0xFF; - condevalZ(B); - break; - case 0xF1: /* CMP B ext */ - op1 = get_ext_val(); - lo = B - op1; - condevalN(lo); - condevalZ(lo & 0xFF); - condevalC(lo); - condevalVs(B, op1); - break; - case 0xF2: /* SBC B ext */ - op1 = get_ext_val(); - if (C) - B = B - op1 - 1; - else - B = B - op1; - condevalN(B); - condevalC(B); - condevalVs(B, op1); - B &= 0xFF; - condevalZ(B); - break; - case 0xF4: /* AND B ext */ - B = (B & get_ext_val()) & 0xFF; - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xF5: /* BIT B ext */ - lo = (B & get_ext_val()) & 0xFF; - V = 0; - condevalN(lo); - condevalZ(lo); - break; - case 0xF6: /* LDA B ext */ - B = get_ext_val(); - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xF7: /* STA B ext */ - mem_put_byte(get_ext_addr(), B); - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xF8: /* EOR B ext */ - B = (B ^ get_ext_val()) & 0xFF; - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xF9: /* ADC B ext */ - op1 = get_ext_val(); - if (C) - B = B + op1 + 1; - else - B = B + op1; - condevalH(B); - condevalN(B); - condevalC(B); - condevalVa(B, op1); - B &= 0xFF; - condevalZ(B); - break; - case 0xFA: /* ORA B ext */ - B = (B | get_ext_val()) & 0xFF; - V = 0; - condevalN(B); - condevalZ(B); - break; - case 0xFB: /* ADD B ext */ - op1 = get_ext_val(); - B = B + op1; - condevalH(B); - condevalN(B); - condevalC(B); - condevalVa(B, op1); - B &= 0xFF; - condevalZ(B); - break; - case 0xFE: /* LDX ext */ - IX = mem_get_word(get_ext_addr()); - condevalN(IX >> 8); - condevalZ(IX); - V = 0; - break; - case 0xFF: /* STX ext */ - mem_put_word(get_ext_addr(), IX); - condevalN(IX >> 8); - condevalZ(IX); - V = 0; - break; - - default: { /* Unassigned */ - if (cpu_unit.flags & UNIT_OPSTOP) { - reason = STOP_OPCODE; - PC--; - } - break; - } - } - } - /* Simulation halted - lets dump all the registers! */ - dump_regs(); - saved_PC = PC; - return reason; -} - -/* dump the working registers */ - -void dump_regs() -{ - printf("\r\nPC=%04X SP=%04X IX=%04X ", PC, SP, IX); - printf("A=%02X B=%02X PSW=%02X", A, B, get_psw()); -} - -/* this routine does the jump to relative offset if the condition is - met. Otherwise, execution continues at the current PC. */ - -void go_rel(int32 cond) -{ - int32 temp; - - temp = get_rel_addr(); - if (cond) - PC += temp; - PC &= ADDRMASK; -} - -/* returns the relative offset sign-extended */ - -int32 get_rel_addr() -{ - int32 temp; - - temp = mem_get_byte(PC++); - if (temp & 0x80) - temp |= 0xFF00; - return temp & ADDRMASK; -} - -/* returns the value at the direct address pointed to by PC */ - -int32 get_dir_val() -{ - return mem_get_byte(get_dir_addr()); -} - -/* returns the direct address pointed to by PC */ - -int32 get_dir_addr() -{ - int32 temp; - - temp = mem_get_byte(PC); - PC = (PC + 1) & ADDRMASK; - return temp & 0xFF; -} - -/* returns the value at the indirect address pointed to by PC */ - -int32 get_indir_val() -{ - return mem_get_byte(get_indir_addr()); -} - -/* returns the indirect address pointed to by PC or immediate byte */ - -int32 get_indir_addr() -{ - int32 temp; - - temp = (mem_get_byte(PC++) + IX) & ADDRMASK; - PC &= ADDRMASK; - return temp; -} - -/* returns the value at the extended address pointed to by PC */ - -int32 get_ext_val() -{ - return mem_get_byte(get_ext_addr()); -} - -/* returns the extended address pointed to by PC or immediate word */ - -int32 get_ext_addr() -{ - int32 temp; - - temp = (mem_get_byte(PC) << 8) | mem_get_byte(PC+1); - PC = (PC +2) & ADDRMASK; - return temp; -} - -/* return a PSW from the current flags */ - -int32 get_psw() -{ - int32 psw; - - psw = 0xC0; - if (H) - psw |= 0x20; - if (I) - psw |= 0x10; - if (N) - psw |= 0x08; - if (Z) - psw |= 0x04; - if (V) - psw |= 0x02; - if (C) - psw |= 0x01; - return psw; -} - -/* set the current flags from a PSW */ - -void set_psw(int32 psw) -{ - H = 0; - if (psw & 0x20) - H = 0x10000; - I = 0; - if (psw & 0x10) - I = 0x10000; - N = 0; - if (psw & 0x08) - N = 0x10000; - Z = 0; - if (psw & 0x04) - Z = 0x10000; - V = 0; - if (psw & 0x02) - V = 0x10000; - C = 0; - if (psw & 0x01) - C = 0x10000; -} - -/* test and set H */ - -void condevalH(int32 res) -{ - H = (res & 0x10) << 12; -} - -/* test and set N */ - -void condevalN(int32 res) -{ - N = 0; - if (res & 0x80) - N = 0x10000; -} - -/* test and set Z */ - -void condevalZ(int32 res) -{ - Z = 0; - if (res == 0) - Z = 0x10000; -} - -/* test and set V for addition */ - -void condevalVa(int32 op1, int32 op2) -{ - if (C) { - V = 0; - if (((op1 & 0x80) && (op2 & 0x80)) || - (((op1 & 0x80) == 0) && ((op2 & 0x80) == 0))) - V = 0x10000; - } -} - -/* test and set V for subtraction */ - -void condevalVs(int32 op1, int32 op2) -{ - if (C) { - V = 0; - if (((op1 & 0x80) && ((op2 & 0x80) == 0)) || - (((op1 & 0x80) == 0) && (op2 & 0x80))) - V = 0x10000; - } -} - -/* test and set C */ - -void condevalC(int32 res) -{ - C = (res & 0x100) << 8; -} - -/* memory write operations */ - -/* put word */ - -void mem_put_word(int32 addr, int32 val) -{ - mem_put_byte(addr,val >> 8); - mem_put_byte(addr + 1, val); -} - -/* put byte */ - -void mem_put_byte(int32 addr, int32 val) -{ - if (addr >= 0x0000 && addr < (int32) MEMSIZE) /* memory cards */ - M[addr] = val & 0xFF; - else if (addr >= 0x8000 && addr < 0x8020) /* memory mapped I/O */ - dev_table[addr - 0x8000].routine(1, val); - else if (addr >= 0xA000 && addr < 0xA080) /* CPU memory */ - M[addr] = val & 0xFF; - else if ((addr >= 0xA080 && addr < 0xC000) && /* extended CPU memory */ - cpu_unit.flags & UNIT_MA000) - M[addr] = val & 0xFF; - else { - if (cpu_unit.flags & UNIT_MSTOP) - mem_fault = 1; - printf("Invalid write to %04X\n\r", addr); - } -} - -/* memory read operations */ - -/* get word */ - -int32 mem_get_word(int32 addr) -{ - int32 temp; - - temp = (mem_get_byte(addr) << 8) | mem_get_byte(addr+1); - return temp; -} - -/* get byte */ - -int32 mem_get_byte(int32 addr) -{ - int32 val; - - if (addr >= 0x0000 && addr < (int32) MEMSIZE) /* memory cards */ - val = M[addr]; - else if (addr >= 0x8000 && addr < 0x8020) /* memory mapped I/O */ - val = dev_table[addr - 0x8000].routine(0, 0); - else if (addr >= 0xA000 && addr < 0xA080) /* CPU memory */ - val = M[addr]; - else if ((addr >= 0xA080 && addr < 0xC000) && /* extended CPU memory */ - cpu_unit.flags & UNIT_MA000) - val = M[addr]; - else if (addr >= 0xE000 && addr < 0x10000) /* ROM memory */ - val = M[addr]; - else { - if (cpu_unit.flags & UNIT_MSTOP) - mem_fault = 1; - val = 0xFF; /* default for no memory at address */ - printf("Invalid read of %04X\n\r", addr); - } - return val & 0xFF; -} - -/* calls from the simulator */ - -/* Reset routine */ - -t_stat cpu_reset (DEVICE *dptr) -{ - int i; - - I = 0x10000; - saved_PC = (M[0xFFFE] << 8) | M[0xFFFF]; - int_req = 0; - sim_brk_types = sim_brk_dflt = SWMASK ('E'); - /* copy in rom image at E000 */ - for (i = 0; i < BOOTLEN; i++) { - M[i + 0xE000] = bootrom[i] & 0xFF; - } - /* copy in rom image at FC00 for vectors! */ - for (i = 0; i < BOOTLEN; i++) { - M[i + 0xFC00] = bootrom[i] & 0xFF; - } - return SCPE_OK; -} - -/* Memory examine */ - -t_stat cpu_ex (t_value *vptr, t_addr addr, UNIT *uptr, int32 sw) -{ - if (addr >= MAXMEMSIZE) - return SCPE_NXM; - if (vptr != NULL) - *vptr = mem_get_byte(addr); - return SCPE_OK; -} - -/* Memory deposit */ - -t_stat cpu_dep (t_value val, t_addr addr, UNIT *uptr, int32 sw) -{ - if (addr >= MAXMEMSIZE) - return SCPE_NXM; - mem_put_byte(addr, val); -// printf("Deposit to %04X of %02X\n\r", addr, val); - return SCPE_OK; -} - -/* adjust the memory size for the emulator 4k to 32k in 4k steps */ - -t_stat cpu_set_size (UNIT *uptr, int32 val, char *cptr, void *desc) -{ - int32 mc = 0; - uint32 i; - - if ((val <= 0) || (val > MAXMEMSIZE) || ((val & 0x0FFF) != 0)) - return SCPE_ARG; - for (i = val; i < MEMSIZE; i++) - mc = mc | M[i]; - if ((mc != 0) && (!get_yn ("Really truncate memory [N]?", FALSE))) - return SCPE_OK; - MEMSIZE = val; - return SCPE_OK; -} - -/* dummy i/o device */ - -int32 nulldev(int32 io, int32 data) -{ - if (io == 0) - return (0xFF); - return 0; -} - diff --git a/swtp/swtp_dsk.c b/swtp/swtp_dsk.c deleted file mode 100644 index 9c8c7d38..00000000 --- a/swtp/swtp_dsk.c +++ /dev/null @@ -1,506 +0,0 @@ -/* swtp_dc4_dsk.c: SWTP DC-4 DISK Simulator - - Copyright (c) 2005, William A. Beech - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - ROBERT M SUPNIK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the name of William A. Beech shall not - be used in advertising or otherwise to promote the sale, use or other dealings - in this Software without prior written authorization from William A. Beech. - - Based on work by Charles E Owen (c) 1997 and Peter Schorn (c) 2002-2005 - - - The DC-4 is a 5-inch floppy controller which can control up - to 4 daisy-chained 5-inch floppy drives. The controller is based on - the Western Digital 1797 Floppy Disk Controller (FDC) chip. This - file only emulates the minimum DC-4 functionality to interface with - the virtual disk file. - - The floppy controller is interfaced to the CPU by use of 5 memory - addreses. These are device numbers 5 and 6 (0x8014-0x801B). - - Address Mode Function - ------- ---- -------- - - 0x8014 Read Returns FDC interrupt status - 0x8014 Write Selects the drive/head/motor control - 0x8018 Read Returns status of FDC - 0x8018 Write FDC command register - 0x8019 Read Returns FDC track register - 0x8019 Write Set FDC track register - 0x801A Read Returns FDC sector register - 0x801A Write Set FDC sector register - 0x801B Read Read data - 0x801B Write Write data - - Drive Select Read (0x8014): - - +---+---+---+---+---+---+---+---+ - | I | D | X | X | X | X | X | X | - +---+---+---+---+---+---+---+---+ - - I = Set indicates an interrupt request from the FDC pending. - D = DRQ pending - same as bit 1 of FDC status register. - - Drive Select Write (0x8014): - - +---+---+---+---+---+---+---+---+ - | M | S | X | X | X | X | Device| - +---+---+---+---+---+---+---+---+ - - M = If this bit is 1, the one-shot is triggered/retriggered to - start/keep the motors on. - S = Side select. If set, side one is selected otherwise side zero - is selected. - X = not used - Device = value 0 thru 3, selects drive 0-3 to be controlled. - - Drive Status Read (0x8018): - - +---+---+---+---+---+---+---+---+ - | R | P | H | S | C | L | D | B | - +---+---+---+---+---+---+---+---+ - - B - When 1, the controller is busy. - D - When 1, index mark detected (type I) or data request - read data - ready/write data empty (type II or III). - H - When 1, track 0 (type I) or lost data (type II or III). - C - When 1, crc error detected. - S - When 1, seek (type I) or RNF (type II or III) error. - H - When 1, head is currently loaded (type I) or record type/ - write fault (type II or III). - P - When 1, indicates that diskette is write-protected. - R - When 1, drive is not ready. - - Drive Control Write (0x8018) for type I commands: - - +---+---+---+---+---+---+---+---+ - | 0 | S2| S1| S0| H | V | R1| R0| - +---+---+---+---+---+---+---+---+ - - R0/R1 - Selects the step rate. - V - When 1, verify on destination track. - H - When 1, loads head to drive surface. - S0/S1/S2 = 000 - home. - 001 - seek track in data register. - 010 - step without updating track register. - 011 - step and update track register. - 100 - step in without updating track register. - 101 - step in and update track register. - 110 - step out without updating track register. - 111 - step out and update track register. - - Drive Control Write (0x8018) for type II commands: - - +---+---+---+---+---+---+---+---+ - | 1 | 0 | T | M | S | E | B | A | - +---+---+---+---+---+---+---+---+ - - A - Zero for read, 1 on write deleted data mark else data mark. - B - When 1, shifts sector length field definitions one place. - E - When, delay operation 15 ms, 0 no delay. - S - When 1, select side 1, 0 select side 0. - M - When 1, multiple records, 0 for single record. - T - When 1, write command, 0 for read. - - Drive Control Write (0x8018) for type III commands: - - +---+---+---+---+---+---+---+---+ - | 1 | 1 | T0| T1| 0 | E | 0 | 0 | - +---+---+---+---+---+---+---+---+ - - E - When, delay operation 15 ms, 0 no delay. - T0/T1 - 00 - read address command. - 10 - read track command. - 11 - write track command. - - Tracks are numbered from 0 up to one minus the last track in the 1797! - - Track Register Read (0x8019): - - +---+---+---+---+---+---+---+---+ - | Track Number | - +---+---+---+---+---+---+---+---+ - - Reads the current 8-bit value from the track position. - - Track Register Write (0x8019): - - +---+---+---+---+---+---+---+---+ - | Track Number | - +---+---+---+---+---+---+---+---+ - - Writes the 8-bit value to the track register. - - Sectors are numbers from 1 up to the last sector in the 1797! - - Sector Register Read (0x801A): - - +---+---+---+---+---+---+---+---+ - | Sector Number | - +---+---+---+---+---+---+---+---+ - - Reads the current 8-bit value from the sector position. - - Sector Register Write (0x801A): - - +---+---+---+---+---+---+---+---+ - | Sector Number | - +---+---+---+---+---+---+---+---+ - - Writes the 8-bit value to the sector register. - - Data Register Read (0x801B): - - +---+---+---+---+---+---+---+---+ - | Data | - +---+---+---+---+---+---+---+---+ - - Reads the current 8-bit value from the data register. - - Data Register Write (0x801B): - - +---+---+---+---+---+---+---+---+ - | Data | - +---+---+---+---+---+---+---+---+ - - Writes the 8-bit value to the data register. - - A FLEX disk is defined as follows: - - Track Sector Use - 0 1 Boot sector - 0 2 Boot sector (cont) - 0 3 Unused - 0 4 System Identity Record (explained below) - 0 5 Unused - 0 6-last Directory - 10 entries/sector (explained below) - 1 1 First available data sector - last-1 last Last available data sector - - System Identity Record - - Byte Use - 0x10 Volume ID (8 bytes) - 0x18 ??? - 0x19 ??? - 0x1A ??? - 0x1B Volume number (2 bytes) - 0x1D First free sector (2 bytes) - 0x1F Last track minus one (byte) - 0x20 Last sector (byte) - 0x21 Total sectors on disk (2 bytes) - 0x23 Month (byte - 0x24 Day (byte) - 0x25 Year (byte) - 0x26 Last track minus one (byte) - 0x27 Last sector (byte) - -*/ - -#include - -#include "swtp_defs.h" - -#define UNIT_V_ENABLE (UNIT_V_UF + 0) /* Write Enable */ -#define UNIT_ENABLE (1 << UNIT_V_ENABLE) - -/* emulate a SS FLEX disk with 72 sectors and 80 tracks */ - -#define NUM_DISK 4 /* standard 1797 maximum */ -#define SECT_SIZE 256 /* standard FLEX sector */ -#define NUM_SECT 72 /* sectors/track */ -#define TRAK_SIZE (SECT_SIZE * NUM_SECT) -#define HEADS 1 /* handle as SS with twice the sectors */ -#define NUM_CYL 80 /* maximum tracks */ -#define DSK_SIZE (NUM_SECT * HEADS * NUM_CYL * SECT_SIZE) - -/* 1797 status bits */ - -#define BUSY 0x01 -#define DRQ 0x02 -#define WRPROT 0x40 -#define NOTRDY 0x80 - -/* debug prints */ - -#define DEBUG 0 - - -/* prototypes */ - -t_stat dsk_svc (UNIT *uptr); -t_stat dsk_reset (DEVICE *dptr); -int32 fdcdrv(int32 io, int32 data); -int32 fdccmd(int32 io, int32 data); -int32 fdctrk(int32 io, int32 data); -int32 fdcsec(int32 io, int32 data); -int32 fdcdata(int32 io, int32 data); - -/* Global data on status */ - -int32 cur_dsk = NUM_DISK; /* Currently selected drive */ -int32 cur_trk[NUM_DISK] = {0, 0, 0, 0}; -int32 cur_sec[NUM_DISK] = {0, 0, 0, 0}; -int32 cur_byt[NUM_DISK] = {0, 0, 0, 0}; -int32 cur_flg[NUM_DISK] = {NOTRDY, NOTRDY, NOTRDY, NOTRDY}; - -/* Variables */ - -uint8 dskbuf[SECT_SIZE]; /* Data Buffer */ -UNIT *dptr = NULL; /* fileref to write dirty buffer to */ -int32 fdcbyte; -int32 intrq = 0; /* interrupt request flag */ - -/* DC-4 Simh Device Data Structures */ - -UNIT dsk_unit[] = { - { UDATA (&dsk_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE, DSK_SIZE) }, - { UDATA (&dsk_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE, DSK_SIZE) }, - { UDATA (&dsk_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE, DSK_SIZE) }, - { UDATA (&dsk_svc, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE, DSK_SIZE) } }; - -REG dsk_reg[] = { - { HRDATA (DISK, cur_dsk, 4) }, - { NULL } }; - -MTAB dsk_mod[] = { - { UNIT_ENABLE, UNIT_ENABLE, "RW", "RW", NULL }, - { UNIT_ENABLE, 0, "RO", "RO", NULL }, - { 0 } }; - -DEVICE dsk_dev = { - "DSK", dsk_unit, dsk_reg, dsk_mod, - NUM_DISK, 16, 16, 1, 16, 8, - NULL, NULL, &dsk_reset, - NULL, NULL, NULL }; - -/* service routines to handle simlulator functions */ - -/* service routine - actually gets char & places in buffer */ - -t_stat dsk_svc (UNIT *uptr) -{ -return SCPE_OK; -} - -/* Reset routine */ - -t_stat dsk_reset (DEVICE *dptr) -{ -cur_dsk = 0; -return SCPE_OK; -} - -/* I/O instruction handlers, called from the CPU module when an - memory read or write to the proper addresses is issued. - - Each function is passed an 'io' flag, where 0 means a read from - the port, and 1 means a write to the port. On input, the actual - input is passed as the return value, on output, 'data' is written - to the device. -*/ - -/* DC-4 drive select register routine - this register is not part of the 1797 -*/ - -int32 fdcdrv(int32 io, int32 data) -{ -/* **** probably need to grab the parameters from the SIR and set the limits */ - if (io) { /* write to DC-4 drive register */ - cur_dsk = data & 0x03; /* only 2 drive select bits */ -#if DEBUG > 0 - printf("Drive set to %d\n\r", cur_dsk); -#endif - if ((dsk_unit[cur_dsk].flags & UNIT_ENABLE) == 0) - cur_flg[cur_dsk] |= WRPROT; /* set WPROT */ - return 0; - } else { /* read from DC-4 drive register */ -#if DEBUG > 0 - printf("Drive read as %02X\n\r", intrq); -#endif - return intrq; - } -} - -/* WD 1797 FDC command register routine */ - -int32 fdccmd(int32 io, int32 data) -{ - static int32 val = 0, val1 = NOTRDY, i; - static long pos; - UNIT *uptr; - - if ((dsk_unit[cur_dsk].flags & UNIT_ATT) == 0) { /* not attached */ - cur_flg[cur_dsk] |= NOTRDY; /* set not ready flag */ - printf("Drive %d is not attached\n\r", cur_dsk); - return 0; - } else { - cur_flg[cur_dsk] &= ~NOTRDY; /* clear not ready flag */ - } - uptr = dsk_dev.units + cur_dsk; /* get virtual drive address */ - if (io) { /* write command to fdc */ - switch(data) { - case 0x8C: /* read command */ - case 0x9C: -#if DEBUG > 0 - printf("Read of disk %d, track %d, sector %d\n\r", - cur_dsk, cur_trk[cur_dsk], cur_sec[cur_dsk]); -#endif - pos = TRAK_SIZE * cur_trk[cur_dsk]; /* calculate file offset */ - pos += SECT_SIZE * (cur_sec[cur_dsk] - 1); -#if DEBUG > 0 - printf("Read pos = %ld ($%04X)\n\r", pos, pos); -#endif - sim_fseek(uptr -> fileref, pos, 0); /* seek to offset */ - sim_fread(dskbuf, 256, 1, uptr -> fileref); /* read in buffer */ - cur_flg[cur_dsk] |= BUSY | DRQ; /* set DRQ & BUSY */ - i = cur_byt[cur_dsk] = 0; /* clear counter */ - break; - case 0xAC: /* write command */ -#if DEBUG > 0 - printf("Write of disk %d, track %d, sector %d\n\r", - cur_dsk, cur_trk[cur_dsk], cur_sec[cur_dsk]); -#endif - if (cur_flg[cur_dsk] & WRPROT) { - printf("Drive %d is write-protected\n\r", cur_dsk); - } else { - pos = TRAK_SIZE * cur_trk[cur_dsk]; /* calculate file offset */ - pos += SECT_SIZE * (cur_sec[cur_dsk] - 1); -#if DEBUG > 1 - printf("Write pos = %ld ($%04X)\n\r", pos, pos); -#endif - sim_fseek(uptr -> fileref, pos, 0); /* seek to offset */ - dptr = uptr; /* save pointer for actual write */ - cur_flg[cur_dsk] |= BUSY | DRQ;/* set DRQ & BUSY */ - i = cur_byt[cur_dsk] = 0; /* clear counter */ - } - break; - case 0x18: /* seek command */ - case 0x1B: - cur_trk[cur_dsk] = fdcbyte; /* set track */ - cur_flg[cur_dsk] &= ~(BUSY | DRQ); /* clear flags */ -#if DEBUG > 0 - printf("Seek of disk %d, track %d\n\r", cur_dsk, fdcbyte); -#endif - break; - case 0x0B: /* restore command */ - cur_trk[cur_dsk] = 0; /* home the drive */ - cur_flg[cur_dsk] &= ~(BUSY | DRQ); /* clear flags */ -#if DEBUG > 0 - printf("Drive %d homed\n\r", cur_dsk); -#endif - break; - default: - printf("Unknown FDC command %02XH\n\r", data); - } - } else { /* read status from fdc */ - val = cur_flg[cur_dsk]; /* set return value */ - if (val1 == 0 && val == 0x03) /* delay BUSY going high */ - val = 0x02; /* set DRQ first */ - if (val != val1) { /* now allow BUSY after on read */ - val1 = val; -#if DEBUG > 0 - printf("Drive %d status=%02X\n\r", cur_dsk, cur_flg[cur_dsk]); -#endif - } - } - return val; -} - -/* WD 1797 FDC track register routine */ - -int32 fdctrk(int32 io, int32 data) -{ - if (io) { - cur_trk[cur_dsk] = data & 0xFF; -#if DEBUG > 1 - printf("Drive %d track set to %d\n\r", cur_dsk, data); -#endif - } else - ; -#if DEBUG > 1 - printf("Drive %d track read as %d\n\r", cur_dsk, cur_trk[cur_dsk]); -#endif - return cur_trk[cur_dsk]; -} - -/* WD 1797 FDC sector register routine */ - -int32 fdcsec(int32 io, int32 data) -{ - if (io) { - cur_sec[cur_dsk] = data & 0xFF; - if (cur_sec[cur_dsk] == 0) /* fix for swtp boot! */ - cur_sec[cur_dsk] = 1; -#if DEBUG > 1 - printf("Drive %d sector set to %d\n\r", cur_dsk, data); -#endif - } else - ; -#if DEBUG > 1 - printf("Drive %d sector read as %d\n\r", cur_dsk, cur_sec[cur_dsk]); -#endif - return cur_sec[cur_dsk]; -} - -/* WD 1797 FDC data register routine */ - -int32 fdcdata(int32 io, int32 data) -{ - int32 i; - - if (io) { /* write byte to fdc */ - fdcbyte = data; /* save for seek */ - if ((i = cur_byt[cur_dsk]) < SECT_SIZE) { /* copy bytes to buffer */ -#if DEBUG > 3 - printf("Writing byte %d of %02X\n\r", cur_byt[cur_dsk], data); -#endif - cur_byt[cur_dsk]++; /* step counter */ - dskbuf[i] = data; /* byte into buffer */ - if (cur_byt[cur_dsk] == SECT_SIZE) { - cur_flg[cur_dsk] &= ~(BUSY | DRQ); - if (dptr) { /* if initiated by FDC write command */ - sim_fwrite(dskbuf, 256, 1, dptr -> fileref); /* write it */ - dptr = NULL; - } -#if DEBUG > 0 - printf("Sector write complete\n\r"); -#endif - } - } - return 0; - } else { /* read byte from fdc */ - if ((i = cur_byt[cur_dsk]) < SECT_SIZE) { /* copy bytes from buffer */ -#if DEBUG > 1 - printf("Reading byte %d\n\r", cur_byt[cur_dsk]); -#endif - cur_byt[cur_dsk]++; /* step counter */ - if (cur_byt[cur_dsk] == SECT_SIZE) { /* done? */ - cur_flg[cur_dsk] &= ~(BUSY | DRQ); /* clear flags */ -#if DEBUG > 0 - printf("Sector read complete\n\r"); -#endif - } - return (dskbuf[i] & 0xFF); - } else - return 0; - } -} - diff --git a/swtp/swtp_sio.c b/swtp/swtp_sio.c deleted file mode 100644 index 1f6f8a77..00000000 --- a/swtp/swtp_sio.c +++ /dev/null @@ -1,312 +0,0 @@ -/* swtp_sio: SWTP serial I/O card - -Copyright (c) 2005, William Beech - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - Willaim Beech BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the name of William A. Beech shall not - be used in advertising or otherwise to promote the sale, use or other dealings - in this Software without prior written authorization from William A. Beech. - - Based on work by Charles E Owen (c) 1997 and Peter Schorn (c) 2002-2005 - - These functions support a simulated SWTP MP-S interface card. - The card had two physical I/O ports which could be connected - to any serial I/O device that would connect to a current loop - or RS232 interface. Available baud rates were jumper selectable - for each port from 110 to 9600. The ports appear at all 4 addresses. - This fact is used by SWTBUG to determine the presence of the MP-S vice - MP-C serial card. - - All I/O is via either programmed I/O or interrupt controlled I/O. - It has a status port and a data port. A write to the status port - can select some options for the device (0x03 will reset the port). - A read of the status port gets the port status: - - +---+---+---+---+---+---+---+---+ - | I | P | O | F |CTS|DCD|TXE|RXF| - +---+---+---+---+---+---+---+---+ - - RXF - A 1 in this bit position means a character has been received - on the data port and is ready to be read. - TXE - A 1 in this bit means the port is ready to receive a character - on the data port and transmit it out over the serial line. - - A read to the data port gets the buffered character, a write - to the data port writes the character to the device. -*/ - -#include -#include - -#include "swtp_defs.h" - -#define UNIT_V_ANSI (UNIT_V_UF + 0) // ANSI mode -#define UNIT_ANSI (1 << UNIT_V_ANSI) - -t_stat sio_svc (UNIT *uptr); -t_stat sio_reset (DEVICE *dptr); -t_stat ptr_svc (UNIT *uptr); -t_stat ptr_reset (DEVICE *dptr); -t_stat ptp_svc (UNIT *uptr); -t_stat ptp_reset (DEVICE *dptr); - -int32 ptr_stopioe = 0, ptp_stopioe = 0; // stop on error - -// MP-S Standard I/O Data Structures - -UNIT sio_unit = { UDATA (&sio_svc, 0, 0), - KBD_POLL_WAIT }; - -REG sio_reg[] = { - { ORDATA (DATA, sio_unit.buf, 8) }, - { ORDATA (STAT, sio_unit.u3, 8) }, - { NULL } }; - -MTAB sio_mod[] = { - { UNIT_ANSI, 0, "TTY", "TTY", NULL }, - { 0 } }; - -DEVICE sio_dev = { - "MP-S", &sio_unit, sio_reg, sio_mod, - 1, 10, 31, 1, 8, 8, - NULL, NULL, &sio_reset, - NULL, NULL, NULL }; - -UNIT ptr_unit = { UDATA (&ptr_svc, UNIT_SEQ + UNIT_ATTABLE, 0), - KBD_POLL_WAIT }; -DEVICE ptr_dev = { - "PTR", &ptr_unit, NULL, NULL, - 1, 10, 31, 1, 8, 8, - NULL, NULL, &ptr_reset, - NULL, NULL, NULL }; - -UNIT ptp_unit = { UDATA (&ptp_svc, UNIT_SEQ + UNIT_ATTABLE, 0), - KBD_POLL_WAIT }; -DEVICE ptp_dev = { - "PTP", &ptp_unit, NULL, NULL, - 1, 10, 31, 1, 8, 8, - NULL, NULL, &ptp_reset, - NULL, NULL, NULL }; - -/* Service routines to handle simulator functions */ - -/* service routine - actually gets char & places in buffer */ - -int32 ptp_rdr(int32 io, int32 data); - -int32 ptp_flag = 0, ptr_flag = 0; - -/* console input service routine */ - -t_stat sio_svc (UNIT *uptr) -{ - int32 temp; - - sim_activate (&sio_unit, sio_unit.wait); // continue poll - if ((temp = sim_poll_kbd ()) < SCPE_KFLAG) - return temp; // no char or error? - sio_unit.buf = temp & 0xFF; // Save char - sio_unit.u3 |= 0x01; // Set RXF flag - - /* Do any special character handling here */ - - sio_unit.pos++; // step character count - return SCPE_OK; -} - -/* paper tape reader input service routine */ - -t_stat ptr_svc (UNIT *uptr) -{ - return SCPE_OK; -} - -/* paper tape punch output service routine */ - -t_stat ptp_svc (UNIT *uptr) -{ - return SCPE_OK; -} - -/* Reset console */ - -t_stat sio_reset (DEVICE *dptr) -{ - sio_unit.buf = 0; // Data buffer - sio_unit.u3 = 0x02; // Status buffer - sim_activate (&sio_unit, sio_unit.wait); // activate unit - return SCPE_OK; -} - -/* Reset paper tape reader */ - -t_stat ptr_reset (DEVICE *dptr) -{ - ptr_unit.buf = 0; - ptr_unit.u3 = 0x02; - sim_cancel (&ptr_unit); // deactivate unit - return SCPE_OK; -} - -/* Reset paper tape punch */ - -t_stat ptp_reset (DEVICE *dptr) -{ - ptp_unit.buf = 0; - ptp_unit.u3 = 0x02; - sim_cancel (&ptp_unit); // deactivate unit - return SCPE_OK; -} - -/* I/O instruction handlers, called from the CPU module when a - read or write occur to addresses 0x8000-0x801F. - - Each function is passed an 'io' flag, where 0 means a read from - the port, and 1 means a write to the port. On input, the actual - input is passed as the return value, on output, 'data' is written - to the device. - - This code emulates a SWTP MP-S Serial Card with a Model 33 Teletype - attached. The Model 33 uses DC1-DC4 codes to enable or disable the - paper tape reader and punch. Those devices are defined in this module, - and the code built to emulate those functions if the PTP and/or PTR - are attached in the simulator. -*/ - -/* Port 1 (0x8004-0x8007) controls the Model 33 Teletype */ - -int32 ptr_flg1 = 0; -int32 odata, status; - - -int32 sio0s(int32 io, int32 data) -{ - UNIT *uptr; - - if (io == 0) { // control register read - if (ptr_flag) { // reader enabled? - if ((ptr_unit.flags & UNIT_ATT) == 0) // attached? - ptr_unit.u3 &= 0xFE; // no, clear RXF flag - else { - uptr = ptr_dev.units;// not EOF? - if (feof(uptr -> fileref)) - ptr_unit.u3 &= 0xFE; - else - ptr_unit.u3 |= 0x01; - } - return (status = ptr_unit.u3); // no - done - } else { - return (status = sio_unit.u3); // return console status - } - } else { // control register write - if (data == 0x03) { // reset port! - sio_unit.u3 = 0x02; // reset console - sio_unit.buf = 0; - sio_unit.pos = 0; - ptr_unit.u3 = 0x02; // reset reader - ptr_unit.buf = 0; - ptr_unit.pos = 0; - ptp_unit.u3 = 0x02; // reset punch - ptp_unit.buf = 0; - ptp_unit.pos = 0; - } - return (status = 0); // invalid io - } -} - -int32 sio0d(int32 io, int32 data) -{ - UNIT *uptr; - - if (io == 0) { // data register read - if (ptr_flag) { // RDR enabled? - if ((ptr_unit.flags & UNIT_ATT) == 0) // attached? - return 0; // no, done -// printf("ptr_unit.u3=%02X\n", ptr_unit.u3); - if ((ptr_unit.u3 & 0x01) == 0) { // yes, more data? -// printf("Returning old %02X\n", odata); // no, return previous byte - return (odata & 0xFF); - } - uptr = ptr_dev.units; // get data byte - if ((odata = getc(uptr -> fileref)) == EOF) { // end of file? -// printf("Got EOF\n"); - ptr_unit.u3 &= 0xFE; // clear RXF flag - return (odata = 0); // no data - } -// printf("Returning new %02X\n", odata); - ptr_unit.pos++; // step character count - ptr_unit.u3 &= 0xFE; // clear RXF flag - return (odata & 0xFF); // return character - } else { - sio_unit.u3 &= 0xFE; // clear RXF flag - return (odata = sio_unit.buf); // return next char - } - } else { // data register write - if (isprint(data) || data == '\r' || data == '\n') { // printable? - sim_putchar(data); // print character on console - if (ptp_flag && ptp_unit.flags & UNIT_ATT) { // PTP enabled & attached? - uptr = ptp_dev.units; // punch character to file - putc(data, uptr -> fileref); - ptp_unit.pos++; // step character counter - } - } else { // DC1-DC4 control Reader/Punch - switch (data) { - case 0x11: // RDR on - ptr_flag = 1; - ptr_flg1 = 0; - ptr_unit.u3 |= 0x01; -// printf("Reader on\r\n"); - break; - case 0x12: // PTP on - ptp_flag = 1; - ptp_unit.u3 |= 0x02; -// printf("Punch on\r\n"); - break; - case 0x13: // RDR off - ptr_flag = 0; -// printf("Reader off-%d bytes read\r\n", ptr_unit.pos); - break; - case 0x14: // PTP off - ptp_flag = 0; -// printf("Punch off-%d bytes written\r\n", ptp_unit.pos); - break; - default: // ignore all other characters - break; - } - } - } - return (odata = 0); -} - -/* because each port appears at 2 addresses and this fact is used - to determine if it is a MP-C or MP-S repeatedly in the SWTBUG - monitor, this code assures that reads of the high ports return - the same data as was read the last time on the low ports. -*/ - -int32 sio1s(int32 io, int32 data) -{ - return status; -} - -int32 sio1d(int32 io, int32 data) -{ - return odata; -} - diff --git a/swtp/swtp_sys.c b/swtp/swtp_sys.c deleted file mode 100644 index 391065cd..00000000 --- a/swtp/swtp_sys.c +++ /dev/null @@ -1,425 +0,0 @@ -/* swtp_sys.c: SWTP 6800 system interface - - Copyright (c) 2005, William Beech - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - WILLIAM A BEECH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the name of William A. Beech shall not - be used in advertising or otherwise to promote the sale, use or other dealings - in this Software without prior written authorization from William A. Beech. - - Based on work by Charles E Owen (c) 1997 and Peter Schorn (c) 2002-2005 - -*/ - -#include -#include -#include "swtp_defs.h" - -/* externals */ - -extern DEVICE cpu_dev; -extern DEVICE dsk_dev; -extern UNIT cpu_unit; -extern REG cpu_reg[]; -extern DEVICE sio_dev; -extern DEVICE ptr_dev; -extern DEVICE ptp_dev; -extern DEVICE lpt_dev; -extern unsigned char M[]; -extern int32 saved_PC; -extern int32 sim_switches; -//extern int32 (*sim_vm_fprint_addr)(FILE*, DEVICE*,t_addr); - -/* prototypes */ - -int32 sim_load (FILE *fileref, char *cptr, char *fnam, int flag); -int32 fprint_sym (FILE *of, int32 addr, uint32 *val, - UNIT *uptr, int32 sw); -t_addr fprint_addr(FILE *stream, DEVICE *dptr, t_addr addr); -int32 parse_sym (char *cptr, int32 addr, UNIT *uptr, uint32 *val, int32 sw); -void sim_special_init (void); - -/* links into scp */ - -void (*sim_vm_init)(void) = &sim_special_init; - -/* SCP data structures - - sim_name simulator name string - sim_PC pointer to saved PC register descriptor - sim_emax number of words needed for examine - sim_devices array of pointers to simulated devices - sim_stop_messages array of pointers to stop messages - sim_load binary loader -*/ - -char sim_name[] = "SWTP 6800"; - -REG *sim_PC = &cpu_reg[0]; - -int32 sim_emax = 16; - -DEVICE *sim_devices[] = { &cpu_dev, &sio_dev, &ptp_dev, &ptr_dev, &dsk_dev, NULL }; - -const char *sim_stop_messages[] = { - "Unknown error", - "Unknown I/O Instruction", - "HALT instruction", - "Breakpoint", - "Invalid Opcode", - "Invalid Memory" }; - -static const char *opcode[] = { -"???", "NOP", "???", "???", //0x00 -"???", "???", "TAP", "TPA", -"INX", "DEX", "CLV", "SEV", -"CLC", "SEC", "CLI", "SEI", -"SBA", "CBA", "???", "???", //0x10 -"???", "???", "TAB", "TBA", -"???", "DAA", "???", "ABA", -"???", "???", "???", "???", -"BRA", "???", "BHI", "BLS", //0x20 -"BCC", "BCS", "BNE", "BEQ", -"BVC", "BVS", "BPL", "BMI", -"BGE", "BLT", "BGT", "BLE", -"TSX", "INS", "PULA", "PULB", //0x30 -"DES", "TXS", "PSHA", "PSHB", -"???", "RTS", "???", "RTI", -"???", "???", "WAI", "SWI", -"NEGA", "???", "???", "COMA", //0x40 -"LSRA", "???", "RORA", "ASRA", -"ASLA", "ROLA", "DECA", "???", -"INCA", "TSTA", "???", "CLRA", -"NEGB", "???", "???", "COMB", //0x50 -"LSRB", "???", "RORB", "ASRB", -"ASLB", "ROLB", "DECB", "???", -"INCB", "TSTB", "???", "CLRB", -"NEG", "???", "???", "COM", //0x60 -"LSR", "???", "ROR", "ASR", -"ASL", "ROL", "DEC", "???", -"INC", "TST", "JMP", "CLR", -"NEG", "???", "???", "COM", //0x70 -"LSR", "???", "ROR", "ASR", -"ASL", "ROL", "DEC", "???", -"INC", "TST", "JMP", "CLR", -"SUBA", "CMPA", "SBCA", "???", //0x80 -"ANDA", "BITA", "LDAA", "???", -"EORA", "ADCA", "ORAA", "ADDA", -"CPX", "BSR", "LDS", "???", -"SUBA", "CMPA", "SBCA", "???", //0x90 -"ANDA", "BITA", "LDAA", "STAA", -"EORA", "ADCA", "ORAA", "ADDA", -"CPX", "???", "LDS", "STS", -"SUBA", "CMPA", "SBCA", "???", //0xA0 -"ANDA", "BITA", "LDAA", "STAA", -"EORA", "ADCA", "ORAA", "ADDA", -"CPX X", "JSR X", "LDS X", "STS X", -"SUBA", "CMPA", "SBCA", "???", //0xB0 -"ANDA", "BITA", "LDAA", "STAA", -"EORA", "ADCA", "ORAA", "ADDA", -"CPX", "JSR", "LDS", "STS", -"SUBB", "CMPB", "SBCB", "???", //0xC0 -"ANDB", "BITB", "LDAB", "???", -"EORB", "ADCB", "ORAB", "ADDB", -"???", "???", "LDX", "???", -"SUBB", "CMPB", "SBCB", "???", //0xD0 -"ANDB", "BITB", "LDAB", "STAB", -"EORB", "ADCB", "ORAB", "ADDB", -"???", "???", "LDX", "STX", -"SUBB", "CMPB", "SBCB", "???", //0xE0 -"ANDB", "BITB", "LDAB", "STAB", -"EORB", "ADCB", "ORAB", "ADDB", -"???", "???", "LDX", "STX", -"SUBB", "CMPB", "SBCB", "???", //0xF0 -"ANDB", "BITB", "LDAB", "STAB", -"EORB", "ADCB", "ORAB", "ADDB", -"???", "???", "LDX", "STX", - }; - -int32 oplen[256] = { -0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1, //0x00 -1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0, -2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2, -1,1,1,1,1,1,1,1,0,1,0,1,0,0,1,1, -1,0,0,1,1,0,1,1,1,1,1,0,1,1,0,1, //0x40 -1,0,0,1,1,0,1,1,1,1,1,0,1,1,0,1, -2,0,0,2,2,0,2,2,2,2,2,0,2,2,2,2, -3,0,0,3,3,0,3,3,3,3,3,0,3,3,3,3, -2,2,2,0,2,2,2,0,2,2,2,2,3,2,3,0, //0x80 -2,2,2,0,2,2,2,2,2,2,2,2,2,0,2,2, -2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2, -3,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3, -2,2,2,0,2,2,2,0,2,2,2,2,0,0,3,0, //0xC0 -2,2,2,0,2,2,2,2,2,2,2,2,0,0,2,2, -2,2,2,0,2,2,2,2,2,2,2,2,0,0,2,2, -3,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3 }; - -/* This is the dumper/loader. This command uses the -h to signify a - hex dump/load vice a binary one. If no address is given to load, it - takes the address from the hex record or the current PC for binary. -*/ - -int32 sim_load (FILE *fileref, char *cptr, char *fnam, int flag) -{ - int32 i, cnt = 0, addr = 0, start = 0x10000, end = 0, bytecnt, - cksum1, cksum, bytes[250]; - char buffer[256]; - - sscanf(cptr," %x-%x", &start, &end); - if (flag) { // dump - if (start == 0x10000) // no address parameter - return SCPE_2FARG; - if (sim_switches & 0x80) { // hex dump - addr = start; - while (addr <= end) { // more records to write - if ((addr + 16) <= end) // how many bytes this record - bytecnt = 16 + 3; - else - bytecnt = end - addr + 4; - cksum = -1 - (bytecnt) - (addr >> 8) - (addr & 0xFF); //init cksum - fprintf(fileref, "S1%02X%02X%02X", bytecnt, addr>>8, addr&0xFF); //header - for (i=0; i> 8) - (addr & 0xFF); //init cksum - for (i=0; i < bytecnt-3; i++) - cksum -= bytes[i]; - cksum &= 0xFF; - if (cksum != cksum1) - printf("Checksum error\n"); - else { - for (i=0; i < bytecnt-3; i++) { - M[addr++] = bytes[i]; - cnt++; - } - } - } else if (buffer[1] == '9') // end of file - printf("End of file\n"); - } - } - } else { // binary load - if (start == 0x10000) // no starting address - addr = saved_PC; - else - addr = start; - start = addr; - while ((i = getc (fileref)) != EOF) { - M[addr] = i; - addr++; - cnt++; - } - } - printf ("%d Bytes loaded starting at %04X\n", cnt, start); - } - return (SCPE_OK); -} - -/* Symbolic output - - Inputs: - *of = output stream - addr = current PC - *val = pointer to values - *uptr = pointer to unit - sw = switches - Outputs: - status = error code -*/ - -int32 fprint_sym (FILE *of, int32 addr, uint32 *val, - UNIT *uptr, int32 sw) -{ - int32 i, inst, inst1; - - if (sw & SWMASK ('D')) { // dump memory - for (i=0; i<16; i++) - fprintf(of, "%02X ", val[i]); - fprintf(of, " "); - for (i=0; i<16; i++) - if (isprint(val[i])) - fprintf(of, "%c", val[i]); - else - fprintf(of, "."); - return -15; - } else if (sw & SWMASK ('M')) { // dump instruction mnemonic - inst = val[0]; - if (!oplen[inst]) { // invalid opcode - fprintf(of, "%02X", inst); - return 0; - } - inst1 = inst & 0xF0; - fprintf (of, "%s", opcode[inst]); // mnemonic - if (strlen(opcode[inst]) == 3) - fprintf(of, " "); - if (inst1 == 0x20 || inst == 0x8D) { // rel operand - inst1 = val[1]; - if (val[1] & 0x80) - inst1 |= 0xFF00; - fprintf(of, " $%04X", (addr + inst1 + 2) & ADDRMASK); - } else if (inst1 == 0x80 || inst1 == 0xC0) { // imm operand - if ((inst & 0x0F) < 0x0C) - fprintf(of, " #$%02X", val[1]); - else - fprintf(of, " #$%02X%02X", val[1], val[2]); - } else if (inst1 == 0x60 || inst1 == 0xA0 || inst1 == 0xE0) // ind operand - fprintf(of, " %d,X", val[1]); - else if (inst1 == 0x70 || inst1 == 0xb0 || inst1 == 0xF0) // ext operand - fprintf(of, " $%02X%02X", val[1], val[2]); - return (-(oplen[inst] - 1)); - } else - return SCPE_ARG; -} - -/* address output routine */ - -t_addr fprint_addr(FILE *of, DEVICE *dptr, t_addr addr) -{ - fprintf(of, "%04X", addr); - return 0; -} - -/* Symbolic input - - Inputs: - *cptr = pointer to input string - addr = current PC - *uptr = pointer to unit - *val = pointer to output values - sw = switches - Outputs: - status = error status -*/ - -int32 parse_sym (char *cptr, int32 addr, UNIT *uptr, uint32 *val, int32 sw) -{ - int32 cflag, i = 0, j, r; - char gbuf[CBUFSIZE]; - - cflag = (uptr == NULL) || (uptr == &cpu_unit); - while (isspace (*cptr)) cptr++; /* absorb spaces */ - if ((sw & SWMASK ('A')) || ((*cptr == '\'') && cptr++)) { /* ASCII char? */ - if (cptr[0] == 0) - return SCPE_ARG; /* must have 1 char */ - val[0] = (uint32) cptr[0]; - return SCPE_OK; - } - if ((sw & SWMASK ('C')) || ((*cptr == '"') && cptr++)) { /* ASCII string? */ - if (cptr[0] == 0) - return SCPE_ARG; /* must have 1 char */ - val[0] = ((uint32) cptr[0] << 8) + (uint32) cptr[1]; - return SCPE_OK; - } - -/* An instruction: get opcode (all characters until null, comma, - or numeric (including spaces). -*/ - - while (1) { - if (*cptr == ',' || *cptr == '\0' || - isdigit(*cptr)) - break; - gbuf[i] = toupper(*cptr); - cptr++; - i++; - } - -/* Allow for RST which has numeric as part of opcode */ - - if (toupper(gbuf[0]) == 'R' && - toupper(gbuf[1]) == 'S' && - toupper(gbuf[2]) == 'T') { - gbuf[i] = toupper(*cptr); - cptr++; - i++; - } - -/* Allow for 'MOV' which is only opcode that has comma in it. */ - - if (toupper(gbuf[0]) == 'M' && - toupper(gbuf[1]) == 'O' && - toupper(gbuf[2]) == 'V') { - gbuf[i] = toupper(*cptr); - cptr++; - i++; - gbuf[i] = toupper(*cptr); - cptr++; - i++; - } - -/* kill trailing spaces if any */ - gbuf[i] = '\0'; - for (j = i - 1; gbuf[j] == ' '; j--) { - gbuf[j] = '\0'; - } - -/* find opcode in table */ - for (j = 0; j < 256; j++) { - if (strcmp(gbuf, opcode[j]) == 0) - break; - } - if (j > 255) /* not found */ - return SCPE_ARG; - - val[0] = j; /* store opcode */ - if (oplen[j] < 2) /* if 1-byter we are done */ - return SCPE_OK; - if (*cptr == ',') cptr++; - cptr = get_glyph(cptr, gbuf, 0); /* get address */ - sscanf(gbuf, "%o", &r); - if (oplen[j] == 2) { - val[1] = r & 0xFF; - return (-1); - } - val[1] = r & 0xFF; - val[2] = (r >> 8) & 0xFF; - return (-2); -} - -/* initialize optional interfaces */ - -void sim_special_init (void) -{ -// *sim_vm_fprint_addr = &fprint_addr; -} - diff --git a/swtp6800/common/bootrom.c b/swtp6800/common/bootrom.c new file mode 100644 index 00000000..c3ecc6e8 --- /dev/null +++ b/swtp6800/common/bootrom.c @@ -0,0 +1,231 @@ +/* bootrom.c: Boot ROM simulator for Motorola processors + + Copyright (c) 2010-2011, William A. Beech + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + WILLIAM A. BEECH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of William A. Beech shall not be + used in advertising or otherwise to promote the sale, use or other dealings + in this Software without prior written authorization from William A. Beech. + + These functions support a single simulated 2704 to 2764 EPROM device on + an 8-bit computer system.. This device allows the the device buffer to + be loaded from a binary file containing the emulated EPROM code. + + These functions support a simulated 2704, 2708, 2716, 2732 or 2764 EPROM + device on a CPU board. The byte get and put routines use an offset into + the boot EPROM image to locate the proper byte. This allows another device + to set the base address for the boot EPROM. The device type is stored as + a binary number in the first three unit flag bits. + + This device uses a dynamically allocated buffer to hold the EPROM image. + A call to BOOTROM_config will free the current buffer. A call to + BOOTROM_reset will allocate a new buffer of BOOTROM_unit.capac bytes. A + call to BOOTROM_attach will load the buffer with the EPROM image. +*/ + +#include +#include "swtp_defs.h" + +#define UNIT_V_MSIZE (UNIT_V_UF) /* ROM Size */ +#define UNIT_MSIZE (0x7 << UNIT_V_MSIZE) +#define UNIT_NONE (0 << UNIT_V_MSIZE) /* No EPROM */ +#define UNIT_2704 (1 << UNIT_V_MSIZE) /* 2704 mode */ +#define UNIT_2708 (2 << UNIT_V_MSIZE) /* 2708 mode */ +#define UNIT_2716 (3 << UNIT_V_MSIZE) /* 2716 mode */ +#define UNIT_2732 (4 << UNIT_V_MSIZE) /* 2732 mode */ +#define UNIT_2764 (5 << UNIT_V_MSIZE) /* 2764 mode */ + +/* function prototypes */ + +t_stat BOOTROM_svc (UNIT *uptr); +t_stat BOOTROM_config (UNIT *uptr, int32 val, char *cptr, void *desc); +t_stat BOOTROM_attach (UNIT *uptr, char *cptr); +t_stat BOOTROM_reset (DEVICE *dptr); +int32 BOOTROM_get_mbyte(int32 offset); + +/* SIMH Standard I/O Data Structures */ + +UNIT BOOTROM_unit = { UDATA (NULL, + UNIT_ATTABLE+UNIT_BINK+UNIT_ROABLE+UNIT_RO, 0), + KBD_POLL_WAIT }; + +MTAB BOOTROM_mod[] = { + { UNIT_MSIZE, UNIT_NONE, "None", "NONE", &BOOTROM_config }, + { UNIT_MSIZE, UNIT_2704, "2704", "2704", &BOOTROM_config }, + { UNIT_MSIZE, UNIT_2708, "2708", "2708", &BOOTROM_config }, + { UNIT_MSIZE, UNIT_2716, "2716", "2716", &BOOTROM_config }, + { UNIT_MSIZE, UNIT_2732, "2732", "2732", &BOOTROM_config }, + { UNIT_MSIZE, UNIT_2764, "2764", "2764", &BOOTROM_config }, + { 0 } +}; + +DEBTAB BOOTROM_debug[] = { + { "ALL", DEBUG_all }, + { "FLOW", DEBUG_flow }, + { "READ", DEBUG_read }, + { "WRITE", DEBUG_write }, + { "LEV1", DEBUG_level1 }, + { "LEV2", DEBUG_level2 }, + { NULL } +}; + +DEVICE BOOTROM_dev = { + "BOOTROM", /* name */ + &BOOTROM_unit, /* units */ + NULL, /* registers */ + BOOTROM_mod, /* modifiers */ + 1, /* numunits */ + 16, /* aradix */ + 32, /* awidth */ + 1, /* aincr */ + 16, /* dradix */ + 8, /* dwidth */ + NULL, /* examine */ + NULL, /* deposit */ + &BOOTROM_reset, /* reset */ + NULL, /* boot */ + &BOOTROM_attach, /* attach */ + NULL, /* detach */ + NULL, /* ctxt */ + DEV_DEBUG, /* flags */ + 0, /* dctrl */ + BOOTROM_debug, /* debflags */ + NULL, /* msize */ + NULL /* lname */ +}; + +/* global variables */ + +/* BOOTROM_attach - attach file to EPROM unit */ + +t_stat BOOTROM_attach (UNIT *uptr, char *cptr) +{ + t_stat r; + + if (BOOTROM_dev.dctrl & DEBUG_flow) + printf("BOOTROM_attach: cptr=%s\n", cptr); + if ((r = attach_unit (uptr, cptr)) != SCPE_OK) { + if (BOOTROM_dev.dctrl & DEBUG_flow) + printf("BOOTROM_attach: Error\n"); + return r; + } + if (BOOTROM_dev.dctrl & DEBUG_flow) + printf("BOOTROM_attach: Done\n"); + return (BOOTROM_reset (NULL)); +} + +/* BOOTROM_config = None, 2704, 2708, 2716, 2732 or 2764 */ + +t_stat BOOTROM_config (UNIT *uptr, int32 val, char *cptr, void *desc) +{ + if (BOOTROM_dev.dctrl & DEBUG_flow) /* entry message */ + printf("BOOTROM_config: val=%d\n", val); + if ((val < UNIT_NONE) || (val > UNIT_2764)) { /* valid param? */ + if (BOOTROM_dev.dctrl & DEBUG_flow) /* No */ + printf("BOOTROM_config: Parameter error\n"); + return SCPE_ARG; + } + if (val == UNIT_NONE) + BOOTROM_unit.capac = 0; /* set EPROM size */ + else + BOOTROM_unit.capac = 0x200 << ((val >> UNIT_V_MSIZE) - 1); /* set EPROM size */ + if (BOOTROM_unit.filebuf) { /* free buffer */ + free (BOOTROM_unit.filebuf); + BOOTROM_unit.filebuf = NULL; + } + if (BOOTROM_dev.dctrl & DEBUG_flow) /* status message */ + printf("BOOTROM_config: BOOTROM_unit.capac=%d\n", + BOOTROM_unit.capac); + if (BOOTROM_dev.dctrl & DEBUG_flow) /* exit message */ + printf("BOOTROM_config: Done\n"); + return SCPE_OK; +} + +/* EPROM reset */ + +t_stat BOOTROM_reset (DEVICE *dptr) +{ + t_addr j; + int c; + FILE *fp; + + if (BOOTROM_dev.dctrl & DEBUG_flow) + printf("BOOTROM_reset: \n"); + if ((BOOTROM_unit.flags & UNIT_MSIZE) == 0) { /* if none selected */ +// printf(" EPROM: Defaulted to None\n"); +// printf(" \"set eprom NONE | 2704 | 2708 | 2716 | 2732 | 2764\"\n"); +// printf(" \"att eprom \"\n"); + BOOTROM_unit.capac = 0; /* set EPROM size to 0 */ + if (BOOTROM_dev.dctrl & DEBUG_flow) + printf("BOOTROM_reset: Done1\n"); + return SCPE_OK; + } /* if attached */ +// printf(" EPROM: Initializing [%04X-%04XH]\n", +// 0xE000, 0xE000 + BOOTROM_unit.capac - 1); + if (BOOTROM_unit.filebuf == NULL) { /* no buffer allocated */ + BOOTROM_unit.filebuf = malloc(BOOTROM_unit.capac); /* allocate EPROM buffer */ + if (BOOTROM_unit.filebuf == NULL) { + if (BOOTROM_dev.dctrl & DEBUG_flow) + printf("BOOTROM_reset: Malloc error\n"); + return SCPE_MEM; + } + } + fp = fopen(BOOTROM_unit.filename, "rb"); /* open EPROM file */ + if (fp == NULL) { + printf("\tUnable to open ROM file %s\n",BOOTROM_unit.filename); + printf("\tNo ROM image loaded!!!\n"); + return SCPE_OK; + } + j = 0; /* load EPROM file */ + c = fgetc(fp); + while (c != EOF) { + *((uint8 *)(BOOTROM_unit.filebuf) + j++) = c & 0xFF; + c = fgetc(fp); + if (j > BOOTROM_unit.capac) { + printf("\tImage is too large - Load truncated!!!\n"); + break; + } + } + fclose(fp); +// printf("\t%d bytes of ROM image %s loaded\n", j, BOOTROM_unit.filename); + if (BOOTROM_dev.dctrl & DEBUG_flow) + printf("BOOTROM_reset: Done2\n"); + return SCPE_OK; +} + +/* get a byte from memory - byte offset of image */ + +int32 BOOTROM_get_mbyte(int32 offset) +{ + int32 val; + + if (BOOTROM_unit.filebuf == NULL) { + if (BOOTROM_dev.dctrl & DEBUG_read) + printf("BOOTROM_get_mbyte: EPROM not configured\n"); + return 0xFF; + } + if (BOOTROM_dev.dctrl & DEBUG_read) + printf("BOOTROM_get_mbyte: offset=%04X\n", offset); + val = *((uint8 *)(BOOTROM_unit.filebuf) + offset) & 0xFF; + if (BOOTROM_dev.dctrl & DEBUG_read) + printf("BOOTROM_get_mbyte: Normal val=%02X\n", val); + return val; +} + +/* end of bootrom.c */ diff --git a/swtp6800/common/dc-4.c b/swtp6800/common/dc-4.c new file mode 100644 index 00000000..80cfd54d --- /dev/null +++ b/swtp6800/common/dc-4.c @@ -0,0 +1,570 @@ +/* dc4.c: SWTP DC-4 FDC Simulator + + Copyright (c) 2005-2011, William A. Beech + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + WILLIAM A BEECH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of William A. Beech shall not + be used in advertising or otherwise to promote the sale, use or other dealings + in this Software without prior written authorization from William A. Beech. + + The DC-4 is a 5-inch floppy controller which can control up + to 4 daisy-chained 5-inch floppy drives. The controller is based on + the Western Digital 1797 Floppy Disk Controller (FDC) chip. This + file only emulates the minimum DC-4 functionality to interface with + the virtual disk file. + + The floppy controller is interfaced to the CPU by use of 5 memory + addreses. These are SS-30 slot numbers 5 and 6 (0x8014-0x801B). + + Address Mode Function + ------- ---- -------- + + 0x8014 Read Returns FDC interrupt status + 0x8014 Write Selects the drive/head/motor control + 0x8018 Read Returns status of FDC + 0x8018 Write FDC command register + 0x8019 Read Returns FDC track register + 0x8019 Write Set FDC track register + 0x801A Read Returns FDC sector register + 0x801A Write Set FDC sector register + 0x801B Read Read data + 0x801B Write Write data + + Drive Select Read (0x8014): + + +---+---+---+---+---+---+---+---+ + | I | D | X | X | X | X | X | X | + +---+---+---+---+---+---+---+---+ + + I = Set indicates an interrupt request from the FDC pending. + D = DRQ pending - same as bit 1 of FDC status register. + + Drive Select Write (0x8014): + + +---+---+---+---+---+---+---+---+ + | M | S | X | X | X | X | Device| + +---+---+---+---+---+---+---+---+ + + M = If this bit is 1, the one-shot is triggered/retriggered to + start/keep the motors on. + S = Side select. If set, side one is selected otherwise side zero + is selected. + X = not used + Device = value 0 thru 3, selects drive 0-3 to be controlled. + + Drive Status Read (0x8018): + + +---+---+---+---+---+---+---+---+ + | R | P | H | S | C | L | D | B | + +---+---+---+---+---+---+---+---+ + + B - When 1, the controller is busy. + D - When 1, index mark detected (type I) or data request - read data + ready/write data empty (type II or III). + H - When 1, track 0 (type I) or lost data (type II or III). + C - When 1, crc error detected. + S - When 1, seek (type I) or RNF (type II or III) error. + H - When 1, head is currently loaded (type I) or record type/ + write fault (type II or III). + P - When 1, indicates that diskette is write-protected. + R - When 1, drive is not ready. + + Drive Control Write (0x8018) for type I commands: + + +---+---+---+---+---+---+---+---+ + | 0 | S2| S1| S0| H | V | R1| R0| + +---+---+---+---+---+---+---+---+ + + R0/R1 - Selects the step rate. + V - When 1, verify on destination track. + H - When 1, loads head to drive surface. + S0/S1/S2 = 000 - home. + 001 - seek track in data register. + 010 - step without updating track register. + 011 - step and update track register. + 100 - step in without updating track register. + 101 - step in and update track register. + 110 - step out without updating track register. + 111 - step out and update track register. + + Drive Control Write (0x8018) for type II commands: + + +---+---+---+---+---+---+---+---+ + | 1 | 0 | T | M | S | E | B | A | + +---+---+---+---+---+---+---+---+ + + A - Zero for read, 1 on write deleted data mark else data mark. + B - When 1, shifts sector length field definitions one place. + E - When, delay operation 15 ms, 0 no delay. + S - When 1, select side 1, 0 select side 0. + M - When 1, multiple records, 0 for single record. + T - When 1, write command, 0 for read. + + Drive Control Write (0x8018) for type III commands: + + +---+---+---+---+---+---+---+---+ + | 1 | 1 | T0| T1| 0 | E | 0 | 0 | + +---+---+---+---+---+---+---+---+ + + E - When, delay operation 15 ms, 0 no delay. + T0/T1 - 00 - read address command. + 10 - read track command. + 11 - write track command. + + Tracks are numbered from 0 up to one minus the last track in the 1797! + + Track Register Read (0x8019): + + +---+---+---+---+---+---+---+---+ + | Track Number | + +---+---+---+---+---+---+---+---+ + + Reads the current 8-bit value from the track position. + + Track Register Write (0x8019): + + +---+---+---+---+---+---+---+---+ + | Track Number | + +---+---+---+---+---+---+---+---+ + + Writes the 8-bit value to the track register. + + Sectors are numbers from 1 up to the last sector in the 1797! + + Sector Register Read (0x801A): + + +---+---+---+---+---+---+---+---+ + | Sector Number | + +---+---+---+---+---+---+---+---+ + + Reads the current 8-bit value from the sector position. + + Sector Register Write (0x801A): + + +---+---+---+---+---+---+---+---+ + | Sector Number | + +---+---+---+---+---+---+---+---+ + + Writes the 8-bit value to the sector register. + + Data Register Read (0x801B): + + +---+---+---+---+---+---+---+---+ + | Data | + +---+---+---+---+---+---+---+---+ + + Reads the current 8-bit value from the data register. + + Data Register Write (0x801B): + + +---+---+---+---+---+---+---+---+ + | Data | + +---+---+---+---+---+---+---+---+ + + Writes the 8-bit value to the data register. + + A FLEX disk is defined as follows: + + Track Sector Use + 0 1 Boot sector + 0 2 Boot sector (cont) + 0 3 Unused + 0 4 System Identity Record (explained below) + 0 5 Unused + 0 6-last Directory - 10 entries/sector (explained below) + 1 1 First available data sector + last-1 last Last available data sector + + System Identity Record + + Byte Use + 0x00 Two bytes of zeroes (Clears forward link) + 0x10 Volume name in ASCII(11 bytes) + 0x1B Volume number in binary (2 bytes) + 0x1D Address of first free data sector (Track-Sector) (2 bytes) + 0x1F Address of last free data sector (Track-Sector) (2 bytes) + 0x21 Total number of data sectors in binary (2 bytes) + 0x23 Current date (Month-Day-Year) in binary + 0x26 Highest track number on disk in binary (byte) + 0x27 Highest sector number on a track in binary (byte) + + The following unit registers are used by this controller emulation: + + dsk_unit[cur_drv].u3 unit current flags + dsk_unit[cur_drv].u4 unit current track + dsk_unit[cur_drv].u5 unit current sector + dsk_unit[cur_drv].pos unit current sector byte index into buffer + dsk_unit[cur_drv].filebuf unit current sector buffer + dsk_unit[cur_drv].fileref unit current attached file reference +*/ + +#include +#include "swtp_defs.h" + +#define DEBUG 0 + +#define UNIT_V_ENABLE (UNIT_V_UF + 0) /* Write Enable */ +#define UNIT_ENABLE (1 << UNIT_V_ENABLE) + +/* emulate a SS FLEX disk with 72 sectors and 80 tracks */ + +#define NUM_DISK 4 /* standard 1797 maximum */ +#define SECT_SIZE 256 /* standard FLEX sector */ +#define NUM_SECT 72 /* sectors/track */ +#define TRAK_SIZE (SECT_SIZE * NUM_SECT) /* trk size (bytes) */ +#define HEADS 1 /* handle as SS with twice the sectors */ +#define NUM_CYL 80 /* maximum tracks */ +#define DSK_SIZE (NUM_SECT * HEADS * NUM_CYL * SECT_SIZE) /* dsk size (bytes) */ + +#define SECSIZ 256 /* standard FLEX sector */ + +/* SIR offsets */ +#define MAXCYL 0x26 /* last cylinder # */ +#define MAXSEC 0x27 /* last sector # */ + +/* 1797 status bits */ + +#define BUSY 0x01 +#define DRQ 0x02 +#define WRPROT 0x40 +#define NOTRDY 0x80 + +/* function prototypes */ + +t_stat dsk_reset (DEVICE *dptr); + +/* SS-50 I/O address space functions */ + +int32 fdcdrv(int32 io, int32 data); +int32 fdccmd(int32 io, int32 data); +int32 fdctrk(int32 io, int32 data); +int32 fdcsec(int32 io, int32 data); +int32 fdcdata(int32 io, int32 data); + +/* Local Variables */ + +int32 fdcbyte; +int32 intrq = 0; /* interrupt request flag */ +int32 cur_dsk; /* Currently selected drive */ +int32 wrt_flag = 0; /* FDC write flag */ + +int32 spt; /* sectors/track */ +int32 trksiz; /* trk size (bytes) */ +int32 heds; /* number of heads */ +int32 cpd; /* cylinders/disk */ +int32 dsksiz; /* dsk size (bytes) */ + +/* Floppy Disk Controller data structures + + dsk_dev Mother Board device descriptor + dsk_unit Mother Board unit descriptor + dsk_reg Mother Board register list + dsk_mod Mother Board modifiers list +*/ + +UNIT dsk_unit[] = { + { UDATA (NULL, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE, 0) }, + { UDATA (NULL, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE, 0) }, + { UDATA (NULL, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE, 0) }, + { UDATA (NULL, UNIT_FIX+UNIT_ATTABLE+UNIT_DISABLE, 0) } +}; + +REG dsk_reg[] = { + { HRDATA (DISK, cur_dsk, 4) }, + { NULL } +}; + +MTAB dsk_mod[] = { + { UNIT_ENABLE, UNIT_ENABLE, "RW", "RW", NULL }, + { UNIT_ENABLE, 0, "RO", "RO", NULL }, + { 0 } +}; + +DEBTAB dsk_debug[] = { + { "ALL", DEBUG_all }, + { "FLOW", DEBUG_flow }, + { "READ", DEBUG_read }, + { "WRITE", DEBUG_write }, + { "LEV1", DEBUG_level1 }, + { "LEV2", DEBUG_level2 }, + { NULL } +}; + +DEVICE dsk_dev = { + "DC-4", //name + dsk_unit, //units + dsk_reg, //registers + dsk_mod, //modifiers + 4, //numunits + 16, //aradix + 16, //awidth + 1, //aincr + 16, //dradix + 8, //dwidth + NULL, //examine + NULL, //deposit + &dsk_reset, //reset + NULL, //boot + NULL, //attach + NULL, //detach + NULL, //ctxt + DEV_DEBUG, //flags + 0, //dctrl + dsk_debug, /* debflags */ + NULL, //msize + NULL //lname +}; + +/* Reset routine */ + +t_stat dsk_reset (DEVICE *dptr) +{ + int i; + + cur_dsk = 5; /* force initial SIR read */ + for (i=0; i +#include "swtp_defs.h" + +#define I2716_NUM 4 /* number of 2716 EPROMS */ + +extern int32 get_base(void); + +/* function prototypes */ + +t_stat i2716_attach (UNIT *uptr, char *cptr); +t_stat i2716_reset (DEVICE *dptr); +int32 i2716_get_mbyte(int32 offset); + +/* SIMH EPROM Standard I/O Data Structures */ + +UNIT i2716_unit[] = { + { UDATA (NULL,UNIT_ATTABLE+UNIT_ROABLE+UNIT_RO, 0), 0 }, + { UDATA (NULL,UNIT_ATTABLE+UNIT_ROABLE+UNIT_RO, 0), 0 }, + { UDATA (NULL,UNIT_ATTABLE+UNIT_ROABLE+UNIT_RO, 0), 0 }, + { UDATA (NULL,UNIT_ATTABLE+UNIT_ROABLE+UNIT_RO, 0), 0 } +}; + +MTAB i2716_mod[] = { + { 0 } +}; + +DEBTAB i2716_debug[] = { + { "ALL", DEBUG_all }, + { "FLOW", DEBUG_flow }, + { "READ", DEBUG_read }, + { "WRITE", DEBUG_write }, + { "LEV1", DEBUG_level1 }, + { "LEV2", DEBUG_level2 }, + { NULL } +}; + +DEVICE i2716_dev = { + "I2716", /* name */ + i2716_unit, /* units */ + NULL, /* registers */ + i2716_mod, /* modifiers */ + I2716_NUM, /* numunits */ + 16, /* aradix */ + 32, /* awidth */ + 1, /* aincr */ + 16, /* dradix */ + 8, /* dwidth */ + NULL, /* examine */ + NULL, /* deposit */ + &i2716_reset, /* reset */ + NULL, /* boot */ + &i2716_attach, /* attach */ + NULL, /* detach */ + NULL, /* ctxt */ + DEV_DEBUG, /* flags */ + 0, /* dctrl */ + i2716_debug, /* debflags */ + NULL, /* msize */ + NULL /* lname */ +}; + +/* global variables */ + +/* i2716_attach - attach file to EPROM unit + force EPROM reset at completion */ + +t_stat i2716_attach (UNIT *uptr, char *cptr) +{ + int32 j, c; + t_stat r; + FILE *fp; + + if (i2716_dev.dctrl & DEBUG_flow) + printf("i2716_attach: cptr=%s\n", cptr); + if ((r = attach_unit (uptr, cptr)) != SCPE_OK) { + if (i2716_dev.dctrl & DEBUG_flow) + printf("i2716_attach: Error\n"); + return r; + } + if (i2716_dev.dctrl & DEBUG_read) + printf("\tOpen file\n"); + fp = fopen(uptr->filename, "rb"); /* open EPROM file */ + if (fp == NULL) { + printf("i2716%d: Unable to open ROM file %s\n", (int)(uptr - i2716_dev.units), uptr->filename); + printf("\tNo ROM image loaded!!!\n"); + return SCPE_OK; + } + if (i2716_dev.dctrl & DEBUG_read) + printf("\tRead file\n"); + j = 0; /* load EPROM file */ + c = fgetc(fp); + while (c != EOF) { + *((uint8 *)(uptr->filebuf) + j++) = c & 0xFF; + c = fgetc(fp); + if (j > 2048) { + printf("\tImage is too large - Load truncated!!!\n"); + break; + } + } + if (i2716_dev.dctrl & DEBUG_read) + printf("\tClose file\n"); + fclose(fp); +// printf("i2716%d: %d bytes of ROM image %s loaded\n",uptr - i2716_dev.units, j, uptr->filename); + if (i2716_dev.dctrl & DEBUG_flow) + printf("i2716_attach: Done\n"); + return SCPE_OK; +} + +/* EPROM reset */ + +t_stat i2716_reset (DEVICE *dptr) +{ + int32 i, base; + UNIT *uptr; + + if (i2716_dev.dctrl & DEBUG_flow) + printf("i2716_reset: \n"); + for (i = 0; i < I2716_NUM; i++) { /* init all units */ + uptr = i2716_dev.units + i; + if (i2716_dev.dctrl & DEBUG_flow) + printf("i2716 %d unit.flags=%08X\n", i, uptr->flags); + uptr->capac = 2048; + uptr->u3 = 2048 * i; + base = get_base(); + if (uptr->filebuf == NULL) { /* no buffer allocated */ + uptr->filebuf = malloc(2048); /* allocate EPROM buffer */ + if (uptr->filebuf == NULL) { + if (i2716_dev.dctrl & DEBUG_flow) + printf("i2716_reset: Malloc error\n"); + return SCPE_MEM; + } + } + if (base == 0) { +// printf("i2716%d: Not enabled on MP-A2\n", i); + continue; + } +// printf("i2716%d: Initializing [%04X-%04XH]\n", +// i, base+uptr->u3, base+uptr->u3 + uptr->capac); +// if ((uptr->flags & UNIT_ATT) == 0) { +// printf("i2716%d: No file attached\n", i); +// } + } + if (i2716_dev.dctrl & DEBUG_flow) + printf("i2716_reset: Done\n"); + return SCPE_OK; +} + +/* I/O instruction handlers, called from the CPU module when an + EPROM memory read or write is issued. +*/ + +/* get a byte from memory */ + +int32 i2716_get_mbyte(int32 offset) +{ + int32 i, val, org, len; + UNIT *uptr; + + for (i = 0; i < I2716_NUM; i++) { /* find addressed unit */ + uptr = i2716_dev.units + i; + org = uptr->u3; + len = uptr->capac - 1; + if ((offset >= org) && (offset < (org + len))) { + if (uptr->filebuf == NULL) { + if (i2716_dev.dctrl & DEBUG_read) + printf("i2716_get_mbyte: EPROM not configured\n"); + return 0xFF; + } else { + val = *((uint8 *)(uptr->filebuf) + (offset - org)); + if (i2716_dev.dctrl & DEBUG_read) + printf(" val=%04X\n", val); + return (val & 0xFF); + } + } + } + if (i2716_dev.dctrl & DEBUG_read) + printf("i2716_get_mbyte: Out of range\n"); + return 0xFF; +} + +/* end of i2716.c */ diff --git a/swtp6800/common/m6800.c b/swtp6800/common/m6800.c new file mode 100644 index 00000000..c7f8bf02 --- /dev/null +++ b/swtp6800/common/m6800.c @@ -0,0 +1,2018 @@ +/* m6800.c: SWTP 6800 CPU simulator + + Copyright (c) 2005-2011, William Beech + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + WILLIAM A. BEECH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of William A. Beech shall not + be used in advertising or otherwise to promote the sale, use or other dealings + in this Software without prior written authorization from William A. Beech. + + cpu Motorola M6800 CPU + + The register state for the M6800 CPU is: + + A<0:7> Accumulator A + B<0:7> Accumulator B + IX<0:15> Index Register + CCR<0:7> Condition Code Register + HF half-carry flag + IF interrupt flag + NF negative flag + ZF zero flag + VF overflow flag + CF carry flag + PC<0:15> program counter + SP<0:15> Stack Pointer + + The M6800 is an 8-bit CPU, which uses 16-bit registers to address + up to 64KB of memory. + + The 72 basic instructions come in 1, 2, and 3-byte flavors. + + This routine is the instruction decode routine for the M6800. + It is called from the CPU board simulator to execute + instructions in simulated memory, starting at the simulated PC. + It runs until 'reason' is set non-zero. + + General notes: + + 1. Reasons to stop. The simulator can be stopped by: + + WAI instruction + I/O error in I/O simulator + Invalid OP code (if ITRAP is set on CPU) + Invalid mamory address (if MTRAP is set on CPU) + + 2. Interrupts. + There are 4 types of interrupt, and in effect they do a + hardware CALL instruction to one of 4 possible high memory addresses. + + 3. Non-existent memory. + On the SWTP 6800, reads to non-existent memory + return 0FFH, and writes are ignored. +*/ + +#include + +#include "swtp_defs.h" + +#define UNIT_V_OPSTOP (UNIT_V_UF) /* Stop on Invalid OP? */ +#define UNIT_OPSTOP (1 << UNIT_V_OPSTOP) +#define UNIT_V_MSTOP (UNIT_V_UF+1) /* Stop on Invalid memory? */ +#define UNIT_MSTOP (1 << UNIT_V_MSTOP) + +/* Flag values to set proper positions in CCR */ +#define HF 0x20 +#define IF 0x10 +#define NF 0x08 +#define ZF 0x04 +#define VF 0x02 +#define CF 0x01 + +/* Macros to handle the flags in the CCR */ +#define CCR_ALWAYS_ON (0xC0) /* for 6800 */ +#define CCR_MSK (HF|IF|NF|ZF|VF|CF) +#define TOGGLE_FLAG(FLAG) (CCR ^= FLAG) +#define SET_FLAG(FLAG) (CCR |= FLAG) +#define CLR_FLAG(FLAG) (CCR &= ~FLAG) +#define GET_FLAG(FLAG) (CCR & FLAG) +#define COND_SET_FLAG(COND,FLAG) \ + if (COND) SET_FLAG(FLAG); else CLR_FLAG(FLAG) +#define COND_SET_FLAG_N(VAR) \ + if (VAR & 0x80) SET_FLAG(NF); else CLR_FLAG(NF) +#define COND_SET_FLAG_Z(VAR) \ + if (VAR == 0) SET_FLAG(ZF); else CLR_FLAG(ZF) +#define COND_SET_FLAG_H(VAR) \ + if (VAR & 0x10) SET_FLAG(HF); else CLR_FLAG(HF) +#define COND_SET_FLAG_C(VAR) \ + if (VAR & 0x100) SET_FLAG(CF); else CLR_FLAG(CF) +#define COND_SET_FLAG_V(COND) \ + if (COND) SET_FLAG(VF); else CLR_FLAG(VF) + +/* local global variables */ + +int32 A = 0; /* Accumulator A */ +int32 B = 0; /* Accumulator B */ +int32 IX = 0; /* Index register */ +int32 SP = 0; /* Stack pointer */ +int32 CCR = CCR_ALWAYS_ON | IF; /* Condition Code Register */ +int32 saved_PC = 0; /* Program counter */ +int32 PC; /* global for the helper routines */ +int32 INTE = 0; /* Interrupt Enable */ +int32 int_req = 0; /* Interrupt request */ + +int32 mem_fault = 0; /* memory fault flag */ + +extern int32 sim_int_char; +extern uint32 sim_brk_types, sim_brk_dflt, sim_brk_summ; /* breakpoint info */ + +/* function prototypes */ + +t_stat m6800_reset (DEVICE *dptr); +void dump_regs(void); +void dump_regs1(void); +int32 fetch_byte(int32 flag); +int32 fetch_word(void); +uint8 pop_byte(void); +uint16 pop_word(void); +void push_byte(uint8 val); +void push_word(uint16 val); +void go_rel(int32 cond); +int32 get_rel_addr(void); +int32 get_dir_val(void); +int32 get_dir_addr(void); +int32 get_indir_val(void); +int32 get_indir_addr(void); +int32 get_ext_val(void); +int32 get_ext_addr(void); +int32 get_flag(int32 flag); +void condevalVa(int32 op1, int32 op2); +void condevalVs(int32 op1, int32 op2); + +/* external routines */ + +extern void CPU_BD_put_mbyte(int32 addr, int32 val); +extern void CPU_BD_put_mword(int32 addr, int32 val); +extern int32 CPU_BD_get_mbyte(int32 addr); +extern int32 CPU_BD_get_mword(int32 addr); +extern int32 sim_switches; + +/* CPU data structures + + m6800_dev CPU device descriptor + m6800_unit CPU unit descriptor + m6800_reg CPU register list + m6800_mod CPU modifiers list */ + +UNIT m6800_unit = { UDATA (NULL, 0, 0) }; + +REG m6800_reg[] = { + { HRDATA (PC, saved_PC, 16) }, + { HRDATA (A, A, 8) }, + { HRDATA (B, B, 8) }, + { HRDATA (IX, IX, 16) }, + { HRDATA (SP, SP, 16) }, + { HRDATA (CCR, CCR, 8) }, + { FLDATA (INTE, INTE, 16) }, + { ORDATA (WRU, sim_int_char, 8) }, + { NULL } }; + +MTAB m6800_mod[] = { + { UNIT_OPSTOP, UNIT_OPSTOP, "ITRAP", "ITRAP", NULL }, + { UNIT_OPSTOP, 0, "NOITRAP", "NOITRAP", NULL }, + { UNIT_MSTOP, UNIT_MSTOP, "MTRAP", "MTRAP", NULL }, + { UNIT_MSTOP, 0, "NOMTRAP", "NOMTRAP", NULL }, + { 0 } }; + +DEBTAB m6800_debug[] = { + { "ALL", DEBUG_all }, + { "FLOW", DEBUG_flow }, + { "READ", DEBUG_read }, + { "WRITE", DEBUG_write }, + { "LEV1", DEBUG_level1 }, + { "LEV2", DEBUG_level2 }, + { "REG", DEBUG_reg }, + { "ASM", DEBUG_asm }, + { NULL } +}; + +DEVICE m6800_dev = { + "CPU", //name + &m6800_unit, //units + m6800_reg, //registers + m6800_mod, //modifiers + 1, //numunits + 16, //aradix + 16, //awidth + 1, //aincr + 16, //dradix + 8, //dwidth + NULL, //examine + NULL, //deposit + &m6800_reset, //reset + NULL, //boot + NULL, //attach + NULL, //detach + NULL, //ctxt + DEV_DEBUG, //flags + 0, //dctrl + m6800_debug, //debflags + NULL, //msize + NULL //lname +}; + +static const char *opcode[] = { +"???", "NOP", "???", "???", //0x00 +"???", "???", "TAP", "TPA", +"INX", "DEX", "CLV", "SEV", +"CLC", "SEC", "CLI", "SEI", +"SBA", "CBA", "???", "???", //0x10 +"???", "???", "TAB", "TBA", +"???", "DAA", "???", "ABA", +"???", "???", "???", "???", +"BRA", "???", "BHI", "BLS", //0x20 +"BCC", "BCS", "BNE", "BEQ", +"BVC", "BVS", "BPL", "BMI", +"BGE", "BLT", "BGT", "BLE", +"TSX", "INS", "PULA", "PULB", //0x30 +"DES", "TXS", "PSHA", "PSHB", +"???", "RTS", "???", "RTI", +"???", "???", "WAI", "SWI", +"NEGA", "???", "???", "COMA", //0x40 +"LSRA", "???", "RORA", "ASRA", +"ASLA", "ROLA", "DECA", "???", +"INCA", "TSTA", "???", "CLRA", +"NEGB", "???", "???", "COMB", //0x50 +"LSRB", "???", "RORB", "ASRB", +"ASLB", "ROLB", "DECB", "???", +"INCB", "TSTB", "???", "CLRB", +"NEG", "???", "???", "COM", //0x60 +"LSR", "???", "ROR", "ASR", +"ASL", "ROL", "DEC", "???", +"INC", "TST", "JMP", "CLR", +"NEG", "???", "???", "COM", //0x70 +"LSR", "???", "ROR", "ASR", +"ASL", "ROL", "DEC", "???", +"INC", "TST", "JMP", "CLR", +"SUBA", "CMPA", "SBCA", "???", //0x80 +"ANDA", "BITA", "LDAA", "???", +"EORA", "ADCA", "ORAA", "ADDA", +"CPX", "BSR", "LDS", "???", +"SUBA", "CMPA", "SBCA", "???", //0x90 +"ANDA", "BITA", "LDAA", "STAA", +"EORA", "ADCA", "ORAA", "ADDA", +"CPX", "???", "LDS", "STS", +"SUBA", "CMPA", "SBCA", "???", //0xA0 +"ANDA", "BITA", "LDAA", "STAA", +"EORA", "ADCA", "ORAA", "ADDA", +"CPX X", "JSR X", "LDS X", "STS X", +"SUBA", "CMPA", "SBCA", "???", //0xB0 +"ANDA", "BITA", "LDAA", "STAA", +"EORA", "ADCA", "ORAA", "ADDA", +"CPX", "JSR", "LDS", "STS", +"SUBB", "CMPB", "SBCB", "???", //0xC0 +"ANDB", "BITB", "LDAB", "???", +"EORB", "ADCB", "ORAB", "ADDB", +"???", "???", "LDX", "???", +"SUBB", "CMPB", "SBCB", "???", //0xD0 +"ANDB", "BITB", "LDAB", "STAB", +"EORB", "ADCB", "ORAB", "ADDB", +"???", "???", "LDX", "STX", +"SUBB", "CMPB", "SBCB", "???", //0xE0 +"ANDB", "BITB", "LDAB", "STAB", +"EORB", "ADCB", "ORAB", "ADDB", +"???", "???", "LDX", "STX", +"SUBB", "CMPB", "SBCB", "???", //0xF0 +"ANDB", "BITB", "LDAB", "STAB", +"EORB", "ADCB", "ORAB", "ADDB", +"???", "???", "LDX", "STX", +}; + +int32 oplen[256] = { +0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1, //0x00 +1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,0, +2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2, +1,1,1,1,1,1,1,1,0,1,0,1,0,0,1,1, +1,0,0,1,1,0,1,1,1,1,1,0,1,1,0,1, //0x40 +1,0,0,1,1,0,1,1,1,1,1,0,1,1,0,1, +2,0,0,2,2,0,2,2,2,2,2,0,2,2,2,2, +3,0,0,3,3,0,3,3,3,3,3,0,3,3,3,3, +2,2,2,0,2,2,2,0,2,2,2,2,3,2,3,0, //0x80 +2,2,2,0,2,2,2,2,2,2,2,2,2,0,2,2, +2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2, +3,3,3,0,3,3,3,3,3,3,3,3,3,3,3,3, +2,2,2,0,2,2,2,0,2,2,2,2,0,0,3,0, //0xC0 +2,2,2,0,2,2,2,2,2,2,2,2,0,0,2,2, +2,2,2,0,2,2,2,2,2,2,2,2,0,0,2,2, +3,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3 +}; + +int32 sim_instr (void) +{ + extern int32 sim_interval; + int32 IR, OP, DAR, reason, hi, lo, op1; + + PC = saved_PC & ADDRMASK; /* load local PC */ + reason = 0; + + /* Main instruction fetch/decode loop */ + + while (reason == 0) { /* loop until halted */ +// dump_regs1(); + if (sim_interval <= 0) /* check clock queue */ + if (reason = sim_process_event ()) + break; + if (mem_fault) { /* memory fault? */ + mem_fault = 0; /* reset fault flag */ + reason = STOP_MEMORY; + break; + } + if (int_req > 0) { /* interrupt? */ + /* 6800 interrupts not implemented yet. None were used, + on a standard SWTP 6800. All I/O is programmed. */ + } /* end interrupt */ + if (sim_brk_summ && + sim_brk_test (PC, SWMASK ('E'))) { /* breakpoint? */ + reason = STOP_IBKPT; /* stop simulation */ + break; + } + IR = OP = fetch_byte(0); /* fetch instruction */ + sim_interval--; + + /* The Big Instruction Decode Switch */ + + switch (IR) { + + case 0x01: /* NOP */ + break; + case 0x06: /* TAP */ + CCR = A; + break; + case 0x07: /* TPA */ + A = CCR; + break; + case 0x08: /* INX */ + IX = (IX + 1) & ADDRMASK; + COND_SET_FLAG_Z(IX); + break; + case 0x09: /* DEX */ + IX = (IX - 1) & ADDRMASK; + COND_SET_FLAG_Z(IX); + break; + case 0x0A: /* CLV */ + CLR_FLAG(VF); + break; + case 0x0B: /* SEV */ + SET_FLAG(VF); + break; + case 0x0C: /* CLC */ + CLR_FLAG(CF); + break; + case 0x0D: /* SEC */ + SET_FLAG(CF); + break; + case 0x0E: /* CLI */ + CLR_FLAG(IF); + break; + case 0x0F: /* SEI */ + SET_FLAG(IF); + break; + case 0x10: /* SBA */ + op1 = A; + A = A - B; + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + COND_SET_FLAG_C(A); + condevalVs(B, op1); + A &= 0xFF; + break; + case 0x11: /* CBA */ + lo = A - B; + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + COND_SET_FLAG_C(lo); + condevalVs(B, A); + break; + case 0x16: /* TAB */ + B = A; + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + CLR_FLAG(VF); + break; + case 0x17: /* TBA */ + A = B; + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + CLR_FLAG(VF); + break; + case 0x19: /* DAA */ + DAR = A & 0x0F; + op1 = get_flag(CF); + if (DAR > 9 || get_flag(CF)) { + DAR += 6; + A &= 0xF0; + A |= (DAR & 0x0F); + COND_SET_FLAG(DAR & 0x10,CF); + } + DAR = (A >> 4) & 0x0F; + if (DAR > 9 || get_flag(CF)) { + DAR += 6; + if (get_flag(CF)) + DAR++; + A &= 0x0F; + A |= (DAR << 4); + } + COND_SET_FLAG(op1,CF); + if ((DAR << 4) & 0x100) + SET_FLAG(CF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + A &= 0xFF; + break; + case 0x1B: /* ABA */ + A += B; + COND_SET_FLAG_H(A); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + COND_SET_FLAG_C(A); + condevalVa(A, B); + A &= 0xFF; + break; + case 0x20: /* BRA rel */ + go_rel(1); + break; + case 0x22: /* BHI rel */ + go_rel(!(get_flag(CF) | get_flag(ZF))); + break; + case 0x23: /* BLS rel */ + go_rel(get_flag(CF) | get_flag(ZF)); + break; + case 0x24: /* BCC rel */ + go_rel(!get_flag(CF)); + break; + case 0x25: /* BCS rel */ + go_rel(get_flag(CF)); + break; + case 0x26: /* BNE rel */ + go_rel(!get_flag(ZF)); + break; + case 0x27: /* BEQ rel */ + go_rel(get_flag(ZF)); + break; + case 0x28: /* BVC rel */ + go_rel(!get_flag(VF)); + break; + case 0x29: /* BVS rel */ + go_rel(get_flag(VF)); + break; + case 0x2A: /* BPL rel */ + go_rel(!get_flag(NF)); + break; + case 0x2B: /* BMI rel */ + go_rel(get_flag(NF)); + break; + case 0x2C: /* BGE rel */ + go_rel(!(get_flag(NF) ^ get_flag(VF))); + break; + case 0x2D: /* BLT rel */ + go_rel(get_flag(NF) ^ get_flag(VF)); + break; + case 0x2E: /* BGT rel */ + go_rel(!(get_flag(ZF) | (get_flag(NF) ^ get_flag(VF)))); + break; + case 0x2F: /* BLE rel */ + go_rel(get_flag(ZF) | (get_flag(NF) ^ get_flag(VF))); + break; + case 0x30: /* TSX */ + IX = (SP + 1) & ADDRMASK; + break; + case 0x31: /* INS */ + SP = (SP + 1) & ADDRMASK; + break; + case 0x32: /* PUL A */ + A = pop_byte(); + break; + case 0x33: /* PUL B */ + B = pop_byte(); + break; + case 0x34: /* DES */ + SP = (SP - 1) & ADDRMASK; + break; + case 0x35: /* TXS */ + SP = (IX - 1) & ADDRMASK; + break; + case 0x36: /* PSH A */ + push_byte(A); + break; + case 0x37: /* PSH B */ + push_byte(B); + break; + case 0x39: /* RTS */ + PC = pop_word(); + break; + case 0x3B: /* RTI */ + CCR = pop_byte(); + B = pop_byte(); + A = pop_byte(); + IX = pop_word(); + PC = pop_word(); + break; + case 0x3E: /* WAI */ + push_word(PC); + push_word(IX); + push_byte(A); + push_byte(B); + push_byte(CCR); + if (get_flag(IF)) { + reason = STOP_HALT; + continue; + } else { + SET_FLAG(IF); + PC = CPU_BD_get_mword(0xFFFE) & ADDRMASK; + } + break; + case 0x3F: /* SWI */ + push_word(PC); + push_word(IX); + push_byte(A); + push_byte(B); + push_byte(CCR); + SET_FLAG(IF); + PC = CPU_BD_get_mword(0xFFFB) & ADDRMASK; + break; + case 0x40: /* NEG A */ + A = (0 - A) & 0xFF; + COND_SET_FLAG_V(A & 0x80); + COND_SET_FLAG(A,CF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0x43: /* COM A */ + A = ~A & 0xFF; + CLR_FLAG(VF); + SET_FLAG(CF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0x44: /* LSR A */ + COND_SET_FLAG(A & 0x01,CF); + A = (A >> 1) & 0xFF; + CLR_FLAG(NF); + COND_SET_FLAG_Z(A); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x46: /* ROR A */ + hi = get_flag(CF); + COND_SET_FLAG(A & 0x01,CF); + A = (A >> 1) & 0xFF; + if (hi) + A |= 0x80; + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x47: /* ASR A */ + COND_SET_FLAG(A & 0x01,CF); + lo = A & 0x80; + A = (A >> 1) & 0xFF; + A |= lo; + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x48: /* ASL A */ + COND_SET_FLAG(A & 0x80,CF); + A = (A << 1) & 0xFF; + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x49: /* ROL A */ + hi = get_flag(CF); + COND_SET_FLAG(A & 0x80,CF); + A = (A << 1) & 0xFF; + if (hi) + A |= 0x01; + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x4A: /* DEC A */ + COND_SET_FLAG_V(A == 0x80); + A = (A - 1) & 0xFF; + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0x4C: /* INC A */ + COND_SET_FLAG_V(A == 0x7F); + A = (A + 1) & 0xFF; + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0x4D: /* TST A */ + lo = (A - 0) & 0xFF; + CLR_FLAG(VF); + CLR_FLAG(CF); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0x4F: /* CLR A */ + A = 0; + CLR_FLAG(NF); + CLR_FLAG(VF); + CLR_FLAG(CF); + SET_FLAG(ZF); + break; + case 0x50: /* NEG B */ + B = (0 - B) & 0xFF; + COND_SET_FLAG_V(B & 0x80); + COND_SET_FLAG(B,CF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0x53: /* COM B */ + B = ~B; + B &= 0xFF; + CLR_FLAG(VF); + SET_FLAG(CF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0x54: /* LSR B */ + COND_SET_FLAG(B & 0x01,CF); + B = (B >> 1) & 0xFF; + CLR_FLAG(NF); + COND_SET_FLAG_Z(B); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x56: /* ROR B */ + hi = get_flag(CF); + COND_SET_FLAG(B & 0x01,CF); + B = (B >> 1) & 0xFF; + if (hi) + B |= 0x80; + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x57: /* ASR B */ + COND_SET_FLAG(B & 0x01,CF); + lo = B & 0x80; + B = (B >> 1) & 0xFF; + B |= lo; + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x58: /* ASL B */ + COND_SET_FLAG(B & 0x80,CF); + B = (B << 1) & 0xFF; + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x59: /* ROL B */ + hi = get_flag(CF); + COND_SET_FLAG(B & 0x80,CF); + B = (B << 1) & 0xFF; + if (hi) + B |= 0x01; + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x5A: /* DEC B */ + COND_SET_FLAG_V(B == 0x80); + B = (B - 1) & 0xFF; + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0x5C: /* INC B */ + COND_SET_FLAG_V(B == 0x7F); + B = (B + 1) & 0xFF; + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0x5D: /* TST B */ + lo = (B - 0) & 0xFF; + CLR_FLAG(VF); + CLR_FLAG(CF); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0x5F: /* CLR B */ + B = 0; + CLR_FLAG(NF); + CLR_FLAG(VF); + CLR_FLAG(CF); + SET_FLAG(ZF); + break; + case 0x60: /* NEG ind */ + DAR = get_indir_addr(); + lo = (0 - CPU_BD_get_mbyte(DAR)) & 0xFF; + CPU_BD_put_mbyte(DAR, lo); + COND_SET_FLAG_V(lo & 0x80); + COND_SET_FLAG(lo,CF); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0x63: /* COM ind */ + DAR = get_indir_addr(); + lo = ~CPU_BD_get_mbyte(DAR); + lo &= 0xFF; + CPU_BD_put_mbyte(DAR, lo); + CLR_FLAG(VF); + SET_FLAG(CF); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0x64: /* LSR ind */ + DAR = get_indir_addr(); + lo = CPU_BD_get_mbyte(DAR); + COND_SET_FLAG(lo & 0x01,CF); + lo >>= 1; + CPU_BD_put_mbyte(DAR, lo); + CLR_FLAG(NF); + COND_SET_FLAG_Z(lo); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x66: /* ROR ind */ + DAR = get_indir_addr(); + lo = CPU_BD_get_mbyte(DAR); + hi = get_flag(CF); + COND_SET_FLAG(lo & 0x01,CF); + lo >>= 1; + if (hi) + lo |= 0x80; + CPU_BD_put_mbyte(DAR, lo); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x67: /* ASR ind */ + DAR = get_indir_addr(); + lo = CPU_BD_get_mbyte(DAR); + COND_SET_FLAG(lo & 0x01,CF); + lo = (lo & 0x80) | (lo >> 1); + CPU_BD_put_mbyte(DAR, lo); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x68: /* ASL ind */ + DAR = get_indir_addr(); + lo = CPU_BD_get_mbyte(DAR); + COND_SET_FLAG(lo & 0x80,CF); + lo <<= 1; + CPU_BD_put_mbyte(DAR, lo); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x69: /* ROL ind */ + DAR = get_indir_addr(); + lo = CPU_BD_get_mbyte(DAR); + hi = get_flag(CF); + COND_SET_FLAG(lo & 0x80,CF); + lo <<= 1; + if (hi) + lo |= 0x01; + CPU_BD_put_mbyte(DAR, lo); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x6A: /* DEC ind */ + DAR = get_indir_addr(); + lo = CPU_BD_get_mbyte(DAR); + COND_SET_FLAG_V(lo == 0x80); + lo = (lo - 1) & 0xFF; + CPU_BD_put_mbyte(DAR, lo); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0x6C: /* INC ind */ + DAR= get_indir_addr(); + lo = CPU_BD_get_mbyte(DAR); + COND_SET_FLAG_V(lo == 0x7F); + lo = (lo + 1) & 0xFF; + CPU_BD_put_mbyte(DAR, lo); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0x6D: /* TST ind */ + lo = (get_indir_val() - 0) & 0xFF; + CLR_FLAG(VF); + CLR_FLAG(CF); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0x6E: /* JMP ind */ + PC = get_indir_addr(); + break; + case 0x6F: /* CLR ind */ + CPU_BD_put_mbyte(get_indir_addr(), 0); + CLR_FLAG(NF); + CLR_FLAG(VF); + CLR_FLAG(CF); + SET_FLAG(ZF); + break; + case 0x70: /* NEG ext */ + DAR = get_ext_addr(); + lo = (0 - CPU_BD_get_mbyte(DAR)) & 0xFF; + CPU_BD_put_mbyte(DAR, lo); + COND_SET_FLAG_V(lo & 0x80); + CLR_FLAG(CF); + if (lo) + SET_FLAG(CF); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0x73: /* COM ext */ + DAR = get_ext_addr(); + lo = ~CPU_BD_get_mbyte(DAR); + lo &= 0xFF; + CPU_BD_put_mbyte(DAR, lo); + CLR_FLAG(VF); + SET_FLAG(CF); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0x74: /* LSR ext */ + DAR = get_ext_addr(); + lo = CPU_BD_get_mbyte(DAR); + COND_SET_FLAG(lo & 0x01,CF); + lo >>= 1; + CPU_BD_put_mbyte(DAR, lo); + CLR_FLAG(NF); + COND_SET_FLAG_Z(lo); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x76: /* ROR ext */ + DAR = get_ext_addr(); + hi = get_flag(CF); + lo = CPU_BD_get_mbyte(DAR); + COND_SET_FLAG(lo & 0x01,CF); + lo >>= 1; + if (hi) + lo |= 0x80; + CPU_BD_put_mbyte(DAR, lo); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x77: /* ASR ext */ + DAR = get_ext_addr(); + lo = CPU_BD_get_mbyte(DAR); + COND_SET_FLAG(lo & 0x01,CF); + hi = lo & 0x80; + lo >>= 1; + lo |= hi; + CPU_BD_put_mbyte(DAR, lo); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x78: /* ASL ext */ + DAR = get_ext_addr(); + lo = CPU_BD_get_mbyte(DAR); + COND_SET_FLAG(lo & 0x80,CF); + lo <<= 1; + CPU_BD_put_mbyte(DAR, lo); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x79: /* ROL ext */ + DAR = get_ext_addr(); + lo = CPU_BD_get_mbyte(DAR); + hi = get_flag(CF); + COND_SET_FLAG(lo & 0x80,CF); + lo <<= 1; + if (hi) + lo |= 0x01; + CPU_BD_put_mbyte(DAR, lo); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + COND_SET_FLAG_V(get_flag(NF) ^ get_flag(CF)); + break; + case 0x7A: /* DEC ext */ + DAR = get_ext_addr(); + lo = CPU_BD_get_mbyte(DAR); + COND_SET_FLAG_V(lo == 0x80); + lo = (lo - 1) & 0xFF; + CPU_BD_put_mbyte(DAR, lo); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0x7C: /* INC ext */ + DAR = get_ext_addr(); + lo = CPU_BD_get_mbyte(DAR); + COND_SET_FLAG_V(lo == 0x7F); + lo = (lo + 1) & 0xFF; + CPU_BD_put_mbyte(DAR, lo); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0x7D: /* TST ext */ + lo = CPU_BD_get_mbyte(get_ext_addr()) - 0; + CLR_FLAG(VF); + CLR_FLAG(CF); + COND_SET_FLAG_N(lo); + lo &= 0xFF; + COND_SET_FLAG_Z(lo); + break; + case 0x7E: /* JMP ext */ + PC = get_ext_addr() & ADDRMASK; + break; + case 0x7F: /* CLR ext */ + CPU_BD_put_mbyte(get_ext_addr(), 0); + CLR_FLAG(NF); + CLR_FLAG(VF); + CLR_FLAG(CF); + SET_FLAG(ZF); + break; + case 0x80: /* SUB A imm */ + op1 = get_dir_addr(); + A = A - op1; + COND_SET_FLAG_N(A); + COND_SET_FLAG_C(A); + condevalVs(A, op1); + A &= 0xFF; + COND_SET_FLAG_Z(A); + break; + case 0x81: /* CMP A imm */ + op1 = get_dir_addr(); + lo = A - op1; + COND_SET_FLAG_N(lo); + COND_SET_FLAG_C(lo); + condevalVs(lo, op1); + lo &= 0xFF; + COND_SET_FLAG_Z(lo); + break; + case 0x82: /* SBC A imm */ + op1 = get_dir_addr(); + A = A - op1 - get_flag(CF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_C(A); + condevalVs(A, op1); + A &= 0xFF; + COND_SET_FLAG_Z(A); + break; + case 0x84: /* AND A imm */ + A = (A & get_dir_addr()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0x85: /* BIT A imm */ + lo = (A & get_dir_addr()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0x86: /* LDA A imm */ + A = get_dir_addr(); + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0x88: /* EOR A imm */ + A = (A ^ get_dir_addr()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0x89: /* ADC A imm */ + op1 = get_dir_addr(); + A = A + op1 + get_flag(CF); + COND_SET_FLAG_H(A); + COND_SET_FLAG_N(A); + COND_SET_FLAG_C(A); + condevalVa(A, op1); + A &= 0xFF; + COND_SET_FLAG_Z(A); + break; + case 0x8A: /* ORA A imm */ + A = (A | get_dir_addr()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0x8B: /* ADD A imm */ + op1 = get_dir_addr(); + A = A + op1; + COND_SET_FLAG_H(A); + COND_SET_FLAG_N(A); + COND_SET_FLAG_C(A); + condevalVa(A, op1); + A &= 0xFF; + COND_SET_FLAG_Z(A); + break; + case 0x8C: /* CPX imm */ + op1 = IX - get_ext_addr(); + COND_SET_FLAG_Z(op1); + COND_SET_FLAG_N(op1 >> 8); + COND_SET_FLAG_V(op1 & 0x10000); + break; + case 0x8D: /* BSR rel */ + lo = get_rel_addr(); + push_word(PC); + PC = PC + lo; + PC &= ADDRMASK; + break; + case 0x8E: /* LDS imm */ + SP = get_ext_addr(); + COND_SET_FLAG_N(SP >> 8); + COND_SET_FLAG_Z(SP); + CLR_FLAG(VF); + break; + case 0x90: /* SUB A dir */ + op1 = get_dir_val(); + A = A - op1; + COND_SET_FLAG_N(A); + COND_SET_FLAG_C(A); + condevalVs(A, op1); + A &= 0xFF; + COND_SET_FLAG_Z(A); + break; + case 0x91: /* CMP A dir */ + op1 = get_dir_val(); + lo = A - op1; + COND_SET_FLAG_N(lo); + COND_SET_FLAG_C(lo); + condevalVs(A, op1); + lo &= 0xFF; + COND_SET_FLAG_Z(lo); + break; + case 0x92: /* SBC A dir */ + op1 = get_dir_val(); + A = A - op1 - get_flag(CF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_C(A); + condevalVs(A, op1); + A &= 0xFF; + COND_SET_FLAG_Z(A); + break; + case 0x94: /* AND A dir */ + A = (A & get_dir_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0x95: /* BIT A dir */ + lo = (A & get_dir_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0x96: /* LDA A dir */ + A = get_dir_val(); + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0x97: /* STA A dir */ + CPU_BD_put_mbyte(get_dir_addr(), A); + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0x98: /* EOR A dir */ + A = (A ^ get_dir_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0x99: /* ADC A dir */ + op1 = get_dir_val(); + A = A + op1 + get_flag(CF); + COND_SET_FLAG_H(A); + COND_SET_FLAG_N(A); + COND_SET_FLAG_C(A); + condevalVa(A, op1); + A &= 0xFF; + COND_SET_FLAG_Z(A); + break; + case 0x9A: /* ORA A dir */ + A = (A | get_dir_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0x9B: /* ADD A dir */ + op1 = get_dir_val(); + A = A + op1; + COND_SET_FLAG_H(A); + COND_SET_FLAG_N(A); + COND_SET_FLAG_C(A); + condevalVa(A, op1); + A &= 0xFF; + COND_SET_FLAG_Z(A); + break; + case 0x9C: /* CPX dir */ + op1 = IX - CPU_BD_get_mword(get_dir_addr()); + COND_SET_FLAG_Z(op1); + COND_SET_FLAG_N(op1 >> 8); + COND_SET_FLAG_V(op1 & 0x10000); + break; + case 0x9E: /* LDS dir */ + SP = CPU_BD_get_mword(get_dir_addr()); + COND_SET_FLAG_N(SP >> 8); + COND_SET_FLAG_Z(SP); + CLR_FLAG(VF); + break; + case 0x9F: /* STS dir */ + CPU_BD_put_mword(get_dir_addr(), SP); + COND_SET_FLAG_N(SP >> 8); + COND_SET_FLAG_Z(SP); + CLR_FLAG(VF); + break; + case 0xA0: /* SUB A ind */ + op1 = get_indir_val(); + A = A - op1; + COND_SET_FLAG_N(A); + COND_SET_FLAG_C(A); + condevalVs(A, op1); + A &= 0xFF; + COND_SET_FLAG_Z(A); + break; + case 0xA1: /* CMP A ind */ + op1 = get_indir_val(); + lo = A - op1; + COND_SET_FLAG_N(lo); + COND_SET_FLAG_C(lo); + condevalVs(A, op1); + lo &= 0xFF; + COND_SET_FLAG_Z(lo); + break; + case 0xA2: /* SBC A ind */ + op1 = get_indir_val(); + A = A - op1 - get_flag(CF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_C(A); + condevalVs(A, op1); + A &= 0xFF; + COND_SET_FLAG_Z(A); + break; + case 0xA4: /* AND A ind */ + A = (A & get_indir_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0xA5: /* BIT A ind */ + lo = (A & get_indir_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0xA6: /* LDA A ind */ + A = get_indir_val(); + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0xA7: /* STA A ind */ + CPU_BD_put_mbyte(get_indir_addr(), A); + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0xA8: /* EOR A ind */ + A = (A ^ get_indir_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0xA9: /* ADC A ind */ + op1 = get_indir_val(); + A = A + op1 + get_flag(CF); + COND_SET_FLAG_H(A); + COND_SET_FLAG_N(A); + COND_SET_FLAG_C(A); + condevalVa(A, op1); + A &= 0xFF; + COND_SET_FLAG_Z(A); + break; + case 0xAA: /* ORA A ind */ + A = (A | get_indir_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0xAB: /* ADD A ind */ + op1 = get_indir_val(); + A = A + op1; + COND_SET_FLAG_H(A); + COND_SET_FLAG_N(A); + COND_SET_FLAG_C(A); + condevalVa(A, op1); + A &= 0xFF; + COND_SET_FLAG_Z(A); + break; + case 0xAC: /* CPX ind */ + op1 = (IX - get_indir_addr()) & ADDRMASK; + COND_SET_FLAG_Z(op1); + COND_SET_FLAG_N(op1 >> 8); + COND_SET_FLAG_V(op1 & 0x10000); + break; + case 0xAD: /* JSR ind */ + DAR = get_indir_addr(); + push_word(PC); + PC = DAR; + break; + case 0xAE: /* LDS ind */ + SP = CPU_BD_get_mword(get_indir_addr()); + COND_SET_FLAG_N(SP >> 8); + COND_SET_FLAG_Z(SP); + CLR_FLAG(VF); + break; + case 0xAF: /* STS ind */ + CPU_BD_put_mword(get_indir_addr(), SP); + COND_SET_FLAG_N(SP >> 8); + COND_SET_FLAG_Z(SP); + CLR_FLAG(VF); + break; + case 0xB0: /* SUB A ext */ + op1 = get_ext_val(); + A = A - op1; + COND_SET_FLAG_N(A); + COND_SET_FLAG_C(A); + condevalVs(A, op1); + A &= 0xFF; + COND_SET_FLAG_Z(A); + break; + case 0xB1: /* CMP A ext */ + op1 = get_ext_val(); + lo = A - op1; + COND_SET_FLAG_N(lo); + COND_SET_FLAG_C(lo); + condevalVs(A, op1); + lo &= 0xFF; + COND_SET_FLAG_Z(lo); + break; + case 0xB2: /* SBC A ext */ + op1 = get_ext_val(); + A = A - op1 - get_flag(CF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_C(A); + condevalVs(A, op1); + A &= 0xFF; + COND_SET_FLAG_Z(A); + break; + case 0xB4: /* AND A ext */ + A = (A & get_ext_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0xB5: /* BIT A ext */ + lo = (A & get_ext_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0xB6: /* LDA A ext */ + A = get_ext_val(); + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0xB7: /* STA A ext */ + CPU_BD_put_mbyte(get_ext_addr(), A); + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0xB8: /* EOR A ext */ + A = (A ^ get_ext_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0xB9: /* ADC A ext */ + op1 = get_ext_val(); + A = A + op1 + get_flag(CF); + COND_SET_FLAG_H(A); + COND_SET_FLAG_N(A); + COND_SET_FLAG_C(A); + condevalVa(A, op1); + A &= 0xFF; + COND_SET_FLAG_Z(A); + break; + case 0xBA: /* ORA A ext */ + A = (A | get_ext_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(A); + COND_SET_FLAG_Z(A); + break; + case 0xBB: /* ADD A ext */ + op1 = get_ext_val(); + A = A + op1; + COND_SET_FLAG_H(A); + COND_SET_FLAG_N(A); + COND_SET_FLAG_C(A); + condevalVa(A, op1); + A &= 0xFF; + COND_SET_FLAG_Z(A); + break; + case 0xBC: /* CPX ext */ + op1 = (IX - CPU_BD_get_mword(get_ext_addr()));// & ADDRMASK; + COND_SET_FLAG_Z(op1); + COND_SET_FLAG_N(op1 >> 8); + COND_SET_FLAG_V(op1 & 0x10000); + break; + case 0xBD: /* JSR ext */ + DAR = get_ext_addr(); + push_word(PC); + PC = DAR; + break; + case 0xBE: /* LDS ext */ + SP = CPU_BD_get_mword(get_ext_addr()); + COND_SET_FLAG_N(SP >> 8); + COND_SET_FLAG_Z(SP); + CLR_FLAG(VF); + break; + case 0xBF: /* STS ext */ + CPU_BD_put_mword(get_ext_addr(), SP); + COND_SET_FLAG_N(SP >> 8); + COND_SET_FLAG_Z(SP); + CLR_FLAG(VF); + break; + case 0xC0: /* SUB B imm */ + op1 = get_dir_addr(); + B = B - op1; + COND_SET_FLAG_N(B); + COND_SET_FLAG_C(B); + condevalVs(B, op1); + B &= 0xFF; + COND_SET_FLAG_Z(B); + break; + case 0xC1: /* CMP B imm */ + op1 = get_dir_addr(); + lo = B - op1; + COND_SET_FLAG_N(lo); + COND_SET_FLAG_C(lo); + condevalVs(B, op1); + lo &= 0xFF; + COND_SET_FLAG_Z(lo); + break; + case 0xC2: /* SBC B imm */ + op1 = get_dir_addr(); + B = B - op1 - get_flag(CF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_C(B); + condevalVs(B, op1); + B &= 0xFF; + COND_SET_FLAG_Z(B); + break; + case 0xC4: /* AND B imm */ + B = (B & get_dir_addr()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xC5: /* BIT B imm */ + lo = (B & get_dir_addr()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0xC6: /* LDA B imm */ + B = get_dir_addr(); + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xC8: /* EOR B imm */ + B = (B ^ get_dir_addr()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xC9: /* ADC B imm */ + op1 = get_dir_addr(); + B = B + op1 + get_flag(CF); + COND_SET_FLAG_H(B); + COND_SET_FLAG_N(B); + COND_SET_FLAG_C(B); + condevalVa(B, op1); + B &= 0xFF; + COND_SET_FLAG_Z(B); + break; + case 0xCA: /* ORA B imm */ + B = (B | get_dir_addr()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xCB: /* ADD B imm */ + op1 = get_dir_addr(); + B = B + op1; + COND_SET_FLAG_H(B); + COND_SET_FLAG_N(B); + COND_SET_FLAG_C(B); + condevalVa(B, op1); + B &= 0xFF; + COND_SET_FLAG_Z(B); + break; + case 0xCE: /* LDX imm */ + IX = get_ext_addr(); + COND_SET_FLAG_N(IX >> 8); + COND_SET_FLAG_Z(IX); + CLR_FLAG(VF); + break; + case 0xD0: /* SUB B dir */ + op1 = get_dir_val(); + B = B - op1; + COND_SET_FLAG_N(B); + COND_SET_FLAG_C(B); + condevalVs(B, op1); + B &= 0xFF; + COND_SET_FLAG_Z(B); + break; + case 0xD1: /* CMP B dir */ + op1 = get_dir_val(); + lo = B - op1; + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + COND_SET_FLAG_C(lo); + condevalVs(B, op1); + break; + case 0xD2: /* SBC B dir */ + op1 = get_dir_val(); + B = B - op1 - get_flag(CF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_C(B); + condevalVs(B, op1); + B &= 0xFF; + COND_SET_FLAG_Z(B); + break; + case 0xD4: /* AND B dir */ + B = (B & get_dir_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xD5: /* BIT B dir */ + lo = (B & get_dir_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0xD6: /* LDA B dir */ + B = get_dir_val(); + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xD7: /* STA B dir */ + CPU_BD_put_mbyte(get_dir_addr(), B); + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xD8: /* EOR B dir */ + B = (B ^ get_dir_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xD9: /* ADC B dir */ + op1 = get_dir_val(); + B = B + op1 + get_flag(CF); + COND_SET_FLAG_H(B); + COND_SET_FLAG_N(B); + COND_SET_FLAG_C(B); + condevalVa(B, op1); + B &= 0xFF; + COND_SET_FLAG_Z(B); + break; + case 0xDA: /* ORA B dir */ + B = (B | get_dir_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xDB: /* ADD B dir */ + op1 = get_dir_val(); + B = B + op1; + COND_SET_FLAG_H(B); + COND_SET_FLAG_N(B); + COND_SET_FLAG_C(B); + condevalVa(B, op1); + B &= 0xFF; + COND_SET_FLAG_Z(B); + break; + case 0xDE: /* LDX dir */ + IX = CPU_BD_get_mword(get_dir_addr()); + COND_SET_FLAG_N(IX >> 8); + COND_SET_FLAG_Z(IX); + CLR_FLAG(VF); + break; + case 0xDF: /* STX dir */ + CPU_BD_put_mword(get_dir_addr(), IX); + COND_SET_FLAG_N(IX >> 8); + COND_SET_FLAG_Z(IX); + CLR_FLAG(VF); + break; + case 0xE0: /* SUB B ind */ + op1 = get_indir_val(); + B = B - op1; + COND_SET_FLAG_N(B); + COND_SET_FLAG_C(B); + condevalVs(B, op1); + B &= 0xFF; + COND_SET_FLAG_Z(B); + break; + case 0xE1: /* CMP B ind */ + op1 = get_indir_val(); + lo = B - op1; + COND_SET_FLAG_N(lo); + COND_SET_FLAG_C(lo); + condevalVs(B, op1); + lo &= 0xFF; + COND_SET_FLAG_Z(lo); + break; + case 0xE2: /* SBC B ind */ + op1 = get_indir_val(); + B = B - op1 - get_flag(CF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_C(B); + condevalVs(B, op1); + B &= 0xFF; + COND_SET_FLAG_Z(B); + break; + case 0xE4: /* AND B ind */ + B = (B & get_indir_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xE5: /* BIT B ind */ + lo = (B & get_indir_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0xE6: /* LDA B ind */ + B = get_indir_val(); + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xE7: /* STA B ind */ + CPU_BD_put_mbyte(get_indir_addr(), B); + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xE8: /* EOR B ind */ + B = (B ^ get_indir_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xE9: /* ADC B ind */ + op1 = get_indir_val(); + B = B + op1 + get_flag(CF); + COND_SET_FLAG_H(B); + COND_SET_FLAG_N(B); + COND_SET_FLAG_C(B); + condevalVa(B, op1); + B &= 0xFF; + COND_SET_FLAG_Z(B); + break; + case 0xEA: /* ORA B ind */ + B = (B | get_indir_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xEB: /* ADD B ind */ + op1 = get_indir_val(); + B = B + op1; + COND_SET_FLAG_H(B); + COND_SET_FLAG_N(B); + COND_SET_FLAG_C(B); + condevalVa(B, op1); + B &= 0xFF; + COND_SET_FLAG_Z(B); + break; + case 0xEE: /* LDX ind */ + IX = CPU_BD_get_mword(get_indir_addr()); + COND_SET_FLAG_N(IX >> 8); + COND_SET_FLAG_Z(IX); + CLR_FLAG(VF); + break; + case 0xEF: /* STX ind */ + CPU_BD_put_mword(get_indir_addr(), IX); + COND_SET_FLAG_N(IX >> 8); + COND_SET_FLAG_Z(IX); + CLR_FLAG(VF); + break; + case 0xF0: /* SUB B ext */ + op1 = get_ext_val(); + B = B - op1; + COND_SET_FLAG_N(B); + COND_SET_FLAG_C(B); + condevalVs(B, op1); + B &= 0xFF; + COND_SET_FLAG_Z(B); + break; + case 0xF1: /* CMP B ext */ + op1 = get_ext_val(); + lo = B - op1; + COND_SET_FLAG_N(lo); + COND_SET_FLAG_C(lo); + condevalVs(B, op1); + lo &= 0xFF; + COND_SET_FLAG_Z(lo); + break; + case 0xF2: /* SBC B ext */ + op1 = get_ext_val(); + B = B - op1 - get_flag(CF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_C(B); + condevalVs(B, op1); + B &= 0xFF; + COND_SET_FLAG_Z(B); + break; + case 0xF4: /* AND B ext */ + B = (B & get_ext_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xF5: /* BIT B ext */ + lo = (B & get_ext_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(lo); + COND_SET_FLAG_Z(lo); + break; + case 0xF6: /* LDA B ext */ + B = get_ext_val(); + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xF7: /* STA B ext */ + CPU_BD_put_mbyte(get_ext_addr(), B); + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xF8: /* EOR B ext */ + B = (B ^ get_ext_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xF9: /* ADC B ext */ + op1 = get_ext_val(); + B = B + op1 + get_flag(CF); + COND_SET_FLAG_H(B); + COND_SET_FLAG_N(B); + COND_SET_FLAG_C(B); + condevalVa(B, op1); + B &= 0xFF; + COND_SET_FLAG_Z(B); + break; + case 0xFA: /* ORA B ext */ + B = (B | get_ext_val()) & 0xFF; + CLR_FLAG(VF); + COND_SET_FLAG_N(B); + COND_SET_FLAG_Z(B); + break; + case 0xFB: /* ADD B ext */ + op1 = get_ext_val(); + B = B + op1; + COND_SET_FLAG_H(B); + COND_SET_FLAG_N(B); + COND_SET_FLAG_C(B); + condevalVa(B, op1); + B &= 0xFF; + COND_SET_FLAG_Z(B); + break; + case 0xFE: /* LDX ext */ + IX = CPU_BD_get_mword(get_ext_addr()); + COND_SET_FLAG_N(IX >> 8); + COND_SET_FLAG_Z(IX); + CLR_FLAG(VF); + break; + case 0xFF: /* STX ext */ + CPU_BD_put_mword(get_ext_addr(), IX); + COND_SET_FLAG_N(IX >> 8); + COND_SET_FLAG_Z(IX); + CLR_FLAG(VF); + break; + + default: { /* Unassigned */ + if (m6800_unit.flags & UNIT_OPSTOP) { + reason = STOP_OPCODE; + PC--; + } + break; + } + } + } + /* Simulation halted - lets dump all the registers! */ + dump_regs(); + saved_PC = PC; + return reason; +} + +/* dump the working registers */ + +void dump_regs(void) +{ + printf("\r\nPC=%04X SP=%04X IX=%04X ", PC, SP, IX); + printf("A=%02X B=%02X CCR=%02X", A, B, CCR); +} + +void dump_regs1(void) +{ + printf("PC=%04X SP=%04X IX=%04X ", PC, SP, IX); + printf("A=%02X B=%02X CCR=%02X\n", A, B, CCR); +} + +/* fetch an instruction or byte */ +int32 fetch_byte(int32 flag) +{ + uint8 val; + + val = CPU_BD_get_mbyte(PC) & 0xFF; /* fetch byte */ + if (m6800_dev.dctrl & DEBUG_asm) { /* display source code */ + switch (flag) { + case 0: /* opcode fetch */ + printf("\n%04X %s", PC, opcode[val]); + break; + case 1: /* byte operand fetch */ + printf("0%02XH", val); + break; + } + } + PC = (PC + 1) & ADDRMASK; /* increment PC */ + return val; +} + +/* fetch a word */ +int32 fetch_word(void) +{ + uint16 val; + + val = CPU_BD_get_mbyte(PC) << 8; /* fetch high byte */ + val |= CPU_BD_get_mbyte(PC + 1) & 0xFF; /* fetch low byte */ + if (m6800_dev.dctrl & DEBUG_asm) + printf("0%04XH", val); + PC = (PC + 2) & ADDRMASK; /* increment PC */ + return val; +} + +/* push a byte to the stack */ +void push_byte(uint8 val) +{ + CPU_BD_put_mbyte(SP, val & 0xFF); + SP = (SP - 1) & ADDRMASK; +} + +/* push a word to the stack */ +void push_word(uint16 val) +{ + push_byte(val & 0xFF); + push_byte(val >> 8); +} + +/* pop a byte from the stack */ +uint8 pop_byte(void) +{ + register uint8 res; + + SP = (SP + 1) & ADDRMASK; + res = CPU_BD_get_mbyte(SP); + return res; +} + +/* pop a word from the stack */ +uint16 pop_word(void) +{ + register uint16 res; + + res = pop_byte() << 8; + res |= pop_byte(); + return res; +} + +/* this routine does the jump to relative offset if the condition is + met. Otherwise, execution continues at the current PC. */ + +void go_rel(int32 cond) +{ + int32 temp; + + temp = get_rel_addr(); + if (cond) + PC += temp; + PC &= ADDRMASK; +} + +/* returns the relative offset sign-extended */ + +int32 get_rel_addr(void) +{ + int32 temp; + + temp = fetch_byte(1); + if (temp & 0x80) + temp |= 0xFF00; + return temp & ADDRMASK; +} + +/* returns the value at the direct address pointed to by PC */ + +int32 get_dir_val(void) +{ + return CPU_BD_get_mbyte(get_dir_addr()); +} + +/* returns the direct address pointed to by PC */ + +int32 get_dir_addr(void) +{ + int32 temp; + + temp = fetch_byte(1); + return temp & 0xFF; +} + +/* returns the value at the indirect address pointed to by PC */ + +int32 get_indir_val(void) +{ + return CPU_BD_get_mbyte(get_indir_addr()); +} + +/* returns the indirect address pointed to by PC or immediate byte */ + +int32 get_indir_addr(void) +{ + int32 temp; + + temp = (fetch_byte(1) + IX) & ADDRMASK; + return temp; +} + +/* returns the value at the extended address pointed to by PC */ + +int32 get_ext_val(void) +{ + return CPU_BD_get_mbyte(get_ext_addr()); +} + +/* returns the extended address pointed to by PC or immediate word */ + +int32 get_ext_addr(void) +{ + int32 temp; + + temp = fetch_word(); + return temp; +} + +/* return 1 for flag set or 0 for flag clear */ + +int32 get_flag(int32 flg) +{ + if (CCR & flg) + return 1; + else + return 0; +} + +/* test and set V for addition */ + +void condevalVa(int32 op1, int32 op2) +{ + if (get_flag(CF)) + COND_SET_FLAG_V(((op1 & 0x80) && (op2 & 0x80)) || ( + ((op1 & 0x80) == 0) && ((op2 & 0x80) == 0))); +} + +/* test and set V for subtraction */ + +void condevalVs(int32 op1, int32 op2) +{ + if (get_flag(CF)) + COND_SET_FLAG_V(((op1 & 0x80) && ((op2 & 0x80) == 0)) || + (((op1 & 0x80) == 0) && (op2 & 0x80))); +} + +/* calls from the simulator */ + +/* Reset routine */ + +t_stat m6800_reset (DEVICE *dptr) +{ + CCR = CCR_ALWAYS_ON | IF; + int_req = 0; + sim_brk_types = sim_brk_dflt = SWMASK ('E'); + saved_PC = CPU_BD_get_mword(0xFFFE); +// if (saved_PC == 0xFFFF) +// printf("No EPROM image found - M6800 reset incomplete!\n"); +// else +// printf("EPROM vector=%04X\n", saved_PC); + return SCPE_OK; +} + + +/* This is the dumper/loader. This command uses the -h to signify a + hex dump/load vice a binary one. If no address is given to load, it + takes the address from the hex record or the current PC for binary. +*/ + +int32 sim_load (FILE *fileref, char *cptr, char *fnam, int flag) +{ + int32 i, addr = 0, cnt = 0; + + if ((*cptr != 0) || (flag != 0)) return SCPE_ARG; + addr = saved_PC; + while ((i = getc (fileref)) != EOF) { + CPU_BD_put_mbyte(addr, i); + addr++; + cnt++; + } // end while + printf ("%d Bytes loaded.\n", cnt); + return (SCPE_OK); +} + +/* Symbolic output + + Inputs: + *of = output stream + addr = current PC + *val = pointer to values + *uptr = pointer to unit + sw = switches + Outputs: + status = error code + for M6800 +*/ + +int32 fprint_sym (FILE *of, int32 addr, uint32 *val, UNIT *uptr, int32 sw) +{ + int32 i, inst, inst1; + + if (sw & SWMASK ('D')) { // dump memory + for (i=0; i<16; i++) + fprintf(of, "%02X ", val[i]); + fprintf(of, " "); + for (i=0; i<16; i++) + if (isprint(val[i])) + fprintf(of, "%c", val[i]); + else + fprintf(of, "."); + return -15; + } else if (sw & SWMASK ('M')) { // dump instruction mnemonic + inst = val[0]; + if (!oplen[inst]) { // invalid opcode + fprintf(of, "%02X", inst); + return 0; + } + inst1 = inst & 0xF0; + fprintf (of, "%s", opcode[inst]); // mnemonic + if (strlen(opcode[inst]) == 3) + fprintf(of, " "); + if (inst1 == 0x20 || inst == 0x8D) { // rel operand + inst1 = val[1]; + if (val[1] & 0x80) + inst1 |= 0xFF00; + fprintf(of, " $%04X", (addr + inst1 + 2) & ADDRMASK); + } else if (inst1 == 0x80 || inst1 == 0xC0) { // imm operand + if ((inst & 0x0F) < 0x0C) + fprintf(of, " #$%02X", val[1]); + else + fprintf(of, " #$%02X%02X", val[1], val[2]); + } else if (inst1 == 0x60 || inst1 == 0xA0 || inst1 == 0xE0) // ind operand + fprintf(of, " %d,X", val[1]); + else if (inst1 == 0x70 || inst1 == 0xb0 || inst1 == 0xF0) // ext operand + fprintf(of, " $%02X%02X", val[1], val[2]); + return (-(oplen[inst] - 1)); + } else + return SCPE_ARG; +} + +/* Symbolic input + + Inputs: + *cptr = pointer to input string + addr = current PC + *uptr = pointer to unit + *val = pointer to output values + sw = switches + Outputs: + status = error status +*/ + +int32 parse_sym (char *cptr, int32 addr, UNIT *uptr, uint32 *val, int32 sw) +{ + return (-2); +} + +/* end of m6800.c */ diff --git a/swtp6800/common/m6810.c b/swtp6800/common/m6810.c new file mode 100644 index 00000000..3bb5660a --- /dev/null +++ b/swtp6800/common/m6810.c @@ -0,0 +1,146 @@ +/* m6810.c: Motorola m6810 RAM emulator + + Copyright (c) 2011, William A. Beech + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + WILLIAM A. BEECH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of William A. Beech shall not be + used in advertising or otherwise to promote the sale, use or other dealings + in this Software without prior written authorization from William A. Beech. + + These functions support a simulated m6810 RAM device on a CPU board. The + byte get and put routines use an offset into the RAM image to locate the + proper byte. This allows another device to set the base address for the + M6810. +*/ + +#include +#include "swtp_defs.h" + +/* function prototypes */ + +t_stat m6810_reset (DEVICE *dptr); +int32 m6810_get_mbyte(int32 offset); +void m6810_put_mbyte(int32 offset, int32 val); + +/* SIMH RAM Standard I/O Data Structures */ + +UNIT m6810_unit = { UDATA (NULL, UNIT_BINK, 128), + 0 }; + +MTAB m6810_mod[] = { + { 0 } +}; + +DEBTAB m6810_debug[] = { + { "ALL", DEBUG_all }, + { "FLOW", DEBUG_flow }, + { "READ", DEBUG_read }, + { "WRITE", DEBUG_write }, + { "LEV1", DEBUG_level1 }, + { "LEV2", DEBUG_level2 }, + { NULL } +}; + +DEVICE m6810_dev = { + "M6810", //name + &m6810_unit, //units + NULL, //registers + m6810_mod, //modifiers + 1, //numunits + 16, //aradix + 32, //awidth + 1, //aincr + 16, //dradix + 8, //dwidth + NULL, //examine + NULL, //deposit + &m6810_reset, //reset + NULL, //boot + NULL, //attach + NULL, //detach + NULL, //ctxt + DEV_DEBUG, //flags + 0, //dctrl + m6810_debug, //debflags + NULL, //msize + NULL //lname +}; + +/* global variables */ + +/* m6810_reset */ + +t_stat m6810_reset (DEVICE *dptr) +{ + if (m6810_dev.dctrl & DEBUG_flow) + printf("m6810_reset: \n"); + if (m6810_unit.filebuf == NULL) { + m6810_unit.filebuf = malloc(128); + if (m6810_unit.filebuf == NULL) { + printf("m6810_reset: Malloc error\n"); + return SCPE_MEM; + } + m6810_unit.capac = 128; + } + if (m6810_dev.dctrl & DEBUG_flow) + printf("m6810_reset: Done\n"); + return SCPE_OK; +} + +/* I/O instruction handlers, called from the CPU module when an + RAM memory read or write is issued. +*/ + +/* get a byte from memory - from offset from start of RAM*/ + +int32 m6810_get_mbyte(int32 offset) +{ + int32 val; + + if (m6810_dev.dctrl & DEBUG_read) + printf("m6810_get_mbyte: offset=%04X\n", offset); + if (((t_addr)offset) < m6810_unit.capac) { + val = *((uint8 *)(m6810_unit.filebuf) + offset) & 0xFF; + if (m6810_dev.dctrl & DEBUG_read) + printf("val=%04X\n", val); + return val; + } else { + if (m6810_dev.dctrl & DEBUG_read) + printf("m6810_get_mbyte: out of range\n"); + return 0xFF; + } +} + +/* put a byte to memory */ + +void m6810_put_mbyte(int32 offset, int32 val) +{ + if (m6810_dev.dctrl & DEBUG_write) + printf("m6810_put_mbyte: offset=%04X, val=%02X\n", offset, val); + if ((t_addr)offset < m6810_unit.capac) { + *((uint8 *)(m6810_unit.filebuf) + offset) = val & 0xFF; + return; + } else { + if (m6810_dev.dctrl & DEBUG_write) + printf("m6810_put_mbyte: out of range\n"); + return; + } +} + +/* end of m6810.c */ diff --git a/swtp6800/common/mp-8m.c b/swtp6800/common/mp-8m.c new file mode 100644 index 00000000..9126b05a --- /dev/null +++ b/swtp6800/common/mp-8m.c @@ -0,0 +1,209 @@ +/* mp-8m.c: SWTP 8K Byte Memory Card emulator + + Copyright (c) 2011, William A. Beech + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + WILLIAM A. BEECH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of William A. Beech shall not be + used in advertising or otherwise to promote the sale, use or other dealings + in this Software without prior written authorization from William A. Beech. + + These functions support 6 simulated MP-8M memory cards on an SS-50 system. + + Each unit uses a dynamically allocated 8192 byte buffer to hold the data. + Each unit contains the base address in mp_8m_unit.u3. The unit capacity is + held in mp_8m_unit.capac. Each unit can be enabled or disabled to reconfigure + the RAM for the system. +*/ + +#include +#include "swtp_defs.h" + +#define MP_8M_NUM 6 /* number of MP-*m boards */ + +/* prototypes */ + +t_stat mp_8m_reset (DEVICE *dptr); +int32 mp_8m_get_mbyte(int32 addr); +int32 mp_8m_get_mword(int32 addr); +void mp_8m_put_mbyte(int32 addr, int32 val); +void mp_8m_put_mword(int32 addr, int32 val); + +/* isbc064 Standard I/O Data Structures */ + +UNIT mp_8m_unit[] = { + { UDATA (NULL, UNIT_FIX+UNIT_BINK+UNIT_DISABLE, 0),0 }, + { UDATA (NULL, UNIT_FIX+UNIT_BINK+UNIT_DISABLE, 0),0 }, + { UDATA (NULL, UNIT_FIX+UNIT_BINK+UNIT_DISABLE, 0),0 }, + { UDATA (NULL, UNIT_FIX+UNIT_BINK+UNIT_DISABLE, 0),0 }, + { UDATA (NULL, UNIT_FIX+UNIT_BINK+UNIT_DISABLE, 0),0 }, + { UDATA (NULL, UNIT_FIX+UNIT_BINK+UNIT_DISABLE, 0),0 } +}; + +MTAB mp_8m_mod[] = { + { 0 } +}; + +DEBTAB mp_8m_debug[] = { + { "ALL", DEBUG_all }, + { "FLOW", DEBUG_flow }, + { "READ", DEBUG_read }, + { "WRITE", DEBUG_write }, + { "LEV1", DEBUG_level1 }, + { "LEV2", DEBUG_level2 }, + { NULL } +}; + +DEVICE mp_8m_dev = { + "MP-8M", //name + mp_8m_unit, //units + NULL, //registers + mp_8m_mod, //modifiers + MP_8M_NUM, //numunits + 16, //aradix + 8, //awidth + 1, //aincr + 16, //dradix + 8, //dwidth + NULL, //examine + NULL, //deposite + &mp_8m_reset, //reset + NULL, //boot + NULL, //attach + NULL, //detach + NULL, //ctxt + DEV_DEBUG, //flags + 0, //dctrl + mp_8m_debug, //debflags + NULL, //msize + NULL //lname +}; + +/* Reset routine */ + +t_stat mp_8m_reset (DEVICE *dptr) +{ + int32 i, j, val; + UNIT *uptr; + + if (mp_8m_dev.dctrl & DEBUG_flow) + printf("mp_8m_reset: \n"); + for (i = 0; i < MP_8M_NUM; i++) { /* init all units */ + uptr = mp_8m_dev.units + i; + if (mp_8m_dev.dctrl & DEBUG_flow) + printf("MP-8M %d unit.flags=%08X\n", i, uptr->flags); + uptr->capac = 0x2000; + if (i < 4) + uptr->u3 = 0x2000 * i; + else + uptr->u3 = 0x2000 * (i + 1); + if (uptr->filebuf == NULL) { + uptr->filebuf = malloc(0x2000); + if (uptr->filebuf == NULL) { + printf("mp_8m_reset: Malloc error\n"); + return SCPE_MEM; + } + for (j=0; j<8192; j++) { /* fill pattern for testing */ + val = (0xA0 | i); + *((uint8 *)(uptr->filebuf) + j) = val & 0xFF; + } + } + if (mp_8m_dev.dctrl & DEBUG_flow) + printf("MP-8M %d initialized at [%04X-%04XH]\n", i, uptr->u3, + uptr->u3 + uptr->capac - 1); + } + if (mp_8m_dev.dctrl & DEBUG_flow) + printf("mp_8m_reset: Done\n"); + return SCPE_OK; +} + +/* I/O instruction handlers, called from the mp-b2 module when an + external memory read or write is issued. +*/ + +/* get a byte from memory */ + +int32 mp_8m_get_mbyte(int32 addr) +{ + int32 val, org, len; + int32 i; + UNIT *uptr; + + if (mp_8m_dev.dctrl & DEBUG_read) + printf("mp_8m_get_mbyte: addr=%04X", addr); + for (i = 0; i < MP_8M_NUM; i++) { /* find addressed unit */ + uptr = mp_8m_dev.units + i; + org = uptr->u3; + len = uptr->capac - 1; + if ((addr >= org) && (addr <= org + len)) { + val = *((uint8 *)(uptr->filebuf) + (addr - org)); + if (mp_8m_dev.dctrl & DEBUG_read) + printf(" val=%04X\n", val); + return (val & 0xFF); + } + } + if (mp_8m_dev.dctrl & DEBUG_read) + printf("mp_8m_get_mbyte: Out of range\n"); + return 0xFF; /* multibus has active high pullups */ +} + +/* get a word from memory */ + +int32 mp_8m_get_mword(int32 addr) +{ + int32 val; + + val = (mp_8m_get_mbyte(addr) << 8); + val |= mp_8m_get_mbyte(addr+1); + return val; +} + +/* put a byte into memory */ + +void mp_8m_put_mbyte(int32 addr, int32 val) +{ + int32 org, len; + int32 i; + UNIT *uptr; + + if (mp_8m_dev.dctrl & DEBUG_write) + printf("mp_8m_put_mbyte: addr=%04X, val=%02X", addr, val); + for (i = 0; i < MP_8M_NUM; i++) { /* find addressed unit */ + uptr = mp_8m_dev.units + i; + org = uptr->u3; + len = uptr->capac - 1; + if ((addr >= org) && (addr < org + len)) { + *((uint8 *)(uptr->filebuf) + (addr - org)) = val & 0xFF; + if (mp_8m_dev.dctrl & DEBUG_write) + printf("\n"); + return; + } + } + if (mp_8m_dev.dctrl & DEBUG_write) + printf("mp_8m_put_mbyte: Out of range\n"); +} + +/* put a word into memory */ + +void mp_8m_put_mword(int32 addr, int32 val) +{ + mp_8m_put_mbyte(addr, val >> 8); + mp_8m_put_mbyte(addr+1, val); +} + +/* end of mp-8m.c */ diff --git a/swtp6800/common/mp-a.c b/swtp6800/common/mp-a.c new file mode 100644 index 00000000..6dd77509 --- /dev/null +++ b/swtp6800/common/mp-a.c @@ -0,0 +1,211 @@ +/* mp-a.c: SWTP MP-A M6800 CPU simulator + + Copyright (c) 2011, William Beech + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + WILLIAM A. BEECH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of William A. Beech shall not + be used in advertising or otherwise to promote the sale, use or other dealings + in this Software without prior written authorization from William A. Beech. + + The MP-A CPU Board contains the following devices [mp-a.c]: + M6800 processor [m6800.c]. + M6810 128 byte RAM at 0xA000 [m6810.c]. + M6830, SWTBUG, or custom boot ROM at 0xE000 [bootrom.c]. + Interface to the SS-50 bus and the MP-B2 Mother Board for I/O + and memory boards [mp-b2.c]. + Note: The file names of the emulator source programs for each device are + contained in "[]". +*/ + +#include +#include "swtp_defs.h" + +#define UNIT_V_SWT (UNIT_V_UF) /* on SWTBUG, off MIKBUG */ +#define UNIT_SWT (1 << UNIT_V_SWT) +#define UNIT_V_RAM (UNIT_V_UF+1) /* off disables 6810 RAM */ +#define UNIT_RAM (1 << UNIT_V_RAM) + +/* local global variables */ + +/* function prototypes */ + +int32 CPU_BD_get_mbyte(int32 addr); +int32 CPU_BD_get_mword(int32 addr); +void CPU_BD_put_mbyte(int32 addr, int32 val); +void CPU_BD_put_mword(int32 addr, int32 val); + +/* external routines */ + +/* MP-B2 bus routines */ +extern int32 MB_get_mbyte(int32 addr); +extern int32 MB_get_mword(int32 addr); +extern void MB_put_mbyte(int32 addr, int32 val); +extern void MB_put_mword(int32 addr, int32 val); + +/* M6810 bus routines */ +extern int32 m6810_get_mbyte(int32 addr); +extern void m6810_put_mbyte(int32 addr, int32 val); + +/* BOOTROM bus routines */ +extern UNIT BOOTROM_unit; +extern int32 BOOTROM_get_mbyte(int32 offset); + +/* MP-A data structures + + CPU_BD_dev MP-A2 device descriptor + CPU_BD_unit MP-A2 unit descriptor + CPU_BD_reg MP-A2 register list + CPU_BD_mod MP-A2 modifiers list */ + +UNIT CPU_BD_unit = { UDATA (NULL, 0, 0) }; + +REG CPU_BD_reg[] = { + { NULL } +}; + +MTAB CPU_BD_mod[] = { + { UNIT_SWT, UNIT_SWT, "SWT", "SWT", NULL }, + { UNIT_SWT, 0, "NOSWT", "NOSWT", NULL }, + { UNIT_RAM, UNIT_RAM, "RAM", "RAM", NULL }, + { UNIT_RAM, 0, "NORAM", "NORAM", NULL }, + { 0 } +}; + +DEBTAB CPU_BD_debug[] = { + { "ALL", DEBUG_all }, + { "FLOW", DEBUG_flow }, + { "READ", DEBUG_read }, + { "WRITE", DEBUG_write }, + { "LEV1", DEBUG_level1 }, + { "LEV2", DEBUG_level2 }, + { NULL } +}; + +DEVICE CPU_BD_dev = { + "MP-A", //name + &CPU_BD_unit, //units + CPU_BD_reg, //registers + CPU_BD_mod, //modifiers + 1, //numunits + 16, //aradix + 16, //awidth + 1, //aincr + 16, //dradix + 8, //dwidth + NULL, //examine + NULL, //deposit + NULL, //reset + NULL, //boot + NULL, //attach + NULL, //detach + NULL, //ctxt + DEV_DEBUG, //flags + 0, //dctrl + CPU_BD_debug, /* debflags */ + NULL, //msize + NULL //lname +}; + +/* get a byte from memory */ + +int32 CPU_BD_get_mbyte(int32 addr) +{ + int32 val; + + if (CPU_BD_dev.dctrl & DEBUG_read) + printf("CPU_BD_get_mbyte: addr=%04X\n", addr); + switch(addr & 0xF000) { + case 0xA000: + if (CPU_BD_unit.flags & UNIT_RAM) { + val = m6810_get_mbyte(addr - 0xA000) & 0xFF; + if (CPU_BD_dev.dctrl & DEBUG_read) + printf("CPU_BD_get_mbyte: m6810 val=%02X\n", val); + return val; + } else { + val = MB_get_mbyte(addr) & 0xFF; + if (CPU_BD_dev.dctrl & DEBUG_read) + printf("CPU_BD_get_mbyte: m6810 val=%02X\n", val); + return val; + } + case 0xE000: + val = BOOTROM_get_mbyte(addr - 0xE000) & 0xFF; + if (CPU_BD_dev.dctrl & DEBUG_read) + printf("CPU_BD_get_mbyte: EPROM=%02X\n", val); + return val; + case 0xF000: + val = BOOTROM_get_mbyte(addr - (0x10000 - BOOTROM_unit.capac)) & 0xFF; + if (CPU_BD_dev.dctrl & DEBUG_read) + printf("CPU_BD_get_mbyte: EPROM=%02X\n", val); + return val; + default: + val = MB_get_mbyte(addr) & 0xFF; + if (CPU_BD_dev.dctrl & DEBUG_read) + printf("CPU_BD_get_mbyte: mp_b2 val=%02X\n", val); + return val; + } +} + +/* get a word from memory */ + +int32 CPU_BD_get_mword(int32 addr) +{ + int32 val; + + if (CPU_BD_dev.dctrl & DEBUG_read) + printf("CPU_BD_get_mword: addr=%04X\n", addr); + val = (CPU_BD_get_mbyte(addr) << 8); + val |= CPU_BD_get_mbyte(addr+1); + val &= 0xFFFF; + if (CPU_BD_dev.dctrl & DEBUG_read) + printf("CPU_BD_get_mword: val=%04X\n", val); + return val; +} + +/* put a byte to memory */ + +void CPU_BD_put_mbyte(int32 addr, int32 val) +{ + if (CPU_BD_dev.dctrl & DEBUG_write) + printf("CPU_BD_put_mbyte: addr=%04X, val=%02X\n", addr, val); + switch(addr & 0xF000) { + case 0xA000: + if (CPU_BD_unit.flags & UNIT_RAM) { + m6810_put_mbyte(addr - 0xA000, val); + return; + } else { + MB_put_mbyte(addr, val); + return; + } + default: + MB_put_mbyte(addr, val); + return; + } +} + +/* put a word to memory */ + +void CPU_BD_put_mword(int32 addr, int32 val) +{ + if (CPU_BD_dev.dctrl & DEBUG_write) + printf("CPU_BD_put_mword: addr=%04X, val=%04X\n", addr, val); + CPU_BD_put_mbyte(addr, val >> 8); + CPU_BD_put_mbyte(addr+1, val); +} + +/* end of mp-a.c */ diff --git a/swtp6800/common/mp-a2.c b/swtp6800/common/mp-a2.c new file mode 100644 index 00000000..21805dcb --- /dev/null +++ b/swtp6800/common/mp-a2.c @@ -0,0 +1,263 @@ +/* mp-a2.c: SWTP MP-A2 M6800 CPU simulator + + Copyright (c) 2011, William Beech + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + WILLIAM A. BEECH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of William A. Beech shall not + be used in advertising or otherwise to promote the sale, use or other dealings + in this Software without prior written authorization from William A. Beech. + + The MP-A2 CPU Board contains the following devices [mp-a2.c]: + M6800 processor [m6800.c]. + M6810 128 byte RAM at 0xA000 [m6810.c]. + M6830, SWTBUG, or custom boot ROM at 0xE000 [bootrom.c]. + 4 ea 2716 EPROMs at either 0xC000, 0xC800, 0xD000 and 0xD800 (LO_PROM)or + 0xE000, 0xE800, 0xF000 and 0xF800 (HI_PROM) [eprom.c]. + Interface to the SS-50 bus and the MP-B2 Mother Board for I/O + and memory boards [mp-b2.c]. + Note: The file names of the emulator source programs for each device are + contained in "[]". +*/ + +#include +#include "swtp_defs.h" + +#define UNIT_V_USER_D (UNIT_V_UF) /* user defined switch */ +#define UNIT_USER_D (1 << UNIT_V_USER_D) +#define UNIT_V_4K_8K (UNIT_V_UF+1) /* off if HI_PROM and only 2K EPROM */ +#define UNIT_4K_8K (1 << UNIT_V_4K_8K) +#define UNIT_V_SWT (UNIT_V_UF+2) /* on SWTBUG, off MIKBUG */ +#define UNIT_SWT (1 << UNIT_V_SWT) +#define UNIT_V_8K (UNIT_V_UF+3) /* off if HI_PROM and only 2K or 4k EPROM */ +#define UNIT_8K (1 << UNIT_V_8K) +#define UNIT_V_RAM (UNIT_V_UF+4) /* off disables 6810 RAM */ +#define UNIT_RAM (1 << UNIT_V_RAM) +#define UNIT_V_LO_PROM (UNIT_V_UF+5) /* on EPROMS @ C000-CFFFH, off no EPROMS */ +#define UNIT_LO_PROM (1 << UNIT_V_LO_PROM) +#define UNIT_V_HI_PROM (UNIT_V_UF+6) /* on EPROMS @ F000-FFFFH, off fo LO_PROM, MON, or no EPROMS */ +#define UNIT_HI_PROM (1 << UNIT_V_HI_PROM) +#define UNIT_V_MON (UNIT_V_UF+7) /* on for monitor vectors in high memory */ +#define UNIT_MON (1 << UNIT_V_MON) + +/* local global variables */ + +/* function prototypes */ + +int32 get_base(void); +int32 CPU_BD_get_mbyte(int32 addr); +int32 CPU_BD_get_mword(int32 addr); +void CPU_BD_put_mbyte(int32 addr, int32 val); +void CPU_BD_put_mword(int32 addr, int32 val); + +/* external routines */ + +/* MP-B2 bus routines */ +extern int32 MB_get_mbyte(int32 addr); +extern int32 MB_get_mword(int32 addr); +extern void MB_put_mbyte(int32 addr, int32 val); +extern void MB_put_mword(int32 addr, int32 val); + +/* M6810 bus routines */ +extern int32 m6810_get_mbyte(int32 addr); +extern void m6810_put_mbyte(int32 addr, int32 val); + +/* BOOTROM bus routines */ +extern UNIT BOOTROM_unit; +extern int32 BOOTROM_get_mbyte(int32 offset); + +/* I2716 bus routines */ +extern int32 i2716_get_mbyte(int32 offset); + +/* MP-A2 data structures + + CPU_BD_dev MP-A2 device descriptor + CPU_BD_unit MP-A2 unit descriptor + CPU_BD_reg MP-A2 register list + CPU_BD_mod MP-A2 modifiers list */ + +UNIT CPU_BD_unit = { UDATA (NULL, 0, 0) }; + +REG CPU_BD_reg[] = { + { NULL } +}; + +MTAB CPU_BD_mod[] = { + { UNIT_USER_D, UNIT_USER_D, "USER_D", "USER_D", NULL }, + { UNIT_USER_D, 0, "NOUSER_D", "NOUSER_D", NULL }, + { UNIT_4K_8K, UNIT_4K_8K, "4K_8K", "4K_8K", NULL }, + { UNIT_4K_8K, 0, "NO4K_8K", "NO4K_8K", NULL }, + { UNIT_SWT, UNIT_SWT, "SWT", "SWT", NULL }, + { UNIT_SWT, 0, "NOSWT", "NOSWT", NULL }, + { UNIT_8K, UNIT_8K, "8K", "8K", NULL }, + { UNIT_8K, 0, "NO8K", "NO8K", NULL }, + { UNIT_RAM, UNIT_RAM, "RAM", "RAM", NULL }, + { UNIT_RAM, 0, "NORAM", "NORAM", NULL }, + { UNIT_LO_PROM, UNIT_LO_PROM, "LO_PROM", "LO_PROM", NULL }, + { UNIT_LO_PROM, 0, "NOLO_PROM", "NOLO_PROM", NULL }, + { UNIT_HI_PROM, UNIT_HI_PROM, "HI_PROM", "HI_PROM", NULL }, + { UNIT_HI_PROM, 0, "NOHI_PROM", "NOHI_PROM", NULL }, + { UNIT_MON, UNIT_MON, "MON", "MON", NULL }, + { UNIT_MON, 0, "NOMON", "NOMON", NULL }, + { 0 } +}; + +DEBTAB CPU_BD_debug[] = { + { "ALL", DEBUG_all }, + { "FLOW", DEBUG_flow }, + { "READ", DEBUG_read }, + { "WRITE", DEBUG_write }, + { "LEV1", DEBUG_level1 }, + { "LEV2", DEBUG_level2 }, + { NULL } +}; + +DEVICE CPU_BD_dev = { + "MP-A2", //name + &CPU_BD_unit, //units + CPU_BD_reg, //registers + CPU_BD_mod, //modifiers + 1, //numunits + 16, //aradix + 16, //awidth + 1, //aincr + 16, //dradix + 8, //dwidth + NULL, //examine + NULL, //deposit + NULL, //reset + NULL, //boot + NULL, //attach + NULL, //detach + NULL, //ctxt + DEV_DEBUG, //flags + 0, //dctrl + CPU_BD_debug, /* debflags */ + NULL, //msize + NULL //lname +}; + +/* get base address of 2716's */ + +int32 get_base(void) +{ + if (CPU_BD_unit.flags & UNIT_LO_PROM) + return 0xC000; + else if (CPU_BD_unit.flags & UNIT_HI_PROM) + return 0xF000; + return 0; +} + +/* get a byte from memory */ + +int32 CPU_BD_get_mbyte(int32 addr) +{ + int32 val; + + if (CPU_BD_dev.dctrl & DEBUG_read) + printf("CPU_BD_get_mbyte: addr=%04X\n", addr); + switch(addr & 0xF000) { + case 0xA000: + if (CPU_BD_unit.flags & UNIT_RAM) { + val = m6810_get_mbyte(addr - 0xA000) & 0xFF; + if (CPU_BD_dev.dctrl & DEBUG_read) + printf("CPU_BD_get_mbyte: m6810 val=%02X\n", val); + return val; + } else { + val = MB_get_mbyte(addr) & 0xFF; + if (CPU_BD_dev.dctrl & DEBUG_read) + printf("CPU_BD_get_mbyte: m6810 val=%02X\n", val); + return val; + } + case 0xC000: + if (CPU_BD_unit.flags & UNIT_LO_PROM) { + val = i2716_get_mbyte(addr - 0xC000) & 0xFF; + if (CPU_BD_dev.dctrl & DEBUG_read) + printf("CPU_BD_get_mbyte: 2716=%02X\n", val); + return val; + } else + return 0xFF; + break; + case 0xE000: + val = BOOTROM_get_mbyte(addr - 0xE000) & 0xFF; + if (CPU_BD_dev.dctrl & DEBUG_read) + printf("CPU_BD_get_mbyte: EPROM=%02X\n", val); + return val; + case 0xF000: + if (CPU_BD_unit.flags & UNIT_MON) { + val = BOOTROM_get_mbyte(addr - (0x10000 - BOOTROM_unit.capac)) & 0xFF; + if (CPU_BD_dev.dctrl & DEBUG_read) + printf("CPU_BD_get_mbyte: EPROM=%02X\n", val); + return val; + } + default: + val = MB_get_mbyte(addr) & 0xFF; + if (CPU_BD_dev.dctrl & DEBUG_read) + printf("CPU_BD_get_mbyte: mp_b2 val=%02X\n", val); + return val; + } +} + +/* get a word from memory */ + +int32 CPU_BD_get_mword(int32 addr) +{ + int32 val; + + if (CPU_BD_dev.dctrl & DEBUG_read) + printf("CPU_BD_get_mword: addr=%04X\n", addr); + val = (CPU_BD_get_mbyte(addr) << 8); + val |= CPU_BD_get_mbyte(addr+1); + val &= 0xFFFF; + if (CPU_BD_dev.dctrl & DEBUG_read) + printf("CPU_BD_get_mword: val=%04X\n", val); + return val; +} + +/* put a byte to memory */ + +void CPU_BD_put_mbyte(int32 addr, int32 val) +{ + if (CPU_BD_dev.dctrl & DEBUG_write) + printf("CPU_BD_put_mbyte: addr=%04X, val=%02X\n", addr, val); + switch(addr & 0xF000) { + case 0xA000: + if (CPU_BD_unit.flags & UNIT_RAM) { + m6810_put_mbyte(addr - 0xA000, val); + return; + } else { + MB_put_mbyte(addr, val); + return; + } + default: + MB_put_mbyte(addr, val); + return; + } +} + +/* put a word to memory */ + +void CPU_BD_put_mword(int32 addr, int32 val) +{ + if (CPU_BD_dev.dctrl & DEBUG_write) + printf("CPU_BD_put_mword: addr=%04X, val=%04X\n", addr, val); + CPU_BD_put_mbyte(addr, val >> 8); + CPU_BD_put_mbyte(addr+1, val); +} + +/* end of mp-a2.c */ diff --git a/swtp6800/common/mp-b2.c b/swtp6800/common/mp-b2.c new file mode 100644 index 00000000..7b93d7d5 --- /dev/null +++ b/swtp6800/common/mp-b2.c @@ -0,0 +1,322 @@ +/* mp-b2.c: SWTP SS-50/SS-30 MP-B2 Mother Board + + Copyright (c) 2011, William A. Beech + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + WILLIAM A. BEECH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of William A. Beech shall not be + used in advertising or otherwise to promote the sale, use or other dealings + in this Software without prior written authorization from William A. Beech. +*/ + +#include +#include "swtp_defs.h" + +#define UNIT_V_RAM_0000 (UNIT_V_UF) /* MP-8M board 0 enable */ +#define UNIT_RAM_0000 (1 << UNIT_V_RAM_0000) +#define UNIT_V_RAM_2000 (UNIT_V_UF+1) /* MP-8M board 1 enable */ +#define UNIT_RAM_2000 (1 << UNIT_V_RAM_2000) +#define UNIT_V_RAM_4000 (UNIT_V_UF+2) /* MP-8M board 2 enable */ +#define UNIT_RAM_4000 (1 << UNIT_V_RAM_4000) +#define UNIT_V_RAM_6000 (UNIT_V_UF+3) /* MP-8M board 3 enable */ +#define UNIT_RAM_6000 (1 << UNIT_V_RAM_6000) +#define UNIT_V_RAM_A000 (UNIT_V_UF+4) /* MP-8M board 4 enable */ +#define UNIT_RAM_A000 (1 << UNIT_V_RAM_A000) +#define UNIT_V_RAM_C000 (UNIT_V_UF+5) /* MP-8M board 5 enable */ +#define UNIT_RAM_C000 (1 << UNIT_V_RAM_C000) + +/* function prototypes */ + +/* empty I/O device routine */ +int32 nulldev(int32 io, int32 data); + +/* SS-50 bus routines */ +int32 MB_get_mbyte(int32 addr); +int32 MB_get_mword(int32 addr); +void MB_put_mbyte(int32 addr, int32 val); +void MB_put_mword(int32 addr, int32 val); + +/* MP-8M bus routines */ +extern int32 mp_8m_get_mbyte(int32 addr); +extern void mp_8m_put_mbyte(int32 addr, int32 val); + +/* SS-50 I/O address space functions */ + +/* MP-S serial I/O routines */ +extern int32 sio0s(int32 io, int32 data); +extern int32 sio0d(int32 io, int32 data); +extern int32 sio1s(int32 io, int32 data); +extern int32 sio1d(int32 io, int32 data); + +/* DC-4 FDC I/O routines */ +extern int32 fdcdrv(int32 io, int32 data); +extern int32 fdccmd(int32 io, int32 data); +extern int32 fdctrk(int32 io, int32 data); +extern int32 fdcsec(int32 io, int32 data); +extern int32 fdcdata(int32 io, int32 data); + +/* This is the I/O configuration table. There are 32 possible +device addresses, if a device is plugged into a port it's routine +address is here, 'nulldev' means no device is available +*/ + +struct idev { + int32 (*routine)(); +}; + +struct idev dev_table[32] = { + {&nulldev}, {&nulldev}, {&nulldev}, {&nulldev}, /*Port 0 8000-8003 */ + {&sio0s}, {&sio0d}, {&sio1s}, {&sio1d}, /*Port 1 8004-8007 */ +/* sio1x routines just return the last value read on the matching + sio0x routine. SWTBUG tests for the MP-C with most port reads! */ + {&nulldev}, {&nulldev}, {&nulldev}, {&nulldev}, /*Port 2 8008-800B*/ + {&nulldev}, {&nulldev}, {&nulldev}, {&nulldev}, /*Port 3 800C-800F*/ + {&nulldev}, {&nulldev}, {&nulldev}, {&nulldev}, /*Port 4 8010-8013*/ + {&fdcdrv}, {&nulldev}, {&nulldev}, {&nulldev}, /*Port 5 8014-8017*/ + {&fdccmd}, {&fdctrk}, {&fdcsec}, {&fdcdata}, /*Port 6 8018-801B*/ + {&nulldev}, {&nulldev}, {&nulldev}, {&nulldev} /*Port 7 801C-801F*/ +}; + +/* dummy i/o device */ + +int32 nulldev(int32 io, int32 data) +{ + if (io == 0) + return (0xFF); + return 0; +} + +/* Mother Board data structures + + MB_dev Mother Board device descriptor + MB_unit Mother Board unit descriptor + MB_reg Mother Board register list + MB_mod Mother Board modifiers list +*/ + +UNIT MB_unit = { + UDATA (NULL, 0, 0) +}; + +REG MB_reg[] = { + { NULL } +}; + +MTAB MB_mod[] = { + { UNIT_RAM_0000, UNIT_RAM_0000, "BD0 On", "BD0", NULL }, + { UNIT_RAM_0000, 0, "BD0 Off", "NOBD0", NULL }, + { UNIT_RAM_2000, UNIT_RAM_2000, "BD1 On", "BD1", NULL }, + { UNIT_RAM_2000, 0, "BD1 Off", "NOBD1", NULL }, + { UNIT_RAM_4000, UNIT_RAM_4000, "BD2 On", "BD2", NULL }, + { UNIT_RAM_4000, 0, "BD2 Off", "NOBD2", NULL }, + { UNIT_RAM_6000, UNIT_RAM_6000, "BD3 On", "BD3", NULL }, + { UNIT_RAM_6000, 0, "BD3 Off", "NOBD3", NULL }, + { UNIT_RAM_A000, UNIT_RAM_A000, "BD4 On", "BD4", NULL }, + { UNIT_RAM_A000, 0, "BD4 Off", "NOBD4", NULL }, + { UNIT_RAM_C000, UNIT_RAM_C000, "BD5 On", "BD5", NULL }, + { UNIT_RAM_C000, 0, "BD5 Off", "NOBD5", NULL }, + { 0 } +}; + +DEBTAB MB_debug[] = { + { "ALL", DEBUG_all }, + { "FLOW", DEBUG_flow }, + { "READ", DEBUG_read }, + { "WRITE", DEBUG_write }, + { "LEV1", DEBUG_level1 }, + { "LEV2", DEBUG_level2 }, + { NULL } +}; + +DEVICE MB_dev = { + "MP-B2", //name + &MB_unit, //units + MB_reg, //registers + MB_mod, //modifiers + 1, //numunits + 16, //aradix + 16, //awidth + 1, //aincr + 16, //dradix + 8, //dwidth + NULL, //examine + NULL, //deposit + NULL, //reset + NULL, //boot + NULL, //attach + NULL, //detach + NULL, //ctxt + DEV_DEBUG, //flags + 0, //dctrl + MB_debug, /* debflags */ + NULL, //msize + NULL //lname +}; + +/* get a byte from memory */ + +int32 MB_get_mbyte(int32 addr) +{ + int32 val; + + if (MB_dev.dctrl & DEBUG_read) + printf("MB_get_mbyte: addr=%04X\n", addr); + switch(addr & 0xF000) { + case 0x0000: + case 0x1000: + if (MB_unit.flags & UNIT_RAM_0000) { + val = mp_8m_get_mbyte(addr) & 0xFF; + if (MB_dev.dctrl & DEBUG_read) + printf("MB_get_mbyte: mp_8m val=%02X\n", val); + return val; + } else + return 0xFF; + case 0x2000: + case 0x3000: + if (MB_unit.flags & UNIT_RAM_2000) { + val = mp_8m_get_mbyte(addr) & 0xFF; + if (MB_dev.dctrl & DEBUG_read) + printf("MB_get_mbyte: mp_8m val=%02X\n", val); + return val; + } else + return 0xFF; + case 0x4000: + case 0x5000: + if (MB_unit.flags & UNIT_RAM_4000) { + val = mp_8m_get_mbyte(addr) & 0xFF; + if (MB_dev.dctrl & DEBUG_read) + printf("MB_get_mbyte: mp_8m val=%02X\n", val); + return val; + } else + return 0xFF; + case 0x6000: + case 0x7000: + if (MB_unit.flags & UNIT_RAM_6000) { + val = mp_8m_get_mbyte(addr) & 0xFF; + if (MB_dev.dctrl & DEBUG_read) + printf("MB_get_mbyte: mp_8m val=%02X\n", val); + return val; + } else + return 0xFF; + case 0x8000: + val = (dev_table[addr - 0x8000].routine(0, 0)) & 0xFF; + if (MB_dev.dctrl & DEBUG_read) + printf("MB_get_mbyte: I/O addr=%04X val=%02X\n", addr, val); + return val; + case 0xA000: + case 0xB000: + if (MB_unit.flags & UNIT_RAM_A000) { + val = mp_8m_get_mbyte(addr) & 0xFF; + if (MB_dev.dctrl & DEBUG_read) + printf("MB_get_mbyte: mp_8m val=%02X\n", val); + return val; + } else + return 0xFF; + case 0xC000: + case 0xD000: + if (MB_unit.flags & UNIT_RAM_C000) { + val = mp_8m_get_mbyte(addr) & 0xFF; + if (MB_dev.dctrl & DEBUG_read) + printf("MB_get_mbyte: mp_8m val=%02X\n", val); + return val; + } else + return 0xFF; + default: + return 0xFF; + } +} + +/* get a word from memory */ + +int32 MB_get_mword(int32 addr) +{ + int32 val; + + + if (MB_dev.dctrl & DEBUG_read) + printf("MB_get_mword: addr=%04X\n", addr); + val = (MB_get_mbyte(addr) << 8); + val |= MB_get_mbyte(addr+1); + val &= 0xFFFF; + if (MB_dev.dctrl & DEBUG_read) + printf("MB_get_mword: val=%04X\n", val); + return val; +} + +/* put a byte to memory */ + +void MB_put_mbyte(int32 addr, int32 val) +{ + if (MB_dev.dctrl & DEBUG_write) + printf("MB_put_mbyte: addr=%04X, val=%02X\n", addr, val); + switch(addr & 0xF000) { + case 0x0000: + case 0x1000: + if (MB_unit.flags & UNIT_RAM_0000) { + mp_8m_put_mbyte(addr, val); + return; + } + case 0x2000: + case 0x3000: + if (MB_unit.flags & UNIT_RAM_2000) { + mp_8m_put_mbyte(addr, val); + return; + } + case 0x4000: + case 0x5000: + if (MB_unit.flags & UNIT_RAM_4000) { + mp_8m_put_mbyte(addr, val); + return; + } + case 0x6000: + case 0x7000: + if (MB_unit.flags & UNIT_RAM_6000) { + mp_8m_put_mbyte(addr, val); + return; + } + case 0x8000: + dev_table[addr - 0x8000].routine(1, val); + return; + case 0xA000: + case 0xB000: + if (MB_unit.flags & UNIT_RAM_A000) { + mp_8m_put_mbyte(addr, val); + return; + } + case 0xC000: + case 0xD000: + if (MB_unit.flags & UNIT_RAM_C000) { + mp_8m_put_mbyte(addr, val); + return; + } + default: + return; + } +} + +/* put a word to memory */ + +void MB_put_mword(int32 addr, int32 val) +{ + if (MB_dev.dctrl & DEBUG_write) + printf("MB_ptt_mword: addr=%04X, val=%04X\n", addr, val); + MB_put_mbyte(addr, val >> 8); + MB_put_mbyte(addr+1, val); +} + +/* end of mp-b2.c */ diff --git a/swtp6800/common/mp-s.c b/swtp6800/common/mp-s.c new file mode 100644 index 00000000..6c9c12a3 --- /dev/null +++ b/swtp6800/common/mp-s.c @@ -0,0 +1,330 @@ +/* mp-s.c: SWTP MP-S serial I/O card emulator + + Copyright (c) 2005-2011, William Beech + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + Willaim Beech BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of William A. Beech shall not + be used in advertising or otherwise to promote the sale, use or other dealings + in this Software without prior written authorization from William A. Beech. + + These functions support a simulated SWTP MP-S interface card. + The card contains one M6850 ACIA. The ACIA implements one complete + serial port. It provides 7 or 8-bit ASCII RS-232 interface to Terminals + or 20 mA current loop interface to a model 33 or 37 Teletype. It is not + compatible with baudot Teletypes. Baud rates from 110 to 1200 are + switch selectable from S! on the MP-S. The ACIA ports appear at all + 4 addresses. This fact is used by SWTBUG to determine the presence of the + MP-S vice MP-C serial card. The ACIA interrupt request line can be connected + to the IRQ or NMI interrupt lines by a jumper on the MP-S. + + All I/O is via either programmed I/O or interrupt controlled I/O. + It has a status port and a data port. A write to the status port + can select some options for the device (0x03 will reset the port). + A read of the status port gets the port status: + + +---+---+---+---+---+---+---+---+ + | I | P | O | F |CTS|DCD|TXE|RXF| + +---+---+---+---+---+---+---+---+ + + RXF - A 1 in this bit position means a character has been received + on the data port and is ready to be read. + TXE - A 1 in this bit means the port is ready to receive a character + on the data port and transmit it out over the serial line. + + A read to the data port gets the buffered character, a write + to the data port writes the character to the device. +*/ + +#include +#include +#include "swtp_defs.h" + +#define UNIT_V_TTY (UNIT_V_UF) // TTY or ANSI mode +#define UNIT_TTY (1 << UNIT_V_TTY) + +/* local global variables */ + +int32 ptr_stopioe = 0; // stop on error +int32 ptp_stopioe = 0; // stop on error +int32 odata; +int32 status; + +int32 ptp_flag = 0; +int32 ptr_flag = 0; + +/* function prototypes */ + +t_stat sio_svc (UNIT *uptr); +t_stat ptr_svc (UNIT *uptr); +t_stat ptp_svc (UNIT *uptr); +t_stat sio_reset (DEVICE *dptr); +t_stat ptr_reset (DEVICE *dptr); +t_stat ptp_reset (DEVICE *dptr); +int32 sio0s(int32 io, int32 data); +int32 sio0d(int32 io, int32 data); +int32 sio1s(int32 io, int32 data); +int32 sio1d(int32 io, int32 data); + +/* sio data structures + + sio_dev SIO device descriptor + sio_unit SIO unit descriptor + sio_reg SIO register list + sio_mod SIO modifiers list */ + +UNIT sio_unit = { UDATA (&sio_svc, 0, 0), KBD_POLL_WAIT +}; + +REG sio_reg[] = { + { ORDATA (DATA, sio_unit.buf, 8) }, + { ORDATA (STAT, sio_unit.u3, 8) }, + { NULL } +}; + +MTAB sio_mod[] = { + { UNIT_TTY, UNIT_TTY, "TTY", "TTY", NULL }, + { UNIT_TTY, 0, "ANSI", "ANSI", NULL }, + { 0 } +}; + +DEVICE sio_dev = { + "MP-S", &sio_unit, sio_reg, sio_mod, + 1, 10, 31, 1, 8, 8, + NULL, NULL, &sio_reset, + NULL, NULL, NULL +}; + +/* paper tape reader data structures + + ptr_dev PTR device descriptor + ptr_unit PTR unit descriptor + ptr_reg PTR register list + ptr_mod PTR modifiers list */ + +UNIT ptr_unit = { UDATA (&ptr_svc, UNIT_SEQ + UNIT_ATTABLE, 0), KBD_POLL_WAIT +}; + +DEVICE ptr_dev = { + "PTR", &ptr_unit, NULL, NULL, + 1, 10, 31, 1, 8, 8, + NULL, NULL, &ptr_reset, + NULL, NULL, NULL +}; + +/* paper tape punch data structures + + ptp_dev PTP device descriptor + ptp_unit PTP unit descriptor + ptp_reg PTP register list + ptp_mod PTP modifiers list */ + +UNIT ptp_unit = { UDATA (&ptp_svc, UNIT_SEQ + UNIT_ATTABLE, 0), KBD_POLL_WAIT +}; +DEVICE ptp_dev = { + "PTP", &ptp_unit, NULL, NULL, + 1, 10, 31, 1, 8, 8, + NULL, NULL, &ptp_reset, + NULL, NULL, NULL +}; + +/* console input service routine */ + +int32 sio_svc (UNIT *uptr) +{ + int32 temp; + + sim_activate (&sio_unit, sio_unit.wait); // continue poll + if ((temp = sim_poll_kbd ()) < SCPE_KFLAG) + return temp; // no char or error? + sio_unit.buf = temp & 0xFF; // Save char + sio_unit.u3 |= 0x01; // Set RXF flag + /* Do any special character handling here */ + sio_unit.pos++; // step character count + return SCPE_OK; +} + +/* paper tape reader input service routine */ + +int32 ptr_svc (UNIT *uptr) +{ + int32 temp; + + sim_activate (&ptr_unit, ptr_unit.wait); // continue poll + if ((temp = sim_poll_kbd ()) < SCPE_KFLAG) + return temp; // no char or error? + ptr_unit.buf = temp & 0xFF; // Save char + ptr_unit.u3 |= 0x01; // Set RXF flag + /* Do any special character handling here */ + ptr_unit.pos++; // step character count + return SCPE_OK; +} + +/* paper tape punch output service routine */ + +int32 ptp_svc (UNIT *uptr) +{ + return SCPE_OK; +} + +/* Reset console */ + +int32 sio_reset (DEVICE *dptr) +{ + sio_unit.buf = 0; // Data buffer + sio_unit.u3 = 0x02; // Status buffer + sim_activate (&sio_unit, sio_unit.wait); // activate unit + return SCPE_OK; +} + +/* Reset paper tape reader */ + +int32 ptr_reset (DEVICE *dptr) +{ + ptr_unit.buf = 0; + ptr_unit.u3 = 0x02; + sim_activate (&ptr_unit, ptr_unit.wait); // activate unit +// sim_cancel (&ptr_unit); // deactivate unit + return SCPE_OK; +} + +/* Reset paper tape punch */ + +int32 ptp_reset (DEVICE *dptr) +{ + ptp_unit.buf = 0; + ptp_unit.u3 = 0x02; + sim_activate (&ptp_unit, ptp_unit.wait); // activate unit +// sim_cancel (&ptp_unit); // deactivate unit + return SCPE_OK; +} + +/* I/O instruction handlers, called from the MP-B2 module when a + read or write occur to addresses 0x8004-0x8007. */ + +int32 sio0s(int32 io, int32 data) +{ + if (io == 0) { // control register read + if (ptr_flag) { // reader enabled? + if ((ptr_unit.flags & UNIT_ATT) == 0) { // attached? + ptr_unit.u3 &= 0xFE; // no, clear RXF flag + ptr_flag = 0; // clear reader flag + printf("Reader not attached to file\n"); + } else { // attached + if (feof(ptr_unit.fileref)) { // EOF + ptr_unit.u3 &= 0xFE; // clear RXF flag + ptr_flag = 0; // clear reader flag + } else // not EOF + ptr_unit.u3 |= 0x01; // set ready + } + return (status = ptr_unit.u3); // return ptr status + } else { + return (status = sio_unit.u3); // return console status + } + } else { // control register write + if (data == 0x03) { // reset port! + sio_unit.u3 = 0x02; // reset console + sio_unit.buf = 0; + sio_unit.pos = 0; + ptr_unit.u3 = 0x02; // reset reader + ptr_unit.buf = 0; + ptr_unit.pos = 0; + ptp_unit.u3 = 0x02; // reset punch + ptp_unit.buf = 0; + ptp_unit.pos = 0; + } + return (status = 0); // invalid io + } +} + +int32 sio0d(int32 io, int32 data) +{ + if (io == 0) { // data register read + if (ptr_flag) { // RDR enabled? + if ((ptr_unit.flags & UNIT_ATT) == 0) // attached? + return 0; // no, done +// printf("ptr_unit.u3=%02X\n", ptr_unit.u3); + if ((ptr_unit.u3 & 0x01) == 0) { // yes, more data? +// printf("Returning old %02X\n", odata); // no, return previous byte + return (odata & 0xFF); + } + if ((odata = getc(ptr_unit.fileref)) == EOF) { // end of file? +// printf("Got EOF\n"); + ptr_unit.u3 &= 0xFE; // clear RXF flag + return (odata = 0); // no data + } +// printf("Returning new %02X\n", odata); + ptr_unit.pos++; // step character count + ptr_unit.u3 &= 0xFE; // clear RXF flag + return (odata & 0xFF); // return character + } else { + sio_unit.u3 &= 0xFE; // clear RXF flag + return (odata = sio_unit.buf); // return next char + } + } else { // data register write + if (isprint(data) || data == '\r' || data == '\n') { // printable? + sim_putchar(data); // print character on console + if (ptp_flag && ptp_unit.flags & UNIT_ATT) { // PTP enabled & attached? + putc(data, ptp_unit.fileref); + ptp_unit.pos++; // step character counter + } + } else { // DC1-DC4 control Reader/Punch + switch (data) { + case 0x11: // PTR on + ptr_flag = 1; + ptr_unit.u3 |= 0x01; +// printf("Reader on\n"); + break; + case 0x12: // PTP on + ptp_flag = 1; + ptp_unit.u3 |= 0x02; +// printf("Punch on\n"); + break; + case 0x13: // PTR off + ptr_flag = 0; +// printf("Reader off-%d bytes read\n", ptr_unit.pos); + break; + case 0x14: // PTP off + ptp_flag = 0; +// printf("Punch off-%d bytes written\n", ptp_unit.pos); + break; + default: // ignore all other characters + break; + } + } + } + return (odata = 0); +} + +/* because each port appears at 2 addresses and this fact is used + to determine if it is a MP-C or MP-S repeatedly in the SWTBUG + monitor, this code assures that reads of the high ports return + the same data as was read the last time on the low ports. +*/ + +int32 sio1s(int32 io, int32 data) +{ + return status; +} + +int32 sio1d(int32 io, int32 data) +{ + return odata; +} + +/* end of mp-s.c */ \ No newline at end of file diff --git a/swtp6800/swtp6800/mp-a2_sys.c b/swtp6800/swtp6800/mp-a2_sys.c new file mode 100644 index 00000000..8a043061 --- /dev/null +++ b/swtp6800/swtp6800/mp-a2_sys.c @@ -0,0 +1,87 @@ +/* mp-a_sys.c: SWTP 6800 system interface + + Copyright (c) 2005, William Beech + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + WILLIAM A BEECH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of William A. Beech shall not + be used in advertising or otherwise to promote the sale, use or other dealings + in this Software without prior written authorization from William A. Beech. +*/ + +#include +#include +#include "swtp_defs.h" + +/* externals */ + +extern DEVICE CPU_BD_dev; +extern DEVICE m6800_dev; +extern REG m6800_reg[]; +extern DEVICE BOOTROM_dev; +extern DEVICE m6810_dev; +extern DEVICE i2716_dev; + +extern DEVICE MB_dev; +extern DEVICE sio_dev; +extern DEVICE ptr_dev; +extern DEVICE ptp_dev; +extern DEVICE mp_8m_dev; +extern DEVICE dsk_dev; + +/* SCP data structures + + sim_name simulator name string + sim_PC pointer to saved PC register descriptor + sim_emax number of words needed for examine + sim_devices array of pointers to simulated devices + sim_stop_messages array of pointers to stop messages + sim_load binary loader +*/ + +char sim_name[] = "SWTP 6800, V2, MP-A2 CPU Board"; + +REG *sim_PC = &m6800_reg[0]; + +int32 sim_emax = 4; + +DEVICE *sim_devices[] = { + &CPU_BD_dev, + &m6800_dev, + &BOOTROM_dev, + &m6810_dev, + &i2716_dev, + &MB_dev, + &sio_dev, + &ptr_dev, + &ptp_dev, + &mp_8m_dev, + &dsk_dev, + NULL +}; + +const char *sim_stop_messages[] = { + "Unknown error", + "Unknown I/O Instruction", + "HALT instruction", + "Breakpoint", + "Invalid Opcode", + "Invalid Memory" +}; + +/* end of mp-a_sys.c */ diff --git a/swtp6800/swtp6800/mp-a_sys.c b/swtp6800/swtp6800/mp-a_sys.c new file mode 100644 index 00000000..4460b781 --- /dev/null +++ b/swtp6800/swtp6800/mp-a_sys.c @@ -0,0 +1,85 @@ +/* mp-a_sys.c: SWTP 6800 system interface + + Copyright (c) 2005, William Beech + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + WILLIAM A BEECH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the name of William A. Beech shall not + be used in advertising or otherwise to promote the sale, use or other dealings + in this Software without prior written authorization from William A. Beech. +*/ + +#include +#include +#include "swtp_defs.h" + +/* externals */ + +extern DEVICE CPU_BD_dev; +extern DEVICE m6800_dev; +extern REG m6800_reg[]; +extern DEVICE BOOTROM_dev; +extern DEVICE m6810_dev; + +extern DEVICE MB_dev; +extern DEVICE sio_dev; +extern DEVICE ptr_dev; +extern DEVICE ptp_dev; +extern DEVICE mp_8m_dev; +extern DEVICE dsk_dev; + +/* SCP data structures + + sim_name simulator name string + sim_PC pointer to saved PC register descriptor + sim_emax number of words needed for examine + sim_devices array of pointers to simulated devices + sim_stop_messages array of pointers to stop messages + sim_load binary loader +*/ + +char sim_name[] = "SWTP 6800, V2, MP-A CPU Board"; + +REG *sim_PC = &m6800_reg[0]; + +int32 sim_emax = 4; + +DEVICE *sim_devices[] = { + &CPU_BD_dev, + &m6800_dev, + &BOOTROM_dev, + &m6810_dev, + &MB_dev, + &sio_dev, + &ptr_dev, + &ptp_dev, + &mp_8m_dev, + &dsk_dev, + NULL +}; + +const char *sim_stop_messages[] = { + "Unknown error", + "Unknown I/O Instruction", + "HALT instruction", + "Breakpoint", + "Invalid Opcode", + "Invalid Memory" +}; + +/* end of mp-a_sys.c */ diff --git a/swtp6800/swtp6800/swtbug.bin b/swtp6800/swtp6800/swtbug.bin new file mode 100644 index 0000000000000000000000000000000000000000..8cef56ad69bb15ad2ce9f2c3e0e24b140853491c GIT binary patch literal 1024 zcmXX_U1%It6uxtJvOBxkb$65Pv`uZjHJh25lyuhy!c?K5-R{~FQL;!v9u%LXF-aea zJ`|nZ!7zx)sTN;bIYHfdDIy5jmyQv%Ln-OB1rb_7W_BTY5KXI?)NPsdZtA^oe>mrS z_dDOYCqOb!U~HbGWYKPpz&l1+X~EluroLe0l?N3}LcU7tSb}Ha&;=~1QHv}SMUvQq z4=}0THjhJIZ~P4LIwl}e$7cdeXi$EI4;jYy$&WF)jY+M*$3k*3XK4L&F{1l-b^j_n zl4`^dm2FM;&w%avS76iSC?gyK@_hbkFtueQRL^*m9Ts4%nj0E7qDNvzdZ=K?!(-Km zRwM9LjY#ZE_y_(r8TLuM9`yM5B zdKD$JZ8s&iD%y>O8d;`1Vy~i^A&Z!4i?AaCcgf9#6*|*36Xq;!PY+O%;36!+Ct$*Y zi<0f#2(V|#?^pM71{|x6u?oiFyc)6_AKJ~b-7LBOWgZHe+q}yajM(1VpTazmBx$Mn zNcn@Ua)5bK*2F|?7a^pa7ki(cvLYJ~Fg#D#nC+F?DDu_z-jHjArcjkvhueaf@&Z9MJuD1I(p*AWlI~BO$GDkx81&ixJykScwnCcO>!euB>~TaUni+@xhxcs%7gaXt zO#$K{nbZ+B2v9R@@m&j$wy^-WSFr0_Jhg@5UszB?BQ-$H +#include "sim_defs.h" // simulator defs /* Memory */ -#define MAXMEMSIZE 65536 // max memory size -#define MEMSIZE (cpu_unit.capac)// actual memory size -#define ADDRMASK (MAXMEMSIZE - 1)// address mask +#define MAXMEMSIZE 65536 // max memory size +#define MEMSIZE (m6800_unit.capac) // actual memory size +#define ADDRMASK (MAXMEMSIZE - 1) // address mask #define MEM_ADDR_OK(x) (((uint32) (x)) < MEMSIZE) +/* debug definitions */ + +#define DEBUG_flow 0x0001 +#define DEBUG_read 0x0002 +#define DEBUG_write 0x0004 +#define DEBUG_level1 0x0008 +#define DEBUG_level2 0x0010 +#define DEBUG_reg 0x0020 +#define DEBUG_asm 0x0040 +#define DEBUG_all 0xFFFF + /* Simulator stop codes */ -#define STOP_RSRV 1 // must be 1 -#define STOP_HALT 2 // HALT-really WAI -#define STOP_IBKPT 3 // breakpoint -#define STOP_OPCODE 4 // invalid opcode -#define STOP_MEMORY 5 // invalid memory address +#define STOP_RSRV 1 // must be 1 +#define STOP_HALT 2 // HALT-really WAI +#define STOP_IBKPT 3 // breakpoint +#define STOP_OPCODE 4 // invalid opcode +#define STOP_MEMORY 5 // invalid memory address